/*! Bundled by webpack from entry point: ./_Scripts/LegacyJS/mobile.js */
/******/ (() => { // webpackBootstrap
/******/ // The require scope
/******/ var __webpack_require__ = {};
/******/
/************************************************************************/
/******/ /* webpack/runtime/make namespace object */
/******/ (() => {
/******/ // define __esModule on exports
/******/ __webpack_require__.r = (exports) => {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/publicPath */
/******/ (() => {
/******/ __webpack_require__.p = "";
/******/ })();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be in strict mode.
(() => {
"use strict";
var __webpack_exports__ = {};
/*!***************************************************!*\
!*** ./_Scripts/_Includes/set-public-path.mod.ts ***!
\***************************************************/
__webpack_require__.r(__webpack_exports__);
// We need to set the public path at runtime based on the GlobalRoot site setting.
// (We don't know at build time where the static files will be,
// since we could be deployed on-premise.)
// The value of that site setting gets written out to the dom in Master.cshtml
// (see JavaScriptHelper.PublicPath()) so that we can read it here
__webpack_require__.p = document.getElementById("webpack-public-path").innerText + "Js/";
})();
// This entry need to be wrapped in an IIFE because it need to be isolated against other entry modules.
(() => {
/*!*************************************!*\
!*** ./_Scripts/LegacyJS/mobile.js ***!
\*************************************/
/*** IMPORTS FROM imports-loader ***/
StackExchange = window.StackExchange = (window.StackExchange || {});
StackOverflow = window.StackOverflow = (window.StackOverflow || {});
"use strict";
// Served only as part of the mobile skin.
// Does all the custom UI bits. Generally,
// we try to re-use javascript from full(-anon),
// syntax highlighting, and so on. Having to re-implement
// the site's javascript just for mobile would
// be brutal.
StackExchange.mobile = function () {
var unreadNotifications;
// common idiom is to submit a form after an input change on mobile.
var initSubmitOnChanges =
function () {
$('.submit-on-change').change(
function () {
$(this).closest('form').submit();
}
);
};
// hook up search box
function initSearchBox($container) {
if ($container === undefined) {
$container = $('.js-search-container').closest('.subheader');
}
$container.on('submit', '.js-search-container.js-no-submit', function (e) {
e.preventDefault();
e.stopPropagation();
});
$container.on('click', '.js-search-trigger', function (e) {
$container.find('.js-search-container').show();
$container.find('.js-search-input').focus();
e.preventDefault();
});
$container.on('click', '.js-search-container .icon-clear', function (e) {
$container.find('.js-search-container .js-search-input').val('');
e.preventDefault();
});
$container.on('click', '.js-search-container .js-cancel', function (e) {
$container.find('.js-search-container').hide();
e.preventDefault();
});
}
var spinnerInterval = null;
// Animates spinners, kicks up a new timeout if needed
var startSpinner = function () {
if (spinnerInterval != null) return;
spinnerInterval =
setInterval(
function () {
var dots1 = $('.dot1');
var dots2 = $('.dot2');
var dots3 = $('.dot3');
var dots4 = $('.dot4');
if (!(shiftLeft(dots1, '.dot2') || shiftLeft(dots2, '.dot3') || shiftLeft(dots3, '.dot4') || shiftLeft(dots4))) {
$.each(dots1,
function (index, item) {
var defPadding = $(item).closest('.mobile-spinner').attr('spinnerPadding');
$(item).css({ paddingLeft: defPadding + 'px' });
}
);
}
},
20);
};
// Kills spinner animations if there aren't any left in the DOM
var stopSpinner = function () {
if (spinnerInterval != null && $('.mobile-spinner').length == 0) {
clearInterval(spinnerInterval);
spinnerInterval = null;
}
};
var shiftLeft = function (items, shiftRight) {
var ret = false;
$.each(items,
function (index, item) {
var dot = $(item);
var curPadding = dot.css('padding-left');
if (curPadding == null || curPadding == '0px') return;
var newPadding = +curPadding.substring(0, curPadding.length - 2);
newPadding--;
dot.css({ paddingLeft: newPadding + 'px' });
if (shiftRight) {
var next = dot.siblings(shiftRight);
var padding = next.css('padding-left');
padding = +padding.substring(0, padding.length - 2);
padding++;
next.css({ paddingLeft: padding + 'px' });
}
ret = true;
}
);
return ret;
};
// replace all .spoiler's with a "click to show" box
var hideSpoilers = function () {
$('.spoiler').each(
function (index, i) {
var item = $(i);
item.removeClass('spoiler').addClass('spoiler-overlay');
var children = item.children();
children.remove();
item.append('
' + __tr(["Click to show spoiler"], undefined, "en", []) + '
');
item.one(
'click',
function () {
item.empty();
item.append(children);
item.removeClass('spoiler-overlay').addClass('spoiler').addClass("is-visible");
}
);
}
);
};
function flagShowPopup(popup, clicked) {
showPopup(popup, clicked, popup.data('postid'));
}
function closeShowPopup(popup, clicked) {
showPopup(popup, clicked, popup.data('questionid'));
}
function showPopup(popup, clicked, postId) {
var container = getMenuContainerForPost(postId);
// flag and close will clean up after themselves
container.children().not('#popup-flag-post, #popup-close-question').remove();
popup.detach().appendTo(container);
scrollTo(0, clicked.offset().top);
clicked.addClass('util-link-active');
popup.on('popupClose', function() {
$('.util-link-active').removeClass('util-link-active');
container.empty();
});
container.show();
}
function getMenuContainerForPost(postId) {
return $('.menu-popup-container[data-postid=' + postId + ']');
}
var initDeleteLinks = function () {
$('.js-delete-post').each(
function (index, i) {
var link = $(i);
var postId = link.closest('.js-post-menu').attr('data-post-id');
link.click(
function (e) {
e.stopPropagation(); // prevents execution of .live handlers in 04_Vote.js
if (!confirm(__tr(["Vote to delete this post?"], undefined, "en", []))) return;
StackExchange.vote.submit({
$target: link,
postId: postId,
voteTypeId: StackExchange.vote.voteTypeIds.deletion,
success: function () { window.location.reload(); }
});
}
);
}
);
$('.js-restore-post').each(
function (index, i) {
var link = $(i);
var postId = link.closest('.js-post-menu').attr('data-post-id');
link.click(
function (e) {
e.stopPropagation();
if (!confirm(__tr(["Vote to undelete this post?"], undefined, "en", []))) return;
StackExchange.vote.submit({
$target: link,
postId: postId,
voteTypeId: StackExchange.vote.voteTypeIds.undeletion,
success: function () { window.location.reload(); }
});
}
);
}
);
};
function initModeratorLinks() {
if ($('[data-controller="se-mod-button"]').length > 0) {
StackExchange.moderator.initMenus();
return;
}
}
return {
// Set the number of unread notifications
setUnreadNotificationsCount: function (count) {
unreadNotifications = count;
},
// Init draft monitoring, and fill in any old draft values if they're in localStorage
initDraft: function (type, formSelector, submitSelector, immediateSave) {
if (!window.localStorage) return; // utterly dependent on localStorage for this on mobile, so bail if its not around
var form = $(formSelector);
var body = $(form.find('.wmd-input')[0]);
var tags = form.find('.tagnames');
var title = form.find('.title');
if (tags.length > 0) {
tags = $(tags[0]);
}
if (title.length > 0) {
title = $(title[0]);
}
var storageKey = "mobile-draft-" + type;
var draft = window.localStorage[storageKey];
if (draft) {
draft = JSON.parse(draft);
body.val(draft.body);
title.val(draft.title);
tags.val(draft.tags);
}
var save = function () {
if (body.val() || title.val() || tags.val()) {
window.localStorage[storageKey] = JSON.stringify({ body: body.val(), title: title.val(), tags: tags.val() });
} else {
window.localStorage.removeItem(storageKey);
}
};
if (immediateSave) {
save();
}
var saveInterval = setInterval(
save,
5000
);
$(submitSelector).click(
function () {
clearInterval(saveInterval);
window.localStorage.removeItem(storageKey);
}
);
body.blur(save);
tags.blur(save);
title.blur(save);
},
// Highlights interesting tags, and dims or hides ignored tags
applyTagPrefs: function (interesting, ignored, hideIgnored, dontApply) {
var wIgnored = [],
wInteresting = [];
if (dontApply) {
var nInt = [],
nIgn = [];
if (interesting) {
for (var i = 0; i < interesting.length; i++) {
if (dontApply.indexOf(interesting[i]) == -1) {
if (/\*/.test(interesting[i]))
wInteresting.push(new RegExp(interesting[i].replace(/([.+])/g, "\\$1").replace(/\*/g, ".*")));
else
nInt.push(interesting[i]);
}
}
interesting = nInt;
}
if (ignored) {
for (var i = 0; i < ignored.length; i++) {
if (dontApply.indexOf(ignored[i]) == -1) {
if (/\*/.test(ignored[i]))
wIgnored.push(new RegExp(ignored[i].replace(/([.+])/g, "\\$1").replace(/\*/g, ".*")));
else
nIgn.push(ignored[i]);
}
}
ignored = nIgn;
}
}
$('.post-tag').each(
function (index, ii) {
var item = $(ii),
text = item.text();
if (ignored) {
var isIgnored = false;
for (var i = 0; i < ignored.length; i++) {
if (text == ignored[i]) {
isIgnored = true;
break;
}
}
for (var i = 0; i < wIgnored.length; i++) {
if (wIgnored[i].test(text) && dontApply.indexOf(text) == -1) {
isIgnored = true;
break;
}
}
if (isIgnored) {
var onQ = item.parents('.-summary').addClass('tagged-ignored');
if (hideIgnored) {
onQ.hide();
}
}
}
if (interesting) {
var isInteresting = false;
for (var i = 0; i < interesting.length; i++) {
if (text == interesting[i]) {
isInteresting = true;
break;
}
}
for (var i = 0; i < wInteresting.length; i++) {
if (wInteresting[i].test(text) && dontApply.indexOf(text) == -1) {
isInteresting = true;
break;
}
}
if (isInteresting) {
item.parents('.-summary').addClass('tagged-interesting');
}
}
}
);
},
// For all items in the selector, shrink them if they are larger than maxHeight (overflow:hidden style) and add a show more link.
shrinkAndShowMore: function (selector, maxPixelHeight) {
$(selector).each(
function (index, item) {
var i = $(item);
if (i.height() <= maxPixelHeight) return;
var resetTo = { overflowY: i.css('overflow-y'), maxHeight: i.css('max-height') };
i.css({ overflowY: 'hidden', maxHeight: maxPixelHeight + 'px' });
var showMore = $('');
i.after(showMore);
showMore.click(
function () {
showMore.remove();
i.css(resetTo);
}
);
// For now, do the CSS-s-s-ing in code. May rely purely on styles in the future.
showMore.css({ backgroundColor: i.css('background-color'), fontSize: '12px' });
}
);
},
// Add a spinner to everything matched by selector (or just pass in a DOM object)
// The displayed message = msg, or 'loading' if msg is not set
addSpinner: function (selector, msg) {
$(selector).each(
function (index, item) {
if (!msg) msg = "loading";
var spinner = $('....');
$(item).append(spinner);
$(spinner).find('.spinner-message').text(msg);
var dotWidth = $(spinner).find('.dot1').width() + $(spinner).find('.dot2').width() + $(spinner).find('.dot3').width();
var messageWidth = $(spinner).find('.spinner-message').width();
var clipWidth = messageWidth + (dotWidth);
$(spinner).css({ width: clipWidth + 'px', overflow: 'hidden', display: 'block' });
$(spinner).find('.dot1').css({ paddingLeft: (dotWidth * 2) + 'px' });
$(spinner).find('.dot2').css({ paddingLeft: '0px' });
$(spinner).find('.dot3').css({ paddingLeft: '0px' });
$(spinner).find('.dot4').css({ paddingLeft: '0px' });
$(spinner).attr('spinnerPadding', dotWidth * 2);
}
);
startSpinner();
},
// Remove all spinners from the passed in selector (or DOM object)
removeSpinner: function (selector) {
$(selector).find('.mobile-spinner').remove();
stopSpinner();
},
init: function () {
$(
function () {
initSubmitOnChanges();
initSearchBox();
hideSpoilers();
if (StackExchange.vote_closingAndFlagging) {
StackExchange.vote_closingAndFlagging.init({
closeShowPopup: closeShowPopup,
flagShowPopup: flagShowPopup
});
}
initDeleteLinks();
initModeratorLinks();
}
);
},
// Gotta re-export this for ajax search
initSearchBox: initSearchBox
};
}();
StackExchange.mobile.overlay = function () {
var $overlay, $overlayTrigger, $overlayCloseTrigger;
function checkOverlay() {
$overlayTrigger.on('change', function () {
var cssClass = "_blocked";
if ($(this).hasClass("js-stop-scrolling")) {
cssClass = "stop-scrolling-mobile";
}
if ($(this).is(':checked')) {
$('body').addClass(cssClass);
} else {
$('body').removeClass(cssClass);
}
});
}
function closeOverlay() {
$overlayCloseTrigger.on('click', function () {
hideOverlay();
});
}
function closeAndScrollTo(scrollToElem) {
hideOverlay();
if (scrollToElem) {
$('html, body').scrollTop(scrollToElem.offset().top);
}
}
function hideOverlay() {
$overlayTrigger.prop("checked", false).trigger('change');
}
return {
init: function () {
$overlay = $('.overlay');
$overlayTrigger = $('.js-overlay-trigger');
$overlayCloseTrigger = $overlay.find('.js-close');
checkOverlay();
closeOverlay();
},
close: closeOverlay,
hide: hideOverlay,
closeAndScrollTo: closeAndScrollTo
}
}();
StackExchange.mobile.uploader = function() {
var $imgUrl, $imgUrlField, $imgUrlInput, $imgUrlInfo, $area, $filePreview, $fileInput, $errorTarget, $button, $file, $scrollToTarget;
function showUrlField() {
$imgUrlInfo.addClass('hidden-important');
$imgUrlField
.removeClass('hidden-important')
.find('[type="url"]').focus();
}
function hideUrlField() {
$imgUrlInfo.removeClass('hidden-important');
$imgUrlField
.addClass('hidden-important')
.find('[type="url"]').val('');
}
function toggleNote() {
$imgUrl.toggleClass('hidden-important');
$('.js-restart').toggleClass('hidden-important');
}
function togglePreview(action) {
if (action == true) {
$area
.find('figure').addClass('hidden-important').end()
.find('label').removeClass('hidden-important');
} else if (action == false) {
$area
.find('figure').removeClass('hidden-important').end()
.find('label').addClass('hidden-important');
}
}
function selectFile() {
$fileInput.on('change', function () {
var input = this;
if (input.files && input.files[0]) {
var reader = new FileReader();
var inputFile = input.files[0];
reader.onloadend = function (e) {
$filePreview.attr('src', e.target.result);
$file = inputFile;
togglePreview(false);
toggleNote();
}
reader.readAsDataURL(inputFile);
}
});
}
function resetForm() {
$button.removeClass('loading');
$imgUrlInput.val('');
$fileInput.val('');
$file = '';
$errorTarget.hide();
togglePreview(true);
hideUrlField();
toggleNote();
}
function appendMarkdown(url) {
var wmdInput = $("#wmd-input");
var existingText = wmdInput.val();
existingText += '![' + __tr(["enter image description here"], undefined, "en", []) +'](' + url + ')';
wmdInput.val(existingText);
}
function doUpload() {
if ($imgUrlInput.val().length) {
appendMarkdown($imgUrlInput.val()); // append URL to editor
resetForm();
StackExchange.mobile.overlay.closeAndScrollTo($scrollToTarget); // close popup
} else if ($file) {
var formData = new window.FormData();
$errorTarget.hide();
$button.addClass('loading');
formData.append('file', $file);
formData.append('fkey', StackExchange.options.user.fkey);
$.ajax({
url: "/upload/image/json",
data: formData,
cache: false,
contentType: false,
processData: false,
type: 'POST',
success: function(data) {
if (data && data.Success) {
appendMarkdown(data.UploadedImage);
resetForm();
StackExchange.mobile.overlay.closeAndScrollTo($scrollToTarget);
} else {
$errorTarget.text(data.ErrorMessage).show();
}
},
complete: function() {
$button.removeClass('loading');
}
});
}
}
return {
init: function () {
$button = $('.js-submit');
$imgUrl = $('.js-image-url');
$imgUrlInfo = $imgUrl.find('.js-image-url-info');
$imgUrlField = $imgUrl.find('.js-image-url-field');
$imgUrlInput = $imgUrl.find('input[type=url]');
$area = $('.js-area');
$fileInput = $area.find('.js-image-input');
$filePreview = $area.find('figure > img');
$errorTarget = $(".uploader-error");
$scrollToTarget = $('[data-role="uploader-scrolltotarget"]');
selectFile();
$('.js-image-url-trigger').on('click', function(e) {
e.preventDefault();
showUrlField();
});
$('.js-restart-trigger').on('click', function(e) {
e.preventDefault();
resetForm();
});
$('.js-image-url-cancel').on('click', function(e) {
e.preventDefault();
hideUrlField();
});
$(".js-close").on("click", function () {
StackExchange.mobile.overlay.closeAndScrollTo($scrollToTarget);
});
$button.click(doUpload);
}
}
}();
})();
/******/ })()
;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLCtCQUErQiw2RkFBa0M7QUFDakU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBLDRFQUE0RTtBQUM1RSxVQUFVO0FBQ1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esc0JBQXNCO0FBQ3RCO0FBQ0E7QUFDQSxpQkFBaUI7QUFDakI7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL3N0YWNrb3ZlcmZsb3cvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vc3RhY2tvdmVyZmxvdy93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL3N0YWNrb3ZlcmZsb3cvd2VicGFjay9ydW50aW1lL3B1YmxpY1BhdGgiLCJ3ZWJwYWNrOi8vc3RhY2tvdmVyZmxvdy8uL19TY3JpcHRzL19JbmNsdWRlcy9zZXQtcHVibGljLXBhdGgubW9kLnRzIiwid2VicGFjazovL3N0YWNrb3ZlcmZsb3cvLi9fU2NyaXB0cy9MZWdhY3lKUy9tb2JpbGUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhlIHJlcXVpcmUgc2NvcGVcbnZhciBfX3dlYnBhY2tfcmVxdWlyZV9fID0ge307XG5cbiIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7IiwiLy8gV2UgbmVlZCB0byBzZXQgdGhlIHB1YmxpYyBwYXRoIGF0IHJ1bnRpbWUgYmFzZWQgb24gdGhlIEdsb2JhbFJvb3Qgc2l0ZSBzZXR0aW5nLlxyXG4vLyAoV2UgZG9uJ3Qga25vdyBhdCBidWlsZCB0aW1lIHdoZXJlIHRoZSBzdGF0aWMgZmlsZXMgd2lsbCBiZSxcclxuLy8gc2luY2Ugd2UgY291bGQgYmUgZGVwbG95ZWQgb24tcHJlbWlzZS4pXHJcbi8vIFRoZSB2YWx1ZSBvZiB0aGF0IHNpdGUgc2V0dGluZyBnZXRzIHdyaXR0ZW4gb3V0IHRvIHRoZSBkb20gaW4gTWFzdGVyLmNzaHRtbFxyXG4vLyAoc2VlIEphdmFTY3JpcHRIZWxwZXIuUHVibGljUGF0aCgpKSBzbyB0aGF0IHdlIGNhbiByZWFkIGl0IGhlcmVcclxuX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIndlYnBhY2stcHVibGljLXBhdGhcIikuaW5uZXJUZXh0ICsgXCJKcy9cIjtcclxuXHJcbmV4cG9ydCB7IH07XHJcbiIsIi8qKiogSU1QT1JUUyBGUk9NIGltcG9ydHMtbG9hZGVyICoqKi9cblxuXG5TdGFja0V4Y2hhbmdlID0gd2luZG93LlN0YWNrRXhjaGFuZ2UgPSAod2luZG93LlN0YWNrRXhjaGFuZ2UgfHwge30pO1xuU3RhY2tPdmVyZmxvdyA9IHdpbmRvdy5TdGFja092ZXJmbG93ID0gKHdpbmRvdy5TdGFja092ZXJmbG93IHx8IHt9KTtcblxuXG5cInVzZSBzdHJpY3RcIjtcclxuXHJcbi8vIFNlcnZlZCBvbmx5IGFzIHBhcnQgb2YgdGhlIG1vYmlsZSBza2luLlxyXG4vLyAgIERvZXMgYWxsIHRoZSBjdXN0b20gVUkgYml0cy4gIEdlbmVyYWxseSxcclxuLy8gICB3ZSB0cnkgdG8gcmUtdXNlIGphdmFzY3JpcHQgZnJvbSBmdWxsKC1hbm9uKSxcclxuLy8gICBzeW50YXggaGlnaGxpZ2h0aW5nLCBhbmQgc28gb24uICBIYXZpbmcgdG8gcmUtaW1wbGVtZW50XHJcbi8vICAgdGhlIHNpdGUncyBqYXZhc2NyaXB0IGp1c3QgZm9yIG1vYmlsZSB3b3VsZFxyXG4vLyAgIGJlIGJydXRhbC5cclxuXHJcblN0YWNrRXhjaGFuZ2UubW9iaWxlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgdmFyIHVucmVhZE5vdGlmaWNhdGlvbnM7XHJcblxyXG4gICAgLy8gY29tbW9uIGlkaW9tIGlzIHRvIHN1Ym1pdCBhIGZvcm0gYWZ0ZXIgYW4gaW5wdXQgY2hhbmdlIG9uIG1vYmlsZS5cclxuICAgIHZhciBpbml0U3VibWl0T25DaGFuZ2VzID1cclxuICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICQoJy5zdWJtaXQtb24tY2hhbmdlJykuY2hhbmdlKFxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnZm9ybScpLnN1Ym1pdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgLy8gaG9vayB1cCBzZWFyY2ggYm94XHJcbiAgICBmdW5jdGlvbiBpbml0U2VhcmNoQm94KCRjb250YWluZXIpIHtcclxuXHJcbiAgICAgICAgaWYgKCRjb250YWluZXIgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAkY29udGFpbmVyID0gJCgnLmpzLXNlYXJjaC1jb250YWluZXInKS5jbG9zZXN0KCcuc3ViaGVhZGVyJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAkY29udGFpbmVyLm9uKCdzdWJtaXQnLCAnLmpzLXNlYXJjaC1jb250YWluZXIuanMtbm8tc3VibWl0JywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkY29udGFpbmVyLm9uKCdjbGljaycsICcuanMtc2VhcmNoLXRyaWdnZXInLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAkY29udGFpbmVyLmZpbmQoJy5qcy1zZWFyY2gtY29udGFpbmVyJykuc2hvdygpO1xyXG4gICAgICAgICAgICAkY29udGFpbmVyLmZpbmQoJy5qcy1zZWFyY2gtaW5wdXQnKS5mb2N1cygpO1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICRjb250YWluZXIub24oJ2NsaWNrJywgJy5qcy1zZWFyY2gtY29udGFpbmVyIC5pY29uLWNsZWFyJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgJGNvbnRhaW5lci5maW5kKCcuanMtc2VhcmNoLWNvbnRhaW5lciAuanMtc2VhcmNoLWlucHV0JykudmFsKCcnKTtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAkY29udGFpbmVyLm9uKCdjbGljaycsICcuanMtc2VhcmNoLWNvbnRhaW5lciAuanMtY2FuY2VsJywgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgJGNvbnRhaW5lci5maW5kKCcuanMtc2VhcmNoLWNvbnRhaW5lcicpLmhpZGUoKTtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBzcGlubmVySW50ZXJ2YWwgPSBudWxsO1xyXG5cclxuICAgIC8vIEFuaW1hdGVzIHNwaW5uZXJzLCBraWNrcyB1cCBhIG5ldyB0aW1lb3V0IGlmIG5lZWRlZFxyXG4gICAgdmFyIHN0YXJ0U3Bpbm5lciA9IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICBpZiAoc3Bpbm5lckludGVydmFsICE9IG51bGwpIHJldHVybjtcclxuXHJcbiAgICAgICAgc3Bpbm5lckludGVydmFsID1cclxuICAgICAgICAgICAgc2V0SW50ZXJ2YWwoXHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRvdHMxID0gJCgnLmRvdDEnKTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgZG90czIgPSAkKCcuZG90MicpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBkb3RzMyA9ICQoJy5kb3QzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRvdHM0ID0gJCgnLmRvdDQnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoc2hpZnRMZWZ0KGRvdHMxLCAnLmRvdDInKSB8fCBzaGlmdExlZnQoZG90czIsICcuZG90MycpIHx8IHNoaWZ0TGVmdChkb3RzMywgJy5kb3Q0JykgfHwgc2hpZnRMZWZ0KGRvdHM0KSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgJC5lYWNoKGRvdHMxLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlZlBhZGRpbmcgPSAkKGl0ZW0pLmNsb3Nlc3QoJy5tb2JpbGUtc3Bpbm5lcicpLmF0dHIoJ3NwaW5uZXJQYWRkaW5nJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoaXRlbSkuY3NzKHsgcGFkZGluZ0xlZnQ6IGRlZlBhZGRpbmcgKyAncHgnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIDIwKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gS2lsbHMgc3Bpbm5lciBhbmltYXRpb25zIGlmIHRoZXJlIGFyZW4ndCBhbnkgbGVmdCBpbiB0aGUgRE9NXHJcbiAgICB2YXIgc3RvcFNwaW5uZXIgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgaWYgKHNwaW5uZXJJbnRlcnZhbCAhPSBudWxsICYmICQoJy5tb2JpbGUtc3Bpbm5lcicpLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoc3Bpbm5lckludGVydmFsKTtcclxuICAgICAgICAgICAgc3Bpbm5lckludGVydmFsID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIHZhciBzaGlmdExlZnQgPSBmdW5jdGlvbiAoaXRlbXMsIHNoaWZ0UmlnaHQpIHtcclxuICAgICAgICB2YXIgcmV0ID0gZmFsc2U7XHJcblxyXG4gICAgICAgICQuZWFjaChpdGVtcyxcclxuICAgICAgICAgICAgZnVuY3Rpb24gKGluZGV4LCBpdGVtKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgZG90ID0gJChpdGVtKTtcclxuICAgICAgICAgICAgICAgIHZhciBjdXJQYWRkaW5nID0gZG90LmNzcygncGFkZGluZy1sZWZ0Jyk7XHJcbiAgICAgICAgICAgICAgICBpZiAoY3VyUGFkZGluZyA9PSBudWxsIHx8IGN1clBhZGRpbmcgPT0gJzBweCcpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICB2YXIgbmV3UGFkZGluZyA9ICtjdXJQYWRkaW5nLnN1YnN0cmluZygwLCBjdXJQYWRkaW5nLmxlbmd0aCAtIDIpO1xyXG4gICAgICAgICAgICAgICAgbmV3UGFkZGluZy0tO1xyXG5cclxuICAgICAgICAgICAgICAgIGRvdC5jc3MoeyBwYWRkaW5nTGVmdDogbmV3UGFkZGluZyArICdweCcgfSk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNoaWZ0UmlnaHQpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCA9IGRvdC5zaWJsaW5ncyhzaGlmdFJpZ2h0KTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgcGFkZGluZyA9IG5leHQuY3NzKCdwYWRkaW5nLWxlZnQnKTtcclxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nID0gK3BhZGRpbmcuc3Vic3RyaW5nKDAsIHBhZGRpbmcubGVuZ3RoIC0gMik7XHJcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZysrO1xyXG4gICAgICAgICAgICAgICAgICAgIG5leHQuY3NzKHsgcGFkZGluZ0xlZnQ6IHBhZGRpbmcgKyAncHgnIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyByZXBsYWNlIGFsbCAuc3BvaWxlcidzIHdpdGggYSBcImNsaWNrIHRvIHNob3dcIiBib3hcclxuICAgIHZhciBoaWRlU3BvaWxlcnMgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgJCgnLnNwb2lsZXInKS5lYWNoKFxyXG4gICAgICAgICAgICBmdW5jdGlvbiAoaW5kZXgsIGkpIHtcclxuICAgICAgICAgICAgICAgIHZhciBpdGVtID0gJChpKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpdGVtLnJlbW92ZUNsYXNzKCdzcG9pbGVyJykuYWRkQ2xhc3MoJ3Nwb2lsZXItb3ZlcmxheScpO1xyXG4gICAgICAgICAgICAgICAgdmFyIGNoaWxkcmVuID0gaXRlbS5jaGlsZHJlbigpO1xyXG5cclxuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnJlbW92ZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgIGl0ZW0uYXBwZW5kKCc8ZGl2IGNsYXNzPVwic3BvaWxlci1jbGljay10by1zaG93XCI+JyArIF9zKCdDbGljayB0byBzaG93IHNwb2lsZXInKSArICc8L2Rpdj4nKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpdGVtLm9uZShcclxuICAgICAgICAgICAgICAgICAgICAnY2xpY2snLFxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5lbXB0eSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmFwcGVuZChjaGlsZHJlbik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucmVtb3ZlQ2xhc3MoJ3Nwb2lsZXItb3ZlcmxheScpLmFkZENsYXNzKCdzcG9pbGVyJykuYWRkQ2xhc3MoXCJpcy12aXNpYmxlXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG4gICAgfTtcclxuXHJcbiAgICBmdW5jdGlvbiBmbGFnU2hvd1BvcHVwKHBvcHVwLCBjbGlja2VkKSB7XHJcbiAgICAgICAgc2hvd1BvcHVwKHBvcHVwLCBjbGlja2VkLCBwb3B1cC5kYXRhKCdwb3N0aWQnKSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGZ1bmN0aW9uIGNsb3NlU2hvd1BvcHVwKHBvcHVwLCBjbGlja2VkKSB7XHJcbiAgICAgICAgc2hvd1BvcHVwKHBvcHVwLCBjbGlja2VkLCBwb3B1cC5kYXRhKCdxdWVzdGlvbmlkJykpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBmdW5jdGlvbiBzaG93UG9wdXAocG9wdXAsIGNsaWNrZWQsIHBvc3RJZCkge1xyXG4gICAgICAgIHZhciBjb250YWluZXIgPSBnZXRNZW51Q29udGFpbmVyRm9yUG9zdChwb3N0SWQpO1xyXG5cclxuICAgICAgICAvLyBmbGFnIGFuZCBjbG9zZSB3aWxsIGNsZWFuIHVwIGFmdGVyIHRoZW1zZWx2ZXNcclxuICAgICAgICBjb250YWluZXIuY2hpbGRyZW4oKS5ub3QoJyNwb3B1cC1mbGFnLXBvc3QsICNwb3B1cC1jbG9zZS1xdWVzdGlvbicpLnJlbW92ZSgpO1xyXG4gICAgICAgIHBvcHVwLmRldGFjaCgpLmFwcGVuZFRvKGNvbnRhaW5lcik7XHJcbiAgICAgICAgc2Nyb2xsVG8oMCwgY2xpY2tlZC5vZmZzZXQoKS50b3ApO1xyXG4gICAgICAgIGNsaWNrZWQuYWRkQ2xhc3MoJ3V0aWwtbGluay1hY3RpdmUnKTtcclxuXHJcbiAgICAgICAgcG9wdXAub24oJ3BvcHVwQ2xvc2UnLCBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgJCgnLnV0aWwtbGluay1hY3RpdmUnKS5yZW1vdmVDbGFzcygndXRpbC1saW5rLWFjdGl2ZScpO1xyXG4gICAgICAgICAgICBjb250YWluZXIuZW1wdHkoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgY29udGFpbmVyLnNob3coKTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBnZXRNZW51Q29udGFpbmVyRm9yUG9zdChwb3N0SWQpIHtcclxuICAgICAgICByZXR1cm4gJCgnLm1lbnUtcG9wdXAtY29udGFpbmVyW2RhdGEtcG9zdGlkPScgKyBwb3N0SWQgKyAnXScpO1xyXG4gICAgfVxyXG5cclxuICAgIHZhciBpbml0RGVsZXRlTGlua3MgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgJCgnLmpzLWRlbGV0ZS1wb3N0JykuZWFjaChcclxuICAgICAgICAgICAgZnVuY3Rpb24gKGluZGV4LCBpKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgbGluayA9ICQoaSk7XHJcbiAgICAgICAgICAgICAgICB2YXIgcG9zdElkID0gbGluay5jbG9zZXN0KCcuanMtcG9zdC1tZW51JykuYXR0cignZGF0YS1wb3N0LWlkJyk7XHJcblxyXG4gICAgICAgICAgICAgICAgbGluay5jbGljayhcclxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOyAvLyBwcmV2ZW50cyBleGVjdXRpb24gb2YgLmxpdmUgaGFuZGxlcnMgaW4gMDRfVm90ZS5qc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpcm0oX3MoXCJWb3RlIHRvIGRlbGV0ZSB0aGlzIHBvc3Q/XCIpKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgU3RhY2tFeGNoYW5nZS52b3RlLnN1Ym1pdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0OiBsaW5rLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdElkOiBwb3N0SWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3RlVHlwZUlkOiBTdGFja0V4Y2hhbmdlLnZvdGUudm90ZVR5cGVJZHMuZGVsZXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoKSB7IHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgJCgnLmpzLXJlc3RvcmUtcG9zdCcpLmVhY2goXHJcbiAgICAgICAgICAgIGZ1bmN0aW9uIChpbmRleCwgaSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIGxpbmsgPSAkKGkpO1xyXG5cclxuICAgICAgICAgICAgICAgIHZhciBwb3N0SWQgPSBsaW5rLmNsb3Nlc3QoJy5qcy1wb3N0LW1lbnUnKS5hdHRyKCdkYXRhLXBvc3QtaWQnKTtcclxuXHJcbiAgICAgICAgICAgICAgICBsaW5rLmNsaWNrKFxyXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlybShfcyhcIlZvdGUgdG8gdW5kZWxldGUgdGhpcyBwb3N0P1wiKSkpIHJldHVybjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrRXhjaGFuZ2Uudm90ZS5zdWJtaXQoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldDogbGluayxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RJZDogcG9zdElkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm90ZVR5cGVJZDogU3RhY2tFeGNoYW5nZS52b3RlLnZvdGVUeXBlSWRzLnVuZGVsZXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoKSB7IHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoKTsgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgKTtcclxuICAgIH07XHJcblxyXG4gICAgZnVuY3Rpb24gaW5pdE1vZGVyYXRvckxpbmtzKCkge1xyXG4gICAgICAgIGlmICgkKCdbZGF0YS1jb250cm9sbGVyPVwic2UtbW9kLWJ1dHRvblwiXScpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgU3RhY2tFeGNoYW5nZS5tb2RlcmF0b3IuaW5pdE1lbnVzKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICAvLyBTZXQgdGhlIG51bWJlciBvZiB1bnJlYWQgbm90aWZpY2F0aW9uc1xyXG4gICAgICAgIHNldFVucmVhZE5vdGlmaWNhdGlvbnNDb3VudDogZnVuY3Rpb24gKGNvdW50KSB7XHJcbiAgICAgICAgICAgIHVucmVhZE5vdGlmaWNhdGlvbnMgPSBjb3VudDtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBJbml0IGRyYWZ0IG1vbml0b3JpbmcsIGFuZCBmaWxsIGluIGFueSBvbGQgZHJhZnQgdmFsdWVzIGlmIHRoZXkncmUgaW4gbG9jYWxTdG9yYWdlXHJcbiAgICAgICAgaW5pdERyYWZ0OiBmdW5jdGlvbiAodHlwZSwgZm9ybVNlbGVjdG9yLCBzdWJtaXRTZWxlY3RvciwgaW1tZWRpYXRlU2F2ZSkge1xyXG4gICAgICAgICAgICBpZiAoIXdpbmRvdy5sb2NhbFN0b3JhZ2UpIHJldHVybjsgLy8gdXR0ZXJseSBkZXBlbmRlbnQgb24gbG9jYWxTdG9yYWdlIGZvciB0aGlzIG9uIG1vYmlsZSwgc28gYmFpbCBpZiBpdHMgbm90IGFyb3VuZFxyXG5cclxuICAgICAgICAgICAgdmFyIGZvcm0gPSAkKGZvcm1TZWxlY3Rvcik7XHJcblxyXG4gICAgICAgICAgICB2YXIgYm9keSA9ICQoZm9ybS5maW5kKCcud21kLWlucHV0JylbMF0pO1xyXG4gICAgICAgICAgICB2YXIgdGFncyA9IGZvcm0uZmluZCgnLnRhZ25hbWVzJyk7XHJcbiAgICAgICAgICAgIHZhciB0aXRsZSA9IGZvcm0uZmluZCgnLnRpdGxlJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGFncy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICB0YWdzID0gJCh0YWdzWzBdKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRpdGxlLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRpdGxlID0gJCh0aXRsZVswXSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHZhciBzdG9yYWdlS2V5ID0gXCJtb2JpbGUtZHJhZnQtXCIgKyB0eXBlO1xyXG5cclxuICAgICAgICAgICAgdmFyIGRyYWZ0ID0gd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XTtcclxuXHJcbiAgICAgICAgICAgIGlmIChkcmFmdCkge1xyXG4gICAgICAgICAgICAgICAgZHJhZnQgPSBKU09OLnBhcnNlKGRyYWZ0KTtcclxuXHJcbiAgICAgICAgICAgICAgICBib2R5LnZhbChkcmFmdC5ib2R5KTtcclxuICAgICAgICAgICAgICAgIHRpdGxlLnZhbChkcmFmdC50aXRsZSk7XHJcbiAgICAgICAgICAgICAgICB0YWdzLnZhbChkcmFmdC50YWdzKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdmFyIHNhdmUgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYm9keS52YWwoKSB8fCB0aXRsZS52YWwoKSB8fCB0YWdzLnZhbCgpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2FsU3RvcmFnZVtzdG9yYWdlS2V5XSA9IEpTT04uc3RyaW5naWZ5KHsgYm9keTogYm9keS52YWwoKSwgdGl0bGU6IHRpdGxlLnZhbCgpLCB0YWdzOiB0YWdzLnZhbCgpIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oc3RvcmFnZUtleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpZiAoaW1tZWRpYXRlU2F2ZSkge1xyXG4gICAgICAgICAgICAgICAgc2F2ZSgpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB2YXIgc2F2ZUludGVydmFsID0gc2V0SW50ZXJ2YWwoXHJcbiAgICAgICAgICAgICAgICBzYXZlLFxyXG4gICAgICAgICAgICAgICAgNTAwMFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgJChzdWJtaXRTZWxlY3RvcikuY2xpY2soXHJcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChzYXZlSW50ZXJ2YWwpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oc3RvcmFnZUtleSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBib2R5LmJsdXIoc2F2ZSk7XHJcbiAgICAgICAgICAgIHRhZ3MuYmx1cihzYXZlKTtcclxuICAgICAgICAgICAgdGl0bGUuYmx1cihzYXZlKTtcclxuICAgICAgICB9LFxyXG5cclxuICAgICAgICAvLyBIaWdobGlnaHRzIGludGVyZXN0aW5nIHRhZ3MsIGFuZCBkaW1zIG9yIGhpZGVzIGlnbm9yZWQgdGFnc1xyXG4gICAgICAgIGFwcGx5VGFnUHJlZnM6IGZ1bmN0aW9uIChpbnRlcmVzdGluZywgaWdub3JlZCwgaGlkZUlnbm9yZWQsIGRvbnRBcHBseSkge1xyXG4gICAgICAgICAgICB2YXIgd0lnbm9yZWQgPSBbXSxcclxuICAgICAgICAgICAgICAgIHdJbnRlcmVzdGluZyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgaWYgKGRvbnRBcHBseSkge1xyXG4gICAgICAgICAgICAgICAgdmFyIG5JbnQgPSBbXSxcclxuICAgICAgICAgICAgICAgICAgICBuSWduID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGludGVyZXN0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnRlcmVzdGluZy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9udEFwcGx5LmluZGV4T2YoaW50ZXJlc3RpbmdbaV0pID09IC0xKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoL1xcKi8udGVzdChpbnRlcmVzdGluZ1tpXSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd0ludGVyZXN0aW5nLnB1c2gobmV3IFJlZ0V4cChpbnRlcmVzdGluZ1tpXS5yZXBsYWNlKC8oWy4rXSkvZywgXCJcXFxcJDFcIikucmVwbGFjZSgvXFwqL2csIFwiLipcIikpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuSW50LnB1c2goaW50ZXJlc3RpbmdbaV0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIGludGVyZXN0aW5nID0gbkludDtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoaWdub3JlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWdub3JlZC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9udEFwcGx5LmluZGV4T2YoaWdub3JlZFtpXSkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgvXFwqLy50ZXN0KGlnbm9yZWRbaV0pKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdJZ25vcmVkLnB1c2gobmV3IFJlZ0V4cChpZ25vcmVkW2ldLnJlcGxhY2UoLyhbLitdKS9nLCBcIlxcXFwkMVwiKS5yZXBsYWNlKC9cXCovZywgXCIuKlwiKSkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5JZ24ucHVzaChpZ25vcmVkW2ldKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBpZ25vcmVkID0gbklnbjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgJCgnLnBvc3QtdGFnJykuZWFjaChcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChpbmRleCwgaWkpIHtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgaXRlbSA9ICQoaWkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gaXRlbS50ZXh0KCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc0lnbm9yZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaWdub3JlZC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQgPT0gaWdub3JlZFtpXSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSWdub3JlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3SWdub3JlZC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdJZ25vcmVkW2ldLnRlc3QodGV4dCkgJiYgZG9udEFwcGx5LmluZGV4T2YodGV4dCkgPT0gLTEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0lnbm9yZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNJZ25vcmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgb25RID0gaXRlbS5wYXJlbnRzKCcuLXN1bW1hcnknKS5hZGRDbGFzcygndGFnZ2VkLWlnbm9yZWQnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGlkZUlnbm9yZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblEuaGlkZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZXJlc3RpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzSW50ZXJlc3RpbmcgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW50ZXJlc3RpbmcubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09IGludGVyZXN0aW5nW2ldKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNJbnRlcmVzdGluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3SW50ZXJlc3RpbmcubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3SW50ZXJlc3RpbmdbaV0udGVzdCh0ZXh0KSAmJiBkb250QXBwbHkuaW5kZXhPZih0ZXh0KSA9PSAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW50ZXJlc3RpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNJbnRlcmVzdGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wYXJlbnRzKCcuLXN1bW1hcnknKS5hZGRDbGFzcygndGFnZ2VkLWludGVyZXN0aW5nJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgLy8gRm9yIGFsbCBpdGVtcyBpbiB0aGUgc2VsZWN0b3IsIHNocmluayB0aGVtIGlmIHRoZXkgYXJlIGxhcmdlciB0aGFuIG1heEhlaWdodCAob3ZlcmZsb3c6aGlkZGVuIHN0eWxlKSBhbmQgYWRkIGEgc2hvdyBtb3JlIGxpbmsuXHJcbiAgICAgICAgc2hyaW5rQW5kU2hvd01vcmU6IGZ1bmN0aW9uIChzZWxlY3RvciwgbWF4UGl4ZWxIZWlnaHQpIHtcclxuICAgICAgICAgICAgJChzZWxlY3RvcikuZWFjaChcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChpbmRleCwgaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBpID0gJChpdGVtKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaS5oZWlnaHQoKSA8PSBtYXhQaXhlbEhlaWdodCkgcmV0dXJuO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgcmVzZXRUbyA9IHsgb3ZlcmZsb3dZOiBpLmNzcygnb3ZlcmZsb3cteScpLCBtYXhIZWlnaHQ6IGkuY3NzKCdtYXgtaGVpZ2h0JykgfTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgaS5jc3MoeyBvdmVyZmxvd1k6ICdoaWRkZW4nLCBtYXhIZWlnaHQ6IG1heFBpeGVsSGVpZ2h0ICsgJ3B4JyB9KTtcclxuICAgICAgICAgICAgICAgICAgICB2YXIgc2hvd01vcmUgPSAkKCc8ZGl2IGNsYXNzPVwiZ2VuZXJpYy1zaG93LW1vcmVcIj48YT4nICsgX3MoJ3Nob3cgbW9yZScpICsgJzwvYT48L2Rpdj4nKTtcclxuICAgICAgICAgICAgICAgICAgICBpLmFmdGVyKHNob3dNb3JlKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgc2hvd01vcmUuY2xpY2soXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3dNb3JlLnJlbW92ZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaS5jc3MocmVzZXRUbyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBGb3Igbm93LCBkbyB0aGUgQ1NTLXMtcy1pbmcgaW4gY29kZS4gIE1heSByZWx5IHB1cmVseSBvbiBzdHlsZXMgaW4gdGhlIGZ1dHVyZS5cclxuICAgICAgICAgICAgICAgICAgICBzaG93TW9yZS5jc3MoeyBiYWNrZ3JvdW5kQ29sb3I6IGkuY3NzKCdiYWNrZ3JvdW5kLWNvbG9yJyksIGZvbnRTaXplOiAnMTJweCcgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIEFkZCBhIHNwaW5uZXIgdG8gZXZlcnl0aGluZyBtYXRjaGVkIGJ5IHNlbGVjdG9yIChvciBqdXN0IHBhc3MgaW4gYSBET00gb2JqZWN0KVxyXG4gICAgICAgIC8vICAgIFRoZSBkaXNwbGF5ZWQgbWVzc2FnZSA9IG1zZywgb3IgJ2xvYWRpbmcnIGlmIG1zZyBpcyBub3Qgc2V0XHJcbiAgICAgICAgYWRkU3Bpbm5lcjogZnVuY3Rpb24gKHNlbGVjdG9yLCBtc2cpIHtcclxuICAgICAgICAgICAgJChzZWxlY3RvcikuZWFjaChcclxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChpbmRleCwgaXRlbSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghbXNnKSBtc2cgPSBcImxvYWRpbmdcIjtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNwaW5uZXIgPSAkKCc8c3BhbiBjbGFzcz1cIm1vYmlsZS1zcGlubmVyXCI+PHNwYW4gY2xhc3M9XCJzcGlubmVyLW1lc3NhZ2VcIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJkb3QxXCI+Ljwvc3Bhbj48c3BhbiBjbGFzcz1cImRvdDJcIj4uPC9zcGFuPjxzcGFuIGNsYXNzPVwiZG90M1wiPi48L3NwYW4+PHNwYW4gY2xhc3M9XCJkb3Q0XCI+Ljwvc3Bhbj48L3NwYW4+Jyk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICQoaXRlbSkuYXBwZW5kKHNwaW5uZXIpO1xyXG4gICAgICAgICAgICAgICAgICAgICQoc3Bpbm5lcikuZmluZCgnLnNwaW5uZXItbWVzc2FnZScpLnRleHQobXNnKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRvdFdpZHRoID0gJChzcGlubmVyKS5maW5kKCcuZG90MScpLndpZHRoKCkgKyAkKHNwaW5uZXIpLmZpbmQoJy5kb3QyJykud2lkdGgoKSArICQoc3Bpbm5lcikuZmluZCgnLmRvdDMnKS53aWR0aCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlV2lkdGggPSAkKHNwaW5uZXIpLmZpbmQoJy5zcGlubmVyLW1lc3NhZ2UnKS53aWR0aCgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB2YXIgY2xpcFdpZHRoID0gbWVzc2FnZVdpZHRoICsgKGRvdFdpZHRoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgJChzcGlubmVyKS5jc3MoeyB3aWR0aDogY2xpcFdpZHRoICsgJ3B4Jywgb3ZlcmZsb3c6ICdoaWRkZW4nLCBkaXNwbGF5OiAnYmxvY2snIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICQoc3Bpbm5lcikuZmluZCgnLmRvdDEnKS5jc3MoeyBwYWRkaW5nTGVmdDogKGRvdFdpZHRoICogMikgKyAncHgnIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICQoc3Bpbm5lcikuZmluZCgnLmRvdDInKS5jc3MoeyBwYWRkaW5nTGVmdDogJzBweCcgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgJChzcGlubmVyKS5maW5kKCcuZG90MycpLmNzcyh7IHBhZGRpbmdMZWZ0OiAnMHB4JyB9KTtcclxuICAgICAgICAgICAgICAgICAgICAkKHNwaW5uZXIpLmZpbmQoJy5kb3Q0JykuY3NzKHsgcGFkZGluZ0xlZnQ6ICcwcHgnIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAkKHNwaW5uZXIpLmF0dHIoJ3NwaW5uZXJQYWRkaW5nJywgZG90V2lkdGggKiAyKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICAgIHN0YXJ0U3Bpbm5lcigpO1xyXG4gICAgICAgIH0sXHJcblxyXG4gICAgICAgIC8vIFJlbW92ZSBhbGwgc3Bpbm5lcnMgZnJvbSB0aGUgcGFzc2VkIGluIHNlbGVjdG9yIChvciBET00gb2JqZWN0KVxyXG4gICAgICAgIHJlbW92ZVNwaW5uZXI6IGZ1bmN0aW9uIChzZWxlY3Rvcikge1xyXG4gICAgICAgICAgICAkKHNlbGVjdG9yKS5maW5kKCcubW9iaWxlLXNwaW5uZXInKS5yZW1vdmUoKTtcclxuXHJcbiAgICAgICAgICAgIHN0b3BTcGlubmVyKCk7XHJcbiAgICAgICAgfSxcclxuXHJcbiAgICAgICAgaW5pdDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAkKFxyXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGluaXRTdWJtaXRPbkNoYW5nZXMoKTtcclxuICAgICAgICAgICAgICAgICAgICBpbml0U2VhcmNoQm94KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaGlkZVNwb2lsZXJzKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChTdGFja0V4Y2hhbmdlLnZvdGVfY2xvc2luZ0FuZEZsYWdnaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrRXhjaGFuZ2Uudm90ZV9jbG9zaW5nQW5kRmxhZ2dpbmcuaW5pdCh7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VTaG93UG9wdXA6IGNsb3NlU2hvd1BvcHVwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdTaG93UG9wdXA6IGZsYWdTaG93UG9wdXBcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBpbml0RGVsZXRlTGlua3MoKTtcclxuICAgICAgICAgICAgICAgICAgICBpbml0TW9kZXJhdG9yTGlua3MoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9LFxyXG4gICAgICAgIC8vIEdvdHRhIHJlLWV4cG9ydCB0aGlzIGZvciBhamF4IHNlYXJjaFxyXG4gICAgICAgIGluaXRTZWFyY2hCb3g6IGluaXRTZWFyY2hCb3hcclxuICAgIH07XHJcbn0oKTtcclxuXHJcblN0YWNrRXhjaGFuZ2UubW9iaWxlLm92ZXJsYXkgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICB2YXIgJG92ZXJsYXksICRvdmVybGF5VHJpZ2dlciwgJG92ZXJsYXlDbG9zZVRyaWdnZXI7XHJcbiAgICBmdW5jdGlvbiBjaGVja092ZXJsYXkoKSB7XHJcbiAgICAgICAgJG92ZXJsYXlUcmlnZ2VyLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgIHZhciBjc3NDbGFzcyA9IFwiX2Jsb2NrZWRcIjtcclxuICAgICAgICAgICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoXCJqcy1zdG9wLXNjcm9sbGluZ1wiKSkge1xyXG4gICAgICAgICAgICAgICAgY3NzQ2xhc3MgPSBcInN0b3Atc2Nyb2xsaW5nLW1vYmlsZVwiO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoJCh0aGlzKS5pcygnOmNoZWNrZWQnKSkge1xyXG4gICAgICAgICAgICAgICAgJCgnYm9keScpLmFkZENsYXNzKGNzc0NsYXNzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcyhjc3NDbGFzcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuIFxyXG4gICAgZnVuY3Rpb24gY2xvc2VPdmVybGF5KCkge1xyXG4gICAgICAgICRvdmVybGF5Q2xvc2VUcmlnZ2VyLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgaGlkZU92ZXJsYXkoKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBjbG9zZUFuZFNjcm9sbFRvKHNjcm9sbFRvRWxlbSkge1xyXG4gICAgICAgIGhpZGVPdmVybGF5KCk7XHJcbiAgICAgICAgaWYgKHNjcm9sbFRvRWxlbSkge1xyXG4gICAgICAgICAgICAkKCdodG1sLCBib2R5Jykuc2Nyb2xsVG9wKHNjcm9sbFRvRWxlbS5vZmZzZXQoKS50b3ApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiBoaWRlT3ZlcmxheSgpIHtcclxuICAgICAgICAkb3ZlcmxheVRyaWdnZXIucHJvcChcImNoZWNrZWRcIiwgZmFsc2UpLnRyaWdnZXIoJ2NoYW5nZScpO1xyXG4gICAgfVxyXG4gXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgJG92ZXJsYXkgPSAkKCcub3ZlcmxheScpO1xyXG4gICAgICAgICAgICAkb3ZlcmxheVRyaWdnZXIgPSAkKCcuanMtb3ZlcmxheS10cmlnZ2VyJyk7XHJcbiAgICAgICAgICAgICRvdmVybGF5Q2xvc2VUcmlnZ2VyID0gJG92ZXJsYXkuZmluZCgnLmpzLWNsb3NlJyk7XHJcblxyXG4gICAgICAgICAgICBjaGVja092ZXJsYXkoKTtcclxuICAgICAgICAgICAgY2xvc2VPdmVybGF5KCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBjbG9zZTogY2xvc2VPdmVybGF5LFxyXG4gICAgICAgIGhpZGU6IGhpZGVPdmVybGF5LFxyXG4gICAgICAgIGNsb3NlQW5kU2Nyb2xsVG86IGNsb3NlQW5kU2Nyb2xsVG9cclxuICAgIH1cclxuIH0oKTtcclxuXHJcblN0YWNrRXhjaGFuZ2UubW9iaWxlLnVwbG9hZGVyID0gZnVuY3Rpb24oKSB7XHJcbiAgICB2YXIgJGltZ1VybCwgJGltZ1VybEZpZWxkLCAkaW1nVXJsSW5wdXQsICRpbWdVcmxJbmZvLCAkYXJlYSwgJGZpbGVQcmV2aWV3LCAkZmlsZUlucHV0LCAkZXJyb3JUYXJnZXQsICRidXR0b24sICRmaWxlLCAkc2Nyb2xsVG9UYXJnZXQ7XHJcblxyXG4gICAgZnVuY3Rpb24gc2hvd1VybEZpZWxkKCkge1xyXG4gICAgICAgICRpbWdVcmxJbmZvLmFkZENsYXNzKCdoaWRkZW4taW1wb3J0YW50Jyk7XHJcbiAgICAgICAgJGltZ1VybEZpZWxkXHJcbiAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnaGlkZGVuLWltcG9ydGFudCcpXHJcbiAgICAgICAgICAgIC5maW5kKCdbdHlwZT1cInVybFwiXScpLmZvY3VzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gaGlkZVVybEZpZWxkKCkge1xyXG4gICAgICAgICRpbWdVcmxJbmZvLnJlbW92ZUNsYXNzKCdoaWRkZW4taW1wb3J0YW50Jyk7XHJcbiAgICAgICAgJGltZ1VybEZpZWxkXHJcbiAgICAgICAgICAgIC5hZGRDbGFzcygnaGlkZGVuLWltcG9ydGFudCcpXHJcbiAgICAgICAgICAgIC5maW5kKCdbdHlwZT1cInVybFwiXScpLnZhbCgnJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdG9nZ2xlTm90ZSgpIHtcclxuICAgICAgICAkaW1nVXJsLnRvZ2dsZUNsYXNzKCdoaWRkZW4taW1wb3J0YW50Jyk7XHJcbiAgICAgICAgJCgnLmpzLXJlc3RhcnQnKS50b2dnbGVDbGFzcygnaGlkZGVuLWltcG9ydGFudCcpO1xyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHRvZ2dsZVByZXZpZXcoYWN0aW9uKSB7XHJcbiAgICAgICAgaWYgKGFjdGlvbiA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICRhcmVhXHJcbiAgICAgICAgICAgICAgICAuZmluZCgnZmlndXJlJykuYWRkQ2xhc3MoJ2hpZGRlbi1pbXBvcnRhbnQnKS5lbmQoKVxyXG4gICAgICAgICAgICAgICAgLmZpbmQoJ2xhYmVsJykucmVtb3ZlQ2xhc3MoJ2hpZGRlbi1pbXBvcnRhbnQnKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PSBmYWxzZSkge1xyXG4gICAgICAgICAgICAkYXJlYVxyXG4gICAgICAgICAgICAgICAgLmZpbmQoJ2ZpZ3VyZScpLnJlbW92ZUNsYXNzKCdoaWRkZW4taW1wb3J0YW50JykuZW5kKClcclxuICAgICAgICAgICAgICAgIC5maW5kKCdsYWJlbCcpLmFkZENsYXNzKCdoaWRkZW4taW1wb3J0YW50Jyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHNlbGVjdEZpbGUoKSB7XHJcbiAgICAgICAgJGZpbGVJbnB1dC5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICB2YXIgaW5wdXQgPSB0aGlzO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlucHV0LmZpbGVzICYmIGlucHV0LmZpbGVzWzBdKSB7XHJcbiAgICAgICAgICAgICAgICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICAgICAgICAgIHZhciBpbnB1dEZpbGUgPSBpbnB1dC5maWxlc1swXTtcclxuXHJcbiAgICAgICAgICAgICAgICByZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAkZmlsZVByZXZpZXcuYXR0cignc3JjJywgZS50YXJnZXQucmVzdWx0KTtcclxuICAgICAgICAgICAgICAgICAgICAkZmlsZSA9IGlucHV0RmlsZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlUHJldmlldyhmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlTm90ZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGlucHV0RmlsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiByZXNldEZvcm0oKSB7XHJcbiAgICAgICAgJGJ1dHRvbi5yZW1vdmVDbGFzcygnbG9hZGluZycpO1xyXG5cclxuICAgICAgICAkaW1nVXJsSW5wdXQudmFsKCcnKTtcclxuICAgICAgICAkZmlsZUlucHV0LnZhbCgnJyk7IFxyXG4gICAgICAgICRmaWxlID0gJyc7XHJcblxyXG4gICAgICAgICRlcnJvclRhcmdldC5oaWRlKCk7XHJcbiAgICAgICAgdG9nZ2xlUHJldmlldyh0cnVlKTtcclxuICAgICAgICBoaWRlVXJsRmllbGQoKTtcclxuICAgICAgICB0b2dnbGVOb3RlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gYXBwZW5kTWFya2Rvd24odXJsKSB7XHJcbiAgICAgICAgdmFyIHdtZElucHV0ID0gJChcIiN3bWQtaW5wdXRcIik7XHJcbiAgICAgICAgdmFyIGV4aXN0aW5nVGV4dCA9IHdtZElucHV0LnZhbCgpO1xyXG4gICAgICAgIGV4aXN0aW5nVGV4dCArPSAnIVsnICsgX3MoXCJlbnRlciBpbWFnZSBkZXNjcmlwdGlvbiBoZXJlXCIpICsnXSgnICsgdXJsICsgJyknO1xyXG4gICAgICAgIHdtZElucHV0LnZhbChleGlzdGluZ1RleHQpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBmdW5jdGlvbiBkb1VwbG9hZCgpIHtcclxuICAgICAgICBpZiAoJGltZ1VybElucHV0LnZhbCgpLmxlbmd0aCkge1xyXG4gICAgICAgICAgICBhcHBlbmRNYXJrZG93bigkaW1nVXJsSW5wdXQudmFsKCkpOyAvLyBhcHBlbmQgVVJMIHRvIGVkaXRvclxyXG4gICAgICAgICAgICByZXNldEZvcm0oKTtcclxuICAgICAgICAgICAgU3RhY2tFeGNoYW5nZS5tb2JpbGUub3ZlcmxheS5jbG9zZUFuZFNjcm9sbFRvKCRzY3JvbGxUb1RhcmdldCk7IC8vIGNsb3NlIHBvcHVwXHJcbiAgICAgICAgfSBlbHNlIGlmICgkZmlsZSkge1xyXG4gICAgICAgICAgICB2YXIgZm9ybURhdGEgPSBuZXcgd2luZG93LkZvcm1EYXRhKCk7XHJcbiAgICAgICAgICAgICRlcnJvclRhcmdldC5oaWRlKCk7XHJcbiAgICAgICAgICAgICRidXR0b24uYWRkQ2xhc3MoJ2xvYWRpbmcnKTtcclxuXHJcbiAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZCgnZmlsZScsICRmaWxlKTtcclxuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKCdma2V5JywgU3RhY2tFeGNoYW5nZS5vcHRpb25zLnVzZXIuZmtleSk7XHJcbiAgICAgICAgICAgICQuYWpheCh7XHJcbiAgICAgICAgICAgICAgICB1cmw6IFwiL3VwbG9hZC9pbWFnZS9qc29uXCIsXHJcbiAgICAgICAgICAgICAgICBkYXRhOiBmb3JtRGF0YSxcclxuICAgICAgICAgICAgICAgIGNhY2hlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHByb2Nlc3NEYXRhOiBmYWxzZSxcclxuICAgICAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcclxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLlN1Y2Nlc3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kTWFya2Rvd24oZGF0YS5VcGxvYWRlZEltYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzZXRGb3JtKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrRXhjaGFuZ2UubW9iaWxlLm92ZXJsYXkuY2xvc2VBbmRTY3JvbGxUbygkc2Nyb2xsVG9UYXJnZXQpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvclRhcmdldC50ZXh0KGRhdGEuRXJyb3JNZXNzYWdlKS5zaG93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSwgXHJcbiAgICAgICAgICAgICAgICBjb21wbGV0ZTogZnVuY3Rpb24oKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgJGJ1dHRvbi5yZW1vdmVDbGFzcygnbG9hZGluZycpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBpbml0OiBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgICAgICRidXR0b24gPSAkKCcuanMtc3VibWl0Jyk7XHJcbiAgICAgICAgICAgICRpbWdVcmwgPSAkKCcuanMtaW1hZ2UtdXJsJyk7XHJcbiAgICAgICAgICAgICRpbWdVcmxJbmZvID0gJGltZ1VybC5maW5kKCcuanMtaW1hZ2UtdXJsLWluZm8nKTtcclxuICAgICAgICAgICAgJGltZ1VybEZpZWxkID0gJGltZ1VybC5maW5kKCcuanMtaW1hZ2UtdXJsLWZpZWxkJyk7XHJcbiAgICAgICAgICAgICRpbWdVcmxJbnB1dCA9ICRpbWdVcmwuZmluZCgnaW5wdXRbdHlwZT11cmxdJyk7XHJcblxyXG4gICAgICAgICAgICAkYXJlYSA9ICQoJy5qcy1hcmVhJyk7XHJcbiAgICAgICAgICAgICRmaWxlSW5wdXQgPSAkYXJlYS5maW5kKCcuanMtaW1hZ2UtaW5wdXQnKTtcclxuICAgICAgICAgICAgJGZpbGVQcmV2aWV3ID0gJGFyZWEuZmluZCgnZmlndXJlID4gaW1nJyk7XHJcblxyXG4gICAgICAgICAgICAkZXJyb3JUYXJnZXQgPSAkKFwiLnVwbG9hZGVyLWVycm9yXCIpO1xyXG4gICAgICAgICAgICAkc2Nyb2xsVG9UYXJnZXQgPSAkKCdbZGF0YS1yb2xlPVwidXBsb2FkZXItc2Nyb2xsdG90YXJnZXRcIl0nKTtcclxuICAgICAgICBcclxuICAgICAgICAgICAgc2VsZWN0RmlsZSgpO1xyXG5cclxuICAgICAgICAgICAgJCgnLmpzLWltYWdlLXVybC10cmlnZ2VyJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgc2hvd1VybEZpZWxkKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJCgnLmpzLXJlc3RhcnQtdHJpZ2dlcicpLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIHJlc2V0Rm9ybSgpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICQoJy5qcy1pbWFnZS11cmwtY2FuY2VsJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgaGlkZVVybEZpZWxkKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgJChcIi5qcy1jbG9zZVwiKS5vbihcImNsaWNrXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICAgIFN0YWNrRXhjaGFuZ2UubW9iaWxlLm92ZXJsYXkuY2xvc2VBbmRTY3JvbGxUbygkc2Nyb2xsVG9UYXJnZXQpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICRidXR0b24uY2xpY2soZG9VcGxvYWQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSgpOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==