').appendTo(this.header);
var checkboxContainer = (this.checkboxContainer = $('
')).addClass('ui-multiselect-checkboxes ui-helper-reset').appendTo(this.menu);
// perform event bindings
this._bindEvents();
// build menu
this.refresh(true);
// some addl. logic for single selects
if (!o.multiple) {
this.menu.addClass('ui-multiselect-single');
}
el.hide();
},
_init: function _init() {
if (this.options.header === false) {
this.header.hide();
}
if (!this.options.multiple) {
this.headerLinkContainer.find('.ui-multiselect-all, .ui-multiselect-none').hide();
} else {
this.headerLinkContainer.find('.ui-multiselect-all, .ui-multiselect-none').show();
}
if (this.options.autoOpen) {
this.open();
}
if (this.element.is(':disabled')) {
this.disable();
}
},
_makeOption: function _makeOption(option) {
var title = option.title ? option.title : null;
var value = option.value;
var id = this.element.attr('id') || this.multiselectID; // unique ID for the label & option tags
var inputID = 'ui-multiselect-' + this.multiselectID + '-' + (option.id || id + '-option-' + this.inputIdCounter++);
var isDisabled = option.disabled;
var isSelected = option.selected;
var labelClasses = ['ui-corner-all'];
var liClasses = [];
var o = this.options;
if (isDisabled) {
liClasses.push('ui-multiselect-disabled');
labelClasses.push('ui-state-disabled');
}
if (option.className) {
liClasses.push(option.className);
}
if (isSelected && !o.multiple) {
labelClasses.push('ui-state-active');
}
var $item = $("").addClass(liClasses.join(' '));
var $label = $("").attr({
"for": inputID,
"title": title
}).addClass(labelClasses.join(' ')).appendTo($item);
var $input = $("").attr({
"name": "multiselect_" + id,
"type": o.multiple ? "checkbox" : "radio",
"value": value,
"title": title,
"id": inputID,
"checked": isSelected ? "checked" : null,
"aria-selected": isSelected ? "true" : null,
"disabled": isDisabled ? "disabled" : null,
"aria-disabled": isDisabled ? "true" : null
}).data($(option).data()).appendTo($label);
$("").text($(option).text()).appendTo($label);
return $item;
},
_buildOptionList: function _buildOptionList(element, $appendTo) {
var self = this;
element.children().each(function () {
var $this = $(this);
if (this.tagName === 'OPTGROUP') {
var $optionGroup = $("
").addClass('ui-multiselect-optgroup ' + this.className).appendTo($appendTo);
if (self.options.groupColumns) {
$optionGroup.addClass("ui-multiselect-columns");
}
$("").text(this.getAttribute('label')).appendTo($optionGroup);
self._buildOptionList($this, $optionGroup);
} else {
var $listItem = self._makeOption(this).appendTo($appendTo);
}
});
},
refresh: function refresh(init) {
var self = this;
var el = this.element;
var o = this.options;
var menu = this.menu;
var checkboxContainer = this.checkboxContainer;
var html = "";
var $dropdown = $("
").addClass('ui-multiselect-checkboxes ui-helper-reset');
this.inputIdCounter = 0;
// update header link container visibility if needed
if (this.options.header) {
if (!this.options.multiple) {
this.headerLinkContainer.find('.ui-multiselect-all, .ui-multiselect-none').hide();
} else {
this.headerLinkContainer.find('.ui-multiselect-all, .ui-multiselect-none').show();
}
}
this._buildOptionList(el, $dropdown);
this.menu.find(".ui-multiselect-checkboxes").remove();
this.menu.append($dropdown);
// cache some moar useful elements
this.labels = menu.find('label');
this.inputs = this.labels.children('input');
this._setButtonWidth();
this.update(true);
// broadcast refresh event; useful for widgets
if (!init) {
this._trigger('refresh');
}
},
// updates the button text. call refresh() to rebuild
update: function update(isDefault) {
var o = this.options;
var $inputs = this.inputs;
var $checked = $inputs.filter(':checked');
var numChecked = $checked.length;
var value;
if (numChecked === 0) {
value = o.noneSelectedText;
} else {
if ($.isFunction(o.selectedText)) {
value = o.selectedText.call(this, numChecked, $inputs.length, $checked.get());
} else if (/\d/.test(o.selectedList) && o.selectedList > 0 && numChecked <= o.selectedList) {
value = $checked.map(function () {
return $(this).next().text();
}).get().join(o.selectedListSeparator);
} else {
value = o.selectedText.replace('#', numChecked).replace('#', $inputs.length);
}
}
this._setButtonValue(value);
if (isDefault) {
this.button[0].defaultValue = value;
}
},
// this exists as a separate method so that the developer
// can easily override it.
_setButtonValue: function _setButtonValue(value) {
this.buttonlabel.text(value);
},
_bindButtonEvents: function _bindButtonEvents() {
var self = this;
var button = this.button;
function clickHandler() {
self[self._isOpen ? 'close' : 'open']();
return false;
}
// webkit doesn't like it when you click on the span :(
button.find('span').bind('click.multiselect', clickHandler);
// button events
button.bind({
click: clickHandler,
keypress: function keypress(e) {
switch (e.which) {
case 27: // esc
case 38: // up
case 37:
// left
self.close();
break;
case 39: // right
case 40:
// down
self.open();
break;
}
},
mouseenter: function mouseenter() {
if (!button.hasClass('ui-state-disabled')) {
$(this).addClass('ui-state-hover');
}
},
mouseleave: function mouseleave() {
$(this).removeClass('ui-state-hover');
},
focus: function focus() {
if (!button.hasClass('ui-state-disabled')) {
$(this).addClass('ui-state-focus');
}
},
blur: function blur() {
$(this).removeClass('ui-state-focus');
}
});
},
_bindMenuEvents: function _bindMenuEvents() {
var self = this;
// optgroup label toggle support
this.menu.delegate('.ui-multiselect-optgroup a', 'click.multiselect', function (e) {
e.preventDefault();
var $this = $(this);
var $inputs = $this.parent().find('input:visible:not(:disabled)');
var nodes = $inputs.get();
var label = $this.text();
// trigger event and bail if the return is false
if (self._trigger('beforeoptgrouptoggle', e, {
inputs: nodes,
label: label
}) === false) {
return;
}
// toggle inputs
self._toggleChecked($inputs.filter(':checked').length !== $inputs.length, $inputs);
self._trigger('optgrouptoggle', e, {
inputs: nodes,
label: label,
checked: nodes.length ? nodes[0].checked : null
});
}).delegate('label', 'mouseenter.multiselect', function () {
if (!$(this).hasClass('ui-state-disabled')) {
self.labels.removeClass('ui-state-hover');
$(this).addClass('ui-state-hover').find('input').focus();
}
}).delegate('label', 'keydown.multiselect', function (e) {
if (e.which === 82) {
return; //"r" key, often used for reload.
}
if (e.which > 111 && e.which < 124) {
return; //Keyboard function keys.
}
e.preventDefault();
switch (e.which) {
case 9:
// tab
if (e.shiftKey) {
self.menu.find(".ui-state-hover").removeClass("ui-state-hover");
self.header.find("li").last().find("a").focus();
} else {
self.close();
}
break;
case 27:
// esc
self.close();
break;
case 38: // up
case 40: // down
case 37: // left
case 39:
// right
self._traverse(e.which, this);
break;
case 13: // enter
case 32:
$(this).find('input')[0].click();
break;
case 65:
if (e.altKey) {
self.checkAll();
}
break;
case 85:
if (e.altKey) {
self.uncheckAll();
}
break;
}
}).delegate('input[type="checkbox"], input[type="radio"]', 'click.multiselect', function (e) {
var $this = $(this);
var val = this.value;
var optionText = $this.parent().find("span").text();
var checked = this.checked;
var tags = self.element.find('option');
// bail if this input is disabled or the event is cancelled
if (this.disabled || self._trigger('click', e, {
value: val,
text: optionText,
checked: checked
}) === false) {
e.preventDefault();
return;
}
// make sure the input has focus. otherwise, the esc key
// won't close the menu after clicking an item.
$this.focus();
// toggle aria state
$this.prop('aria-selected', checked);
// change state on the original option tags
tags.each(function () {
if (this.value === val) {
this.selected = checked;
} else if (!self.options.multiple) {
this.selected = false;
}
});
// some additional single select-specific logic
if (!self.options.multiple) {
self.labels.removeClass('ui-state-active');
$this.closest('label').toggleClass('ui-state-active', checked);
// close menu
self.close();
}
// fire change on the select box
self.element.trigger("change");
// setTimeout is to fix multiselect issue #14 and #47. caused by jQuery issue #3827
// http://bugs.jquery.com/ticket/3827
setTimeout($.proxy(self.update, self), 10);
});
},
_bindHeaderEvents: function _bindHeaderEvents() {
var self = this;
// header links
this.header.delegate('a', 'click.multiselect', function (e) {
var $this = $(this);
if ($this.hasClass('ui-multiselect-close')) {
self.close();
} else if ($this.hasClass("ui-multiselect-all")) {
self.checkAll();
} else if ($this.hasClass("ui-multiselect-none")) {
self.uncheckAll();
}
e.preventDefault();
}).delegate('a', 'keydown.multiselect', function (e) {
switch (e.which) {
case 27:
self.close();
break;
case 9:
var $target = $(e.target);
if (e.shiftKey && !$target.parent().prev().length && !self.header.find(".ui-multiselect-filter").length || !$target.parent().next().length && !self.labels.length && !e.shiftKey) {
self.close();
e.preventDefault();
}
break;
}
});
},
// binds events
_bindEvents: function _bindEvents() {
var self = this;
this._bindButtonEvents();
this._bindMenuEvents();
this._bindHeaderEvents();
// close each widget when clicking on any other element/anywhere else on the page
$doc.bind('mousedown.' + self._namespaceID, function (event) {
var target = event.target;
if (self._isOpen && target !== self.button[0] && target !== self.menu[0] && !$.contains(self.menu[0], target) && !$.contains(self.button[0], target)) {
self.close();
}
});
// deal with form resets. the problem here is that buttons aren't
// restored to their defaultValue prop on form reset, and the reset
// handler fires before the form is actually reset. delaying it a bit
// gives the form inputs time to clear.
$(this.element[0].form).bind('reset.' + this._namespaceID, function () {
setTimeout($.proxy(self.refresh, self), 10);
});
},
_getMinWidth: function _getMinWidth() {
var minVal = this.options.minWidth;
var width = 0;
switch (_typeof(minVal)) {
case 'number':
width = minVal;
break;
case 'string':
var lastChar = minVal[minVal.length - 1];
width = minVal.match(/\d+/);
if (lastChar === '%') {
width = minVal;
} else {
width = parseInt(minVal, 10);
}
break;
}
return width;
},
// set button width
_setButtonWidth: function _setButtonWidth() {
var width = this._getMinWidth();
// set widths
this.button.outerWidth(width);
},
// set menu width
_setMenuWidth: function _setMenuWidth() {
var m = this.menu;
var width = this.button.outerWidth() <= 0 ? this._getMinWidth() : this.button.outerWidth();
m.outerWidth(this.options.menuWidth || width);
},
_setMenuHeight: function _setMenuHeight() {
var headerHeight = this.menu.children(".ui-multiselect-header:visible").outerHeight(true);
var ulHeight = 0;
this.menu.find(".ui-multiselect-checkboxes li, .ui-multiselect-checkboxes a").each(function (idx, li) {
ulHeight += $(li).outerHeight(true);
});
if (ulHeight > this.options.height) {
this.menu.children(".ui-multiselect-checkboxes").css("overflow", "auto");
ulHeight = this.options.height;
} else {
this.menu.children(".ui-multiselect-checkboxes").css("overflow", "hidden");
}
this.menu.children(".ui-multiselect-checkboxes").height(ulHeight);
this.menu.height(ulHeight + headerHeight);
},
_resizeMenu: function _resizeMenu() {
this._setMenuWidth();
this._setMenuHeight();
},
// move up or down within the menu
_traverse: function _traverse(which, start) {
var $start = $(start);
var moveToLast = which === 38 || which === 37;
// select the first li that isn't an optgroup label / disabled
var $next = $start.parent()[moveToLast ? 'prevAll' : 'nextAll']('li:not(.ui-multiselect-disabled, .ui-multiselect-optgroup):visible').first();
// we might have to jump to the next/previous option group
if (!$next.length) {
$next = $start.parents(".ui-multiselect-optgroup")[moveToLast ? "prev" : "next"]();
}
// if at the first/last element
if (!$next.length) {
var $container = this.menu.find('ul').last();
// move to the first/last
this.menu.find('label:visible')[moveToLast ? 'last' : 'first']().trigger('mouseover');
// set scroll position
$container.scrollTop(moveToLast ? $container.height() : 0);
} else {
$next.find('label:visible')[moveToLast ? "last" : "first"]().trigger('mouseover');
}
},
// This is an internal function to toggle the checked property and
// other related attributes of a checkbox.
//
// The context of this function should be a checkbox; do not proxy it.
_toggleState: function _toggleState(prop, flag) {
return function () {
if (!this.disabled) {
this[prop] = flag;
}
if (flag) {
this.setAttribute('aria-selected', true);
} else {
this.removeAttribute('aria-selected');
}
};
},
_toggleChecked: function _toggleChecked(flag, group) {
var $inputs = group && group.length ? group : this.inputs;
var self = this;
// toggle state on inputs
$inputs.each(this._toggleState('checked', flag));
// give the first input focus
$inputs.eq(0).focus();
// update button text
this.update();
// gather an array of the values that actually changed
var values = {};
$inputs.each(function () {
values[this.value] = true;
});
// toggle state on original option tags
this.element.find('option').each(function () {
if (!this.disabled && values[this.value]) {
self._toggleState('selected', flag).call(this);
}
});
// trigger the change event on the select
if ($inputs.length) {
this.element.trigger("change");
}
},
_toggleDisabled: function _toggleDisabled(flag) {
this.button.prop({
'disabled': flag,
'aria-disabled': flag
})[flag ? 'addClass' : 'removeClass']('ui-state-disabled');
if (this.options.disableInputsOnToggle) {
var checkboxes = this.menu.find(".ui-multiselect-checkboxes").get(0);
var matchedInputs = [];
var key = "ech-multiselect-disabled";
var i = 0;
if (flag) {
// remember which elements this widget disabled (not pre-disabled)
// elements, so that they can be restored if the widget is re-enabled.
matchedInputs = checkboxes.querySelectorAll("input:enabled");
for (i = 0; i < matchedInputs.length; i++) {
matchedInputs[i].setAttribute(key, true);
matchedInputs[i].setAttribute("disabled", "disabled");
matchedInputs[i].setAttribute("aria-disabled", "disabled");
matchedInputs[i].parentNode.className = matchedInputs[i].parentNode.className + " ui-state-disabled";
}
} else {
matchedInputs = checkboxes.querySelectorAll("input:disabled");
for (i = 0; i < matchedInputs.length; i++) {
if (matchedInputs[i].hasAttribute(key)) {
matchedInputs[i].removeAttribute(key);
matchedInputs[i].removeAttribute("disabled");
matchedInputs[i].removeAttribute("aria-disabled");
matchedInputs[i].parentNode.className = matchedInputs[i].parentNode.className.replace(" ui-state-disabled", "");
}
}
}
}
this.element.prop({
'disabled': flag,
'aria-disabled': flag
});
},
// open the menu
open: function open(e) {
var self = this;
var button = this.button;
var menu = this.menu;
var speed = this.speed;
var o = this.options;
var args = [];
// bail if the multiselectopen event returns false, this widget is disabled, or is already open
if (this._trigger('beforeopen') === false || button.hasClass('ui-state-disabled') || this._isOpen) {
return;
}
var $container = menu.find('.ui-multiselect-checkboxes');
var effect = o.show;
// figure out opening effects/speeds
if ($.isArray(o.show)) {
effect = o.show[0];
speed = o.show[1] || self.speed;
}
// if there's an effect, assume jQuery UI is in use
// build the arguments to pass to show()
if (effect) {
args = [effect, speed];
}
// set the scroll of the checkbox container
$container.scrollTop(0);
// show the menu, maybe with a speed/effect combo
$.fn.show.apply(menu, args);
this._resizeMenu();
// positon
this.position();
// select the first not disabled option or the filter input if available
var filter = this.header.find(".ui-multiselect-filter");
if (filter.length) {
filter.first().find('input').trigger('focus');
} else if (this.labels.length) {
this.labels.filter(':not(.ui-state-disabled)').eq(0).trigger('mouseover').trigger('mouseenter').find('input').trigger('focus');
} else {
this.header.find('a').first().trigger('focus');
}
button.addClass('ui-state-active');
this._isOpen = true;
this._trigger('open');
},
// close the menu
close: function close() {
if (this._trigger('beforeclose') === false) {
return;
}
var o = this.options;
var effect = o.hide;
var speed = this.speed;
var args = [];
// figure out opening effects/speeds
if ($.isArray(o.hide)) {
effect = o.hide[0];
speed = o.hide[1] || this.speed;
}
if (effect) {
args = [effect, speed];
}
$.fn.hide.apply(this.menu, args);
this.button.removeClass('ui-state-active').trigger('blur').trigger('mouseleave');
this._isOpen = false;
this._trigger('close');
this.button.trigger('focus');
},
enable: function enable() {
this._toggleDisabled(false);
},
disable: function disable() {
this._toggleDisabled(true);
},
checkAll: function checkAll(e) {
this._toggleChecked(true);
this._trigger('checkAll');
},
uncheckAll: function uncheckAll() {
this._toggleChecked(false);
this._trigger('uncheckAll');
},
getChecked: function getChecked() {
return this.menu.find('input').filter(':checked');
},
getUnchecked: function getUnchecked() {
return this.menu.find('input').not(':checked');
},
destroy: function destroy() {
// remove classes + data
$.Widget.prototype.destroy.call(this);
// unbind events
$doc.unbind(this._namespaceID);
$(this.element[0].form).unbind(this._namespaceID);
this.button.remove();
this.menu.remove();
this.element.show();
return this;
},
isOpen: function isOpen() {
return this._isOpen;
},
widget: function widget() {
return this.menu;
},
getButton: function getButton() {
return this.button;
},
getMenu: function getMenu() {
return this.menu;
},
getLabels: function getLabels() {
return this.labels;
},
addOption: function addOption(attributes, text, groupLabel) {
var $option = $("").attr(attributes).text(text);
var optionNode = $option.get(0);
if (groupLabel) {
this.element.children("OPTGROUP").filter(function () {
return $(this).prop("label") === groupLabel;
}).append($option);
this.menu.find(".ui-multiselect-optgroup").filter(function () {
return $(this).find("a").text() === groupLabel;
}).append(this._makeOption(optionNode));
} else {
this.element.append($option);
this.menu.find(".ui-multiselect-checkboxes").append(this._makeOption(optionNode));
}
//update cached elements
this.labels = this.menu.find('label');
this.inputs = this.labels.children('input');
},
removeOption: function removeOption(value) {
if (!value) {
return;
}
this.element.find("option[value=" + value + "]").remove();
this.labels.find("input[value=" + value + "]").parents("li").remove();
//update cached elements
this.labels = this.menu.find('label');
this.inputs = this.labels.children('input');
},
position: function position() {
var pos = {
my: "top",
at: "bottom",
of: this.button
};
if (!$.isEmptyObject(this.options.position)) {
pos.my = this.options.position.my || pos.my;
pos.at = this.options.position.at || pos.at;
pos.of = this.options.position.of || pos.of;
}
if ($.ui && $.ui.position) {
this.menu.position(pos);
} else {
pos = this.button.position();
pos.top += this.button.outerHeight(false);
this.menu.offset(pos);
}
},
// react to option changes after initialization
_setOption: function _setOption(key, value) {
var menu = this.menu;
switch (key) {
case 'header':
if (typeof value === 'boolean') {
this.header[value ? 'show' : 'hide']();
} else if (typeof value === 'string') {
this.headerLinkContainer.children("li:not(:last-child)").remove();
this.headerLinkContainer.prepend("
" + value + "
");
}
break;
case 'checkAllText':
menu.find('a.ui-multiselect-all span').eq(-1).text(value);
break;
case 'uncheckAllText':
menu.find('a.ui-multiselect-none span').eq(-1).text(value);
break;
case 'height':
this.options[key] = value;
this._setMenuHeight();
break;
case 'minWidth':
case 'menuWidth':
this.options[key] = value;
this._setButtonWidth();
this._setMenuWidth();
break;
case 'selectedText':
case 'selectedList':
case 'noneSelectedText':
this.options[key] = value; // these all needs to update immediately for the update() call
this.update();
break;
case 'classes':
menu.add(this.button).removeClass(this.options.classes).addClass(value);
break;
case 'multiple':
menu.toggleClass('ui-multiselect-single', !value);
this.options.multiple = value;
this.element[0].multiple = value;
this.uncheckAll();
this.refresh();
break;
case 'position':
this.position();
break;
case 'selectedListSeparator':
this.options[key] = value;
this.update(true);
break;
}
$.Widget.prototype._setOption.apply(this, arguments);
}
});
})(jQuery);
/***/ }),
/***/ "./assets/js/components/jquery-ui-multiselect-widget-iride/jquery.multiselect.css":
/*!****************************************************************************************!*\
!*** ./assets/js/components/jquery-ui-multiselect-widget-iride/jquery.multiselect.css ***!
\****************************************************************************************/
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
__webpack_require__.r(__webpack_exports__);
// extracted by mini-css-extract-plugin
/***/ })
}]);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXRzX2pzX2NvbXBvbmVudHNfanF1ZXJ5LXVpLW11bHRpc2VsZWN0LXdpZGdldC1pcmlkZV9zcmNfanF1ZXJ5X211bHRpc2VsZWN0X2pzLWFzc2V0c19qc19jLTM3ZjUyOS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDLFVBQVNBLENBQUMsRUFBRUMsU0FBUyxFQUFFO0VBQ3RCO0VBQ0EsSUFBSUMsYUFBYSxHQUFHLENBQUM7RUFDckIsSUFBSUMsSUFBSSxHQUFHSCxDQUFDLENBQUNJLFFBQVEsQ0FBQztFQUV0QkosQ0FBQyxDQUFDSyxNQUFNLENBQUMsaUJBQWlCLEVBQUU7SUFFMUI7SUFDQUMsT0FBTyxFQUFFO01BQ1BDLE1BQU0sRUFBRSxJQUFJO01BQ1pDLE1BQU0sRUFBRSxHQUFHO01BQ1hDLFFBQVEsRUFBRSxHQUFHO01BQ2JDLE9BQU8sRUFBRSxFQUFFO01BQ1hDLFlBQVksRUFBRSxXQUFXO01BQ3pCQyxjQUFjLEVBQUUsYUFBYTtNQUM3QkMsZ0JBQWdCLEVBQUUsZ0JBQWdCO01BQ2xDQyxZQUFZLEVBQUUsSUFBSTtNQUNsQkMsY0FBYyxFQUFFLElBQUk7TUFDcEJDLFlBQVksRUFBRSxZQUFZO01BQzFCQyxZQUFZLEVBQUUsQ0FBQztNQUNmQyxTQUFTLEVBQUUsc0JBQXNCO01BQ2pDQyxJQUFJLEVBQUUsSUFBSTtNQUNWQyxJQUFJLEVBQUUsSUFBSTtNQUNWQyxRQUFRLEVBQUUsS0FBSztNQUNmQyxRQUFRLEVBQUUsSUFBSTtNQUNkQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO01BQ1pDLFFBQVEsRUFBRSxJQUFJO01BQ2RDLFNBQVMsRUFBQyxJQUFJO01BQ2RDLHFCQUFxQixFQUFFLElBQUk7TUFDM0JDLHFCQUFxQixFQUFFLElBQUk7TUFDM0JDLFlBQVksRUFBRTtJQUNoQixDQUFDO0lBRURDLFlBQVksRUFBRSxTQUFBQSxhQUFBLEVBQVc7TUFDdkIsSUFBSUMsT0FBTyxHQUFHLElBQUksQ0FBQ3hCLE9BQU8sQ0FBQ2tCLFFBQVE7TUFDbkMsSUFBR00sT0FBTyxFQUFFO1FBQ1ZBLE9BQU8sR0FBR0EsT0FBTyxDQUFDQyxNQUFNLElBQUlELE9BQU8sQ0FBQ0UsUUFBUSxHQUFHaEMsQ0FBQyxDQUFDOEIsT0FBTyxDQUFDLEdBQUcsSUFBSSxDQUFDMUIsUUFBUSxDQUFDNkIsSUFBSSxDQUFDSCxPQUFPLENBQUMsQ0FBQ0ksRUFBRSxDQUFDLENBQUMsQ0FBQztNQUMvRjtNQUNBLElBQUcsQ0FBQ0osT0FBTyxJQUFJLENBQUNBLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUMxQkEsT0FBTyxHQUFHLElBQUksQ0FBQ0EsT0FBTyxDQUFDSyxPQUFPLENBQUMsbUJBQW1CLENBQUM7TUFDckQ7TUFDQSxJQUFHLENBQUNMLE9BQU8sQ0FBQ00sTUFBTSxFQUFFO1FBQ2xCTixPQUFPLEdBQUcsSUFBSSxDQUFDMUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDaUMsSUFBSTtNQUNqQztNQUNBLE9BQU9QLE9BQU87SUFDaEIsQ0FBQztJQUVEUSxPQUFPLEVBQUUsU0FBQUEsUUFBQSxFQUFXO01BQ2xCLElBQUlDLEVBQUUsR0FBRyxJQUFJLENBQUNULE9BQU87TUFDckIsSUFBSVUsQ0FBQyxHQUFHLElBQUksQ0FBQ2xDLE9BQU87TUFFcEIsSUFBSSxDQUFDbUMsS0FBSyxHQUFHekMsQ0FBQyxDQUFDMEMsRUFBRSxDQUFDQyxNQUFNLENBQUNDLFFBQVEsQ0FBQyxDQUFDO01BQ25DLElBQUksQ0FBQ0MsT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDO01BQ3RCLElBQUksQ0FBQ0MsY0FBYyxHQUFHLENBQUM7O01BRXZCO01BQ0E7TUFDQTtNQUNBLElBQUksQ0FBQ0MsWUFBWSxHQUFHLElBQUksQ0FBQ0MsY0FBYyxJQUFLLGFBQWEsR0FBRzlDLGFBQWM7TUFDMUU7TUFDQSxJQUFJLENBQUNBLGFBQWEsR0FBR0EsYUFBYSxFQUFFO01BRXBDLElBQUkrQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUNBLE1BQU0sR0FBR2pELENBQUMsQ0FBQyxtRkFBbUYsQ0FBQyxFQUMvR2tELFFBQVEsQ0FBQyx5REFBeUQsQ0FBQyxDQUNuRUEsUUFBUSxDQUFDVixDQUFDLENBQUM5QixPQUFPLENBQUMsQ0FDbkJ5QyxJQUFJLENBQUM7UUFBRSxPQUFPLEVBQUNaLEVBQUUsQ0FBQ1ksSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUFFLFVBQVUsRUFBQ1osRUFBRSxDQUFDWSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQUUsSUFBSSxFQUFFWixFQUFFLENBQUNZLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBR1osRUFBRSxDQUFDWSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUksS0FBSyxHQUFHO01BQUssQ0FBQyxDQUFDLENBQ3ZIQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUMzQkMsV0FBVyxDQUFDZCxFQUFFLENBQUM7TUFFaEIsSUFBSSxDQUFDZSxXQUFXLEdBQUd0RCxDQUFDLENBQUMsVUFBVSxDQUFDLENBQzdCdUQsSUFBSSxDQUFDZixDQUFDLENBQUMzQixnQkFBZ0IsQ0FBQyxDQUN4QlcsUUFBUSxDQUFDeUIsTUFBTSxDQUFDO01BRW5CLElBQUksQ0FBQ08sSUFBSSxHQUFHeEQsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUNyQmtELFFBQVEsQ0FBQywrREFBK0QsQ0FBQyxDQUN6RUEsUUFBUSxDQUFDVixDQUFDLENBQUM5QixPQUFPLENBQUMsQ0FDbkJjLFFBQVEsQ0FBQyxJQUFJLENBQUNLLFlBQVksQ0FBQyxDQUFDLENBQUM7TUFFaEMsSUFBSSxDQUFDdEIsTUFBTSxHQUFHUCxDQUFDLENBQUMsU0FBUyxDQUFDLENBQ3ZCa0QsUUFBUSxDQUFDLHlFQUF5RSxDQUFDLENBQ25GMUIsUUFBUSxDQUFDLElBQUksQ0FBQ2dDLElBQUksQ0FBQztNQUV0QixJQUFJLENBQUNDLG1CQUFtQixHQUFHekQsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUNuQ2tELFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUMzQkssSUFBSSxDQUFDLFlBQVc7UUFDZixJQUFHZixDQUFDLENBQUNqQyxNQUFNLEtBQUssSUFBSSxFQUFFO1VBQ3BCLElBQUltRCxVQUFVLEdBQUcsRUFBRTtVQUNuQixJQUFHbEIsQ0FBQyxDQUFDMUIsWUFBWSxFQUFFO1lBQ2pCNEMsVUFBVSxHQUFHLDhGQUE4RixHQUFHbEIsQ0FBQyxDQUFDN0IsWUFBWSxHQUFHLGtCQUFrQjtVQUNuSjtVQUNBLElBQUc2QixDQUFDLENBQUN6QixjQUFjLEVBQUU7WUFDbkIyQyxVQUFVLElBQUksb0dBQW9HLEdBQUdsQixDQUFDLENBQUM1QixjQUFjLEdBQUcsa0JBQWtCO1VBQzVKO1VBQ0EsT0FBTzhDLFVBQVU7UUFDbkIsQ0FBQyxNQUFNLElBQUcsT0FBT2xCLENBQUMsQ0FBQ2pDLE1BQU0sS0FBSyxRQUFRLEVBQUU7VUFDdEMsT0FBTyxNQUFNLEdBQUdpQyxDQUFDLENBQUNqQyxNQUFNLEdBQUcsT0FBTztRQUNwQyxDQUFDLE1BQU07VUFDTCxPQUFPLEVBQUU7UUFDWDtNQUNGLENBQUMsQ0FBQyxDQUNEb0QsTUFBTSxDQUFDLGlHQUFpRyxHQUFDbkIsQ0FBQyxDQUFDdEIsU0FBUyxHQUFDLG9CQUFvQixDQUFDLENBQzFJTSxRQUFRLENBQUMsSUFBSSxDQUFDakIsTUFBTSxDQUFDO01BRXhCLElBQUlxRCxpQkFBaUIsR0FBRyxDQUFDLElBQUksQ0FBQ0EsaUJBQWlCLEdBQUc1RCxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQzFEa0QsUUFBUSxDQUFDLDJDQUEyQyxDQUFDLENBQ3JEMUIsUUFBUSxDQUFDLElBQUksQ0FBQ2dDLElBQUksQ0FBQzs7TUFFdEI7TUFDQSxJQUFJLENBQUNLLFdBQVcsQ0FBQyxDQUFDOztNQUVsQjtNQUNBLElBQUksQ0FBQ0MsT0FBTyxDQUFDLElBQUksQ0FBQzs7TUFFbEI7TUFDQSxJQUFHLENBQUN0QixDQUFDLENBQUNsQixRQUFRLEVBQUU7UUFDZCxJQUFJLENBQUNrQyxJQUFJLENBQUNOLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQztNQUM3QztNQUNBWCxFQUFFLENBQUNuQixJQUFJLENBQUMsQ0FBQztJQUNiLENBQUM7SUFFRDJDLEtBQUssRUFBRSxTQUFBQSxNQUFBLEVBQVc7TUFDaEIsSUFBRyxJQUFJLENBQUN6RCxPQUFPLENBQUNDLE1BQU0sS0FBSyxLQUFLLEVBQUU7UUFDaEMsSUFBSSxDQUFDQSxNQUFNLENBQUNhLElBQUksQ0FBQyxDQUFDO01BQ3BCO01BQ0EsSUFBRyxDQUFDLElBQUksQ0FBQ2QsT0FBTyxDQUFDZ0IsUUFBUSxFQUFFO1FBQ3pCLElBQUksQ0FBQ21DLG1CQUFtQixDQUFDeEIsSUFBSSxDQUFDLDJDQUEyQyxDQUFDLENBQUNiLElBQUksQ0FBQyxDQUFDO01BQ25GLENBQUMsTUFBTTtRQUNMLElBQUksQ0FBQ3FDLG1CQUFtQixDQUFDeEIsSUFBSSxDQUFDLDJDQUEyQyxDQUFDLENBQUNkLElBQUksQ0FBQyxDQUFDO01BQ25GO01BQ0EsSUFBRyxJQUFJLENBQUNiLE9BQU8sQ0FBQ2UsUUFBUSxFQUFFO1FBQ3hCLElBQUksQ0FBQzJDLElBQUksQ0FBQyxDQUFDO01BQ2I7TUFDQSxJQUFHLElBQUksQ0FBQ2xDLE9BQU8sQ0FBQ21DLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBRTtRQUMvQixJQUFJLENBQUNDLE9BQU8sQ0FBQyxDQUFDO01BQ2hCO0lBQ0YsQ0FBQztJQUVEQyxXQUFXLEVBQUUsU0FBQUEsWUFBU0MsTUFBTSxFQUFFO01BQzVCLElBQUlDLEtBQUssR0FBR0QsTUFBTSxDQUFDQyxLQUFLLEdBQUdELE1BQU0sQ0FBQ0MsS0FBSyxHQUFHLElBQUk7TUFDOUMsSUFBSUMsS0FBSyxHQUFHRixNQUFNLENBQUNFLEtBQUs7TUFDeEIsSUFBSUMsRUFBRSxHQUFHLElBQUksQ0FBQ3pDLE9BQU8sQ0FBQ3FCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUNqRCxhQUFhLENBQUMsQ0FBQztNQUN4RCxJQUFJc0UsT0FBTyxHQUFHLGlCQUFpQixHQUFHLElBQUksQ0FBQ3RFLGFBQWEsR0FBRyxHQUFHLElBQUlrRSxNQUFNLENBQUNHLEVBQUUsSUFBSUEsRUFBRSxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUN6QixjQUFjLEVBQUUsQ0FBQztNQUNuSCxJQUFJMkIsVUFBVSxHQUFHTCxNQUFNLENBQUNNLFFBQVE7TUFDaEMsSUFBSUMsVUFBVSxHQUFHUCxNQUFNLENBQUNRLFFBQVE7TUFDaEMsSUFBSUMsWUFBWSxHQUFHLENBQUUsZUFBZSxDQUFFO01BQ3RDLElBQUlDLFNBQVMsR0FBRyxFQUFFO01BQ2xCLElBQUl0QyxDQUFDLEdBQUcsSUFBSSxDQUFDbEMsT0FBTztNQUVwQixJQUFHbUUsVUFBVSxFQUFFO1FBQ2JLLFNBQVMsQ0FBQ0MsSUFBSSxDQUFDLHlCQUF5QixDQUFDO1FBQ3pDRixZQUFZLENBQUNFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztNQUN4QztNQUNBLElBQUdYLE1BQU0sQ0FBQ1ksU0FBUyxFQUFFO1FBQ25CRixTQUFTLENBQUNDLElBQUksQ0FBQ1gsTUFBTSxDQUFDWSxTQUFTLENBQUM7TUFDbEM7TUFDQSxJQUFHTCxVQUFVLElBQUksQ0FBQ25DLENBQUMsQ0FBQ2xCLFFBQVEsRUFBRTtRQUM1QnVELFlBQVksQ0FBQ0UsSUFBSSxDQUFDLGlCQUFpQixDQUFDO01BQ3RDO01BRUEsSUFBSUUsS0FBSyxHQUFHakYsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDa0QsUUFBUSxDQUFDNEIsU0FBUyxDQUFDSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7TUFDcEQsSUFBSUMsTUFBTSxHQUFHbkYsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDbUQsSUFBSSxDQUFDO1FBQzlCLEtBQUssRUFBRXFCLE9BQU87UUFDZCxPQUFPLEVBQUVIO01BQ1gsQ0FBQyxDQUFDLENBQUNuQixRQUFRLENBQUMyQixZQUFZLENBQUNLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDMUQsUUFBUSxDQUFDeUQsS0FBSyxDQUFDO01BQ25ELElBQUlHLE1BQU0sR0FBR3BGLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQ21ELElBQUksQ0FBQztRQUM5QixNQUFNLEVBQUUsY0FBYyxHQUFHb0IsRUFBRTtRQUMzQixNQUFNLEVBQUUvQixDQUFDLENBQUNsQixRQUFRLEdBQUcsVUFBVSxHQUFHLE9BQU87UUFDekMsT0FBTyxFQUFFZ0QsS0FBSztRQUNkLE9BQU8sRUFBRUQsS0FBSztRQUNkLElBQUksRUFBRUcsT0FBTztRQUNiLFNBQVMsRUFBRUcsVUFBVSxHQUFHLFNBQVMsR0FBRyxJQUFJO1FBQ3hDLGVBQWUsRUFBRUEsVUFBVSxHQUFHLE1BQU0sR0FBRyxJQUFJO1FBQzNDLFVBQVUsRUFBRUYsVUFBVSxHQUFHLFVBQVUsR0FBRyxJQUFJO1FBQzFDLGVBQWUsRUFBRUEsVUFBVSxHQUFHLE1BQU0sR0FBRztNQUN6QyxDQUFDLENBQUMsQ0FBQ1ksSUFBSSxDQUFDckYsQ0FBQyxDQUFDb0UsTUFBTSxDQUFDLENBQUNpQixJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM3RCxRQUFRLENBQUMyRCxNQUFNLENBQUM7TUFFMUNuRixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUNzRixJQUFJLENBQUN0RixDQUFDLENBQUNvRSxNQUFNLENBQUMsQ0FBQ2tCLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzlELFFBQVEsQ0FBQzJELE1BQU0sQ0FBQztNQUVwRCxPQUFPRixLQUFLO0lBQ2QsQ0FBQztJQUVETSxnQkFBZ0IsRUFBRSxTQUFBQSxpQkFBU3pELE9BQU8sRUFBRTBELFNBQVMsRUFBRTtNQUM3QyxJQUFJQyxJQUFJLEdBQUcsSUFBSTtNQUNmM0QsT0FBTyxDQUFDNEQsUUFBUSxDQUFDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDLFlBQVc7UUFDakMsSUFBSUMsS0FBSyxHQUFHNUYsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNuQixJQUFHLElBQUksQ0FBQzZGLE9BQU8sS0FBSyxVQUFVLEVBQUU7VUFDOUIsSUFBSUMsWUFBWSxHQUFHOUYsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDa0QsUUFBUSxDQUFDLDBCQUEwQixHQUFHLElBQUksQ0FBQzhCLFNBQVMsQ0FBQyxDQUFDeEQsUUFBUSxDQUFDZ0UsU0FBUyxDQUFDO1VBQ3ZHLElBQUdDLElBQUksQ0FBQ25GLE9BQU8sQ0FBQ3NCLFlBQVksRUFBRTtZQUM1QmtFLFlBQVksQ0FBQzVDLFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQztVQUNqRDtVQUNBbEQsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDc0YsSUFBSSxDQUFDLElBQUksQ0FBQ1MsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUN2RSxRQUFRLENBQUNzRSxZQUFZLENBQUM7VUFDakVMLElBQUksQ0FBQ0YsZ0JBQWdCLENBQUNLLEtBQUssRUFBRUUsWUFBWSxDQUFDO1FBQzVDLENBQUMsTUFBTTtVQUNMLElBQUlFLFNBQVMsR0FBR1AsSUFBSSxDQUFDdEIsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDM0MsUUFBUSxDQUFDZ0UsU0FBUyxDQUFDO1FBQzVEO01BQ0YsQ0FBQyxDQUFDO0lBRUosQ0FBQztJQUVEMUIsT0FBTyxFQUFFLFNBQUFBLFFBQVNtQyxJQUFJLEVBQUU7TUFDdEIsSUFBSVIsSUFBSSxHQUFHLElBQUk7TUFDZixJQUFJbEQsRUFBRSxHQUFHLElBQUksQ0FBQ1QsT0FBTztNQUNyQixJQUFJVSxDQUFDLEdBQUcsSUFBSSxDQUFDbEMsT0FBTztNQUNwQixJQUFJa0QsSUFBSSxHQUFHLElBQUksQ0FBQ0EsSUFBSTtNQUNwQixJQUFJSSxpQkFBaUIsR0FBRyxJQUFJLENBQUNBLGlCQUFpQjtNQUM5QyxJQUFJTCxJQUFJLEdBQUcsRUFBRTtNQUNiLElBQUkyQyxTQUFTLEdBQUdsRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUNrRCxRQUFRLENBQUMsMkNBQTJDLENBQUM7TUFDaEYsSUFBSSxDQUFDSixjQUFjLEdBQUcsQ0FBQzs7TUFHdkI7TUFDQSxJQUFJLElBQUksQ0FBQ3hDLE9BQU8sQ0FBQ0MsTUFBTSxFQUFFO1FBQ3ZCLElBQUcsQ0FBQyxJQUFJLENBQUNELE9BQU8sQ0FBQ2dCLFFBQVEsRUFBRTtVQUN6QixJQUFJLENBQUNtQyxtQkFBbUIsQ0FBQ3hCLElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDYixJQUFJLENBQUMsQ0FBQztRQUNuRixDQUFDLE1BQU07VUFDTCxJQUFJLENBQUNxQyxtQkFBbUIsQ0FBQ3hCLElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDZCxJQUFJLENBQUMsQ0FBQztRQUNuRjtNQUNGO01BRUEsSUFBSSxDQUFDb0UsZ0JBQWdCLENBQUNoRCxFQUFFLEVBQUUyRCxTQUFTLENBQUM7TUFFcEMsSUFBSSxDQUFDMUMsSUFBSSxDQUFDdkIsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUNrRSxNQUFNLENBQUMsQ0FBQztNQUNyRCxJQUFJLENBQUMzQyxJQUFJLENBQUNHLE1BQU0sQ0FBQ3VDLFNBQVMsQ0FBQzs7TUFFM0I7TUFDQSxJQUFJLENBQUNFLE1BQU0sR0FBRzVDLElBQUksQ0FBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUM7TUFDaEMsSUFBSSxDQUFDb0UsTUFBTSxHQUFHLElBQUksQ0FBQ0QsTUFBTSxDQUFDVixRQUFRLENBQUMsT0FBTyxDQUFDO01BRTNDLElBQUksQ0FBQ1ksZUFBZSxDQUFDLENBQUM7TUFFdEIsSUFBSSxDQUFDQyxNQUFNLENBQUMsSUFBSSxDQUFDOztNQUVqQjtNQUNBLElBQUcsQ0FBQ04sSUFBSSxFQUFFO1FBQ1IsSUFBSSxDQUFDTyxRQUFRLENBQUMsU0FBUyxDQUFDO01BQzFCO0lBQ0YsQ0FBQztJQUVEO0lBQ0FELE1BQU0sRUFBRSxTQUFBQSxPQUFTRSxTQUFTLEVBQUU7TUFDMUIsSUFBSWpFLENBQUMsR0FBRyxJQUFJLENBQUNsQyxPQUFPO01BQ3BCLElBQUlvRyxPQUFPLEdBQUcsSUFBSSxDQUFDTCxNQUFNO01BQ3pCLElBQUlNLFFBQVEsR0FBR0QsT0FBTyxDQUFDRSxNQUFNLENBQUMsVUFBVSxDQUFDO01BQ3pDLElBQUlDLFVBQVUsR0FBR0YsUUFBUSxDQUFDdkUsTUFBTTtNQUNoQyxJQUFJa0MsS0FBSztNQUVULElBQUd1QyxVQUFVLEtBQUssQ0FBQyxFQUFFO1FBQ25CdkMsS0FBSyxHQUFHOUIsQ0FBQyxDQUFDM0IsZ0JBQWdCO01BQzVCLENBQUMsTUFBTTtRQUNMLElBQUdiLENBQUMsQ0FBQzhHLFVBQVUsQ0FBQ3RFLENBQUMsQ0FBQ3hCLFlBQVksQ0FBQyxFQUFFO1VBQy9Cc0QsS0FBSyxHQUFHOUIsQ0FBQyxDQUFDeEIsWUFBWSxDQUFDK0YsSUFBSSxDQUFDLElBQUksRUFBRUYsVUFBVSxFQUFFSCxPQUFPLENBQUN0RSxNQUFNLEVBQUV1RSxRQUFRLENBQUNLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDL0UsQ0FBQyxNQUFNLElBQUcsSUFBSSxDQUFDQyxJQUFJLENBQUN6RSxDQUFDLENBQUN2QixZQUFZLENBQUMsSUFBSXVCLENBQUMsQ0FBQ3ZCLFlBQVksR0FBRyxDQUFDLElBQUk0RixVQUFVLElBQUlyRSxDQUFDLENBQUN2QixZQUFZLEVBQUU7VUFDekZxRCxLQUFLLEdBQUdxQyxRQUFRLENBQUNPLEdBQUcsQ0FBQyxZQUFXO1lBQUUsT0FBT2xILENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQ21ILElBQUksQ0FBQyxDQUFDLENBQUM3QixJQUFJLENBQUMsQ0FBQztVQUFFLENBQUMsQ0FBQyxDQUFDMEIsR0FBRyxDQUFDLENBQUMsQ0FBQzlCLElBQUksQ0FBQzFDLENBQUMsQ0FBQ2QscUJBQXFCLENBQUM7UUFDeEcsQ0FBQyxNQUFNO1VBQ0w0QyxLQUFLLEdBQUc5QixDQUFDLENBQUN4QixZQUFZLENBQUNvRyxPQUFPLENBQUMsR0FBRyxFQUFFUCxVQUFVLENBQUMsQ0FBQ08sT0FBTyxDQUFDLEdBQUcsRUFBRVYsT0FBTyxDQUFDdEUsTUFBTSxDQUFDO1FBQzlFO01BQ0Y7TUFFQSxJQUFJLENBQUNpRixlQUFlLENBQUMvQyxLQUFLLENBQUM7TUFDM0IsSUFBR21DLFNBQVMsRUFBRTtRQUNaLElBQUksQ0FBQ3hELE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQ3FFLFlBQVksR0FBR2hELEtBQUs7TUFDckM7SUFFRixDQUFDO0lBRUQ7SUFDQTtJQUNBK0MsZUFBZSxFQUFFLFNBQUFBLGdCQUFTL0MsS0FBSyxFQUFFO01BQy9CLElBQUksQ0FBQ2hCLFdBQVcsQ0FBQ2dDLElBQUksQ0FBQ2hCLEtBQUssQ0FBQztJQUM5QixDQUFDO0lBRURpRCxpQkFBaUIsRUFBRSxTQUFBQSxrQkFBQSxFQUFXO01BQzVCLElBQUk5QixJQUFJLEdBQUcsSUFBSTtNQUNmLElBQUl4QyxNQUFNLEdBQUcsSUFBSSxDQUFDQSxNQUFNO01BQ3hCLFNBQVN1RSxZQUFZQSxDQUFBLEVBQUc7UUFDdEIvQixJQUFJLENBQUVBLElBQUksQ0FBQzVDLE9BQU8sR0FBRyxPQUFPLEdBQUcsTUFBTSxDQUFFLENBQUMsQ0FBQztRQUN6QyxPQUFPLEtBQUs7TUFDZDs7TUFFQTtNQUNBSSxNQUFNLENBQ0hoQixJQUFJLENBQUMsTUFBTSxDQUFDLENBQ1p3RixJQUFJLENBQUMsbUJBQW1CLEVBQUVELFlBQVksQ0FBQzs7TUFFMUM7TUFDQXZFLE1BQU0sQ0FBQ3dFLElBQUksQ0FBQztRQUNWQyxLQUFLLEVBQUVGLFlBQVk7UUFDbkJHLFFBQVEsRUFBRSxTQUFBQSxTQUFTQyxDQUFDLEVBQUU7VUFDcEIsUUFBT0EsQ0FBQyxDQUFDQyxLQUFLO1lBQ1osS0FBSyxFQUFFLENBQUMsQ0FBQztZQUNULEtBQUssRUFBRSxDQUFDLENBQUM7WUFDVCxLQUFLLEVBQUU7Y0FBRTtjQUNQcEMsSUFBSSxDQUFDcUMsS0FBSyxDQUFDLENBQUM7Y0FDWjtZQUNGLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDVCxLQUFLLEVBQUU7Y0FBRTtjQUNQckMsSUFBSSxDQUFDekIsSUFBSSxDQUFDLENBQUM7Y0FDWDtVQUNKO1FBQ0YsQ0FBQztRQUNEK0QsVUFBVSxFQUFFLFNBQUFBLFdBQUEsRUFBVztVQUNyQixJQUFHLENBQUM5RSxNQUFNLENBQUMrRSxRQUFRLENBQUMsbUJBQW1CLENBQUMsRUFBRTtZQUN4Q2hJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQ2tELFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQztVQUNwQztRQUNGLENBQUM7UUFDRCtFLFVBQVUsRUFBRSxTQUFBQSxXQUFBLEVBQVc7VUFDckJqSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUNrSSxXQUFXLENBQUMsZ0JBQWdCLENBQUM7UUFDdkMsQ0FBQztRQUNEQyxLQUFLLEVBQUUsU0FBQUEsTUFBQSxFQUFXO1VBQ2hCLElBQUcsQ0FBQ2xGLE1BQU0sQ0FBQytFLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1lBQ3hDaEksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDa0QsUUFBUSxDQUFDLGdCQUFnQixDQUFDO1VBQ3BDO1FBQ0YsQ0FBQztRQUNEa0YsSUFBSSxFQUFFLFNBQUFBLEtBQUEsRUFBVztVQUNmcEksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDa0ksV0FBVyxDQUFDLGdCQUFnQixDQUFDO1FBQ3ZDO01BQ0YsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVERyxlQUFlLEVBQUUsU0FBQUEsZ0JBQUEsRUFBVztNQUMxQixJQUFJNUMsSUFBSSxHQUFHLElBQUk7TUFDZjtNQUNBLElBQUksQ0FBQ2pDLElBQUksQ0FBQzhFLFFBQVEsQ0FBQyw0QkFBNEIsRUFBRSxtQkFBbUIsRUFBRSxVQUFTVixDQUFDLEVBQUU7UUFDaEZBLENBQUMsQ0FBQ1csY0FBYyxDQUFDLENBQUM7UUFFbEIsSUFBSTNDLEtBQUssR0FBRzVGLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbkIsSUFBSTBHLE9BQU8sR0FBR2QsS0FBSyxDQUFDNEMsTUFBTSxDQUFDLENBQUMsQ0FBQ3ZHLElBQUksQ0FBQyw4QkFBOEIsQ0FBQztRQUNqRSxJQUFJd0csS0FBSyxHQUFHL0IsT0FBTyxDQUFDTSxHQUFHLENBQUMsQ0FBQztRQUN6QixJQUFJMEIsS0FBSyxHQUFHOUMsS0FBSyxDQUFDTixJQUFJLENBQUMsQ0FBQzs7UUFFeEI7UUFDQSxJQUFHRyxJQUFJLENBQUNlLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRW9CLENBQUMsRUFBRTtVQUFFdkIsTUFBTSxFQUFDb0MsS0FBSztVQUFFQyxLQUFLLEVBQUNBO1FBQU0sQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFO1VBQ3BGO1FBQ0Y7O1FBRUE7UUFDQWpELElBQUksQ0FBQ2tELGNBQWMsQ0FDakJqQyxPQUFPLENBQUNFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQ3hFLE1BQU0sS0FBS3NFLE9BQU8sQ0FBQ3RFLE1BQU0sRUFDcERzRSxPQUNGLENBQUM7UUFFRGpCLElBQUksQ0FBQ2UsUUFBUSxDQUFDLGdCQUFnQixFQUFFb0IsQ0FBQyxFQUFFO1VBQ2pDdkIsTUFBTSxFQUFFb0MsS0FBSztVQUNiQyxLQUFLLEVBQUVBLEtBQUs7VUFDWkUsT0FBTyxFQUFFSCxLQUFLLENBQUNyRyxNQUFNLEdBQUdxRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUNHLE9BQU8sR0FBRztRQUM3QyxDQUFDLENBQUM7TUFDSixDQUFDLENBQUMsQ0FDRE4sUUFBUSxDQUFDLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxZQUFXO1FBQ3RELElBQUcsQ0FBQ3RJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQ2dJLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFO1VBQ3pDdkMsSUFBSSxDQUFDVyxNQUFNLENBQUM4QixXQUFXLENBQUMsZ0JBQWdCLENBQUM7VUFDekNsSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUNrRCxRQUFRLENBQUMsZ0JBQWdCLENBQUMsQ0FBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQ2tHLEtBQUssQ0FBQyxDQUFDO1FBQzFEO01BQ0YsQ0FBQyxDQUFDLENBQ0RHLFFBQVEsQ0FBQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsVUFBU1YsQ0FBQyxFQUFFO1FBQ3BELElBQUdBLENBQUMsQ0FBQ0MsS0FBSyxLQUFLLEVBQUUsRUFBRTtVQUNqQixPQUFPLENBQUM7UUFDVjtRQUNBLElBQUdELENBQUMsQ0FBQ0MsS0FBSyxHQUFHLEdBQUcsSUFBSUQsQ0FBQyxDQUFDQyxLQUFLLEdBQUcsR0FBRyxFQUFFO1VBQ2pDLE9BQU8sQ0FBQztRQUNWO1FBQ0FELENBQUMsQ0FBQ1csY0FBYyxDQUFDLENBQUM7UUFDbEIsUUFBT1gsQ0FBQyxDQUFDQyxLQUFLO1VBQ1osS0FBSyxDQUFDO1lBQUU7WUFDTixJQUFHRCxDQUFDLENBQUNpQixRQUFRLEVBQUU7Y0FDYnBELElBQUksQ0FBQ2pDLElBQUksQ0FBQ3ZCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDaUcsV0FBVyxDQUFDLGdCQUFnQixDQUFDO2NBQy9EekMsSUFBSSxDQUFDbEYsTUFBTSxDQUFDMEIsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDNkcsSUFBSSxDQUFDLENBQUMsQ0FBQzdHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQ2tHLEtBQUssQ0FBQyxDQUFDO1lBQ2pELENBQUMsTUFBTTtjQUNMMUMsSUFBSSxDQUFDcUMsS0FBSyxDQUFDLENBQUM7WUFDZDtZQUNBO1VBQ0YsS0FBSyxFQUFFO1lBQUU7WUFDUHJDLElBQUksQ0FBQ3FDLEtBQUssQ0FBQyxDQUFDO1lBQ1o7VUFDRixLQUFLLEVBQUUsQ0FBQyxDQUFDO1VBQ1QsS0FBSyxFQUFFLENBQUMsQ0FBQztVQUNULEtBQUssRUFBRSxDQUFDLENBQUM7VUFDVCxLQUFLLEVBQUU7WUFBRTtZQUNQckMsSUFBSSxDQUFDc0QsU0FBUyxDQUFDbkIsQ0FBQyxDQUFDQyxLQUFLLEVBQUUsSUFBSSxDQUFDO1lBQzdCO1VBQ0YsS0FBSyxFQUFFLENBQUMsQ0FBQztVQUNULEtBQUssRUFBRTtZQUNMN0gsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDaUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDeUYsS0FBSyxDQUFDLENBQUM7WUFDaEM7VUFDRixLQUFLLEVBQUU7WUFDTCxJQUFHRSxDQUFDLENBQUNvQixNQUFNLEVBQUU7Y0FDWHZELElBQUksQ0FBQ3dELFFBQVEsQ0FBQyxDQUFDO1lBQ2pCO1lBQ0E7VUFDRixLQUFLLEVBQUU7WUFDTCxJQUFHckIsQ0FBQyxDQUFDb0IsTUFBTSxFQUFFO2NBQ1h2RCxJQUFJLENBQUN5RCxVQUFVLENBQUMsQ0FBQztZQUNuQjtZQUNBO1FBQ0o7TUFDRixDQUFDLENBQUMsQ0FDRFosUUFBUSxDQUFDLDZDQUE2QyxFQUFFLG1CQUFtQixFQUFFLFVBQVNWLENBQUMsRUFBRTtRQUN4RixJQUFJaEMsS0FBSyxHQUFHNUYsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNuQixJQUFJbUosR0FBRyxHQUFHLElBQUksQ0FBQzdFLEtBQUs7UUFDcEIsSUFBSThFLFVBQVUsR0FBR3hELEtBQUssQ0FBQzRDLE1BQU0sQ0FBQyxDQUFDLENBQUN2RyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUNxRCxJQUFJLENBQUMsQ0FBQztRQUNuRCxJQUFJc0QsT0FBTyxHQUFHLElBQUksQ0FBQ0EsT0FBTztRQUMxQixJQUFJUyxJQUFJLEdBQUc1RCxJQUFJLENBQUMzRCxPQUFPLENBQUNHLElBQUksQ0FBQyxRQUFRLENBQUM7O1FBRXRDO1FBQ0EsSUFBRyxJQUFJLENBQUN5QyxRQUFRLElBQUllLElBQUksQ0FBQ2UsUUFBUSxDQUFDLE9BQU8sRUFBRW9CLENBQUMsRUFBRTtVQUFFdEQsS0FBSyxFQUFFNkUsR0FBRztVQUFFN0QsSUFBSSxFQUFFOEQsVUFBVTtVQUFFUixPQUFPLEVBQUVBO1FBQVEsQ0FBQyxDQUFDLEtBQUssS0FBSyxFQUFFO1VBQzNHaEIsQ0FBQyxDQUFDVyxjQUFjLENBQUMsQ0FBQztVQUNsQjtRQUNGOztRQUVBO1FBQ0E7UUFDQTNDLEtBQUssQ0FBQ3VDLEtBQUssQ0FBQyxDQUFDOztRQUViO1FBQ0F2QyxLQUFLLENBQUN4QyxJQUFJLENBQUMsZUFBZSxFQUFFd0YsT0FBTyxDQUFDOztRQUVwQztRQUNBUyxJQUFJLENBQUMxRCxJQUFJLENBQUMsWUFBVztVQUNuQixJQUFHLElBQUksQ0FBQ3JCLEtBQUssS0FBSzZFLEdBQUcsRUFBRTtZQUNyQixJQUFJLENBQUN2RSxRQUFRLEdBQUdnRSxPQUFPO1VBQ3pCLENBQUMsTUFBTSxJQUFHLENBQUNuRCxJQUFJLENBQUNuRixPQUFPLENBQUNnQixRQUFRLEVBQUU7WUFDaEMsSUFBSSxDQUFDc0QsUUFBUSxHQUFHLEtBQUs7VUFDdkI7UUFDRixDQUFDLENBQUM7O1FBRUY7UUFDQSxJQUFHLENBQUNhLElBQUksQ0FBQ25GLE9BQU8sQ0FBQ2dCLFFBQVEsRUFBRTtVQUN6Qm1FLElBQUksQ0FBQ1csTUFBTSxDQUFDOEIsV0FBVyxDQUFDLGlCQUFpQixDQUFDO1VBQzFDdEMsS0FBSyxDQUFDekQsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDbUgsV0FBVyxDQUFDLGlCQUFpQixFQUFFVixPQUFPLENBQUM7O1VBRTlEO1VBQ0FuRCxJQUFJLENBQUNxQyxLQUFLLENBQUMsQ0FBQztRQUNkOztRQUVBO1FBQ0FyQyxJQUFJLENBQUMzRCxPQUFPLENBQUN5SCxPQUFPLENBQUMsUUFBUSxDQUFDOztRQUU5QjtRQUNBO1FBQ0FDLFVBQVUsQ0FBQ3hKLENBQUMsQ0FBQ3lKLEtBQUssQ0FBQ2hFLElBQUksQ0FBQ2MsTUFBTSxFQUFFZCxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7TUFDNUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVEaUUsaUJBQWlCLEVBQUUsU0FBQUEsa0JBQUEsRUFBVztNQUM1QixJQUFJakUsSUFBSSxHQUFHLElBQUk7TUFDZjtNQUNBLElBQUksQ0FBQ2xGLE1BQU0sQ0FBQytILFFBQVEsQ0FBQyxHQUFHLEVBQUUsbUJBQW1CLEVBQUUsVUFBU1YsQ0FBQyxFQUFFO1FBQ3pELElBQUloQyxLQUFLLEdBQUc1RixDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ25CLElBQUc0RixLQUFLLENBQUNvQyxRQUFRLENBQUMsc0JBQXNCLENBQUMsRUFBRTtVQUN6Q3ZDLElBQUksQ0FBQ3FDLEtBQUssQ0FBQyxDQUFDO1FBQ2QsQ0FBQyxNQUFNLElBQUdsQyxLQUFLLENBQUNvQyxRQUFRLENBQUMsb0JBQW9CLENBQUMsRUFBRTtVQUM5Q3ZDLElBQUksQ0FBQ3dELFFBQVEsQ0FBQyxDQUFDO1FBQ2pCLENBQUMsTUFBTSxJQUFHckQsS0FBSyxDQUFDb0MsUUFBUSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7VUFDL0N2QyxJQUFJLENBQUN5RCxVQUFVLENBQUMsQ0FBQztRQUNuQjtRQUNBdEIsQ0FBQyxDQUFDVyxjQUFjLENBQUMsQ0FBQztNQUNwQixDQUFDLENBQUMsQ0FBQ0QsUUFBUSxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsRUFBRSxVQUFTVixDQUFDLEVBQUU7UUFDbEQsUUFBT0EsQ0FBQyxDQUFDQyxLQUFLO1VBQ1osS0FBSyxFQUFFO1lBQ0xwQyxJQUFJLENBQUNxQyxLQUFLLENBQUMsQ0FBQztZQUNaO1VBQ0YsS0FBSyxDQUFDO1lBQ0osSUFBSTZCLE9BQU8sR0FBRzNKLENBQUMsQ0FBQzRILENBQUMsQ0FBQ2dDLE1BQU0sQ0FBQztZQUN6QixJQUFJaEMsQ0FBQyxDQUFDaUIsUUFBUSxJQUFJLENBQUNjLE9BQU8sQ0FBQ25CLE1BQU0sQ0FBQyxDQUFDLENBQUNxQixJQUFJLENBQUMsQ0FBQyxDQUFDekgsTUFBTSxJQUFJLENBQUNxRCxJQUFJLENBQUNsRixNQUFNLENBQUMwQixJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQ0csTUFBTSxJQUFNLENBQUN1SCxPQUFPLENBQUNuQixNQUFNLENBQUMsQ0FBQyxDQUFDckIsSUFBSSxDQUFDLENBQUMsQ0FBQy9FLE1BQU0sSUFBSSxDQUFDcUQsSUFBSSxDQUFDVyxNQUFNLENBQUNoRSxNQUFNLElBQUksQ0FBQ3dGLENBQUMsQ0FBQ2lCLFFBQVMsRUFBRTtjQUNuTHBELElBQUksQ0FBQ3FDLEtBQUssQ0FBQyxDQUFDO2NBQ1pGLENBQUMsQ0FBQ1csY0FBYyxDQUFDLENBQUM7WUFDcEI7WUFDQTtRQUNKO01BQ0YsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVEO0lBQ0ExRSxXQUFXLEVBQUUsU0FBQUEsWUFBQSxFQUFXO01BQ3RCLElBQUk0QixJQUFJLEdBQUcsSUFBSTtNQUVmLElBQUksQ0FBQzhCLGlCQUFpQixDQUFDLENBQUM7TUFDeEIsSUFBSSxDQUFDYyxlQUFlLENBQUMsQ0FBQztNQUN0QixJQUFJLENBQUNxQixpQkFBaUIsQ0FBQyxDQUFDOztNQUV4QjtNQUNBdkosSUFBSSxDQUFDc0gsSUFBSSxDQUFDLFlBQVksR0FBR2hDLElBQUksQ0FBQzFDLFlBQVksRUFBRSxVQUFTK0csS0FBSyxFQUFFO1FBQzFELElBQUlGLE1BQU0sR0FBR0UsS0FBSyxDQUFDRixNQUFNO1FBRXpCLElBQUduRSxJQUFJLENBQUM1QyxPQUFPLElBQ1grRyxNQUFNLEtBQUtuRSxJQUFJLENBQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQ3pCMkcsTUFBTSxLQUFLbkUsSUFBSSxDQUFDakMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUN2QixDQUFDeEQsQ0FBQyxDQUFDK0osUUFBUSxDQUFDdEUsSUFBSSxDQUFDakMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFb0csTUFBTSxDQUFDLElBQ2pDLENBQUM1SixDQUFDLENBQUMrSixRQUFRLENBQUN0RSxJQUFJLENBQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUyRyxNQUFNLENBQUMsRUFDbkM7VUFDRm5FLElBQUksQ0FBQ3FDLEtBQUssQ0FBQyxDQUFDO1FBQ2Q7TUFDRixDQUFDLENBQUM7O01BRUY7TUFDQTtNQUNBO01BQ0E7TUFDQTlILENBQUMsQ0FBQyxJQUFJLENBQUM4QixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUNrSSxJQUFJLENBQUMsQ0FBQ3ZDLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDMUUsWUFBWSxFQUFFLFlBQVc7UUFDcEV5RyxVQUFVLENBQUN4SixDQUFDLENBQUN5SixLQUFLLENBQUNoRSxJQUFJLENBQUMzQixPQUFPLEVBQUUyQixJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7TUFDN0MsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUNEd0UsWUFBWSxFQUFFLFNBQUFBLGFBQUEsRUFBVztNQUN2QixJQUFJQyxNQUFNLEdBQUcsSUFBSSxDQUFDNUosT0FBTyxDQUFDRyxRQUFRO01BQ2xDLElBQUkwSixLQUFLLEdBQUcsQ0FBQztNQUNiLFFBQUFDLE9BQUEsQ0FBZUYsTUFBTTtRQUNuQixLQUFLLFFBQVE7VUFDWEMsS0FBSyxHQUFHRCxNQUFNO1VBQ2Q7UUFDRixLQUFLLFFBQVE7VUFDWCxJQUFJRyxRQUFRLEdBQUdILE1BQU0sQ0FBRUEsTUFBTSxDQUFDOUgsTUFBTSxHQUFFLENBQUMsQ0FBRTtVQUN6QytILEtBQUssR0FBR0QsTUFBTSxDQUFDSSxLQUFLLENBQUMsS0FBSyxDQUFDO1VBQzNCLElBQUdELFFBQVEsS0FBSyxHQUFHLEVBQUU7WUFDbkJGLEtBQUssR0FBR0QsTUFBTTtVQUNoQixDQUFDLE1BQU07WUFDTEMsS0FBSyxHQUFHSSxRQUFRLENBQUNMLE1BQU0sRUFBRSxFQUFFLENBQUM7VUFDOUI7VUFDQTtNQUNKO01BQ0EsT0FBT0MsS0FBSztJQUNkLENBQUM7SUFDRDtJQUNBN0QsZUFBZSxFQUFFLFNBQUFBLGdCQUFBLEVBQVc7TUFDMUIsSUFBSTZELEtBQUssR0FBRyxJQUFJLENBQUNGLFlBQVksQ0FBQyxDQUFDOztNQUUvQjtNQUNBLElBQUksQ0FBQ2hILE1BQU0sQ0FBQ3VILFVBQVUsQ0FBQ0wsS0FBSyxDQUFDO0lBQy9CLENBQUM7SUFFRDtJQUNBTSxhQUFhLEVBQUUsU0FBQUEsY0FBQSxFQUFXO01BQ3hCLElBQUlDLENBQUMsR0FBRyxJQUFJLENBQUNsSCxJQUFJO01BQ2pCLElBQUkyRyxLQUFLLEdBQUksSUFBSSxDQUFDbEgsTUFBTSxDQUFDdUgsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUksSUFBSSxDQUFDUCxZQUFZLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQ2hILE1BQU0sQ0FBQ3VILFVBQVUsQ0FBQyxDQUFDO01BQzVGRSxDQUFDLENBQUNGLFVBQVUsQ0FBQyxJQUFJLENBQUNsSyxPQUFPLENBQUNtQixTQUFTLElBQUkwSSxLQUFLLENBQUM7SUFDL0MsQ0FBQztJQUVEUSxjQUFjLEVBQUUsU0FBQUEsZUFBQSxFQUFXO01BQ3pCLElBQUlDLFlBQVksR0FBRyxJQUFJLENBQUNwSCxJQUFJLENBQUNrQyxRQUFRLENBQUMsZ0NBQWdDLENBQUMsQ0FBQ21GLFdBQVcsQ0FBQyxJQUFJLENBQUM7TUFDekYsSUFBSUMsUUFBUSxHQUFHLENBQUM7TUFDaEIsSUFBSSxDQUFDdEgsSUFBSSxDQUFDdkIsSUFBSSxDQUFDLDZEQUE2RCxDQUFDLENBQUMwRCxJQUFJLENBQUMsVUFBU29GLEdBQUcsRUFBRUMsRUFBRSxFQUFFO1FBQ25HRixRQUFRLElBQUk5SyxDQUFDLENBQUNnTCxFQUFFLENBQUMsQ0FBQ0gsV0FBVyxDQUFDLElBQUksQ0FBQztNQUNyQyxDQUFDLENBQUM7TUFDRixJQUFHQyxRQUFRLEdBQUcsSUFBSSxDQUFDeEssT0FBTyxDQUFDRSxNQUFNLEVBQUU7UUFDakMsSUFBSSxDQUFDZ0QsSUFBSSxDQUFDa0MsUUFBUSxDQUFDLDRCQUE0QixDQUFDLENBQUN1RixHQUFHLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQztRQUN4RUgsUUFBUSxHQUFHLElBQUksQ0FBQ3hLLE9BQU8sQ0FBQ0UsTUFBTTtNQUNoQyxDQUFDLE1BQU07UUFDTCxJQUFJLENBQUNnRCxJQUFJLENBQUNrQyxRQUFRLENBQUMsNEJBQTRCLENBQUMsQ0FBQ3VGLEdBQUcsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDO01BQzVFO01BRUEsSUFBSSxDQUFDekgsSUFBSSxDQUFDa0MsUUFBUSxDQUFDLDRCQUE0QixDQUFDLENBQUNsRixNQUFNLENBQUNzSyxRQUFRLENBQUM7TUFDakUsSUFBSSxDQUFDdEgsSUFBSSxDQUFDaEQsTUFBTSxDQUFDc0ssUUFBUSxHQUFHRixZQUFZLENBQUM7SUFDM0MsQ0FBQztJQUVETSxXQUFXLEVBQUUsU0FBQUEsWUFBQSxFQUFXO01BQ3RCLElBQUksQ0FBQ1QsYUFBYSxDQUFDLENBQUM7TUFDcEIsSUFBSSxDQUFDRSxjQUFjLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRUQ7SUFDQTVCLFNBQVMsRUFBRSxTQUFBQSxVQUFTbEIsS0FBSyxFQUFFc0QsS0FBSyxFQUFFO01BQ2hDLElBQUlDLE1BQU0sR0FBR3BMLENBQUMsQ0FBQ21MLEtBQUssQ0FBQztNQUNyQixJQUFJRSxVQUFVLEdBQUd4RCxLQUFLLEtBQUssRUFBRSxJQUFJQSxLQUFLLEtBQUssRUFBRTs7TUFFN0M7TUFDQSxJQUFJeUQsS0FBSyxHQUFHRixNQUFNLENBQUM1QyxNQUFNLENBQUMsQ0FBQyxDQUFDNkMsVUFBVSxHQUFHLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQyxvRUFBb0UsQ0FBQyxDQUFDRSxLQUFLLENBQUMsQ0FBQztNQUM3STtNQUNBLElBQUcsQ0FBQ0QsS0FBSyxDQUFDbEosTUFBTSxFQUFFO1FBQ2hCa0osS0FBSyxHQUFHRixNQUFNLENBQUNJLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQyxDQUFDSCxVQUFVLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBRSxDQUFDLENBQUM7TUFDckY7O01BRUE7TUFDQSxJQUFHLENBQUNDLEtBQUssQ0FBQ2xKLE1BQU0sRUFBRTtRQUNoQixJQUFJcUosVUFBVSxHQUFHLElBQUksQ0FBQ2pJLElBQUksQ0FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzZHLElBQUksQ0FBQyxDQUFDOztRQUU1QztRQUNBLElBQUksQ0FBQ3RGLElBQUksQ0FBQ3ZCLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBRW9KLFVBQVUsR0FBRyxNQUFNLEdBQUcsT0FBTyxDQUFFLENBQUMsQ0FBQyxDQUFDOUIsT0FBTyxDQUFDLFdBQVcsQ0FBQzs7UUFFdkY7UUFDQWtDLFVBQVUsQ0FBQ0MsU0FBUyxDQUFDTCxVQUFVLEdBQUdJLFVBQVUsQ0FBQ2pMLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO01BRTVELENBQUMsTUFBTTtRQUNMOEssS0FBSyxDQUFDckosSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFFb0osVUFBVSxHQUFHLE1BQU0sR0FBRyxPQUFPLENBQUUsQ0FBQyxDQUFDLENBQUM5QixPQUFPLENBQUMsV0FBVyxDQUFDO01BQ3JGO0lBQ0YsQ0FBQztJQUVEO0lBQ0E7SUFDQTtJQUNBO0lBQ0FvQyxZQUFZLEVBQUUsU0FBQUEsYUFBU3ZJLElBQUksRUFBRXdJLElBQUksRUFBRTtNQUNqQyxPQUFPLFlBQVc7UUFDaEIsSUFBRyxDQUFDLElBQUksQ0FBQ2xILFFBQVEsRUFBRTtVQUNqQixJQUFJLENBQUV0QixJQUFJLENBQUUsR0FBR3dJLElBQUk7UUFDckI7UUFFQSxJQUFHQSxJQUFJLEVBQUU7VUFDUCxJQUFJLENBQUNDLFlBQVksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDO1FBQzFDLENBQUMsTUFBTTtVQUNMLElBQUksQ0FBQ0MsZUFBZSxDQUFDLGVBQWUsQ0FBQztRQUN2QztNQUNGLENBQUM7SUFDSCxDQUFDO0lBRURuRCxjQUFjLEVBQUUsU0FBQUEsZUFBU2lELElBQUksRUFBRUcsS0FBSyxFQUFFO01BQ3BDLElBQUlyRixPQUFPLEdBQUlxRixLQUFLLElBQUlBLEtBQUssQ0FBQzNKLE1BQU0sR0FBSzJKLEtBQUssR0FBRyxJQUFJLENBQUMxRixNQUFNO01BQzVELElBQUlaLElBQUksR0FBRyxJQUFJOztNQUVmO01BQ0FpQixPQUFPLENBQUNmLElBQUksQ0FBQyxJQUFJLENBQUNnRyxZQUFZLENBQUMsU0FBUyxFQUFFQyxJQUFJLENBQUMsQ0FBQzs7TUFFaEQ7TUFDQWxGLE9BQU8sQ0FBQ3hFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQ2lHLEtBQUssQ0FBQyxDQUFDOztNQUVyQjtNQUNBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQyxDQUFDOztNQUViO01BQ0EsSUFBSXlGLE1BQU0sR0FBRyxDQUFDLENBQUM7TUFDZnRGLE9BQU8sQ0FBQ2YsSUFBSSxDQUFDLFlBQVc7UUFDdEJxRyxNQUFNLENBQUMsSUFBSSxDQUFDMUgsS0FBSyxDQUFDLEdBQUcsSUFBSTtNQUMzQixDQUFDLENBQUM7O01BRUY7TUFDQSxJQUFJLENBQUN4QyxPQUFPLENBQ1RHLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FDZDBELElBQUksQ0FBQyxZQUFXO1FBQ2YsSUFBRyxDQUFDLElBQUksQ0FBQ2pCLFFBQVEsSUFBSXNILE1BQU0sQ0FBQyxJQUFJLENBQUMxSCxLQUFLLENBQUMsRUFBRTtVQUN2Q21CLElBQUksQ0FBQ2tHLFlBQVksQ0FBQyxVQUFVLEVBQUVDLElBQUksQ0FBQyxDQUFDN0UsSUFBSSxDQUFDLElBQUksQ0FBQztRQUNoRDtNQUNGLENBQUMsQ0FBQzs7TUFFSjtNQUNBLElBQUdMLE9BQU8sQ0FBQ3RFLE1BQU0sRUFBRTtRQUNqQixJQUFJLENBQUNOLE9BQU8sQ0FBQ3lILE9BQU8sQ0FBQyxRQUFRLENBQUM7TUFDaEM7SUFDRixDQUFDO0lBRUQwQyxlQUFlLEVBQUUsU0FBQUEsZ0JBQVNMLElBQUksRUFBRTtNQUM5QixJQUFJLENBQUMzSSxNQUFNLENBQUNHLElBQUksQ0FBQztRQUFFLFVBQVUsRUFBQ3dJLElBQUk7UUFBRSxlQUFlLEVBQUNBO01BQUssQ0FBQyxDQUFDLENBQUVBLElBQUksR0FBRyxVQUFVLEdBQUcsYUFBYSxDQUFFLENBQUMsbUJBQW1CLENBQUM7TUFFckgsSUFBRyxJQUFJLENBQUN0TCxPQUFPLENBQUNxQixxQkFBcUIsRUFBRTtRQUNyQyxJQUFJdUssVUFBVSxHQUFHLElBQUksQ0FBQzFJLElBQUksQ0FBQ3ZCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDK0UsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNwRSxJQUFJbUYsYUFBYSxHQUFHLEVBQUU7UUFDdEIsSUFBSUMsR0FBRyxHQUFHLDBCQUEwQjtRQUNwQyxJQUFJQyxDQUFDLEdBQUcsQ0FBQztRQUNULElBQUdULElBQUksRUFBRTtVQUNQO1VBQ0E7VUFDQU8sYUFBYSxHQUFHRCxVQUFVLENBQUNJLGdCQUFnQixDQUFDLGVBQWUsQ0FBQztVQUM1RCxLQUFJRCxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdGLGFBQWEsQ0FBQy9KLE1BQU0sRUFBRWlLLENBQUMsRUFBRSxFQUFFO1lBQ3hDRixhQUFhLENBQUNFLENBQUMsQ0FBQyxDQUFDUixZQUFZLENBQUNPLEdBQUcsRUFBRSxJQUFJLENBQUM7WUFDeENELGFBQWEsQ0FBQ0UsQ0FBQyxDQUFDLENBQUNSLFlBQVksQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDO1lBQ3JETSxhQUFhLENBQUNFLENBQUMsQ0FBQyxDQUFDUixZQUFZLENBQUMsZUFBZSxFQUFFLFVBQVUsQ0FBQztZQUMxRE0sYUFBYSxDQUFDRSxDQUFDLENBQUMsQ0FBQ0UsVUFBVSxDQUFDdkgsU0FBUyxHQUFHbUgsYUFBYSxDQUFDRSxDQUFDLENBQUMsQ0FBQ0UsVUFBVSxDQUFDdkgsU0FBUyxHQUFHLG9CQUFvQjtVQUN0RztRQUNGLENBQUMsTUFBTTtVQUNMbUgsYUFBYSxHQUFHRCxVQUFVLENBQUNJLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDO1VBQzdELEtBQUlELENBQUMsR0FBRyxDQUFDLEVBQUVBLENBQUMsR0FBR0YsYUFBYSxDQUFDL0osTUFBTSxFQUFFaUssQ0FBQyxFQUFFLEVBQUU7WUFDeEMsSUFBR0YsYUFBYSxDQUFDRSxDQUFDLENBQUMsQ0FBQ0csWUFBWSxDQUFDSixHQUFHLENBQUMsRUFBRTtjQUNyQ0QsYUFBYSxDQUFDRSxDQUFDLENBQUMsQ0FBQ1AsZUFBZSxDQUFDTSxHQUFHLENBQUM7Y0FDckNELGFBQWEsQ0FBQ0UsQ0FBQyxDQUFDLENBQUNQLGVBQWUsQ0FBQyxVQUFVLENBQUM7Y0FDNUNLLGFBQWEsQ0FBQ0UsQ0FBQyxDQUFDLENBQUNQLGVBQWUsQ0FBQyxlQUFlLENBQUM7Y0FDakRLLGFBQWEsQ0FBQ0UsQ0FBQyxDQUFDLENBQUNFLFVBQVUsQ0FBQ3ZILFNBQVMsR0FBR21ILGFBQWEsQ0FBQ0UsQ0FBQyxDQUFDLENBQUNFLFVBQVUsQ0FBQ3ZILFNBQVMsQ0FBQ29DLE9BQU8sQ0FBQyxvQkFBb0IsRUFBRSxFQUFFLENBQUM7WUFDakg7VUFDRjtRQUNGO01BQ0Y7TUFFQSxJQUFJLENBQUN0RixPQUFPLENBQUNzQixJQUFJLENBQUM7UUFDaEIsVUFBVSxFQUFDd0ksSUFBSTtRQUNmLGVBQWUsRUFBQ0E7TUFDbEIsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVEO0lBQ0E1SCxJQUFJLEVBQUUsU0FBQUEsS0FBUzRELENBQUMsRUFBRTtNQUNoQixJQUFJbkMsSUFBSSxHQUFHLElBQUk7TUFDZixJQUFJeEMsTUFBTSxHQUFHLElBQUksQ0FBQ0EsTUFBTTtNQUN4QixJQUFJTyxJQUFJLEdBQUcsSUFBSSxDQUFDQSxJQUFJO01BQ3BCLElBQUlmLEtBQUssR0FBRyxJQUFJLENBQUNBLEtBQUs7TUFDdEIsSUFBSUQsQ0FBQyxHQUFHLElBQUksQ0FBQ2xDLE9BQU87TUFDcEIsSUFBSW1NLElBQUksR0FBRyxFQUFFOztNQUViO01BQ0EsSUFBRyxJQUFJLENBQUNqRyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssS0FBSyxJQUFJdkQsTUFBTSxDQUFDK0UsUUFBUSxDQUFDLG1CQUFtQixDQUFDLElBQUksSUFBSSxDQUFDbkYsT0FBTyxFQUFFO1FBQ2hHO01BQ0Y7TUFFQSxJQUFJNEksVUFBVSxHQUFHakksSUFBSSxDQUFDdkIsSUFBSSxDQUFDLDRCQUE0QixDQUFDO01BQ3hELElBQUl5SyxNQUFNLEdBQUdsSyxDQUFDLENBQUNyQixJQUFJOztNQUVuQjtNQUNBLElBQUduQixDQUFDLENBQUMyTSxPQUFPLENBQUNuSyxDQUFDLENBQUNyQixJQUFJLENBQUMsRUFBRTtRQUNwQnVMLE1BQU0sR0FBR2xLLENBQUMsQ0FBQ3JCLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDbEJzQixLQUFLLEdBQUdELENBQUMsQ0FBQ3JCLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSXNFLElBQUksQ0FBQ2hELEtBQUs7TUFDakM7O01BRUE7TUFDQTtNQUNBLElBQUdpSyxNQUFNLEVBQUU7UUFDVEQsSUFBSSxHQUFHLENBQUVDLE1BQU0sRUFBRWpLLEtBQUssQ0FBRTtNQUMxQjs7TUFFQTtNQUNBZ0osVUFBVSxDQUFDQyxTQUFTLENBQUMsQ0FBQyxDQUFDOztNQUV2QjtNQUNBMUwsQ0FBQyxDQUFDNE0sRUFBRSxDQUFDekwsSUFBSSxDQUFDMEwsS0FBSyxDQUFDckosSUFBSSxFQUFFaUosSUFBSSxDQUFDO01BRTNCLElBQUksQ0FBQ3ZCLFdBQVcsQ0FBQyxDQUFDO01BQ2xCO01BQ0EsSUFBSSxDQUFDM0osUUFBUSxDQUFDLENBQUM7O01BR2Y7TUFDQSxJQUFJcUYsTUFBTSxHQUFHLElBQUksQ0FBQ3JHLE1BQU0sQ0FBQzBCLElBQUksQ0FBQyx3QkFBd0IsQ0FBQztNQUN2RCxJQUFHMkUsTUFBTSxDQUFDeEUsTUFBTSxFQUFFO1FBQ2hCd0UsTUFBTSxDQUFDMkUsS0FBSyxDQUFDLENBQUMsQ0FBQ3RKLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQ3NILE9BQU8sQ0FBQyxPQUFPLENBQUM7TUFDL0MsQ0FBQyxNQUFNLElBQUcsSUFBSSxDQUFDbkQsTUFBTSxDQUFDaEUsTUFBTSxFQUFDO1FBQzNCLElBQUksQ0FBQ2dFLE1BQU0sQ0FBQ1EsTUFBTSxDQUFDLDBCQUEwQixDQUFDLENBQUMxRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUNxSCxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUNBLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQ3RILElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQ3NILE9BQU8sQ0FBQyxPQUFPLENBQUM7TUFDaEksQ0FBQyxNQUFNO1FBQ0wsSUFBSSxDQUFDaEosTUFBTSxDQUFDMEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDc0osS0FBSyxDQUFDLENBQUMsQ0FBQ2hDLE9BQU8sQ0FBQyxPQUFPLENBQUM7TUFDaEQ7TUFHQXRHLE1BQU0sQ0FBQ0MsUUFBUSxDQUFDLGlCQUFpQixDQUFDO01BQ2xDLElBQUksQ0FBQ0wsT0FBTyxHQUFHLElBQUk7TUFDbkIsSUFBSSxDQUFDMkQsUUFBUSxDQUFDLE1BQU0sQ0FBQztJQUN2QixDQUFDO0lBRUQ7SUFDQXNCLEtBQUssRUFBRSxTQUFBQSxNQUFBLEVBQVc7TUFDaEIsSUFBRyxJQUFJLENBQUN0QixRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssS0FBSyxFQUFFO1FBQ3pDO01BQ0Y7TUFFQSxJQUFJaEUsQ0FBQyxHQUFHLElBQUksQ0FBQ2xDLE9BQU87TUFDcEIsSUFBSW9NLE1BQU0sR0FBR2xLLENBQUMsQ0FBQ3BCLElBQUk7TUFDbkIsSUFBSXFCLEtBQUssR0FBRyxJQUFJLENBQUNBLEtBQUs7TUFDdEIsSUFBSWdLLElBQUksR0FBRyxFQUFFOztNQUViO01BQ0EsSUFBR3pNLENBQUMsQ0FBQzJNLE9BQU8sQ0FBQ25LLENBQUMsQ0FBQ3BCLElBQUksQ0FBQyxFQUFFO1FBQ3BCc0wsTUFBTSxHQUFHbEssQ0FBQyxDQUFDcEIsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNsQnFCLEtBQUssR0FBR0QsQ0FBQyxDQUFDcEIsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQ3FCLEtBQUs7TUFDakM7TUFFQSxJQUFHaUssTUFBTSxFQUFFO1FBQ1RELElBQUksR0FBRyxDQUFFQyxNQUFNLEVBQUVqSyxLQUFLLENBQUU7TUFDMUI7TUFFQXpDLENBQUMsQ0FBQzRNLEVBQUUsQ0FBQ3hMLElBQUksQ0FBQ3lMLEtBQUssQ0FBQyxJQUFJLENBQUNySixJQUFJLEVBQUVpSixJQUFJLENBQUM7TUFDaEMsSUFBSSxDQUFDeEosTUFBTSxDQUFDaUYsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUNxQixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUNBLE9BQU8sQ0FBQyxZQUFZLENBQUM7TUFDaEYsSUFBSSxDQUFDMUcsT0FBTyxHQUFHLEtBQUs7TUFDcEIsSUFBSSxDQUFDMkQsUUFBUSxDQUFDLE9BQU8sQ0FBQztNQUN0QixJQUFJLENBQUN2RCxNQUFNLENBQUNzRyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBQzlCLENBQUM7SUFFRHVELE1BQU0sRUFBRSxTQUFBQSxPQUFBLEVBQVc7TUFDakIsSUFBSSxDQUFDYixlQUFlLENBQUMsS0FBSyxDQUFDO0lBQzdCLENBQUM7SUFFRC9ILE9BQU8sRUFBRSxTQUFBQSxRQUFBLEVBQVc7TUFDbEIsSUFBSSxDQUFDK0gsZUFBZSxDQUFDLElBQUksQ0FBQztJQUM1QixDQUFDO0lBRURoRCxRQUFRLEVBQUUsU0FBQUEsU0FBU3JCLENBQUMsRUFBRTtNQUNwQixJQUFJLENBQUNlLGNBQWMsQ0FBQyxJQUFJLENBQUM7TUFDekIsSUFBSSxDQUFDbkMsUUFBUSxDQUFDLFVBQVUsQ0FBQztJQUMzQixDQUFDO0lBRUQwQyxVQUFVLEVBQUUsU0FBQUEsV0FBQSxFQUFXO01BQ3JCLElBQUksQ0FBQ1AsY0FBYyxDQUFDLEtBQUssQ0FBQztNQUMxQixJQUFJLENBQUNuQyxRQUFRLENBQUMsWUFBWSxDQUFDO0lBQzdCLENBQUM7SUFFRHVHLFVBQVUsRUFBRSxTQUFBQSxXQUFBLEVBQVc7TUFDckIsT0FBTyxJQUFJLENBQUN2SixJQUFJLENBQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMyRSxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQ25ELENBQUM7SUFFRG9HLFlBQVksRUFBRSxTQUFBQSxhQUFBLEVBQVc7TUFDdkIsT0FBTyxJQUFJLENBQUN4SixJQUFJLENBQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLENBQUNnTCxHQUFHLENBQUMsVUFBVSxDQUFDO0lBQ2hELENBQUM7SUFFREMsT0FBTyxFQUFFLFNBQUFBLFFBQUEsRUFBVztNQUNsQjtNQUNBbE4sQ0FBQyxDQUFDbU4sTUFBTSxDQUFDQyxTQUFTLENBQUNGLE9BQU8sQ0FBQ25HLElBQUksQ0FBQyxJQUFJLENBQUM7O01BRXJDO01BQ0E1RyxJQUFJLENBQUNrTixNQUFNLENBQUMsSUFBSSxDQUFDdEssWUFBWSxDQUFDO01BQzlCL0MsQ0FBQyxDQUFDLElBQUksQ0FBQzhCLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQ2tJLElBQUksQ0FBQyxDQUFDcUQsTUFBTSxDQUFDLElBQUksQ0FBQ3RLLFlBQVksQ0FBQztNQUVqRCxJQUFJLENBQUNFLE1BQU0sQ0FBQ2tELE1BQU0sQ0FBQyxDQUFDO01BQ3BCLElBQUksQ0FBQzNDLElBQUksQ0FBQzJDLE1BQU0sQ0FBQyxDQUFDO01BQ2xCLElBQUksQ0FBQ3JFLE9BQU8sQ0FBQ1gsSUFBSSxDQUFDLENBQUM7TUFFbkIsT0FBTyxJQUFJO0lBQ2IsQ0FBQztJQUVEbU0sTUFBTSxFQUFFLFNBQUFBLE9BQUEsRUFBVztNQUNqQixPQUFPLElBQUksQ0FBQ3pLLE9BQU87SUFDckIsQ0FBQztJQUVEeEMsTUFBTSxFQUFFLFNBQUFBLE9BQUEsRUFBVztNQUNqQixPQUFPLElBQUksQ0FBQ21ELElBQUk7SUFDbEIsQ0FBQztJQUVEK0osU0FBUyxFQUFFLFNBQUFBLFVBQUEsRUFBVztNQUNwQixPQUFPLElBQUksQ0FBQ3RLLE1BQU07SUFDcEIsQ0FBQztJQUVEdUssT0FBTyxFQUFFLFNBQUFBLFFBQUEsRUFBVztNQUNsQixPQUFPLElBQUksQ0FBQ2hLLElBQUk7SUFDbEIsQ0FBQztJQUVEaUssU0FBUyxFQUFFLFNBQUFBLFVBQUEsRUFBVztNQUNwQixPQUFPLElBQUksQ0FBQ3JILE1BQU07SUFDcEIsQ0FBQztJQUVEc0gsU0FBUyxFQUFFLFNBQUFBLFVBQVNDLFVBQVUsRUFBRXJJLElBQUksRUFBRXNJLFVBQVUsRUFBRTtNQUNoRCxJQUFJQyxPQUFPLEdBQUc3TixDQUFDLENBQUMsV0FBVyxDQUFDLENBQUNtRCxJQUFJLENBQUN3SyxVQUFVLENBQUMsQ0FBQ3JJLElBQUksQ0FBQ0EsSUFBSSxDQUFDO01BQ3hELElBQUl3SSxVQUFVLEdBQUdELE9BQU8sQ0FBQzdHLEdBQUcsQ0FBQyxDQUFDLENBQUM7TUFDL0IsSUFBRzRHLFVBQVUsRUFBRTtRQUNiLElBQUksQ0FBQzlMLE9BQU8sQ0FBQzRELFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQ2tCLE1BQU0sQ0FBQyxZQUFXO1VBQ2xELE9BQU81RyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUNvRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUt3SyxVQUFVO1FBQzdDLENBQUMsQ0FBQyxDQUFDakssTUFBTSxDQUFDa0ssT0FBTyxDQUFDO1FBQ2xCLElBQUksQ0FBQ3JLLElBQUksQ0FBQ3ZCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFDMkUsTUFBTSxDQUFDLFlBQVc7VUFDM0QsT0FBTzVHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQ2lDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQ3FELElBQUksQ0FBQyxDQUFDLEtBQUtzSSxVQUFVO1FBQ2hELENBQUMsQ0FBQyxDQUFDakssTUFBTSxDQUFDLElBQUksQ0FBQ1EsV0FBVyxDQUFDMkosVUFBVSxDQUFDLENBQUM7TUFDekMsQ0FBQyxNQUFNO1FBQ0wsSUFBSSxDQUFDaE0sT0FBTyxDQUFDNkIsTUFBTSxDQUFDa0ssT0FBTyxDQUFDO1FBQzVCLElBQUksQ0FBQ3JLLElBQUksQ0FBQ3ZCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDMEIsTUFBTSxDQUFDLElBQUksQ0FBQ1EsV0FBVyxDQUFDMkosVUFBVSxDQUFDLENBQUM7TUFDbkY7TUFDQTtNQUNBLElBQUksQ0FBQzFILE1BQU0sR0FBRyxJQUFJLENBQUM1QyxJQUFJLENBQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDO01BQ3JDLElBQUksQ0FBQ29FLE1BQU0sR0FBRyxJQUFJLENBQUNELE1BQU0sQ0FBQ1YsUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUM3QyxDQUFDO0lBRURxSSxZQUFZLEVBQUUsU0FBQUEsYUFBU3pKLEtBQUssRUFBRTtNQUM1QixJQUFHLENBQUNBLEtBQUssRUFBRTtRQUNUO01BQ0Y7TUFDQSxJQUFJLENBQUN4QyxPQUFPLENBQUNHLElBQUksQ0FBQyxlQUFlLEdBQUdxQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUM2QixNQUFNLENBQUMsQ0FBQztNQUN6RCxJQUFJLENBQUNDLE1BQU0sQ0FBQ25FLElBQUksQ0FBQyxjQUFjLEdBQUdxQyxLQUFLLEdBQUcsR0FBRyxDQUFDLENBQUNrSCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUNyRixNQUFNLENBQUMsQ0FBQzs7TUFFckU7TUFDQSxJQUFJLENBQUNDLE1BQU0sR0FBRyxJQUFJLENBQUM1QyxJQUFJLENBQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDO01BQ3JDLElBQUksQ0FBQ29FLE1BQU0sR0FBRyxJQUFJLENBQUNELE1BQU0sQ0FBQ1YsUUFBUSxDQUFDLE9BQU8sQ0FBQztJQUM3QyxDQUFDO0lBRURuRSxRQUFRLEVBQUUsU0FBQUEsU0FBQSxFQUFXO01BQ25CLElBQUl5TSxHQUFHLEdBQUc7UUFDUkMsRUFBRSxFQUFFLEtBQUs7UUFDVEMsRUFBRSxFQUFFLFFBQVE7UUFDWkMsRUFBRSxFQUFFLElBQUksQ0FBQ2xMO01BQ1gsQ0FBQztNQUNELElBQUcsQ0FBQ2pELENBQUMsQ0FBQ29PLGFBQWEsQ0FBQyxJQUFJLENBQUM5TixPQUFPLENBQUNpQixRQUFRLENBQUMsRUFBRTtRQUMxQ3lNLEdBQUcsQ0FBQ0MsRUFBRSxHQUFHLElBQUksQ0FBQzNOLE9BQU8sQ0FBQ2lCLFFBQVEsQ0FBQzBNLEVBQUUsSUFBSUQsR0FBRyxDQUFDQyxFQUFFO1FBQzNDRCxHQUFHLENBQUNFLEVBQUUsR0FBRyxJQUFJLENBQUM1TixPQUFPLENBQUNpQixRQUFRLENBQUMyTSxFQUFFLElBQUlGLEdBQUcsQ0FBQ0UsRUFBRTtRQUMzQ0YsR0FBRyxDQUFDRyxFQUFFLEdBQUcsSUFBSSxDQUFDN04sT0FBTyxDQUFDaUIsUUFBUSxDQUFDNE0sRUFBRSxJQUFJSCxHQUFHLENBQUNHLEVBQUU7TUFDN0M7TUFDQSxJQUFHbk8sQ0FBQyxDQUFDcU8sRUFBRSxJQUFJck8sQ0FBQyxDQUFDcU8sRUFBRSxDQUFDOU0sUUFBUSxFQUFFO1FBQ3hCLElBQUksQ0FBQ2lDLElBQUksQ0FBQ2pDLFFBQVEsQ0FBQ3lNLEdBQUcsQ0FBQztNQUN6QixDQUFDLE1BQU07UUFDTEEsR0FBRyxHQUFHLElBQUksQ0FBQy9LLE1BQU0sQ0FBQzFCLFFBQVEsQ0FBQyxDQUFDO1FBQzVCeU0sR0FBRyxDQUFDTSxHQUFHLElBQUksSUFBSSxDQUFDckwsTUFBTSxDQUFDNEgsV0FBVyxDQUFDLEtBQUssQ0FBQztRQUN6QyxJQUFJLENBQUNySCxJQUFJLENBQUMrSyxNQUFNLENBQUNQLEdBQUcsQ0FBQztNQUN2QjtJQUNGLENBQUM7SUFFRDtJQUNBUSxVQUFVLEVBQUUsU0FBQUEsV0FBU3BDLEdBQUcsRUFBRTlILEtBQUssRUFBRTtNQUMvQixJQUFJZCxJQUFJLEdBQUcsSUFBSSxDQUFDQSxJQUFJO01BRXBCLFFBQU80SSxHQUFHO1FBQ1IsS0FBSyxRQUFRO1VBQ1gsSUFBRyxPQUFPOUgsS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUM3QixJQUFJLENBQUMvRCxNQUFNLENBQUMrRCxLQUFLLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7VUFDeEMsQ0FBQyxNQUFNLElBQUcsT0FBT0EsS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUNuQyxJQUFJLENBQUNiLG1CQUFtQixDQUFDaUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUNTLE1BQU0sQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQzFDLG1CQUFtQixDQUFDZ0wsT0FBTyxDQUFDLE1BQU0sR0FBR25LLEtBQUssR0FBRyxPQUFPLENBQUM7VUFDNUQ7VUFDQTtRQUNGLEtBQUssY0FBYztVQUNqQmQsSUFBSSxDQUFDdkIsSUFBSSxDQUFDLDJCQUEyQixDQUFDLENBQUNDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDb0QsSUFBSSxDQUFDaEIsS0FBSyxDQUFDO1VBQ3pEO1FBQ0YsS0FBSyxnQkFBZ0I7VUFDbkJkLElBQUksQ0FBQ3ZCLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQ29ELElBQUksQ0FBQ2hCLEtBQUssQ0FBQztVQUMxRDtRQUNGLEtBQUssUUFBUTtVQUNYLElBQUksQ0FBQ2hFLE9BQU8sQ0FBQzhMLEdBQUcsQ0FBQyxHQUFHOUgsS0FBSztVQUN6QixJQUFJLENBQUNxRyxjQUFjLENBQUMsQ0FBQztVQUNyQjtRQUNGLEtBQUssVUFBVTtRQUNmLEtBQUssV0FBVztVQUNkLElBQUksQ0FBQ3JLLE9BQU8sQ0FBQzhMLEdBQUcsQ0FBQyxHQUFHOUgsS0FBSztVQUN6QixJQUFJLENBQUNnQyxlQUFlLENBQUMsQ0FBQztVQUN0QixJQUFJLENBQUNtRSxhQUFhLENBQUMsQ0FBQztVQUNwQjtRQUNGLEtBQUssY0FBYztRQUNuQixLQUFLLGNBQWM7UUFDbkIsS0FBSyxrQkFBa0I7VUFDckIsSUFBSSxDQUFDbkssT0FBTyxDQUFDOEwsR0FBRyxDQUFDLEdBQUc5SCxLQUFLLENBQUMsQ0FBQztVQUMzQixJQUFJLENBQUNpQyxNQUFNLENBQUMsQ0FBQztVQUNiO1FBQ0YsS0FBSyxTQUFTO1VBQ1ovQyxJQUFJLENBQUNrTCxHQUFHLENBQUMsSUFBSSxDQUFDekwsTUFBTSxDQUFDLENBQUNpRixXQUFXLENBQUMsSUFBSSxDQUFDNUgsT0FBTyxDQUFDSSxPQUFPLENBQUMsQ0FBQ3dDLFFBQVEsQ0FBQ29CLEtBQUssQ0FBQztVQUN2RTtRQUNGLEtBQUssVUFBVTtVQUNiZCxJQUFJLENBQUM4RixXQUFXLENBQUMsdUJBQXVCLEVBQUUsQ0FBQ2hGLEtBQUssQ0FBQztVQUNqRCxJQUFJLENBQUNoRSxPQUFPLENBQUNnQixRQUFRLEdBQUdnRCxLQUFLO1VBQzdCLElBQUksQ0FBQ3hDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQ1IsUUFBUSxHQUFHZ0QsS0FBSztVQUNoQyxJQUFJLENBQUM0RSxVQUFVLENBQUMsQ0FBQztVQUNqQixJQUFJLENBQUNwRixPQUFPLENBQUMsQ0FBQztVQUNkO1FBQ0YsS0FBSyxVQUFVO1VBQ2IsSUFBSSxDQUFDdkMsUUFBUSxDQUFDLENBQUM7VUFDZjtRQUNGLEtBQUssdUJBQXVCO1VBQzFCLElBQUksQ0FBQ2pCLE9BQU8sQ0FBQzhMLEdBQUcsQ0FBQyxHQUFHOUgsS0FBSztVQUN6QixJQUFJLENBQUNpQyxNQUFNLENBQUMsSUFBSSxDQUFDO1VBQ2pCO01BQ0o7TUFFQXZHLENBQUMsQ0FBQ21OLE1BQU0sQ0FBQ0MsU0FBUyxDQUFDb0IsVUFBVSxDQUFDM0IsS0FBSyxDQUFDLElBQUksRUFBRThCLFNBQVMsQ0FBQztJQUN0RDtFQUNGLENBQUMsQ0FBQztBQUVKLENBQUMsRUFBRUMsTUFBTSxDQUFDOzs7Ozs7Ozs7Ozs7QUNuN0JWIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vaXJpZGUvLi9hc3NldHMvanMvY29tcG9uZW50cy9qcXVlcnktdWktbXVsdGlzZWxlY3Qtd2lkZ2V0LWlyaWRlL3NyYy9qcXVlcnkubXVsdGlzZWxlY3QuanMiLCJ3ZWJwYWNrOi8vaXJpZGUvLi9hc3NldHMvanMvY29tcG9uZW50cy9qcXVlcnktdWktbXVsdGlzZWxlY3Qtd2lkZ2V0LWlyaWRlL2pxdWVyeS5tdWx0aXNlbGVjdC5jc3M/MThmMyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBqc2hpbnQgZm9yaW46dHJ1ZSwgbm9hcmc6dHJ1ZSwgbm9lbXB0eTp0cnVlLCBlcWVxZXE6dHJ1ZSwgYm9zczp0cnVlLCB1bmRlZjp0cnVlLCBjdXJseTp0cnVlLCBicm93c2VyOnRydWUsIGpxdWVyeTp0cnVlICovXG4vKlxuICogalF1ZXJ5IE11bHRpU2VsZWN0IFVJIFdpZGdldCAyLjAuMVxuICogQ29weXJpZ2h0IChjKSAyMDEyIEVyaWMgSHluZHNcbiAqXG4gKiBodHRwOi8vd3d3LmVyaWNoeW5kcy5jb20vanF1ZXJ5L2pxdWVyeS11aS1tdWx0aXNlbGVjdC13aWRnZXQvXG4gKlxuICogRGVwZW5kczpcbiAqICAgLSBqUXVlcnkgMS40LjIrXG4gKiAgIC0galF1ZXJ5IFVJIDEuMTEgd2lkZ2V0IGZhY3RvcnlcbiAqXG4gKiBPcHRpb25hbDpcbiAqICAgLSBqUXVlcnkgVUkgZWZmZWN0c1xuICogICAtIGpRdWVyeSBVSSBwb3NpdGlvbiB1dGlsaXR5XG4gKlxuICogRHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCBHUEwgbGljZW5zZXM6XG4gKiAgIGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwXG4gKiAgIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbFxuICpcbiAqL1xuKGZ1bmN0aW9uKCQsIHVuZGVmaW5lZCkge1xuICAvLyBDb3VudGVyIHVzZWQgdG8gcHJldmVudCBjb2xsaXNpb25zXG4gIHZhciBtdWx0aXNlbGVjdElEID0gMDtcbiAgdmFyICRkb2MgPSAkKGRvY3VtZW50KTtcblxuICAkLndpZGdldChcImVjaC5tdWx0aXNlbGVjdFwiLCB7XG5cbiAgICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgICBvcHRpb25zOiB7XG4gICAgICBoZWFkZXI6IHRydWUsXG4gICAgICBoZWlnaHQ6IDE3NSxcbiAgICAgIG1pbldpZHRoOiAyMjUsXG4gICAgICBjbGFzc2VzOiAnJyxcbiAgICAgIGNoZWNrQWxsVGV4dDogJ0NoZWNrIGFsbCcsXG4gICAgICB1bmNoZWNrQWxsVGV4dDogJ1VuY2hlY2sgYWxsJyxcbiAgICAgIG5vbmVTZWxlY3RlZFRleHQ6ICdTZWxlY3Qgb3B0aW9ucycsXG4gICAgICBzaG93Q2hlY2tBbGw6IHRydWUsXG4gICAgICBzaG93VW5jaGVja0FsbDogdHJ1ZSxcbiAgICAgIHNlbGVjdGVkVGV4dDogJyMgc2VsZWN0ZWQnLFxuICAgICAgc2VsZWN0ZWRMaXN0OiAwLFxuICAgICAgY2xvc2VJY29uOiAndWktaWNvbi1jaXJjbGUtY2xvc2UnLFxuICAgICAgc2hvdzogbnVsbCxcbiAgICAgIGhpZGU6IG51bGwsXG4gICAgICBhdXRvT3BlbjogZmFsc2UsXG4gICAgICBtdWx0aXBsZTogdHJ1ZSxcbiAgICAgIHBvc2l0aW9uOiB7fSxcbiAgICAgIGFwcGVuZFRvOiBudWxsLFxuICAgICAgbWVudVdpZHRoOm51bGwsXG4gICAgICBzZWxlY3RlZExpc3RTZXBhcmF0b3I6ICcsICcsXG4gICAgICBkaXNhYmxlSW5wdXRzT25Ub2dnbGU6IHRydWUsXG4gICAgICBncm91cENvbHVtbnM6IGZhbHNlXG4gICAgfSxcblxuICAgIF9nZXRBcHBlbmRFbDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZWxlbWVudCA9IHRoaXMub3B0aW9ucy5hcHBlbmRUbztcbiAgICAgIGlmKGVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQuanF1ZXJ5IHx8IGVsZW1lbnQubm9kZVR5cGUgPyAkKGVsZW1lbnQpIDogdGhpcy5kb2N1bWVudC5maW5kKGVsZW1lbnQpLmVxKDApO1xuICAgICAgfVxuICAgICAgaWYoIWVsZW1lbnQgfHwgIWVsZW1lbnRbMF0pIHtcbiAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudC5jbG9zZXN0KFwiLnVpLWZyb250LCBkaWFsb2dcIik7XG4gICAgICB9XG4gICAgICBpZighZWxlbWVudC5sZW5ndGgpIHtcbiAgICAgICAgZWxlbWVudCA9IHRoaXMuZG9jdW1lbnRbMF0uYm9keTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH0sXG5cbiAgICBfY3JlYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBlbCA9IHRoaXMuZWxlbWVudDtcbiAgICAgIHZhciBvID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICB0aGlzLnNwZWVkID0gJC5meC5zcGVlZHMuX2RlZmF1bHQ7IC8vIGRlZmF1bHQgc3BlZWQgZm9yIGVmZmVjdHNcbiAgICAgIHRoaXMuX2lzT3BlbiA9IGZhbHNlOyAvLyBhc3N1bWUgbm9cbiAgICAgIHRoaXMuaW5wdXRJZENvdW50ZXIgPSAwO1xuXG4gICAgICAvLyBjcmVhdGUgYSB1bmlxdWUgbmFtZXNwYWNlIGZvciBldmVudHMgdGhhdCB0aGUgd2lkZ2V0XG4gICAgICAvLyBmYWN0b3J5IGNhbm5vdCB1bmJpbmQgYXV0b21hdGljYWxseS4gVXNlIGV2ZW50TmFtZXNwYWNlIGlmIG9uXG4gICAgICAvLyBqUXVlcnkgVUkgMS45KywgYW5kIG90aGVyd2lzZSBmYWxsYmFjayB0byBhIGN1c3RvbSBzdHJpbmcuXG4gICAgICB0aGlzLl9uYW1lc3BhY2VJRCA9IHRoaXMuZXZlbnROYW1lc3BhY2UgfHwgKCdtdWx0aXNlbGVjdCcgKyBtdWx0aXNlbGVjdElEKTtcbiAgICAgIC8vIGJ1bXAgdW5pcXVlIElEIGFmdGVyIGFzc2lnbmluZyBpdCB0byB0aGUgd2lkZ2V0IGluc3RhbmNlXG4gICAgICB0aGlzLm11bHRpc2VsZWN0SUQgPSBtdWx0aXNlbGVjdElEKys7XG5cbiAgICAgIHZhciBidXR0b24gPSAodGhpcy5idXR0b24gPSAkKCc8YnV0dG9uIHR5cGU9XCJidXR0b25cIj48c3BhbiBjbGFzcz1cInVpLWljb24gdWktaWNvbi10cmlhbmdsZS0xLXNcIj48L3NwYW4+PC9idXR0b24+JykpXG4gICAgICAgIC5hZGRDbGFzcygndWktbXVsdGlzZWxlY3QgdWktd2lkZ2V0IHVpLXN0YXRlLWRlZmF1bHQgdWktY29ybmVyLWFsbCcpXG4gICAgICAgIC5hZGRDbGFzcyhvLmNsYXNzZXMpXG4gICAgICAgIC5hdHRyKHsgJ3RpdGxlJzplbC5hdHRyKCd0aXRsZScpLCAndGFiSW5kZXgnOmVsLmF0dHIoJ3RhYkluZGV4JyksICdpZCc6IGVsLmF0dHIoJ2lkJykgPyBlbC5hdHRyKCdpZCcpICArICdfbXMnIDogbnVsbCB9KVxuICAgICAgICAucHJvcCgnYXJpYS1oYXNwb3B1cCcsIHRydWUpXG4gICAgICAgIC5pbnNlcnRBZnRlcihlbCk7XG5cbiAgICAgICAgdGhpcy5idXR0b25sYWJlbCA9ICQoJzxzcGFuIC8+JylcbiAgICAgICAgICAuaHRtbChvLm5vbmVTZWxlY3RlZFRleHQpXG4gICAgICAgICAgLmFwcGVuZFRvKGJ1dHRvbik7XG5cbiAgICAgICAgdGhpcy5tZW51ID0gJCgnPGRpdiAvPicpXG4gICAgICAgICAgLmFkZENsYXNzKCd1aS1tdWx0aXNlbGVjdC1tZW51IHVpLXdpZGdldCB1aS13aWRnZXQtY29udGVudCB1aS1jb3JuZXItYWxsJylcbiAgICAgICAgICAuYWRkQ2xhc3Moby5jbGFzc2VzKVxuICAgICAgICAgIC5hcHBlbmRUbyh0aGlzLl9nZXRBcHBlbmRFbCgpKTtcblxuICAgICAgICB0aGlzLmhlYWRlciA9ICQoJzxkaXYgLz4nKVxuICAgICAgICAgIC5hZGRDbGFzcygndWktd2lkZ2V0LWhlYWRlciB1aS1jb3JuZXItYWxsIHVpLW11bHRpc2VsZWN0LWhlYWRlciB1aS1oZWxwZXItY2xlYXJmaXgnKVxuICAgICAgICAgIC5hcHBlbmRUbyh0aGlzLm1lbnUpO1xuXG4gICAgICAgIHRoaXMuaGVhZGVyTGlua0NvbnRhaW5lciA9ICQoJzx1bCAvPicpXG4gICAgICAgICAgLmFkZENsYXNzKCd1aS1oZWxwZXItcmVzZXQnKVxuICAgICAgICAgIC5odG1sKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYoby5oZWFkZXIgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgdmFyIGhlYWRlcl9saXMgPSAnJztcbiAgICAgICAgICAgICAgaWYoby5zaG93Q2hlY2tBbGwpIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJfbGlzID0gJzxsaT48YSBjbGFzcz1cInVpLW11bHRpc2VsZWN0LWFsbFwiIGhyZWY9XCIjXCI+PHNwYW4gY2xhc3M9XCJ1aS1pY29uIHVpLWljb24tY2hlY2tcIj48L3NwYW4+PHNwYW4+JyArIG8uY2hlY2tBbGxUZXh0ICsgJzwvc3Bhbj48L2E+PC9saT4nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmKG8uc2hvd1VuY2hlY2tBbGwpIHtcbiAgICAgICAgICAgICAgICBoZWFkZXJfbGlzICs9ICc8bGk+PGEgY2xhc3M9XCJ1aS1tdWx0aXNlbGVjdC1ub25lXCIgaHJlZj1cIiNcIj48c3BhbiBjbGFzcz1cInVpLWljb24gdWktaWNvbi1jbG9zZXRoaWNrXCI+PC9zcGFuPjxzcGFuPicgKyBvLnVuY2hlY2tBbGxUZXh0ICsgJzwvc3Bhbj48L2E+PC9saT4nO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBoZWFkZXJfbGlzO1xuICAgICAgICAgICAgfSBlbHNlIGlmKHR5cGVvZiBvLmhlYWRlciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICByZXR1cm4gJzxsaT4nICsgby5oZWFkZXIgKyAnPC9saT4nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmFwcGVuZCgnPGxpIGNsYXNzPVwidWktbXVsdGlzZWxlY3QtY2xvc2VcIj48YSBocmVmPVwiI1wiIGNsYXNzPVwidWktbXVsdGlzZWxlY3QtY2xvc2VcIj48c3BhbiBjbGFzcz1cInVpLWljb24gJytvLmNsb3NlSWNvbisnXCI+PC9zcGFuPjwvYT48L2xpPicpXG4gICAgICAgICAgLmFwcGVuZFRvKHRoaXMuaGVhZGVyKTtcblxuICAgICAgICB2YXIgY2hlY2tib3hDb250YWluZXIgPSAodGhpcy5jaGVja2JveENvbnRhaW5lciA9ICQoJzx1bCAvPicpKVxuICAgICAgICAgIC5hZGRDbGFzcygndWktbXVsdGlzZWxlY3QtY2hlY2tib3hlcyB1aS1oZWxwZXItcmVzZXQnKVxuICAgICAgICAgIC5hcHBlbmRUbyh0aGlzLm1lbnUpO1xuXG4gICAgICAgIC8vIHBlcmZvcm0gZXZlbnQgYmluZGluZ3NcbiAgICAgICAgdGhpcy5fYmluZEV2ZW50cygpO1xuXG4gICAgICAgIC8vIGJ1aWxkIG1lbnVcbiAgICAgICAgdGhpcy5yZWZyZXNoKHRydWUpO1xuXG4gICAgICAgIC8vIHNvbWUgYWRkbC4gbG9naWMgZm9yIHNpbmdsZSBzZWxlY3RzXG4gICAgICAgIGlmKCFvLm11bHRpcGxlKSB7XG4gICAgICAgICAgdGhpcy5tZW51LmFkZENsYXNzKCd1aS1tdWx0aXNlbGVjdC1zaW5nbGUnKTtcbiAgICAgICAgfVxuICAgICAgICBlbC5oaWRlKCk7XG4gICAgfSxcblxuICAgIF9pbml0OiBmdW5jdGlvbigpIHtcbiAgICAgIGlmKHRoaXMub3B0aW9ucy5oZWFkZXIgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMuaGVhZGVyLmhpZGUoKTtcbiAgICAgIH1cbiAgICAgIGlmKCF0aGlzLm9wdGlvbnMubXVsdGlwbGUpIHtcbiAgICAgICAgdGhpcy5oZWFkZXJMaW5rQ29udGFpbmVyLmZpbmQoJy51aS1tdWx0aXNlbGVjdC1hbGwsIC51aS1tdWx0aXNlbGVjdC1ub25lJykuaGlkZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oZWFkZXJMaW5rQ29udGFpbmVyLmZpbmQoJy51aS1tdWx0aXNlbGVjdC1hbGwsIC51aS1tdWx0aXNlbGVjdC1ub25lJykuc2hvdygpO1xuICAgICAgfVxuICAgICAgaWYodGhpcy5vcHRpb25zLmF1dG9PcGVuKSB7XG4gICAgICAgIHRoaXMub3BlbigpO1xuICAgICAgfVxuICAgICAgaWYodGhpcy5lbGVtZW50LmlzKCc6ZGlzYWJsZWQnKSkge1xuICAgICAgICB0aGlzLmRpc2FibGUoKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX21ha2VPcHRpb246IGZ1bmN0aW9uKG9wdGlvbikge1xuICAgICAgdmFyIHRpdGxlID0gb3B0aW9uLnRpdGxlID8gb3B0aW9uLnRpdGxlIDogbnVsbDtcbiAgICAgIHZhciB2YWx1ZSA9IG9wdGlvbi52YWx1ZTtcbiAgICAgIHZhciBpZCA9IHRoaXMuZWxlbWVudC5hdHRyKCdpZCcpIHx8IHRoaXMubXVsdGlzZWxlY3RJRDsgLy8gdW5pcXVlIElEIGZvciB0aGUgbGFiZWwgJiBvcHRpb24gdGFnc1xuICAgICAgdmFyIGlucHV0SUQgPSAndWktbXVsdGlzZWxlY3QtJyArIHRoaXMubXVsdGlzZWxlY3RJRCArICctJyArIChvcHRpb24uaWQgfHwgaWQgKyAnLW9wdGlvbi0nICsgdGhpcy5pbnB1dElkQ291bnRlcisrKTtcbiAgICAgIHZhciBpc0Rpc2FibGVkID0gb3B0aW9uLmRpc2FibGVkO1xuICAgICAgdmFyIGlzU2VsZWN0ZWQgPSBvcHRpb24uc2VsZWN0ZWQ7XG4gICAgICB2YXIgbGFiZWxDbGFzc2VzID0gWyAndWktY29ybmVyLWFsbCcgXTtcbiAgICAgIHZhciBsaUNsYXNzZXMgPSBbXTtcbiAgICAgIHZhciBvID0gdGhpcy5vcHRpb25zO1xuXG4gICAgICBpZihpc0Rpc2FibGVkKSB7XG4gICAgICAgIGxpQ2xhc3Nlcy5wdXNoKCd1aS1tdWx0aXNlbGVjdC1kaXNhYmxlZCcpO1xuICAgICAgICBsYWJlbENsYXNzZXMucHVzaCgndWktc3RhdGUtZGlzYWJsZWQnKTtcbiAgICAgIH1cbiAgICAgIGlmKG9wdGlvbi5jbGFzc05hbWUpIHtcbiAgICAgICAgbGlDbGFzc2VzLnB1c2gob3B0aW9uLmNsYXNzTmFtZSk7XG4gICAgICB9XG4gICAgICBpZihpc1NlbGVjdGVkICYmICFvLm11bHRpcGxlKSB7XG4gICAgICAgIGxhYmVsQ2xhc3Nlcy5wdXNoKCd1aS1zdGF0ZS1hY3RpdmUnKTtcbiAgICAgIH1cblxuICAgICAgdmFyICRpdGVtID0gJChcIjxsaS8+XCIpLmFkZENsYXNzKGxpQ2xhc3Nlcy5qb2luKCcgJykpO1xuICAgICAgdmFyICRsYWJlbCA9ICQoXCI8bGFiZWwvPlwiKS5hdHRyKHtcbiAgICAgICAgXCJmb3JcIjogaW5wdXRJRCxcbiAgICAgICAgXCJ0aXRsZVwiOiB0aXRsZVxuICAgICAgfSkuYWRkQ2xhc3MobGFiZWxDbGFzc2VzLmpvaW4oJyAnKSkuYXBwZW5kVG8oJGl0ZW0pO1xuICAgICAgdmFyICRpbnB1dCA9ICQoXCI8aW5wdXQvPlwiKS5hdHRyKHtcbiAgICAgICAgXCJuYW1lXCI6IFwibXVsdGlzZWxlY3RfXCIgKyBpZCxcbiAgICAgICAgXCJ0eXBlXCI6IG8ubXVsdGlwbGUgPyBcImNoZWNrYm94XCIgOiBcInJhZGlvXCIsXG4gICAgICAgIFwidmFsdWVcIjogdmFsdWUsXG4gICAgICAgIFwidGl0bGVcIjogdGl0bGUsXG4gICAgICAgIFwiaWRcIjogaW5wdXRJRCxcbiAgICAgICAgXCJjaGVja2VkXCI6IGlzU2VsZWN0ZWQgPyBcImNoZWNrZWRcIiA6IG51bGwsXG4gICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBpc1NlbGVjdGVkID8gXCJ0cnVlXCIgOiBudWxsLFxuICAgICAgICBcImRpc2FibGVkXCI6IGlzRGlzYWJsZWQgPyBcImRpc2FibGVkXCIgOiBudWxsLFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogaXNEaXNhYmxlZCA/IFwidHJ1ZVwiIDogbnVsbFxuICAgICAgfSkuZGF0YSgkKG9wdGlvbikuZGF0YSgpKS5hcHBlbmRUbygkbGFiZWwpO1xuXG4gICAgICAkKFwiPHNwYW4vPlwiKS50ZXh0KCQob3B0aW9uKS50ZXh0KCkpLmFwcGVuZFRvKCRsYWJlbCk7XG5cbiAgICAgIHJldHVybiAkaXRlbTtcbiAgICB9LFxuXG4gICAgX2J1aWxkT3B0aW9uTGlzdDogZnVuY3Rpb24oZWxlbWVudCwgJGFwcGVuZFRvKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICBlbGVtZW50LmNoaWxkcmVuKCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKTtcbiAgICAgICAgaWYodGhpcy50YWdOYW1lID09PSAnT1BUR1JPVVAnKSB7XG4gICAgICAgICAgdmFyICRvcHRpb25Hcm91cCA9ICQoXCI8dWwvPlwiKS5hZGRDbGFzcygndWktbXVsdGlzZWxlY3Qtb3B0Z3JvdXAgJyArIHRoaXMuY2xhc3NOYW1lKS5hcHBlbmRUbygkYXBwZW5kVG8pO1xuICAgICAgICAgIGlmKHNlbGYub3B0aW9ucy5ncm91cENvbHVtbnMpIHtcbiAgICAgICAgICAgICRvcHRpb25Hcm91cC5hZGRDbGFzcyhcInVpLW11bHRpc2VsZWN0LWNvbHVtbnNcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgICQoXCI8YS8+XCIpLnRleHQodGhpcy5nZXRBdHRyaWJ1dGUoJ2xhYmVsJykpLmFwcGVuZFRvKCRvcHRpb25Hcm91cCk7XG4gICAgICAgICAgc2VsZi5fYnVpbGRPcHRpb25MaXN0KCR0aGlzLCAkb3B0aW9uR3JvdXApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciAkbGlzdEl0ZW0gPSBzZWxmLl9tYWtlT3B0aW9uKHRoaXMpLmFwcGVuZFRvKCRhcHBlbmRUbyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgfSxcblxuICAgIHJlZnJlc2g6IGZ1bmN0aW9uKGluaXQpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBlbCA9IHRoaXMuZWxlbWVudDtcbiAgICAgIHZhciBvID0gdGhpcy5vcHRpb25zO1xuICAgICAgdmFyIG1lbnUgPSB0aGlzLm1lbnU7XG4gICAgICB2YXIgY2hlY2tib3hDb250YWluZXIgPSB0aGlzLmNoZWNrYm94Q29udGFpbmVyO1xuICAgICAgdmFyIGh0bWwgPSBcIlwiO1xuICAgICAgdmFyICRkcm9wZG93biA9ICQoXCI8dWwvPlwiKS5hZGRDbGFzcygndWktbXVsdGlzZWxlY3QtY2hlY2tib3hlcyB1aS1oZWxwZXItcmVzZXQnKTtcbiAgICAgIHRoaXMuaW5wdXRJZENvdW50ZXIgPSAwO1xuXG5cbiAgICAgIC8vIHVwZGF0ZSBoZWFkZXIgbGluayBjb250YWluZXIgdmlzaWJpbGl0eSBpZiBuZWVkZWRcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuaGVhZGVyKSB7XG4gICAgICAgIGlmKCF0aGlzLm9wdGlvbnMubXVsdGlwbGUpIHtcbiAgICAgICAgICB0aGlzLmhlYWRlckxpbmtDb250YWluZXIuZmluZCgnLnVpLW11bHRpc2VsZWN0LWFsbCwgLnVpLW11bHRpc2VsZWN0LW5vbmUnKS5oaWRlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5oZWFkZXJMaW5rQ29udGFpbmVyLmZpbmQoJy51aS1tdWx0aXNlbGVjdC1hbGwsIC51aS1tdWx0aXNlbGVjdC1ub25lJykuc2hvdygpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2J1aWxkT3B0aW9uTGlzdChlbCwgJGRyb3Bkb3duKTtcblxuICAgICAgdGhpcy5tZW51LmZpbmQoXCIudWktbXVsdGlzZWxlY3QtY2hlY2tib3hlc1wiKS5yZW1vdmUoKTtcbiAgICAgIHRoaXMubWVudS5hcHBlbmQoJGRyb3Bkb3duKTtcblxuICAgICAgLy8gY2FjaGUgc29tZSBtb2FyIHVzZWZ1bCBlbGVtZW50c1xuICAgICAgdGhpcy5sYWJlbHMgPSBtZW51LmZpbmQoJ2xhYmVsJyk7XG4gICAgICB0aGlzLmlucHV0cyA9IHRoaXMubGFiZWxzLmNoaWxkcmVuKCdpbnB1dCcpO1xuXG4gICAgICB0aGlzLl9zZXRCdXR0b25XaWR0aCgpO1xuXG4gICAgICB0aGlzLnVwZGF0ZSh0cnVlKTtcblxuICAgICAgLy8gYnJvYWRjYXN0IHJlZnJlc2ggZXZlbnQ7IHVzZWZ1bCBmb3Igd2lkZ2V0c1xuICAgICAgaWYoIWluaXQpIHtcbiAgICAgICAgdGhpcy5fdHJpZ2dlcigncmVmcmVzaCcpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyB1cGRhdGVzIHRoZSBidXR0b24gdGV4dC4gY2FsbCByZWZyZXNoKCkgdG8gcmVidWlsZFxuICAgIHVwZGF0ZTogZnVuY3Rpb24oaXNEZWZhdWx0KSB7XG4gICAgICB2YXIgbyA9IHRoaXMub3B0aW9ucztcbiAgICAgIHZhciAkaW5wdXRzID0gdGhpcy5pbnB1dHM7XG4gICAgICB2YXIgJGNoZWNrZWQgPSAkaW5wdXRzLmZpbHRlcignOmNoZWNrZWQnKTtcbiAgICAgIHZhciBudW1DaGVja2VkID0gJGNoZWNrZWQubGVuZ3RoO1xuICAgICAgdmFyIHZhbHVlO1xuXG4gICAgICBpZihudW1DaGVja2VkID09PSAwKSB7XG4gICAgICAgIHZhbHVlID0gby5ub25lU2VsZWN0ZWRUZXh0O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYoJC5pc0Z1bmN0aW9uKG8uc2VsZWN0ZWRUZXh0KSkge1xuICAgICAgICAgIHZhbHVlID0gby5zZWxlY3RlZFRleHQuY2FsbCh0aGlzLCBudW1DaGVja2VkLCAkaW5wdXRzLmxlbmd0aCwgJGNoZWNrZWQuZ2V0KCkpO1xuICAgICAgICB9IGVsc2UgaWYoL1xcZC8udGVzdChvLnNlbGVjdGVkTGlzdCkgJiYgby5zZWxlY3RlZExpc3QgPiAwICYmIG51bUNoZWNrZWQgPD0gby5zZWxlY3RlZExpc3QpIHtcbiAgICAgICAgICB2YWx1ZSA9ICRjaGVja2VkLm1hcChmdW5jdGlvbigpIHsgcmV0dXJuICQodGhpcykubmV4dCgpLnRleHQoKTsgfSkuZ2V0KCkuam9pbihvLnNlbGVjdGVkTGlzdFNlcGFyYXRvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsdWUgPSBvLnNlbGVjdGVkVGV4dC5yZXBsYWNlKCcjJywgbnVtQ2hlY2tlZCkucmVwbGFjZSgnIycsICRpbnB1dHMubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLl9zZXRCdXR0b25WYWx1ZSh2YWx1ZSk7XG4gICAgICBpZihpc0RlZmF1bHQpIHtcbiAgICAgICAgdGhpcy5idXR0b25bMF0uZGVmYXVsdFZhbHVlID0gdmFsdWU7XG4gICAgICB9XG5cbiAgICB9LFxuXG4gICAgLy8gdGhpcyBleGlzdHMgYXMgYSBzZXBhcmF0ZSBtZXRob2Qgc28gdGhhdCB0aGUgZGV2ZWxvcGVyXG4gICAgLy8gY2FuIGVhc2lseSBvdmVycmlkZSBpdC5cbiAgICBfc2V0QnV0dG9uVmFsdWU6IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgICB0aGlzLmJ1dHRvbmxhYmVsLnRleHQodmFsdWUpO1xuICAgIH0sXG5cbiAgICBfYmluZEJ1dHRvbkV2ZW50czogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICB2YXIgYnV0dG9uID0gdGhpcy5idXR0b247XG4gICAgICBmdW5jdGlvbiBjbGlja0hhbmRsZXIoKSB7XG4gICAgICAgIHNlbGZbIHNlbGYuX2lzT3BlbiA/ICdjbG9zZScgOiAnb3BlbicgXSgpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIHdlYmtpdCBkb2Vzbid0IGxpa2UgaXQgd2hlbiB5b3UgY2xpY2sgb24gdGhlIHNwYW4gOihcbiAgICAgIGJ1dHRvblxuICAgICAgICAuZmluZCgnc3BhbicpXG4gICAgICAgIC5iaW5kKCdjbGljay5tdWx0aXNlbGVjdCcsIGNsaWNrSGFuZGxlcik7XG5cbiAgICAgIC8vIGJ1dHRvbiBldmVudHNcbiAgICAgIGJ1dHRvbi5iaW5kKHtcbiAgICAgICAgY2xpY2s6IGNsaWNrSGFuZGxlcixcbiAgICAgICAga2V5cHJlc3M6IGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICBzd2l0Y2goZS53aGljaCkge1xuICAgICAgICAgICAgY2FzZSAyNzogLy8gZXNjXG4gICAgICAgICAgICBjYXNlIDM4OiAvLyB1cFxuICAgICAgICAgICAgY2FzZSAzNzogLy8gbGVmdFxuICAgICAgICAgICAgICBzZWxmLmNsb3NlKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAzOTogLy8gcmlnaHRcbiAgICAgICAgICAgIGNhc2UgNDA6IC8vIGRvd25cbiAgICAgICAgICAgICAgc2VsZi5vcGVuKCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW91c2VlbnRlcjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYoIWJ1dHRvbi5oYXNDbGFzcygndWktc3RhdGUtZGlzYWJsZWQnKSkge1xuICAgICAgICAgICAgJCh0aGlzKS5hZGRDbGFzcygndWktc3RhdGUtaG92ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vdXNlbGVhdmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ3VpLXN0YXRlLWhvdmVyJyk7XG4gICAgICAgIH0sXG4gICAgICAgIGZvY3VzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICBpZighYnV0dG9uLmhhc0NsYXNzKCd1aS1zdGF0ZS1kaXNhYmxlZCcpKSB7XG4gICAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCd1aS1zdGF0ZS1mb2N1cycpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgYmx1cjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygndWktc3RhdGUtZm9jdXMnKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIF9iaW5kTWVudUV2ZW50czogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAvLyBvcHRncm91cCBsYWJlbCB0b2dnbGUgc3VwcG9ydFxuICAgICAgdGhpcy5tZW51LmRlbGVnYXRlKCcudWktbXVsdGlzZWxlY3Qtb3B0Z3JvdXAgYScsICdjbGljay5tdWx0aXNlbGVjdCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7XG4gICAgICAgIHZhciAkaW5wdXRzID0gJHRoaXMucGFyZW50KCkuZmluZCgnaW5wdXQ6dmlzaWJsZTpub3QoOmRpc2FibGVkKScpO1xuICAgICAgICB2YXIgbm9kZXMgPSAkaW5wdXRzLmdldCgpO1xuICAgICAgICB2YXIgbGFiZWwgPSAkdGhpcy50ZXh0KCk7XG5cbiAgICAgICAgLy8gdHJpZ2dlciBldmVudCBhbmQgYmFpbCBpZiB0aGUgcmV0dXJuIGlzIGZhbHNlXG4gICAgICAgIGlmKHNlbGYuX3RyaWdnZXIoJ2JlZm9yZW9wdGdyb3VwdG9nZ2xlJywgZSwgeyBpbnB1dHM6bm9kZXMsIGxhYmVsOmxhYmVsIH0pID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRvZ2dsZSBpbnB1dHNcbiAgICAgICAgc2VsZi5fdG9nZ2xlQ2hlY2tlZChcbiAgICAgICAgICAkaW5wdXRzLmZpbHRlcignOmNoZWNrZWQnKS5sZW5ndGggIT09ICRpbnB1dHMubGVuZ3RoLFxuICAgICAgICAgICRpbnB1dHNcbiAgICAgICAgKTtcblxuICAgICAgICBzZWxmLl90cmlnZ2VyKCdvcHRncm91cHRvZ2dsZScsIGUsIHtcbiAgICAgICAgICBpbnB1dHM6IG5vZGVzLFxuICAgICAgICAgIGxhYmVsOiBsYWJlbCxcbiAgICAgICAgICBjaGVja2VkOiBub2Rlcy5sZW5ndGggPyBub2Rlc1swXS5jaGVja2VkIDogbnVsbFxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAuZGVsZWdhdGUoJ2xhYmVsJywgJ21vdXNlZW50ZXIubXVsdGlzZWxlY3QnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYoISQodGhpcykuaGFzQ2xhc3MoJ3VpLXN0YXRlLWRpc2FibGVkJykpIHtcbiAgICAgICAgICBzZWxmLmxhYmVscy5yZW1vdmVDbGFzcygndWktc3RhdGUtaG92ZXInKTtcbiAgICAgICAgICAkKHRoaXMpLmFkZENsYXNzKCd1aS1zdGF0ZS1ob3ZlcicpLmZpbmQoJ2lucHV0JykuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIC5kZWxlZ2F0ZSgnbGFiZWwnLCAna2V5ZG93bi5tdWx0aXNlbGVjdCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgaWYoZS53aGljaCA9PT0gODIpIHtcbiAgICAgICAgICByZXR1cm47IC8vXCJyXCIga2V5LCBvZnRlbiB1c2VkIGZvciByZWxvYWQuXG4gICAgICAgIH1cbiAgICAgICAgaWYoZS53aGljaCA+IDExMSAmJiBlLndoaWNoIDwgMTI0KSB7XG4gICAgICAgICAgcmV0dXJuOyAvL0tleWJvYXJkIGZ1bmN0aW9uIGtleXMuXG4gICAgICAgIH1cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzd2l0Y2goZS53aGljaCkge1xuICAgICAgICAgIGNhc2UgOTogLy8gdGFiXG4gICAgICAgICAgICBpZihlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICAgIHNlbGYubWVudS5maW5kKFwiLnVpLXN0YXRlLWhvdmVyXCIpLnJlbW92ZUNsYXNzKFwidWktc3RhdGUtaG92ZXJcIik7XG4gICAgICAgICAgICAgIHNlbGYuaGVhZGVyLmZpbmQoXCJsaVwiKS5sYXN0KCkuZmluZChcImFcIikuZm9jdXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNlbGYuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMjc6IC8vIGVzY1xuICAgICAgICAgICAgc2VsZi5jbG9zZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAzODogLy8gdXBcbiAgICAgICAgICBjYXNlIDQwOiAvLyBkb3duXG4gICAgICAgICAgY2FzZSAzNzogLy8gbGVmdFxuICAgICAgICAgIGNhc2UgMzk6IC8vIHJpZ2h0XG4gICAgICAgICAgICBzZWxmLl90cmF2ZXJzZShlLndoaWNoLCB0aGlzKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTM6IC8vIGVudGVyXG4gICAgICAgICAgY2FzZSAzMjpcbiAgICAgICAgICAgICQodGhpcykuZmluZCgnaW5wdXQnKVswXS5jbGljaygpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA2NTpcbiAgICAgICAgICAgIGlmKGUuYWx0S2V5KSB7XG4gICAgICAgICAgICAgIHNlbGYuY2hlY2tBbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgODU6XG4gICAgICAgICAgICBpZihlLmFsdEtleSkge1xuICAgICAgICAgICAgICBzZWxmLnVuY2hlY2tBbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICAgLmRlbGVnYXRlKCdpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0sIGlucHV0W3R5cGU9XCJyYWRpb1wiXScsICdjbGljay5tdWx0aXNlbGVjdCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKTtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMudmFsdWU7XG4gICAgICAgIHZhciBvcHRpb25UZXh0ID0gJHRoaXMucGFyZW50KCkuZmluZChcInNwYW5cIikudGV4dCgpO1xuICAgICAgICB2YXIgY2hlY2tlZCA9IHRoaXMuY2hlY2tlZDtcbiAgICAgICAgdmFyIHRhZ3MgPSBzZWxmLmVsZW1lbnQuZmluZCgnb3B0aW9uJyk7XG5cbiAgICAgICAgLy8gYmFpbCBpZiB0aGlzIGlucHV0IGlzIGRpc2FibGVkIG9yIHRoZSBldmVudCBpcyBjYW5jZWxsZWRcbiAgICAgICAgaWYodGhpcy5kaXNhYmxlZCB8fCBzZWxmLl90cmlnZ2VyKCdjbGljaycsIGUsIHsgdmFsdWU6IHZhbCwgdGV4dDogb3B0aW9uVGV4dCwgY2hlY2tlZDogY2hlY2tlZCB9KSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBpbnB1dCBoYXMgZm9jdXMuIG90aGVyd2lzZSwgdGhlIGVzYyBrZXlcbiAgICAgICAgLy8gd29uJ3QgY2xvc2UgdGhlIG1lbnUgYWZ0ZXIgY2xpY2tpbmcgYW4gaXRlbS5cbiAgICAgICAgJHRoaXMuZm9jdXMoKTtcblxuICAgICAgICAvLyB0b2dnbGUgYXJpYSBzdGF0ZVxuICAgICAgICAkdGhpcy5wcm9wKCdhcmlhLXNlbGVjdGVkJywgY2hlY2tlZCk7XG5cbiAgICAgICAgLy8gY2hhbmdlIHN0YXRlIG9uIHRoZSBvcmlnaW5hbCBvcHRpb24gdGFnc1xuICAgICAgICB0YWdzLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYodGhpcy52YWx1ZSA9PT0gdmFsKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gY2hlY2tlZDtcbiAgICAgICAgICB9IGVsc2UgaWYoIXNlbGYub3B0aW9ucy5tdWx0aXBsZSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gc29tZSBhZGRpdGlvbmFsIHNpbmdsZSBzZWxlY3Qtc3BlY2lmaWMgbG9naWNcbiAgICAgICAgaWYoIXNlbGYub3B0aW9ucy5tdWx0aXBsZSkge1xuICAgICAgICAgIHNlbGYubGFiZWxzLnJlbW92ZUNsYXNzKCd1aS1zdGF0ZS1hY3RpdmUnKTtcbiAgICAgICAgICAkdGhpcy5jbG9zZXN0KCdsYWJlbCcpLnRvZ2dsZUNsYXNzKCd1aS1zdGF0ZS1hY3RpdmUnLCBjaGVja2VkKTtcblxuICAgICAgICAgIC8vIGNsb3NlIG1lbnVcbiAgICAgICAgICBzZWxmLmNsb3NlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaXJlIGNoYW5nZSBvbiB0aGUgc2VsZWN0IGJveFxuICAgICAgICBzZWxmLmVsZW1lbnQudHJpZ2dlcihcImNoYW5nZVwiKTtcblxuICAgICAgICAvLyBzZXRUaW1lb3V0IGlzIHRvIGZpeCBtdWx0aXNlbGVjdCBpc3N1ZSAjMTQgYW5kICM0Ny4gY2F1c2VkIGJ5IGpRdWVyeSBpc3N1ZSAjMzgyN1xuICAgICAgICAvLyBodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8zODI3XG4gICAgICAgIHNldFRpbWVvdXQoJC5wcm94eShzZWxmLnVwZGF0ZSwgc2VsZiksIDEwKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBfYmluZEhlYWRlckV2ZW50czogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAvLyBoZWFkZXIgbGlua3NcbiAgICAgIHRoaXMuaGVhZGVyLmRlbGVnYXRlKCdhJywgJ2NsaWNrLm11bHRpc2VsZWN0JywgZnVuY3Rpb24oZSkge1xuICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpO1xuICAgICAgICBpZigkdGhpcy5oYXNDbGFzcygndWktbXVsdGlzZWxlY3QtY2xvc2UnKSkge1xuICAgICAgICAgIHNlbGYuY2xvc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmKCR0aGlzLmhhc0NsYXNzKFwidWktbXVsdGlzZWxlY3QtYWxsXCIpKSB7XG4gICAgICAgICAgc2VsZi5jaGVja0FsbCgpO1xuICAgICAgICB9IGVsc2UgaWYoJHRoaXMuaGFzQ2xhc3MoXCJ1aS1tdWx0aXNlbGVjdC1ub25lXCIpKSB7XG4gICAgICAgICAgc2VsZi51bmNoZWNrQWxsKCk7XG4gICAgICAgIH1cbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfSkuZGVsZWdhdGUoJ2EnLCAna2V5ZG93bi5tdWx0aXNlbGVjdCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgc3dpdGNoKGUud2hpY2gpIHtcbiAgICAgICAgICBjYXNlIDI3OlxuICAgICAgICAgICAgc2VsZi5jbG9zZSgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSA5OlxuICAgICAgICAgICAgdmFyICR0YXJnZXQgPSAkKGUudGFyZ2V0KTtcbiAgICAgICAgICAgIGlmKChlLnNoaWZ0S2V5ICYmICEkdGFyZ2V0LnBhcmVudCgpLnByZXYoKS5sZW5ndGggJiYgIXNlbGYuaGVhZGVyLmZpbmQoXCIudWktbXVsdGlzZWxlY3QtZmlsdGVyXCIpLmxlbmd0aCkgfHwgKCEkdGFyZ2V0LnBhcmVudCgpLm5leHQoKS5sZW5ndGggJiYgIXNlbGYubGFiZWxzLmxlbmd0aCAmJiAhZS5zaGlmdEtleSkpIHtcbiAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpO1xuICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIGJpbmRzIGV2ZW50c1xuICAgIF9iaW5kRXZlbnRzOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcblxuICAgICAgdGhpcy5fYmluZEJ1dHRvbkV2ZW50cygpO1xuICAgICAgdGhpcy5fYmluZE1lbnVFdmVudHMoKTtcbiAgICAgIHRoaXMuX2JpbmRIZWFkZXJFdmVudHMoKTtcblxuICAgICAgLy8gY2xvc2UgZWFjaCB3aWRnZXQgd2hlbiBjbGlja2luZyBvbiBhbnkgb3RoZXIgZWxlbWVudC9hbnl3aGVyZSBlbHNlIG9uIHRoZSBwYWdlXG4gICAgICAkZG9jLmJpbmQoJ21vdXNlZG93bi4nICsgc2VsZi5fbmFtZXNwYWNlSUQsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG5cbiAgICAgICAgaWYoc2VsZi5faXNPcGVuICYmXG4gICAgICAgICAgICB0YXJnZXQgIT09IHNlbGYuYnV0dG9uWzBdICYmXG4gICAgICAgICAgICB0YXJnZXQgIT09IHNlbGYubWVudVswXSAmJlxuICAgICAgICAgICAgISQuY29udGFpbnMoc2VsZi5tZW51WzBdLCB0YXJnZXQpICYmXG4gICAgICAgICAgICAhJC5jb250YWlucyhzZWxmLmJ1dHRvblswXSwgdGFyZ2V0KVxuICAgICAgICAgICkge1xuICAgICAgICAgIHNlbGYuY2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIGRlYWwgd2l0aCBmb3JtIHJlc2V0cy4gIHRoZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCBidXR0b25zIGFyZW4ndFxuICAgICAgLy8gcmVzdG9yZWQgdG8gdGhlaXIgZGVmYXVsdFZhbHVlIHByb3Agb24gZm9ybSByZXNldCwgYW5kIHRoZSByZXNldFxuICAgICAgLy8gaGFuZGxlciBmaXJlcyBiZWZvcmUgdGhlIGZvcm0gaXMgYWN0dWFsbHkgcmVzZXQuICBkZWxheWluZyBpdCBhIGJpdFxuICAgICAgLy8gZ2l2ZXMgdGhlIGZvcm0gaW5wdXRzIHRpbWUgdG8gY2xlYXIuXG4gICAgICAkKHRoaXMuZWxlbWVudFswXS5mb3JtKS5iaW5kKCdyZXNldC4nICsgdGhpcy5fbmFtZXNwYWNlSUQsIGZ1bmN0aW9uKCkge1xuICAgICAgICBzZXRUaW1lb3V0KCQucHJveHkoc2VsZi5yZWZyZXNoLCBzZWxmKSwgMTApO1xuICAgICAgfSk7XG4gICAgfSxcbiAgICBfZ2V0TWluV2lkdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG1pblZhbCA9IHRoaXMub3B0aW9ucy5taW5XaWR0aDtcbiAgICAgIHZhciB3aWR0aCA9IDA7XG4gICAgICBzd2l0Y2ggKHR5cGVvZiBtaW5WYWwpIHtcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgICB3aWR0aCA9IG1pblZhbDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICB2YXIgbGFzdENoYXIgPSBtaW5WYWxbIG1pblZhbC5sZW5ndGggLTEgXTtcbiAgICAgICAgICB3aWR0aCA9IG1pblZhbC5tYXRjaCgvXFxkKy8pO1xuICAgICAgICAgIGlmKGxhc3RDaGFyID09PSAnJScpIHtcbiAgICAgICAgICAgIHdpZHRoID0gbWluVmFsO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3aWR0aCA9IHBhcnNlSW50KG1pblZhbCwgMTApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHJldHVybiB3aWR0aDtcbiAgICB9LFxuICAgIC8vIHNldCBidXR0b24gd2lkdGhcbiAgICBfc2V0QnV0dG9uV2lkdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIHdpZHRoID0gdGhpcy5fZ2V0TWluV2lkdGgoKTtcblxuICAgICAgLy8gc2V0IHdpZHRoc1xuICAgICAgdGhpcy5idXR0b24ub3V0ZXJXaWR0aCh3aWR0aCk7XG4gICAgfSxcblxuICAgIC8vIHNldCBtZW51IHdpZHRoXG4gICAgX3NldE1lbnVXaWR0aDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgbSA9IHRoaXMubWVudTtcbiAgICAgIHZhciB3aWR0aCA9ICh0aGlzLmJ1dHRvbi5vdXRlcldpZHRoKCkgPD0gMCkgPyB0aGlzLl9nZXRNaW5XaWR0aCgpIDogdGhpcy5idXR0b24ub3V0ZXJXaWR0aCgpO1xuICAgICAgbS5vdXRlcldpZHRoKHRoaXMub3B0aW9ucy5tZW51V2lkdGggfHwgd2lkdGgpO1xuICAgIH0sXG5cbiAgICBfc2V0TWVudUhlaWdodDogZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaGVhZGVySGVpZ2h0ID0gdGhpcy5tZW51LmNoaWxkcmVuKFwiLnVpLW11bHRpc2VsZWN0LWhlYWRlcjp2aXNpYmxlXCIpLm91dGVySGVpZ2h0KHRydWUpO1xuICAgICAgdmFyIHVsSGVpZ2h0ID0gMDtcbiAgICAgIHRoaXMubWVudS5maW5kKFwiLnVpLW11bHRpc2VsZWN0LWNoZWNrYm94ZXMgbGksIC51aS1tdWx0aXNlbGVjdC1jaGVja2JveGVzIGFcIikuZWFjaChmdW5jdGlvbihpZHgsIGxpKSB7XG4gICAgICAgIHVsSGVpZ2h0ICs9ICQobGkpLm91dGVySGVpZ2h0KHRydWUpO1xuICAgICAgfSk7XG4gICAgICBpZih1bEhlaWdodCA+IHRoaXMub3B0aW9ucy5oZWlnaHQpIHtcbiAgICAgICAgdGhpcy5tZW51LmNoaWxkcmVuKFwiLnVpLW11bHRpc2VsZWN0LWNoZWNrYm94ZXNcIikuY3NzKFwib3ZlcmZsb3dcIiwgXCJhdXRvXCIpO1xuICAgICAgICB1bEhlaWdodCA9IHRoaXMub3B0aW9ucy5oZWlnaHQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLm1lbnUuY2hpbGRyZW4oXCIudWktbXVsdGlzZWxlY3QtY2hlY2tib3hlc1wiKS5jc3MoXCJvdmVyZmxvd1wiLCBcImhpZGRlblwiKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5tZW51LmNoaWxkcmVuKFwiLnVpLW11bHRpc2VsZWN0LWNoZWNrYm94ZXNcIikuaGVpZ2h0KHVsSGVpZ2h0KTtcbiAgICAgIHRoaXMubWVudS5oZWlnaHQodWxIZWlnaHQgKyBoZWFkZXJIZWlnaHQpO1xuICAgIH0sXG5cbiAgICBfcmVzaXplTWVudTogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLl9zZXRNZW51V2lkdGgoKTtcbiAgICAgIHRoaXMuX3NldE1lbnVIZWlnaHQoKTtcbiAgICB9LFxuXG4gICAgLy8gbW92ZSB1cCBvciBkb3duIHdpdGhpbiB0aGUgbWVudVxuICAgIF90cmF2ZXJzZTogZnVuY3Rpb24od2hpY2gsIHN0YXJ0KSB7XG4gICAgICB2YXIgJHN0YXJ0ID0gJChzdGFydCk7XG4gICAgICB2YXIgbW92ZVRvTGFzdCA9IHdoaWNoID09PSAzOCB8fCB3aGljaCA9PT0gMzc7XG5cbiAgICAgIC8vIHNlbGVjdCB0aGUgZmlyc3QgbGkgdGhhdCBpc24ndCBhbiBvcHRncm91cCBsYWJlbCAvIGRpc2FibGVkXG4gICAgICB2YXIgJG5leHQgPSAkc3RhcnQucGFyZW50KClbbW92ZVRvTGFzdCA/ICdwcmV2QWxsJyA6ICduZXh0QWxsJ10oJ2xpOm5vdCgudWktbXVsdGlzZWxlY3QtZGlzYWJsZWQsIC51aS1tdWx0aXNlbGVjdC1vcHRncm91cCk6dmlzaWJsZScpLmZpcnN0KCk7XG4gICAgICAvLyB3ZSBtaWdodCBoYXZlIHRvIGp1bXAgdG8gdGhlIG5leHQvcHJldmlvdXMgb3B0aW9uIGdyb3VwXG4gICAgICBpZighJG5leHQubGVuZ3RoKSB7XG4gICAgICAgICRuZXh0ID0gJHN0YXJ0LnBhcmVudHMoXCIudWktbXVsdGlzZWxlY3Qtb3B0Z3JvdXBcIilbbW92ZVRvTGFzdCA/IFwicHJldlwiIDogXCJuZXh0XCIgXSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBpZiBhdCB0aGUgZmlyc3QvbGFzdCBlbGVtZW50XG4gICAgICBpZighJG5leHQubGVuZ3RoKSB7XG4gICAgICAgIHZhciAkY29udGFpbmVyID0gdGhpcy5tZW51LmZpbmQoJ3VsJykubGFzdCgpO1xuXG4gICAgICAgIC8vIG1vdmUgdG8gdGhlIGZpcnN0L2xhc3RcbiAgICAgICAgdGhpcy5tZW51LmZpbmQoJ2xhYmVsOnZpc2libGUnKVsgbW92ZVRvTGFzdCA/ICdsYXN0JyA6ICdmaXJzdCcgXSgpLnRyaWdnZXIoJ21vdXNlb3ZlcicpO1xuXG4gICAgICAgIC8vIHNldCBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgJGNvbnRhaW5lci5zY3JvbGxUb3AobW92ZVRvTGFzdCA/ICRjb250YWluZXIuaGVpZ2h0KCkgOiAwKTtcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJG5leHQuZmluZCgnbGFiZWw6dmlzaWJsZScpWyBtb3ZlVG9MYXN0ID8gXCJsYXN0XCIgOiBcImZpcnN0XCIgXSgpLnRyaWdnZXIoJ21vdXNlb3ZlcicpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBUaGlzIGlzIGFuIGludGVybmFsIGZ1bmN0aW9uIHRvIHRvZ2dsZSB0aGUgY2hlY2tlZCBwcm9wZXJ0eSBhbmRcbiAgICAvLyBvdGhlciByZWxhdGVkIGF0dHJpYnV0ZXMgb2YgYSBjaGVja2JveC5cbiAgICAvL1xuICAgIC8vIFRoZSBjb250ZXh0IG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGEgY2hlY2tib3g7IGRvIG5vdCBwcm94eSBpdC5cbiAgICBfdG9nZ2xlU3RhdGU6IGZ1bmN0aW9uKHByb3AsIGZsYWcpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYoIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICB0aGlzWyBwcm9wIF0gPSBmbGFnO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoZmxhZykge1xuICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgdHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgX3RvZ2dsZUNoZWNrZWQ6IGZ1bmN0aW9uKGZsYWcsIGdyb3VwKSB7XG4gICAgICB2YXIgJGlucHV0cyA9IChncm91cCAmJiBncm91cC5sZW5ndGgpID8gIGdyb3VwIDogdGhpcy5pbnB1dHM7XG4gICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgIC8vIHRvZ2dsZSBzdGF0ZSBvbiBpbnB1dHNcbiAgICAgICRpbnB1dHMuZWFjaCh0aGlzLl90b2dnbGVTdGF0ZSgnY2hlY2tlZCcsIGZsYWcpKTtcblxuICAgICAgLy8gZ2l2ZSB0aGUgZmlyc3QgaW5wdXQgZm9jdXNcbiAgICAgICRpbnB1dHMuZXEoMCkuZm9jdXMoKTtcblxuICAgICAgLy8gdXBkYXRlIGJ1dHRvbiB0ZXh0XG4gICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAvLyBnYXRoZXIgYW4gYXJyYXkgb2YgdGhlIHZhbHVlcyB0aGF0IGFjdHVhbGx5IGNoYW5nZWRcbiAgICAgIHZhciB2YWx1ZXMgPSB7fTtcbiAgICAgICRpbnB1dHMuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFsdWVzW3RoaXMudmFsdWVdID0gdHJ1ZTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyB0b2dnbGUgc3RhdGUgb24gb3JpZ2luYWwgb3B0aW9uIHRhZ3NcbiAgICAgIHRoaXMuZWxlbWVudFxuICAgICAgICAuZmluZCgnb3B0aW9uJylcbiAgICAgICAgLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgaWYoIXRoaXMuZGlzYWJsZWQgJiYgdmFsdWVzW3RoaXMudmFsdWVdKSB7XG4gICAgICAgICAgICBzZWxmLl90b2dnbGVTdGF0ZSgnc2VsZWN0ZWQnLCBmbGFnKS5jYWxsKHRoaXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIHRyaWdnZXIgdGhlIGNoYW5nZSBldmVudCBvbiB0aGUgc2VsZWN0XG4gICAgICBpZigkaW5wdXRzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQudHJpZ2dlcihcImNoYW5nZVwiKTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgX3RvZ2dsZURpc2FibGVkOiBmdW5jdGlvbihmbGFnKSB7XG4gICAgICB0aGlzLmJ1dHRvbi5wcm9wKHsgJ2Rpc2FibGVkJzpmbGFnLCAnYXJpYS1kaXNhYmxlZCc6ZmxhZyB9KVsgZmxhZyA/ICdhZGRDbGFzcycgOiAncmVtb3ZlQ2xhc3MnIF0oJ3VpLXN0YXRlLWRpc2FibGVkJyk7XG5cbiAgICAgIGlmKHRoaXMub3B0aW9ucy5kaXNhYmxlSW5wdXRzT25Ub2dnbGUpIHtcbiAgICAgICAgdmFyIGNoZWNrYm94ZXMgPSB0aGlzLm1lbnUuZmluZChcIi51aS1tdWx0aXNlbGVjdC1jaGVja2JveGVzXCIpLmdldCgwKTtcbiAgICAgICAgdmFyIG1hdGNoZWRJbnB1dHMgPSBbXTtcbiAgICAgICAgdmFyIGtleSA9IFwiZWNoLW11bHRpc2VsZWN0LWRpc2FibGVkXCI7XG4gICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgaWYoZmxhZykge1xuICAgICAgICAgIC8vIHJlbWVtYmVyIHdoaWNoIGVsZW1lbnRzIHRoaXMgd2lkZ2V0IGRpc2FibGVkIChub3QgcHJlLWRpc2FibGVkKVxuICAgICAgICAgIC8vIGVsZW1lbnRzLCBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlc3RvcmVkIGlmIHRoZSB3aWRnZXQgaXMgcmUtZW5hYmxlZC5cbiAgICAgICAgICBtYXRjaGVkSW5wdXRzID0gY2hlY2tib3hlcy5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXQ6ZW5hYmxlZFwiKTtcbiAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBtYXRjaGVkSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBtYXRjaGVkSW5wdXRzW2ldLnNldEF0dHJpYnV0ZShrZXksIHRydWUpO1xuICAgICAgICAgICAgbWF0Y2hlZElucHV0c1tpXS5zZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiLCBcImRpc2FibGVkXCIpO1xuICAgICAgICAgICAgbWF0Y2hlZElucHV0c1tpXS5zZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIsIFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICBtYXRjaGVkSW5wdXRzW2ldLnBhcmVudE5vZGUuY2xhc3NOYW1lID0gbWF0Y2hlZElucHV0c1tpXS5wYXJlbnROb2RlLmNsYXNzTmFtZSArIFwiIHVpLXN0YXRlLWRpc2FibGVkXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hdGNoZWRJbnB1dHMgPSBjaGVja2JveGVzLnF1ZXJ5U2VsZWN0b3JBbGwoXCJpbnB1dDpkaXNhYmxlZFwiKTtcbiAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBtYXRjaGVkSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZihtYXRjaGVkSW5wdXRzW2ldLmhhc0F0dHJpYnV0ZShrZXkpKSB7XG4gICAgICAgICAgICAgIG1hdGNoZWRJbnB1dHNbaV0ucmVtb3ZlQXR0cmlidXRlKGtleSk7XG4gICAgICAgICAgICAgIG1hdGNoZWRJbnB1dHNbaV0ucmVtb3ZlQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgIG1hdGNoZWRJbnB1dHNbaV0ucmVtb3ZlQXR0cmlidXRlKFwiYXJpYS1kaXNhYmxlZFwiKTtcbiAgICAgICAgICAgICAgbWF0Y2hlZElucHV0c1tpXS5wYXJlbnROb2RlLmNsYXNzTmFtZSA9IG1hdGNoZWRJbnB1dHNbaV0ucGFyZW50Tm9kZS5jbGFzc05hbWUucmVwbGFjZShcIiB1aS1zdGF0ZS1kaXNhYmxlZFwiLCBcIlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5lbGVtZW50LnByb3Aoe1xuICAgICAgICAnZGlzYWJsZWQnOmZsYWcsXG4gICAgICAgICdhcmlhLWRpc2FibGVkJzpmbGFnXG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gb3BlbiB0aGUgbWVudVxuICAgIG9wZW46IGZ1bmN0aW9uKGUpIHtcbiAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgIHZhciBidXR0b24gPSB0aGlzLmJ1dHRvbjtcbiAgICAgIHZhciBtZW51ID0gdGhpcy5tZW51O1xuICAgICAgdmFyIHNwZWVkID0gdGhpcy5zcGVlZDtcbiAgICAgIHZhciBvID0gdGhpcy5vcHRpb25zO1xuICAgICAgdmFyIGFyZ3MgPSBbXTtcblxuICAgICAgLy8gYmFpbCBpZiB0aGUgbXVsdGlzZWxlY3RvcGVuIGV2ZW50IHJldHVybnMgZmFsc2UsIHRoaXMgd2lkZ2V0IGlzIGRpc2FibGVkLCBvciBpcyBhbHJlYWR5IG9wZW5cbiAgICAgIGlmKHRoaXMuX3RyaWdnZXIoJ2JlZm9yZW9wZW4nKSA9PT0gZmFsc2UgfHwgYnV0dG9uLmhhc0NsYXNzKCd1aS1zdGF0ZS1kaXNhYmxlZCcpIHx8IHRoaXMuX2lzT3Blbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciAkY29udGFpbmVyID0gbWVudS5maW5kKCcudWktbXVsdGlzZWxlY3QtY2hlY2tib3hlcycpO1xuICAgICAgdmFyIGVmZmVjdCA9IG8uc2hvdztcblxuICAgICAgLy8gZmlndXJlIG91dCBvcGVuaW5nIGVmZmVjdHMvc3BlZWRzXG4gICAgICBpZigkLmlzQXJyYXkoby5zaG93KSkge1xuICAgICAgICBlZmZlY3QgPSBvLnNob3dbMF07XG4gICAgICAgIHNwZWVkID0gby5zaG93WzFdIHx8IHNlbGYuc3BlZWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIGlmIHRoZXJlJ3MgYW4gZWZmZWN0LCBhc3N1bWUgalF1ZXJ5IFVJIGlzIGluIHVzZVxuICAgICAgLy8gYnVpbGQgdGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHNob3coKVxuICAgICAgaWYoZWZmZWN0KSB7XG4gICAgICAgIGFyZ3MgPSBbIGVmZmVjdCwgc3BlZWQgXTtcbiAgICAgIH1cblxuICAgICAgLy8gc2V0IHRoZSBzY3JvbGwgb2YgdGhlIGNoZWNrYm94IGNvbnRhaW5lclxuICAgICAgJGNvbnRhaW5lci5zY3JvbGxUb3AoMCk7XG5cbiAgICAgIC8vIHNob3cgdGhlIG1lbnUsIG1heWJlIHdpdGggYSBzcGVlZC9lZmZlY3QgY29tYm9cbiAgICAgICQuZm4uc2hvdy5hcHBseShtZW51LCBhcmdzKTtcblxuICAgICAgdGhpcy5fcmVzaXplTWVudSgpO1xuICAgICAgLy8gcG9zaXRvblxuICAgICAgdGhpcy5wb3NpdGlvbigpO1xuXG5cbiAgICAgIC8vIHNlbGVjdCB0aGUgZmlyc3Qgbm90IGRpc2FibGVkIG9wdGlvbiBvciB0aGUgZmlsdGVyIGlucHV0IGlmIGF2YWlsYWJsZVxuICAgICAgdmFyIGZpbHRlciA9IHRoaXMuaGVhZGVyLmZpbmQoXCIudWktbXVsdGlzZWxlY3QtZmlsdGVyXCIpO1xuICAgICAgaWYoZmlsdGVyLmxlbmd0aCkge1xuICAgICAgICBmaWx0ZXIuZmlyc3QoKS5maW5kKCdpbnB1dCcpLnRyaWdnZXIoJ2ZvY3VzJyk7XG4gICAgICB9IGVsc2UgaWYodGhpcy5sYWJlbHMubGVuZ3RoKXtcbiAgICAgICAgdGhpcy5sYWJlbHMuZmlsdGVyKCc6bm90KC51aS1zdGF0ZS1kaXNhYmxlZCknKS5lcSgwKS50cmlnZ2VyKCdtb3VzZW92ZXInKS50cmlnZ2VyKCdtb3VzZWVudGVyJykuZmluZCgnaW5wdXQnKS50cmlnZ2VyKCdmb2N1cycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oZWFkZXIuZmluZCgnYScpLmZpcnN0KCkudHJpZ2dlcignZm9jdXMnKTtcbiAgICAgIH1cblxuXG4gICAgICBidXR0b24uYWRkQ2xhc3MoJ3VpLXN0YXRlLWFjdGl2ZScpO1xuICAgICAgdGhpcy5faXNPcGVuID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3RyaWdnZXIoJ29wZW4nKTtcbiAgICB9LFxuXG4gICAgLy8gY2xvc2UgdGhlIG1lbnVcbiAgICBjbG9zZTogZnVuY3Rpb24oKSB7XG4gICAgICBpZih0aGlzLl90cmlnZ2VyKCdiZWZvcmVjbG9zZScpID09PSBmYWxzZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBvID0gdGhpcy5vcHRpb25zO1xuICAgICAgdmFyIGVmZmVjdCA9IG8uaGlkZTtcbiAgICAgIHZhciBzcGVlZCA9IHRoaXMuc3BlZWQ7XG4gICAgICB2YXIgYXJncyA9IFtdO1xuXG4gICAgICAvLyBmaWd1cmUgb3V0IG9wZW5pbmcgZWZmZWN0cy9zcGVlZHNcbiAgICAgIGlmKCQuaXNBcnJheShvLmhpZGUpKSB7XG4gICAgICAgIGVmZmVjdCA9IG8uaGlkZVswXTtcbiAgICAgICAgc3BlZWQgPSBvLmhpZGVbMV0gfHwgdGhpcy5zcGVlZDtcbiAgICAgIH1cblxuICAgICAgaWYoZWZmZWN0KSB7XG4gICAgICAgIGFyZ3MgPSBbIGVmZmVjdCwgc3BlZWQgXTtcbiAgICAgIH1cblxuICAgICAgJC5mbi5oaWRlLmFwcGx5KHRoaXMubWVudSwgYXJncyk7XG4gICAgICB0aGlzLmJ1dHRvbi5yZW1vdmVDbGFzcygndWktc3RhdGUtYWN0aXZlJykudHJpZ2dlcignYmx1cicpLnRyaWdnZXIoJ21vdXNlbGVhdmUnKTtcbiAgICAgIHRoaXMuX2lzT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5fdHJpZ2dlcignY2xvc2UnKTtcbiAgICAgIHRoaXMuYnV0dG9uLnRyaWdnZXIoJ2ZvY3VzJyk7XG4gICAgfSxcblxuICAgIGVuYWJsZTogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLl90b2dnbGVEaXNhYmxlZChmYWxzZSk7XG4gICAgfSxcblxuICAgIGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgdGhpcy5fdG9nZ2xlRGlzYWJsZWQodHJ1ZSk7XG4gICAgfSxcblxuICAgIGNoZWNrQWxsOiBmdW5jdGlvbihlKSB7XG4gICAgICB0aGlzLl90b2dnbGVDaGVja2VkKHRydWUpO1xuICAgICAgdGhpcy5fdHJpZ2dlcignY2hlY2tBbGwnKTtcbiAgICB9LFxuXG4gICAgdW5jaGVja0FsbDogZnVuY3Rpb24oKSB7XG4gICAgICB0aGlzLl90b2dnbGVDaGVja2VkKGZhbHNlKTtcbiAgICAgIHRoaXMuX3RyaWdnZXIoJ3VuY2hlY2tBbGwnKTtcbiAgICB9LFxuXG4gICAgZ2V0Q2hlY2tlZDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW51LmZpbmQoJ2lucHV0JykuZmlsdGVyKCc6Y2hlY2tlZCcpO1xuICAgIH0sXG5cbiAgICBnZXRVbmNoZWNrZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWVudS5maW5kKCdpbnB1dCcpLm5vdCgnOmNoZWNrZWQnKTtcbiAgICB9LFxuXG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAvLyByZW1vdmUgY2xhc3NlcyArIGRhdGFcbiAgICAgICQuV2lkZ2V0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7XG5cbiAgICAgIC8vIHVuYmluZCBldmVudHNcbiAgICAgICRkb2MudW5iaW5kKHRoaXMuX25hbWVzcGFjZUlEKTtcbiAgICAgICQodGhpcy5lbGVtZW50WzBdLmZvcm0pLnVuYmluZCh0aGlzLl9uYW1lc3BhY2VJRCk7XG5cbiAgICAgIHRoaXMuYnV0dG9uLnJlbW92ZSgpO1xuICAgICAgdGhpcy5tZW51LnJlbW92ZSgpO1xuICAgICAgdGhpcy5lbGVtZW50LnNob3coKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGlzT3BlbjogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5faXNPcGVuO1xuICAgIH0sXG5cbiAgICB3aWRnZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubWVudTtcbiAgICB9LFxuXG4gICAgZ2V0QnV0dG9uOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLmJ1dHRvbjtcbiAgICB9LFxuXG4gICAgZ2V0TWVudTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy5tZW51O1xuICAgIH0sXG5cbiAgICBnZXRMYWJlbHM6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMubGFiZWxzO1xuICAgIH0sXG5cbiAgICBhZGRPcHRpb246IGZ1bmN0aW9uKGF0dHJpYnV0ZXMsIHRleHQsIGdyb3VwTGFiZWwpIHtcbiAgICAgIHZhciAkb3B0aW9uID0gJChcIjxvcHRpb24vPlwiKS5hdHRyKGF0dHJpYnV0ZXMpLnRleHQodGV4dCk7XG4gICAgICB2YXIgb3B0aW9uTm9kZSA9ICRvcHRpb24uZ2V0KDApO1xuICAgICAgaWYoZ3JvdXBMYWJlbCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuY2hpbGRyZW4oXCJPUFRHUk9VUFwiKS5maWx0ZXIoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuICQodGhpcykucHJvcChcImxhYmVsXCIpID09PSBncm91cExhYmVsO1xuICAgICAgICB9KS5hcHBlbmQoJG9wdGlvbik7XG4gICAgICAgIHRoaXMubWVudS5maW5kKFwiLnVpLW11bHRpc2VsZWN0LW9wdGdyb3VwXCIpLmZpbHRlcihmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gJCh0aGlzKS5maW5kKFwiYVwiKS50ZXh0KCkgPT09IGdyb3VwTGFiZWw7XG4gICAgICAgIH0pLmFwcGVuZCh0aGlzLl9tYWtlT3B0aW9uKG9wdGlvbk5vZGUpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5hcHBlbmQoJG9wdGlvbik7XG4gICAgICAgIHRoaXMubWVudS5maW5kKFwiLnVpLW11bHRpc2VsZWN0LWNoZWNrYm94ZXNcIikuYXBwZW5kKHRoaXMuX21ha2VPcHRpb24ob3B0aW9uTm9kZSkpO1xuICAgICAgfVxuICAgICAgLy91cGRhdGUgY2FjaGVkIGVsZW1lbnRzXG4gICAgICB0aGlzLmxhYmVscyA9IHRoaXMubWVudS5maW5kKCdsYWJlbCcpO1xuICAgICAgdGhpcy5pbnB1dHMgPSB0aGlzLmxhYmVscy5jaGlsZHJlbignaW5wdXQnKTtcbiAgICB9LFxuXG4gICAgcmVtb3ZlT3B0aW9uOiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgaWYoIXZhbHVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuZWxlbWVudC5maW5kKFwib3B0aW9uW3ZhbHVlPVwiICsgdmFsdWUgKyBcIl1cIikucmVtb3ZlKCk7XG4gICAgICB0aGlzLmxhYmVscy5maW5kKFwiaW5wdXRbdmFsdWU9XCIgKyB2YWx1ZSArIFwiXVwiKS5wYXJlbnRzKFwibGlcIikucmVtb3ZlKCk7XG5cbiAgICAgIC8vdXBkYXRlIGNhY2hlZCBlbGVtZW50c1xuICAgICAgdGhpcy5sYWJlbHMgPSB0aGlzLm1lbnUuZmluZCgnbGFiZWwnKTtcbiAgICAgIHRoaXMuaW5wdXRzID0gdGhpcy5sYWJlbHMuY2hpbGRyZW4oJ2lucHV0Jyk7XG4gICAgfSxcblxuICAgIHBvc2l0aW9uOiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBwb3MgPSB7XG4gICAgICAgIG15OiBcInRvcFwiLFxuICAgICAgICBhdDogXCJib3R0b21cIixcbiAgICAgICAgb2Y6IHRoaXMuYnV0dG9uXG4gICAgICB9O1xuICAgICAgaWYoISQuaXNFbXB0eU9iamVjdCh0aGlzLm9wdGlvbnMucG9zaXRpb24pKSB7XG4gICAgICAgIHBvcy5teSA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbi5teSB8fCBwb3MubXk7XG4gICAgICAgIHBvcy5hdCA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbi5hdCB8fCBwb3MuYXQ7XG4gICAgICAgIHBvcy5vZiA9IHRoaXMub3B0aW9ucy5wb3NpdGlvbi5vZiB8fCBwb3Mub2Y7XG4gICAgICB9XG4gICAgICBpZigkLnVpICYmICQudWkucG9zaXRpb24pIHtcbiAgICAgICAgdGhpcy5tZW51LnBvc2l0aW9uKHBvcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb3MgPSB0aGlzLmJ1dHRvbi5wb3NpdGlvbigpO1xuICAgICAgICBwb3MudG9wICs9IHRoaXMuYnV0dG9uLm91dGVySGVpZ2h0KGZhbHNlKTtcbiAgICAgICAgdGhpcy5tZW51Lm9mZnNldChwb3MpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyByZWFjdCB0byBvcHRpb24gY2hhbmdlcyBhZnRlciBpbml0aWFsaXphdGlvblxuICAgIF9zZXRPcHRpb246IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgIHZhciBtZW51ID0gdGhpcy5tZW51O1xuXG4gICAgICBzd2l0Y2goa2V5KSB7XG4gICAgICAgIGNhc2UgJ2hlYWRlcic6XG4gICAgICAgICAgaWYodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHRoaXMuaGVhZGVyW3ZhbHVlID8gJ3Nob3cnIDogJ2hpZGUnXSgpO1xuICAgICAgICAgIH0gZWxzZSBpZih0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmhlYWRlckxpbmtDb250YWluZXIuY2hpbGRyZW4oXCJsaTpub3QoOmxhc3QtY2hpbGQpXCIpLnJlbW92ZSgpO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJMaW5rQ29udGFpbmVyLnByZXBlbmQoXCI8bGk+XCIgKyB2YWx1ZSArIFwiPC9saT5cIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjaGVja0FsbFRleHQnOlxuICAgICAgICAgIG1lbnUuZmluZCgnYS51aS1tdWx0aXNlbGVjdC1hbGwgc3BhbicpLmVxKC0xKS50ZXh0KHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAndW5jaGVja0FsbFRleHQnOlxuICAgICAgICAgIG1lbnUuZmluZCgnYS51aS1tdWx0aXNlbGVjdC1ub25lIHNwYW4nKS5lcSgtMSkudGV4dCh2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2hlaWdodCc6XG4gICAgICAgICAgdGhpcy5vcHRpb25zW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLl9zZXRNZW51SGVpZ2h0KCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ21pbldpZHRoJzpcbiAgICAgICAgY2FzZSAnbWVudVdpZHRoJzpcbiAgICAgICAgICB0aGlzLm9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMuX3NldEJ1dHRvbldpZHRoKCk7XG4gICAgICAgICAgdGhpcy5fc2V0TWVudVdpZHRoKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkVGV4dCc6XG4gICAgICAgIGNhc2UgJ3NlbGVjdGVkTGlzdCc6XG4gICAgICAgIGNhc2UgJ25vbmVTZWxlY3RlZFRleHQnOlxuICAgICAgICAgIHRoaXMub3B0aW9uc1trZXldID0gdmFsdWU7IC8vIHRoZXNlIGFsbCBuZWVkcyB0byB1cGRhdGUgaW1tZWRpYXRlbHkgZm9yIHRoZSB1cGRhdGUoKSBjYWxsXG4gICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY2xhc3Nlcyc6XG4gICAgICAgICAgbWVudS5hZGQodGhpcy5idXR0b24pLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5jbGFzc2VzKS5hZGRDbGFzcyh2YWx1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ211bHRpcGxlJzpcbiAgICAgICAgICBtZW51LnRvZ2dsZUNsYXNzKCd1aS1tdWx0aXNlbGVjdC1zaW5nbGUnLCAhdmFsdWUpO1xuICAgICAgICAgIHRoaXMub3B0aW9ucy5tdWx0aXBsZSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMuZWxlbWVudFswXS5tdWx0aXBsZSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMudW5jaGVja0FsbCgpO1xuICAgICAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwb3NpdGlvbic6XG4gICAgICAgICAgdGhpcy5wb3NpdGlvbigpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzZWxlY3RlZExpc3RTZXBhcmF0b3InOlxuICAgICAgICAgIHRoaXMub3B0aW9uc1trZXldID0gdmFsdWU7XG4gICAgICAgICAgdGhpcy51cGRhdGUodHJ1ZSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgICQuV2lkZ2V0LnByb3RvdHlwZS5fc2V0T3B0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9KTtcblxufSkoalF1ZXJ5KTtcbiIsIi8vIGV4dHJhY3RlZCBieSBtaW5pLWNzcy1leHRyYWN0LXBsdWdpblxuZXhwb3J0IHt9OyJdLCJuYW1lcyI6WyIkIiwidW5kZWZpbmVkIiwibXVsdGlzZWxlY3RJRCIsIiRkb2MiLCJkb2N1bWVudCIsIndpZGdldCIsIm9wdGlvbnMiLCJoZWFkZXIiLCJoZWlnaHQiLCJtaW5XaWR0aCIsImNsYXNzZXMiLCJjaGVja0FsbFRleHQiLCJ1bmNoZWNrQWxsVGV4dCIsIm5vbmVTZWxlY3RlZFRleHQiLCJzaG93Q2hlY2tBbGwiLCJzaG93VW5jaGVja0FsbCIsInNlbGVjdGVkVGV4dCIsInNlbGVjdGVkTGlzdCIsImNsb3NlSWNvbiIsInNob3ciLCJoaWRlIiwiYXV0b09wZW4iLCJtdWx0aXBsZSIsInBvc2l0aW9uIiwiYXBwZW5kVG8iLCJtZW51V2lkdGgiLCJzZWxlY3RlZExpc3RTZXBhcmF0b3IiLCJkaXNhYmxlSW5wdXRzT25Ub2dnbGUiLCJncm91cENvbHVtbnMiLCJfZ2V0QXBwZW5kRWwiLCJlbGVtZW50IiwianF1ZXJ5Iiwibm9kZVR5cGUiLCJmaW5kIiwiZXEiLCJjbG9zZXN0IiwibGVuZ3RoIiwiYm9keSIsIl9jcmVhdGUiLCJlbCIsIm8iLCJzcGVlZCIsImZ4Iiwic3BlZWRzIiwiX2RlZmF1bHQiLCJfaXNPcGVuIiwiaW5wdXRJZENvdW50ZXIiLCJfbmFtZXNwYWNlSUQiLCJldmVudE5hbWVzcGFjZSIsImJ1dHRvbiIsImFkZENsYXNzIiwiYXR0ciIsInByb3AiLCJpbnNlcnRBZnRlciIsImJ1dHRvbmxhYmVsIiwiaHRtbCIsIm1lbnUiLCJoZWFkZXJMaW5rQ29udGFpbmVyIiwiaGVhZGVyX2xpcyIsImFwcGVuZCIsImNoZWNrYm94Q29udGFpbmVyIiwiX2JpbmRFdmVudHMiLCJyZWZyZXNoIiwiX2luaXQiLCJvcGVuIiwiaXMiLCJkaXNhYmxlIiwiX21ha2VPcHRpb24iLCJvcHRpb24iLCJ0aXRsZSIsInZhbHVlIiwiaWQiLCJpbnB1dElEIiwiaXNEaXNhYmxlZCIsImRpc2FibGVkIiwiaXNTZWxlY3RlZCIsInNlbGVjdGVkIiwibGFiZWxDbGFzc2VzIiwibGlDbGFzc2VzIiwicHVzaCIsImNsYXNzTmFtZSIsIiRpdGVtIiwiam9pbiIsIiRsYWJlbCIsIiRpbnB1dCIsImRhdGEiLCJ0ZXh0IiwiX2J1aWxkT3B0aW9uTGlzdCIsIiRhcHBlbmRUbyIsInNlbGYiLCJjaGlsZHJlbiIsImVhY2giLCIkdGhpcyIsInRhZ05hbWUiLCIkb3B0aW9uR3JvdXAiLCJnZXRBdHRyaWJ1dGUiLCIkbGlzdEl0ZW0iLCJpbml0IiwiJGRyb3Bkb3duIiwicmVtb3ZlIiwibGFiZWxzIiwiaW5wdXRzIiwiX3NldEJ1dHRvbldpZHRoIiwidXBkYXRlIiwiX3RyaWdnZXIiLCJpc0RlZmF1bHQiLCIkaW5wdXRzIiwiJGNoZWNrZWQiLCJmaWx0ZXIiLCJudW1DaGVja2VkIiwiaXNGdW5jdGlvbiIsImNhbGwiLCJnZXQiLCJ0ZXN0IiwibWFwIiwibmV4dCIsInJlcGxhY2UiLCJfc2V0QnV0dG9uVmFsdWUiLCJkZWZhdWx0VmFsdWUiLCJfYmluZEJ1dHRvbkV2ZW50cyIsImNsaWNrSGFuZGxlciIsImJpbmQiLCJjbGljayIsImtleXByZXNzIiwiZSIsIndoaWNoIiwiY2xvc2UiLCJtb3VzZWVudGVyIiwiaGFzQ2xhc3MiLCJtb3VzZWxlYXZlIiwicmVtb3ZlQ2xhc3MiLCJmb2N1cyIsImJsdXIiLCJfYmluZE1lbnVFdmVudHMiLCJkZWxlZ2F0ZSIsInByZXZlbnREZWZhdWx0IiwicGFyZW50Iiwibm9kZXMiLCJsYWJlbCIsIl90b2dnbGVDaGVja2VkIiwiY2hlY2tlZCIsInNoaWZ0S2V5IiwibGFzdCIsIl90cmF2ZXJzZSIsImFsdEtleSIsImNoZWNrQWxsIiwidW5jaGVja0FsbCIsInZhbCIsIm9wdGlvblRleHQiLCJ0YWdzIiwidG9nZ2xlQ2xhc3MiLCJ0cmlnZ2VyIiwic2V0VGltZW91dCIsInByb3h5IiwiX2JpbmRIZWFkZXJFdmVudHMiLCIkdGFyZ2V0IiwidGFyZ2V0IiwicHJldiIsImV2ZW50IiwiY29udGFpbnMiLCJmb3JtIiwiX2dldE1pbldpZHRoIiwibWluVmFsIiwid2lkdGgiLCJfdHlwZW9mIiwibGFzdENoYXIiLCJtYXRjaCIsInBhcnNlSW50Iiwib3V0ZXJXaWR0aCIsIl9zZXRNZW51V2lkdGgiLCJtIiwiX3NldE1lbnVIZWlnaHQiLCJoZWFkZXJIZWlnaHQiLCJvdXRlckhlaWdodCIsInVsSGVpZ2h0IiwiaWR4IiwibGkiLCJjc3MiLCJfcmVzaXplTWVudSIsInN0YXJ0IiwiJHN0YXJ0IiwibW92ZVRvTGFzdCIsIiRuZXh0IiwiZmlyc3QiLCJwYXJlbnRzIiwiJGNvbnRhaW5lciIsInNjcm9sbFRvcCIsIl90b2dnbGVTdGF0ZSIsImZsYWciLCJzZXRBdHRyaWJ1dGUiLCJyZW1vdmVBdHRyaWJ1dGUiLCJncm91cCIsInZhbHVlcyIsIl90b2dnbGVEaXNhYmxlZCIsImNoZWNrYm94ZXMiLCJtYXRjaGVkSW5wdXRzIiwia2V5IiwiaSIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJwYXJlbnROb2RlIiwiaGFzQXR0cmlidXRlIiwiYXJncyIsImVmZmVjdCIsImlzQXJyYXkiLCJmbiIsImFwcGx5IiwiZW5hYmxlIiwiZ2V0Q2hlY2tlZCIsImdldFVuY2hlY2tlZCIsIm5vdCIsImRlc3Ryb3kiLCJXaWRnZXQiLCJwcm90b3R5cGUiLCJ1bmJpbmQiLCJpc09wZW4iLCJnZXRCdXR0b24iLCJnZXRNZW51IiwiZ2V0TGFiZWxzIiwiYWRkT3B0aW9uIiwiYXR0cmlidXRlcyIsImdyb3VwTGFiZWwiLCIkb3B0aW9uIiwib3B0aW9uTm9kZSIsInJlbW92ZU9wdGlvbiIsInBvcyIsIm15IiwiYXQiLCJvZiIsImlzRW1wdHlPYmplY3QiLCJ1aSIsInRvcCIsIm9mZnNldCIsIl9zZXRPcHRpb24iLCJwcmVwZW5kIiwiYWRkIiwiYXJndW1lbnRzIiwialF1ZXJ5Il0sInNvdXJjZVJvb3QiOiIifQ==