mtrl-addons 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +32 -3
- package/dist/index.mjs +32 -3
- package/dist/styles.css +4 -4
- package/package.json +1 -1
- package/src/styles/components/_colorpicker.scss +4 -4
package/dist/index.js
CHANGED
|
@@ -7903,7 +7903,10 @@ var withSwatches = (config) => (component2) => {
|
|
|
7903
7903
|
if (swatch.label) {
|
|
7904
7904
|
swatchEl.title = swatch.label;
|
|
7905
7905
|
}
|
|
7906
|
-
swatchEl.addEventListener("click", () =>
|
|
7906
|
+
swatchEl.addEventListener("click", (e) => {
|
|
7907
|
+
e.stopPropagation();
|
|
7908
|
+
handleSwatchClick(swatch);
|
|
7909
|
+
});
|
|
7907
7910
|
swatchesContainer.appendChild(swatchEl);
|
|
7908
7911
|
});
|
|
7909
7912
|
};
|
|
@@ -8102,6 +8105,8 @@ var withInput = (config) => (component2) => {
|
|
|
8102
8105
|
var withVariant = (config) => (component2) => {
|
|
8103
8106
|
const { element, getClass, emit } = component2;
|
|
8104
8107
|
const state = component2.state || createInitialState2(config);
|
|
8108
|
+
let lastDragEndTime = 0;
|
|
8109
|
+
let mouseDownInsidePicker = false;
|
|
8105
8110
|
const variantType = config.variant || COLORPICKER_VARIANTS.INLINE;
|
|
8106
8111
|
const needsVariantBehavior = variantType === COLORPICKER_VARIANTS.DROPDOWN || variantType === COLORPICKER_VARIANTS.DIALOG;
|
|
8107
8112
|
if (!needsVariantBehavior) {
|
|
@@ -8201,6 +8206,16 @@ var withVariant = (config) => (component2) => {
|
|
|
8201
8206
|
}
|
|
8202
8207
|
};
|
|
8203
8208
|
const handleDocumentClick = (e) => {
|
|
8209
|
+
if (state.isDragging) {
|
|
8210
|
+
return;
|
|
8211
|
+
}
|
|
8212
|
+
if (Date.now() - lastDragEndTime < 100) {
|
|
8213
|
+
return;
|
|
8214
|
+
}
|
|
8215
|
+
if (mouseDownInsidePicker) {
|
|
8216
|
+
mouseDownInsidePicker = false;
|
|
8217
|
+
return;
|
|
8218
|
+
}
|
|
8204
8219
|
if (container.contains(e.target)) {
|
|
8205
8220
|
return;
|
|
8206
8221
|
}
|
|
@@ -8224,6 +8239,17 @@ var withVariant = (config) => (component2) => {
|
|
|
8224
8239
|
position();
|
|
8225
8240
|
}
|
|
8226
8241
|
};
|
|
8242
|
+
const handleDragEnd = () => {
|
|
8243
|
+
if (state.isDragging) {
|
|
8244
|
+
lastDragEndTime = Date.now();
|
|
8245
|
+
}
|
|
8246
|
+
};
|
|
8247
|
+
document.addEventListener("mouseup", handleDragEnd, true);
|
|
8248
|
+
document.addEventListener("pointerup", handleDragEnd, true);
|
|
8249
|
+
const handleDocumentMouseDown = (e) => {
|
|
8250
|
+
mouseDownInsidePicker = container.contains(e.target);
|
|
8251
|
+
};
|
|
8252
|
+
document.addEventListener("mousedown", handleDocumentMouseDown, true);
|
|
8227
8253
|
if (config.trigger) {
|
|
8228
8254
|
config.trigger.addEventListener("click", handleTriggerClick);
|
|
8229
8255
|
}
|
|
@@ -8249,6 +8275,9 @@ var withVariant = (config) => (component2) => {
|
|
|
8249
8275
|
backdrop.removeEventListener("click", handleBackdropClick);
|
|
8250
8276
|
document.removeEventListener("click", handleDocumentClick);
|
|
8251
8277
|
document.removeEventListener("keydown", handleKeyDown);
|
|
8278
|
+
document.removeEventListener("mouseup", handleDragEnd, true);
|
|
8279
|
+
document.removeEventListener("pointerup", handleDragEnd, true);
|
|
8280
|
+
document.removeEventListener("mousedown", handleDocumentMouseDown, true);
|
|
8252
8281
|
window.removeEventListener("resize", handleResize);
|
|
8253
8282
|
window.removeEventListener("scroll", handleScroll, true);
|
|
8254
8283
|
if (element.parentNode === document.body) {
|
|
@@ -9076,5 +9105,5 @@ var createColorPicker = (config = {}) => {
|
|
|
9076
9105
|
};
|
|
9077
9106
|
var colorpicker_default = createColorPicker;
|
|
9078
9107
|
|
|
9079
|
-
//# debugId=
|
|
9080
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdXRpbHMudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdGFwLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL2xvbmdwcmVzcy50cyIsICIuLi9zcmMvY29yZS9nZXN0dXJlcy9wYW4udHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcGluY2gudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcm90YXRlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL21hbmFnZXIudHMiLCAiLi4vc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy9pbmRleC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3RhcC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvbG9uZ3ByZXNzLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvcGFuLnRzIiwgIi4uL3NyYy9jb3JlL2xheW91dC9zY2hlbWEudHMiLCAiLi4vc3JjL2NvcmUvbGF5b3V0L2NvbmZpZy50cyIsICIuLi9zcmMvY29yZS9sYXlvdXQvanN4LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3V0aWxzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2Jhc2UudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvY29uc3RhbnRzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3ZpcnR1YWwudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvc2Nyb2xsaW5nLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL21vbWVudHVtLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3Njcm9sbGJhci50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9jb2xsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3BsYWNlaG9sZGVycy50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9yZW5kZXJpbmcudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2FwaS50cyIsICIuLi9zcmMvY29tcG9uZW50cy92bGlzdC9jb25zdGFudHMudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvc2VsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2tleWJvYXJkLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZm9ybS50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2xheW91dC50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbmZpZy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2ZpZWxkcy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2RhdGEudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9jb250cm9sbGVyLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvc3VibWl0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvcHJvdGVjdGlvbi50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2FwaS50cyIsICIuLi9zcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9jb2xvcnBpY2tlci50cyIsICIuLi9zcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9jb25zdGFudHMudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvY29sb3JwaWNrZXIvdXRpbHMudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvY29sb3JwaWNrZXIvY29uZmlnLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2NvbG9ycGlja2VyL2ZlYXR1cmVzL2FyZWEudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvY29sb3JwaWNrZXIvZmVhdHVyZXMvaHVlLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2NvbG9ycGlja2VyL2ZlYXR1cmVzL3N3YXRjaGVzLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2NvbG9ycGlja2VyL2ZlYXR1cmVzL2lucHV0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2NvbG9ycGlja2VyL2ZlYXR1cmVzL3ZhcmlhbnQudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvY29sb3JwaWNrZXIvZmVhdHVyZXMvcGlwZXR0ZS50cyIsICIuLi9zcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9mZWF0dXJlcy9vcGFjaXR5LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2NvbG9ycGlja2VyL2FwaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy91dGlscy50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBHZXN0dXJlRXZlbnQsIEdlc3R1cmVTdGF0ZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQ2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50c1xuICpcbiAqIEBwYXJhbSB4MSAtIFggY29vcmRpbmF0ZSBvZiBmaXJzdCBwb2ludFxuICogQHBhcmFtIHkxIC0gWSBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0geDIgLSBYIGNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50XG4gKiBAcGFyYW0geTIgLSBZIGNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50XG4gKiBAcmV0dXJucyBEaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3RhbmNlKFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICB4MjogbnVtYmVyLFxuICB5MjogbnVtYmVyXG4pOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHgyIC0geDEsIDIpICsgTWF0aC5wb3coeTIgLSB5MSwgMikpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBhbmdsZSBiZXR3ZWVuIHR3byBwb2ludHMgaW4gZGVncmVlcyAoMC0zNjApXG4gKlxuICogQHBhcmFtIHgxIC0gWCBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0geTEgLSBZIGNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSB4MiAtIFggY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEBwYXJhbSB5MiAtIFkgY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEByZXR1cm5zIEFuZ2xlIGluIGRlZ3JlZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFuZ2xlKFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICB4MjogbnVtYmVyLFxuICB5MjogbnVtYmVyXG4pOiBudW1iZXIge1xuICBjb25zdCBhbmdsZSA9IChNYXRoLmF0YW4yKHkyIC0geTEsIHgyIC0geDEpICogMTgwKSAvIE1hdGguUEk7XG4gIHJldHVybiBhbmdsZSA8IDAgPyBhbmdsZSArIDM2MCA6IGFuZ2xlO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJhc2UgZ2VzdHVyZSBldmVudFxuICpcbiAqIEBwYXJhbSB0eXBlIC0gVHlwZSBvZiBnZXN0dXJlXG4gKiBAcGFyYW0gb3JpZ2luYWxFdmVudCAtIE9yaWdpbmFsIERPTSBldmVudFxuICogQHBhcmFtIHN0YXRlIC0gQ3VycmVudCBnZXN0dXJlIHN0YXRlXG4gKiBAcmV0dXJucyBCYXNlIGdlc3R1cmUgZXZlbnQgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHZXN0dXJlRXZlbnQoXG4gIHR5cGU6IHN0cmluZyxcbiAgb3JpZ2luYWxFdmVudDogRXZlbnQsXG4gIHN0YXRlOiBHZXN0dXJlU3RhdGVcbik6IEdlc3R1cmVFdmVudCB7XG4gIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGV2ZW50OiBHZXN0dXJlRXZlbnQgPSB7XG4gICAgdHlwZSxcbiAgICBvcmlnaW5hbEV2ZW50LFxuICAgIHRhcmdldDpcbiAgICAgIChzdGF0ZS50YXJnZXQgYXMgRXZlbnRUYXJnZXQpIHx8IChvcmlnaW5hbEV2ZW50LnRhcmdldCBhcyBFdmVudFRhcmdldCksXG4gICAgc3RhcnRUaW1lOiBzdGF0ZS5zdGFydFRpbWUsXG4gICAgZW5kVGltZSxcbiAgICBkdXJhdGlvbjogZW5kVGltZSAtIHN0YXRlLnN0YXJ0VGltZSxcbiAgICBkZWZhdWx0UHJldmVudGVkLFxuICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICBkZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgaWYgKG9yaWdpbmFsRXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICBvcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgIG9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogRGV0ZWN0IGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdG91Y2ggZXZlbnRzXG4gKlxuICogQHJldHVybnMgV2hldGhlciB0b3VjaCBpcyBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1RvdWNoU3VwcG9ydCgpOiBib29sZWFuIHtcbiAgY29uc3QgbWF4UG9pbnRzID0gKG5hdmlnYXRvciBhcyBhbnkpLm1heFRvdWNoUG9pbnRzO1xuICByZXR1cm4gKFxuICAgIFwib250b3VjaHN0YXJ0XCIgaW4gd2luZG93IHx8ICh0eXBlb2YgbWF4UG9pbnRzID09PSBcIm51bWJlclwiICYmIG1heFBvaW50cyA+IDApXG4gICk7XG59XG5cbi8qKlxuICogRGV0ZWN0IGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgcG9pbnRlciBldmVudHNcbiAqXG4gKiBAcmV0dXJucyBXaGV0aGVyIHBvaW50ZXIgZXZlbnRzIGFyZSBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1BvaW50ZXJTdXBwb3J0KCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISF3aW5kb3cuUG9pbnRlckV2ZW50O1xufVxuXG4vKipcbiAqIEV4dHJhY3Qgbm9ybWFsaXplZCB0b3VjaCBjb29yZGluYXRlcyBmcm9tIGFuIGV2ZW50XG4gKiBXb3JrcyB3aXRoIG1vdXNlIGV2ZW50cywgdG91Y2ggZXZlbnRzIGFuZCBwb2ludGVyIGV2ZW50c1xuICpcbiAqIEBwYXJhbSBlIC0gRE9NIGV2ZW50XG4gKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBjbGllbnRYIGFuZCBjbGllbnRZIGNvb3JkaW5hdGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb3VjaENvb3JkaW5hdGVzKFxuICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCB8IFBvaW50ZXJFdmVudFxuKTogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9IHtcbiAgaWYgKFwidG91Y2hlc1wiIGluIGUgJiYgQXJyYXkuaXNBcnJheShlLnRvdWNoZXMpICYmIGUudG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudFg6IGUudG91Y2hlc1swXS5jbGllbnRYLFxuICAgICAgY2xpZW50WTogZS50b3VjaGVzWzBdLmNsaWVudFksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2xpZW50WDogKGUgYXMgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCkuY2xpZW50WCxcbiAgICBjbGllbnRZOiAoZSBhcyBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KS5jbGllbnRZLFxuICB9O1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy90YXAudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gVGFwIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgVGFwRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBEZXRlY3QgdGFwIGdlc3R1cmVcbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUYXAgZXZlbnQgb3IgbnVsbCBpZiBubyB0YXAgZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFRhcChjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCk6IFRhcEV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG4gIFxuICAvLyBDYWxjdWxhdGUgZGlzdGFuY2UgYmV0d2VlbiBzdGFydCBhbmQgY3VycmVudCBwb3NpdGlvblxuICBjb25zdCBkZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLnN0YXJ0WDtcbiAgY29uc3QgZGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5zdGFydFk7XG4gIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gIFxuICAvLyBDaGVjayBpZiBtb3ZlbWVudCBpcyB3aXRoaW4gdGhyZXNob2xkXG4gIGlmIChkaXN0YW5jZSA8IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQpIHtcbiAgICAvLyBDaGVjayBmb3IgZG91YmxlIHRhcFxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgaXNEb3VibGVUYXAgPSBub3cgLSBzdGF0ZS5sYXN0VGFwVGltZSA8IDMwMDtcbiAgICBcbiAgICBjb25zdCB0YXBDb3VudCA9IGlzRG91YmxlVGFwID8gc3RhdGUudGFwQ291bnQgKyAxIDogMTtcbiAgICBcbiAgICAvLyBDcmVhdGUgdGFwIGV2ZW50XG4gICAgY29uc3QgdGFwRXZlbnQ6IFRhcEV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KCd0YXAnLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiAndGFwJyxcbiAgICAgIGNvdW50OiB0YXBDb3VudCxcbiAgICAgIHg6IHN0YXRlLmN1cnJlbnRYLFxuICAgICAgeTogc3RhdGUuY3VycmVudFlcbiAgICB9O1xuICAgIFxuICAgIHJldHVybiB0YXBFdmVudDtcbiAgfVxuICBcbiAgcmV0dXJuIG51bGw7XG59IiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9zd2lwZS50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBTd2lwZSBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFN3aXBlRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LCBTV0lQRV9ESVJFQ1RJT05TIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBEZXRlcm1pbmUgc3dpcGUgZGlyZWN0aW9uIGJhc2VkIG9uIGRlbHRhIFggYW5kIFlcbiAqIFxuICogQHBhcmFtIGRlbHRhWCAtIERpc3RhbmNlIG1vdmVkIGluIFggZGlyZWN0aW9uXG4gKiBAcGFyYW0gZGVsdGFZIC0gRGlzdGFuY2UgbW92ZWQgaW4gWSBkaXJlY3Rpb25cbiAqIEByZXR1cm5zIERpcmVjdGlvbiBvZiB0aGUgc3dpcGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN3aXBlRGlyZWN0aW9uKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcik6IFNXSVBFX0RJUkVDVElPTlMge1xuICBpZiAoTWF0aC5hYnMoZGVsdGFYKSA+IE1hdGguYWJzKGRlbHRhWSkpIHtcbiAgICByZXR1cm4gZGVsdGFYID4gMCA/IFNXSVBFX0RJUkVDVElPTlMuUklHSFQgOiBTV0lQRV9ESVJFQ1RJT05TLkxFRlQ7XG4gIH1cbiAgcmV0dXJuIGRlbHRhWSA+IDAgPyBTV0lQRV9ESVJFQ1RJT05TLkRPV04gOiBTV0lQRV9ESVJFQ1RJT05TLlVQO1xufVxuXG4vKipcbiAqIERldGVjdCBzd2lwZSBnZXN0dXJlXG4gKiBcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHJldHVybnMgU3dpcGUgZXZlbnQgb3IgbnVsbCBpZiBubyBzd2lwZSBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0U3dpcGUoY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQpOiBTd2lwZUV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG4gIFxuICAvLyBDYWxjdWxhdGUgZGVsdGFzIGFuZCBkaXN0YW5jZVxuICBjb25zdCBkZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLnN0YXJ0WDtcbiAgY29uc3QgZGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5zdGFydFk7XG4gIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gIFxuICAvLyBDYWxjdWxhdGUgdGltZSBhbmQgdmVsb2NpdHlcbiAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gIGNvbnN0IGRlbHRhVGltZSA9IGVuZFRpbWUgLSBzdGF0ZS5zdGFydFRpbWU7XG4gIGNvbnN0IHZlbG9jaXR5ID0gZGlzdGFuY2UgLyBkZWx0YVRpbWU7XG4gIFxuICAvLyBDaGVjayBpZiBpdCdzIGEgc3dpcGVcbiAgaWYgKGRpc3RhbmNlID49IG9wdGlvbnMuc3dpcGVUaHJlc2hvbGQgJiYgZGVsdGFUaW1lIDw9IG9wdGlvbnMuc3dpcGVUaW1lVGhyZXNob2xkKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gZ2V0U3dpcGVEaXJlY3Rpb24oZGVsdGFYLCBkZWx0YVkpO1xuICAgIFxuICAgIC8vIENyZWF0ZSBzd2lwZSBldmVudFxuICAgIGNvbnN0IHN3aXBlRXZlbnQ6IFN3aXBlRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoJ3N3aXBlJywgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogJ3N3aXBlJyxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIGRlbHRhWCxcbiAgICAgIGRlbHRhWSxcbiAgICAgIGRpc3RhbmNlLFxuICAgICAgdmVsb2NpdHksXG4gICAgICBzdGFydFg6IHN0YXRlLnN0YXJ0WCxcbiAgICAgIHN0YXJ0WTogc3RhdGUuc3RhcnRZLFxuICAgICAgZW5kWDogc3RhdGUuY3VycmVudFgsXG4gICAgICBlbmRZOiBzdGF0ZS5jdXJyZW50WVxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIHN3aXBlRXZlbnQ7XG4gIH1cbiAgXG4gIHJldHVybiBudWxsO1xufSIsCiAgICAiLy8gc3JjL2NvcmUvZ2VzdHVyZXMvbG9uZ3ByZXNzLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIExvbmcgcHJlc3MgZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBMb25nUHJlc3NFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIERldGVjdCBsb25nIHByZXNzIGdlc3R1cmVcbiAqIFxuICogVGhpcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSBvdGhlciBnZXN0dXJlIGRldGVjdG9ycyBhcyBpdCBzZXRzIHVwIGEgdGltZXJcbiAqIGFuZCByZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSB0aW1lciBjb21wbGV0ZXMuXG4gKiBcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIGxvbmcgcHJlc3MgaXMgZGV0ZWN0ZWRcbiAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gY2FuY2VsIHRoZSBsb25nIHByZXNzIGRldGVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TG9uZ1ByZXNzKFxuICBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCxcbiAgY2FsbGJhY2s6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbik6ICgpID0+IHZvaWQge1xuICBjb25zdCB7IHN0YXRlLCBvcHRpb25zLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuICBcbiAgLy8gU2V0IGEgdGltZXIgZm9yIGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gIGNvbnN0IHRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vIE9ubHkgdHJpZ2dlciBpZiBnZXN0dXJlIGlzIHN0aWxsIGFjdGl2ZVxuICAgIGlmIChzdGF0ZS5hY3RpdmUpIHtcbiAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHdpdGhpbiB0aHJlc2hvbGRcbiAgICAgIGNvbnN0IGRpZmZYID0gTWF0aC5hYnMoc3RhdGUuY3VycmVudFggLSBzdGF0ZS5zdGFydFgpO1xuICAgICAgY29uc3QgZGlmZlkgPSBNYXRoLmFicyhzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WSk7XG4gICAgICBcbiAgICAgIGlmIChkaWZmWCA8IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQgJiYgZGlmZlkgPCBvcHRpb25zLnRhcERpc3RhbmNlVGhyZXNob2xkKSB7XG4gICAgICAgIC8vIENyZWF0ZSBsb25nIHByZXNzIGV2ZW50XG4gICAgICAgIGNvbnN0IGxvbmdQcmVzc0V2ZW50OiBMb25nUHJlc3NFdmVudCA9IHtcbiAgICAgICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoJ2xvbmdwcmVzcycsIG9yaWdpbmFsRXZlbnQsIHN0YXRlKSxcbiAgICAgICAgICB0eXBlOiAnbG9uZ3ByZXNzJyxcbiAgICAgICAgICB4OiBzdGF0ZS5jdXJyZW50WCxcbiAgICAgICAgICB5OiBzdGF0ZS5jdXJyZW50WVxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gVHJpZ2dlciBjYWxsYmFja1xuICAgICAgICBjYWxsYmFjayhsb25nUHJlc3NFdmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBvcHRpb25zLmxvbmdQcmVzc1RpbWUpO1xuICBcbiAgLy8gUmV0dXJuIGNsZWFudXAgZnVuY3Rpb25cbiAgcmV0dXJuICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIG1vdmVtZW50IHdvdWxkIGNhbmNlbCBhIGxvbmcgcHJlc3NcbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsb25nIHByZXNzIHNob3VsZCBiZSBjYW5jZWxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsTG9uZ1ByZXNzKGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMgfSA9IGNvbnRleHQ7XG4gIFxuICBjb25zdCBkaWZmWCA9IE1hdGguYWJzKHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYKTtcbiAgY29uc3QgZGlmZlkgPSBNYXRoLmFicyhzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WSk7XG4gIFxuICByZXR1cm4gZGlmZlggPiBvcHRpb25zLnRhcERpc3RhbmNlVGhyZXNob2xkIHx8IGRpZmZZID4gb3B0aW9ucy50YXBEaXN0YW5jZVRocmVzaG9sZDtcbn0iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3Bhbi50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBQYW4gZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBQYW5FdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlR2VzdHVyZUV2ZW50IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZXRlY3QgcGFuIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFBhbiBldmVudCBvciBudWxsIGlmIG5vIHNpZ25pZmljYW50IG1vdmVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RQYW4oY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQpOiBQYW5FdmVudCB8IG51bGwge1xuICBjb25zdCB7IHN0YXRlLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuXG4gIC8vIENhbGN1bGF0ZSBkZWx0YSBmcm9tIHN0YXJ0IHBvc2l0aW9uXG4gIGNvbnN0IGRlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYO1xuICBjb25zdCBkZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WTtcblxuICAvLyBDYWxjdWxhdGUgZGVsdGEgZnJvbSBsYXN0IHBvc2l0aW9uIHRvIGRldGVybWluZSBpZiB0aGVyZSdzIHNpZ25pZmljYW50IG1vdmVtZW50XG4gIGNvbnN0IG1vdmVEZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLmxhc3RYO1xuICBjb25zdCBtb3ZlRGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5sYXN0WTtcbiAgY29uc3QgbW92ZURlbHRhID0gTWF0aC5zcXJ0KFxuICAgIG1vdmVEZWx0YVggKiBtb3ZlRGVsdGFYICsgbW92ZURlbHRhWSAqIG1vdmVEZWx0YVlcbiAgKTtcblxuICAvLyBDaGVjayBpZiBtb3ZlbWVudCBpcyBzaWduaWZpY2FudFxuICBpZiAobW92ZURlbHRhID4gMCkge1xuICAgIC8vIENyZWF0ZSBwYW4gZXZlbnRcbiAgICBjb25zdCBwYW5FdmVudDogUGFuRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoXCJwYW5cIiwgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogXCJwYW5cIixcbiAgICAgIGRlbHRhWCxcbiAgICAgIGRlbHRhWSxcbiAgICAgIHN0YXJ0WDogc3RhdGUuc3RhcnRYLFxuICAgICAgc3RhcnRZOiBzdGF0ZS5zdGFydFksXG4gICAgICBjdXJyZW50WDogc3RhdGUuY3VycmVudFgsXG4gICAgICBjdXJyZW50WTogc3RhdGUuY3VycmVudFksXG4gICAgfTtcblxuICAgIHJldHVybiBwYW5FdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9waW5jaC50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBQaW5jaCBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFBpbmNoRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCwgZ2V0RGlzdGFuY2UgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERldGVjdCBwaW5jaCBnZXN0dXJlXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gdG91Y2gxIC0gRmlyc3QgdG91Y2ggcG9pbnRcbiAqIEBwYXJhbSB0b3VjaDIgLSBTZWNvbmQgdG91Y2ggcG9pbnRcbiAqIEByZXR1cm5zIFBpbmNoIGV2ZW50IG9yIG51bGwgaWYgbm8gcGluY2ggZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFBpbmNoKFxuICBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCxcbiAgdG91Y2gxOiBUb3VjaCxcbiAgdG91Y2gyOiBUb3VjaFxuKTogUGluY2hFdmVudCB8IG51bGwge1xuICBjb25zdCB7IHN0YXRlLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuXG4gIC8vIENhbGN1bGF0ZSBjdXJyZW50IGRpc3RhbmNlIGJldHdlZW4gdG91Y2ggcG9pbnRzXG4gIGNvbnN0IGN1cnJlbnREaXN0YW5jZSA9IGdldERpc3RhbmNlKFxuICAgIHRvdWNoMS5jbGllbnRYLFxuICAgIHRvdWNoMS5jbGllbnRZLFxuICAgIHRvdWNoMi5jbGllbnRYLFxuICAgIHRvdWNoMi5jbGllbnRZXG4gICk7XG5cbiAgLy8gTWluaW11bSBtb3ZlbWVudCB0aHJlc2hvbGQgZm9yIHBpbmNoIGRldGVjdGlvblxuICBjb25zdCBQSU5DSF9USFJFU0hPTEQgPSAxMDtcblxuICAvLyBDaGVjayBpZiB0aGUgZGlzdGFuY2UgY2hhbmdlIGlzIHNpZ25pZmljYW50XG4gIGlmIChNYXRoLmFicyhjdXJyZW50RGlzdGFuY2UgLSBzdGF0ZS5zdGFydERpc3RhbmNlKSA+IFBJTkNIX1RIUkVTSE9MRCkge1xuICAgIC8vIENhbGN1bGF0ZSBzY2FsZSBmYWN0b3JcbiAgICBjb25zdCBzY2FsZSA9IGN1cnJlbnREaXN0YW5jZSAvIHN0YXRlLnN0YXJ0RGlzdGFuY2U7XG5cbiAgICAvLyBDYWxjdWxhdGUgY2VudGVyIHBvaW50XG4gICAgY29uc3QgY2VudGVyWCA9ICh0b3VjaDEuY2xpZW50WCArIHRvdWNoMi5jbGllbnRYKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9ICh0b3VjaDEuY2xpZW50WSArIHRvdWNoMi5jbGllbnRZKSAvIDI7XG5cbiAgICAvLyBDcmVhdGUgcGluY2ggZXZlbnRcbiAgICBjb25zdCBwaW5jaEV2ZW50OiBQaW5jaEV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KFwicGluY2hcIiwgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogXCJwaW5jaFwiLFxuICAgICAgc2NhbGUsXG4gICAgICBjZW50ZXJYLFxuICAgICAgY2VudGVyWSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHBpbmNoRXZlbnQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvZ2VzdHVyZXMvcm90YXRlLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFJvdGF0ZSBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFJvdGF0ZUV2ZW50LCBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQsIGdldEFuZ2xlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZXRlY3Qgcm90YXRlIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB0b3VjaDEgLSBGaXJzdCB0b3VjaCBwb2ludFxuICogQHBhcmFtIHRvdWNoMiAtIFNlY29uZCB0b3VjaCBwb2ludFxuICogQHJldHVybnMgUm90YXRlIGV2ZW50IG9yIG51bGwgaWYgbm8gcm90YXRpb24gZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFJvdGF0ZShcbiAgY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQsXG4gIHRvdWNoMTogVG91Y2gsXG4gIHRvdWNoMjogVG91Y2hcbik6IFJvdGF0ZUV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG5cbiAgLy8gQ2FsY3VsYXRlIGN1cnJlbnQgYW5nbGUgYmV0d2VlbiB0b3VjaCBwb2ludHNcbiAgY29uc3QgY3VycmVudEFuZ2xlID0gZ2V0QW5nbGUoXG4gICAgdG91Y2gxLmNsaWVudFgsXG4gICAgdG91Y2gxLmNsaWVudFksXG4gICAgdG91Y2gyLmNsaWVudFgsXG4gICAgdG91Y2gyLmNsaWVudFlcbiAgKTtcblxuICAvLyBNaW5pbXVtIHJvdGF0aW9uIHRocmVzaG9sZCBmb3IgZGV0ZWN0aW9uXG4gIGNvbnN0IFJPVEFUSU9OX1RIUkVTSE9MRCA9IDEwO1xuXG4gIC8vIENhbGN1bGF0ZSByb3RhdGlvbiBkaWZmZXJlbmNlXG4gIGNvbnN0IHJvdGF0aW9uRGlmZiA9IGN1cnJlbnRBbmdsZSAtIHN0YXRlLnN0YXJ0QW5nbGU7XG5cbiAgLy8gQ2hlY2sgaWYgcm90YXRpb24gaXMgc2lnbmlmaWNhbnRcbiAgaWYgKE1hdGguYWJzKHJvdGF0aW9uRGlmZikgPiBST1RBVElPTl9USFJFU0hPTEQpIHtcbiAgICAvLyBDYWxjdWxhdGUgY2VudGVyIHBvaW50XG4gICAgY29uc3QgY2VudGVyWCA9ICh0b3VjaDEuY2xpZW50WCArIHRvdWNoMi5jbGllbnRYKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9ICh0b3VjaDEuY2xpZW50WSArIHRvdWNoMi5jbGllbnRZKSAvIDI7XG5cbiAgICAvLyBDcmVhdGUgcm90YXRlIGV2ZW50XG4gICAgY29uc3Qgcm90YXRlRXZlbnQ6IFJvdGF0ZUV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KFwicm90YXRlXCIsIG9yaWdpbmFsRXZlbnQsIHN0YXRlKSxcbiAgICAgIHR5cGU6IFwicm90YXRlXCIsXG4gICAgICByb3RhdGlvbjogcm90YXRpb25EaWZmLFxuICAgICAgY2VudGVyWCxcbiAgICAgIGNlbnRlclksXG4gICAgfTtcblxuICAgIHJldHVybiByb3RhdGVFdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9tYW5hZ2VyLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEdlc3R1cmUgbWFuYWdlbWVudCBzeXN0ZW0gZm9yIGhhbmRsaW5nIHRvdWNoIGFuZCBtb3VzZSBpbnRlcmFjdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyBcbiAgR2VzdHVyZUNvbmZpZyxcbiAgR2VzdHVyZU1hbmFnZXIsXG4gIEdlc3R1cmVTdGF0ZSxcbiAgR2VzdHVyZUhhbmRsZXIsXG4gIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LFxuICBBbnlHZXN0dXJlRXZlbnQsXG4gIEdFU1RVUkVfVFlQRVMsXG4gIFNXSVBFX0RJUkVDVElPTlNcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCB7IGRldGVjdFRhcCB9IGZyb20gJy4vdGFwJztcbmltcG9ydCB7IGRldGVjdFN3aXBlIH0gZnJvbSAnLi9zd2lwZSc7XG5pbXBvcnQgeyBkZXRlY3RMb25nUHJlc3MsIHNob3VsZENhbmNlbExvbmdQcmVzcyB9IGZyb20gJy4vbG9uZ3ByZXNzJztcbmltcG9ydCB7IGRldGVjdFBhbiB9IGZyb20gJy4vcGFuJztcbmltcG9ydCB7IGRldGVjdFBpbmNoIH0gZnJvbSAnLi9waW5jaCc7XG5pbXBvcnQgeyBkZXRlY3RSb3RhdGUgfSBmcm9tICcuL3JvdGF0ZSc7XG5pbXBvcnQgeyBoYXNUb3VjaFN1cHBvcnQsIGhhc1BvaW50ZXJTdXBwb3J0LCBnZXRUb3VjaENvb3JkaW5hdGVzIH0gZnJvbSAnLi91dGlscyc7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBhbmQgY29uc3RhbnRzXG5leHBvcnQgeyBHRVNUVVJFX1RZUEVTLCBTV0lQRV9ESVJFQ1RJT05TIH07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGdlc3R1cmUgbWFuYWdlciBmb3IgaGFuZGxpbmcgdG91Y2ggYW5kIG1vdXNlIGludGVyYWN0aW9uc1xuICogXG4gKiBAcGFyYW0gZWxlbWVudCAtIERPTSBlbGVtZW50IHRvIGF0dGFjaCBnZXN0dXJlIHJlY29nbml0aW9uIHRvXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBHZXN0dXJlIG1hbmFnZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUdlc3R1cmVNYW5hZ2VyID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgY29uZmlnOiBHZXN0dXJlQ29uZmlnID0ge31cbik6IEdlc3R1cmVNYW5hZ2VyID0+IHtcbiAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gIGNvbnN0IG9wdGlvbnM6IFJlcXVpcmVkPEdlc3R1cmVDb25maWc+ID0ge1xuICAgIHN3aXBlVGhyZXNob2xkOiAzMCxcbiAgICBzd2lwZVRpbWVUaHJlc2hvbGQ6IDMwMCxcbiAgICBsb25nUHJlc3NUaW1lOiA1MDAsXG4gICAgdGFwRGlzdGFuY2VUaHJlc2hvbGQ6IDEwLFxuICAgIHByZXZlbnREZWZhdWx0OiB0cnVlLFxuICAgIHN0b3BQcm9wYWdhdGlvbjogZmFsc2UsXG4gICAgLi4uY29uZmlnXG4gIH07XG4gIFxuICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gIGNvbnN0IGhhbmRsZXJzOiBNYXA8c3RyaW5nLCBTZXQ8R2VzdHVyZUhhbmRsZXI+PiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIEdlc3R1cmUgc3RhdGVcbiAgY29uc3Qgc3RhdGU6IEdlc3R1cmVTdGF0ZSA9IHtcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIHN0YXJ0VGltZTogMCxcbiAgICBzdGFydFg6IDAsXG4gICAgc3RhcnRZOiAwLFxuICAgIGxhc3RYOiAwLFxuICAgIGxhc3RZOiAwLFxuICAgIGN1cnJlbnRYOiAwLFxuICAgIGN1cnJlbnRZOiAwLFxuICAgIHRvdWNoQ291bnQ6IDAsXG4gICAgbG9uZ1ByZXNzVGltZXI6IG51bGwsXG4gICAgc3RhcnREaXN0YW5jZTogMCxcbiAgICBzdGFydEFuZ2xlOiAwLFxuICAgIGxhc3RUYXBUaW1lOiAwLFxuICAgIHRhcENvdW50OiAwLFxuICAgIHRhcmdldDogbnVsbFxuICB9O1xuICBcbiAgLy8gRGV0ZWN0IGZlYXR1cmUgc3VwcG9ydFxuICBjb25zdCBzdXBwb3J0VG91Y2ggPSBoYXNUb3VjaFN1cHBvcnQoKTtcbiAgY29uc3Qgc3VwcG9ydFBvaW50ZXIgPSBoYXNQb2ludGVyU3VwcG9ydCgpO1xuICAgIFxuICBjb25zdCBnZXN0dXJlU3VwcG9ydCA9IHtcbiAgICB0YXA6IHRydWUsXG4gICAgc3dpcGU6IHRydWUsXG4gICAgc3dpcGVsZWZ0OiB0cnVlLFxuICAgIHN3aXBlcmlnaHQ6IHRydWUsXG4gICAgc3dpcGV1cDogdHJ1ZSxcbiAgICBzd2lwZWRvd246IHRydWUsXG4gICAgbG9uZ3ByZXNzOiB0cnVlLFxuICAgIHBhbjogdHJ1ZSxcbiAgICBwaW5jaDogc3VwcG9ydFRvdWNoIHx8IHN1cHBvcnRQb2ludGVyLFxuICAgIHJvdGF0ZTogc3VwcG9ydFRvdWNoIHx8IHN1cHBvcnRQb2ludGVyXG4gIH07XG4gIFxuICAvKipcbiAgICogRGlzcGF0Y2ggYSBnZXN0dXJlIGV2ZW50XG4gICAqL1xuICBjb25zdCBkaXNwYXRjaEdlc3R1cmUgPSAoZXZlbnQ6IEFueUdlc3R1cmVFdmVudCk6IHZvaWQgPT4ge1xuICAgIC8vIEdldCBoYW5kbGVycyBmb3IgdGhpcyBldmVudCB0eXBlXG4gICAgY29uc3QgZXZlbnRIYW5kbGVycyA9IGhhbmRsZXJzLmdldChldmVudC50eXBlKTtcbiAgICBpZiAoIWV2ZW50SGFuZGxlcnMpIHJldHVybjtcbiAgICBcbiAgICAvLyBDYWxsIGVhY2ggaGFuZGxlclxuICAgIGV2ZW50SGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gZ2VzdHVyZSBoYW5kbGVyIGZvciAke2V2ZW50LnR5cGV9OmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvLyBGb3Igc3dpcGUsIGFsc28gZGlzcGF0Y2ggZGlyZWN0aW9uLXNwZWNpZmljIGV2ZW50c1xuICAgIGlmIChldmVudC50eXBlID09PSAnc3dpcGUnICYmICdkaXJlY3Rpb24nIGluIGV2ZW50KSB7XG4gICAgICBjb25zdCBkaXJlY3Rpb25FdmVudCA9IHsgLi4uZXZlbnQsIHR5cGU6IGBzd2lwZSR7ZXZlbnQuZGlyZWN0aW9ufWAgYXMgYW55IH07XG4gICAgICBkaXNwYXRjaEdlc3R1cmUoZGlyZWN0aW9uRXZlbnQgYXMgYW55KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQXBwbHkgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBwcmV2ZW50RGVmYXVsdCBhbmQgc3RvcFByb3BhZ2F0aW9uXG4gICAgaWYgKG9wdGlvbnMucHJldmVudERlZmF1bHQgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIFxuICAgIGlmIChvcHRpb25zLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSBsb25ncHJlc3MgY2xlYW51cCBmdW5jdGlvblxuICBsZXQgbG9uZ1ByZXNzQ2xlYW51cDogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIHN0YXJ0XG4gICAqL1xuICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRvdWNoID0gZ2V0VG91Y2hDb29yZGluYXRlcyhlKTtcbiAgICBjb25zdCB0b3VjaENvdW50ID0gJ3RvdWNoZXMnIGluIGUgPyBlLnRvdWNoZXMubGVuZ3RoIDogMTtcbiAgICBcbiAgICAvLyBTdG9yZSBnZXN0dXJlIHN0YXRlXG4gICAgc3RhdGUuYWN0aXZlID0gdHJ1ZTtcbiAgICBzdGF0ZS5zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHN0YXRlLnN0YXJ0WCA9IHN0YXRlLmxhc3RYID0gc3RhdGUuY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgIHN0YXRlLnN0YXJ0WSA9IHN0YXRlLmxhc3RZID0gc3RhdGUuY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgIHN0YXRlLnRvdWNoQ291bnQgPSB0b3VjaENvdW50O1xuICAgIHN0YXRlLnRhcmdldCA9IGUudGFyZ2V0O1xuICAgIFxuICAgIC8vIEhhbmRsZSBtdWx0aS10b3VjaCBnZXN0dXJlc1xuICAgIGlmICh0b3VjaENvdW50ID09PSAyICYmICd0b3VjaGVzJyBpbiBlKSB7XG4gICAgICBjb25zdCB0b3VjaDEgPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCB0b3VjaDIgPSBlLnRvdWNoZXNbMV07XG4gICAgICBcbiAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlcyBmb3IgcGluY2ggYW5kIHJvdGF0ZVxuICAgICAgc3RhdGUuc3RhcnREaXN0YW5jZSA9IE1hdGguc3FydChcbiAgICAgICAgTWF0aC5wb3codG91Y2gyLmNsaWVudFggLSB0b3VjaDEuY2xpZW50WCwgMikgKyBcbiAgICAgICAgTWF0aC5wb3codG91Y2gyLmNsaWVudFkgLSB0b3VjaDEuY2xpZW50WSwgMilcbiAgICAgICk7XG4gICAgICBcbiAgICAgIHN0YXRlLnN0YXJ0QW5nbGUgPSBNYXRoLmF0YW4yKFxuICAgICAgICB0b3VjaDIuY2xpZW50WSAtIHRvdWNoMS5jbGllbnRZLFxuICAgICAgICB0b3VjaDIuY2xpZW50WCAtIHRvdWNoMS5jbGllbnRYXG4gICAgICApICogMTgwIC8gTWF0aC5QSTtcbiAgICAgIFxuICAgICAgaWYgKHN0YXRlLnN0YXJ0QW5nbGUgPCAwKSBzdGF0ZS5zdGFydEFuZ2xlICs9IDM2MDtcbiAgICB9XG4gICAgXG4gICAgLy8gU2V0dXAgY29udGV4dCBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICBjb25zdCBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIHN0YXRlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICB9O1xuICAgIFxuICAgIC8vIFN0YXJ0IGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gICAgaWYgKGxvbmdQcmVzc0NsZWFudXApIHtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICB9XG4gICAgXG4gICAgbG9uZ1ByZXNzQ2xlYW51cCA9IGRldGVjdExvbmdQcmVzcyhjb250ZXh0LCAobG9uZ1ByZXNzRXZlbnQpID0+IHtcbiAgICAgIGRpc3BhdGNoR2VzdHVyZShsb25nUHJlc3NFdmVudCk7XG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIG1vdmVcbiAgICovXG4gIGNvbnN0IGhhbmRsZU1vdmUgPSAoZTogVG91Y2hFdmVudCB8IE1vdXNlRXZlbnQgfCBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXN0YXRlLmFjdGl2ZSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHRvdWNoID0gZ2V0VG91Y2hDb29yZGluYXRlcyhlKTtcbiAgICBjb25zdCB0b3VjaENvdW50ID0gJ3RvdWNoZXMnIGluIGUgPyBlLnRvdWNoZXMubGVuZ3RoIDogMTtcbiAgICBcbiAgICAvLyBVcGRhdGUgcG9zaXRpb25zXG4gICAgc3RhdGUubGFzdFggPSBzdGF0ZS5jdXJyZW50WDtcbiAgICBzdGF0ZS5sYXN0WSA9IHN0YXRlLmN1cnJlbnRZO1xuICAgIHN0YXRlLmN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICBzdGF0ZS5jdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgXG4gICAgLy8gU2V0dXAgY29udGV4dCBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICBjb25zdCBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIHN0YXRlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICB9O1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBjYW5jZWwgbG9uZ3ByZXNzXG4gICAgaWYgKHNob3VsZENhbmNlbExvbmdQcmVzcyhjb250ZXh0KSAmJiBsb25nUHJlc3NDbGVhbnVwKSB7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwKCk7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwID0gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgLy8gRGV0ZWN0IHBhbiBnZXN0dXJlXG4gICAgY29uc3QgcGFuRXZlbnQgPSBkZXRlY3RQYW4oY29udGV4dCk7XG4gICAgaWYgKHBhbkV2ZW50KSB7XG4gICAgICBkaXNwYXRjaEdlc3R1cmUocGFuRXZlbnQpO1xuICAgIH1cbiAgICBcbiAgICAvLyBNdWx0aS10b3VjaCBnZXN0dXJlc1xuICAgIGlmICh0b3VjaENvdW50ID09PSAyICYmICd0b3VjaGVzJyBpbiBlKSB7XG4gICAgICBjb25zdCB0b3VjaDEgPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCB0b3VjaDIgPSBlLnRvdWNoZXNbMV07XG4gICAgICBcbiAgICAgIC8vIERldGVjdCBwaW5jaFxuICAgICAgY29uc3QgcGluY2hFdmVudCA9IGRldGVjdFBpbmNoKGNvbnRleHQsIHRvdWNoMSwgdG91Y2gyKTtcbiAgICAgIGlmIChwaW5jaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoR2VzdHVyZShwaW5jaEV2ZW50KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRGV0ZWN0IHJvdGF0ZVxuICAgICAgY29uc3Qgcm90YXRlRXZlbnQgPSBkZXRlY3RSb3RhdGUoY29udGV4dCwgdG91Y2gxLCB0b3VjaDIpO1xuICAgICAgaWYgKHJvdGF0ZUV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoR2VzdHVyZShyb3RhdGVFdmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICovXG4gIGNvbnN0IGhhbmRsZUVuZCA9IChlOiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghc3RhdGUuYWN0aXZlKSByZXR1cm47XG4gICAgXG4gICAgLy8gQ2FuY2VsIGFueSBvbmdvaW5nIGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gICAgaWYgKGxvbmdQcmVzc0NsZWFudXApIHtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAgPSBudWxsO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXR1cCBjb250ZXh0IGZvciBnZXN0dXJlIGRldGVjdGlvblxuICAgIGNvbnN0IGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0ID0ge1xuICAgICAgc3RhdGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgIH07XG4gICAgXG4gICAgLy8gRGV0ZWN0IHRhcFxuICAgIGNvbnN0IHRhcEV2ZW50ID0gZGV0ZWN0VGFwKGNvbnRleHQpO1xuICAgIGlmICh0YXBFdmVudCkge1xuICAgICAgLy8gVXBkYXRlIHRhcCBjb3VudCBmb3IgbmV4dCB0YXBcbiAgICAgIHN0YXRlLmxhc3RUYXBUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIHN0YXRlLnRhcENvdW50ID0gdGFwRXZlbnQuY291bnQ7XG4gICAgICBcbiAgICAgIGRpc3BhdGNoR2VzdHVyZSh0YXBFdmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERldGVjdCBzd2lwZVxuICAgICAgY29uc3Qgc3dpcGVFdmVudCA9IGRldGVjdFN3aXBlKGNvbnRleHQpO1xuICAgICAgaWYgKHN3aXBlRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hHZXN0dXJlKHN3aXBlRXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBSZXNldCBzdGF0ZVxuICAgIHN0YXRlLmFjdGl2ZSA9IGZhbHNlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBjYW5jZWxcbiAgICovXG4gIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAvLyBDYW5jZWwgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCgpO1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCA9IG51bGw7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgc3RhdGUuYWN0aXZlID0gZmFsc2U7XG4gIH07XG4gIFxuICAvLyBFdmVudCBsaXN0ZW5lciByZWZlcmVuY2VzXG4gIGxldCBldmVudExpc3RlbmVyczogeyBcbiAgICBbZXZlbnQ6IHN0cmluZ106IEV2ZW50TGlzdGVuZXIgXG4gIH0gPSB7fTtcbiAgXG4gIC8qKlxuICAgKiBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzIGJhc2VkIG9uIGF2YWlsYWJsZSBBUElzXG4gICAqL1xuICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChzdXBwb3J0UG9pbnRlcikge1xuICAgICAgLy8gVXNlIFBvaW50ZXIgRXZlbnRzIEFQSVxuICAgICAgZXZlbnRMaXN0ZW5lcnMgPSB7XG4gICAgICAgIHBvaW50ZXJkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVybW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVydXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVyY2FuY2VsOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lclxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnRUb3VjaCkge1xuICAgICAgLy8gVXNlIFRvdWNoIEV2ZW50cyBBUElcbiAgICAgIGV2ZW50TGlzdGVuZXJzID0ge1xuICAgICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICB0b3VjaG1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXJcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGwgYmFjayB0byBNb3VzZSBFdmVudHMgQVBJXG4gICAgICBldmVudExpc3RlbmVycyA9IHtcbiAgICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBtb3VzZW1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG1vdXNlbGVhdmU6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyXG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHsgcGFzc2l2ZTogIW9wdGlvbnMucHJldmVudERlZmF1bHQgfSk7XG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBldmVudCBsaXN0ZW5lcnNcbiAgICovXG4gIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQ2xlYXIgZXZlbnRMaXN0ZW5lcnMgb2JqZWN0XG4gICAgZXZlbnRMaXN0ZW5lcnMgPSB7fTtcbiAgfTtcbiAgXG4gIC8vIEluaXRpYWxpemUgZXZlbnQgbGlzdGVuZXJzXG4gIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgXG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogQWRkIGEgZ2VzdHVyZSBldmVudCBsaXN0ZW5lclxuICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgdG8gbGlzdGVuIGZvclxuICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBvbihldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICBpZiAoIWhhbmRsZXJzLmhhcyhldmVudFR5cGUpKSB7XG4gICAgICAgIGhhbmRsZXJzLnNldChldmVudFR5cGUsIG5ldyBTZXQoKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGhhbmRsZXJzLmdldChldmVudFR5cGUpIS5hZGQoaGFuZGxlcik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIFxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGdlc3R1cmUgZXZlbnQgbGlzdGVuZXJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIHRvIHJlbW92ZVxuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBvZmYoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgY29uc3QgZXZlbnRIYW5kbGVycyA9IGhhbmRsZXJzLmdldChldmVudFR5cGUpO1xuICAgICAgaWYgKGV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgZXZlbnRIYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIFxuICAgICAgICBpZiAoZXZlbnRIYW5kbGVycy5zaXplID09PSAwKSB7XG4gICAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGV2ZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBnZXN0dXJlIGlzIHN1cHBvcnRlZCBvbiB0aGUgY3VycmVudCBkZXZpY2VcbiAgICAgKiBAcGFyYW0gZ2VzdHVyZVR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgICAqL1xuICAgIGlzU3VwcG9ydGVkKGdlc3R1cmVUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBnZXN0dXJlVHlwZSBpbiBnZXN0dXJlU3VwcG9ydCAmJiBnZXN0dXJlU3VwcG9ydFtnZXN0dXJlVHlwZSBhcyBrZXlvZiB0eXBlb2YgZ2VzdHVyZVN1cHBvcnRdO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gYnkgYWRkaW5nIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBlbmFibGUoKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gYnkgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIGRpc2FibGUoKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzIGFuZCB0aW1lcnNcbiAgICAgKi9cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgLy8gQ2xlYW4gdXAgbGlzdGVuZXJzXG4gICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgXG4gICAgICAvLyBDbGVhciBsb25nIHByZXNzIHRpbWVyXG4gICAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgICBsb25nUHJlc3NDbGVhbnVwKCk7XG4gICAgICAgIGxvbmdQcmVzc0NsZWFudXAgPSBudWxsO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDbGVhciBoYW5kbGVyIHJlZmVyZW5jZXNcbiAgICAgIGhhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxuICB9O1xufTsiLAogICAgIi8vIHNyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50LCBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUdlc3R1cmVNYW5hZ2VyLFxuICBHZXN0dXJlTWFuYWdlcixcbiAgR2VzdHVyZUNvbmZpZyxcbiAgR2VzdHVyZUhhbmRsZXIsXG4gIEFueUdlc3R1cmVFdmVudCxcbn0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGdlc3R1cmVzIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXN0dXJlc0ZlYXR1cmVDb25maWcgZXh0ZW5kcyBHZXN0dXJlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlR2VzdHVyZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsIGdlc3R1cmUgZXZlbnQgaGFuZGxlcnNcbiAgICovXG4gIGdlc3R1cmVIYW5kbGVycz86IFJlY29yZDxzdHJpbmcsIEdlc3R1cmVIYW5kbGVyPjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggZ2VzdHVyZSByZWNvZ25pdGlvbiBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXN0dXJlc0NvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogR2VzdHVyZSBtYW5hZ2VyIGluc3RhbmNlXG4gICAqL1xuICBnZXN0dXJlczogR2VzdHVyZU1hbmFnZXI7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGdlc3R1cmUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uR2VzdHVyZTogKGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyOiBHZXN0dXJlSGFuZGxlcikgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGdlc3R1cmUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZkdlc3R1cmU6IChldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpID0+IEdlc3R1cmVzQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGdlc3R1cmUgdHlwZSBpcyBzdXBwb3J0ZWQgb24gdGhlIGN1cnJlbnQgZGV2aWNlXG4gICAqIEBwYXJhbSBnZXN0dXJlVHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgKi9cbiAgaXNHZXN0dXJlU3VwcG9ydGVkOiAoZ2VzdHVyZVR5cGU6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVHZXN0dXJlczogKCkgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGRpc2FibGVHZXN0dXJlczogKCkgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllcyB0byBhIGNvbXBvbmVudC5cbiAqIFRoaXMgaXMgYSBjb21wcmVoZW5zaXZlIGdlc3R1cmUgZmVhdHVyZSB0aGF0IGFkZHMgc3VwcG9ydCBmb3IgYWxsIGdlc3R1cmUgdHlwZXMuXG4gKiBGb3IgbW9yZSBsaWdodHdlaWdodCwgc3BlY2lmaWMgZ2VzdHVyZXMsIHVzZSB0aGUgaW5kaXZpZHVhbCBnZXN0dXJlIGZlYXR1cmVzLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIGdlc3R1cmUgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBnZXN0dXJlIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnRcbiAqIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gKiAgIGNyZWF0ZUJhc2UsXG4gKiAgIHdpdGhFbGVtZW50KC4uLiksXG4gKiAgIHdpdGhHZXN0dXJlcyh7XG4gKiAgICAgc3dpcGVUaHJlc2hvbGQ6IDUwLFxuICogICAgIGdlc3R1cmVIYW5kbGVyczoge1xuICogICAgICAgJ3RhcCc6IChlKSA9PiBoYW5kbGVUYXAoZSksXG4gKiAgICAgICAnc3dpcGVsZWZ0JzogKGUpID0+IG5hdmlnYXRlRm9yd2FyZChlKSxcbiAqICAgICAgICdzd2lwZXJpZ2h0JzogKGUpID0+IG5hdmlnYXRlQmFjayhlKVxuICogICAgIH1cbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aEdlc3R1cmVzID1cbiAgKGNvbmZpZzogR2VzdHVyZXNGZWF0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIEdlc3R1cmVzQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIEdlc3R1cmVzQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGVuYWJsZUdlc3R1cmVzID0gdHJ1ZSxcbiAgICAgIGdlc3R1cmVIYW5kbGVycyA9IHt9LFxuICAgICAgLi4uZ2VzdHVyZUNvbmZpZ1xuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBDcmVhdGUgZ2VzdHVyZSBtYW5hZ2VyXG4gICAgY29uc3QgZ2VzdHVyZU1hbmFnZXIgPSBjcmVhdGVHZXN0dXJlTWFuYWdlcihcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LFxuICAgICAgZ2VzdHVyZUNvbmZpZ1xuICAgICk7XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBnZXN0dXJlIGhhbmRsZXJzXG4gICAgT2JqZWN0LmVudHJpZXMoZ2VzdHVyZUhhbmRsZXJzKS5mb3JFYWNoKChbZXZlbnRUeXBlLCBoYW5kbGVyXSkgPT4ge1xuICAgICAgZ2VzdHVyZU1hbmFnZXIub24oZXZlbnRUeXBlLCBoYW5kbGVyKTtcbiAgICB9KTtcblxuICAgIC8vIEVuYWJsZS9kaXNhYmxlIGJhc2VkIG9uIGNvbmZpZ1xuICAgIGlmICghZW5hYmxlR2VzdHVyZXMpIHtcbiAgICAgIGdlc3R1cmVNYW5hZ2VyLmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICAvLyBDb25uZWN0IHdpdGggZXhpc3RpbmcgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgIC8vIEZvcndhcmQgZ2VzdHVyZSBldmVudHMgdG8gdGhlIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbVxuICAgICAgY29uc3QgZm9yd2FyZEdlc3R1cmVFdmVudHMgPSAoZXZlbnQ6IEFueUdlc3R1cmVFdmVudCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZW1pdChldmVudC50eXBlLCBldmVudCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBSZWdpc3RlciBmb3J3YXJkZXIgZm9yIGNvbW1vbiBnZXN0dXJlIHR5cGVzXG4gICAgICBbXG4gICAgICAgIFwidGFwXCIsXG4gICAgICAgIFwic3dpcGVcIixcbiAgICAgICAgXCJzd2lwZWxlZnRcIixcbiAgICAgICAgXCJzd2lwZXJpZ2h0XCIsXG4gICAgICAgIFwic3dpcGV1cFwiLFxuICAgICAgICBcInN3aXBlZG93blwiLFxuICAgICAgICBcImxvbmdwcmVzc1wiLFxuICAgICAgICBcInBpbmNoXCIsXG4gICAgICAgIFwicm90YXRlXCIsXG4gICAgICAgIFwicGFuXCIsXG4gICAgICBdLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIub24odHlwZSwgZm9yd2FyZEdlc3R1cmVFdmVudHMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGdlc3R1cmUgbWFuYWdlclxuICAgICAgICBnZXN0dXJlTWFuYWdlci5kZXN0cm95KCk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBnZXN0dXJlczogZ2VzdHVyZU1hbmFnZXIsXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgZ2VzdHVyZSBldmVudCBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvbkdlc3R1cmUoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKSB7XG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLm9uKGV2ZW50VHlwZSwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgYSBnZXN0dXJlIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9mZkdlc3R1cmUoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKSB7XG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLm9mZihldmVudFR5cGUsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgYSBnZXN0dXJlIHR5cGUgaXMgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IGRldmljZVxuICAgICAgICogQHBhcmFtIGdlc3R1cmVUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIHRvIGNoZWNrXG4gICAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgICAgICovXG4gICAgICBpc0dlc3R1cmVTdXBwb3J0ZWQoZ2VzdHVyZVR5cGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gZ2VzdHVyZU1hbmFnZXIuaXNTdXBwb3J0ZWQoZ2VzdHVyZVR5cGUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUdlc3R1cmVzKCkge1xuICAgICAgICBnZXN0dXJlTWFuYWdlci5lbmFibGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVHZXN0dXJlcygpIHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIuZGlzYWJsZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy90YXAudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgVGFwRXZlbnQsIEdlc3R1cmVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRhcCBnZXN0dXJlIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXBHZXN0dXJlQ29uZmlnIHtcbiAgLyoqXG4gICAqIERpc3RhbmNlIHRocmVzaG9sZCAoaW4gcGl4ZWxzKSBmb3IgdGFwIHJlY29nbml0aW9uXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICB0YXBEaXN0YW5jZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JzIG9uIHRvdWNoIGV2ZW50c1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHRhcCBnZXN0dXJlXG4gICAqL1xuICBvblRhcD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSB0YXAgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcEdlc3R1cmVDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIEFkZCBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblRhcDogKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpID0+IFRhcEdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZUYXA6IChoYW5kbGVyOiAoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkKSA9PiBUYXBHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdGFwIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZVRhcDogKCkgPT4gVGFwR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSB0YXAgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZGlzYWJsZVRhcDogKCkgPT4gVGFwR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBZGRzIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIHRhcCBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgdGFwIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggdGFwIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoVGFwR2VzdHVyZSh7XG4gKiAgICAgb25UYXA6IChlKSA9PiBjb25zb2xlLmxvZygnVGFwcGVkIGF0JywgZS54LCBlLnkpXG4gKiAgIH0pXG4gKiApKGNvbmZpZyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhUYXBHZXN0dXJlID1cbiAgKGNvbmZpZzogVGFwR2VzdHVyZUNvbmZpZyA9IHt9KSA9PlxuICA8QyBleHRlbmRzIEVsZW1lbnRDb21wb25lbnQ+KGNvbXBvbmVudDogQyk6IEMgJiBUYXBHZXN0dXJlQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uOiBtaXNzaW5nIGVsZW1lbnRcIik7XG4gICAgICByZXR1cm4gY29tcG9uZW50IGFzIEMgJiBUYXBHZXN0dXJlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIHRhcERpc3RhbmNlVGhyZXNob2xkID0gMTAsXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvblRhcCxcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gICAgY29uc3QgaGFuZGxlcnM6IFNldDwoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkPiA9IG5ldyBTZXQoKTtcblxuICAgIC8vIElmIGluaXRpYWwgaGFuZGxlciBwcm92aWRlZCwgYWRkIGl0XG4gICAgaWYgKG9uVGFwKSB7XG4gICAgICBoYW5kbGVycy5hZGQob25UYXAgYXMgKGV2ZW50OiBUYXBFdmVudCkgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgLy8gR2VzdHVyZSBzdGF0ZSBmb3IgdHJhY2tpbmdcbiAgICBsZXQgc3RhcnRYID0gMDtcbiAgICBsZXQgc3RhcnRZID0gMDtcbiAgICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0VGltZSA9IDA7XG4gICAgbGV0IGxhc3RUYXBUaW1lID0gMDtcbiAgICBsZXQgdGFwQ291bnQgPSAwO1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkO1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSB0YXAgZXZlbnQgdG8gYWxsIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hUYXAgPSAoXG4gICAgICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCxcbiAgICAgIHg6IG51bWJlcixcbiAgICAgIHk6IG51bWJlclxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGlzRG91YmxlVGFwID0gbm93IC0gbGFzdFRhcFRpbWUgPCAzMDA7XG5cbiAgICAgIGlmIChpc0RvdWJsZVRhcCkge1xuICAgICAgICB0YXBDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFwQ291bnQgPSAxO1xuICAgICAgfVxuXG4gICAgICBsYXN0VGFwVGltZSA9IG5vdztcblxuICAgICAgLy8gQ3JlYXRlIHRoZSB0YXAgZXZlbnRcbiAgICAgIGNvbnN0IHRhcEV2ZW50OiBUYXBFdmVudCA9IHtcbiAgICAgICAgdHlwZTogXCJ0YXBcIixcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdGFyZ2V0OiBlLnRhcmdldCEsXG4gICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgZW5kVGltZTogbm93LFxuICAgICAgICBkdXJhdGlvbjogbm93IC0gc3RhcnRUaW1lLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICB0YXBFdmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgICBjb3VudDogdGFwQ291bnQsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICB9O1xuXG4gICAgICAvLyBDYWxsIGVhY2ggaGFuZGxlclxuICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIodGFwRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiB0YXAgaGFuZGxlcjpcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gRm9yd2FyZCB0byBjb21wb25lbnQncyBldmVudCBzeXN0ZW0gaWYgYXZhaWxhYmxlXG4gICAgICBpZiAoaGFzRW1pdChjb21wb25lbnQpKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0KFwidGFwXCIsIHRhcEV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICF0YXBFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHRhcEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBzdGFydFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBzdGFydFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgc3RhcnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgZW5kXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRW5kID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID1cbiAgICAgICAgXCJjaGFuZ2VkVG91Y2hlc1wiIGluIGUgJiYgZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBlLmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICAgICAgOiAoZSBhcyBNb3VzZUV2ZW50KTtcblxuICAgICAgY29uc3QgZW5kWCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjb25zdCBlbmRZID0gdG91Y2guY2xpZW50WTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIGRpc3RhbmNlIG1vdmVkXG4gICAgICBjb25zdCBkZWx0YVggPSBlbmRYIC0gc3RhcnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gZW5kWSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHdpdGhpbiB0aHJlc2hvbGRcbiAgICAgIGlmIChkaXN0YW5jZSA8IHRhcERpc3RhbmNlVGhyZXNob2xkKSB7XG4gICAgICAgIGRpc3BhdGNoVGFwKGUsIGVuZFgsIGVuZFkpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNldXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGhhbmRsZXJzXG4gICAgICAgIGhhbmRsZXJzLmNsZWFyKCk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvblRhcChoYW5kbGVyOiAoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgb2ZmVGFwKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW5hYmxlIHRhcCByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBlbmFibGVUYXAoKSB7XG4gICAgICAgIGlmICghaXNFbmFibGVkKSB7XG4gICAgICAgICAgaXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgdGFwIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVUYXAoKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3N3aXBlLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gQWRkcyBzd2lwZSBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHtcbiAgU3dpcGVFdmVudCxcbiAgU1dJUEVfRElSRUNUSU9OUyxcbiAgR2VzdHVyZUhhbmRsZXIsXG59IGZyb20gXCIuLi8uLi8uLi9nZXN0dXJlc1wiO1xuaW1wb3J0IHsgaGFzTGlmZWN5Y2xlLCBoYXNFbWl0IH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBzd2lwZSBnZXN0dXJlIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2lwZUdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogTWluaW11bSBkaXN0YW5jZSAoaW4gcGl4ZWxzKSB0byByZWNvZ25pemUgYSBzd2lwZVxuICAgKiBAZGVmYXVsdCAzMFxuICAgKi9cbiAgc3dpcGVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdGltZSAoaW4gbXMpIGluIHdoaWNoIGEgc3dpcGUgbXVzdCBiZSBjb21wbGV0ZWRcbiAgICogQGRlZmF1bHQgMzAwXG4gICAqL1xuICBzd2lwZVRpbWVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJldmVudCBkZWZhdWx0IGJlaGF2aW9ycyBvbiB0b3VjaCBldmVudHNcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcHJldmVudERlZmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGZvciBhbnkgc3dpcGUgZGlyZWN0aW9uXG4gICAqL1xuICBvblN3aXBlPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBsZWZ0IHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZUxlZnQ/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIHJpZ2h0IHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZVJpZ2h0PzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciB1cCBzd2lwZXNcbiAgICovXG4gIG9uU3dpcGVVcD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgZG93biBzd2lwZXNcbiAgICovXG4gIG9uU3dpcGVEb3duPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHN3aXBlIHJlY29nbml0aW9uIGltbWVkaWF0ZWx5XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2l0aCBzd2lwZSBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3aXBlR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgYW55IHN3aXBlIGRpcmVjdGlvblxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25Td2lwZTogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgbGVmdCBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVMZWZ0OiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciByaWdodCBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVSaWdodDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgdXAgc3dpcGVzXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblN3aXBlVXA6IChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIGRvd24gc3dpcGVzXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblN3aXBlRG93bjogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBzd2lwZSBldmVudCBoYW5kbGVyIGZvciBhbnkgZGlyZWN0aW9uXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZTd2lwZTogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBsZWZ0IHN3aXBlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlTGVmdDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSByaWdodCBzd2lwZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZTd2lwZVJpZ2h0OiAoXG4gICAgaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkXG4gICkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gdXAgc3dpcGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmU3dpcGVVcDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBkb3duIHN3aXBlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlRG93bjogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgc3dpcGUgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZW5hYmxlU3dpcGU6ICgpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBzd2lwZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlU3dpcGU6ICgpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgc3dpcGUgZGlyZWN0aW9uIGJhc2VkIG9uIGRlbHRhIFggYW5kIFlcbiAqXG4gKiBAcGFyYW0gZGVsdGFYIC0gRGlzdGFuY2UgbW92ZWQgaW4gWCBkaXJlY3Rpb25cbiAqIEBwYXJhbSBkZWx0YVkgLSBEaXN0YW5jZSBtb3ZlZCBpbiBZIGRpcmVjdGlvblxuICogQHJldHVybnMgRGlyZWN0aW9uIG9mIHRoZSBzd2lwZVxuICovXG5mdW5jdGlvbiBnZXRTd2lwZURpcmVjdGlvbihkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIpOiBTV0lQRV9ESVJFQ1RJT05TIHtcbiAgaWYgKE1hdGguYWJzKGRlbHRhWCkgPiBNYXRoLmFicyhkZWx0YVkpKSB7XG4gICAgcmV0dXJuIGRlbHRhWCA+IDAgPyBTV0lQRV9ESVJFQ1RJT05TLlJJR0hUIDogU1dJUEVfRElSRUNUSU9OUy5MRUZUO1xuICB9XG4gIHJldHVybiBkZWx0YVkgPiAwID8gU1dJUEVfRElSRUNUSU9OUy5ET1dOIDogU1dJUEVfRElSRUNUSU9OUy5VUDtcbn1cblxuLyoqXG4gKiBBZGRzIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gc3dpcGUgZGV0ZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIHN3aXBlIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggc3dpcGUgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgc3dpcGUgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudFxuICogY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAqICAgY3JlYXRlQmFzZSxcbiAqICAgd2l0aEVsZW1lbnQoLi4uKSxcbiAqICAgd2l0aFN3aXBlR2VzdHVyZSh7XG4gKiAgICAgb25Td2lwZUxlZnQ6ICgpID0+IHNob3dOZXh0UGFnZSgpLFxuICogICAgIG9uU3dpcGVSaWdodDogKCkgPT4gc2hvd1ByZXZpb3VzUGFnZSgpXG4gKiAgIH0pXG4gKiApKGNvbmZpZyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTd2lwZUdlc3R1cmUgPVxuICAoY29uZmlnOiBTd2lwZUdlc3R1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgU3dpcGVHZXN0dXJlQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCB7XG4gICAgICBzd2lwZVRocmVzaG9sZCA9IDMwLFxuICAgICAgc3dpcGVUaW1lVGhyZXNob2xkID0gMzAwLFxuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlLFxuICAgICAgb25Td2lwZSxcbiAgICAgIG9uU3dpcGVMZWZ0LFxuICAgICAgb25Td2lwZVJpZ2h0LFxuICAgICAgb25Td2lwZVVwLFxuICAgICAgb25Td2lwZURvd24sXG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgaGFuZGxlcnMgc3RvcmFnZSBieSBkaXJlY3Rpb25cbiAgICBjb25zdCBoYW5kbGVycyA9IHtcbiAgICAgIHN3aXBlOiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHN3aXBlbGVmdDogbmV3IFNldDwoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgICBzd2lwZXJpZ2h0OiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHN3aXBldXA6IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgc3dpcGVkb3duOiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIGluaXRpYWwgaGFuZGxlcnMgaWYgcHJvdmlkZWRcbiAgICBpZiAob25Td2lwZSkgaGFuZGxlcnMuc3dpcGUuYWRkKG9uU3dpcGUgYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25Td2lwZUxlZnQpXG4gICAgICBoYW5kbGVycy5zd2lwZWxlZnQuYWRkKG9uU3dpcGVMZWZ0IGFzIChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uU3dpcGVSaWdodClcbiAgICAgIGhhbmRsZXJzLnN3aXBlcmlnaHQuYWRkKG9uU3dpcGVSaWdodCBhcyAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblN3aXBlVXApXG4gICAgICBoYW5kbGVycy5zd2lwZXVwLmFkZChvblN3aXBlVXAgYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25Td2lwZURvd24pXG4gICAgICBoYW5kbGVycy5zd2lwZWRvd24uYWRkKG9uU3dpcGVEb3duIGFzIChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCk7XG5cbiAgICAvLyBHZXN0dXJlIHN0YXRlIGZvciB0cmFja2luZ1xuICAgIGxldCBzdGFydFggPSAwO1xuICAgIGxldCBzdGFydFkgPSAwO1xuICAgIGxldCBhY3RpdmUgPSBmYWxzZTtcbiAgICBsZXQgc3RhcnRUaW1lID0gMDtcbiAgICBsZXQgaXNFbmFibGVkID0gZW5hYmxlZDtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgc3dpcGUgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaFN3aXBlID0gKFxuICAgICAgZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQsXG4gICAgICBlbmRYOiBudW1iZXIsXG4gICAgICBlbmRZOiBudW1iZXJcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGVuZFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBlbmRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xuICAgICAgY29uc3QgdmVsb2NpdHkgPSBkaXN0YW5jZSAvIGR1cmF0aW9uO1xuICAgICAgY29uc3QgZGlyZWN0aW9uID0gZ2V0U3dpcGVEaXJlY3Rpb24oZGVsdGFYLCBkZWx0YVkpO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHN3aXBlIGV2ZW50XG4gICAgICBjb25zdCBzd2lwZUV2ZW50OiBTd2lwZUV2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcInN3aXBlXCIsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHRhcmdldDogZS50YXJnZXQhLFxuICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWUsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICBzd2lwZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgZGVsdGFYLFxuICAgICAgICBkZWx0YVksXG4gICAgICAgIGRpc3RhbmNlLFxuICAgICAgICB2ZWxvY2l0eSxcbiAgICAgICAgc3RhcnRYLFxuICAgICAgICBzdGFydFksXG4gICAgICAgIGVuZFgsXG4gICAgICAgIGVuZFksXG4gICAgICB9O1xuXG4gICAgICAvLyBGaXJzdCB0cmlnZ2VyIGdlbmVyaWMgc3dpcGUgaGFuZGxlcnNcbiAgICAgIGhhbmRsZXJzLnN3aXBlLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoYW5kbGVyKHN3aXBlRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiBzd2lwZSBoYW5kbGVyOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaGVuIHRyaWdnZXIgZGlyZWN0aW9uLXNwZWNpZmljIGhhbmRsZXJzXG4gICAgICBjb25zdCBkaXJlY3Rpb25LZXkgPSBgc3dpcGUke2RpcmVjdGlvbn1gIGFzIGtleW9mIHR5cGVvZiBoYW5kbGVycztcbiAgICAgIGhhbmRsZXJzW2RpcmVjdGlvbktleV0uZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIoeyAuLi5zd2lwZUV2ZW50LCB0eXBlOiBkaXJlY3Rpb25LZXkgfSBhcyBTd2lwZUV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiAke2RpcmVjdGlvbktleX0gaGFuZGxlcjpgLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBGb3J3YXJkIHRvIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbSBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoXCJzd2lwZVwiLCBzd2lwZUV2ZW50KTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoZGlyZWN0aW9uS2V5LCBzd2lwZUV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICFzd2lwZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgc3dpcGVFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgc3RhcnRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIHN0YXJ0WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgYWN0aXZlID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGVuZFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUVuZCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFhY3RpdmUgfHwgIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9XG4gICAgICAgIFwiY2hhbmdlZFRvdWNoZXNcIiBpbiBlICYmIGUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gZS5jaGFuZ2VkVG91Y2hlc1swXVxuICAgICAgICAgIDogKGUgYXMgTW91c2VFdmVudCk7XG5cbiAgICAgIGNvbnN0IGVuZFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY29uc3QgZW5kWSA9IHRvdWNoLmNsaWVudFk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBzd2lwZSBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCBkZWx0YVggPSBlbmRYIC0gc3RhcnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gZW5kWSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG5cbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBzd2lwZVxuICAgICAgaWYgKGRpc3RhbmNlID49IHN3aXBlVGhyZXNob2xkICYmIGR1cmF0aW9uIDw9IHN3aXBlVGltZVRocmVzaG9sZCkge1xuICAgICAgICBkaXNwYXRjaFN3aXBlKGUsIGVuZFgsIGVuZFkpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNldXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGhhbmRsZXJzXG4gICAgICAgIE9iamVjdC52YWx1ZXMoaGFuZGxlcnMpLmZvckVhY2goKGhhbmRsZXJTZXQpID0+IGhhbmRsZXJTZXQuY2xlYXIoKSk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8vIEFkZCBoYW5kbGVyIG1ldGhvZHNcbiAgICAgIG9uU3dpcGUoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblN3aXBlTGVmdChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVsZWZ0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblN3aXBlUmlnaHQoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlcmlnaHQuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uU3dpcGVVcChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGV1cC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb25Td2lwZURvd24oaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlZG93bi5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gUmVtb3ZlIGhhbmRsZXIgbWV0aG9kc1xuICAgICAgb2ZmU3dpcGUoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZUxlZnQoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlbGVmdC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVSaWdodChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVyaWdodC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVVcChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGV1cC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVEb3duKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZWRvd24uZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuYWJsZS9kaXNhYmxlIG1ldGhvZHNcbiAgICAgIGVuYWJsZVN3aXBlKCkge1xuICAgICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgZGlzYWJsZVN3aXBlKCkge1xuICAgICAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICAgICAgaXNFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy9sb25ncHJlc3MudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBjb21wb25lbnRzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBCYXNlQ29tcG9uZW50LCBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IExvbmdQcmVzc0V2ZW50LCBHZXN0dXJlSGFuZGxlciB9IGZyb20gXCIuLi8uLi8uLi9nZXN0dXJlc1wiO1xuaW1wb3J0IHsgaGFzTGlmZWN5Y2xlLCBoYXNFbWl0IH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBsb25nIHByZXNzIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvbmdQcmVzc0dlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogVGltZSAoaW4gbXMpIHRvIHJlY29nbml6ZSBhIGxvbmcgcHJlc3NcbiAgICogQGRlZmF1bHQgNTAwXG4gICAqL1xuICBsb25nUHJlc3NUaW1lPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEaXN0YW5jZSB0aHJlc2hvbGQgKGluIHBpeGVscykgZm9yIG1vdmVtZW50IHRoYXQgY2FuY2VscyBsb25nIHByZXNzXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICBtb3ZlVGhyZXNob2xkPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvcnMgb24gdG91Y2ggZXZlbnRzXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHByZXZlbnREZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgbG9uZyBwcmVzcyBnZXN0dXJlXG4gICAqL1xuICBvbkxvbmdQcmVzcz86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uIGltbWVkaWF0ZWx5XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2l0aCBsb25nIHByZXNzIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9uZ1ByZXNzR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgbG9uZyBwcmVzcyBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvbkxvbmdQcmVzczogKFxuICAgIGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbiAgKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBsb25nIHByZXNzIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZkxvbmdQcmVzczogKFxuICAgIGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbiAgKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgbG9uZyBwcmVzcyByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVMb25nUHJlc3M6ICgpID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgbG9uZyBwcmVzcyByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlTG9uZ1ByZXNzOiAoKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIEFkZHMgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIGxvbmcgcHJlc3MgZGV0ZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIGxvbmcgcHJlc3Mgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBsb25nIHByZXNzIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudFxuICogY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAqICAgY3JlYXRlQmFzZSxcbiAqICAgd2l0aEVsZW1lbnQoLi4uKSxcbiAqICAgd2l0aExvbmdQcmVzc0dlc3R1cmUoe1xuICogICAgIGxvbmdQcmVzc1RpbWU6IDgwMCxcbiAqICAgICBvbkxvbmdQcmVzczogKGUpID0+IHNob3dDb250ZXh0TWVudShlLngsIGUueSlcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aExvbmdQcmVzc0dlc3R1cmUgPVxuICAoY29uZmlnOiBMb25nUHJlc3NHZXN0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJDYW5ub3QgYWRkIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCJcbiAgICAgICk7XG4gICAgICByZXR1cm4gY29tcG9uZW50IGFzIEMgJiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGxvbmdQcmVzc1RpbWUgPSA1MDAsXG4gICAgICBtb3ZlVGhyZXNob2xkID0gMTAsXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvbkxvbmdQcmVzcyxcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gICAgY29uc3QgaGFuZGxlcnM6IFNldDwoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkPiA9IG5ldyBTZXQoKTtcblxuICAgIC8vIElmIGluaXRpYWwgaGFuZGxlciBwcm92aWRlZCwgYWRkIGl0XG4gICAgaWYgKG9uTG9uZ1ByZXNzKSB7XG4gICAgICBoYW5kbGVycy5hZGQob25Mb25nUHJlc3MgYXMgKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgLy8gR2VzdHVyZSBzdGF0ZSBmb3IgdHJhY2tpbmdcbiAgICBsZXQgc3RhcnRYID0gMDtcbiAgICBsZXQgc3RhcnRZID0gMDtcbiAgICBsZXQgY3VycmVudFggPSAwO1xuICAgIGxldCBjdXJyZW50WSA9IDA7XG4gICAgbGV0IGFjdGl2ZSA9IGZhbHNlO1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBsb25nUHJlc3NUaW1lcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIGxvbmcgcHJlc3MgZXZlbnQgdG8gYWxsIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hMb25nUHJlc3MgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgbG9uZyBwcmVzcyBldmVudFxuICAgICAgY29uc3QgbG9uZ1ByZXNzRXZlbnQ6IExvbmdQcmVzc0V2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcImxvbmdwcmVzc1wiLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0ISxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbmRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2UsXG4gICAgICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICAgICAgbG9uZ1ByZXNzRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgeDogY3VycmVudFgsXG4gICAgICAgIHk6IGN1cnJlbnRZLFxuICAgICAgfTtcblxuICAgICAgLy8gQ2FsbCBlYWNoIGhhbmRsZXJcbiAgICAgIGhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoYW5kbGVyKGxvbmdQcmVzc0V2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW4gbG9uZyBwcmVzcyBoYW5kbGVyOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBGb3J3YXJkIHRvIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbSBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoXCJsb25ncHJlc3NcIiwgbG9uZ1ByZXNzRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIWxvbmdQcmVzc0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgbG9uZ1ByZXNzRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIHN0YXJ0XG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlU3RhcnQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gXCJ0b3VjaGVzXCIgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG5cbiAgICAgIHN0YXJ0WCA9IGN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIHN0YXJ0WSA9IGN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuXG4gICAgICAvLyBDYW5jZWwgYW55IGV4aXN0aW5nIHRpbWVyXG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB1cCBsb25nIHByZXNzIHRpbWVyXG4gICAgICBsb25nUHJlc3NUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IHdhcyB3aXRoaW4gdGhyZXNob2xkXG4gICAgICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFggLSBzdGFydFg7XG4gICAgICAgICAgY29uc3QgZGVsdGFZID0gY3VycmVudFkgLSBzdGFydFk7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcblxuICAgICAgICAgIGlmIChkaXN0YW5jZSA8IG1vdmVUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoTG9uZ1ByZXNzKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH0sIGxvbmdQcmVzc1RpbWUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgbW92ZVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZU1vdmUgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAvLyBDaGVjayBpZiBtb3ZlbWVudCBleGNlZWRzIHRocmVzaG9sZFxuICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBjdXJyZW50WSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG5cbiAgICAgIGlmIChkaXN0YW5jZSA+IG1vdmVUaHJlc2hvbGQpIHtcbiAgICAgICAgLy8gQ2FuY2VsIGxvbmcgcHJlc3MgaWYgbW92ZWQgdG9vIG11Y2hcbiAgICAgICAgaWYgKGxvbmdQcmVzc1RpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVFbmQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBjYW5jZWxcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2Vtb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZXVwOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNlbGVhdmU6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hzdGFydDogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNobW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGFueSB0aW1lcnNcbiAgICAgICAgaWYgKGxvbmdQcmVzc1RpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgaGFuZGxlcnNcbiAgICAgICAgaGFuZGxlcnMuY2xlYXIoKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYSBsb25nIHByZXNzIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvbkxvbmdQcmVzcyhoYW5kbGVyOiAoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhIGxvbmcgcHJlc3MgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9mZkxvbmdQcmVzcyhoYW5kbGVyOiAoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUxvbmdQcmVzcygpIHtcbiAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVMb25nUHJlc3MoKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgYW55IHRpbWVyc1xuICAgICAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgICBsb25nUHJlc3NUaW1lciA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3Bhbi50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB0eXBlIHsgQmFzZUNvbXBvbmVudCwgRWxlbWVudENvbXBvbmVudCB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgeyBQYW5FdmVudCwgR2VzdHVyZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vLi4vZ2VzdHVyZXNcIjtcbmltcG9ydCB7IGhhc0xpZmVjeWNsZSwgaGFzRW1pdCB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgcGFuIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhbkdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JzIG9uIHRvdWNoIGV2ZW50c1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBzdGFydCAoZmlyc3QgbW92ZW1lbnQpXG4gICAqL1xuICBvblBhblN0YXJ0PzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBtb3ZlIChjb250aW51b3VzIHVwZGF0ZXMgZHVyaW5nIHBhbilcbiAgICovXG4gIG9uUGFuPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBlbmQgKHRvdWNoL21vdXNlIHJlbGVhc2UpXG4gICAqL1xuICBvblBhbkVuZD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBwYW4gcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIEV4dGVuZCB0aGUgUGFuRXZlbnQgaW50ZXJmYWNlIHRvIHN1cHBvcnQgb3VyIGN1c3RvbSBldmVudCB0eXBlc1xuICovXG5pbnRlcmZhY2UgRXh0ZW5kZWRQYW5FdmVudCBleHRlbmRzIE9taXQ8UGFuRXZlbnQsIFwidHlwZVwiPiB7XG4gIHR5cGU6IFwicGFuXCIgfCBcInBhbnN0YXJ0XCIgfCBcInBhbmVuZFwiO1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhbkdlc3R1cmVDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBzdGFydFxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25QYW5TdGFydDogKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpID0+IFBhbkdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBtb3ZlIChjb250aW51b3VzIHVwZGF0ZXMpXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblBhbjogKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpID0+IFBhbkdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBlbmRcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uUGFuRW5kOiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIHN0YXJ0IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlBhblN0YXJ0OiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIG1vdmUgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmUGFuOiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIGVuZCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZQYW5FbmQ6IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgcGFuIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZVBhbjogKCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBwYW4gcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZGlzYWJsZVBhbjogKCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBZGRzIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIHBhbiBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgcGFuIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggcGFuIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoUGFuR2VzdHVyZSh7XG4gKiAgICAgb25QYW5TdGFydDogKGUpID0+IHN0YXJ0RHJhZyhlKSxcbiAqICAgICBvblBhbjogKGUpID0+IHVwZGF0ZURyYWdQb3NpdGlvbihlKSxcbiAqICAgICBvblBhbkVuZDogKGUpID0+IGVuZERyYWcoZSlcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFBhbkdlc3R1cmUgPVxuICAoY29uZmlnOiBQYW5HZXN0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIFBhbkdlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgcGFuIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIFBhbkdlc3R1cmVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlLFxuICAgICAgb25QYW5TdGFydCxcbiAgICAgIG9uUGFuLFxuICAgICAgb25QYW5FbmQsXG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgaGFuZGxlcnMgc3RvcmFnZSBieSBwYW4gcGhhc2VcbiAgICBjb25zdCBoYW5kbGVycyA9IHtcbiAgICAgIHBhbnN0YXJ0OiBuZXcgU2V0PChldmVudDogUGFuRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgICBwYW46IG5ldyBTZXQ8KGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHBhbmVuZDogbmV3IFNldDwoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkPigpLFxuICAgIH07XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBoYW5kbGVycyBpZiBwcm92aWRlZFxuICAgIGlmIChvblBhblN0YXJ0KVxuICAgICAgaGFuZGxlcnMucGFuc3RhcnQuYWRkKG9uUGFuU3RhcnQgYXMgKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uUGFuKSBoYW5kbGVycy5wYW4uYWRkKG9uUGFuIGFzIChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblBhbkVuZCkgaGFuZGxlcnMucGFuZW5kLmFkZChvblBhbkVuZCBhcyAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKTtcblxuICAgIC8vIEdlc3R1cmUgc3RhdGUgZm9yIHRyYWNraW5nXG4gICAgbGV0IHN0YXJ0WCA9IDA7XG4gICAgbGV0IHN0YXJ0WSA9IDA7XG4gICAgbGV0IGxhc3RYID0gMDtcbiAgICBsZXQgbGFzdFkgPSAwO1xuICAgIGxldCBjdXJyZW50WCA9IDA7XG4gICAgbGV0IGN1cnJlbnRZID0gMDtcbiAgICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gICAgbGV0IGlzUGFubmluZyA9IGZhbHNlO1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcGFuIGV2ZW50IHdpdGggdGhlIGN1cnJlbnQgc3RhdGVcbiAgICAgKi9cbiAgICBjb25zdCBjcmVhdGVQYW5FdmVudCA9IChcbiAgICAgIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LFxuICAgICAgdHlwZTogXCJwYW5zdGFydFwiIHwgXCJwYW5cIiB8IFwicGFuZW5kXCJcbiAgICApOiBFeHRlbmRlZFBhbkV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50OiBFeHRlbmRlZFBhbkV2ZW50ID0ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0ISxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbmRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2UsXG4gICAgICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICAgICAgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVsdGFYOiBjdXJyZW50WCAtIHN0YXJ0WCxcbiAgICAgICAgZGVsdGFZOiBjdXJyZW50WSAtIHN0YXJ0WSxcbiAgICAgICAgc3RhcnRYLFxuICAgICAgICBzdGFydFksXG4gICAgICAgIGN1cnJlbnRYLFxuICAgICAgICBjdXJyZW50WSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgcGFuIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hQYW4gPSAoXG4gICAgICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCxcbiAgICAgIHR5cGU6IFwicGFuc3RhcnRcIiB8IFwicGFuXCIgfCBcInBhbmVuZFwiXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBleHRlbmRlZFBhbkV2ZW50ID0gY3JlYXRlUGFuRXZlbnQoZSwgdHlwZSk7XG5cbiAgICAgIC8vIENhbGwgZWFjaCBoYW5kbGVyIGZvciB0aGlzIHBoYXNlXG4gICAgICBoYW5kbGVyc1t0eXBlXS5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVHlwZSBhc3NlcnRpb24gZm9yIHRoZSBoYW5kbGVyIGNhbGwgLSB3ZSdyZSBkZWxpYmVyYXRlbHkgcGFzc2luZyBvdXIgZXh0ZW5kZWQgZXZlbnRcbiAgICAgICAgICBoYW5kbGVyKGV4dGVuZGVkUGFuRXZlbnQgYXMgdW5rbm93biBhcyBQYW5FdmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gJHt0eXBlfSBoYW5kbGVyOmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZvcndhcmQgdG8gY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgICBjb21wb25lbnQuZW1pdCh0eXBlLCBleHRlbmRlZFBhbkV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICFleHRlbmRlZFBhbkV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgZXh0ZW5kZWRQYW5FdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgc3RhcnRYID0gbGFzdFggPSBjdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBzdGFydFkgPSBsYXN0WSA9IGN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBtb3ZlXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlTW92ZSA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFhY3RpdmUgfHwgIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICAvLyBVcGRhdGUgcG9zaXRpb25cbiAgICAgIGxhc3RYID0gY3VycmVudFg7XG4gICAgICBsYXN0WSA9IGN1cnJlbnRZO1xuICAgICAgY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgbW92ZW1lbnQgZGVsdGFcbiAgICAgIGNvbnN0IG1vdmVEZWx0YVggPSBjdXJyZW50WCAtIGxhc3RYO1xuICAgICAgY29uc3QgbW92ZURlbHRhWSA9IGN1cnJlbnRZIC0gbGFzdFk7XG4gICAgICBjb25zdCBtb3ZlRGVsdGEgPSBNYXRoLnNxcnQoXG4gICAgICAgIG1vdmVEZWx0YVggKiBtb3ZlRGVsdGFYICsgbW92ZURlbHRhWSAqIG1vdmVEZWx0YVlcbiAgICAgICk7XG5cbiAgICAgIC8vIERldGVjdCBzaWduaWZpY2FudCBtb3ZlbWVudFxuICAgICAgaWYgKG1vdmVEZWx0YSA+IDApIHtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc2lnbmlmaWNhbnQgbW92ZW1lbnQsIHRyaWdnZXIgcGFuc3RhcnRcbiAgICAgICAgaWYgKCFpc1Bhbm5pbmcpIHtcbiAgICAgICAgICBpc1Bhbm5pbmcgPSB0cnVlO1xuICAgICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuc3RhcnRcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVuIHRyaWdnZXIgdGhlIGNvbnRpbnVvdXMgcGFuIGV2ZW50XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuXCIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgZW5kXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRW5kID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIElmIHdlIHdlcmUgcGFubmluZywgdHJpZ2dlciB0aGUgcGFuZW5kIGV2ZW50XG4gICAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuZW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgY2FuY2VsXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIElmIHdlIHdlcmUgcGFubmluZywgdHJpZ2dlciB0aGUgcGFuZW5kIGV2ZW50XG4gICAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuZW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNlbW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZWxlYXZlOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaG1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoZW5kOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoY2FuY2VsOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkIGV2ZW50IGxpc3RlbmVycyB0byBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3Qgc2V0dXBFdmVudExpc3RlbmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwge1xuICAgICAgICAgIHBhc3NpdmU6ICFwcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGV2ZW50IGxpc3RlbmVycyBmcm9tIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCByZW1vdmVFdmVudExpc3RlbmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gU2V0dXAgbGlzdGVuZXJzIGlmIGluaXRpYWxseSBlbmFibGVkXG4gICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBsaWZlY3ljbGUgaW50ZWdyYXRpb25cbiAgICBpZiAoaGFzTGlmZWN5Y2xlKGNvbXBvbmVudCkpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveTtcblxuICAgICAgY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBDbGVhbiB1cCBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgICAgICAvLyBDbGVhciBoYW5kbGVyc1xuICAgICAgICBPYmplY3QudmFsdWVzKGhhbmRsZXJzKS5mb3JFYWNoKChoYW5kbGVyU2V0KSA9PiBoYW5kbGVyU2V0LmNsZWFyKCkpO1xuXG4gICAgICAgIC8vIENhbGwgb3JpZ2luYWwgZGVzdHJveSBtZXRob2RcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95LmNhbGwoY29tcG9uZW50LmxpZmVjeWNsZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBjb21wb25lbnRcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICAvLyBBZGQgaGFuZGxlciBtZXRob2RzXG4gICAgICBvblBhblN0YXJ0KGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuc3RhcnQuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uUGFuKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblBhbkVuZChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnBhbmVuZC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gUmVtb3ZlIGhhbmRsZXIgbWV0aG9kc1xuICAgICAgb2ZmUGFuU3RhcnQoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW5zdGFydC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmUGFuKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZQYW5FbmQoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW5lbmQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuYWJsZS9kaXNhYmxlIG1ldGhvZHNcbiAgICAgIGVuYWJsZVBhbigpIHtcbiAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIGRpc2FibGVQYW4oKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvKipcbiAqIEBtb2R1bGUgY29yZS9sYXlvdXQvc2NoZW1hXG4gKiBAZGVzY3JpcHRpb24gVW5pZmllZCBsYXlvdXQgc2NoZW1hIHByb2Nlc3NvciB3aXRoIGludGVncmF0ZWQgb3B0aW1pemF0aW9uc1xuICogQ29uc29saWRhdGVzIGFycmF5LCBvYmplY3QsIEpTWCwgYW5kIHRlbXBsYXRlIHByb2Nlc3Npbmcgd2l0aCBidWlsdC1pbiBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHNcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFUyAoRXNzZW50aWFsIG9ubHkpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0Q29uZmlnIHtcbiAgLyoqIEJhc2UgbGF5b3V0IHR5cGUgKi9cbiAgdHlwZT86IFwic3RhY2tcIiB8IFwicm93XCIgfCBcImdyaWRcIiB8IHN0cmluZztcbiAgLyoqIFNwYWNpbmcgYmV0d2VlbiBlbGVtZW50cyAqL1xuICBnYXA/OiBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBBZGRpdGlvbmFsIENTUyBjbGFzc2VzICovXG4gIGNsYXNzPzogc3RyaW5nO1xuICAvKiogQWxpZ25tZW50IG9mIGl0ZW1zIGFsb25nIHRoZSBjcm9zcyBheGlzICovXG4gIGFsaWduPzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgfCBcInN0cmV0Y2hcIjtcbiAgLyoqIEFsaWdubWVudCBvZiBpdGVtcyBhbG9uZyB0aGUgbWFpbiBheGlzICovXG4gIGp1c3RpZnk/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwiYmV0d2VlblwiIHwgXCJhcm91bmRcIiB8IFwiZXZlbmx5XCI7XG4gIC8qKiBXaGV0aGVyIGFuZCBob3cgaXRlbXMgc2hvdWxkIHdyYXAgKi9cbiAgd3JhcD86IGJvb2xlYW4gfCBcInJldmVyc2VcIiB8IFwibm93cmFwXCI7XG4gIC8qKiBXaGV0aGVyIHJvdyBpdGVtcyBzaG91bGQgc3RhY2sgdmVydGljYWxseSBvbiBtb2JpbGUgKi9cbiAgbW9iaWxlU3RhY2s/OiBib29sZWFuO1xuICAvKiogV2hldGhlciByb3cgaXRlbXMgc2hvdWxkIHNjcm9sbCBob3Jpem9udGFsbHkgb24gbW9iaWxlICovXG4gIG1vYmlsZVNjcm9sbD86IGJvb2xlYW47XG4gIC8qKiBOdW1iZXIgb2YgY29sdW1ucyBvciBhdXRvbWF0aWMgc2l6aW5nIG1ldGhvZCAqL1xuICBjb2x1bW5zPzogbnVtYmVyIHwgXCJhdXRvLWZpdFwiIHwgXCJhdXRvLWZpbGxcIjtcbiAgLyoqIFdoZXRoZXIgdG8gdXNlIGRlbnNlIHBhY2tpbmcgYWxnb3JpdGhtIGZvciBncmlkICovXG4gIGRlbnNlPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgZ3JpZCBpdGVtcyBzaG91bGQgYWRqdXN0IGhlaWdodCBhdXRvbWF0aWNhbGx5ICovXG4gIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dEl0ZW1Db25maWcge1xuICAvKiogQ29sdW1uIHdpZHRoIGluIGEgMTItY29sdW1uIGdyaWQgKi9cbiAgd2lkdGg/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBzbWFsbCBzY3JlZW5zICovXG4gIHNtPzogbnVtYmVyO1xuICAvKiogV2lkdGggb24gbWVkaXVtIHNjcmVlbnMgKi9cbiAgbWQ/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBsYXJnZSBzY3JlZW5zICovXG4gIGxnPzogbnVtYmVyO1xuICAvKiogV2lkdGggb24gZXh0cmEtbGFyZ2Ugc2NyZWVucyAqL1xuICB4bD86IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBncmlkIGNvbHVtbnMgdG8gc3BhbiAqL1xuICBzcGFuPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGdyaWQgcm93cyB0byBzcGFuICovXG4gIHJvd1NwYW4/OiBudW1iZXI7XG4gIC8qKiBEaXNwbGF5IG9yZGVyICovXG4gIG9yZGVyPzogbnVtYmVyIHwgXCJmaXJzdFwiIHwgXCJsYXN0XCI7XG4gIC8qKiBTZWxmLWFsaWdubWVudCB3aXRoaW4gY29udGFpbmVyICovXG4gIGFsaWduPzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgfCBcInN0cmV0Y2hcIjtcbiAgLyoqIFdoZXRoZXIgaXRlbSBzaG91bGQgYXV0b21hdGljYWxseSBzaXplICovXG4gIGF1dG8/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dE9wdGlvbnMge1xuICAvKiogRGVmYXVsdCBjcmVhdG9yIGZ1bmN0aW9uIHRvIHVzZSBpZiBub3Qgc3BlY2lmaWVkIGluIHNjaGVtYSAqL1xuICBjcmVhdG9yPzogRnVuY3Rpb247XG4gIC8qKiBXaGV0aGVyIHRvIGFwcGx5IENTUyBjbGFzcyBwcmVmaXggQGRlZmF1bHQgdHJ1ZSAqL1xuICBwcmVmaXg/OiBib29sZWFuO1xuICAvKiogQWRkaXRpb25hbCBvcHRpb25zICovXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRSZXN1bHQge1xuICAvKiogVGhlIHJhdyBsYXlvdXQgb2JqZWN0IHdpdGggYWxsIGNvbXBvbmVudHMgKi9cbiAgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogUmVmZXJlbmNlIHRvIHRoZSByb290IGVsZW1lbnQgZm9yIGNvbnZlbmllbmNlICovXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgYW55O1xuICAvKiogRmxhdHRlbmVkIGNvbXBvbmVudCBtYXAgKi9cbiAgY29tcG9uZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogR2V0cyBhIGNvbXBvbmVudCBieSBuYW1lICovXG4gIGdldChuYW1lOiBzdHJpbmcpOiBhbnk7XG4gIC8qKiBHZXRzIGFsbCBjb21wb25lbnRzIGluIGEgZmxhdHRlbmVkIG1hcCAqL1xuICBnZXRBbGwoKTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgLyoqIERlc3Ryb3lzIHRoZSBsYXlvdXQsIGNsZWFuaW5nIHVwIGFsbCBjb21wb25lbnRzICovXG4gIGRlc3Ryb3koKTogdm9pZDtcbn1cblxudHlwZSBDb21wb25lbnRMaWtlID0geyBlbGVtZW50OiBIVE1MRWxlbWVudDsgW2tleTogc3RyaW5nXTogYW55IH07XG50eXBlIFNjaGVtYUl0ZW0gPSBGdW5jdGlvbiB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBTY2hlbWFJdGVtW107XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJVSUxULUlOIE9QVElNSVpBVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBGcmFnbWVudCBQb29sIGZvciBlZmZpY2llbnQgRG9jdW1lbnRGcmFnbWVudCByZXVzZVxuICogUmVkdWNlcyBHQyBwcmVzc3VyZSBpbiBoaWdoLWZyZXF1ZW5jeSBsYXlvdXQgY3JlYXRpb24gc2NlbmFyaW9zXG4gKi9cbmNsYXNzIEZyYWdtZW50UG9vbCB7XG4gIHByaXZhdGUgcG9vbDogRG9jdW1lbnRGcmFnbWVudFtdID0gW107XG4gIHByaXZhdGUgbWF4U2l6ZSA9IDg7IC8vIE9wdGltaXplZCBzaXplIGZvciBtZW1vcnkgZWZmaWNpZW5jeVxuXG4gIGdldCgpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gdGhpcy5wb29sLnBvcCgpIHx8IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgfVxuXG4gIHJlbGVhc2UoZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb29sLmxlbmd0aCA8IHRoaXMubWF4U2l6ZSAmJiBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5wb29sLnB1c2goZnJhZ21lbnQpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMucG9vbC5sZW5ndGggPSAwO1xuICB9XG59XG5cbmNvbnN0IGZyYWdtZW50UG9vbCA9IG5ldyBGcmFnbWVudFBvb2woKTtcblxuLyoqXG4gKiBDbGFzcyBuYW1lIGNhY2hlIGZvciBsYXlvdXQgY29uZmlndXJhdGlvbnNcbiAqIFJlZHVjZXMgc3RyaW5nIG9wZXJhdGlvbnMgYnkgY2FjaGluZyBnZW5lcmF0ZWQgY2xhc3MgbmFtZXNcbiAqL1xuY29uc3QgY2xhc3NDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbi8vIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG5jb25zdCBQUkVGSVggPSBcIm10cmxcIjsgLy8gVE9ETzogTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZVxuY29uc3QgUFJFRklYX1dJVEhfREFTSCA9IGAke1BSRUZJWH0tYDtcblxuLyoqXG4gKiBHZXRzIGEgY2FjaGVkIGNsYXNzIG5hbWUgZm9yIGxheW91dCBjb25maWd1cmF0aW9uXG4gKiBPcHRpbWl6ZWQgZm9yIGRpZmZlcmVudCBjbGFzcyBuYW1pbmcgcGF0dGVybnNcbiAqL1xuZnVuY3Rpb24gZ2V0Q2FjaGVkQ2xhc3NOYW1lKFxuICB0eXBlOiBzdHJpbmcsXG4gIHByb3BlcnR5OiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsXG4pOiBzdHJpbmcge1xuICBjb25zdCBrZXkgPSBgJHt0eXBlfS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWA7XG4gIGlmICghY2xhc3NDYWNoZS5oYXMoa2V5KSkge1xuICAgIGlmICh0eXBlID09PSBcIml0ZW1cIikge1xuICAgICAgY2xhc3NDYWNoZS5zZXQoXG4gICAgICAgIGtleSxcbiAgICAgICAgcHJvcGVydHkgPT09IFwiXCJcbiAgICAgICAgICA/IGBsYXlvdXRfX2l0ZW0tLSR7dmFsdWV9YFxuICAgICAgICAgIDogYGxheW91dF9faXRlbS0tJHtwcm9wZXJ0eX0tJHt2YWx1ZX1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGxheW91dCBjbGFzc2VzLCBhbGlnbiB1c2VzIGxheW91dC0te3R5cGV9LXt2YWx1ZX1cbiAgICAgIC8vIGJ1dCBqdXN0aWZ5IGFuZCBvdGhlcnMgdXNlIGxheW91dC0te3R5cGV9LXtwcm9wZXJ0eX0te3ZhbHVlfVxuICAgICAgaWYgKHByb3BlcnR5ID09PSBcImFsaWduXCIpIHtcbiAgICAgICAgY2xhc3NDYWNoZS5zZXQoa2V5LCBgbGF5b3V0LS0ke3R5cGV9LSR7dmFsdWV9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc0NhY2hlLnNldChrZXksIGBsYXlvdXQtLSR7dHlwZX0tJHtwcm9wZXJ0eX0tJHt2YWx1ZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNsYXNzQ2FjaGUuZ2V0KGtleSkhO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPUFRJTUlaRUQgVVRJTElUSUVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBjb21wb25lbnQgb2JqZWN0IChoYXMgYW4gZWxlbWVudCBwcm9wZXJ0eSlcbiAqL1xuZnVuY3Rpb24gaXNDb21wb25lbnQodmFsdWU6IGFueSk6IHZhbHVlIGlzIENvbXBvbmVudExpa2Uge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIFwiZWxlbWVudFwiIGluIHZhbHVlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkb2N1bWVudCBmcmFnbWVudCB1c2luZyBwb29saW5nIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnQoKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gIHJldHVybiBmcmFnbWVudFBvb2wuZ2V0KCk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgYSBmcmFnbWVudCBiYWNrIHRvIHRoZSBwb29sIGZvciByZXVzZVxuICovXG5mdW5jdGlvbiByZWxlYXNlRnJhZ21lbnQoZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgZnJhZ21lbnRQb29sLnJlbGVhc2UoZnJhZ21lbnQpO1xufVxuXG4vKipcbiAqIE9wdGltaXplZCBjbGFzcyBwcm9jZXNzaW5nIHdpdGggbWluaW1hbCBzdHJpbmcgb3BlcmF0aW9uc1xuICogSGFuZGxlcyBhcnJheXMsIHN0cmluZ3MsIGNsYXNzTmFtZSBhbGlhc2VzLCBhbmQgcmF3Q2xhc3MgZWZmaWNpZW50bHlcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NsYXNzTmFtZXMoXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHNraXBQcmVmaXggPSBmYWxzZSxcbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBpZiAoIW9wdGlvbnMpIHJldHVybiBvcHRpb25zO1xuXG4gIGNvbnN0IGhhc1Jhd0NsYXNzID0gb3B0aW9ucy5yYXdDbGFzcztcbiAgY29uc3QgaGFzUmVndWxhckNsYXNzID0gb3B0aW9ucy5jbGFzcyB8fCBvcHRpb25zLmNsYXNzTmFtZTtcblxuICAvLyBGYXN0IHBhdGg6IG5vIGNsYXNzIHByb3BlcnRpZXMgYXQgYWxsXG4gIGlmICghaGFzUmF3Q2xhc3MgJiYgIWhhc1JlZ3VsYXJDbGFzcykgcmV0dXJuIG9wdGlvbnM7XG5cbiAgLy8gRmFzdCBwYXRoOiBvbmx5IHJhd0NsYXNzIGFuZCBza2lwcGluZyBwcmVmaXggKG1vc3QgY29tbW9uIHJhd0NsYXNzIHNjZW5hcmlvKVxuICBpZiAoaGFzUmF3Q2xhc3MgJiYgIWhhc1JlZ3VsYXJDbGFzcyAmJiBza2lwUHJlZml4KSB7XG4gICAgY29uc3QgcHJvY2Vzc2VkID0geyAuLi5vcHRpb25zIH07XG4gICAgZGVsZXRlIHByb2Nlc3NlZC5yYXdDbGFzcztcblxuICAgIC8vIERpcmVjdCBhc3NpZ25tZW50IGZvciBzaW1wbGUgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBoYXNSYXdDbGFzcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcHJvY2Vzc2VkLmNsYXNzID0gaGFzUmF3Q2xhc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhbmRsZSBhcnJheSBjYXNlXG4gICAgICBwcm9jZXNzZWQuY2xhc3MgPSBoYXNSYXdDbGFzcy5qb2luKFwiIFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3NlZDtcbiAgfVxuXG4gIC8vIEZ1bGwgcHJvY2Vzc2luZyBwYXRoIChvbmx5IHdoZW4gbmVlZGVkKVxuICBjb25zdCBwcm9jZXNzZWQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgbGV0IGZpbmFsQ2xhc3NlcyA9IFwiXCI7XG5cbiAgLy8gSGFuZGxlIHByZWZpeGVkIGNsYXNzZXMgb25seSBpZiBub3Qgc2tpcHBpbmcgcHJlZml4XG4gIGlmICghc2tpcFByZWZpeCAmJiBoYXNSZWd1bGFyQ2xhc3MpIHtcbiAgICBsZXQgcHJlZml4ZWRTdHJpbmcgPSBcIlwiO1xuXG4gICAgaWYgKHByb2Nlc3NlZC5jbGFzcykge1xuICAgICAgcHJlZml4ZWRTdHJpbmcgKz0gQXJyYXkuaXNBcnJheShwcm9jZXNzZWQuY2xhc3MpXG4gICAgICAgID8gcHJvY2Vzc2VkLmNsYXNzLmpvaW4oXCIgXCIpXG4gICAgICAgIDogcHJvY2Vzc2VkLmNsYXNzO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzc2VkLmNsYXNzTmFtZSkge1xuICAgICAgcHJlZml4ZWRTdHJpbmcgKz0gKHByZWZpeGVkU3RyaW5nID8gXCIgXCIgOiBcIlwiKSArIHByb2Nlc3NlZC5jbGFzc05hbWU7XG4gICAgfVxuXG4gICAgaWYgKHByZWZpeGVkU3RyaW5nKSB7XG4gICAgICBmaW5hbENsYXNzZXMgPSBwcmVmaXhlZFN0cmluZ1xuICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5tYXAoKGNscykgPT5cbiAgICAgICAgICBjbHMuc3RhcnRzV2l0aChQUkVGSVhfV0lUSF9EQVNIKSA/IGNscyA6IFBSRUZJWF9XSVRIX0RBU0ggKyBjbHMsXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSByYXdDbGFzcyAoYWx3YXlzIHByb2Nlc3NlZCB3aGVuIHByZXNlbnQpXG4gIGlmIChoYXNSYXdDbGFzcykge1xuICAgIGNvbnN0IHJhd1N0cmluZyA9IEFycmF5LmlzQXJyYXkoaGFzUmF3Q2xhc3MpXG4gICAgICA/IGhhc1Jhd0NsYXNzLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKVxuICAgICAgOiBoYXNSYXdDbGFzcztcblxuICAgIGZpbmFsQ2xhc3NlcyArPSAoZmluYWxDbGFzc2VzID8gXCIgXCIgOiBcIlwiKSArIHJhd1N0cmluZztcbiAgfVxuXG4gIGlmIChmaW5hbENsYXNzZXMpIHtcbiAgICBwcm9jZXNzZWQuY2xhc3MgPSBmaW5hbENsYXNzZXM7XG4gIH1cblxuICAvLyBDbGVhbiB1cCBpbiBvbmUgb3BlcmF0aW9uXG4gIGRlbGV0ZSBwcm9jZXNzZWQuY2xhc3NOYW1lO1xuICBkZWxldGUgcHJvY2Vzc2VkLnJhd0NsYXNzO1xuXG4gIHJldHVybiBwcm9jZXNzZWQ7XG59XG5cbi8qKlxuICogT3B0aW1pemVkIHBhcmFtZXRlciBleHRyYWN0aW9uIGZvciBhcnJheSBzY2hlbWFzXG4gKiBSZWR1Y2VzIG11bHRpcGxlIGFycmF5IGxvb2t1cHMgd2l0aCBiYXRjaCBwcm9jZXNzaW5nXG4gKi9cbmludGVyZmFjZSBFeHRyYWN0ZWRQYXJhbWV0ZXJzIHtcbiAgY3JlYXRvcjogRnVuY3Rpb247XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGNvbnN1bWVkOiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQYXJhbWV0ZXJzKFxuICBzY2hlbWE6IFNjaGVtYUl0ZW1bXSxcbiAgc3RhcnRJbmRleDogbnVtYmVyLFxuICBkZWZhdWx0Q3JlYXRvcjogRnVuY3Rpb24sXG4pOiBFeHRyYWN0ZWRQYXJhbWV0ZXJzIHtcbiAgY29uc3QgaXRlbXMgPSBzY2hlbWEuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIDMpO1xuICBsZXQgY3JlYXRvciwgbmFtZSwgb3B0aW9ucztcbiAgbGV0IGNvbnN1bWVkID0gMTtcblxuICBjb25zdCBbZmlyc3QsIHNlY29uZCwgdGhpcmRdID0gaXRlbXM7XG5cbiAgaWYgKHR5cGVvZiBmaXJzdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY3JlYXRvciA9IGZpcnN0O1xuICAgIGlmICh0eXBlb2Ygc2Vjb25kID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBuYW1lID0gc2Vjb25kO1xuICAgICAgY29uc3VtZWQgPSAyO1xuICAgICAgaWYgKGlzT2JqZWN0KHRoaXJkKSkge1xuICAgICAgICBvcHRpb25zID0gdGhpcmQ7XG4gICAgICAgIGNvbnN1bWVkID0gMztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHNlY29uZCkpIHtcbiAgICAgIG9wdGlvbnMgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBmaXJzdCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNyZWF0b3IgPSBkZWZhdWx0Q3JlYXRvcjtcbiAgICBuYW1lID0gZmlyc3Q7XG4gICAgaWYgKGlzT2JqZWN0KHNlY29uZCkpIHtcbiAgICAgIG9wdGlvbnMgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGZpcnN0KSkge1xuICAgIGNyZWF0b3IgPSBkZWZhdWx0Q3JlYXRvcjtcbiAgICBvcHRpb25zID0gZmlyc3Q7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNyZWF0b3I6IGNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3IsXG4gICAgbmFtZSxcbiAgICBvcHRpb25zOiAob3B0aW9ucyB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjb25zdW1lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgb2JqZWN0IHR5cGUgY2hlY2tcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRE9NIFVUSUxJVElFUyAoU2ltcGxpZmllZClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBTaW1wbGUgRE9NIGVsZW1lbnQgY3JlYXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudChvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pOiBIVE1MRWxlbWVudCB7XG4gIGNvbnN0IHRhZyA9IG9wdGlvbnMudGFnIHx8IFwiZGl2XCI7XG4gIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG5cbiAgaWYgKG9wdGlvbnMuY2xhc3MpIHtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IG9wdGlvbnMuY2xhc3M7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdHlsZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zdHlsZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBvcHRpb25zLnN0eWxlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLnN0eWxlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIG9wdGlvbnMuc3R5bGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLnRleHRDb250ZW50KSB7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbnMudGV4dENvbnRlbnQ7XG4gIH1cblxuICBpZiAob3B0aW9ucy50ZXh0KSB7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbnMudGV4dDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuXG4vKipcbiAqIEFkZHMgYSBDU1MgY2xhc3MgdG8gYW4gZWxlbWVudFxuICovXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGVsZW1lbnQgJiYgY2xhc3NOYW1lKSB7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgZWxlbWVudCBoYXMgYSBDU1MgY2xhc3NcbiAqL1xuZnVuY3Rpb24gaGFzQ2xhc3MoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVOSUZJRUQgQ09NUE9ORU5UIENSRUFUSU9OICh3aXRoIGRlc3RydWN0dXJpbmcgb3B0aW1pemF0aW9uKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21wb25lbnQgaW5zdGFuY2Ugd2l0aCBvcHRpbWl6ZWQgb3B0aW9uIHByb2Nlc3NpbmdcbiAqIFVzZXMgZGVzdHJ1Y3R1cmluZyBmb3IgY2xlYW5lciBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKFxuICBDb21wb25lbnQ6IGFueSxcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuKTogYW55IHtcbiAgdHJ5IHtcbiAgICAvLyBEZXN0cnVjdHVyZSBzcGVjaWFsIGNvbmZpZ3MgaW4gb25lIG9wZXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGxheW91dDogbGF5b3V0Q29uZmlnLFxuICAgICAgbGF5b3V0SXRlbTogbGF5b3V0SXRlbUNvbmZpZyxcbiAgICAgIHN0eWxlOiBzdHlsZUNvbmZpZyxcbiAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXNDb25maWcsXG4gICAgICBldmVudHM6IGV2ZW50c0NvbmZpZyxcbiAgICAgIGV2ZW50LCAvLyBMZWdhY3kgc3VwcG9ydFxuICAgICAgLi4uY2xlYW5PcHRpb25zXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBVc2UgZXZlbnRzIG92ZXIgZXZlbnQgKGV2ZW50cyBpcyBwcmVmZXJyZWQpXG4gICAgY29uc3QgZmluYWxFdmVudHNDb25maWcgPSBldmVudHNDb25maWcgfHwgZXZlbnQ7XG5cbiAgICAvLyBJZiBzdHlsZSBpcyBhIHN0cmluZywgYWx3YXlzIHBhc3MgaXQgdGhyb3VnaCB0byB0aGUgY29tcG9uZW50XG4gICAgaWYgKHN0eWxlQ29uZmlnICYmIHR5cGVvZiBzdHlsZUNvbmZpZyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY2xlYW5PcHRpb25zLnN0eWxlID0gc3R5bGVDb25maWc7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNvbXBvbmVudFxuICAgIGNvbnN0IGlzQ2xhc3MgPVxuICAgICAgdHlwZW9mIENvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKENvbXBvbmVudCwgXCJwcm90b3R5cGVcIik/LndyaXRhYmxlID09PVxuICAgICAgICBmYWxzZTtcblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IGlzQ2xhc3NcbiAgICAgID8gbmV3IENvbXBvbmVudChjbGVhbk9wdGlvbnMpXG4gICAgICA6IENvbXBvbmVudChjbGVhbk9wdGlvbnMpO1xuXG4gICAgLy8gQXBwbHkgY29uZmlndXJhdGlvbnMgaWYgY29tcG9uZW50IGhhcyBlbGVtZW50XG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50IHx8XG4gICAgICAgIChjb21wb25lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGNvbXBvbmVudCA6IG51bGwpO1xuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gQXBwbHkgbGF5b3V0IGNsYXNzZXNcbiAgICAgICAgaWYgKGxheW91dENvbmZpZykgYXBwbHlMYXlvdXRDbGFzc2VzKGVsZW1lbnQsIGxheW91dENvbmZpZyk7XG5cbiAgICAgICAgLy8gQXBwbHkgbGF5b3V0IGl0ZW0gY2xhc3Nlc1xuICAgICAgICBpZiAobGF5b3V0SXRlbUNvbmZpZykgYXBwbHlMYXlvdXRJdGVtQ2xhc3NlcyhlbGVtZW50LCBsYXlvdXRJdGVtQ29uZmlnKTtcblxuICAgICAgICAvLyBBcHBseSBzdHlsZVxuICAgICAgICBpZiAoc3R5bGVDb25maWcgJiYgdHlwZW9mIHN0eWxlQ29uZmlnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZUNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBhdHRyaWJ1dGVzXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzQ29uZmlnICYmIHR5cGVvZiBhdHRyaWJ1dGVzQ29uZmlnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlc0NvbmZpZykpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgZXZlbnRzXG4gICAgICAgIGlmIChmaW5hbEV2ZW50c0NvbmZpZyAmJiB0eXBlb2YgZmluYWxFdmVudHNDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaW5hbEV2ZW50c0NvbmZpZykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXZlbnREZWYgb2YgZmluYWxFdmVudHNDb25maWcpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnREZWYpICYmIGV2ZW50RGVmLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2V2ZW50TmFtZSwgaGFuZGxlcl0gPSBldmVudERlZjtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnROYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICAgICAgZmluYWxFdmVudHNDb25maWcsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjcmVhdGluZyBjb21wb25lbnQgaW5zdGFuY2U6XCIsIGVycm9yKTtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJTlRFR1JBVEVEIExBWU9VVCBDT05GSUdVUkFUSU9OICh3aXRoIGNhY2hpbmcpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQXBwbGllcyBsYXlvdXQgY2xhc3NlcyBiYXNlZCBvbiBjb25maWd1cmF0aW9uXG4gKiBVc2VzIGludGVncmF0ZWQgY2FjaGluZyBmb3Igb3B0aW1hbCBwZXJmb3JtYW5jZVxuICovXG5mdW5jdGlvbiBhcHBseUxheW91dENsYXNzZXMoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBsYXlvdXRDb25maWc6IExheW91dENvbmZpZyxcbik6IHZvaWQge1xuICBpZiAoIWVsZW1lbnQgfHwgIWxheW91dENvbmZpZykgcmV0dXJuO1xuXG4gIC8vIEFwcGx5IGJhc2UgbGF5b3V0IHR5cGVcbiAgaWYgKGxheW91dENvbmZpZy50eXBlKSB7XG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLSR7bGF5b3V0Q29uZmlnLnR5cGV9YCk7XG4gIH1cblxuICAvLyBBcHBseSBwcm9wZXJ0aWVzIHdpdGggY2FjaGluZ1xuICBjb25zdCBsYXlvdXRUeXBlID0gbGF5b3V0Q29uZmlnLnR5cGUgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KTtcbiAgaWYgKGxheW91dFR5cGUpIHtcbiAgICBpZiAobGF5b3V0Q29uZmlnLmdhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKGxheW91dFR5cGUsIFwiZ2FwXCIsIGxheW91dENvbmZpZy5nYXApLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGxheW91dENvbmZpZy5hbGlnbikge1xuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIFBSRUZJWF9XSVRIX0RBU0ggK1xuICAgICAgICAgIGdldENhY2hlZENsYXNzTmFtZShsYXlvdXRUeXBlLCBcImFsaWduXCIsIGxheW91dENvbmZpZy5hbGlnbiksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmp1c3RpZnkpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUobGF5b3V0VHlwZSwgXCJqdXN0aWZ5XCIsIGxheW91dENvbmZpZy5qdXN0aWZ5KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gR3JpZC1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gIGlmIChsYXlvdXRDb25maWcudHlwZSA9PT0gXCJncmlkXCIgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KSA9PT0gXCJncmlkXCIpIHtcbiAgICBpZiAodHlwZW9mIGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcIm51bWJlclwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImNvbHNcIiwgbGF5b3V0Q29uZmlnLmNvbHVtbnMpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcImF1dG8tZmlsbFwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcImdyaWRcIiwgXCJmaWxsXCIsIFwiYXV0b1wiKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChsYXlvdXRDb25maWcuY29sdW1ucyA9PT0gXCJhdXRvLWZpdFwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcImdyaWRcIiwgXCJjb2xzXCIsIFwiYXV0by1maXRcIiksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmRlbnNlKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWdyaWQtZGVuc2VgKTtcbiAgICBpZiAobGF5b3V0Q29uZmlnLmF1dG9IZWlnaHQpXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZC1hdXRvLWhlaWdodGApO1xuICB9XG5cbiAgLy8gUm93LXNwZWNpZmljIHByb3BlcnRpZXNcbiAgaWYgKGxheW91dENvbmZpZy50eXBlID09PSBcInJvd1wiIHx8IGdldExheW91dFR5cGUoZWxlbWVudCkgPT09IFwicm93XCIpIHtcbiAgICBpZiAobGF5b3V0Q29uZmlnLndyYXAgPT09IGZhbHNlIHx8IGxheW91dENvbmZpZy53cmFwID09PSBcIm5vd3JhcFwiKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LW5vd3JhcGApO1xuICAgIH0gZWxzZSBpZiAobGF5b3V0Q29uZmlnLndyYXAgPT09IFwicmV2ZXJzZVwiKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LXdyYXAtcmV2ZXJzZWApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLm1vYmlsZVN0YWNrKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLXJvdy1tb2JpbGUtc3RhY2tgKTtcbiAgICBpZiAobGF5b3V0Q29uZmlnLm1vYmlsZVNjcm9sbClcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctbW9iaWxlLXNjcm9sbGApO1xuICB9XG5cbiAgLy8gQ3VzdG9tIGNsYXNzZXNcbiAgaWYgKGxheW91dENvbmZpZy5jbGFzcykge1xuICAgIGxheW91dENvbmZpZy5jbGFzc1xuICAgICAgLnNwbGl0KFwiIFwiKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmZvckVhY2goKGNscykgPT4gZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNscykpO1xuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBsYXlvdXQgaXRlbSBjbGFzc2VzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAqIFVzZXMgaW50ZWdyYXRlZCBjYWNoaW5nIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIGFwcGx5TGF5b3V0SXRlbUNsYXNzZXMoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBpdGVtQ29uZmlnOiBMYXlvdXRJdGVtQ29uZmlnLFxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhaXRlbUNvbmZpZykgcmV0dXJuO1xuXG4gIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0X19pdGVtYCk7XG5cbiAgLy8gV2lkdGggYW5kIHJlc3BvbnNpdmUgY2xhc3NlcyB3aXRoIGNhY2hpbmdcbiAgaWYgKGl0ZW1Db25maWcud2lkdGggJiYgaXRlbUNvbmZpZy53aWR0aCA+PSAxICYmIGl0ZW1Db25maWcud2lkdGggPD0gMTIpIHtcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIlwiLCBpdGVtQ29uZmlnLndpZHRoKSxcbiAgICApO1xuICB9XG4gIGlmIChpdGVtQ29uZmlnLnNtKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic21cIiwgaXRlbUNvbmZpZy5zbSksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcubWQpXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJtZFwiLCBpdGVtQ29uZmlnLm1kKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5sZylcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcImxnXCIsIGl0ZW1Db25maWcubGcpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLnhsKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwieGxcIiwgaXRlbUNvbmZpZy54bCksXG4gICAgKTtcblxuICAvLyBHcmlkIHNwYW4gY2xhc3Nlc1xuICBpZiAoaXRlbUNvbmZpZy5zcGFuKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic3BhblwiLCBpdGVtQ29uZmlnLnNwYW4pLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLnJvd1NwYW4pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJyb3ctc3BhblwiLCBpdGVtQ29uZmlnLnJvd1NwYW4pLFxuICAgICk7XG5cbiAgLy8gT3JkZXIgYW5kIGFsaWdubWVudFxuICBpZiAoaXRlbUNvbmZpZy5vcmRlcilcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIm9yZGVyXCIsIGl0ZW1Db25maWcub3JkZXIpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmFsaWduKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic2VsZlwiLCBpdGVtQ29uZmlnLmFsaWduKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5hdXRvKVxuICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0X19pdGVtLS1hdXRvYCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbGF5b3V0IHR5cGUgZnJvbSBlbGVtZW50IGNsYXNzZXNcbiAqL1xuZnVuY3Rpb24gZ2V0TGF5b3V0VHlwZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tc3RhY2tgKVxuICAgID8gXCJzdGFja1wiXG4gICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93YClcbiAgICAgID8gXCJyb3dcIlxuICAgICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZGApXG4gICAgICAgID8gXCJncmlkXCJcbiAgICAgICAgOiBcIlwiO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIFNDSEVNQSBQUk9DRVNTT1JTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUHJvY2Vzc2VzIGFycmF5LWJhc2VkIHNjaGVtYSBkZWZpbml0aW9uc1xuICogT3B0aW1pemVkIHdpdGggcGFyYW1ldGVyIGV4dHJhY3Rpb24gYW5kIGludGVncmF0ZWQgY29uZmlndXJhdGlvblxuICovXG5mdW5jdGlvbiBwcm9jZXNzQXJyYXlTY2hlbWEoXG4gIHNjaGVtYTogU2NoZW1hSXRlbVtdIHwgYW55LFxuICBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsLFxuICBsZXZlbDogbnVtYmVyID0gMCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgbGV2ZWwrKztcbiAgY29uc3QgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGNvbnN0IGNvbXBvbmVudHM6IEFycmF5PFtzdHJpbmcsIGFueV0+ID0gW107XG4gIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgbGV0IGNvbXBvbmVudCA9IG51bGw7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcbiAgICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG4gIH1cblxuICBjb25zdCBkZWZhdWx0Q3JlYXRvciA9IChvcHRpb25zIGFzIGFueSkuY3JlYXRvciB8fCBjcmVhdGVFbGVtZW50O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaXRlbSA9IHNjaGVtYVtpXTtcbiAgICBpZiAoIWl0ZW0pIGNvbnRpbnVlO1xuXG4gICAgLy8gSGFuZGxlIG5lc3RlZCBhcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gY29tcG9uZW50IHx8IHBhcmVudEVsZW1lbnQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBwcm9jZXNzQXJyYXlTY2hlbWEoaXRlbSwgY29udGFpbmVyLCBsZXZlbCwgb3B0aW9ucyk7XG4gICAgICAvLyBNZXJnZSBuZXN0ZWQgY29tcG9uZW50cyBhcnJheSBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQubGF5b3V0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgIGNvbXBvbmVudHMucHVzaCguLi5yZXN1bHQubGF5b3V0LmNvbXBvbmVudHMpO1xuICAgICAgICBkZWxldGUgcmVzdWx0LmxheW91dC5jb21wb25lbnRzO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIHJlc3VsdC5sYXlvdXQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gVXNlIG9wdGltaXplZCBwYXJhbWV0ZXIgZXh0cmFjdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGNyZWF0b3IsXG4gICAgICBuYW1lLFxuICAgICAgb3B0aW9uczogaXRlbU9wdGlvbnMsXG4gICAgICBjb25zdW1lZCxcbiAgICB9ID0gZXh0cmFjdFBhcmFtZXRlcnMoc2NoZW1hLCBpLCBkZWZhdWx0Q3JlYXRvcik7XG5cbiAgICBpZiAoIWNyZWF0b3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIlNraXBwaW5nIHVuc3VwcG9ydGVkIGl0ZW0gdHlwZTpcIiwgaXRlbSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHRvIGRpdiBmb3IgY3JlYXRlRWxlbWVudFxuICAgIGlmIChjcmVhdG9yID09PSBjcmVhdGVFbGVtZW50ICYmICEoXCJ0YWdcIiBpbiBpdGVtT3B0aW9ucykpIHtcbiAgICAgIGl0ZW1PcHRpb25zLnRhZyA9IFwiZGl2XCI7XG4gICAgfVxuXG4gICAgLy8gQWR2YW5jZSBpbmRleCBieSBjb25zdW1lZCBpdGVtcyBtaW51cyAxIChsb29wIGluY3JlbWVudCBoYW5kbGVzIHRoZSArMSlcbiAgICBpICs9IGNvbnN1bWVkIC0gMTtcblxuICAgIC8vIFByb2Nlc3Mgb3B0aW9ucyB3aXRoIHByZWZpeCAtIG9wdGltaXplZCBkZWNpc2lvbiBsb2dpY1xuICAgIGNvbnN0IHNob3VsZEFwcGx5UHJlZml4ID1cbiAgICAgIFwicHJlZml4XCIgaW4gaXRlbU9wdGlvbnMgPyBpdGVtT3B0aW9ucy5wcmVmaXggOiBvcHRpb25zLnByZWZpeCAhPT0gZmFsc2U7XG5cbiAgICAvLyBGYXN0IHBhdGg6IHByb2Nlc3Mgb25seSB3aGVuIG5lZWRlZFxuICAgIGNvbnN0IHByb2Nlc3NlZE9wdGlvbnMgPVxuICAgICAgc2hvdWxkQXBwbHlQcmVmaXggfHwgaXRlbU9wdGlvbnMucmF3Q2xhc3NcbiAgICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhpdGVtT3B0aW9ucywgIXNob3VsZEFwcGx5UHJlZml4KVxuICAgICAgICA6IGl0ZW1PcHRpb25zOyAvLyBObyBjb3B5IG5lZWRlZCBpZiBubyBwcm9jZXNzaW5nXG5cbiAgICAvLyBBZGQgbmFtZSB0byBvcHRpb25zIGlmIG5lZWRlZFxuICAgIGlmIChcbiAgICAgIG5hbWUgJiZcbiAgICAgICEoXCJuYW1lXCIgaW4gcHJvY2Vzc2VkT3B0aW9ucykgJiZcbiAgICAgICEoY3JlYXRvciA9PT0gY3JlYXRlRWxlbWVudCB8fCAoY3JlYXRvciBhcyBhbnkpLmlzRWxlbWVudClcbiAgICApIHtcbiAgICAgIHByb2Nlc3NlZE9wdGlvbnMubmFtZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNvbXBvbmVudFxuICAgIGNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNyZWF0b3IsIHByb2Nlc3NlZE9wdGlvbnMpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBpc0NvbXBvbmVudChjb21wb25lbnQpID8gY29tcG9uZW50LmVsZW1lbnQgOiBjb21wb25lbnQ7XG5cbiAgICBpZiAobGV2ZWwgPT09IDEpIGxheW91dC5lbGVtZW50ID0gZWxlbWVudDtcbiAgICBpZiAobmFtZSkge1xuICAgICAgbGF5b3V0W25hbWVdID0gY29tcG9uZW50O1xuICAgICAgY29tcG9uZW50cy5wdXNoKFtuYW1lLCBjb21wb25lbnRdKTtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgdG8gRE9NXG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgaWYgKFwiaW5zZXJ0XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuaW5zZXJ0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29tcG9uZW50Lmluc2VydChmcmFnbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgY29tcG9uZW50Ll9jb250YWluZXIgPSBwYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgXCJvbkluc2VydGVkXCIgaW4gY29tcG9uZW50ICYmXG4gICAgICAgICAgdHlwZW9mIGNvbXBvbmVudC5vbkluc2VydGVkID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29tcG9uZW50Lm9uSW5zZXJ0ZWQocGFyZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBcHBlbmQgZnJhZ21lbnQgdG8gcGFyZW50XG4gIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBpc0NvbXBvbmVudChwYXJlbnRFbGVtZW50KVxuICAgICAgPyBwYXJlbnRFbGVtZW50LmVsZW1lbnRcbiAgICAgIDogcGFyZW50RWxlbWVudDtcbiAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgfVxuXG4gIC8vIFJlbGVhc2UgZnJhZ21lbnQgYmFjayB0byBwb29sXG4gIHJlbGVhc2VGcmFnbWVudChmcmFnbWVudCk7XG5cbiAgbGF5b3V0LmNvbXBvbmVudHMgPSBjb21wb25lbnRzO1xuICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIG9iamVjdC1iYXNlZCBzY2hlbWEgZGVmaW5pdGlvbnNcbiAqIFNpbXBsaWZpZWQgYW5kIG9wdGltaXplZCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NPYmplY3RTY2hlbWEoXG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB8IHN0cmluZyxcbiAgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgY29uc3QgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGNvbnN0IGRlZmF1bHRDcmVhdG9yID0gb3B0aW9ucy5jcmVhdG9yIHx8IGNyZWF0ZUVsZW1lbnQ7XG5cbiAgLy8gSGFuZGxlIHJvb3QgZWxlbWVudCBjcmVhdGlvblxuICBpZiAoKHNjaGVtYSBhcyBhbnkpLmVsZW1lbnQgJiYgIXBhcmVudEVsZW1lbnQpIHtcbiAgICBjb25zdCBlbGVtZW50RGVmID0gKHNjaGVtYSBhcyBhbnkpLmVsZW1lbnQ7XG4gICAgY29uc3QgY3JlYXRlRWxlbWVudEZuID0gZWxlbWVudERlZi5jcmVhdG9yIHx8IGRlZmF1bHRDcmVhdG9yO1xuXG4gICAgY29uc3QgZWxlbWVudE9wdGlvbnMgPSBlbGVtZW50RGVmLm9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcHJvY2Vzc2VkT3B0aW9ucyA9XG4gICAgICBvcHRpb25zLnByZWZpeCAhPT0gZmFsc2VcbiAgICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhlbGVtZW50T3B0aW9ucylcbiAgICAgICAgOiB7IC4uLmVsZW1lbnRPcHRpb25zIH07XG5cbiAgICBjb25zdCByb290Q29tcG9uZW50ID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoXG4gICAgICBjcmVhdGVFbGVtZW50Rm4sXG4gICAgICBwcm9jZXNzZWRPcHRpb25zLFxuICAgICk7XG4gICAgbGF5b3V0LmVsZW1lbnQgPSByb290Q29tcG9uZW50O1xuICAgIGlmIChlbGVtZW50RGVmLm5hbWUpIGxheW91dFtlbGVtZW50RGVmLm5hbWVdID0gcm9vdENvbXBvbmVudDtcblxuICAgIC8vIFByb2Nlc3MgY2hpbGRyZW5cbiAgICBpZiAoZWxlbWVudERlZi5jaGlsZHJlbikge1xuICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBpc0NvbXBvbmVudChyb290Q29tcG9uZW50KVxuICAgICAgICA/IHJvb3RDb21wb25lbnQuZWxlbWVudFxuICAgICAgICA6IHJvb3RDb21wb25lbnQ7XG4gICAgICBjb25zdCBjaGlsZFJlc3VsdCA9IHByb2Nlc3NPYmplY3RTY2hlbWEoXG4gICAgICAgIGVsZW1lbnREZWYuY2hpbGRyZW4sXG4gICAgICAgIHJvb3RFbGVtZW50LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24obGF5b3V0LCBjaGlsZFJlc3VsdC5sYXlvdXQpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIC8vIFByb2Nlc3Mgbm9ybWFsIHNjaGVtYSBlbGVtZW50c1xuICBjb25zdCBmcmFnbWVudCA9IHBhcmVudEVsZW1lbnQgPyBjcmVhdGVGcmFnbWVudCgpIDogbnVsbDtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGNvbnN0IGRlZiA9IChzY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XTtcbiAgICBpZiAoIWRlZikgY29udGludWU7XG5cbiAgICBjb25zdCBlbGVtZW50Q3JlYXRvciA9IGRlZi5jcmVhdG9yIHx8IGRlZmF1bHRDcmVhdG9yO1xuICAgIGNvbnN0IGVsZW1lbnRPcHRpb25zID0gZGVmLm9wdGlvbnMgfHwge307XG4gICAgY29uc3Qgc2hvdWxkQXBwbHlQcmVmaXggPVxuICAgICAgXCJwcmVmaXhcIiBpbiBlbGVtZW50T3B0aW9uc1xuICAgICAgICA/IGVsZW1lbnRPcHRpb25zLnByZWZpeFxuICAgICAgICA6IG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZTtcbiAgICBjb25zdCBwcm9jZXNzZWRPcHRpb25zID0gc2hvdWxkQXBwbHlQcmVmaXhcbiAgICAgID8gcHJvY2Vzc0NsYXNzTmFtZXMoZWxlbWVudE9wdGlvbnMpXG4gICAgICA6IHsgLi4uZWxlbWVudE9wdGlvbnMgfTtcblxuICAgIGlmICghZGVmLm5hbWUgJiYga2V5ICE9PSBcImVsZW1lbnRcIikge1xuICAgICAgZGVmLm5hbWUgPSBrZXk7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGVsZW1lbnRDcmVhdG9yLCBwcm9jZXNzZWRPcHRpb25zKTtcbiAgICBsYXlvdXRba2V5XSA9IGNyZWF0ZWQ7XG4gICAgaWYgKGRlZi5uYW1lICYmIGRlZi5uYW1lICE9PSBrZXkpIGxheW91dFtkZWYubmFtZV0gPSBjcmVhdGVkO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGNyZWF0ZWQpID8gY3JlYXRlZC5lbGVtZW50IDogY3JlYXRlZDtcbiAgICBpZiAoZnJhZ21lbnQpIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuXG4gICAgLy8gUHJvY2VzcyBjaGlsZHJlblxuICAgIGlmIChkZWYuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gcHJvY2Vzc09iamVjdFNjaGVtYShkZWYuY2hpbGRyZW4sIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIGNoaWxkUmVzdWx0LmxheW91dCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQXBwZW5kIHRvIHBhcmVudFxuICBpZiAocGFyZW50RWxlbWVudCAmJiBmcmFnbWVudCkge1xuICAgIGNvbnN0IHBhcmVudERvbSA9IGlzQ29tcG9uZW50KHBhcmVudEVsZW1lbnQpXG4gICAgICA/IHBhcmVudEVsZW1lbnQuZWxlbWVudFxuICAgICAgOiBwYXJlbnRFbGVtZW50O1xuICAgIHBhcmVudERvbS5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgcmVsZWFzZUZyYWdtZW50KGZyYWdtZW50KTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTEFZT1VUIFJFU1VMVCBDUkVBVElPTlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZsYXR0ZW5zIGEgbmVzdGVkIGxheW91dCBpbnRvIGEgc2ltcGxlIG9iamVjdCB3aXRoIGVsZW1lbnQgYW5kIGNvbXBvbmVudCByZWZlcmVuY2VzXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5MYXlvdXQobGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGNvbnN0IGZsYXR0ZW5lZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGlmICghbGF5b3V0IHx8IHR5cGVvZiBsYXlvdXQgIT09IFwib2JqZWN0XCIpIHJldHVybiBmbGF0dGVuZWQ7XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBsYXlvdXRba2V5XTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8XG4gICAgICAgICh0eXBlb2YgU1ZHRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHx8XG4gICAgICAgIGlzQ29tcG9uZW50KHZhbHVlKSlcbiAgICApIHtcbiAgICAgIGZsYXR0ZW5lZFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZsYXR0ZW5lZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF5b3V0IHJlc3VsdCBvYmplY3Qgd2l0aCB1dGlsaXR5IGZ1bmN0aW9uc1xuICovXG5mdW5jdGlvbiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogTGF5b3V0UmVzdWx0IHtcbiAgY29uc3QgZmxhdHRlbmVkQ29tcG9uZW50cyA9IGZsYXR0ZW5MYXlvdXQobGF5b3V0KTtcblxuICByZXR1cm4ge1xuICAgIGxheW91dCxcbiAgICBlbGVtZW50OiBsYXlvdXQuZWxlbWVudCxcbiAgICBjb21wb25lbnQ6IGZsYXR0ZW5lZENvbXBvbmVudHMsXG5cbiAgICBnZXQobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICAgIHJldHVybiBsYXlvdXRbbmFtZV0gPz8gbnVsbDtcbiAgICB9LFxuXG4gICAgZ2V0QWxsKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgcmV0dXJuIGZsYXR0ZW5lZENvbXBvbmVudHM7XG4gICAgfSxcblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAvLyBUcmFjayBkZXN0cm95ZWQgY29tcG9uZW50cyB0byBhdm9pZCBkb3VibGUtZGVzdHJveVxuICAgICAgY29uc3QgZGVzdHJveWVkID0gbmV3IFNldDxhbnk+KCk7XG5cbiAgICAgIC8vIEhlbHBlciB0byBzYWZlbHkgZGVzdHJveSBhIGNvbXBvbmVudFxuICAgICAgY29uc3QgZGVzdHJveUNvbXBvbmVudCA9IChjb21wb25lbnQ6IGFueSk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIWNvbXBvbmVudCB8fCBkZXN0cm95ZWQuaGFzKGNvbXBvbmVudCkpIHJldHVybjtcblxuICAgICAgICAvLyBTa2lwIHBsYWluIEhUTUwgZWxlbWVudHMgYW5kIG5vbi1vYmplY3RzXG4gICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCB0eXBlb2YgY29tcG9uZW50ICE9PSBcIm9iamVjdFwiKVxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGEgY29tcG9uZW50IHdpdGggZGVzdHJveSBtZXRob2RcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgZGVzdHJveWVkLmFkZChjb21wb25lbnQpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZGVzdHJveSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBkZXN0cm95IGVycm9ycyAtIGNvbXBvbmVudCBtYXkgYWxyZWFkeSBiZSBjbGVhbmVkIHVwXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBGaXJzdCBkZXN0cm95IGNvbXBvbmVudHMgZnJvbSB0aGUgY29tcG9uZW50cyBhcnJheSAoaWYgcHJlc2VudClcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBhbGwgbmFtZWQgY29tcG9uZW50cyBhcmUgZGVzdHJveWVkIGV2ZW4gaWYgbmVzdGVkXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShsYXlvdXQuY29tcG9uZW50cykpIHtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgY29tcG9uZW50XSBvZiBsYXlvdXQuY29tcG9uZW50cykge1xuICAgICAgICAgIGRlc3Ryb3lDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGVuIGl0ZXJhdGUgb3ZlciBhbGwgbGF5b3V0IGtleXMgZm9yIGFueSBtaXNzZWQgY29tcG9uZW50c1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgICAgIGlmIChrZXkgPT09IFwiZWxlbWVudFwiIHx8IGtleSA9PT0gXCJjb21wb25lbnRzXCIpIGNvbnRpbnVlO1xuICAgICAgICBkZXN0cm95Q29tcG9uZW50KGxheW91dFtrZXldKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGhlIGNvbXBvbmVudHMgYXJyYXlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheW91dC5jb21wb25lbnRzKSkge1xuICAgICAgICBsYXlvdXQuY29tcG9uZW50cy5sZW5ndGggPSAwO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgcm9vdCBlbGVtZW50IGZyb20gRE9NXG4gICAgICBpZiAobGF5b3V0LmVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGxheW91dC5lbGVtZW50KVxuICAgICAgICAgID8gbGF5b3V0LmVsZW1lbnQuZWxlbWVudFxuICAgICAgICAgIDogbGF5b3V0LmVsZW1lbnQ7XG4gICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciByZWZlcmVuY2VzIHRvIGhlbHAgR0NcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGxheW91dCkge1xuICAgICAgICBkZWxldGUgbGF5b3V0W2tleV07XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVU5JRklFRCBFTlRSWSBQT0lOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgZnJvbSB2YXJpb3VzIHNjaGVtYSBmb3JtYXRzXG4gKiBVbmlmaWVkIHByb2Nlc3NvciBmb3IgYXJyYXlzLCBvYmplY3RzLCBKU1gsIGFuZCBIVE1MIHN0cmluZ3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxheW91dChcbiAgc2NoZW1hOiBhbnksXG4gIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwsXG4gIG9wdGlvbnM6IExheW91dE9wdGlvbnMgPSB7fSxcbik6IExheW91dFJlc3VsdCB7XG4gIC8vIEhhbmRsZSBmdW5jdGlvbiBzY2hlbWFzXG4gIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBzY2hlbWEgPSBzY2hlbWEoKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBIVE1MIHN0cmluZyBzY2hlbWFzXG4gIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gc2NoZW1hLnRyaW0oKTtcbiAgICBjb25zdCBmcmFnbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQ7XG5cbiAgICBpZiAocGFyZW50RWxlbWVudCAmJiBmcmFnbWVudC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGxheW91dCA9IHsgZWxlbWVudDogZnJhZ21lbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQgfTtcbiAgICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG4gIH1cblxuICAvLyBIYW5kbGUgSlNYLWxpa2Ugc2NoZW1hcyAoYXJyYXkgd2l0aCBmdW5jdGlvbiwgc3RyaW5nLCBvYmplY3QgcGF0dGVybilcbiAgaWYgKFxuICAgIEFycmF5LmlzQXJyYXkoc2NoZW1hKSAmJlxuICAgIHNjaGVtYS5sZW5ndGggPj0gMyAmJlxuICAgIHR5cGVvZiBzY2hlbWFbMF0gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiBzY2hlbWFbMV0gPT09IFwic3RyaW5nXCIgJiZcbiAgICBpc09iamVjdChzY2hlbWFbMl0pXG4gICkge1xuICAgIHJldHVybiBwcm9jZXNzQXJyYXlTY2hlbWEoc2NoZW1hLCBwYXJlbnRFbGVtZW50LCAwLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIFJvdXRlIHRvIGFwcHJvcHJpYXRlIHByb2Nlc3NvclxuICByZXR1cm4gQXJyYXkuaXNBcnJheShzY2hlbWEpXG4gICAgPyBwcm9jZXNzQXJyYXlTY2hlbWEoc2NoZW1hLCBwYXJlbnRFbGVtZW50LCAwLCBvcHRpb25zKVxuICAgIDogcHJvY2Vzc09iamVjdFNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIG9wdGlvbnMpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFWFBPUlRTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIENsZWFyIGZ1bmN0aW9ucyBmb3IgdGhlIHVuaWZpZWQgc3lzdGVtXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDbGFzc0NhY2hlKCk6IHZvaWQge1xuICBjbGFzc0NhY2hlLmNsZWFyKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckZyYWdtZW50UG9vbCgpOiB2b2lkIHtcbiAgZnJhZ21lbnRQb29sLmNsZWFyKCk7XG59XG5cbmV4cG9ydCB7XG4gIHByb2Nlc3NDbGFzc05hbWVzLFxuICBpc0NvbXBvbmVudCxcbiAgZmxhdHRlbkxheW91dCxcbiAgYXBwbHlMYXlvdXRDbGFzc2VzLFxuICBhcHBseUxheW91dEl0ZW1DbGFzc2VzLFxuICBjcmVhdGVMYXlvdXRSZXN1bHQsXG59O1xuIiwKICAgICIvKipcbiAqIEBtb2R1bGUgY29yZS9sYXlvdXQvY29uZmlnXG4gKiBAZGVzY3JpcHRpb24gRXNzZW50aWFsIGxheW91dCBjb25maWd1cmF0aW9uIHV0aWxpdGllc1xuICogQ29yZSBmdW5jdGlvbmFsaXR5IGlzIGludGVncmF0ZWQgaW50byBzY2hlbWEudHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICovXG5cbi8vIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG5jb25zdCBQUkVGSVggPSBcIm10cmxcIjsgLy8gVE9ETzogTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSBmcm9tIG1haW4gbXRybCBjb25maWdcbmNvbnN0IFBSRUZJWF9XSVRIX0RBU0ggPSBgJHtQUkVGSVh9LWA7XG5cbi8qKlxuICogU2ltcGxlIERPTSB1dGlsaXRpZXNcbiAqL1xuZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudDogYW55LCBjbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZWxlbWVudCAmJiBjbGFzc05hbWUgJiYgZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50OiBhbnksIGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQuY2xhc3NMaXN0ICYmIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFuIHVwIHByZXZpb3VzIGxheW91dCBjbGFzc2VzIGZyb20gYW4gZWxlbWVudFxuICogVXNlZnVsIGZvciBkeW5hbWljIGNsYXNzIG1hbmFnZW1lbnRcbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2xlYW4gbGF5b3V0IGNsYXNzZXMgZnJvbVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYW51cExheW91dENsYXNzZXMoZWxlbWVudDogYW55KTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5jbGFzc0xpc3QpIHJldHVybjtcblxuICAvLyBHZXQgYWxsIGNsYXNzZXMgZnJvbSB0aGUgZWxlbWVudFxuICBjb25zdCBjbGFzc0xpc3QgPSBBcnJheS5mcm9tKGVsZW1lbnQuY2xhc3NMaXN0KSBhcyBzdHJpbmdbXTtcblxuICAvLyBGaW5kIGFuZCByZW1vdmUgbGF5b3V0LXJlbGF0ZWQgY2xhc3Nlc1xuICBjb25zdCBsYXlvdXRDbGFzc2VzID0gY2xhc3NMaXN0LmZpbHRlcihcbiAgICAoY2xzOiBzdHJpbmcpID0+XG4gICAgICBjbHMuc3RhcnRzV2l0aChgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tYCkgfHxcbiAgICAgIGNscy5pbmNsdWRlcyhgLSR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWApXG4gICk7XG5cbiAgLy8gUmVtb3ZlIGVhY2ggbGF5b3V0IGNsYXNzXG4gIGxheW91dENsYXNzZXMuZm9yRWFjaCgoY2xzOiBzdHJpbmcpID0+IHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xzKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgbGF5b3V0IHR5cGUgZnJvbSBlbGVtZW50IGNsYXNzZXNcbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2hlY2tcbiAqIEByZXR1cm5zIExheW91dCB0eXBlIGlmIGZvdW5kLCBlbXB0eSBzdHJpbmcgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXlvdXRUeXBlKGVsZW1lbnQ6IGFueSk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tc3RhY2tgKVxuICAgID8gXCJzdGFja1wiXG4gICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93YClcbiAgICA/IFwicm93XCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkYClcbiAgICA/IFwiZ3JpZFwiXG4gICAgOiBcIlwiO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgcHJlZml4IGZvciB0aGUgbGF5b3V0IHN5c3RlbVxuICogQHJldHVybnMgQ3VycmVudCBwcmVmaXggd2l0aCBkYXNoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXlvdXRQcmVmaXgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIFBSRUZJWF9XSVRIX0RBU0g7XG59XG5cbi8qKlxuICogU2V0cyBsYXlvdXQgY2xhc3NlcyBvbiBhbiBlbGVtZW50IGR5bmFtaWNhbGx5XG4gKiBVc2VmdWwgZm9yIHByb2dyYW1tYXRpYyBsYXlvdXQgdXBkYXRlc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnRcbiAqIEBwYXJhbSBsYXlvdXRUeXBlIC0gTGF5b3V0IHR5cGUgdG8gYXBwbHlcbiAqIEBwYXJhbSBjbGFzc2VzIC0gQWRkaXRpb25hbCBjbGFzc2VzIHRvIGFwcGx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRMYXlvdXRDbGFzc2VzKFxuICBlbGVtZW50OiBhbnksXG4gIGxheW91dFR5cGU6IHN0cmluZyxcbiAgY2xhc3Nlczogc3RyaW5nW10gPSBbXVxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhbGF5b3V0VHlwZSkgcmV0dXJuO1xuXG4gIC8vIENsZWFuIHVwIGV4aXN0aW5nIGxheW91dCBjbGFzc2VzIGZpcnN0XG4gIGNsZWFudXBMYXlvdXRDbGFzc2VzKGVsZW1lbnQpO1xuXG4gIC8vIEFwcGx5IGJhc2UgbGF5b3V0IHR5cGVcbiAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLSR7bGF5b3V0VHlwZX1gKTtcblxuICAvLyBBcHBseSBhZGRpdGlvbmFsIGNsYXNzZXNcbiAgY2xhc3Nlcy5mb3JFYWNoKChjbHMpID0+IHtcbiAgICBpZiAoY2xzLnN0YXJ0c1dpdGgoXCJsYXlvdXQtLVwiKSB8fCBjbHMuc3RhcnRzV2l0aChcImxheW91dF9fXCIpKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfSR7Y2xzfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBjbHMpO1xuICAgIH1cbiAgfSk7XG59XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9qc3hcbiAqIEBkZXNjcmlwdGlvbiBKU1gtbGlrZSBzeW50YXggc3VwcG9ydCBmb3IgbGF5b3V0IGNyZWF0aW9uXG4gKiBQcm92aWRlcyBhIHNpbXBsZSBoKCkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGVsZW1lbnRzIHdpdGhvdXQgUmVhY3QgZGVwZW5kZW5jeVxuICovXG5cbmltcG9ydCB0eXBlIHsgTGF5b3V0UmVzdWx0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUxheW91dCB9IGZyb20gXCIuL3NjaGVtYVwiO1xuXG4vKipcbiAqIEZyYWdtZW50IHN5bWJvbCBmb3IgSlNYIGZyYWdtZW50c1xuICovXG5leHBvcnQgY29uc3QgRnJhZ21lbnQgPSBTeW1ib2woXCJGcmFnbWVudFwiKTtcblxuLyoqXG4gKiBKU1gtbGlrZSBoeXBlcnNjcmlwdCBmdW5jdGlvblxuICogQ3JlYXRlcyBlbGVtZW50cyBpbiBhIFJlYWN0LWxpa2Ugc3ludGF4IHdpdGhvdXQgUmVhY3QgZGVwZW5kZW5jeVxuICpcbiAqIEBwYXJhbSB0YWcgLSBIVE1MIHRhZyBuYW1lLCBjb21wb25lbnQgZnVuY3Rpb24sIG9yIEZyYWdtZW50XG4gKiBAcGFyYW0gcHJvcHMgLSBFbGVtZW50IHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXNcbiAqIEBwYXJhbSBjaGlsZHJlbiAtIENoaWxkIGVsZW1lbnRzXG4gKiBAcmV0dXJucyBET00gZWxlbWVudCBvciBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGgoXG4gIHRhZzogc3RyaW5nIHwgRnVuY3Rpb24gfCB0eXBlb2YgRnJhZ21lbnQsXG4gIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwsXG4gIC4uLmNoaWxkcmVuOiBhbnlbXVxuKTogYW55IHtcbiAgLy8gSGFuZGxlIEZyYWdtZW50XG4gIGlmICh0YWcgPT09IEZyYWdtZW50KSB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPVxuICAgICAgICAgIHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIiA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoaWxkKSA6IGNoaWxkO1xuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZnJhZ21lbnQ7XG4gIH1cblxuICAvLyBIYW5kbGUgc3RyaW5nIHRhZ3MgKEhUTUwgZWxlbWVudHMpXG4gIGlmICh0eXBlb2YgdGFnID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcblxuICAgIC8vIEFwcGx5IHByb3BzXG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcykpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJjbGFzc05hbWVcIiB8fCBrZXkgPT09IFwiY2xhc3NcIikge1xuICAgICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJvblwiKSAmJiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIEV2ZW50IGhhbmRsZXJcbiAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBrZXkuc2xpY2UoMikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0eWxlXCIgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgLy8gU3R5bGUgb2JqZWN0XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCIpIHtcbiAgICAgICAgICAvLyBIVE1MIGNvbnRlbnRcbiAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IHZhbHVlLl9faHRtbCB8fCBcIlwiO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBSZWd1bGFyIGF0dHJpYnV0ZVxuICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgY2hpbGRyZW5cbiAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE5vZGUpIHtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjaGlsZCkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICAvLyBIYW5kbGUgY29tcG9uZW50IGZ1bmN0aW9uc1xuICBpZiAodHlwZW9mIHRhZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgYWxsUHJvcHMgPSBwcm9wcyB8fCB7fTtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgYWxsUHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICB9XG4gICAgcmV0dXJuIHRhZyhhbGxQcm9wcyk7XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBkaXZcbiAgcmV0dXJuIGgoXCJkaXZcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF5b3V0IHVzaW5nIEpTWC1saWtlIHN5bnRheFxuICogUHJvdmlkZXMgYSBicmlkZ2UgYmV0d2VlbiBKU1ggYW5kIHRoZSBsYXlvdXQgc3lzdGVtXG4gKlxuICogQHBhcmFtIGpzeEVsZW1lbnQgLSBKU1ggZWxlbWVudCBjcmVhdGVkIHdpdGggaCgpXG4gKiBAcGFyYW0gcGFyZW50RWxlbWVudCAtIFBhcmVudCBlbGVtZW50IHRvIGF0dGFjaCB0b1xuICogQHJldHVybnMgTGF5b3V0IHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSnN4TGF5b3V0KFxuICBqc3hFbGVtZW50OiBhbnksXG4gIHBhcmVudEVsZW1lbnQ/OiBhbnlcbik6IExheW91dFJlc3VsdCB7XG4gIC8vIENvbnZlcnQgSlNYIGVsZW1lbnQgdG8gbGF5b3V0IHNjaGVtYVxuICBjb25zdCBzY2hlbWEgPSBqc3hFbGVtZW50O1xuXG4gIC8vIENyZWF0ZSBsYXlvdXQgdXNpbmcgdGhlIHN0YW5kYXJkIGNyZWF0ZUxheW91dCBmdW5jdGlvblxuICByZXR1cm4gY3JlYXRlTGF5b3V0KHNjaGVtYSwgcGFyZW50RWxlbWVudCk7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0byBjcmVhdGUgYSBzaW1wbGUgY29tcG9uZW50IGZyb20gYSBmdW5jdGlvblxuICogVXNlZnVsIGZvciBjcmVhdGluZyByZXVzYWJsZSBKU1ggY29tcG9uZW50c1xuICpcbiAqIEBwYXJhbSBmbiAtIENvbXBvbmVudCBmdW5jdGlvblxuICogQHJldHVybnMgQ29tcG9uZW50IHRoYXQgY2FuIGJlIHVzZWQgaW4gSlNYXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb25lbnQoZm46IChwcm9wczogUmVjb3JkPHN0cmluZywgYW55PikgPT4gYW55KTogRnVuY3Rpb24ge1xuICByZXR1cm4gZnVuY3Rpb24gKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYW55IHtcbiAgICByZXR1cm4gZm4ocHJvcHMgfHwge30pO1xuICB9O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdG8gcmVuZGVyIG11bHRpcGxlIEpTWCBlbGVtZW50c1xuICogVXNlZnVsIGZvciBjcmVhdGluZyBsaXN0cyBvciBjb2xsZWN0aW9uc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50cyAtIEFycmF5IG9mIEpTWCBlbGVtZW50c1xuICogQHBhcmFtIHBhcmVudEVsZW1lbnQgLSBQYXJlbnQgZWxlbWVudCB0byBhdHRhY2ggdG9cbiAqIEByZXR1cm5zIEFycmF5IG9mIGxheW91dCByZXN1bHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJFbGVtZW50cyhcbiAgZWxlbWVudHM6IGFueVtdLFxuICBwYXJlbnRFbGVtZW50PzogYW55XG4pOiBMYXlvdXRSZXN1bHRbXSB7XG4gIHJldHVybiBlbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IGNyZWF0ZUpzeExheW91dChlbGVtZW50LCBwYXJlbnRFbGVtZW50KSk7XG59XG5cbi8qKlxuICogQ29tbW9uIEpTWCBlbGVtZW50IGNyZWF0b3JzIGZvciBjb252ZW5pZW5jZVxuICovXG5leHBvcnQgY29uc3QganN4ID0ge1xuICBkaXY6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiZGl2XCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHNwYW46IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwic3BhblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBwOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcInBcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgYnV0dG9uOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImJ1dHRvblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBpbnB1dDogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gaChcImlucHV0XCIsIHByb3BzKSxcbiAgaW1nOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBoKFwiaW1nXCIsIHByb3BzKSxcbiAgYTogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJhXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHVsOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcInVsXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGxpOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImxpXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHNlY3Rpb246IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwic2VjdGlvblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBoZWFkZXI6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiaGVhZGVyXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGZvb3RlcjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJmb290ZXJcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgbWFpbjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJtYWluXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGFydGljbGU6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiYXJ0aWNsZVwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxufTtcbiIsCiAgICAiLyoqXG4gKiBWaWV3cG9ydCAtIENvcmUgdmlydHVhbCBzY3JvbGxpbmcgZW5naW5lXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBWaWV3cG9ydENvbmZpZyxcbiAgVmlld3BvcnRDb250ZXh0LFxuICBWaWV3cG9ydENvbXBvbmVudCxcbiAgSXRlbVJhbmdlLFxuICBWaWV3cG9ydEluZm8sXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBwaXBlIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IHdpdGhCYXNlIH0gZnJvbSBcIi4vZmVhdHVyZXMvYmFzZVwiO1xuaW1wb3J0IHsgd2l0aFZpcnR1YWwgfSBmcm9tIFwiLi9mZWF0dXJlcy92aXJ0dWFsXCI7XG5pbXBvcnQgeyB3aXRoU2Nyb2xsaW5nIH0gZnJvbSBcIi4vZmVhdHVyZXMvc2Nyb2xsaW5nXCI7XG5pbXBvcnQgeyB3aXRoTW9tZW50dW0gfSBmcm9tIFwiLi9mZWF0dXJlcy9tb21lbnR1bVwiO1xuaW1wb3J0IHsgd2l0aFNjcm9sbGJhciB9IGZyb20gXCIuL2ZlYXR1cmVzL3Njcm9sbGJhclwiO1xuaW1wb3J0IHsgd2l0aENvbGxlY3Rpb24gfSBmcm9tIFwiLi9mZWF0dXJlcy9jb2xsZWN0aW9uXCI7XG5pbXBvcnQgeyB3aXRoUGxhY2Vob2xkZXJzIH0gZnJvbSBcIi4vZmVhdHVyZXMvcGxhY2Vob2xkZXJzXCI7XG5pbXBvcnQgeyB3aXRoUmVuZGVyaW5nIH0gZnJvbSBcIi4vZmVhdHVyZXMvcmVuZGVyaW5nXCI7XG5pbXBvcnQgeyB3aXRoRXZlbnRzIH0gZnJvbSBcIi4vZmVhdHVyZXMvZXZlbnRzXCI7XG5cbi8vIEludGVybmFsIHZpZXdwb3J0IHN0YXRlXG5pbnRlcmZhY2UgVmlld3BvcnRTdGF0ZSB7XG4gIHNjcm9sbFBvc2l0aW9uOiBudW1iZXI7XG4gIHRvdGFsSXRlbXM6IG51bWJlcjtcbiAgaXRlbVNpemU6IG51bWJlcjtcbiAgY29udGFpbmVyU2l6ZTogbnVtYmVyO1xuICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXI7XG4gIHZpc2libGVSYW5nZTogSXRlbVJhbmdlO1xuICBpdGVtc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsO1xuICB2ZWxvY2l0eTogbnVtYmVyO1xuICBzY3JvbGxEaXJlY3Rpb246IFwiZm9yd2FyZFwiIHwgXCJiYWNrd2FyZFwiO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB2aWV3cG9ydC1lbmhhbmNlZCBjb21wb25lbnQgdXNpbmcgY29tcG9zaXRpb25cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gVmlld3BvcnQgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgRnVuY3Rpb24gdGhhdCBlbmhhbmNlcyBhIGNvbXBvbmVudCB3aXRoIHZpZXdwb3J0IGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgY29uc3QgY3JlYXRlVmlld3BvcnQgPSAoY29uZmlnOiBWaWV3cG9ydENvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dD4oY29tcG9uZW50OiBUKTogVCAmIFZpZXdwb3J0Q29tcG9uZW50ID0+IHtcbiAgICAvLyBUcmFjayBpZiB2aWV3cG9ydCBoYXMgYmVlbiBpbml0aWFsaXplZCB0byBwcmV2ZW50IG11bHRpcGxlIGluaXRpYWxpemF0aW9uc1xuICAgIGxldCBpc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICAvLyBObyBub3JtYWxpemF0aW9uIG5lZWRlZCAtIHdlJ2xsIHVzZSB0aGUgbmVzdGVkIHN0cnVjdHVyZSBkaXJlY3RseVxuXG4gICAgLy8gQ3JlYXRlIHNoYXJlZCB2aWV3cG9ydCBzdGF0ZVxuICAgIGNvbnN0IHN0YXRlOiBWaWV3cG9ydFN0YXRlID0ge1xuICAgICAgc2Nyb2xsUG9zaXRpb246IDAsXG4gICAgICB0b3RhbEl0ZW1zOiBjb21wb25lbnQudG90YWxJdGVtcyB8fCAwLFxuICAgICAgaXRlbVNpemU6IGNvbmZpZy52aXJ0dWFsPy5pdGVtU2l6ZSB8fCA1MCxcbiAgICAgIGNvbnRhaW5lclNpemU6IDAsXG4gICAgICB2aXJ0dWFsVG90YWxTaXplOiAwLFxuICAgICAgdmlzaWJsZVJhbmdlOiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfSxcbiAgICAgIGl0ZW1zQ29udGFpbmVyOiBudWxsLFxuICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICBzY3JvbGxEaXJlY3Rpb246IFwiZm9yd2FyZFwiLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYmFzZSB2aWV3cG9ydCBBUElcbiAgICBjb25zdCB2aWV3cG9ydEFQSSA9IHtcbiAgICAgIC8vIENvcmUgQVBJXG4gICAgICBpbml0aWFsaXplOiAoKSA9PiB7XG4gICAgICAgIC8vIFByZXZlbnQgbXVsdGlwbGUgaW5pdGlhbGl6YXRpb25zXG4gICAgICAgIGlmIChpc0luaXRpYWxpemVkKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1ZpZXdwb3J0XSBJbml0aWFsaXppbmcgd2l0aCBzdGF0ZTpcIiwge1xuICAgICAgICAvLyAgIGVsZW1lbnQ6ICEhY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICAgIC8vICAgdG90YWxJdGVtczogY29tcG9uZW50LnRvdGFsSXRlbXMsXG4gICAgICAgIC8vICAgaXRlbVNpemU6IGNvbmZpZy52aXJ0dWFsPy5pdGVtU2l6ZSxcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBjb250YWluZXIgc2l6ZVxuICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICBzdGF0ZS5jb250YWluZXJTaXplID1cbiAgICAgICAgICAgIGNvbmZpZy5zY3JvbGxpbmc/Lm9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIlxuICAgICAgICAgICAgICA/IGNvbXBvbmVudC5lbGVtZW50Lm9mZnNldFdpZHRoXG4gICAgICAgICAgICAgIDogY29tcG9uZW50LmVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJbVmlld3BvcnRdIENvbnRhaW5lciBzaXplOlwiLCBzdGF0ZS5jb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBpbml0aWFsIHZpcnR1YWwgc2l6ZVxuICAgICAgICBzdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gc3RhdGUudG90YWxJdGVtcyAqIHN0YXRlLml0ZW1TaXplO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBpbml0aWFsIHZpc2libGUgcmFuZ2VcbiAgICAgICAgc3RhdGUudmlzaWJsZVJhbmdlID0gY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHN0YXRlLnNjcm9sbFBvc2l0aW9uKTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydF0gSW5pdGlhbCBzdGF0ZTpcIiwge1xuICAgICAgICAvLyAgIGNvbnRhaW5lclNpemU6IHN0YXRlLmNvbnRhaW5lclNpemUsXG4gICAgICAgIC8vICAgdmlydHVhbFRvdGFsU2l6ZTogc3RhdGUudmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgLy8gICB2aXNpYmxlUmFuZ2U6IHN0YXRlLnZpc2libGVSYW5nZSxcbiAgICAgICAgLy8gfSk7XG4gICAgICB9LFxuXG4gICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFudXAgd2lsbCBiZSBoYW5kbGVkIGJ5IGZlYXR1cmVzXG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVWaWV3cG9ydDogKCkgPT4ge1xuICAgICAgICAvLyBXaWxsIGJlIGltcGxlbWVudGVkIGJ5IHJlbmRlcmluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpc0luaXRpYWxpemVkOiAoKSA9PiBpc0luaXRpYWxpemVkLFxuXG4gICAgICAvLyBSZXNldCBpbml0aWFsaXphdGlvbiBzdGF0ZSAoZm9yIHJlbG9hZCBmdW5jdGlvbmFsaXR5KVxuICAgICAgcmVzZXRJbml0aWFsaXphdGlvbjogKCkgPT4ge1xuICAgICAgICBpc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvLyBBbGxvdyBmZWF0dXJlcyB0byBjaGVjayBpZiBpbml0IHNob3VsZCBwcm9jZWVkXG4gICAgICBfc2hvdWxkSW5pdDogKCkgPT4gIWlzSW5pdGlhbGl6ZWQsXG5cbiAgICAgIC8vIFNjcm9sbGluZyBBUEkgKHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBzY3JvbGxpbmcgZmVhdHVyZSlcbiAgICAgIHNjcm9sbFRvSW5kZXg6IChcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50PzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIsXG4gICAgICApID0+IHtcbiAgICAgICAgLy8gUGxhY2Vob2xkZXIgLSB3aWxsIGJlIGltcGxlbWVudGVkIGJ5IHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uOiAocG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgICAgICAvLyBXaWxsIGJlIGltcGxlbWVudGVkIGJ5IHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICBnZXRTY3JvbGxQb3NpdGlvbjogKCkgPT4gc3RhdGUuc2Nyb2xsUG9zaXRpb24sXG5cbiAgICAgIC8vIEluZm8gQVBJXG4gICAgICBnZXRWaXNpYmxlUmFuZ2U6ICgpID0+IHN0YXRlLnZpc2libGVSYW5nZSxcblxuICAgICAgZ2V0Vmlld3BvcnRJbmZvOiAoKTogVmlld3BvcnRJbmZvID0+ICh7XG4gICAgICAgIGNvbnRhaW5lclNpemU6IHN0YXRlLmNvbnRhaW5lclNpemUsXG4gICAgICAgIHRvdGFsVmlydHVhbFNpemU6IHN0YXRlLnZpcnR1YWxUb3RhbFNpemUsXG4gICAgICAgIHZpc2libGVSYW5nZTogc3RhdGUudmlzaWJsZVJhbmdlLFxuICAgICAgICB2aXJ0dWFsU2Nyb2xsUG9zaXRpb246IHN0YXRlLnNjcm9sbFBvc2l0aW9uLFxuICAgICAgfSksXG5cbiAgICAgIC8vIFJlbmRlcmluZyBBUElcbiAgICAgIHJlbmRlckl0ZW1zOiAoKSA9PiB7XG4gICAgICAgIC8vIFdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIC8vIEludGVybmFsIHN0YXRlIChmb3IgZmVhdHVyZXMgdG8gYWNjZXNzKVxuICAgICAgc3RhdGUsXG4gICAgfTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdmlzaWJsZSByYW5nZVxuICAgIGNvbnN0IGNhbGN1bGF0ZVZpc2libGVSYW5nZSA9IChzY3JvbGxQb3M6IG51bWJlcik6IEl0ZW1SYW5nZSA9PiB7XG4gICAgICBjb25zdCBpdGVtU2l6ZSA9IHN0YXRlLml0ZW1TaXplO1xuICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLmZsb29yKHNjcm9sbFBvcyAvIGl0ZW1TaXplKTtcbiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChzdGF0ZS5jb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oc3RhcnQgKyB2aXNpYmxlQ291bnQsIHN0YXRlLnRvdGFsSXRlbXMgLSAxKTtcblxuICAgICAgcmV0dXJuIHsgc3RhcnQ6IE1hdGgubWF4KDAsIHN0YXJ0KSwgZW5kOiBNYXRoLm1heCgwLCBlbmQpIH07XG4gICAgfTtcblxuICAgIC8vIEFkZCB2aWV3cG9ydCBBUEkgdG8gY29tcG9uZW50XG4gICAgY29uc3QgYmFzZUNvbXBvbmVudCA9IHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHZpZXdwb3J0OiB2aWV3cG9ydEFQSSxcbiAgICB9O1xuXG4gICAgLy8gQnVpbGQgdGhlIGVuaGFuY2VtZW50IHBpcGVsaW5lXG4gICAgY29uc3QgZW5oYW5jZXJzOiBBcnJheTwoYzogYW55KSA9PiBhbnk+ID0gW107XG5cbiAgICAvLyBFdmVudHMgc3lzdGVtIChhbHdheXMgZmlyc3QgLSBwcm92aWRlcyBjb21tdW5pY2F0aW9uIGZvciBvdGhlciBmZWF0dXJlcylcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhFdmVudHMoe1xuICAgICAgICBkZWJ1ZzogY29uZmlnLmRlYnVnLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIEJhc2Ugc2V0dXAgKGNyZWF0ZXMgRE9NIHN0cnVjdHVyZSlcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhCYXNlKHtcbiAgICAgICAgY2xhc3NOYW1lOiBjb25maWcuY2xhc3NOYW1lLFxuICAgICAgICBvcmllbnRhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gVmlydHVhbCBzY3JvbGxpbmcgKHJlcXVpcmVkIGZvciBtb3N0IGZlYXR1cmVzKVxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aFZpcnR1YWwoe1xuICAgICAgICBpdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/Lml0ZW1TaXplLFxuICAgICAgICBvdmVyc2NhbjogY29uZmlnLnZpcnR1YWw/Lm92ZXJzY2FuLFxuICAgICAgICBvcmllbnRhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24sXG4gICAgICAgIGF1dG9EZXRlY3RJdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/LmF1dG9EZXRlY3RJdGVtU2l6ZSxcbiAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4OiAoY29uZmlnIGFzIGFueSkuaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFNjcm9sbGluZyBiZWhhdmlvclxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aFNjcm9sbGluZyh7XG4gICAgICAgIG9yaWVudGF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5vcmllbnRhdGlvbixcbiAgICAgICAgc2Vuc2l0aXZpdHk6IGNvbmZpZy5zY3JvbGxpbmc/LnNlbnNpdGl2aXR5LFxuICAgICAgICBzbW9vdGhpbmc6IGNvbmZpZy5zY3JvbGxpbmc/LmFuaW1hdGlvbixcbiAgICAgICAgc3RvcE9uQ2xpY2s6IGNvbmZpZy5zY3JvbGxpbmc/LnN0b3BPbkNsaWNrLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIE1vbWVudHVtIHNjcm9sbGluZyAodG91Y2gvZHJhZyBzdXBwb3J0IGZvciBtb2JpbGUpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoTW9tZW50dW0oe1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBzdG9wT25DbGljazogY29uZmlnLnNjcm9sbGluZz8uc3RvcE9uQ2xpY2ssXG4gICAgICAgIGRlY2VsZXJhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/LmRlY2VsZXJhdGlvbixcbiAgICAgICAgbWluVmVsb2NpdHk6IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy5taW5WZWxvY2l0eSxcbiAgICAgICAgbWluRHVyYXRpb246IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy5tYXhEdXJhdGlvbixcbiAgICAgICAgbWluVmVsb2NpdHlUaHJlc2hvbGQ6IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy52ZWxvY2l0eVRocmVzaG9sZCxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBTY3JvbGxiYXIgKG9wdGlvbmFsKVxuICAgIGlmIChjb25maWcuc2Nyb2xsYmFyPy5lbmFibGVkICE9PSBmYWxzZSkge1xuICAgICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICAgIHdpdGhTY3JvbGxiYXIoe1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYXV0b0hpZGU6IGNvbmZpZy5zY3JvbGxiYXI/LmF1dG9IaWRlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGNvbGxlY3Rpb24gaWYgY29uZmlndXJlZFxuICAgIGlmIChjb25maWcuY29sbGVjdGlvbj8uYWRhcHRlcikge1xuICAgICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICAgIHdpdGhDb2xsZWN0aW9uKHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiBjb25maWcuY29sbGVjdGlvbi5hZGFwdGVyLFxuICAgICAgICAgIHJhbmdlU2l6ZTogY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0LFxuICAgICAgICAgIHN0cmF0ZWd5OiBjb25maWcucGFnaW5hdGlvbj8uc3RyYXRlZ3kgYXNcbiAgICAgICAgICAgIHwgXCJvZmZzZXRcIlxuICAgICAgICAgICAgfCBcInBhZ2VcIlxuICAgICAgICAgICAgfCBcImN1cnNvclwiXG4gICAgICAgICAgICB8IHVuZGVmaW5lZCxcbiAgICAgICAgICB0cmFuc2Zvcm06IGNvbmZpZy5jb2xsZWN0aW9uPy50cmFuc2Zvcm0sXG4gICAgICAgICAgY2FuY2VsTG9hZFRocmVzaG9sZDogY29uZmlnLnBlcmZvcm1hbmNlPy5jYW5jZWxMb2FkVGhyZXNob2xkLFxuICAgICAgICAgIG1heENvbmN1cnJlbnRSZXF1ZXN0czogY29uZmlnLnBlcmZvcm1hbmNlPy5tYXhDb25jdXJyZW50UmVxdWVzdHMsXG4gICAgICAgICAgZW5hYmxlUmVxdWVzdFF1ZXVlOiBjb25maWcucGVyZm9ybWFuY2U/LmVuYWJsZVJlcXVlc3RRdWV1ZSAhPT0gZmFsc2UsXG4gICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4OiAoY29uZmlnIGFzIGFueSkuaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgICAgIHNlbGVjdElkOiAoY29uZmlnIGFzIGFueSkuc2VsZWN0SWQsXG4gICAgICAgICAgYXV0b0xvYWQ6IChjb25maWcgYXMgYW55KS5hdXRvTG9hZCAhPT0gZmFsc2UsXG4gICAgICAgICAgYXV0b1NlbGVjdEZpcnN0OiAoY29uZmlnIGFzIGFueSkuYXV0b1NlbGVjdEZpcnN0LFxuICAgICAgICAgIG1heENhY2hlZEl0ZW1zOiBjb25maWcuY2FjaGU/Lm1heEl0ZW1zLFxuICAgICAgICAgIGV2aWN0aW9uQnVmZmVyOiBjb25maWcuY2FjaGU/LmV2aWN0aW9uQnVmZmVyLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUGxhY2Vob2xkZXJzIChvcHRpb25hbCwgcmVxdWlyZXMgY29sbGVjdGlvbilcbiAgICBpZiAoY29uZmlnLmNvbGxlY3Rpb24/LmFkYXB0ZXIgJiYgY29uZmlnLnBsYWNlaG9sZGVycz8uZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgICB3aXRoUGxhY2Vob2xkZXJzKHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGFuYWx5emVGaXJzdExvYWQ6IGNvbmZpZy5wbGFjZWhvbGRlcnM/LmFuYWx5emVGaXJzdExvYWQgPz8gdHJ1ZSxcbiAgICAgICAgICBtYXNrQ2hhcmFjdGVyOiBjb25maWcucGxhY2Vob2xkZXJzPy5tYXNrQ2hhcmFjdGVyLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyaW5nIChhbHdheXMgbGFzdCB0byBoYXZlIGFjY2VzcyB0byBhbGwgZmVhdHVyZXMpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoUmVuZGVyaW5nKHtcbiAgICAgICAgdGVtcGxhdGU6IGNvbmZpZy50ZW1wbGF0ZSxcbiAgICAgICAgb3ZlcnNjYW46IGNvbmZpZy52aXJ0dWFsPy5vdmVyc2NhbixcbiAgICAgICAgbWFpbnRhaW5Eb21PcmRlcjogY29uZmlnLnJlbmRlcmluZz8ubWFpbnRhaW5Eb21PcmRlcixcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBDb21wb3NlIGFsbCBlbmhhbmNlcnNcbiAgICBjb25zdCBlbmhhbmNlID0gcGlwZSguLi5lbmhhbmNlcnMpO1xuXG4gICAgLy8gQXBwbHkgZW5oYW5jZW1lbnRzXG4gICAgY29uc3QgZW5oYW5jZWQgPSBlbmhhbmNlKGJhc2VDb21wb25lbnQpO1xuXG4gICAgLy8gQXV0by1pbml0aWFsaXplIGlmIGVsZW1lbnQgaXMgcHJvdmlkZWRcbiAgICBpZiAoZW5oYW5jZWQuZWxlbWVudCkge1xuICAgICAgZW5oYW5jZWQudmlld3BvcnQuaW5pdGlhbGl6ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlZCBhcyBUICYgVmlld3BvcnRDb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy91dGlscy50c1xuXG4vKipcbiAqIFNoYXJlZCB1dGlsaXRpZXMgZm9yIHZpZXdwb3J0IGZlYXR1cmVzXG4gKiBFbGltaW5hdGVzIGNvZGUgZHVwbGljYXRpb24gYWNyb3NzIGZlYXR1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogV3JhcHMgdmlld3BvcnQgaW5pdGlhbGl6YXRpb24gd2l0aCBmZWF0dXJlLXNwZWNpZmljIGxvZ2ljXG4gKiBFbGltaW5hdGVzIHRoZSByZXBlYXRlZCBpbml0aWFsaXphdGlvbiBob29rIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBJbml0aWFsaXplPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oXG4gIGNvbXBvbmVudDogVCxcbiAgZmVhdHVyZUluaXQ6ICgpID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplID0gKCkgPT4ge1xuICAgIC8vIENoZWNrIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWQgKHJldHVybnMgZmFsc2UgaWYgYWxyZWFkeSBkb25lKVxuICAgIGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsSW5pdGlhbGl6ZSgpO1xuICAgIC8vIE9ubHkgcnVuIGZlYXR1cmUgaW5pdCBpZiBiYXNlIGluaXQgYWN0dWFsbHkgcmFuIChkaWRuJ3QgcmV0dXJuIGZhbHNlKVxuICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICBmZWF0dXJlSW5pdCgpO1xuICAgIH1cbiAgICAvLyBQcm9wYWdhdGUgdGhlIHJlc3VsdCB0aHJvdWdoIHRoZSBjaGFpbiBzbyBvdXRlciB3cmFwcGVycyBrbm93IHRvIHNraXBcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG4vKipcbiAqIFdyYXBzIGNvbXBvbmVudCBkZXN0cm95IHdpdGggY2xlYW51cCBsb2dpY1xuICogRWxpbWluYXRlcyB0aGUgcmVwZWF0ZWQgZGVzdHJveSBob29rIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBEZXN0cm95PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgY29tcG9uZW50OiBULFxuICBjbGVhbnVwOiAoKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAoY29tcG9uZW50IGFzIGFueSkuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgdmlld3BvcnQgc3RhdGUgd2l0aCBwcm9wZXIgdHlwaW5nXG4gKiBFbGltaW5hdGVzIHJlcGVhdGVkIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQ6IFZpZXdwb3J0Q29tcG9uZW50KTogYW55IHtcbiAgcmV0dXJuIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gaXRlbSBpcyBhIHBsYWNlaG9sZGVyXG4gKiBFbGltaW5hdGVzIGR1cGxpY2F0ZWQgcGxhY2Vob2xkZXIgZGV0ZWN0aW9uIGxvZ2ljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWNlaG9sZGVyKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGl0ZW0gJiZcbiAgICB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIChpdGVtLl9wbGFjZWhvbGRlciA9PT0gdHJ1ZSB8fCBpdGVtW1wiX3BsYWNlaG9sZGVyXCJdID09PSB0cnVlKSAvLyBTdXBwb3J0IGJvdGggYWNjZXNzIHBhdHRlcm5zXG4gICk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJhbmdlIGtleSBmb3IgZGVkdXBsaWNhdGlvblxuICogVXNlZCBieSBtdWx0aXBsZSBmZWF0dXJlcyBmb3IgdHJhY2tpbmcgcmFuZ2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYW5nZUtleShyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gO1xufVxuXG4vKipcbiAqIENsYW1wcyBhIHZhbHVlIGJldHdlZW4gbWluIGFuZCBtYXhcbiAqIFVzZWQgYnkgbXVsdGlwbGUgZmVhdHVyZXMgZm9yIGJvdW5kYXJ5IGNoZWNraW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcCh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7XG59XG5cbi8qKlxuICogU3RvcmVzIGEgZnVuY3Rpb24gcmVmZXJlbmNlIG9uIHRoZSBjb21wb25lbnQgZm9yIGxhdGVyIGFjY2Vzc1xuICogRWxpbWluYXRlcyBwYXR0ZXJuIGxpa2UgKGNvbXBvbmVudCBhcyBhbnkpLl9mZWF0dXJlRnVuY3Rpb24gPSBmblxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmVGZWF0dXJlRnVuY3Rpb248VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBjb21wb25lbnQ6IFQsXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IEZ1bmN0aW9uLFxuKTogdm9pZCB7XG4gIChjb21wb25lbnQgYXMgYW55KVtuYW1lXSA9IGZuO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9iYXNlLnRzXG5cbi8qKlxuICogQmFzZSBWaWV3cG9ydCBGZWF0dXJlIC0gU2V0cyB1cCBjb3JlIHZpZXdwb3J0IHN0cnVjdHVyZVxuICogUHJvdmlkZXMgdGhlIGZvdW5kYXRpb24gZm9yIG90aGVyIHZpZXdwb3J0IGZlYXR1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyB3cmFwSW5pdGlhbGl6ZSwgZ2V0Vmlld3BvcnRTdGF0ZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUNvbmZpZyB7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgb3JpZW50YXRpb24/OiBcInZlcnRpY2FsXCIgfCBcImhvcml6b250YWxcIjtcbn1cblxuLyoqXG4gKiBCYXNlIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBTZXRzIHVwIHRoZSBET00gc3RydWN0dXJlIGFuZCBjb3JlIHN0eWxlc1xuICovXG5leHBvcnQgY29uc3Qgd2l0aEJhc2UgPSAoY29uZmlnOiBCYXNlQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHsgY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0XCIsIG9yaWVudGF0aW9uID0gXCJ2ZXJ0aWNhbFwiIH0gPSBjb25maWc7XG5cbiAgICAvLyBVc2UgdGhlIHNoYXJlZCB3cmFwcGVyIHV0aWxpdHlcbiAgICB3cmFwSW5pdGlhbGl6ZShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICAvLyBDcmVhdGUgdmlld3BvcnQgc3RydWN0dXJlXG4gICAgICBsZXQgdmlld3BvcnRFbGVtZW50ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBcIi5tdHJsLXZpZXdwb3J0XCJcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgYDtcblxuICAgICAgICAvLyBTZXQgb3JpZW50YXRpb25cbiAgICAgICAgdmlld3BvcnRFbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtb3JpZW50YXRpb25cIiwgb3JpZW50YXRpb24pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBpdGVtcyBjb250YWluZXJcbiAgICAgICAgY29uc3QgaXRlbXNDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBpdGVtc0NvbnRhaW5lci5jbGFzc05hbWUgPSBcIm10cmwtdmlld3BvcnQtaXRlbXNcIjtcbiAgICAgICAgaXRlbXNDb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGA7XG5cbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1zQ29udGFpbmVyKTtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh2aWV3cG9ydEVsZW1lbnQpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZSB3aXRoIGNvbnRhaW5lcnMgdXNpbmcgdXRpbGl0eVxuICAgICAgICBjb25zdCBzdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgc3RhdGUudmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAgIHN0YXRlLml0ZW1zQ29udGFpbmVyID0gaXRlbXNDb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2VzIG9uIGNvbXBvbmVudFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuaXRlbXNDb250YWluZXIgPSBpdGVtc0NvbnRhaW5lcjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9jb25zdGFudHMudHNcblxuLyoqXG4gKiBWaWV3cG9ydCBDb25zdGFudHNcbiAqIENlbnRyYWxpemVkIGNvbnN0YW50cyBmb3IgYWxsIHZpZXdwb3J0IGZ1bmN0aW9uYWxpdHlcbiAqIENvbnNvbGlkYXRlZCBmcm9tIHZpZXdwb3J0LCB2aWV3cG9ydC9mZWF0dXJlcywgYW5kIGxpc3QtbWFuYWdlciBjb25zdGFudHNcbiAqL1xuXG5leHBvcnQgY29uc3QgVklFV1BPUlRfQ09OU1RBTlRTID0ge1xuICAvLyBWaXJ0dWFsIHNjcm9sbGluZyBkZWZhdWx0c1xuICBWSVJUVUFMX1NDUk9MTDoge1xuICAgIERFRkFVTFRfSVRFTV9TSVpFOiA0OCxcbiAgICBPVkVSU0NBTl9CVUZGRVI6IDIsXG4gICAgU0NST0xMX1NFTlNJVElWSVRZOiAwLjcsXG4gICAgTUFYX1ZJUlRVQUxfU0laRTogMTAwICogMTAwMCAqIDEwMDAsIC8vIDEwME0gcGl4ZWxzIC0gbW9kZXJuIGJyb3dzZXJzIGNhbiBoYW5kbGUgdGhpc1xuICAgIEFVVE9fREVURUNUX0lURU1fU0laRTogdHJ1ZSwgLy8gRW5hYmxlIGF1dG9tYXRpYyBpdGVtIHNpemUgZGV0ZWN0aW9uXG4gIH0sXG5cbiAgLy8gU2Nyb2xsaW5nIHNldHRpbmdzXG4gIFNDUk9MTElORzoge1xuICAgIE9WRVJTQ0FOOiAxLCAvLyBGcm9tIGZlYXR1cmVzL2NvbnN0YW50c1xuICB9LFxuXG4gIC8vIFJlbmRlcmluZyBzZXR0aW5nc1xuICBSRU5ERVJJTkc6IHtcbiAgICAvLyBFbGVtZW50IHJlY3ljbGluZ1xuICAgIERFRkFVTFRfTUFYX1BPT0xfU0laRTogMTAwLFxuICAgIENMQVNTRVM6IHtcbiAgICAgIElURU06IFwidmlld3BvcnQtaXRlbVwiLFxuICAgIH0sXG4gIH0sXG5cbiAgLy8gTG9hZGluZyBzZXR0aW5nc1xuICBMT0FESU5HOiB7XG4gICAgQ0FOQ0VMX1RIUkVTSE9MRDogMjUsIC8vIHB4L21zIC0gdmVsb2NpdHkgYWJvdmUgd2hpY2ggbG9hZHMgY2FuY2VsXG4gICAgTUFYX0NPTkNVUlJFTlRfUkVRVUVTVFM6IDEsIC8vIFBhcmFsbGVsIHJlcXVlc3RzIGFsbG93ZWRcbiAgICBERUZBVUxUX1JBTkdFX1NJWkU6IDIwLCAvLyBJdGVtcyBwZXIgcmVxdWVzdFxuICAgIERFQk9VTkNFX0xPQURJTkc6IDE1MCwgLy8gRGVib3VuY2UgZGVsYXkgKG1zKVxuICAgIE1JTl9SQU5HRV9TSVpFOiAxMCwgLy8gTWluaW11bSBpdGVtcyBwZXIgbG9hZFxuICAgIE1BWF9SQU5HRV9TSVpFOiAxMDAsIC8vIE1heGltdW0gaXRlbXMgcGVyIGxvYWRcbiAgICBSRVFVRVNUX1RJTUVPVVQ6IDUwMDAsIC8vIFJlcXVlc3QgdGltZW91dCAobXMpXG4gICAgUkVUUllfQVRURU1QVFM6IDIsIC8vIEZhaWxlZCByZXF1ZXN0IHJldHJpZXNcbiAgICBSRVRSWV9ERUxBWTogMTAwMCwgLy8gRGVsYXkgYmV0d2VlbiByZXRyaWVzIChtcylcbiAgfSxcblxuICAvLyBSZXF1ZXN0IHF1ZXVlIGNvbmZpZ3VyYXRpb24gKGZyb20gZmVhdHVyZXMvY29uc3RhbnRzKVxuICBSRVFVRVNUX1FVRVVFOiB7XG4gICAgRU5BQkxFRDogdHJ1ZSwgLy8gRW5hYmxlIHJlcXVlc3QgcXVldWluZ1xuICAgIE1BWF9RVUVVRV9TSVpFOiAxLCAvLyBNYXggcXVldWVkIHJlcXVlc3RzXG4gICAgTUFYX0FDVElWRV9SRVFVRVNUUzogMiwgLy8gTWF4IGNvbmN1cnJlbnQgYWN0aXZlIHJlcXVlc3RzXG4gIH0sXG5cbiAgLy8gUGxhY2Vob2xkZXIgc2V0dGluZ3NcbiAgUExBQ0VIT0xERVI6IHtcbiAgICBNQVNLX0NIQVJBQ1RFUjogXCJYXCIsIC8vIFVwZGF0ZWQgZnJvbSBsaXN0LW1hbmFnZXJcbiAgICBDTEFTUzogXCJ2aWV3cG9ydC1pdGVtLS1wbGFjZWhvbGRlclwiLFxuICAgIE1BWF9TQU1QTEVfU0laRTogMjAsXG4gICAgUExBQ0VIT0xERVJfRkxBRzogXCJfcGxhY2Vob2xkZXJcIixcbiAgICBSQU5ET01fTEVOR1RIX1ZBUklBTkNFOiB0cnVlLFxuICB9LFxuXG4gIC8vIFNwZWVkIHRyYWNraW5nIChmcm9tIGxpc3QtbWFuYWdlcilcbiAgU1BFRURfVFJBQ0tJTkc6IHtcbiAgICAvLyBWZWxvY2l0eSBjYWxjdWxhdGlvblxuICAgIERFQ0VMRVJBVElPTl9GQUNUT1I6IDAuODUsIC8vIHZlbG9jaXR5IGRlY2F5IHBlciBmcmFtZVxuICB9LFxuXG4gIC8vIE1vbWVudHVtIHNldHRpbmdzXG4gIE1PTUVOVFVNOiB7XG4gICAgRU5BQkxFRDogZmFsc2UsIC8vIEVuYWJsZSBtb21lbnR1bSBieSBkZWZhdWx0XG4gICAgREVDRUxFUkFUSU9OX0ZBQ1RPUjogMC45NSwgLy8gSG93IHF1aWNrbHkgdmVsb2NpdHkgZGVjcmVhc2VzIHBlciBmcmFtZSAoaGlnaGVyID0gbG9uZ2VyIGNvYXN0KVxuICAgIE1JTl9WRUxPQ0lUWTogMC4xLCAvLyBNaW5pbXVtIHZlbG9jaXR5IGJlZm9yZSBzdG9wcGluZyAocHgvbXMpXG4gICAgTUlOX0RVUkFUSU9OOiA3NTAsIC8vIE1heGltdW0gZ2VzdHVyZSBkdXJhdGlvbiB0byB0cmlnZ2VyIG1vbWVudHVtIChtcylcbiAgICBNSU5fVkVMT0NJVFlfVEhSRVNIT0xEOiAwLjQsIC8vIE1pbmltdW0gdmVsb2NpdHkgdG8gdHJpZ2dlciBtb21lbnR1bSAocHgvbXMpXG4gICAgRlJBTUVfVElNRTogMTYsIC8vIEFzc3VtZWQgZnJhbWUgdGltZSBmb3IgY2FsY3VsYXRpb25zIChtcylcbiAgfSxcblxuICAvLyBJbml0aWFsIGxvYWQgY29uZmlndXJhdGlvbiAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIElOSVRJQUxfTE9BRDoge1xuICAgIFNUUkFURUdZOiBcInBsYWNlaG9sZGVyc1wiLCAvLyBcInBsYWNlaG9sZGVyc1wiIHwgXCJkaXJlY3RcIiB8IFwicHJvZ3Jlc3NpdmVcIlxuICAgIFZJRVdQT1JUX01VTFRJUExJRVI6IDEuNSwgLy8gbG9hZCAxLjV4IHZpZXdwb3J0IGNhcGFjaXR5XG4gICAgTUlOX0lURU1TOiAxMCxcbiAgICBNQVhfSVRFTVM6IDEwMCxcbiAgICBQTEFDRUhPTERFUl9DT1VOVDogMjAsIC8vIGRlZmF1bHQgcGxhY2Vob2xkZXIgY291bnRcbiAgICBTSE9XX0xPQURJTkdfU1RBVEU6IHRydWUsXG4gICAgTE9BRElOR19ERUxBWTogMTAwLCAvLyBtcyAtIGRlbGF5IGJlZm9yZSBzaG93aW5nIGxvYWRpbmcgc3RhdGVcbiAgfSxcblxuICAvLyBTZWxlY3Rpb24gc2V0dGluZ3NcbiAgU0VMRUNUSU9OOiB7XG4gICAgU0VMRUNURURfQ0xBU1M6IFwidmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIixcbiAgfSxcblxuICAvLyBTY3JvbGxiYXIgc2V0dGluZ3MgKGZyb20gbGlzdC1tYW5hZ2VyKVxuICBTQ1JPTExCQVI6IHtcbiAgICAvLyBDU1MgY2xhc3Nlc1xuICAgIENMQVNTRVM6IHtcbiAgICAgIFNDUk9MTEJBUjogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyXCIsXG4gICAgICBTQ1JPTExCQVJfVFJBQ0s6IFwidmlld3BvcnRfX3Njcm9sbGJhci10cmFja1wiLFxuICAgICAgU0NST0xMQkFSX1RIVU1COiBcInZpZXdwb3J0X19zY3JvbGxiYXItdGh1bWJcIixcbiAgICAgIFNDUk9MTEJBUl9WSVNJQkxFOiBcInZpZXdwb3J0X19zY3JvbGxiYXItLXZpc2libGVcIixcbiAgICAgIFNDUk9MTEJBUl9EUkFHR0lORzogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyLS1kcmFnZ2luZ1wiLFxuICAgICAgU0NST0xMQkFSX1RIVU1CX0RSQUdHSU5HOiBcInZpZXdwb3J0X19zY3JvbGxiYXItdGh1bWItLWRyYWdnaW5nXCIsXG4gICAgfSxcbiAgfSxcblxuICAvLyBPcmllbnRhdGlvbiAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIE9SSUVOVEFUSU9OOiB7XG4gICAgREVGQVVMVF9PUklFTlRBVElPTjogXCJ2ZXJ0aWNhbFwiLFxuICAgIERFRkFVTFRfQ1JPU1NfQVhJU19BTElHTk1FTlQ6IFwic3RyZXRjaFwiLFxuICAgIFJFVkVSU0VfRElSRUNUSU9OOiBmYWxzZSxcbiAgfSxcblxuICBQQUdJTkFUSU9OOiB7XG4gICAgREVGQVVMVF9TVFJBVEVHWTogXCJvZmZzZXRcIiBhcyBcIm9mZnNldFwiIHwgXCJwYWdlXCIgfCBcImN1cnNvclwiLFxuICAgIERFRkFVTFRfTElNSVQ6IDIwLFxuICAgIFNUUkFURUdJRVM6IHtcbiAgICAgIFBBR0U6IFwicGFnZVwiIGFzIGNvbnN0LFxuICAgICAgT0ZGU0VUOiBcIm9mZnNldFwiIGFzIGNvbnN0LFxuICAgICAgQ1VSU09SOiBcImN1cnNvclwiIGFzIGNvbnN0LFxuICAgIH0sXG4gICAgQ1VSU09SX0NMRUFOVVBfSU5URVJWQUw6IDYwMDAwLCAvLyBDbGVhbiB1cCBvbGQgY3Vyc29ycyBldmVyeSBtaW51dGVcbiAgICBNQVhfQ1VSU09SX01BUF9TSVpFOiAxMDAwLCAvLyBNYXhpbXVtIG51bWJlciBvZiBjdXJzb3JzIHRvIGtlZXAgaW4gbWVtb3J5XG4gICAgLy8gQ3Vyc29yLXNwZWNpZmljIHZpcnR1YWwgc2l6aW5nXG4gICAgQ1VSU09SX1NDUk9MTF9NQVJHSU5fTVVMVElQTElFUjogMywgLy8gTXVsdGlwbHkgcmFuZ2VTaXplIGJ5IHRoaXMgZm9yIHNjcm9sbCBtYXJnaW5cbiAgICBDVVJTT1JfTUlOX1ZJUlRVQUxfU0laRV9NVUxUSVBMSUVSOiAzLCAvLyBNaW5pbXVtIHZpcnR1YWwgc2l6ZSBhcyBtdWx0aXBsaWVyIG9mIHJhbmdlU2l6ZVxuICB9LFxufTtcblxuLyoqXG4gKiBUeXBlIGZvciBvdmVycmlkaW5nIGNvbnN0YW50cyBhdCBydW50aW1lXG4gKi9cbmV4cG9ydCB0eXBlIFZpZXdwb3J0Q29uc3RhbnRzID0gdHlwZW9mIFZJRVdQT1JUX0NPTlNUQU5UUztcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gbWVyZ2UgdXNlciBjb25zdGFudHMgd2l0aCBkZWZhdWx0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb25zdGFudHMoXG4gIHVzZXJDb25zdGFudHM6IFBhcnRpYWw8Vmlld3BvcnRDb25zdGFudHM+ID0ge30sXG4pOiBWaWV3cG9ydENvbnN0YW50cyB7XG4gIHJldHVybiB7XG4gICAgLi4uVklFV1BPUlRfQ09OU1RBTlRTLFxuICAgIC4uLnVzZXJDb25zdGFudHMsXG4gIH07XG59XG4iLAogICAgIi8qKlxuICogVmlydHVhbCBGZWF0dXJlIC0gQ29yZSB2aXJ0dWFsIHNjcm9sbGluZyBjYWxjdWxhdGlvbnNcbiAqIEhhbmRsZXMgdmlzaWJsZSByYW5nZSBjYWxjdWxhdGlvbiBhbmQgdG90YWwgdmlydHVhbCBzaXplIG1hbmFnZW1lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHdyYXBJbml0aWFsaXplLCBnZXRWaWV3cG9ydFN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBWaXJ0dWFsQ29uZmlnIHtcbiAgaXRlbVNpemU/OiBudW1iZXI7XG4gIG92ZXJzY2FuPzogbnVtYmVyO1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xuICBhdXRvRGV0ZWN0SXRlbVNpemU/OiBib29sZWFuO1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIGluaXRpYWxTY3JvbGxJbmRleD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBWaXJ0dWFsIHNjcm9sbGluZyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICogSGFuZGxlcyB2aXNpYmxlIHJhbmdlIGNhbGN1bGF0aW9ucyB3aXRoIGNvbXByZXNzaW9uIGZvciBsYXJnZSBkYXRhc2V0c1xuICovXG5leHBvcnQgY29uc3Qgd2l0aFZpcnR1YWwgPSAoY29uZmlnOiBWaXJ0dWFsQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGl0ZW1TaXplLFxuICAgICAgb3ZlcnNjYW4gPSBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuT1ZFUlNDQU5fQlVGRkVSLFxuICAgICAgb3JpZW50YXRpb24gPSBcInZlcnRpY2FsXCIsXG4gICAgICBhdXRvRGV0ZWN0SXRlbVNpemUgPSBpdGVtU2l6ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLkFVVE9fREVURUNUX0lURU1fU0laRVxuICAgICAgICA6IGZhbHNlLFxuICAgICAgZGVidWcgPSBmYWxzZSxcbiAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA9IDAsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFVzZSBwcm92aWRlZCBpdGVtU2l6ZSBvciBkZWZhdWx0LCBidXQgbWFyayBpZiB3ZSBzaG91bGQgYXV0by1kZXRlY3RcbiAgICBjb25zdCBpbml0aWFsSXRlbVNpemUgPVxuICAgICAgaXRlbVNpemUgfHwgVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLkRFRkFVTFRfSVRFTV9TSVpFO1xuXG4gICAgY29uc3QgTUFYX1ZJUlRVQUxfU0laRSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5NQVhfVklSVFVBTF9TSVpFO1xuICAgIGxldCB2aWV3cG9ydFN0YXRlOiBhbnk7XG4gICAgbGV0IGhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSA9IGZhbHNlO1xuICAgIGxldCBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiA9IGZhbHNlOyAvLyBUcmFjayBpZiB3ZSd2ZSByZWNhbGN1bGF0ZWQgc2Nyb2xsIHBvc2l0aW9uIGZvciBjb21wcmVzc2lvblxuXG4gICAgLy8gSW5pdGlhbGl6ZSB1c2luZyBzaGFyZWQgd3JhcHBlclxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkgcmV0dXJuO1xuXG4gICAgICBPYmplY3QuYXNzaWduKHZpZXdwb3J0U3RhdGUsIHtcbiAgICAgICAgaXRlbVNpemU6IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgICAgb3ZlcnNjYW4sXG4gICAgICAgIGNvbnRhaW5lclNpemU6XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52aWV3cG9ydEVsZW1lbnQ/LltcbiAgICAgICAgICAgIG9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIiA/IFwib2Zmc2V0V2lkdGhcIiA6IFwib2Zmc2V0SGVpZ2h0XCJcbiAgICAgICAgICBdIHx8IDYwMCxcbiAgICAgIH0pO1xuXG4gICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyk7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbCBzY3JvbGwgaW5kZXgsIGNhbGN1bGF0ZSBpbml0aWFsIHNjcm9sbCBwb3NpdGlvblxuICAgICAgLy8gTm90ZTogV2Ugc3RvcmUgdGhlIGluaXRpYWxTY3JvbGxJbmRleCB0byB1c2UgZGlyZWN0bHkgaW4gcmFuZ2UgY2FsY3VsYXRpb25zXG4gICAgICAvLyBiZWNhdXNlIHNjcm9sbCBwb3NpdGlvbiBtYXkgYmUgY29tcHJlc3NlZCBmb3IgbGFyZ2UgbGlzdHNcbiAgICAgIGxldCBpbml0aWFsU2Nyb2xsUG9zaXRpb24gPSB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDA7XG5cbiAgICAgIGlmIChpbml0aWFsU2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgIC8vIFN0b3JlIHRoZSB0YXJnZXQgaW5kZXggZm9yIHVzZSBpbiByYW5nZSBjYWxjdWxhdGlvbnNcbiAgICAgICAgKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleCA9IGluaXRpYWxTY3JvbGxJbmRleDtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIChtYXkgYmUgY29tcHJlc3NlZCBmb3IgbGFyZ2UgbGlzdHMpXG4gICAgICAgIGluaXRpYWxTY3JvbGxQb3NpdGlvbiA9XG4gICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ICogKHZpZXdwb3J0U3RhdGUuaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplKTtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IGluaXRpYWxTY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGVuc3VyZSBzY3JvbGxpbmcgZmVhdHVyZSBoYXMgaW5pdGlhbGl6ZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBpbml0aWFsU2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICBzb3VyY2U6IFwiaW5pdGlhbC1zY3JvbGwtaW5kZXhcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVZpc2libGVSYW5nZShpbml0aWFsU2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAvLyBFbnN1cmUgY29udGFpbmVyIHNpemUgaXMgbWVhc3VyZWQgYWZ0ZXIgRE9NIGlzIHJlYWR5XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB1cGRhdGVDb250YWluZXJTaXplKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnNcbiAgICBjb25zdCBnZXRDb21wcmVzc2lvblJhdGlvID0gKCk6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGU/LnZpcnR1YWxUb3RhbFNpemUpIHJldHVybiAxO1xuICAgICAgY29uc3QgYWN0dWFsU2l6ZSA9IHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICByZXR1cm4gYWN0dWFsU2l6ZSA8PSBNQVhfVklSVFVBTF9TSVpFID8gMSA6IE1BWF9WSVJUVUFMX1NJWkUgLyBhY3R1YWxTaXplO1xuICAgIH07XG5cbiAgICBjb25zdCBsb2cgPSAobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KSA9PiB7XG4gICAgICBpZiAoZGVidWcpIGNvbnNvbGUubG9nKGBbVmlydHVhbF0gJHttZXNzYWdlfWAsIGRhdGEpO1xuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgdmlzaWJsZSByYW5nZVxuICAgIGNvbnN0IGNhbGN1bGF0ZVZpc2libGVSYW5nZSA9IChcbiAgICAgIHNjcm9sbFBvc2l0aW9uOiBudW1iZXIsXG4gICAgKTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9ID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbVmlydHVhbF0gTm8gdmlld3BvcnQgc3RhdGUsIHJldHVybmluZyBlbXB0eSByYW5nZVwiKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lclNpemUsIHRvdGFsSXRlbXMgfSA9IHZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIEVhcmx5IHJldHVybnMgZm9yIGludmFsaWQgc3RhdGVzXG4gICAgICBpZiAoXG4gICAgICAgICFjb250YWluZXJTaXplIHx8XG4gICAgICAgIGNvbnRhaW5lclNpemUgPD0gMCB8fFxuICAgICAgICAhdG90YWxJdGVtcyB8fFxuICAgICAgICB0b3RhbEl0ZW1zIDw9IDBcbiAgICAgICkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGluaXRpYWxTY3JvbGxJbmRleCwgdXNlIGl0IHRvIGNhbGN1bGF0ZSB0aGUgcmFuZ2VcbiAgICAgICAgLy8gZXZlbiB3aGVuIHRvdGFsSXRlbXMgaXMgMCAobm90IHlldCBsb2FkZWQgZnJvbSBBUEkpXG4gICAgICAgIGlmIChpbml0aWFsU2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKFxuICAgICAgICAgICAgKGNvbnRhaW5lclNpemUgfHwgNjAwKSAvXG4gICAgICAgICAgICAgICh2aWV3cG9ydFN0YXRlLml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGluaXRpYWxTY3JvbGxJbmRleCAtIG92ZXJzY2FuKTtcbiAgICAgICAgICBjb25zdCBlbmQgPSBpbml0aWFsU2Nyb2xsSW5kZXggKyB2aXNpYmxlQ291bnQgKyBvdmVyc2NhbjtcbiAgICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICAgIH1cbiAgICAgICAgbG9nKGBJbnZhbGlkIHN0YXRlOiBjb250YWluZXI9JHtjb250YWluZXJTaXplfSwgaXRlbXM9JHt0b3RhbEl0ZW1zfWApO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpcnR1YWxTaXplID1cbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplIHx8IHRvdGFsSXRlbXMgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKGNvbnRhaW5lclNpemUgLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplKTtcbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uUmF0aW8gPSBnZXRDb21wcmVzc2lvblJhdGlvKCk7XG5cbiAgICAgIGxldCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcjtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHRhcmdldCBzY3JvbGwgaW5kZXggKGZvciBpbml0aWFsU2Nyb2xsSW5kZXggd2l0aCBjb21wcmVzc2lvbilcbiAgICAgIGNvbnN0IHRhcmdldFNjcm9sbEluZGV4ID0gKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleDtcblxuICAgICAgaWYgKGNvbXByZXNzaW9uUmF0aW8gPCAxKSB7XG4gICAgICAgIC8vIENvbXByZXNzZWQgc3BhY2UgY2FsY3VsYXRpb25cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRhcmdldFNjcm9sbEluZGV4LCB1c2UgaXQgZGlyZWN0bHkgaW5zdGVhZCBvZiBjYWxjdWxhdGluZyBmcm9tIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgd2Ugc2hvdyB0aGUgY29ycmVjdCBpdGVtcyBldmVuIHdoZW4gdmlydHVhbCBzcGFjZSBpcyBjb21wcmVzc2VkXG4gICAgICAgIGlmICh0YXJnZXRTY3JvbGxJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgdGFyZ2V0U2Nyb2xsSW5kZXggLSBvdmVyc2Nhbik7XG4gICAgICAgICAgZW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICB0b3RhbEl0ZW1zIC0gMSxcbiAgICAgICAgICAgIHRhcmdldFNjcm9sbEluZGV4ICsgdmlzaWJsZUNvdW50ICsgb3ZlcnNjYW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBDbGVhciB0YXJnZXRTY3JvbGxJbmRleCBhZnRlciBmaXJzdCB1c2Ugc28gbm9ybWFsIHNjcm9sbGluZyB3b3Jrc1xuICAgICAgICAgIGRlbGV0ZSAodmlld3BvcnRTdGF0ZSBhcyBhbnkpLnRhcmdldFNjcm9sbEluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsU2l6ZTtcbiAgICAgICAgICBjb25zdCBleGFjdEluZGV4ID0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zO1xuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihleGFjdEluZGV4KTtcbiAgICAgICAgICBlbmQgPSBNYXRoLmNlaWwoZXhhY3RJbmRleCkgKyB2aXNpYmxlQ291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZWFyLWJvdHRvbSBoYW5kbGluZ1xuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB2aXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbCAtIHNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChkaXN0YW5jZUZyb21Cb3R0b20gPD0gY29udGFpbmVyU2l6ZSAmJiBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTEpIHtcbiAgICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUgLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlQXRCb3R0b20gPSBNYXRoLm1heCgwLCB0b3RhbEl0ZW1zIC0gaXRlbXNBdEJvdHRvbSk7XG4gICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIE1hdGgubWluKDEsIDEgLSBkaXN0YW5jZUZyb21Cb3R0b20gLyBjb250YWluZXJTaXplKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgc3RhcnQgKyAoZmlyc3RWaXNpYmxlQXRCb3R0b20gLSBzdGFydCkgKiBpbnRlcnBvbGF0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZW5kID1cbiAgICAgICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSA8PSAxXG4gICAgICAgICAgICAgID8gdG90YWxJdGVtcyAtIDFcbiAgICAgICAgICAgICAgOiBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgc3RhcnQgKyB2aXNpYmxlQ291bnQgKyBvdmVyc2Nhbik7XG5cbiAgICAgICAgICBsb2coXCJOZWFyIGJvdHRvbSBjYWxjdWxhdGlvbjpcIiwge1xuICAgICAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbixcbiAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgZW5kLFxuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgb3ZlcnNjYW5cbiAgICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCBzdGFydCAtIG92ZXJzY2FuKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIGVuZCArIG92ZXJzY2FuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvblxuICAgICAgICBzdGFydCA9IE1hdGgubWF4KFxuICAgICAgICAgIDAsXG4gICAgICAgICAgTWF0aC5mbG9vcihzY3JvbGxQb3NpdGlvbiAvIHZpZXdwb3J0U3RhdGUuaXRlbVNpemUpIC0gb3ZlcnNjYW4sXG4gICAgICAgICk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCArIG92ZXJzY2FuICogMik7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG91dHB1dFxuICAgICAgaWYgKGlzTmFOKHN0YXJ0KSB8fCBpc05hTihlbmQpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbVmlydHVhbF0gTmFOIGluIHJhbmdlIGNhbGN1bGF0aW9uOlwiLCB7XG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgIGl0ZW1TaXplOiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplLFxuICAgICAgICAgIGNvbXByZXNzaW9uUmF0aW8sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIC8vIGxvZyhgUmFuZ2U6ICR7c3RhcnR9LSR7ZW5kfSAoc2Nyb2xsOiAke3Njcm9sbFBvc2l0aW9ufSlgKTtcblxuICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgbGFzdCByYW5nZVxuICAgICAgLy8gaWYgKGVuZCA+PSB0b3RhbEl0ZW1zIC0gMTApIHtcbiAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAvLyAgICAgYFtWaXJ0dWFsXSBOZWFyIGVuZCByYW5nZTogJHtzdGFydH0tJHtlbmR9LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc30sIGxhc3RJdGVtUG9zPSR7XG4gICAgICAvLyAgICAgICBlbmQgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplXG4gICAgICAvLyAgICAgfXB4LCB2aXJ0dWFsU2l6ZT0ke3ZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZX1weGBcbiAgICAgIC8vICAgKTtcbiAgICAgIC8vIH1cblxuICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgYWN0dWFsIHZpc2libGUgcmFuZ2UgKHdpdGhvdXQgb3ZlcnNjYW4gYnVmZmVyKVxuICAgIGNvbnN0IGNhbGN1bGF0ZUFjdHVhbFZpc2libGVSYW5nZSA9IChzY3JvbGxQb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXJTaXplLCB0b3RhbEl0ZW1zIH0gPSB2aWV3cG9ydFN0YXRlO1xuICAgICAgaWYgKCFjb250YWluZXJTaXplIHx8ICF0b3RhbEl0ZW1zKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG5cbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgY29tcHJlc3Npb25SYXRpbyA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZVxuICAgICAgICA/ICh0b3RhbEl0ZW1zICogaXRlbVNpemUpIC8gdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplXG4gICAgICAgIDogMTtcblxuICAgICAgbGV0IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyO1xuXG4gICAgICBpZiAoY29tcHJlc3Npb25SYXRpbyA8IDEpIHtcbiAgICAgICAgLy8gQ29tcHJlc3NlZCBzcGFjZSAtIGNhbGN1bGF0ZSBiYXNlZCBvbiBzY3JvbGwgcmF0aW9cbiAgICAgICAgY29uc3QgdmlydHVhbFNpemUgPVxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSB8fCB0b3RhbEl0ZW1zICogaXRlbVNpemU7XG4gICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsU2l6ZTtcbiAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHNjcm9sbFJhdGlvICogdG90YWxJdGVtcyk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCAtIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGlyZWN0IGNhbGN1bGF0aW9uXG4gICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzY3JvbGxQb3NpdGlvbiAvIGl0ZW1TaXplKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHN0YXJ0ICsgdmlzaWJsZUNvdW50IC0gMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSB2YWxpZCByYW5nZVxuICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCBzdGFydCk7XG4gICAgICBlbmQgPSBNYXRoLm1heChzdGFydCwgZW5kKTtcblxuICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgZnVuY3Rpb25zXG4gICAgY29uc3QgdXBkYXRlVmlzaWJsZVJhbmdlID0gKHNjcm9sbFBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkgcmV0dXJuO1xuICAgICAgdmlld3BvcnRTdGF0ZS52aXNpYmxlUmFuZ2UgPSBjYWxjdWxhdGVWaXNpYmxlUmFuZ2Uoc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAvLyBERUJVRzogTG9nIHdobyBjYWxscyB1cGRhdGVWaXNpYmxlUmFuZ2Ugd2l0aCAwIHdoZW4gaXQgc2hvdWxkIGJlIG5vbi16ZXJvXG5cbiAgICAgIC8vIENhbGN1bGF0ZSBhY3R1YWwgdmlzaWJsZSByYW5nZSAod2l0aG91dCBvdmVyc2NhbikgZm9yIFVJIGRpc3BsYXlcbiAgICAgIGNvbnN0IGFjdHVhbFZpc2libGVSYW5nZSA9IGNhbGN1bGF0ZUFjdHVhbFZpc2libGVSYW5nZShzY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgcmFuZ2U6IHZpZXdwb3J0U3RhdGUudmlzaWJsZVJhbmdlLFxuICAgICAgICB2aXNpYmxlUmFuZ2U6IGFjdHVhbFZpc2libGVSYW5nZSxcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHRvdGFsIHZpcnR1YWwgc2l6ZVxuICAgIGNvbnN0IHVwZGF0ZVRvdGFsVmlydHVhbFNpemUgPSAodG90YWxJdGVtczogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybjtcblxuICAgICAgY29uc3Qgb2xkU2l6ZSA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA9IHRvdGFsSXRlbXM7XG4gICAgICBjb25zdCBhY3R1YWxTaXplID0gdG90YWxJdGVtcyAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG5cbiAgICAgIC8vIEdldCBwYWRkaW5nIGZyb20gdGhlIGl0ZW1zIGNvbnRhaW5lciBpZiBhdmFpbGFibGVcbiAgICAgIGxldCB0b3RhbFBhZGRpbmcgPSAwO1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIpIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKFxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdUb3AgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ1RvcCkgfHwgMDtcbiAgICAgICAgY29uc3QgcGFkZGluZ0JvdHRvbSA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nQm90dG9tKSB8fCAwO1xuICAgICAgICB0b3RhbFBhZGRpbmcgPSBwYWRkaW5nVG9wICsgcGFkZGluZ0JvdHRvbTtcbiAgICAgIH1cblxuICAgICAgLy8gSW5jbHVkZSBwYWRkaW5nIGluIHRoZSB2aXJ0dWFsIHNpemVcbiAgICAgIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSA9IE1hdGgubWluKFxuICAgICAgICBhY3R1YWxTaXplICsgdG90YWxQYWRkaW5nLFxuICAgICAgICBNQVhfVklSVFVBTF9TSVpFLFxuICAgICAgKTtcblxuICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgZGVidWdnaW5nIGdhcCBpc3N1ZVxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbVmlydHVhbF0gVG90YWwgc2l6ZSB1cGRhdGU6IGl0ZW1zPSR7dG90YWxJdGVtc30sIGl0ZW1TaXplPSR7dmlld3BvcnRTdGF0ZS5pdGVtU2l6ZX1weCwgcGFkZGluZz0ke3RvdGFsUGFkZGluZ31weCwgdmlydHVhbFNpemU9JHt2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemV9cHggKHdhcyAke29sZFNpemV9cHgpYFxuICAgICAgLy8gKTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZTogdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICB0b3RhbEl0ZW1zOiB0b3RhbEl0ZW1zLFxuICAgICAgICBjb21wcmVzc2lvblJhdGlvOiBnZXRDb21wcmVzc2lvblJhdGlvKCksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBzaXplXG4gICAgY29uc3QgdXBkYXRlQ29udGFpbmVyU2l6ZSA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSB8fCAhdmlld3BvcnRTdGF0ZS52aWV3cG9ydEVsZW1lbnQpIHJldHVybjtcblxuICAgICAgY29uc3Qgc2l6ZSA9XG4gICAgICAgIHZpZXdwb3J0U3RhdGUudmlld3BvcnRFbGVtZW50W1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUub3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgICA/IFwib2Zmc2V0V2lkdGhcIlxuICAgICAgICAgICAgOiBcIm9mZnNldEhlaWdodFwiXG4gICAgICAgIF07XG5cbiAgICAgIC8vIExvZyB0aGUgYWN0dWFsIG1lYXN1cmVtZW50XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtWaXJ0dWFsXSBDb250YWluZXIgc2l6ZSBtZWFzdXJlZDogJHtzaXplfXB4IGZyb20gdmlld3BvcnQgZWxlbWVudGBcbiAgICAgIC8vICk7XG5cbiAgICAgIGlmIChzaXplICE9PSB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplID0gc2l6ZTtcbiAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zKTsgLy8gQWxzbyB1cGRhdGUgdmlydHVhbCBzaXplXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICBjb250YWluZXJTaXplOiBzaXplLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gT3ZlcnJpZGUgdmlld3BvcnQgbWV0aG9kc1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5nZXRWaXNpYmxlUmFuZ2UgPSAoKSA9PlxuICAgICAgdmlld3BvcnRTdGF0ZT8udmlzaWJsZVJhbmdlIHx8XG4gICAgICBjYWxjdWxhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnNjcm9sbFwiLCAoZGF0YTogYW55KSA9PlxuICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKGRhdGEucG9zaXRpb24pLFxuICAgICk7XG5cbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0Oml0ZW1zLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEudG90YWxJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbEl0ZW1zKTtcbiAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGU/LnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuIGZvciB0b3RhbCBpdGVtcyBjaGFuZ2VzIChpbXBvcnRhbnQgZm9yIGN1cnNvciBwYWdpbmF0aW9uKVxuICAgIC8vIE5vdGU6IHNldFRvdGFsSXRlbXMoKSB1cGRhdGVzIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyBCRUZPUkUgZW1pdHRpbmcgdGhpcyBldmVudCxcbiAgICAvLyBzbyB3ZSBjYW4ndCByZWx5IG9uIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyB0byBkZXRlY3QgdGhlIGZpcnN0IHRvdGFsLlxuICAgIC8vIEluc3RlYWQgd2UgdXNlIHRoZSBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiBmbGFnLlxuICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAoZGF0YS50b3RhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIC8vIEZJWDogV2hlbiB3ZSBmaXJzdCByZWNlaXZlIHRvdGFsSXRlbXMgd2l0aCBpbml0aWFsU2Nyb2xsSW5kZXggYW5kIGNvbXByZXNzaW9uLFxuICAgICAgLy8gcmVjYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIHRvIGFjY291bnQgZm9yIGNvbXByZXNzaW9uLlxuICAgICAgLy8gV2l0aG91dCB0aGlzLCBpbml0aWFsU2Nyb2xsSW5kZXggY2FsY3VsYXRlcyBwb3NpdGlvbiBhcyBpbmRleCAqIGl0ZW1TaXplLFxuICAgICAgLy8gYnV0IHJlbmRlcmluZyB1c2VzIGNvbXByZXNzZWQgc3BhY2UsIGNhdXNpbmcgaXRlbXMgdG8gYXBwZWFyIG9mZi1zY3JlZW4uXG4gICAgICAvL1xuICAgICAgLy8gV2UgY2hlY2sgdGhpcyBCRUZPUkUgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSBiZWNhdXNlIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGVcbiAgICAgIC8vIHNjcm9sbCBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgbmV3IHRvdGFsLCBhbmQgdGhlIGZsYWcgZW5zdXJlcyB3ZSBvbmx5IGRvIHRoaXMgb25jZS5cbiAgICAgIGlmIChcbiAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ID4gMCAmJlxuICAgICAgICAhaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gJiZcbiAgICAgICAgZGF0YS50b3RhbCA+IDBcbiAgICAgICkge1xuICAgICAgICBjb25zdCBhY3R1YWxUb3RhbFNpemUgPSBkYXRhLnRvdGFsICogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgICAgY29uc3QgaXNDb21wcmVzc2VkID0gYWN0dWFsVG90YWxTaXplID4gTUFYX1ZJUlRVQUxfU0laRTtcblxuICAgICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgICAgLy8gUmVjYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIHVzaW5nIGNvbXByZXNzaW9uLWF3YXJlIGZvcm11bGFcbiAgICAgICAgICAvLyBTYW1lIGZvcm11bGEgdXNlZCBpbiBzY3JvbGxUb0luZGV4XG4gICAgICAgICAgY29uc3QgcmF0aW8gPSBpbml0aWFsU2Nyb2xsSW5kZXggLyBkYXRhLnRvdGFsO1xuICAgICAgICAgIGNvbnN0IGNvbXByZXNzZWRQb3NpdGlvbiA9IHJhdGlvICogTUFYX1ZJUlRVQUxfU0laRTtcblxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBjb21wcmVzc2VkUG9zaXRpb247XG5cbiAgICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBjb21wcmVzc2VkUG9zaXRpb24sXG4gICAgICAgICAgICBzb3VyY2U6IFwiY29tcHJlc3Npb24tcmVjYWxjdWxhdGlvblwiLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgdGFyZ2V0U2Nyb2xsSW5kZXggc2luY2Ugd2UndmUgbm93IGNvcnJlY3RseSBjYWxjdWxhdGVkIHRoZSBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgICAvLyBUaGUgbm9ybWFsIGNvbXByZXNzZWQgc2Nyb2xsaW5nIGZvcm11bGEgd2lsbCBub3cgd29yayBjb3JyZWN0bHlcbiAgICAgICAgICBkZWxldGUgKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgYXMgZG9uZSBldmVuIGlmIG5vdCBjb21wcmVzc2VkIC0gd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgY2hlY2sgb25jZVxuICAgICAgICBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbCk7XG4gICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAgIC8vIFRyaWdnZXIgYSByZW5kZXIgdG8gdXBkYXRlIHRoZSB2aWV3XG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgY29udGFpbmVyIHNpemUgY2hhbmdlcyB0byByZWNhbGN1bGF0ZSB2aXJ0dWFsIHNpemVcbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmNvbnRhaW5lci1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUgJiYgZGF0YS5jb250YWluZXJTaXplICE9PSB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplID0gZGF0YS5jb250YWluZXJTaXplO1xuICAgICAgICAvLyBSZWNhbGN1bGF0ZSB2aXJ0dWFsIHNpemUgd2l0aCBuZXcgY29udGFpbmVyIHNpemVcbiAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMpO1xuICAgICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBkYXRhLnRvdGFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgZGF0YS50b3RhbCAhPT0gdmlld3BvcnRTdGF0ZT8udG90YWxJdGVtc1xuICAgICAgKSB7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbCk7XG4gICAgICB9XG4gICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgZmlyc3QgaXRlbXMgcmVuZGVyZWQgdG8gY2FsY3VsYXRlIGl0ZW0gc2l6ZSAoaWYgYXV0by1kZXRlY3Rpb24gaXMgZW5hYmxlZClcbiAgICBpZiAoYXV0b0RldGVjdEl0ZW1TaXplKSB7XG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFoYXNDYWxjdWxhdGVkSXRlbVNpemUgJiZcbiAgICAgICAgICBkYXRhLmVsZW1lbnRzPy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDYWxjdWxhdGUgYXZlcmFnZSBpdGVtIHNpemUgZnJvbSBmaXJzdCByZW5kZXJlZCBiYXRjaFxuICAgICAgICAgIGNvbnN0IHNpemVzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHNpemVQcm9wZXJ0eSA9XG4gICAgICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCIgPyBcIm9mZnNldFdpZHRoXCIgOiBcIm9mZnNldEhlaWdodFwiO1xuXG4gICAgICAgICAgZGF0YS5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IGVsZW1lbnRbc2l6ZVByb3BlcnR5XTtcbiAgICAgICAgICAgIGlmIChzaXplID4gMCkge1xuICAgICAgICAgICAgICBzaXplcy5wdXNoKHNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHNpemVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGF2Z1NpemUgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICBzaXplcy5yZWR1Y2UoKHN1bSwgc2l6ZSkgPT4gc3VtICsgc2l6ZSwgMCkgLyBzaXplcy5sZW5ndGgsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtU2l6ZSA9IHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1TaXplID0gYXZnU2l6ZTtcblxuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbml0aWFsU2Nyb2xsSW5kZXgsIHJlY2FsY3VsYXRlIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIG5ld2x5IGRldGVjdGVkIGl0ZW0gc2l6ZVxuICAgICAgICAgICAgaWYgKGluaXRpYWxTY3JvbGxJbmRleCA+IDAgJiYgYXZnU2l6ZSAhPT0gcHJldmlvdXNJdGVtU2l6ZSkge1xuICAgICAgICAgICAgICBjb25zdCBuZXdTY3JvbGxQb3NpdGlvbiA9IGluaXRpYWxTY3JvbGxJbmRleCAqIGF2Z1NpemU7XG4gICAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBuZXdTY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IG5ld1Njcm9sbFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogXCJpdGVtLXNpemUtZGV0ZWN0ZWRcIixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIGV2ZXJ5dGhpbmcgd2l0aCBuZXcgc2l6ZVxuICAgICAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMpO1xuICAgICAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAgICAgICAgIC8vIFJlLXJlbmRlciB0byBhZGp1c3QgcG9zaXRpb25zXG4gICAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcblxuICAgICAgICAgICAgLy8gRW1pdCBldmVudCBmb3Igc2l6ZSBjaGFuZ2VcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtLXNpemUtZGV0ZWN0ZWRcIiwge1xuICAgICAgICAgICAgICBwcmV2aW91c1NpemU6IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgICAgICAgICAgZGV0ZWN0ZWRTaXplOiBhdmdTaXplLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgdmlydHVhbCBBUElcbiAgICBjb25zdCBjb21wcmVzc2lvblJhdGlvID0gZ2V0Q29tcHJlc3Npb25SYXRpbygpO1xuICAgIChjb21wb25lbnQgYXMgYW55KS52aXJ0dWFsID0ge1xuICAgICAgY2FsY3VsYXRlVmlzaWJsZVJhbmdlLFxuICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSxcbiAgICAgIGdldFRvdGFsVmlydHVhbFNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/LnZpcnR1YWxUb3RhbFNpemUgfHwgMCxcbiAgICAgIGdldENvbnRhaW5lclNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/LmNvbnRhaW5lclNpemUgfHwgMCxcbiAgICAgIHVwZGF0ZUNvbnRhaW5lclNpemU6IChzaXplOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBzaXplO1xuICAgICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0SXRlbVNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/Lml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgIGNhbGN1bGF0ZUluZGV4RnJvbVBvc2l0aW9uOiAocG9zaXRpb246IG51bWJlcikgPT5cbiAgICAgICAgTWF0aC5mbG9vcihcbiAgICAgICAgICBwb3NpdGlvbiAvXG4gICAgICAgICAgICAoKHZpZXdwb3J0U3RhdGU/Lml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSkgKiBjb21wcmVzc2lvblJhdGlvKSxcbiAgICAgICAgKSxcbiAgICAgIGNhbGN1bGF0ZVBvc2l0aW9uRm9ySW5kZXg6IChpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICBpbmRleCAqICh2aWV3cG9ydFN0YXRlPy5pdGVtU2l6ZSB8fCBpbml0aWFsSXRlbVNpemUpICogY29tcHJlc3Npb25SYXRpbyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogU2Nyb2xsaW5nIEZlYXR1cmUgLSBWaXJ0dWFsIHNjcm9sbGluZyB3aXRoIGludGVncmF0ZWQgdmVsb2NpdHkgdHJhY2tpbmdcbiAqIEhhbmRsZXMgd2hlZWwgZXZlbnRzLCB0b3VjaC9tb3VzZSBldmVudHMsIHNjcm9sbCBwb3NpdGlvbiBtYW5hZ2VtZW50LCB2ZWxvY2l0eSBtZWFzdXJlbWVudCwgYW5kIG1vbWVudHVtIHNjcm9sbGluZ1xuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIGdldFZpZXdwb3J0U3RhdGUsIGNsYW1wIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxpbmdDb25maWcge1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xuICBzZW5zaXRpdml0eT86IG51bWJlcjtcbiAgc21vb3RoaW5nPzogYm9vbGVhbjtcbiAgaWRsZVRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBTdG9wIHNjcm9sbGluZyB3aGVuIGNsaWNraW5nIG9uIHRoZSB2aWV3cG9ydCAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgc3RvcE9uQ2xpY2s/OiBib29sZWFuO1xufVxuXG4vLyBTcGVlZCB0cmFja2VyIGludGVyZmFjZVxuaW50ZXJmYWNlIFNwZWVkVHJhY2tlciB7XG4gIHZlbG9jaXR5OiBudW1iZXI7XG4gIGxhc3RQb3NpdGlvbjogbnVtYmVyO1xuICBsYXN0VGltZTogbnVtYmVyO1xuICBkaXJlY3Rpb246IFwiZm9yd2FyZFwiIHwgXCJiYWNrd2FyZFwiO1xuICBzYW1wbGVzOiBBcnJheTx7IHBvc2l0aW9uOiBudW1iZXI7IHRpbWU6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHNwZWVkIHRyYWNrZXJcbiAqL1xuY29uc3QgY3JlYXRlU3BlZWRUcmFja2VyID0gKCk6IFNwZWVkVHJhY2tlciA9PiAoe1xuICB2ZWxvY2l0eTogMCxcbiAgbGFzdFBvc2l0aW9uOiAwLFxuICBsYXN0VGltZTogRGF0ZS5ub3coKSxcbiAgZGlyZWN0aW9uOiBcImZvcndhcmRcIixcbiAgc2FtcGxlczogW10sXG59KTtcblxuLyoqXG4gKiBVcGRhdGVzIHNwZWVkIHRyYWNrZXIgd2l0aCBuZXcgcG9zaXRpb25cbiAqL1xuY29uc3QgdXBkYXRlU3BlZWRUcmFja2VyID0gKFxuICB0cmFja2VyOiBTcGVlZFRyYWNrZXIsXG4gIG5ld1Bvc2l0aW9uOiBudW1iZXIsXG4gIHByZXZpb3VzUG9zaXRpb246IG51bWJlcixcbik6IFNwZWVkVHJhY2tlciA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHRpbWVEZWx0YSA9IG5vdyAtIHRyYWNrZXIubGFzdFRpbWU7XG5cbiAgaWYgKHRpbWVEZWx0YSA9PT0gMCkgcmV0dXJuIHRyYWNrZXI7XG5cbiAgY29uc3QgcG9zaXRpb25EZWx0YSA9IG5ld1Bvc2l0aW9uIC0gcHJldmlvdXNQb3NpdGlvbjtcbiAgLy8gS2VlcCB2ZWxvY2l0eSBzaWduZWQgKHBvc2l0aXZlID0gZm9yd2FyZC9kb3duLCBuZWdhdGl2ZSA9IGJhY2t3YXJkL3VwKVxuICBjb25zdCBpbnN0YW50VmVsb2NpdHkgPSBwb3NpdGlvbkRlbHRhIC8gdGltZURlbHRhO1xuXG4gIC8vIEFkZCBuZXcgc2FtcGxlXG4gIGNvbnN0IHNhbXBsZXMgPSBbLi4udHJhY2tlci5zYW1wbGVzLCB7IHBvc2l0aW9uOiBuZXdQb3NpdGlvbiwgdGltZTogbm93IH1dO1xuXG4gIC8vIEtlZXAgb25seSByZWNlbnQgc2FtcGxlcyAobGFzdCAxMDBtcylcbiAgY29uc3QgcmVjZW50U2FtcGxlcyA9IHNhbXBsZXMuZmlsdGVyKChzKSA9PiBub3cgLSBzLnRpbWUgPCAxMDApO1xuXG4gIC8vIENhbGN1bGF0ZSBhdmVyYWdlIHZlbG9jaXR5IGZyb20gcmVjZW50IHNhbXBsZXMgKHByZXNlcnZpbmcgc2lnbi9kaXJlY3Rpb24pXG4gIGxldCBhdmdWZWxvY2l0eSA9IGluc3RhbnRWZWxvY2l0eTtcbiAgaWYgKHJlY2VudFNhbXBsZXMubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IG9sZGVzdFNhbXBsZSA9IHJlY2VudFNhbXBsZXNbMF07XG4gICAgY29uc3QgdG90YWxEaXN0YW5jZSA9IG5ld1Bvc2l0aW9uIC0gb2xkZXN0U2FtcGxlLnBvc2l0aW9uOyAvLyBTaWduZWQgZGlzdGFuY2VcbiAgICBjb25zdCB0b3RhbFRpbWUgPSBub3cgLSBvbGRlc3RTYW1wbGUudGltZTtcbiAgICBhdmdWZWxvY2l0eSA9IHRvdGFsVGltZSA+IDAgPyB0b3RhbERpc3RhbmNlIC8gdG90YWxUaW1lIDogaW5zdGFudFZlbG9jaXR5O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2ZWxvY2l0eTogYXZnVmVsb2NpdHksXG4gICAgbGFzdFBvc2l0aW9uOiBuZXdQb3NpdGlvbixcbiAgICBsYXN0VGltZTogbm93LFxuICAgIGRpcmVjdGlvbjogcG9zaXRpb25EZWx0YSA+PSAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIsXG4gICAgc2FtcGxlczogcmVjZW50U2FtcGxlcyxcbiAgfTtcbn07XG5cbi8qKlxuICogU2Nyb2xsaW5nIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBIYW5kbGVzIHdoZWVsIGV2ZW50cywgdmVsb2NpdHkgdHJhY2tpbmcsIGFuZCBpZGxlIGRldGVjdGlvblxuICovXG5leHBvcnQgY29uc3Qgd2l0aFNjcm9sbGluZyA9IChjb25maWc6IFNjcm9sbGluZ0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBvcmllbnRhdGlvbiA9IFwidmVydGljYWxcIixcbiAgICAgIHNlbnNpdGl2aXR5ID0gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLlNDUk9MTF9TRU5TSVRJVklUWSxcbiAgICAgIHNtb290aGluZyA9IGZhbHNlLFxuICAgICAgaWRsZVRpbWVvdXQgPSAxMDAsIC8vIERlZmF1bHQgaWRsZSB0aW1lb3V0IGluIG1zXG4gICAgICBzdG9wT25DbGljayA9IHRydWUsIC8vIFN0b3Agc2Nyb2xsaW5nIG9uIGNsaWNrIGJ5IGRlZmF1bHRcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gU3RhdGVcbiAgICBsZXQgc2Nyb2xsUG9zaXRpb24gPSAwO1xuICAgIGxldCB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICBsZXQgY29udGFpbmVyU2l6ZSA9IDA7XG4gICAgbGV0IGlzU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzU2Nyb2xsZWRGcm9tVG9wID0gZmFsc2U7IC8vIFRyYWNrIGlmIHNjcm9sbGVkIGF3YXkgZnJvbSB0b3BcbiAgICBsZXQgbGFzdFNjcm9sbFRpbWUgPSAwO1xuICAgIGxldCBzcGVlZFRyYWNrZXIgPSBjcmVhdGVTcGVlZFRyYWNrZXIoKTtcbiAgICBsZXQgaWRsZVRpbWVvdXRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlkbGVDaGVja0ZyYW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbGFzdElkbGVDaGVja1Bvc2l0aW9uID0gMDtcbiAgICBsZXQgaGFzRW1pdHRlZElkbGUgPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgYWxyZWFkeSBlbWl0dGVkIGlkbGVcbiAgICBsZXQgYW5jaG9yUG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBBbmNob3IgcG9zaXRpb24gdG8gbWFpbnRhaW4gb24gY2xpY2sgKGZvciBzdG9wT25DbGljaylcbiAgICBsZXQgYW5jaG9yVGltZSA9IDA7IC8vIFRpbWVzdGFtcCB3aGVuIGFuY2hvciB3YXMgc2V0XG4gICAgbGV0IGxhc3RXaGVlbFRpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgbGFzdCB3aGVlbCBldmVudCAoZm9yIGRldGVjdGluZyBnYXBzKVxuICAgIGxldCBhbmNob3JJbml0aWFsRGVsdGEgPSAwOyAvLyBJbml0aWFsIHdoZWVsIGRlbHRhIHdoZW4gYW5jaG9yIHdhcyBzZXQgKHRvIGRldGVjdCBkZWNheSlcbiAgICBsZXQgYW5jaG9yTGFzdERlbHRhID0gMDsgLy8gUHJldmlvdXMgd2hlZWwgZGVsdGEgKHRvIGRldGVjdCBpbmNyZWFzaW5nIGRlbHRhID0gbmV3IHNjcm9sbClcbiAgICBsZXQgYW5jaG9yTWluRGVsdGEgPSBJbmZpbml0eTsgLy8gTWluaW11bSBkZWx0YSBzZWVuIHNpbmNlIGFuY2hvciAodG8gZGV0ZWN0IHJlYWNjZWxlcmF0aW9uKVxuICAgIGxldCBjb25zZWN1dGl2ZUluY3JlYXNlcyA9IDA7IC8vIENvdW50IG9mIGNvbnNlY3V0aXZlIGRlbHRhIGluY3JlYXNlcyAodG8gZGV0ZWN0IHN1c3RhaW5lZCBuZXcgc2Nyb2xsaW5nKVxuICAgIGxldCBzdXN0YWluZWRIaWdoQ291bnQgPSAwOyAvLyBDb3VudCBvZiBldmVudHMgd2hlcmUgZGVsdGEgaXMgc2lnbmlmaWNhbnRseSBhYm92ZSBtaW5pbXVtIChzdXN0YWluZWQgbmV3IHNjcm9sbGluZylcblxuICAgIC8vIGNvbnNvbGUubG9nKGBbU2Nyb2xsaW5nXSBJbml0aWFsIHN0YXRlIC0gcG9zaXRpb246ICR7c2Nyb2xsUG9zaXRpb259YCk7XG5cbiAgICAvLyBUaHJlc2hvbGQgZm9yIGNvbnNpZGVyaW5nIHRoZSBsaXN0IFwic2Nyb2xsZWRcIiAoaW4gcGl4ZWxzKVxuICAgIGNvbnN0IFNDUk9MTEVEX1RIUkVTSE9MRCA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzY3JvbGxlZCBzdGF0ZSBjbGFzcyBvbiB0aGUgdmxpc3QgY29udGFpbmVyXG4gICAgICogQWRkcyAtLXNjcm9sbGVkIG1vZGlmaWVyIHdoZW4gbGlzdCBpcyBub3QgYXQgdGhlIHRvcFxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZVNjcm9sbGVkU3RhdGUgPSAoXG4gICAgICB2aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgICAgcG9zaXRpb246IG51bWJlcixcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEJlU2Nyb2xsZWQgPSBwb3NpdGlvbiA+IFNDUk9MTEVEX1RIUkVTSE9MRDtcbiAgICAgIGlmIChzaG91bGRCZVNjcm9sbGVkICE9PSBpc1Njcm9sbGVkRnJvbVRvcCkge1xuICAgICAgICBpc1Njcm9sbGVkRnJvbVRvcCA9IHNob3VsZEJlU2Nyb2xsZWQ7XG4gICAgICAgIC8vIEZpbmQgdGhlIHZsaXN0IGNvbnRhaW5lciAocGFyZW50IG9mIHZpZXdwb3J0KVxuICAgICAgICBjb25zdCB2bGlzdENvbnRhaW5lciA9IHZpZXdwb3J0RWxlbWVudC5jbG9zZXN0KFwiLm10cmwtdmxpc3RcIik7XG4gICAgICAgIGlmICh2bGlzdENvbnRhaW5lcikge1xuICAgICAgICAgIHZsaXN0Q29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoXG4gICAgICAgICAgICBcIm10cmwtdmxpc3QtLXNjcm9sbGVkXCIsXG4gICAgICAgICAgICBzaG91bGRCZVNjcm9sbGVkLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gR2V0IHZpZXdwb3J0IHN0YXRlXG4gICAgbGV0IHZpZXdwb3J0U3RhdGU6IGFueTtcblxuICAgIC8vIFVzZSBzaGFyZWQgaW5pdGlhbGl6YXRpb24gd3JhcHBlclxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSB2YWx1ZXNcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgIHRvdGFsVmlydHVhbFNpemUgPSB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgfHwgMDtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSB8fCAwO1xuICAgICAgICAvLyBTeW5jIHNjcm9sbFBvc2l0aW9uIGZyb20gdmlld3BvcnRTdGF0ZSAoaW1wb3J0YW50IGZvciBpbml0aWFsU2Nyb2xsSW5kZXgpXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID4gMCkge1xuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHZpcnR1YWwgc2l6ZSBjaGFuZ2VzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbU2Nyb2xsaW5nXSBWaXJ0dWFsIHNpemUgY2hhbmdlZDpcIiwgZGF0YSk7XG4gICAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyhkYXRhLnRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3Igc2Nyb2xsIHBvc2l0aW9uIGNoYW5nZXMgZnJvbSBvdGhlciBmZWF0dXJlcyAoZS5nLiwgdmlydHVhbC50cyBhZnRlciBpdGVtIHNpemUgZGV0ZWN0aW9uKVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgJiYgZGF0YS5wb3NpdGlvbiAhPT0gc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IGRhdGEucG9zaXRpb247XG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgbG9jYWwgdHJhY2tpbmcgdmFyc1xuICAgICAgICAgIHRvdGFsVmlydHVhbFNpemUgPVxuICAgICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlydHVhbFRvdGFsU2l6ZSB8fCB0b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICAgIGNvbnRhaW5lclNpemUgPSB2aWV3cG9ydFN0YXRlPy5jb250YWluZXJTaXplIHx8IGNvbnRhaW5lclNpemU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGNvbnRhaW5lciBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgICBjb250YWluZXJTaXplID0gZGF0YS5jb250YWluZXJTaXplO1xuICAgICAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEF0dGFjaCB3aGVlbCBldmVudCBsaXN0ZW5lciB0byB2aWV3cG9ydCBlbGVtZW50XG4gICAgICBjb25zdCB2aWV3cG9ydEVsZW1lbnQgPVxuICAgICAgICB2aWV3cG9ydFN0YXRlPy52aWV3cG9ydEVsZW1lbnQgfHwgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudDtcbiAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtTY3JvbGxpbmddIEF0dGFjaGluZyB3aGVlbCBldmVudCB0byB2aWV3cG9ydCBlbGVtZW50YCk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgaGFuZGxlV2hlZWwsIHtcbiAgICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBzY3JvbGxlZCBzdGF0ZSBiYXNlZCBvbiBjdXJyZW50IHNjcm9sbCBwb3NpdGlvblxuICAgICAgICB1cGRhdGVTY3JvbGxlZFN0YXRlKHZpZXdwb3J0RWxlbWVudCwgc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAgIC8vIEFkZCBtb3VzZWRvd24gbGlzdGVuZXIgdG8gc3RvcCBzY3JvbGxpbmcgb24gY2xpY2tcbiAgICAgICAgaWYgKHN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlTW91c2VEb3duKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuX3Njcm9sbGluZ1ZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdTdG9wT25DbGljayA9IHN0b3BPbkNsaWNrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbU2Nyb2xsaW5nXSBObyB2aWV3cG9ydCBlbGVtZW50IGZvdW5kIGZvciB3aGVlbCBldmVudHNgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVzZSBjbGFtcCBmcm9tIHV0aWxzXG5cbiAgICAvLyBTdGFydCBpZGxlIGRldGVjdGlvblxuICAgIGNvbnN0IHN0YXJ0SWRsZURldGVjdGlvbiA9ICgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1Njcm9sbGluZ10gU3RhcnRpbmcgaWRsZSBkZXRlY3Rpb25cIik7XG5cbiAgICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIGlkbGUgZGV0ZWN0aW9uIGZpcnN0XG4gICAgICBpZiAoaWRsZUNoZWNrRnJhbWUgIT09IG51bGwpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWRsZUNoZWNrRnJhbWUpO1xuICAgICAgICBpZGxlQ2hlY2tGcmFtZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhhc0VtaXR0ZWRJZGxlID0gZmFsc2U7IC8vIFJlc2V0IGlkbGUgZW1pc3Npb24gZmxhZ1xuICAgICAgY29uc3QgY2hlY2tJZGxlID0gKCkgPT4ge1xuICAgICAgICBpZiAoc2Nyb2xsUG9zaXRpb24gPT09IGxhc3RJZGxlQ2hlY2tQb3NpdGlvbikge1xuICAgICAgICAgIC8vIFBvc2l0aW9uIGhhc24ndCBjaGFuZ2VkIC0gd2UncmUgaWRsZVxuICAgICAgICAgIGlmICghaGFzRW1pdHRlZElkbGUgJiYgKHNwZWVkVHJhY2tlci52ZWxvY2l0eSA+IDAgfHwgaXNTY3JvbGxpbmcpKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgXCJbU2Nyb2xsaW5nXSBJZGxlIGRldGVjdGVkIC0gcG9zaXRpb24gc3RhYmxlLCBzZXR0aW5nIHZlbG9jaXR5IHRvIHplcm9cIlxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIGhhc0VtaXR0ZWRJZGxlID0gdHJ1ZTsgLy8gTWFyayB0aGF0IHdlJ3ZlIGVtaXR0ZWQgaWRsZVxuICAgICAgICAgICAgc2V0VmVsb2NpdHlUb1plcm8oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUG9zaXRpb24gY2hhbmdlZCwgcmVzZXQgdGhlIGZsYWdcbiAgICAgICAgICBoYXNFbWl0dGVkSWRsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RJZGxlQ2hlY2tQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICBpZGxlQ2hlY2tGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShjaGVja0lkbGUpO1xuICAgICAgfTtcbiAgICAgIGlkbGVDaGVja0ZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNoZWNrSWRsZSk7XG4gICAgfTtcblxuICAgIC8vIFN0b3AgaWRsZSBkZXRlY3Rpb25cbiAgICBjb25zdCBzdG9wSWRsZURldGVjdGlvbiA9ICgpID0+IHtcbiAgICAgIGlmIChpZGxlQ2hlY2tGcmFtZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTY3JvbGxpbmddIFN0b3BwaW5nIGlkbGUgZGV0ZWN0aW9uXCIpO1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShpZGxlQ2hlY2tGcmFtZSk7XG4gICAgICAgIGlkbGVDaGVja0ZyYW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU2V0IHZlbG9jaXR5IHRvIHplcm8gYW5kIGVtaXQgaWRsZSBldmVudFxuICAgIGNvbnN0IHNldFZlbG9jaXR5VG9aZXJvID0gKCkgPT4ge1xuICAgICAgLy8gU3RvcCBpZGxlIGRldGVjdGlvbiBzaW5jZSB3ZSdyZSBub3cgaWRsZVxuICAgICAgc3RvcElkbGVEZXRlY3Rpb24oKTtcblxuICAgICAgc3BlZWRUcmFja2VyID0gY3JlYXRlU3BlZWRUcmFja2VyKCk7XG4gICAgICBpc1Njcm9sbGluZyA9IGZhbHNlOyAvLyBSZXNldCBzY3JvbGxpbmcgc3RhdGVcblxuICAgICAgLy8gRW1pdCB2ZWxvY2l0eSBjaGFuZ2VcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBFbWl0IGlkbGUgc3RhdGVcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppZGxlXCIsIHtcbiAgICAgICAgcG9zaXRpb246IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBsYXN0U2Nyb2xsVGltZSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlIHx8ICF2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgIC8vIEl0ZW1zIGNvbnRhaW5lciBkb2Vzbid0IG1vdmUgLSBpdGVtcyBpbnNpZGUgaXQgYXJlIHBvc2l0aW9uZWRcbiAgICAgIC8vIFRoaXMgaXMgaGFuZGxlZCBieSB0aGUgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIG1vdXNlZG93biB0byBzdG9wIHNjcm9sbGluZyBvbiBjbGlja1xuICAgIGNvbnN0IGhhbmRsZU1vdXNlRG93biA9IChfZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gQW5jaG9yIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiAtIGFueSB3aGVlbCBldmVudHMgd2lsbCBiZSBmb3JjZWQgYmFjayB0byB0aGlzIHBvc2l0aW9uXG4gICAgICAvLyBUaGlzIGVsZWdhbnRseSBoYW5kbGVzIG1vdXNlIHdoZWVscyB3aXRoIHBoeXNpY2FsIGluZXJ0aWEgKGxpa2UgTG9naXRlY2ggZnJlZS1zcGluKVxuICAgICAgYW5jaG9yUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIGFuY2hvclRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgYW5jaG9ySW5pdGlhbERlbHRhID0gMDsgLy8gV2lsbCBiZSBzZXQgYnkgZmlyc3Qgd2hlZWwgZXZlbnRcbiAgICAgIGFuY2hvckxhc3REZWx0YSA9IDA7XG4gICAgICBhbmNob3JNaW5EZWx0YSA9IEluZmluaXR5O1xuICAgICAgY29uc2VjdXRpdmVJbmNyZWFzZXMgPSAwO1xuICAgICAgc3VzdGFpbmVkSGlnaENvdW50ID0gMDtcblxuICAgICAgLy8gT25seSBzdG9wIGlmIHdlJ3JlIGN1cnJlbnRseSBzY3JvbGxpbmdcbiAgICAgIGlmIChpc1Njcm9sbGluZyB8fCBzcGVlZFRyYWNrZXIudmVsb2NpdHkgPiAwKSB7XG4gICAgICAgIHNldFZlbG9jaXR5VG9aZXJvKCk7XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHN0b3AgbW9tZW50dW0gYW5pbWF0aW9uIGlmIGFjdGl2ZVxuICAgICAgY29uc3QgbW9tZW50dW1TdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5tb21lbnR1bVN0YXRlO1xuICAgICAgaWYgKG1vbWVudHVtU3RhdGU/LnN0b3BNb21lbnR1bSkge1xuICAgICAgICBtb21lbnR1bVN0YXRlLnN0b3BNb21lbnR1bSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgd2hlZWwgZXZlbnRcbiAgICBjb25zdCBoYW5kbGVXaGVlbCA9IChldmVudDogV2hlZWxFdmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgY29uc3QgZGVsdGEgPSBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZXZlbnQuZGVsdGFZIDogZXZlbnQuZGVsdGFYO1xuICAgICAgY29uc3Qgc2Nyb2xsRGVsdGEgPSBkZWx0YSAqIHNlbnNpdGl2aXR5O1xuXG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdGltZVNpbmNlTGFzdFdoZWVsID0gbm93IC0gbGFzdFdoZWVsVGltZTtcbiAgICAgIGxhc3RXaGVlbFRpbWUgPSBub3c7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYW4gYW5jaG9yIHBvc2l0aW9uICh1c2VyIGNsaWNrZWQgdG8gc3RvcCBzY3JvbGxpbmcpLFxuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBpbnRlbnRpb25hbCBuZXcgc2Nyb2xsaW5nIG9yIHJlc2lkdWFsIHdoZWVsIGluZXJ0aWFcbiAgICAgIGlmIChhbmNob3JQb3NpdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0aW1lU2luY2VBbmNob3IgPSBub3cgLSBhbmNob3JUaW1lO1xuICAgICAgICBjb25zdCB3aGVlbERlbHRhTWFnbml0dWRlID0gTWF0aC5hYnMoc2Nyb2xsRGVsdGEpO1xuXG4gICAgICAgIC8vIFRyYWNrIGluaXRpYWwgZGVsdGEgdG8gZGV0ZWN0IHdoZW4gaW5lcnRpYSBoYXMgZGVjYXllZFxuICAgICAgICBpZiAoYW5jaG9ySW5pdGlhbERlbHRhID09PSAwKSB7XG4gICAgICAgICAgYW5jaG9ySW5pdGlhbERlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgICBhbmNob3JMYXN0RGVsdGEgPSB3aGVlbERlbHRhTWFnbml0dWRlO1xuICAgICAgICAgIGFuY2hvck1pbkRlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYWNrIG1pbmltdW0gZGVsdGEgdG8gZGV0ZWN0IHJlYWNjZWxlcmF0aW9uICh1c2VyIHN0YXJ0ZWQgc2Nyb2xsaW5nIGFnYWluKVxuICAgICAgICBhbmNob3JNaW5EZWx0YSA9IE1hdGgubWluKGFuY2hvck1pbkRlbHRhLCB3aGVlbERlbHRhTWFnbml0dWRlKTtcblxuICAgICAgICAvLyBEZXRlY3QgaWYgZGVsdGEgaXMgaW5jcmVhc2luZyAodXNlciBzdGFydGVkIG5ldyBzY3JvbGwpXG4gICAgICAgIC8vIEluZXJ0aWEgb25seSBkZWNheXMsIHNvIGluY3JlYXNpbmcgZGVsdGEgPSBpbnRlbnRpb25hbCBuZXcgc2Nyb2xsaW5nXG4gICAgICAgIC8vIEJVVDogZmlsdGVyIG91dCBiYXRjaGVkIGV2ZW50cyB3aGVyZSBkZWx0YSBpcyB+MnggdGhlIGxhc3QgKGJyb3dzZXIgYmF0Y2hpbmcsIG5vdCByZWFsIGluY3JlYXNlKVxuICAgICAgICBjb25zdCBpc0JhdGNoZWRFdmVudCA9XG4gICAgICAgICAgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvckxhc3REZWx0YSAqIDEuOCAmJlxuICAgICAgICAgIHdoZWVsRGVsdGFNYWduaXR1ZGUgPCBhbmNob3JMYXN0RGVsdGEgKiAyLjI7XG5cbiAgICAgICAgLy8gVHJhY2sgY29uc2VjdXRpdmUgaW5jcmVhc2VzIC0gc3VzdGFpbmVkIGluY3JlYXNlcyBpbmRpY2F0ZSBuZXcgc2Nyb2xsaW5nXG4gICAgICAgIC8vIFVzZSAxJSB0aHJlc2hvbGQgdG8gY2F0Y2ggZ3JhZHVhbCBhY2NlbGVyYXRpb25cbiAgICAgICAgaWYgKCFpc0JhdGNoZWRFdmVudCAmJiB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTGFzdERlbHRhICogMS4wMSkge1xuICAgICAgICAgIGNvbnNlY3V0aXZlSW5jcmVhc2VzKys7XG4gICAgICAgIH0gZWxzZSBpZiAod2hlZWxEZWx0YU1hZ25pdHVkZSA8IGFuY2hvckxhc3REZWx0YSAqIDAuOTkpIHtcbiAgICAgICAgICAvLyBEZWx0YSBkZWNyZWFzaW5nIC0gcmVzZXQgY291bnRlclxuICAgICAgICAgIGNvbnNlY3V0aXZlSW5jcmVhc2VzID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBkZWx0YSBpcyByb3VnaGx5IHRoZSBzYW1lICh3aXRoaW4gMSUpLCBkb24ndCBjaGFuZ2UgdGhlIGNvdW50ZXJcblxuICAgICAgICAvLyBUcmFjayBzdXN0YWluZWQgaGlnaCBkZWx0YSAoZGVsdGEgc2lnbmlmaWNhbnRseSBhYm92ZSBtaW5pbXVtIGZvciBtdWx0aXBsZSBldmVudHMpXG4gICAgICAgIC8vIFRoaXMgY2F0Y2hlcyB3aGVuIHVzZXIgc3RhcnRzIHNjcm9sbGluZyBidXQgZGVsdGEgcGxhdGVhdXMgaW5zdGVhZCBvZiBzdHJpY3RseSBpbmNyZWFzaW5nXG4gICAgICAgIGlmICghaXNCYXRjaGVkRXZlbnQgJiYgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvck1pbkRlbHRhICogMS4wNSkge1xuICAgICAgICAgIHN1c3RhaW5lZEhpZ2hDb3VudCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1c3RhaW5lZEhpZ2hDb3VudCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWxlYXNlIGlmOiAzKyBjb25zZWN1dGl2ZSBpbmNyZWFzZXMsIE9SIHN1c3RhaW5lZCBoaWdoIGRlbHRhLCBPUiBzaWduaWZpY2FudCBzaW5nbGUgaW5jcmVhc2VcbiAgICAgICAgY29uc3Qgc3VzdGFpbmVkSW5jcmVhc2UgPSBjb25zZWN1dGl2ZUluY3JlYXNlcyA+PSAzO1xuICAgICAgICBjb25zdCBzdXN0YWluZWRIaWdoID0gc3VzdGFpbmVkSGlnaENvdW50ID49IDU7IC8vIDUrIGV2ZW50cyBhdCA1JSsgYWJvdmUgbWluaW11bVxuICAgICAgICBjb25zdCBzaWduaWZpY2FudEluY3JlYXNlID1cbiAgICAgICAgICAhaXNCYXRjaGVkRXZlbnQgJiZcbiAgICAgICAgICB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTWluRGVsdGEgKiAxLjE1ICYmIC8vIDE1JSBpbmNyZWFzZSBmcm9tIG1pbmltdW1cbiAgICAgICAgICB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTGFzdERlbHRhICogMS4wODsgLy8gYW5kIDglIGluY3JlYXNpbmcgZnJvbSBsYXN0XG4gICAgICAgIGNvbnN0IGRlbHRhSW5jcmVhc2luZyA9XG4gICAgICAgICAgc3VzdGFpbmVkSW5jcmVhc2UgfHwgc3VzdGFpbmVkSGlnaCB8fCBzaWduaWZpY2FudEluY3JlYXNlO1xuXG4gICAgICAgIC8vIFJlbGVhc2UgYW5jaG9yIGlmOlxuICAgICAgICAvLyAxLiBUaGVyZSB3YXMgYSBnYXAgaW4gd2hlZWwgZXZlbnRzICg+IDIwMG1zKSAtIHVzZXIgc3RvcHBlZCBhbmQgc3RhcnRlZCBuZXcgc2Nyb2xsXG4gICAgICAgIC8vIDIuIERlbHRhIGlzIGluY3JlYXNpbmcgZnJvbSBtaW5pbXVtIC0gdXNlciBzdGFydGVkIHNjcm9sbGluZyBhZ2FpbiBkdXJpbmcgaW5lcnRpYVxuICAgICAgICAvLyAzLiBEZWx0YSBoYXMgZGVjYXllZCBzaWduaWZpY2FudGx5ICg8IDMwJSBvZiBpbml0aWFsKSAtIGluZXJ0aWEgaXMgd2luZGluZyBkb3duXG4gICAgICAgIC8vIDQuIExvdyBhYnNvbHV0ZSBkZWx0YSAoPCAzMCkgLSBnZW50bGUgaW50ZW50aW9uYWwgc2Nyb2xsXG4gICAgICAgIGNvbnN0IGhhc1doZWVsR2FwID0gdGltZVNpbmNlTGFzdFdoZWVsID4gMjAwO1xuICAgICAgICBjb25zdCBkZWx0YURlY2F5ZWQgPSB3aGVlbERlbHRhTWFnbml0dWRlIDwgYW5jaG9ySW5pdGlhbERlbHRhICogMC4zO1xuICAgICAgICBjb25zdCBpc0xvd0RlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZSA8IDMwO1xuXG4gICAgICAgIGlmIChoYXNXaGVlbEdhcCkge1xuICAgICAgICAgIC8vIFRpbWUgZ2FwIC0gdXNlciBzdG9wcGVkIGFuZCBzdGFydGVkIG5ldyBzY3JvbGxcbiAgICAgICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsdGFJbmNyZWFzaW5nICYmIHRpbWVTaW5jZUFuY2hvciA+IDEwMCkge1xuICAgICAgICAgIC8vIERlbHRhIGluY3JlYXNpbmcgLSB1c2VyIHN0YXJ0ZWQgc2Nyb2xsaW5nIGFnYWluXG4gICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTG93RGVsdGEpIHtcbiAgICAgICAgICAvLyBWZXJ5IGxvdyBkZWx0YSAtIGdlbnRsZSBpbnRlbnRpb25hbCBzY3JvbGxcbiAgICAgICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsdGFEZWNheWVkICYmIHRpbWVTaW5jZUFuY2hvciA+IDMwMCkge1xuICAgICAgICAgIC8vIERlbHRhIGhhcyBkZWNheWVkIGFuZCBzb21lIHRpbWUgcGFzc2VkIC0gaW5lcnRpYSBpcyBkb25lXG4gICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFN0aWxsIGluIGluZXJ0aWEgcGhhc2UgLSBzdGF5IGFuY2hvcmVkXG4gICAgICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uICE9PSBhbmNob3JQb3NpdGlvbikge1xuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBhbmNob3JQb3NpdGlvbjtcbiAgICAgICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgbGFzdCBkZWx0YSBmb3IgbmV4dCBjb21wYXJpc29uXG4gICAgICAgICAgYW5jaG9yTGFzdERlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgbGFzdCBkZWx0YSBmb3IgbmV4dCBjb21wYXJpc29uXG4gICAgICAgIGFuY2hvckxhc3REZWx0YSA9IHdoZWVsRGVsdGFNYWduaXR1ZGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByZXZpb3VzUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IE1hdGgubWF4KDAsIHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcblxuICAgICAgbGV0IG5ld1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb24gKyBzY3JvbGxEZWx0YTtcblxuICAgICAgLy8gQXBwbHkgc21vb3RoaW5nIGlmIGVuYWJsZWRcbiAgICAgIGlmIChzbW9vdGhpbmcpIHtcbiAgICAgICAgY29uc3Qgc21vb3RoaW5nRmFjdG9yID0gMC4zO1xuICAgICAgICBuZXdQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uICsgc2Nyb2xsRGVsdGEgKiBzbW9vdGhpbmdGYWN0b3I7XG4gICAgICB9XG5cbiAgICAgIG5ld1Bvc2l0aW9uID0gY2xhbXAobmV3UG9zaXRpb24sIDAsIG1heFNjcm9sbCk7XG5cbiAgICAgIGlmIChuZXdQb3NpdGlvbiAhPT0gc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsIHN0YXRlXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgLy8gU3RvcCBhbnkgZXhpc3RpbmcgaWRsZSBkZXRlY3Rpb24gYmVmb3JlIHN0YXJ0aW5nIG5ldyBvbmVcbiAgICAgICAgICBzdG9wSWRsZURldGVjdGlvbigpO1xuICAgICAgICAgIHN0YXJ0SWRsZURldGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RTY3JvbGxUaW1lID0gbm93O1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyXG4gICAgICAgIHNwZWVkVHJhY2tlciA9IHVwZGF0ZVNwZWVkVHJhY2tlcihcbiAgICAgICAgICBzcGVlZFRyYWNrZXIsXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52ZWxvY2l0eSA9IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbERpcmVjdGlvbiA9IHNwZWVkVHJhY2tlci5kaXJlY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsZWQgc3RhdGUgY2xhc3NcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlld3BvcnRFbGVtZW50IHx8IChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsKSB7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsZWRTdGF0ZSh2aWV3cG9ydEVsLCBzY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGV2ZW50c1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgZGlyZWN0aW9uOiBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICB2ZWxvY2l0eTogc3BlZWRUcmFja2VyLnZlbG9jaXR5LFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBwb3NpdGlvblxuICAgIGNvbnN0IHNjcm9sbFRvUG9zaXRpb24gPSAocG9zaXRpb246IG51bWJlciwgc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtYXhTY3JvbGwgPSBNYXRoLm1heCgwLCB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG4gICAgICBjb25zdCBjbGFtcGVkUG9zaXRpb24gPSBjbGFtcChwb3NpdGlvbiwgMCwgbWF4U2Nyb2xsKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBzY3JvbGxUb1Bvc2l0aW9uOiBwb3M9JHtwb3NpdGlvbn0gLT4gJHtjbGFtcGVkUG9zaXRpb259LCBzb3VyY2U9JHtzb3VyY2V9LCBjdXJyZW50UG9zPSR7c2Nyb2xsUG9zaXRpb259LCB2ZWxvY2l0eT0ke3NwZWVkVHJhY2tlci52ZWxvY2l0eS50b0ZpeGVkKFxuICAgICAgLy8gICAgIDNcbiAgICAgIC8vICAgKX1gXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAoY2xhbXBlZFBvc2l0aW9uICE9PSBzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgIHNjcm9sbFBvc2l0aW9uID0gY2xhbXBlZFBvc2l0aW9uO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyIHRvIGNhbGN1bGF0ZSB2ZWxvY2l0eVxuICAgICAgICBzcGVlZFRyYWNrZXIgPSB1cGRhdGVTcGVlZFRyYWNrZXIoXG4gICAgICAgICAgc3BlZWRUcmFja2VyLFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmVsb2NpdHkgPSBzcGVlZFRyYWNrZXIudmVsb2NpdHk7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxEaXJlY3Rpb24gPSBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID1cbiAgICAgICAgICBjbGFtcGVkUG9zaXRpb24gPiBwcmV2aW91c1Bvc2l0aW9uID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCI7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNjcm9sbGVkIHN0YXRlIGNsYXNzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWwgPVxuICAgICAgICAgIHZpZXdwb3J0U3RhdGU/LnZpZXdwb3J0RWxlbWVudCB8fCAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50O1xuICAgICAgICBpZiAodmlld3BvcnRFbCkge1xuICAgICAgICAgIHVwZGF0ZVNjcm9sbGVkU3RhdGUodmlld3BvcnRFbCwgc2Nyb2xsUG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBzY3JvbGwgZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbFwiLCB7XG4gICAgICAgICAgcG9zaXRpb246IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbWl0IHZlbG9jaXR5IGNoYW5nZSBldmVudCBzbyBjb2xsZWN0aW9uIGNhbiB0cmFjayBpdFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCB7XG4gICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGwgc3RhdGUgYW5kIGlkbGUgZGV0ZWN0aW9uXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtTY3JvbGxpbmddIFBvc2l0aW9uIHVuY2hhbmdlZDogJHtzY3JvbGxQb3NpdGlvbn1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtTY3JvbGxpbmddIFBvc2l0aW9uIHVuY2hhbmdlZDogJHtzY3JvbGxQb3NpdGlvbn0sIG5vdCByZXNldHRpbmcgaWRsZSB0aW1lb3V0YFxuICAgICAgICAvLyApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTY3JvbGwgdG8gaW5kZXhcbiAgICBjb25zdCBzY3JvbGxUb0luZGV4ID0gKFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIHNjcm9sbFRvSW5kZXggY2FsbGVkOiBpbmRleD0ke2luZGV4fSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gc2Nyb2xsVG9JbmRleCBhYm9ydGVkOiBubyB2aWV3cG9ydCBzdGF0ZWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSB8fCA1MDtcbiAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgfHwgMDtcbiAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IE1BWF9WSVJUVUFMX1NJWkUgPVxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuTUFYX1ZJUlRVQUxfU0laRTtcbiAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9IGFjdHVhbFRvdGFsU2l6ZSA+IE1BWF9WSVJUVUFMX1NJWkU7XG5cbiAgICAgIGxldCB0YXJnZXRQb3NpdGlvbjogbnVtYmVyO1xuXG4gICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgIC8vIEluIGNvbXByZXNzZWQgc3BhY2UsIG1hcCBpbmRleCB0byB2aXJ0dWFsIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHJhdGlvID0gaW5kZXggLyB0b3RhbEl0ZW1zO1xuICAgICAgICB0YXJnZXRQb3NpdGlvbiA9IHJhdGlvICogTWF0aC5taW4oYWN0dWFsVG90YWxTaXplLCBNQVhfVklSVFVBTF9TSVpFKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvbiB3aGVuIG5vdCBjb21wcmVzc2VkXG4gICAgICAgIHRhcmdldFBvc2l0aW9uID0gaW5kZXggKiBpdGVtU2l6ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRqdXN0IHBvc2l0aW9uIGJhc2VkIG9uIGFsaWdubWVudFxuICAgICAgc3dpdGNoIChhbGlnbm1lbnQpIHtcbiAgICAgICAgY2FzZSBcImNlbnRlclwiOlxuICAgICAgICAgIHRhcmdldFBvc2l0aW9uIC09IGNvbnRhaW5lclNpemUgLyAyIC0gaXRlbVNpemUgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgdGFyZ2V0UG9zaXRpb24gLT0gY29udGFpbmVyU2l6ZSAtIGl0ZW1TaXplO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIFRhcmdldCBwb3NpdGlvbjogJHt0YXJnZXRQb3NpdGlvbn0sIGlzQ29tcHJlc3NlZDogJHtpc0NvbXByZXNzZWR9YFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBTY3JvbGxUb0luZGV4OiBpbmRleD0ke2luZGV4fSwgcG9zaXRpb249JHt0YXJnZXRQb3NpdGlvbn0sIGFsaWdubWVudD0ke2FsaWdubWVudH1gXG4gICAgICAvLyApO1xuXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uKHRhcmdldFBvc2l0aW9uLCBcInNjcm9sbFRvSW5kZXhcIik7XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBhIHNwZWNpZmljIHBhZ2VcbiAgICBjb25zdCBzY3JvbGxUb1BhZ2UgPSAoXG4gICAgICBwYWdlOiBudW1iZXIsXG4gICAgICBsaW1pdDogbnVtYmVyID0gMjAsXG4gICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICkgPT4ge1xuICAgICAgLy8gVmFsaWRhdGUgYWxpZ25tZW50IHBhcmFtZXRlclxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgYWxpZ25tZW50ICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICFbXCJzdGFydFwiLCBcImNlbnRlclwiLCBcImVuZFwiXS5pbmNsdWRlcyhhbGlnbm1lbnQpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbU2Nyb2xsaW5nXSBJbnZhbGlkIGFsaWdubWVudCBcIiR7YWxpZ25tZW50fVwiLCB1c2luZyBcInN0YXJ0XCJgLFxuICAgICAgICApO1xuICAgICAgICBhbGlnbm1lbnQgPSBcInN0YXJ0XCI7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICBjb25zdCB2aWV3cG9ydENvbmZpZyA9IChjb21wb25lbnQgYXMgYW55KS5jb25maWc7XG4gICAgICBjb25zdCBpc0N1cnNvck1vZGUgPSB2aWV3cG9ydENvbmZpZz8ucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCI7XG5cbiAgICAgIGlmIChpc0N1cnNvck1vZGUpIHtcbiAgICAgICAgLy8gSW4gY3Vyc29yIG1vZGUsIGNoZWNrIGlmIHdlIGNhbiBzY3JvbGwgdG8gdGhpcyBwYWdlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCBoaWdoZXN0TG9hZGVkUGFnZSA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpLnNpemUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChwYWdlID4gaGlnaGVzdExvYWRlZFBhZ2UgKyAxKSB7XG4gICAgICAgICAgICAvLyBMaW1pdCBob3cgbWFueSBwYWdlcyB3ZSdsbCBsb2FkIGF0IG9uY2UgdG8gcHJldmVudCBleGNlc3NpdmUgQVBJIGNhbGxzXG4gICAgICAgICAgICBjb25zdCBtYXhQYWdlc1RvTG9hZCA9IDEwOyAvLyBSZWFzb25hYmxlIGxpbWl0XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRQYWdlID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgIGhpZ2hlc3RMb2FkZWRQYWdlICsgbWF4UGFnZXNUb0xvYWQsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBbU2Nyb2xsaW5nXSBDYW5ub3QganVtcCBkaXJlY3RseSB0byBwYWdlICR7cGFnZX0gaW4gY3Vyc29yIG1vZGUuIGAgK1xuICAgICAgICAgICAgICAgIGBQYWdlcyBtdXN0IGJlIGxvYWRlZCBzZXF1ZW50aWFsbHkuIEN1cnJlbnQgaGlnaGVzdCBwYWdlOiAke2hpZ2hlc3RMb2FkZWRQYWdlfS4gYCArXG4gICAgICAgICAgICAgICAgYFdpbGwgbG9hZCB1cCB0byBwYWdlICR7dGFyZ2V0UGFnZX1gLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gVHJpZ2dlciBzZXF1ZW50aWFsIGxvYWRpbmcgdG8gdGhlIHRhcmdldCBwYWdlIChsaW1pdGVkKVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0T2Zmc2V0ID0gKHRhcmdldFBhZ2UgLSAxKSAqIGxpbWl0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE9mZnNldCA9IGhpZ2hlc3RMb2FkZWRQYWdlICogbGltaXQ7XG5cbiAgICAgICAgICAgIC8vIExvYWQgcGFnZXMgc2VxdWVudGlhbGx5IHVwIHRvIHRoZSBsaW1pdGVkIHRhcmdldFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBJbml0aWF0aW5nIHNlcXVlbnRpYWwgbG9hZCBmcm9tIHBhZ2UgJHtcbiAgICAgICAgICAgIC8vICAgICBoaWdoZXN0TG9hZGVkUGFnZSArIDFcbiAgICAgICAgICAgIC8vICAgfSB0byAke3RhcmdldFBhZ2V9YCxcbiAgICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAgIC8vIFNjcm9sbCB0byB0aGUgbGFzdCBsb2FkZWQgcG9zaXRpb24gZmlyc3RcbiAgICAgICAgICAgIGNvbnN0IGxhc3RMb2FkZWRJbmRleCA9IGhpZ2hlc3RMb2FkZWRQYWdlICogbGltaXQ7XG4gICAgICAgICAgICBzY3JvbGxUb0luZGV4KGxhc3RMb2FkZWRJbmRleCwgYWxpZ25tZW50KTtcblxuICAgICAgICAgICAgLy8gVGhlIGNvbGxlY3Rpb24gZmVhdHVyZSB3aWxsIGhhbmRsZSBzZXF1ZW50aWFsIGxvYWRpbmdcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ29udmVydCBwYWdlIHRvIGluZGV4IChwYWdlIDEgPSBpbmRleCAwKVxuICAgICAgY29uc3QgaW5kZXggPSAocGFnZSAtIDEpICogbGltaXQ7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gU2Nyb2xsVG9QYWdlOiBwYWdlPSR7cGFnZX0sIGxpbWl0PSR7bGltaXR9LCB0YXJnZXRJbmRleD0ke2luZGV4fSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEp1c3Qgc2Nyb2xsIHRvIHRoZSBpbmRleCAtIGxldCB0aGUgbm9ybWFsIHJlbmRlcmluZyBmbG93IGhhbmRsZSBkYXRhIGxvYWRpbmcgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHNjcm9sbCBib3VuZHNcbiAgICBjb25zdCB1cGRhdGVTY3JvbGxCb3VuZHMgPSAoXG4gICAgICBuZXdUb3RhbFNpemU6IG51bWJlcixcbiAgICAgIG5ld0NvbnRhaW5lclNpemU6IG51bWJlcixcbiAgICApID0+IHtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICBjb250YWluZXJTaXplID0gbmV3Q29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gbmV3VG90YWxTaXplO1xuICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBuZXdDb250YWluZXJTaXplO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBjbGFtcCBzY3JvbGwgcG9zaXRpb24gdW50aWwgd2UgaGF2ZSByZWFsIGRhdGEgbG9hZGVkXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHJlc2V0dGluZyBpbml0aWFsU2Nyb2xsSW5kZXggcG9zaXRpb24gYmVmb3JlIGRhdGEgYXJyaXZlc1xuICAgICAgLy8gQ2hlY2sgdG90YWxJdGVtcyBpbnN0ZWFkIG9mIHRvdGFsVmlydHVhbFNpemUgc2luY2UgdmlydHVhbFNpemUgY2FuIGJlIG5vbi16ZXJvIGZyb20gcGFkZGluZ1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXMgfHwgMDtcbiAgICAgIGlmICh0b3RhbEl0ZW1zIDw9IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGFtcCBjdXJyZW50IHBvc2l0aW9uIHRvIG5ldyBib3VuZHNcbiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IE1hdGgubWF4KDAsIHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGlmIChzY3JvbGxQb3NpdGlvbiA+IG1heFNjcm9sbCkge1xuICAgICAgICBzY3JvbGxUb1Bvc2l0aW9uKG1heFNjcm9sbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCB2aWV3cG9ydCBBUElcbiAgICBjb25zdCBvcmlnaW5hbFNjcm9sbFRvSW5kZXggPSBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleDtcbiAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleCA9IChcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICBhbGlnbm1lbnQ/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIixcbiAgICApID0+IHtcbiAgICAgIHNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICBvcmlnaW5hbFNjcm9sbFRvSW5kZXg/LihpbmRleCwgYWxpZ25tZW50KTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNjcm9sbFRvUGFnZSB0byB2aWV3cG9ydCBBUEkgKG5ldyBtZXRob2QsIG5vIG9yaWdpbmFsIHRvIHByZXNlcnZlKVxuICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb1BhZ2UgPSAoXG4gICAgICBwYWdlOiBudW1iZXIsXG4gICAgICBsaW1pdD86IG51bWJlcixcbiAgICAgIGFsaWdubWVudD86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiLFxuICAgICkgPT4ge1xuICAgICAgc2Nyb2xsVG9QYWdlKHBhZ2UsIGxpbWl0LCBhbGlnbm1lbnQpO1xuICAgIH07XG5cbiAgICBjb25zdCBvcmlnaW5hbFNjcm9sbFRvUG9zaXRpb24gPSBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbjtcbiAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbiA9IChwb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uKHBvc2l0aW9uLCBcImFwaVwiKTtcbiAgICAgIG9yaWdpbmFsU2Nyb2xsVG9Qb3NpdGlvbj8uKHBvc2l0aW9uKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb3JpZ2luYWxHZXRTY3JvbGxQb3NpdGlvbiA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRTY3JvbGxQb3NpdGlvbjtcbiAgICBjb21wb25lbnQudmlld3BvcnQuZ2V0U2Nyb2xsUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICByZXR1cm4gc2Nyb2xsUG9zaXRpb247XG4gICAgfTtcblxuICAgIC8vIEFkZCB3aGVlbCBldmVudCBsaXN0ZW5lciBvbiBpbml0aWFsaXphdGlvblxuICAgIC8vIFRoaXMgYmxvY2sgaXMgcmVtb3ZlZCBhcyBwZXIgdGhlIGVkaXQgaGludC5cblxuICAgIC8vIENsZWFuIHVwIG9uIGRlc3Ryb3lcbiAgICBpZiAoXCJkZXN0cm95XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAgIGNvbXBvbmVudC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9IChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nVmlld3BvcnRFbGVtZW50O1xuICAgICAgICBpZiAodmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBoYW5kbGVXaGVlbCk7XG4gICAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nU3RvcE9uQ2xpY2spIHtcbiAgICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgdGltZW91dHNcbiAgICAgICAgaWYgKGlkbGVUaW1lb3V0SWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaWRsZVRpbWVvdXRJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdG9wSWRsZURldGVjdGlvbigpO1xuICAgICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGQgc2Nyb2xsQnkgbWV0aG9kXG4gICAgY29uc3Qgc2Nyb2xsQnkgPSAoZGVsdGE6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgcHJldmlvdXNQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgY29uc3QgbmV3UG9zaXRpb24gPSBjbGFtcChzY3JvbGxQb3NpdGlvbiArIGRlbHRhLCAwLCBtYXhTY3JvbGwpO1xuXG4gICAgICBpZiAobmV3UG9zaXRpb24gIT09IHByZXZpb3VzUG9zaXRpb24pIHtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcblxuICAgICAgICAvLyBVcGRhdGUgc3BlZWQgdHJhY2tlclxuICAgICAgICBzcGVlZFRyYWNrZXIgPSB1cGRhdGVTcGVlZFRyYWNrZXIoXG4gICAgICAgICAgc3BlZWRUcmFja2VyLFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmVsb2NpdHkgPSBzcGVlZFRyYWNrZXIudmVsb2NpdHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsZWQgc3RhdGUgY2xhc3NcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlld3BvcnRFbGVtZW50IHx8IChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsKSB7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsZWRTdGF0ZSh2aWV3cG9ydEVsLCBzY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IHNjcm9sbCBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcz8uKCk7XG5cbiAgICAgICAgLy8gU3RhcnQgaWRsZSBkZXRlY3Rpb24gaWYgbm90IHNjcm9sbGluZ1xuICAgICAgICBpZiAoIWlzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgaXNTY3JvbGxpbmcgPSB0cnVlO1xuICAgICAgICAgIHN0YXJ0SWRsZURldGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RTY3JvbGxUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRXhwb3NlIHNjcm9sbGluZyBzdGF0ZSBmb3Igb3RoZXIgZmVhdHVyZXNcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsaW5nU3RhdGUgPSB7XG4gICAgICBzZXRWZWxvY2l0eVRvWmVybyxcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNjcm9sbEJ5IHRvIHZpZXdwb3J0IEFQSVxuICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeSA9IHNjcm9sbEJ5O1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5nZXRWZWxvY2l0eSA9ICgpID0+IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcblxuICAgIC8vIEV4cG9zZSBzY3JvbGxpbmcgQVBJXG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLnNjcm9sbGluZyA9IHtcbiAgICAgIGhhbmRsZVdoZWVsLFxuICAgICAgc2Nyb2xsVG9Qb3NpdGlvbixcbiAgICAgIHNjcm9sbFRvSW5kZXgsXG4gICAgICBzY3JvbGxUb1BhZ2UsXG4gICAgICBzY3JvbGxCeSxcbiAgICAgIGdldFNjcm9sbFBvc2l0aW9uOiAoKSA9PiBzY3JvbGxQb3NpdGlvbixcbiAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyxcbiAgICAgIGdldFZlbG9jaXR5OiAoKSA9PiBzcGVlZFRyYWNrZXIudmVsb2NpdHksXG4gICAgICBnZXREaXJlY3Rpb246ICgpID0+IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICBpc1Njcm9sbGluZzogKCkgPT4gaXNTY3JvbGxpbmcsXG4gICAgfTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9tb21lbnR1bS50c1xuXG4vKipcbiAqIE1vbWVudHVtIEZlYXR1cmUgLSBBZGRzIGluZXJ0aWFsIHNjcm9sbGluZyB0byB2aWV3cG9ydFxuICogUHJvdmlkZXMgc21vb3RoIGRlY2VsZXJhdGlvbiBhZnRlciB0b3VjaC9tb3VzZSBkcmFnIGdlc3R1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbXBvbmVudCwgVmlld3BvcnRDb250ZXh0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmludGVyZmFjZSBNb21lbnR1bUNvbmZpZyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBkZWNlbGVyYXRpb24/OiBudW1iZXI7XG4gIG1pblZlbG9jaXR5PzogbnVtYmVyO1xuICBtaW5EdXJhdGlvbj86IG51bWJlcjtcbiAgbWluVmVsb2NpdHlUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKiBTdG9wIG1vbWVudHVtIHdoZW4gY2xpY2tpbmcgb24gdGhlIHZpZXdwb3J0IChkZWZhdWx0OiB0cnVlKSAqL1xuICBzdG9wT25DbGljaz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQWRkcyBtb21lbnR1bSBzY3JvbGxpbmcgdG8gdmlld3BvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhNb21lbnR1bSA9IChjb25maWc6IE1vbWVudHVtQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGVuYWJsZWQgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uRU5BQkxFRCxcbiAgICAgIGRlY2VsZXJhdGlvbiA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5ERUNFTEVSQVRJT05fRkFDVE9SLFxuICAgICAgbWluVmVsb2NpdHkgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX1ZFTE9DSVRZLFxuICAgICAgbWluRHVyYXRpb24gPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX0RVUkFUSU9OLFxuICAgICAgbWluVmVsb2NpdHlUaHJlc2hvbGQgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX1ZFTE9DSVRZX1RIUkVTSE9MRCxcbiAgICAgIHN0b3BPbkNsaWNrID0gdHJ1ZSwgLy8gU3RvcCBtb21lbnR1bSBvbiBjbGljayBieSBkZWZhdWx0XG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIEFsd2F5cyBhcHBseSB0aGUgZmVhdHVyZSwgYnV0IGNoZWNrIGlzRW5hYmxlZCBhdCBydW50aW1lXG5cbiAgICAvLyBNb21lbnR1bSBzdGF0ZVxuICAgIGxldCBtb21lbnR1bUFuaW1hdGlvbklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNUb3VjaGluZyA9IGZhbHNlO1xuICAgIGxldCBpc01vdXNlRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBsZXQgbGFzdFRvdWNoUG9zaXRpb24gPSAwO1xuICAgIGxldCBsYXN0TW91c2VQb3NpdGlvbiA9IDA7XG4gICAgbGV0IHRvdWNoU3RhcnRUaW1lID0gMDtcbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogYW55O1xuICAgIGxldCBzY3JvbGxpbmdTdGF0ZTogYW55O1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkOyAvLyBUcmFjayBjdXJyZW50IGVuYWJsZWQgc3RhdGVcblxuICAgIC8vIEdldCByZWZlcmVuY2VzIGFmdGVyIGluaXRpYWxpemF0aW9uXG4gICAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXRpYWxpemUoKTtcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdmlld3BvcnQgYW5kIHNjcm9sbGluZyBzdGF0ZXNcbiAgICAgIHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICBzY3JvbGxpbmdTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxpbmdTdGF0ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8vIFN0b3AgbW9tZW50dW0gYW5pbWF0aW9uIChjYW4gYmUgY2FsbGVkIGV4dGVybmFsbHkpXG4gICAgY29uc3Qgc3RvcE1vbWVudHVtID0gKCkgPT4ge1xuICAgICAgaWYgKG1vbWVudHVtQW5pbWF0aW9uSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobW9tZW50dW1BbmltYXRpb25JZCk7XG4gICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgICAvLyBSZXNldCB2ZWxvY2l0eSBpbiBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgICBpZiAoc2Nyb2xsaW5nU3RhdGUpIHtcbiAgICAgICAgICBzY3JvbGxpbmdTdGF0ZS5zZXRWZWxvY2l0eVRvWmVybz8uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU3RhcnQgbW9tZW50dW0gYW5pbWF0aW9uXG4gICAgY29uc3Qgc3RhcnRNb21lbnR1bSA9IChpbml0aWFsVmVsb2NpdHk6IG51bWJlcikgPT4ge1xuICAgICAgLy8gQ2FuY2VsIGFueSBleGlzdGluZyBtb21lbnR1bVxuICAgICAgaWYgKG1vbWVudHVtQW5pbWF0aW9uSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobW9tZW50dW1BbmltYXRpb25JZCk7XG4gICAgICB9XG5cbiAgICAgIGxldCB2ZWxvY2l0eSA9IGluaXRpYWxWZWxvY2l0eTtcblxuICAgICAgY29uc3QgYW5pbWF0ZSA9ICgpID0+IHtcbiAgICAgICAgLy8gQXBwbHkgZGVjZWxlcmF0aW9uXG4gICAgICAgIHZlbG9jaXR5ICo9IGRlY2VsZXJhdGlvbjtcblxuICAgICAgICAvLyBTdG9wIGlmIHZlbG9jaXR5IGlzIHRvbyBzbWFsbFxuICAgICAgICBpZiAoTWF0aC5hYnModmVsb2NpdHkpIDwgbWluVmVsb2NpdHkpIHtcbiAgICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgICAgICAvLyBSZXNldCB2ZWxvY2l0eSBpbiBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgICAgIGlmIChzY3JvbGxpbmdTdGF0ZSkge1xuICAgICAgICAgICAgc2Nyb2xsaW5nU3RhdGUuc2V0VmVsb2NpdHlUb1plcm8/LigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxjdWxhdGUgc2Nyb2xsIGRlbHRhICh2ZWxvY2l0eSBpcyBpbiBweC9tcywgc28gbXVsdGlwbHkgYnkgZnJhbWUgdGltZSlcbiAgICAgICAgY29uc3QgZnJhbWVEZWx0YSA9IHZlbG9jaXR5ICogVklFV1BPUlRfQ09OU1RBTlRTLk1PTUVOVFVNLkZSQU1FX1RJTUU7XG5cbiAgICAgICAgLy8gVXNlIHNjcm9sbGluZyBmZWF0dXJlJ3MgQVBJIHRvIHVwZGF0ZSBwb3NpdGlvblxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KGZyYW1lRGVsdGEpO1xuXG4gICAgICAgICAgLy8gQ29udGludWUgYW5pbWF0aW9uXG4gICAgICAgICAgbW9tZW50dW1BbmltYXRpb25JZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBObyBzY3JvbGxCeSBtZXRob2QsIHN0b3AgbW9tZW50dW1cbiAgICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgbW9tZW50dW1BbmltYXRpb25JZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICB9O1xuXG4gICAgLy8gVG91Y2ggZXZlbnQgaGFuZGxlcnNcbiAgICBjb25zdCBoYW5kbGVUb3VjaFN0YXJ0ID0gKGU6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGlzVG91Y2hpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgdG91Y2ggPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCBvcmllbnRhdGlvbiA9IHZpZXdwb3J0U3RhdGU/Lm9yaWVudGF0aW9uIHx8IFwidmVydGljYWxcIjtcbiAgICAgIGxhc3RUb3VjaFBvc2l0aW9uID1cbiAgICAgICAgb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IHRvdWNoLmNsaWVudFkgOiB0b3VjaC5jbGllbnRYO1xuICAgICAgdG91Y2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAvLyBDYW5jZWwgYW55IG9uZ29pbmcgbW9tZW50dW1cbiAgICAgIGlmIChtb21lbnR1bUFuaW1hdGlvbklkKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKG1vbWVudHVtQW5pbWF0aW9uSWQpO1xuICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gKGU6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGlmICghaXNUb3VjaGluZykgcmV0dXJuO1xuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIFByZXZlbnQgbmF0aXZlIHNjcm9sbGluZ1xuXG4gICAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdmlld3BvcnRTdGF0ZT8ub3JpZW50YXRpb24gfHwgXCJ2ZXJ0aWNhbFwiO1xuICAgICAgY29uc3QgY3VycmVudFBvc2l0aW9uID1cbiAgICAgICAgb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IHRvdWNoLmNsaWVudFkgOiB0b3VjaC5jbGllbnRYO1xuICAgICAgY29uc3QgZGVsdGEgPSBsYXN0VG91Y2hQb3NpdGlvbiAtIGN1cnJlbnRQb3NpdGlvbjsgLy8gSW52ZXJ0ZWQgZm9yIG5hdHVyYWwgc2Nyb2xsaW5nXG4gICAgICBsYXN0VG91Y2hQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbjtcblxuICAgICAgLy8gVXNlIHNjcm9sbGluZyBmZWF0dXJlJ3MgQVBJICgxOjEgdG91Y2gtdG8tc2Nyb2xsIGZvciBuYXR1cmFsIGZlZWwpXG4gICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeShkZWx0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoRW5kID0gKCkgPT4ge1xuICAgICAgaWYgKCFpc1RvdWNoaW5nKSByZXR1cm47XG4gICAgICBpc1RvdWNoaW5nID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHRvdWNoRW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0b3VjaER1cmF0aW9uID0gdG91Y2hFbmRUaW1lIC0gdG91Y2hTdGFydFRpbWU7XG5cbiAgICAgIC8vIEdldCBjdXJyZW50IHZlbG9jaXR5IGZyb20gc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIGNvbnN0IHZlbG9jaXR5ID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFZlbG9jaXR5Py4oKSB8fCAwO1xuXG4gICAgICAvLyBPbmx5IHN0YXJ0IG1vbWVudHVtIGlmIHRoZSB0b3VjaCB3YXMgcXVpY2sgZW5vdWdoIGFuZCB3ZSBoYXZlIHZlbG9jaXR5XG4gICAgICBpZiAoXG4gICAgICAgIHRvdWNoRHVyYXRpb24gPCBtaW5EdXJhdGlvbiAmJlxuICAgICAgICBNYXRoLmFicyh2ZWxvY2l0eSkgPiBtaW5WZWxvY2l0eVRocmVzaG9sZFxuICAgICAgKSB7XG4gICAgICAgIHN0YXJ0TW9tZW50dW0odmVsb2NpdHkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgY2xpY2sgdG8gc3RvcCBtb21lbnR1bSAod2l0aG91dCBwcmV2ZW50aW5nIHNlbGVjdGlvbilcbiAgICBjb25zdCBoYW5kbGVDbGljayA9IChfZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgc3RvcE1vbWVudHVtKCk7XG4gICAgfTtcblxuICAgIC8vIE1vdXNlIGV2ZW50IGhhbmRsZXJzIGZvciBkZXNrdG9wXG4gICAgY29uc3QgaGFuZGxlTW91c2VEb3duID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlzTW91c2VEcmFnZ2luZyA9IHRydWU7XG4gICAgICBjb25zdCBvcmllbnRhdGlvbiA9IHZpZXdwb3J0U3RhdGU/Lm9yaWVudGF0aW9uIHx8IFwidmVydGljYWxcIjtcbiAgICAgIGxhc3RNb3VzZVBvc2l0aW9uID0gb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IGUuY2xpZW50WSA6IGUuY2xpZW50WDtcbiAgICAgIHRvdWNoU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgLy8gQ2FuY2VsIGFueSBvbmdvaW5nIG1vbWVudHVtXG4gICAgICBzdG9wTW9tZW50dW0oKTtcblxuICAgICAgLy8gUHJldmVudCB0ZXh0IHNlbGVjdGlvblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc01vdXNlRHJhZ2dpbmcpIHJldHVybjtcblxuICAgICAgY29uc3Qgb3JpZW50YXRpb24gPSB2aWV3cG9ydFN0YXRlPy5vcmllbnRhdGlvbiB8fCBcInZlcnRpY2FsXCI7XG4gICAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPVxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZS5jbGllbnRZIDogZS5jbGllbnRYO1xuICAgICAgY29uc3QgZGVsdGEgPSBsYXN0TW91c2VQb3NpdGlvbiAtIGN1cnJlbnRQb3NpdGlvbjtcbiAgICAgIGxhc3RNb3VzZVBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uO1xuXG4gICAgICAvLyBVc2Ugc2Nyb2xsaW5nIGZlYXR1cmUncyBBUEkgKDE6MSBkcmFnLXRvLXNjcm9sbCBmb3IgbmF0dXJhbCBmZWVsKVxuICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeSkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkoZGVsdGEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZVVwID0gKCkgPT4ge1xuICAgICAgaWYgKCFpc01vdXNlRHJhZ2dpbmcpIHJldHVybjtcbiAgICAgIGlzTW91c2VEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBtb3VzZVVwVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBkcmFnRHVyYXRpb24gPSBtb3VzZVVwVGltZSAtIHRvdWNoU3RhcnRUaW1lO1xuXG4gICAgICAvLyBHZXQgY3VycmVudCB2ZWxvY2l0eSBmcm9tIHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICBjb25zdCB2ZWxvY2l0eSA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRWZWxvY2l0eT8uKCkgfHwgMDtcblxuICAgICAgLy8gU3RhcnQgbW9tZW50dW0gZm9yIHF1aWNrIGRyYWdzXG4gICAgICBpZiAoXG4gICAgICAgIGRyYWdEdXJhdGlvbiA8IG1pbkR1cmF0aW9uICYmXG4gICAgICAgIE1hdGguYWJzKHZlbG9jaXR5KSA+IG1pblZlbG9jaXR5VGhyZXNob2xkXG4gICAgICApIHtcbiAgICAgICAgc3RhcnRNb21lbnR1bSh2ZWxvY2l0eSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIE92ZXJyaWRlIGluaXRpYWxpemUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyc1xuICAgIGNvbnN0IG9yaWdpbmFsSW5pdCA9IGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWxJbml0KCk7XG4gICAgICAvLyBTa2lwIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgdmlld3BvcnRFbGVtZW50ID1cbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudCB8fFxuICAgICAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU/LnZpZXdwb3J0RWxlbWVudDtcblxuICAgICAgaWYgKHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAvLyBUb3VjaCBldmVudHNcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIGhhbmRsZVRvdWNoU3RhcnQsIHtcbiAgICAgICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlLCB7XG4gICAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIGhhbmRsZVRvdWNoRW5kLCB7XG4gICAgICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTW91c2UgZXZlbnRzIGZvciBkZXNrdG9wIGRyYWdnaW5nXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgICAgIC8vIEFkZCBjbGljayBsaXN0ZW5lciB0byBzdG9wIG1vbWVudHVtIG9uIGNsaWNrICh3aXRob3V0IGJsb2NraW5nIHNlbGVjdGlvbilcbiAgICAgICAgaWYgKHN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGljayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2UgZm9yIGNsZWFudXBcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVN0b3BPbkNsaWNrID0gc3RvcE9uQ2xpY2s7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIENsZWFuIHVwIG9uIGRlc3Ryb3lcbiAgICBpZiAoXCJkZXN0cm95XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAgIGNvbXBvbmVudC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9IChjb21wb25lbnQgYXMgYW55KS5fbW9tZW50dW1WaWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgaGFuZGxlVG91Y2hTdGFydCk7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIGhhbmRsZVRvdWNoRW5kKTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBoYW5kbGVNb3VzZURvd24pO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYW5jZWwgbW9tZW50dW0gYW5pbWF0aW9uXG4gICAgICAgIHN0b3BNb21lbnR1bSgpO1xuXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveSgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgbW9tZW50dW0gc3RhdGUgZm9yIG90aGVyIGZlYXR1cmVzXG4gICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLm1vbWVudHVtU3RhdGUgPSB7XG4gICAgICBzdG9wTW9tZW50dW0sXG4gICAgfTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9zY3JvbGxiYXIudHNcblxuLyoqXG4gKiBTY3JvbGxiYXIgRmVhdHVyZSAtIEN1c3RvbSBzY3JvbGxiYXIgaW1wbGVtZW50YXRpb25cbiAqIFByb3ZpZGVzIHZpc3VhbCBzY3JvbGwgaW5kaWNhdGlvbiBhbmQgZHJhZy10by1zY3JvbGwgZnVuY3Rpb25hbGl0eVxuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIHdyYXBEZXN0cm95LCBzdG9yZUZlYXR1cmVGdW5jdGlvbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBQUkVGSVgsIGFkZENsYXNzLCByZW1vdmVDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsYmFyQ29uZmlnIHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGF1dG9IaWRlPzogYm9vbGVhbjtcbiAgdGh1bWJNaW5IZWlnaHQ/OiBudW1iZXI7XG4gIHRodW1iQ29sb3I/OiBzdHJpbmc7XG4gIHRyYWNrQ29sb3I/OiBzdHJpbmc7XG4gIGJvcmRlclJhZGl1cz86IG51bWJlcjtcbiAgZmFkZVRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsYmFyQ29tcG9uZW50IHtcbiAgc2Nyb2xsYmFyOiB7XG4gICAgc2hvdzogKCkgPT4gdm9pZDtcbiAgICBoaWRlOiAoKSA9PiB2b2lkO1xuICAgIHVwZGF0ZUJvdW5kczogKHRvdGFsVmlydHVhbFNpemU6IG51bWJlciwgY29udGFpbmVyU2l6ZTogbnVtYmVyKSA9PiB2b2lkO1xuICAgIHVwZGF0ZVBvc2l0aW9uOiAoc2Nyb2xsUG9zaXRpb246IG51bWJlcikgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIHNjcm9sbGJhciBmdW5jdGlvbmFsaXR5IHRvIHZpZXdwb3J0IGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNjcm9sbGJhcihjb25maWc6IFNjcm9sbGJhckNvbmZpZyA9IHt9KSB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFRcbiAgKTogVCAmIFNjcm9sbGJhckNvbXBvbmVudCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgICBhdXRvSGlkZSA9IHRydWUsXG4gICAgICB0aHVtYk1pbkhlaWdodCA9IDI1LFxuICAgICAgYm9yZGVyUmFkaXVzID0gNCxcbiAgICAgIGZhZGVUaW1lb3V0ID0gMTAwMCxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gUmV0dXJuIG5vLW9wIGlmIGRpc2FibGVkXG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb21wb25lbnQsXG4gICAgICAgIHNjcm9sbGJhcjoge1xuICAgICAgICAgIHNob3c6ICgpID0+IHt9LFxuICAgICAgICAgIGhpZGU6ICgpID0+IHt9LFxuICAgICAgICAgIHVwZGF0ZUJvdW5kczogKCkgPT4ge30sXG4gICAgICAgICAgdXBkYXRlUG9zaXRpb246ICgpID0+IHt9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCB2aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHNjcm9sbGJhclRyYWNrOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBzY3JvbGxiYXJUaHVtYjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgbGV0IGRyYWdTdGFydFkgPSAwO1xuICAgIGxldCBkcmFnU3RhcnRTY3JvbGxQb3NpdGlvbiA9IDA7XG4gICAgbGV0IGhpZGVUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgIGxldCB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICBsZXQgY29udGFpbmVyU2l6ZSA9IDA7XG4gICAgbGV0IHRodW1iSGVpZ2h0ID0gMDtcbiAgICBsZXQgYW5pbWF0aW9uRnJhbWVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlzQ3Vyc29yTW9kZSA9IGZhbHNlO1xuICAgIGxldCBsb2FkZWRJdGVtc0NvdW50ID0gMDtcblxuICAgIC8vIENyZWF0ZSBzY3JvbGxiYXIgZWxlbWVudHNcbiAgICBjb25zdCBjcmVhdGVTY3JvbGxiYXJFbGVtZW50cyA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSByZXR1cm47XG5cbiAgICAgIHNjcm9sbGJhclRyYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGFkZENsYXNzKHNjcm9sbGJhclRyYWNrLCBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSKTtcbiAgICAgIHNjcm9sbGJhclRyYWNrLnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB6LWluZGV4OiAxMDtcbiAgICAgIGA7XG5cbiAgICAgIHNjcm9sbGJhclRodW1iID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRodW1iLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1RIVU1CXG4gICAgICApO1xuXG4gICAgICBzY3JvbGxiYXJUcmFjay5hcHBlbmRDaGlsZChzY3JvbGxiYXJUaHVtYik7XG4gICAgICB2aWV3cG9ydEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2Nyb2xsYmFyVHJhY2spO1xuICAgIH07XG5cbiAgICAvLyBTaG93L2hpZGUgZnVuY3Rpb25zXG4gICAgY29uc3Qgc2hvdyA9ICgpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgdG90YWxWaXJ0dWFsU2l6ZSA8PSBjb250YWluZXJTaXplKSByZXR1cm47XG5cbiAgICAgIGlmIChoaWRlVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQoaGlkZVRpbWVvdXQpO1xuICAgICAgICBoaWRlVGltZW91dCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBzY3JvbGxiYXJUcmFjayxcbiAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNDUk9MTEJBUi5DTEFTU0VTLlNDUk9MTEJBUl9WSVNJQkxFXG4gICAgICApO1xuXG4gICAgICBpZiAoYXV0b0hpZGUgJiYgIWlzRHJhZ2dpbmcpIHtcbiAgICAgICAgaGlkZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGhpZGUsIGZhZGVUaW1lb3V0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGlkZSA9ICgpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgaXNEcmFnZ2luZykgcmV0dXJuO1xuICAgICAgcmVtb3ZlQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1ZJU0lCTEVcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBzY3JvbGxiYXIgYm91bmRzXG4gICAgY29uc3QgdXBkYXRlQm91bmRzID0gKG5ld1RvdGFsU2l6ZTogbnVtYmVyLCBuZXdDb250YWluZXJTaXplOiBudW1iZXIpID0+IHtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICBjb250YWluZXJTaXplID0gbmV3Q29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCAhc2Nyb2xsYmFyVGh1bWIpIHJldHVybjtcblxuICAgICAgY29uc3QgbmVlZHNTY3JvbGxiYXIgPSB0b3RhbFZpcnR1YWxTaXplID4gY29udGFpbmVyU2l6ZTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGJhcl0gdXBkYXRlQm91bmRzOiB0b3RhbFNpemU9JHt0b3RhbFZpcnR1YWxTaXplfSwgY29udGFpbmVyU2l6ZT0ke2NvbnRhaW5lclNpemV9LCBuZWVkc1Njcm9sbGJhcj0ke25lZWRzU2Nyb2xsYmFyfWBcbiAgICAgIC8vICk7XG4gICAgICBzY3JvbGxiYXJUcmFjay5zdHlsZS5kaXNwbGF5ID0gbmVlZHNTY3JvbGxiYXIgPyBcImJsb2NrXCIgOiBcIm5vbmVcIjtcblxuICAgICAgaWYgKG5lZWRzU2Nyb2xsYmFyKSB7XG4gICAgICAgIGxldCBzY3JvbGxSYXRpbzogbnVtYmVyO1xuXG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUgJiYgbG9hZGVkSXRlbXNDb3VudCA+IDApIHtcbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIG1vZGUsIHRodW1iIHNpemUgcmVwcmVzZW50cyBsb2FkZWQgY29udGVudCB2cyBlc3RpbWF0ZWQgdG90YWxcbiAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBrbm93IHRvdGFsLCB1c2UgbG9hZGVkIGl0ZW1zICogMiBhcyBlc3RpbWF0ZVxuICAgICAgICAgIGNvbnN0IGVzdGltYXRlZFRvdGFsID1cbiAgICAgICAgICAgIHRvdGFsVmlydHVhbFNpemUgPiAwID8gdG90YWxWaXJ0dWFsU2l6ZSA6IGxvYWRlZEl0ZW1zQ291bnQgKiAyO1xuICAgICAgICAgIHNjcm9sbFJhdGlvID1cbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUgL1xuICAgICAgICAgICAgTWF0aC5tYXgoZXN0aW1hdGVkVG90YWwsIGxvYWRlZEl0ZW1zQ291bnQgKyBjb250YWluZXJTaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBOb3JtYWwgY2FsY3VsYXRpb24gZm9yIG9mZnNldC9wYWdlIHN0cmF0ZWdpZXNcbiAgICAgICAgICBzY3JvbGxSYXRpbyA9IGNvbnRhaW5lclNpemUgLyB0b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgdGh1bWJIZWlnaHQgPSBNYXRoLm1heCh0aHVtYk1pbkhlaWdodCwgc2Nyb2xsUmF0aW8gKiBjb250YWluZXJTaXplKTtcbiAgICAgICAgc2Nyb2xsYmFyVGh1bWIuc3R5bGUuaGVpZ2h0ID0gYCR7dGh1bWJIZWlnaHR9cHhgO1xuICAgICAgICB1cGRhdGVQb3NpdGlvbihjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSB0aHVtYiBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZVBvc2l0aW9uID0gKHNjcm9sbFBvczogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXNjcm9sbGJhclRodW1iIHx8ICFzY3JvbGxiYXJUcmFjaykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzY3JvbGxhYmxlRGlzdGFuY2UgPSB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgIGlmIChzY3JvbGxhYmxlRGlzdGFuY2UgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IE1hdGgubWluKFxuICAgICAgICAxLFxuICAgICAgICBNYXRoLm1heCgwLCBzY3JvbGxQb3MgLyBzY3JvbGxhYmxlRGlzdGFuY2UpXG4gICAgICApO1xuICAgICAgY29uc3QgbWF4VGh1bWJQb3NpdGlvbiA9XG4gICAgICAgIHNjcm9sbGJhclRyYWNrLmNsaWVudEhlaWdodCAtIHNjcm9sbGJhclRodW1iLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb24gPSBzY3JvbGxSYXRpbyAqIG1heFRodW1iUG9zaXRpb247XG5cbiAgICAgIHNjcm9sbGJhclRodW1iLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGh1bWJQb3NpdGlvbn1weClgO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdHJhY2sgY2xpY2tcbiAgICBjb25zdCBoYW5kbGVUcmFja0NsaWNrID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgIXNjcm9sbGJhclRodW1iIHx8IGUudGFyZ2V0ID09PSBzY3JvbGxiYXJUaHVtYilcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0cmFja1JlY3QgPSBzY3JvbGxiYXJUcmFjay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGNsaWNrWSA9IGUuY2xpZW50WSAtIHRyYWNrUmVjdC50b3A7XG4gICAgICBjb25zdCB0aHVtYkNlbnRlclkgPSBjbGlja1kgLSB0aHVtYkhlaWdodCAvIDI7XG4gICAgICBjb25zdCBtYXhUaHVtYlBvc2l0aW9uID0gY29udGFpbmVyU2l6ZSAtIHRodW1iSGVpZ2h0O1xuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICBNYXRoLm1pbih0aHVtYkNlbnRlclksIG1heFRodW1iUG9zaXRpb24pXG4gICAgICApO1xuICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSB0aHVtYlBvc2l0aW9uIC8gbWF4VGh1bWJQb3NpdGlvbjtcbiAgICAgIGNvbnN0IHRhcmdldFNjcm9sbFBvc2l0aW9uID1cbiAgICAgICAgc2Nyb2xsUmF0aW8gKiAodG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuXG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvUG9zaXRpb24odGFyZ2V0U2Nyb2xsUG9zaXRpb24pO1xuICAgIH07XG5cbiAgICAvLyBNb3VzZSBldmVudCBoYW5kbGVyc1xuICAgIGNvbnN0IGhhbmRsZVRodW1iTW91c2VEb3duID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgZHJhZ1N0YXJ0WSA9IGUuY2xpZW50WTtcbiAgICAgIGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRTY3JvbGxQb3NpdGlvbigpIHx8IDA7XG5cbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICBhZGRDbGFzcyhcbiAgICAgICAgICBzY3JvbGxiYXJUcmFjayxcbiAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX0RSQUdHSU5HXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgZHJhZyBzdGFydCBldmVudCB0byBub3RpZnkgdmlld3BvcnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpkcmFnLXN0YXJ0XCIsIHtcbiAgICAgICAgc291cmNlOiBcInNjcm9sbGJhclwiLFxuICAgICAgICBzdGFydFBvc2l0aW9uOiBkcmFnU3RhcnRTY3JvbGxQb3NpdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VNb3ZlID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghaXNEcmFnZ2luZyB8fCAhc2Nyb2xsYmFyVHJhY2sgfHwgIXNjcm9sbGJhclRodW1iKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGRlbHRhWSA9IGUuY2xpZW50WSAtIGRyYWdTdGFydFk7XG4gICAgICBjb25zdCB0cmFja0hlaWdodCA9IHNjcm9sbGJhclRyYWNrLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHRodW1iSGVpZ2h0ID0gc2Nyb2xsYmFyVGh1bWIuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgbWF4VGh1bWJUcmF2ZWwgPSB0cmFja0hlaWdodCAtIHRodW1iSGVpZ2h0O1xuXG4gICAgICBpZiAobWF4VGh1bWJUcmF2ZWwgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBkZWx0YVJhdGlvID0gZGVsdGFZIC8gbWF4VGh1bWJUcmF2ZWw7XG4gICAgICBjb25zdCBkcmFnU3RhcnRTY3JvbGxSYXRpbyA9XG4gICAgICAgIGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uIC8gKHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGNvbnN0IG5ld1Njcm9sbFJhdGlvID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIE1hdGgubWluKDEsIGRyYWdTdGFydFNjcm9sbFJhdGlvICsgZGVsdGFSYXRpbylcbiAgICAgICk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aHVtYiBwb3NpdGlvbiBpbW1lZGlhdGVseVxuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IG5ld1Njcm9sbFJhdGlvICogbWF4VGh1bWJUcmF2ZWw7XG4gICAgICBzY3JvbGxiYXJUaHVtYi5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3RodW1iUG9zaXRpb259cHgpYDtcblxuICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBzY3JvbGwgcG9zaXRpb25cbiAgICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gbmV3U2Nyb2xsUmF0aW8gKiAodG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgbGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uID0gbmV3UG9zaXRpb247XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGJhcl0gTW91c2UgbW92ZTogbmV3UG9zPSR7bmV3UG9zaXRpb24udG9GaXhlZChcbiAgICAgIC8vICAgICAwXG4gICAgICAvLyAgICl9LCBhbmltYXRpb25GcmFtZUlkPSR7YW5pbWF0aW9uRnJhbWVJZH1gXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBUaHJvdHRsZSB2aWV3cG9ydCB1cGRhdGVzXG4gICAgICBpZiAoYW5pbWF0aW9uRnJhbWVJZCA9PT0gbnVsbCAmJiBjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW1Njcm9sbGJhcl0gUkFGIGNhbGxiYWNrOiBzY3JvbGxpbmcgdG8gJHtsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb259YFxuICAgICAgICAgIC8vICk7XG4gICAgICAgICAgaWYgKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbiAhPT0gbnVsbCAmJiBjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VVcCA9ICgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1Njcm9sbGJhcl0gTW91c2UgdXAgLSBlbmRpbmcgZHJhZ1wiKTtcbiAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgICAgaWYgKGFuaW1hdGlvbkZyYW1lSWQgIT09IG51bGwpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoYW5pbWF0aW9uRnJhbWVJZCk7XG4gICAgICAgIGFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAobGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uICE9PSBudWxsICYmIGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbihsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24pO1xuICAgICAgICBsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24gPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Nyb2xsYmFyVHJhY2spIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgc2Nyb2xsYmFyVHJhY2ssXG4gICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNDUk9MTEJBUi5DTEFTU0VTLlNDUk9MTEJBUl9EUkFHR0lOR1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IGRyYWcgZW5kIGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6ZHJhZy1lbmRcIiwge1xuICAgICAgICBzb3VyY2U6IFwic2Nyb2xsYmFyXCIsXG4gICAgICAgIGVuZFBvc2l0aW9uOiBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCxcbiAgICAgIH0pO1xuXG4gICAgICBoaWRlKCk7XG5cbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIGZ1bmN0aW9uXG4gICAgY29uc3QgaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAgIGlmIChpc0luaXRpYWxpemVkKSByZXR1cm47XG5cbiAgICAgIHZpZXdwb3J0RWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydGBcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltTY3JvbGxiYXJdIE5vIHZpZXdwb3J0IGVsZW1lbnQgZm91bmRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBgLiR7UFJFRklYfS0ke1ZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJ9YFxuICAgICAgICApXG4gICAgICApXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY3JlYXRlU2Nyb2xsYmFyRWxlbWVudHMoKTtcbiAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2Nyb2xsYmFyVHJhY2sgJiYgdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIHNjcm9sbGJhclRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVUcmFja0NsaWNrKTtcblxuICAgICAgICBpZiAoc2Nyb2xsYmFyVGh1bWIpIHtcbiAgICAgICAgICBzY3JvbGxiYXJUaHVtYi5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZVRodW1iTW91c2VEb3duKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCBzaG93LCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIFwibW91c2VsZWF2ZVwiLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNEcmFnZ2luZykgaGlkZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBwYXNzaXZlOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGN1cnJlbnQgdmlld3BvcnQgc3RhdGVcbiAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRWaWV3cG9ydEluZm8oKTtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IGluZm8udG90YWxWaXJ0dWFsU2l6ZTtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IGluZm8uY29udGFpbmVyU2l6ZTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBjdXJzb3IgbW9kZVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb247XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0Q29uZmlnID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbmZpZztcbiAgICAgICAgaXNDdXJzb3JNb2RlID0gdmlld3BvcnRDb25maWc/LnBhZ2luYXRpb24/LnN0cmF0ZWd5ID09PSBcImN1cnNvclwiO1xuXG4gICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgdXBkYXRlUG9zaXRpb24oY29tcG9uZW50LnZpZXdwb3J0LmdldFNjcm9sbFBvc2l0aW9uKCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFpc0RyYWdnaW5nKSB7XG4gICAgICAgICAgdXBkYXRlUG9zaXRpb24oZGF0YS5wb3NpdGlvbik7XG4gICAgICAgICAgc2hvdygpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp2aXJ0dWFsLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBkYXRhLnRvdGFsVmlydHVhbFNpemU7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyhkYXRhLnRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnRhaW5lclNpemUgPSBkYXRhLmNvbnRhaW5lclNpemU7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBkYXRhLmNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbXMgbG9hZGVkIHRvIHVwZGF0ZSBzY3JvbGxiYXIgaW4gY3Vyc29yIG1vZGVcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6aXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUpIHtcbiAgICAgICAgICBsb2FkZWRJdGVtc0NvdW50ID0gZGF0YS5sb2FkZWRDb3VudCB8fCAwO1xuICAgICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgdG90YWwgaXRlbXMgY2hhbmdlcyAoaW1wb3J0YW50IGZvciBjdXJzb3IgbW9kZSlcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUgJiYgZGF0YS50b3RhbCkge1xuICAgICAgICAgIC8vIEluIGN1cnNvciBtb2RlLCB0aGUgdG90YWwgaXMgZHluYW1pY1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtTY3JvbGxiYXJdIEN1cnNvciBtb2RlOiB1cGRhdGluZyBib3VuZHMgZm9yIG5ldyB0b3RhbCAke2RhdGEudG90YWx9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgaW5pdGlhbGl6ZSBmdW5jdGlvblxuICAgIHN0b3JlRmVhdHVyZUZ1bmN0aW9uKGNvbXBvbmVudCwgXCJfc2Nyb2xsYmFySW5pdGlhbGl6ZVwiLCBpbml0aWFsaXplKTtcblxuICAgIC8vIEhvb2sgaW50byB2aWV3cG9ydCBpbml0aWFsaXphdGlvblxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgaW5pdGlhbGl6ZSk7XG5cbiAgICAvLyBDbGVhbnVwXG4gICAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICBzY3JvbGxiYXJUcmFjay5yZW1vdmUoKTtcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgICAgc2Nyb2xsYmFyVGh1bWIgPSBudWxsO1xuICAgICAgdmlld3BvcnRFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKGhpZGVUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7XG4gICAgICAgIGhpZGVUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgfTtcblxuICAgIHN0b3JlRmVhdHVyZUZ1bmN0aW9uKGNvbXBvbmVudCwgXCJfc2Nyb2xsYmFyRGVzdHJveVwiLCBkZXN0cm95KTtcbiAgICB3cmFwRGVzdHJveShjb21wb25lbnQsIGRlc3Ryb3kpO1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBzY3JvbGxiYXI6IHsgc2hvdywgaGlkZSwgdXBkYXRlQm91bmRzLCB1cGRhdGVQb3NpdGlvbiB9LFxuICAgIH07XG4gIH07XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2NvbGxlY3Rpb24udHNcblxuLyoqXG4gKiBDb2xsZWN0aW9uIEZlYXR1cmUgLSBEYXRhIG1hbmFnZW1lbnQgYW5kIHJhbmdlIGxvYWRpbmdcbiAqIEhhbmRsZXMgY29sbGVjdGlvbiBpbnRlZ3JhdGlvbiwgcGFnaW5hdGlvbiwgYW5kIGRhdGEgZmV0Y2hpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHdyYXBEZXN0cm95IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uQ29uZmlnIHtcbiAgY29sbGVjdGlvbj86IGFueTsgLy8gQ29sbGVjdGlvbiBhZGFwdGVyXG4gIHJhbmdlU2l6ZT86IG51bWJlcjsgLy8gRGVmYXVsdCByYW5nZSBzaXplIGZvciBsb2FkaW5nXG4gIHN0cmF0ZWd5PzogXCJvZmZzZXRcIiB8IFwicGFnZVwiIHwgXCJjdXJzb3JcIjsgLy8gTG9hZGluZyBzdHJhdGVneVxuICB0cmFuc2Zvcm0/OiAoaXRlbTogYW55KSA9PiBhbnk7IC8vIEl0ZW0gdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25cbiAgY2FuY2VsTG9hZFRocmVzaG9sZD86IG51bWJlcjsgLy8gVmVsb2NpdHkgdGhyZXNob2xkIGZvciBjYW5jZWxsaW5nIGxvYWRzXG4gIG1heENvbmN1cnJlbnRSZXF1ZXN0cz86IG51bWJlcjtcbiAgZW5hYmxlUmVxdWVzdFF1ZXVlPzogYm9vbGVhbjtcbiAgbWF4UXVldWVTaXplPzogbnVtYmVyO1xuICBsb2FkT25EcmFnRW5kPzogYm9vbGVhbjsgLy8gRW5hYmxlIGxvYWRpbmcgd2hlbiBkcmFnIGVuZHMgKHNhZmV0eSBtZWFzdXJlKVxuICBpbml0aWFsU2Nyb2xsSW5kZXg/OiBudW1iZXI7IC8vIEluaXRpYWwgc2Nyb2xsIHBvc2l0aW9uICgwLWJhc2VkIGluZGV4KVxuICBzZWxlY3RJZD86IHN0cmluZyB8IG51bWJlcjsgLy8gSUQgb2YgaXRlbSB0byBzZWxlY3QgYWZ0ZXIgaW5pdGlhbCBsb2FkIGNvbXBsZXRlc1xuICBhdXRvTG9hZD86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBsb2FkIGRhdGEgb24gaW5pdGlhbGl6YXRpb24gKGRlZmF1bHQ6IHRydWUpXG4gIGF1dG9TZWxlY3RGaXJzdD86IGJvb2xlYW47IC8vIEF1dG9tYXRpY2FsbHkgc2VsZWN0IGZpcnN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkIChkZWZhdWx0OiBmYWxzZSlcbiAgLyoqIE1heGltdW0gaXRlbXMgdG8ga2VlcCBpbiBtZW1vcnkgKGRlZmF1bHQ6IDEwMDApICovXG4gIG1heENhY2hlZEl0ZW1zPzogbnVtYmVyO1xuICAvKiogRXh0cmEgaXRlbXMgdG8ga2VlcCBhcm91bmQgdmlzaWJsZSByYW5nZSBkdXJpbmcgZXZpY3Rpb24gKGRlZmF1bHQ6IDE1MCkgKi9cbiAgZXZpY3Rpb25CdWZmZXI/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGlvbkNvbXBvbmVudCB7XG4gIGNvbGxlY3Rpb246IHtcbiAgICBsb2FkUmFuZ2U6IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcikgPT4gUHJvbWlzZTxhbnlbXT47XG4gICAgbG9hZE1pc3NpbmdSYW5nZXM6IChcbiAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIGdldExvYWRlZFJhbmdlczogKCkgPT4gU2V0PG51bWJlcj47XG4gICAgZ2V0UGVuZGluZ1JhbmdlczogKCkgPT4gU2V0PG51bWJlcj47XG4gICAgY2xlYXJGYWlsZWRSYW5nZXM6ICgpID0+IHZvaWQ7XG4gICAgcmV0cnlGYWlsZWRSYW5nZTogKHJhbmdlSWQ6IG51bWJlcikgPT4gUHJvbWlzZTxhbnlbXT47XG4gICAgc2V0VG90YWxJdGVtczogKHRvdGFsOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgZ2V0VG90YWxJdGVtczogKCkgPT4gbnVtYmVyO1xuICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gc3RyaW5nIHwgbnVsbDtcbiAgICBnZXRDdXJzb3JGb3JQYWdlOiAocGFnZTogbnVtYmVyKSA9PiBzdHJpbmcgfCBudWxsO1xuICAgIC8vIFJlc2V0IG1ldGhvZCBmb3IgcmVsb2FkIGZ1bmN0aW9uYWxpdHlcbiAgICByZXNldDogKCkgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIGNvbGxlY3Rpb24gZnVuY3Rpb25hbGl0eSB0byB2aWV3cG9ydCBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhDb2xsZWN0aW9uKGNvbmZpZzogQ29sbGVjdGlvbkNvbmZpZyA9IHt9KSB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiBDb2xsZWN0aW9uQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgcmFuZ2VTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLkxPQURJTkcuREVGQVVMVF9SQU5HRV9TSVpFLFxuICAgICAgc3RyYXRlZ3kgPSBcIm9mZnNldFwiLFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgY2FuY2VsTG9hZFRocmVzaG9sZCA9IFZJRVdQT1JUX0NPTlNUQU5UUy5MT0FESU5HLkNBTkNFTF9USFJFU0hPTEQsXG4gICAgICBtYXhDb25jdXJyZW50UmVxdWVzdHMgPSBWSUVXUE9SVF9DT05TVEFOVFMuTE9BRElOR1xuICAgICAgICAuTUFYX0NPTkNVUlJFTlRfUkVRVUVTVFMsXG4gICAgICBlbmFibGVSZXF1ZXN0UXVldWUgPSBWSUVXUE9SVF9DT05TVEFOVFMuUkVRVUVTVF9RVUVVRS5FTkFCTEVELFxuICAgICAgbWF4UXVldWVTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLlJFUVVFU1RfUVVFVUUuTUFYX1FVRVVFX1NJWkUsXG4gICAgICBsb2FkT25EcmFnRW5kID0gdHJ1ZSwgLy8gRGVmYXVsdCB0byB0cnVlIGFzIHNhZmV0eSBtZWFzdXJlXG4gICAgICBpbml0aWFsU2Nyb2xsSW5kZXggPSAwLCAvLyBTdGFydCBmcm9tIGJlZ2lubmluZyBieSBkZWZhdWx0XG4gICAgICBzZWxlY3RJZCwgLy8gSUQgb2YgaXRlbSB0byBzZWxlY3QgYWZ0ZXIgaW5pdGlhbCBsb2FkXG4gICAgICBhdXRvTG9hZCA9IHRydWUsIC8vIEF1dG8tbG9hZCBpbml0aWFsIGRhdGEgYnkgZGVmYXVsdFxuICAgICAgYXV0b1NlbGVjdEZpcnN0ID0gZmFsc2UsIC8vIEF1dG9tYXRpY2FsbHkgc2VsZWN0IGZpcnN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkXG4gICAgICBtYXhDYWNoZWRJdGVtcyA9IDEwMDAsIC8vIE1heGltdW0gaXRlbXMgdG8ga2VlcCBpbiBtZW1vcnlcbiAgICAgIGV2aWN0aW9uQnVmZmVyID0gMTUwLCAvLyBFeHRyYSBpdGVtcyB0byBrZWVwIGFyb3VuZCB2aXNpYmxlIHJhbmdlXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFRyYWNrIGlmIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgaW5pdGlhbCBsb2FkIGZvciBpbml0aWFsU2Nyb2xsSW5kZXhcbiAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGxpc3RlbmVyIGZyb20gbG9hZGluZyBwYWdlIDFcbiAgICBsZXQgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IGZhbHNlO1xuICAgIGNvbnN0IGhhc0luaXRpYWxTY3JvbGxJbmRleCA9IGluaXRpYWxTY3JvbGxJbmRleCA+IDA7XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydCBDb2xsZWN0aW9uXSBJbml0aWFsaXplZCB3aXRoIGNvbmZpZzpcIiwge1xuICAgIC8vICAgc3RyYXRlZ3ksXG4gICAgLy8gICByYW5nZVNpemUsXG4gICAgLy8gICBpbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgLy8gfSk7XG5cbiAgICAvLyBMb2FkaW5nIG1hbmFnZXIgc3RhdGVcbiAgICBpbnRlcmZhY2UgUXVldWVkUmVxdWVzdCB7XG4gICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9O1xuICAgICAgcHJpb3JpdHk6IFwiaGlnaFwiIHwgXCJub3JtYWxcIiB8IFwibG93XCI7XG4gICAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICAgIHJlc29sdmU6ICgpID0+IHZvaWQ7XG4gICAgICByZWplY3Q6IChlcnJvcjogYW55KSA9PiB2b2lkO1xuICAgICAgY2FsbGVyPzogc3RyaW5nO1xuICAgIH1cblxuICAgIC8vIFN0YXRlIHRyYWNraW5nXG4gICAgbGV0IGN1cnJlbnRWZWxvY2l0eSA9IDA7XG4gICAgbGV0IGFjdGl2ZUxvYWRDb3VudCA9IDA7XG4gICAgbGV0IGNvbXBsZXRlZExvYWRzID0gMDtcbiAgICBsZXQgZmFpbGVkTG9hZHMgPSAwO1xuICAgIGxldCBjYW5jZWxsZWRMb2FkcyA9IDA7XG4gICAgbGV0IGlzRHJhZ2dpbmcgPSBmYWxzZTsgLy8gVHJhY2sgZHJhZyBzdGF0ZVxuXG4gICAgLy8gQ2FjaGUgZXZpY3Rpb24gY29uZmlndXJhdGlvbiAoZnJvbSBjb25maWcpXG4gICAgY29uc3QgTUFYX0NBQ0hFRF9JVEVNUyA9IG1heENhY2hlZEl0ZW1zO1xuICAgIGNvbnN0IEVWSUNUSU9OX0JVRkZFUiA9IGV2aWN0aW9uQnVmZmVyO1xuXG4gICAgLy8gTWVtb3J5IGRpYWdub3N0aWNzXG4gICAgY29uc3QgbG9nTWVtb3J5U3RhdHMgPSAoY2FsbGVyOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1Db3VudCA9IGl0ZW1zLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gICAgICBjb25zdCBsb2FkZWRSYW5nZUNvdW50ID0gbG9hZGVkUmFuZ2VzLnNpemU7XG4gICAgICBjb25zdCBwZW5kaW5nUmFuZ2VDb3VudCA9IHBlbmRpbmdSYW5nZXMuc2l6ZTtcbiAgICAgIGNvbnN0IGFib3J0Q29udHJvbGxlckNvdW50ID0gYWJvcnRDb250cm9sbGVycy5zaXplO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFdmljdCBpdGVtcyBmYXIgZnJvbSB0aGUgY3VycmVudCB2aXNpYmxlIHJhbmdlIHRvIHByZXZlbnQgbWVtb3J5IGJsb2F0XG4gICAgICogS2VlcHMgaXRlbXMgd2l0aGluIEVWSUNUSU9OX0JVRkZFUiBvZiB0aGUgdmlzaWJsZSByYW5nZVxuICAgICAqL1xuICAgIGNvbnN0IGV2aWN0RGlzdGFudEl0ZW1zID0gKHZpc2libGVTdGFydDogbnVtYmVyLCB2aXNpYmxlRW5kOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1Db3VudCA9IGl0ZW1zLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG5cbiAgICAgIC8vIE9ubHkgZXZpY3QgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gTUFYX0NBQ0hFRF9JVEVNU1xuICAgICAgaWYgKGl0ZW1Db3VudCA8PSBNQVhfQ0FDSEVEX0lURU1TKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2VlcFN0YXJ0ID0gTWF0aC5tYXgoMCwgdmlzaWJsZVN0YXJ0IC0gRVZJQ1RJT05fQlVGRkVSKTtcbiAgICAgIGNvbnN0IGtlZXBFbmQgPSB2aXNpYmxlRW5kICsgRVZJQ1RJT05fQlVGRkVSO1xuXG4gICAgICBsZXQgZXZpY3RlZENvdW50ID0gMDtcbiAgICAgIGNvbnN0IHJhbmdlc1RvUmVtb3ZlID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgICAgIC8vIEZpbmQgaXRlbXMgdG8gZXZpY3QgYW5kIHRyYWNrIHdoaWNoIHJhbmdlcyBhcmUgYWZmZWN0ZWRcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGl0ZW1zW2ldICE9PSB1bmRlZmluZWQgJiYgKGkgPCBrZWVwU3RhcnQgfHwgaSA+IGtlZXBFbmQpKSB7XG4gICAgICAgICAgZGVsZXRlIGl0ZW1zW2ldO1xuICAgICAgICAgIGV2aWN0ZWRDb3VudCsrO1xuICAgICAgICAgIC8vIE1hcmsgdGhlIHJhbmdlIGNvbnRhaW5pbmcgdGhpcyBpdGVtIGZvciByZW1vdmFsIGZyb20gbG9hZGVkUmFuZ2VzXG4gICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSByYW5nZSB3aWxsIGJlIHJlbG9hZGVkIHdoZW4gc2Nyb2xsaW5nIGJhY2tcbiAgICAgICAgICBjb25zdCBhZmZlY3RlZFJhbmdlSWQgPSBNYXRoLmZsb29yKGkgLyByYW5nZVNpemUpO1xuICAgICAgICAgIHJhbmdlc1RvUmVtb3ZlLmFkZChhZmZlY3RlZFJhbmdlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBhbGwgcmFuZ2VzIHRoYXQgaGFkIGFueSBpdGVtcyBldmljdGVkXG4gICAgICAvLyBUaGlzIGlzIGNyaXRpY2FsOiBldmVuIGlmIG9ubHkgcGFydCBvZiBhIHJhbmdlIHdhcyBldmljdGVkLFxuICAgICAgLy8gd2UgbXVzdCByZW1vdmUgaXQgZnJvbSBsb2FkZWRSYW5nZXMgc28gaXQgZ2V0cyByZWxvYWRlZFxuICAgICAgLy8gQWxzbyByZW1vdmUgZnJvbSBwZW5kaW5nUmFuZ2VzIC0gaWYgYSBzbG93IHJlcXVlc3QgY29tcGxldGVzIGZvciBhbiBldmljdGVkIHJhbmdlLFxuICAgICAgLy8gd2UgZG9uJ3Qgd2FudCBpdCB0byBibG9jayBmdXR1cmUgbG9hZHMgd2hlbiB1c2VyIHNjcm9sbHMgYmFja1xuICAgICAgcmFuZ2VzVG9SZW1vdmUuZm9yRWFjaCgocmFuZ2VJZCkgPT4ge1xuICAgICAgICBsb2FkZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgLy8gQ2xlYW4gdXAgYWN0aXZlIHJlcXVlc3RzIHRyYWNraW5nXG4gICAgICAgIGFjdGl2ZVJlcXVlc3RzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgLy8gQWxzbyBhYm9ydCBhbnkgaW4tZmxpZ2h0IHJlcXVlc3QgZm9yIHRoaXMgcmFuZ2UgdG8gZnJlZSB1cCBuZXR3b3JrIHJlc291cmNlc1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gYWJvcnRDb250cm9sbGVycy5nZXQocmFuZ2VJZCk7XG4gICAgICAgIGlmIChjb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgIGFib3J0Q29udHJvbGxlcnMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGV2aWN0ZWRDb3VudCA+IDApIHtcbiAgICAgICAgLy8gRW1pdCBldmVudCBmb3IgcmVuZGVyaW5nIHRvIGFsc28gY2xlYW4gdXBcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aXRlbXMtZXZpY3RlZFwiLCB7XG4gICAgICAgICAga2VlcFN0YXJ0LFxuICAgICAgICAgIGtlZXBFbmQsXG4gICAgICAgICAgZXZpY3RlZENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgYWN0aXZlTG9hZFJhbmdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGxldCBsb2FkUmVxdWVzdFF1ZXVlOiBRdWV1ZWRSZXF1ZXN0W10gPSBbXTtcblxuICAgIC8vIEFib3J0Q29udHJvbGxlciBtYXAgZm9yIGNhbmNlbGxpbmcgaW4tZmxpZ2h0IHJlcXVlc3RzXG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVycyA9IG5ldyBNYXA8bnVtYmVyLCBBYm9ydENvbnRyb2xsZXI+KCk7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCBpdGVtczogYW55W10gPSBbXTtcbiAgICBsZXQgdG90YWxJdGVtcyA9IDA7XG4gICAgbGV0IGxvYWRlZFJhbmdlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGxldCBwZW5kaW5nUmFuZ2VzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgbGV0IGZhaWxlZFJhbmdlcyA9IG5ldyBNYXA8XG4gICAgICBudW1iZXIsXG4gICAgICB7XG4gICAgICAgIGF0dGVtcHRzOiBudW1iZXI7XG4gICAgICAgIGxhc3RFcnJvcjogRXJyb3I7XG4gICAgICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICAgICAgfVxuICAgID4oKTtcbiAgICBsZXQgYWN0aXZlUmVxdWVzdHMgPSBuZXcgTWFwPG51bWJlciwgUHJvbWlzZTxhbnlbXT4+KCk7XG5cbiAgICAvLyBDdXJzb3IgcGFnaW5hdGlvbiBzdGF0ZVxuICAgIGxldCBjdXJyZW50Q3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY3Vyc29yTWFwID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTsgLy8gTWFwIHBhZ2UgbnVtYmVyIHRvIGN1cnNvclxuICAgIGxldCBwYWdlVG9PZmZzZXRNYXAgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpOyAvLyBNYXAgcGFnZSB0byBhY3R1YWwgb2Zmc2V0XG4gICAgbGV0IGhpZ2hlc3RMb2FkZWRQYWdlID0gMDtcbiAgICBsZXQgZGlzY292ZXJlZFRvdGFsOiBudW1iZXIgfCBudWxsID0gbnVsbDsgLy8gVHJhY2sgZGlzY292ZXJlZCB0b3RhbCBmcm9tIEFQSVxuICAgIGxldCBoYXNSZWFjaGVkRW5kID0gZmFsc2U7IC8vIFRyYWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiBkYXRhXG5cbiAgICAvLyBTaGFyZSBpdGVtcyBhcnJheSB3aXRoIGNvbXBvbmVudFxuICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgLyoqXG4gICAgICogR2V0IGEgdW5pcXVlIElEIGZvciBhIHJhbmdlIGJhc2VkIG9uIG9mZnNldCBhbmQgdGhlIGJhc2UgcmFuZ2Ugc2l6ZVxuICAgICAqL1xuICAgIGNvbnN0IGdldFJhbmdlSWQgPSAob2Zmc2V0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgLy8gQWx3YXlzIHVzZSB0aGUgYmFzZSByYW5nZVNpemUgZm9yIGNvbnNpc3RlbnQgSURzXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgbWVyZ2VkIHJhbmdlcyBjYW4gYmUgdHJhY2tlZCBwcm9wZXJseVxuICAgICAgcmV0dXJuIE1hdGguZmxvb3Iob2Zmc2V0IC8gcmFuZ2VTaXplKTtcbiAgICB9O1xuXG4gICAgLy8gTG9hZGluZyBtYW5hZ2VyIGhlbHBlcnNcbiAgICBjb25zdCBnZXRSYW5nZUtleSA9IChyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KTogc3RyaW5nID0+IHtcbiAgICAgIHJldHVybiBgJHtyYW5nZS5zdGFydH0tJHtyYW5nZS5lbmR9YDtcbiAgICB9O1xuXG4gICAgY29uc3QgY2FuTG9hZCA9ICgpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiBjdXJyZW50VmVsb2NpdHkgPD0gY2FuY2VsTG9hZFRocmVzaG9sZDtcbiAgICB9O1xuXG4gICAgY29uc3QgcHJvY2Vzc1F1ZXVlID0gKCkgPT4ge1xuICAgICAgaWYgKCFlbmFibGVSZXF1ZXN0UXVldWUgfHwgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgLy8gU29ydCBxdWV1ZSBieSBwcmlvcml0eSBhbmQgdGltZXN0YW1wXG4gICAgICBsb2FkUmVxdWVzdFF1ZXVlLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgcHJpb3JpdHlPcmRlciA9IHsgaGlnaDogMCwgbm9ybWFsOiAxLCBsb3c6IDIgfTtcbiAgICAgICAgY29uc3QgcHJpb3JpdHlEaWZmID1cbiAgICAgICAgICBwcmlvcml0eU9yZGVyW2EucHJpb3JpdHldIC0gcHJpb3JpdHlPcmRlcltiLnByaW9yaXR5XTtcbiAgICAgICAgcmV0dXJuIHByaW9yaXR5RGlmZiAhPT0gMCA/IHByaW9yaXR5RGlmZiA6IGEudGltZXN0YW1wIC0gYi50aW1lc3RhbXA7XG4gICAgICB9KTtcblxuICAgICAgLy8gUHJvY2VzcyByZXF1ZXN0cyB1cCB0byBjYXBhY2l0eVxuICAgICAgd2hpbGUgKFxuICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGxvYWRSZXF1ZXN0UXVldWUuc2hpZnQoKTtcbiAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICBleGVjdXRlUXVldWVkTG9hZChyZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBleGVjdXRlUXVldWVkTG9hZCA9IChyZXF1ZXN0OiBRdWV1ZWRSZXF1ZXN0KSA9PiB7XG4gICAgICBhY3RpdmVMb2FkQ291bnQrKztcbiAgICAgIGFjdGl2ZUxvYWRSYW5nZXMuYWRkKGdldFJhbmdlS2V5KHJlcXVlc3QucmFuZ2UpKTtcblxuICAgICAgLy8gQ2FsbCB0aGUgYWN0dWFsIGxvYWRNaXNzaW5nUmFuZ2VzIGZ1bmN0aW9uXG4gICAgICBsb2FkTWlzc2luZ1Jhbmdlc0ludGVybmFsKHJlcXVlc3QucmFuZ2UsIHJlcXVlc3QuY2FsbGVyKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmVxdWVzdC5yZXNvbHZlKCk7XG4gICAgICAgICAgY29tcGxldGVkTG9hZHMrKztcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICByZXF1ZXN0LnJlamVjdChlcnJvcik7XG4gICAgICAgICAgZmFpbGVkTG9hZHMrKztcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgIGFjdGl2ZUxvYWRDb3VudC0tO1xuICAgICAgICAgIGFjdGl2ZUxvYWRSYW5nZXMuZGVsZXRlKGdldFJhbmdlS2V5KHJlcXVlc3QucmFuZ2UpKTtcbiAgICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSBpdGVtcyBpZiB0cmFuc2Zvcm0gZnVuY3Rpb24gcHJvdmlkZWRcbiAgICAgKi9cbiAgICBjb25zdCB0cmFuc2Zvcm1JdGVtcyA9IChyYXdJdGVtczogYW55W10pOiBhbnlbXSA9PiB7XG4gICAgICBpZiAoIXRyYW5zZm9ybSkgcmV0dXJuIHJhd0l0ZW1zO1xuICAgICAgcmV0dXJuIHJhd0l0ZW1zLm1hcCh0cmFuc2Zvcm0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgcmFuZ2Ugb2YgZGF0YVxuICAgICAqL1xuICAgIGNvbnN0IGxvYWRSYW5nZSA9IGFzeW5jIChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IFByb21pc2U8YW55W10+ID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIGxvYWRSYW5nZSBjYWxsZWQ6IG9mZnNldD0ke29mZnNldH0sIGxpbWl0PSR7bGltaXR9YCxcbiAgICAgIC8vICk7XG5cbiAgICAgIGlmICghY29sbGVjdGlvbikge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbQ29sbGVjdGlvbl0gTm8gY29sbGVjdGlvbiBhZGFwdGVyIGNvbmZpZ3VyZWRcIik7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmFuZ2VJZCA9IGdldFJhbmdlSWQob2Zmc2V0LCBsaW1pdCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIFJhbmdlIElEOiAke3JhbmdlSWR9YCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgbG9hZGVkXG4gICAgICBpZiAobG9hZGVkUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICByZXR1cm4gaXRlbXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsaW1pdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgcGVuZGluZ1xuICAgICAgaWYgKHBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUmVxdWVzdCA9IGFjdGl2ZVJlcXVlc3RzLmdldChyYW5nZUlkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nUmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybiBleGlzdGluZ1JlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWFyayBhcyBwZW5kaW5nXG4gICAgICBwZW5kaW5nUmFuZ2VzLmFkZChyYW5nZUlkKTtcblxuICAgICAgLy8gQ3JlYXRlIEFib3J0Q29udHJvbGxlciBmb3IgdGhpcyByZXF1ZXN0XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBhYm9ydENvbnRyb2xsZXJzLnNldChyYW5nZUlkLCBhYm9ydENvbnRyb2xsZXIpO1xuXG4gICAgICAvLyBDcmVhdGUgcmVxdWVzdCBwcm9taXNlXG4gICAgICBjb25zdCByZXF1ZXN0UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2FsbCBjb2xsZWN0aW9uIGFkYXB0ZXIgd2l0aCBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzXG4gICAgICAgICAgY29uc3QgcGFnZSA9IE1hdGguZmxvb3Iob2Zmc2V0IC8gbGltaXQpICsgMTtcbiAgICAgICAgICBsZXQgcGFyYW1zOiBhbnk7XG5cbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgICAgIC8vIEZvciBjdXJzb3IgcGFnaW5hdGlvblxuICAgICAgICAgICAgaWYgKHBhZ2UgPT09IDEpIHtcbiAgICAgICAgICAgICAgLy8gRmlyc3QgcGFnZSAtIG5vIGN1cnNvclxuICAgICAgICAgICAgICBwYXJhbXMgPSB7IGxpbWl0IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGN1cnNvciBmb3IgcHJldmlvdXMgcGFnZVxuICAgICAgICAgICAgICBjb25zdCBwcmV2UGFnZUN1cnNvciA9IGN1cnNvck1hcC5nZXQocGFnZSAtIDEpO1xuICAgICAgICAgICAgICBpZiAoIXByZXZQYWdlQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FuJ3QgbG9hZCB0aGlzIHBhZ2Ugd2l0aG91dCBwcmV2aW91cyBjdXJzb3JcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBgW0NvbGxlY3Rpb25dIENhbm5vdCBsb2FkIHBhZ2UgJHtwYWdlfSB3aXRob3V0IGN1cnNvciBmb3IgcGFnZSAke1xuICAgICAgICAgICAgICAgICAgICBwYWdlIC0gMVxuICAgICAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgU2VxdWVudGlhbCBsb2FkaW5nIHJlcXVpcmVkIC0gbWlzc2luZyBjdXJzb3IgZm9yIHBhZ2UgJHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZSAtIDFcbiAgICAgICAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcGFyYW1zID0geyBjdXJzb3I6IHByZXZQYWdlQ3Vyc29yLCBsaW1pdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RyYXRlZ3kgPT09IFwicGFnZVwiKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSB7IHBhZ2UsIGxpbWl0IH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG9mZnNldCBzdHJhdGVneVxuICAgICAgICAgICAgcGFyYW1zID0geyBvZmZzZXQsIGxpbWl0IH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW1ZpZXdwb3J0IENvbGxlY3Rpb25dIExvYWRpbmcgcmFuZ2Ugb2Zmc2V0PSR7b2Zmc2V0fSwgbGltaXQ9JHtsaW1pdH0sIHN0cmF0ZWd5PSR7c3RyYXRlZ3l9LCBjYWxjdWxhdGVkIHBhZ2U9JHtwYWdlfSwgcGFyYW1zOmAsXG4gICAgICAgICAgLy8gICBKU09OLnN0cmluZ2lmeShwYXJhbXMpXG4gICAgICAgICAgLy8gKTtcblxuICAgICAgICAgIC8vIFBhc3MgYWJvcnQgc2lnbmFsIHRvIHRoZSBhZGFwdGVyIGlmIGl0IHN1cHBvcnRzIGl0XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb2xsZWN0aW9uLnJlYWQoe1xuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRXh0cmFjdCBpdGVtcyBhbmQgdG90YWxcbiAgICAgICAgICBjb25zdCByYXdJdGVtcyA9IHJlc3BvbnNlLmRhdGEgfHwgcmVzcG9uc2UuaXRlbXMgfHwgcmVzcG9uc2U7XG4gICAgICAgICAgY29uc3QgbWV0YSA9IHJlc3BvbnNlLm1ldGEgfHwge307XG5cbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb24sIHRyYWNrIHRoZSBjdXJzb3IgKGNoZWNrIGJvdGggY3Vyc29yIGFuZCBuZXh0Q3Vyc29yKVxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQ3Vyc29yID0gbWV0YS5jdXJzb3IgfHwgbWV0YS5uZXh0Q3Vyc29yO1xuICAgICAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIiAmJiByZXNwb25zZUN1cnNvcikge1xuICAgICAgICAgICAgY3VycmVudEN1cnNvciA9IHJlc3BvbnNlQ3Vyc29yO1xuICAgICAgICAgICAgY3Vyc29yTWFwLnNldChwYWdlLCByZXNwb25zZUN1cnNvcik7XG4gICAgICAgICAgICBwYWdlVG9PZmZzZXRNYXAuc2V0KHBhZ2UsIG9mZnNldCk7XG4gICAgICAgICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IE1hdGgubWF4KGhpZ2hlc3RMb2FkZWRQYWdlLCBwYWdlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFN0b3JlZCBjdXJzb3IgZm9yIHBhZ2UgJHtwYWdlfTogJHtyZXNwb25zZUN1cnNvcn1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmRcbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIgJiYgbWV0YS5oYXNOZXh0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaGFzUmVhY2hlZEVuZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBSZWFjaGVkIGVuZCBvZiBjdXJzb3IgcGFnaW5hdGlvbiBhdCBwYWdlICR7cGFnZX1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgZGlzY292ZXJlZCB0b3RhbCBpZiBwcm92aWRlZFxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBtZXRhLnRvdGFsOiAke21ldGEudG90YWx9LCBkaXNjb3ZlcmVkVG90YWwgYmVmb3JlOiAke2Rpc2NvdmVyZWRUb3RhbH1gLFxuICAgICAgICAgIC8vICk7XG4gICAgICAgICAgaWYgKG1ldGEudG90YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGlzY292ZXJlZFRvdGFsID0gbWV0YS50b3RhbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBkaXNjb3ZlcmVkVG90YWwgYWZ0ZXI6ICR7ZGlzY292ZXJlZFRvdGFsfWApO1xuXG4gICAgICAgICAgLy8gVHJhbnNmb3JtIGl0ZW1zXG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRJdGVtcyA9IHRyYW5zZm9ybUl0ZW1zKHJhd0l0ZW1zKTtcblxuICAgICAgICAgIC8vIEFkZCBpdGVtcyB0byBhcnJheVxuICAgICAgICAgIHRyYW5zZm9ybWVkSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW1zW29mZnNldCArIGluZGV4XSA9IGl0ZW07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIHN0cmF0ZWd5LCBjYWxjdWxhdGUgZHluYW1pYyB0b3RhbCBiYXNlZCBvbiBsb2FkZWQgZGF0YVxuICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBkaXNjb3ZlcmVkVG90YWwgPSAwIGNvcnJlY3RseVxuICAgICAgICAgIGxldCBuZXdUb3RhbCA9IGRpc2NvdmVyZWRUb3RhbCA/PyB0b3RhbEl0ZW1zO1xuXG4gICAgICAgICAgLy8gQ1JJVElDQUwgRklYOiBXaGVuIEFQSSByZXR1cm5zIDAgaXRlbXMgb24gcGFnZSAxIChvZmZzZXQgMCksIHRoZSBsaXN0IGlzIGVtcHR5LlxuICAgICAgICAgIC8vIFdlIG11c3Qgc2V0IHRvdGFsSXRlbXMgdG8gMCByZWdhcmRsZXNzIG9mIG1ldGEudG90YWwgYmVpbmcgdW5kZWZpbmVkLlxuICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBjb3VudD1mYWxzZSBpcyBzZW50IGJ1dCB0aGUgbGlzdCBpcyBhY3R1YWxseSBlbXB0eS5cbiAgICAgICAgICBpZiAob2Zmc2V0ID09PSAwICYmIHRyYW5zZm9ybWVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBFbXB0eSByZXN1bHQgb24gcGFnZSAxIC0gZm9yY2luZyB0b3RhbEl0ZW1zIHRvIDBgLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIG5ld1RvdGFsID0gMDtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRUb3RhbCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBuZXdUb3RhbCBpbml0aWFsOiAke25ld1RvdGFsfSwgdG90YWxJdGVtczogJHt0b3RhbEl0ZW1zfSwgc3RyYXRlZ3k6ICR7c3RyYXRlZ3l9YCxcbiAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdG90YWwgYmFzZWQgb24gbG9hZGVkIGl0ZW1zICsgbWFyZ2luXG4gICAgICAgICAgICBjb25zdCBsb2FkZWRJdGVtc0NvdW50ID0gaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgICAoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBtYXJnaW5JdGVtcyA9IGhhc1JlYWNoZWRFbmRcbiAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgIDogcmFuZ2VTaXplICpcbiAgICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUEFHSU5BVElPTi5DVVJTT1JfU0NST0xMX01BUkdJTl9NVUxUSVBMSUVSO1xuICAgICAgICAgICAgY29uc3QgbWluVmlydHVhbEl0ZW1zID1cbiAgICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBBR0lOQVRJT04uQ1VSU09SX01JTl9WSVJUVUFMX1NJWkVfTVVMVElQTElFUjtcblxuICAgICAgICAgICAgLy8gRHluYW1pYyB0b3RhbDogbG9hZGVkIGl0ZW1zICsgbWFyZ2luICh1bmxlc3Mgd2UndmUgcmVhY2hlZCB0aGUgZW5kKVxuICAgICAgICAgICAgbmV3VG90YWwgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgbG9hZGVkSXRlbXNDb3VudCArIG1hcmdpbkl0ZW1zLFxuICAgICAgICAgICAgICBtaW5WaXJ0dWFsSXRlbXMsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDdXJzb3IgbW9kZSB2aXJ0dWFsIHNpemU6IGxvYWRlZD0ke2xvYWRlZEl0ZW1zQ291bnR9LCBtYXJnaW49JHttYXJnaW5JdGVtc30sIHRvdGFsPSR7bmV3VG90YWx9LCBoYXNSZWFjaGVkRW5kPSR7aGFzUmVhY2hlZEVuZH1gLFxuICAgICAgICAgICAgLy8gKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRvdGFsIGlmIGl0IGhhcyBncm93blxuICAgICAgICAgICAgaWYgKG5ld1RvdGFsID4gdG90YWxJdGVtcykge1xuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFVwZGF0aW5nIGN1cnNvciB2aXJ0dWFsIHNpemUgZnJvbSAke3RvdGFsSXRlbXN9IHRvICR7bmV3VG90YWx9YCxcbiAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgdG90YWxJdGVtcyA9IG5ld1RvdGFsO1xuICAgICAgICAgICAgICBzZXRUb3RhbEl0ZW1zKG5ld1RvdGFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9yIG90aGVyIHN0cmF0ZWdpZXMsIHVzZSBkaXNjb3ZlcmVkIHRvdGFsIG9yIGN1cnJlbnQgdG90YWxcbiAgICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBkaXNjb3ZlcmVkVG90YWwgPSAwIGNvcnJlY3RseVxuICAgICAgICAgICAgbmV3VG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgPz8gdG90YWxJdGVtcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgc3RhdGVcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQmVmb3JlIHN0YXRlIHVwZGF0ZTogbmV3VG90YWw9JHtuZXdUb3RhbH0sIHRvdGFsSXRlbXM9JHt0b3RhbEl0ZW1zfSwgd2lsbCB1cGRhdGU6ICR7bmV3VG90YWwgIT09IHRvdGFsSXRlbXN9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGlmIChuZXdUb3RhbCAhPT0gdG90YWxJdGVtcykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBDYWxsaW5nIHNldFRvdGFsSXRlbXMoJHtuZXdUb3RhbH0pYCk7XG4gICAgICAgICAgICB0b3RhbEl0ZW1zID0gbmV3VG90YWw7XG4gICAgICAgICAgICBzZXRUb3RhbEl0ZW1zKG5ld1RvdGFsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50IGl0ZW1zIHJlZmVyZW5jZVxuICAgICAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgICAgICAgLy8gRW1pdCBpdGVtcyBjaGFuZ2VkIGV2ZW50XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0Oml0ZW1zLWNoYW5nZWRcIiwge1xuICAgICAgICAgICAgdG90YWxJdGVtczogbmV3VG90YWwsXG4gICAgICAgICAgICBsb2FkZWRDb3VudDogaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQpLmxlbmd0aCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZVxuICAgICAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBuZXdUb3RhbCA9IDAgY29ycmVjdGx5XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPSBuZXdUb3RhbCA/PyBpdGVtcy5sZW5ndGg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVmVyaWZ5IGl0ZW1zIGFyZSBhY3R1YWxseSBzdGlsbCBpbiB0aGUgYXJyYXkgYmVmb3JlIG1hcmtpbmcgYXMgbG9hZGVkXG4gICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGV2aWN0aW9uIGhhcHBlbnMgZHVyaW5nIGFzeW5jIGxvYWQ6XG4gICAgICAgICAgLy8gMS4gTG9hZCBzdGFydHMgZm9yIHJhbmdlIEFcbiAgICAgICAgICAvLyAyLiBVc2VyIHNjcm9sbHMgdG8gcmFuZ2UgQlxuICAgICAgICAgIC8vIDMuIEV2aWN0aW9uIHJlbW92ZXMgaXRlbXMgZnJvbSByYW5nZSBBIGFuZCByZW1vdmVzIGZyb20gbG9hZGVkUmFuZ2VzXG4gICAgICAgICAgLy8gNC4gTG9hZCBmb3IgcmFuZ2UgQSBjb21wbGV0ZXMsIHdvdWxkIHJlLWFkZCB0byBsb2FkZWRSYW5nZXNcbiAgICAgICAgICAvLyA1LiBVc2VyIHNjcm9sbHMgYmFjayB0byBBLCBsb2FkZWRSYW5nZXMgc2F5cyBsb2FkZWQgYnV0IGl0ZW1zIGFyZSBnb25lXG4gICAgICAgICAgY29uc3QgaXRlbXNBY3R1YWxseVN0b3JlZCA9XG4gICAgICAgICAgICB0cmFuc2Zvcm1lZEl0ZW1zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIHRyYW5zZm9ybWVkSXRlbXMuZXZlcnkoXG4gICAgICAgICAgICAgIChfLCBpZHgpID0+IGl0ZW1zW29mZnNldCArIGlkeF0gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoaXRlbXNBY3R1YWxseVN0b3JlZCkge1xuICAgICAgICAgICAgLy8gTWFyayBhcyBsb2FkZWQgb25seSBpZiBpdGVtcyBhcmUgYWN0dWFsbHkgcHJlc2VudFxuICAgICAgICAgICAgbG9hZGVkUmFuZ2VzLmFkZChyYW5nZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQWx3YXlzIGNsZWFuIHVwIHBlbmRpbmcvZmFpbGVkIHN0YXRlXG4gICAgICAgICAgcGVuZGluZ1Jhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgZmFpbGVkUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcblxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBSYW5nZSAke3JhbmdlSWR9IGxvYWRlZCBzdWNjZXNzZnVsbHkgd2l0aCAke3RyYW5zZm9ybWVkSXRlbXMubGVuZ3RofSBpdGVtc2BcbiAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgLy8gTG9nIG1lbW9yeSBzdGF0cyBwZXJpb2RpY2FsbHkgKGV2ZXJ5IDUgbG9hZHMpXG4gICAgICAgICAgaWYgKGNvbXBsZXRlZExvYWRzICUgNSA9PT0gMCkge1xuICAgICAgICAgICAgbG9nTWVtb3J5U3RhdHMoYGxvYWQ6JHtjb21wbGV0ZWRMb2Fkc31gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFbWl0IGV2ZW50c1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwge1xuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBpdGVtczogdHJhbnNmb3JtZWRJdGVtcyxcbiAgICAgICAgICAgIHRvdGFsOiBuZXdUb3RhbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEVtaXQgY29sbGVjdGlvbiBsb2FkZWQgZXZlbnQgd2l0aCBtb3JlIGRldGFpbHNcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwge1xuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBpdGVtczogdHJhbnNmb3JtZWRJdGVtcyxcbiAgICAgICAgICAgIHRvdGFsOiBuZXdUb3RhbCxcbiAgICAgICAgICAgIHJhbmdlSWQsXG4gICAgICAgICAgICBpdGVtc0luTWVtb3J5OiBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCkubGVuZ3RoLFxuICAgICAgICAgICAgY3Vyc29yOiBzdHJhdGVneSA9PT0gXCJjdXJzb3JcIiA/IGN1cnJlbnRDdXJzb3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBUcmlnZ2VyIHZpZXdwb3J0IHVwZGF0ZVxuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8udXBkYXRlVmlld3BvcnQ/LigpO1xuXG4gICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkSXRlbXM7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIEFib3J0RXJyb3IgYW5kIFwiRmFpbGVkIHRvIGZldGNoXCIgKHdoaWNoIGNhbiBvY2N1ciBvbiBhYm9ydCkgZ3JhY2VmdWxseVxuICAgICAgICAgIGNvbnN0IGlzQWJvcnRFcnJvciA9XG4gICAgICAgICAgICAoZXJyb3IgYXMgRXJyb3IpLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiIHx8XG4gICAgICAgICAgICAoKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlID09PSBcIkZhaWxlZCB0byBmZXRjaFwiICYmXG4gICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCk7XG5cbiAgICAgICAgICBpZiAoaXNBYm9ydEVycm9yKSB7XG4gICAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgICAvLyBEb24ndCB0aHJvdywganVzdCByZXR1cm4gZW1wdHkgYXJyYXlcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBIYW5kbGUgb3RoZXIgZXJyb3JzXG4gICAgICAgICAgcGVuZGluZ1Jhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgZmFpbGVkTG9hZHMrKztcblxuICAgICAgICAgIGNvbnN0IGF0dGVtcHRzID0gKGZhaWxlZFJhbmdlcy5nZXQocmFuZ2VJZCk/LmF0dGVtcHRzIHx8IDApICsgMTtcbiAgICAgICAgICBmYWlsZWRSYW5nZXMuc2V0KHJhbmdlSWQsIHtcbiAgICAgICAgICAgIGF0dGVtcHRzLFxuICAgICAgICAgICAgbGFzdEVycm9yOiBlcnJvciBhcyBFcnJvcixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEVtaXQgZXJyb3IgZXZlbnRcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cmFuZ2UtZXJyb3JcIiwge1xuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIGF0dGVtcHRzLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgYWN0aXZlUmVxdWVzdHMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAgIGFib3J0Q29udHJvbGxlcnMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICBhY3RpdmVSZXF1ZXN0cy5zZXQocmFuZ2VJZCwgcmVxdWVzdFByb21pc2UpO1xuICAgICAgcmV0dXJuIHJlcXVlc3RQcm9taXNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIG1pc3NpbmcgcmFuZ2VzIGZyb20gY29sbGVjdGlvblxuICAgICAqL1xuICAgIGNvbnN0IGxvYWRNaXNzaW5nUmFuZ2VzSW50ZXJuYWwgPSBhc3luYyAoXG4gICAgICByYW5nZToge1xuICAgICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgICBlbmQ6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAoIWNvbGxlY3Rpb24pIHJldHVybjtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gbG9hZE1pc3NpbmdSYW5nZXNJbnRlcm5hbCAtIHJhbmdlOiAke3N0YXJ0fS0ke2VuZH0sIHN0cmF0ZWd5OiAke3N0cmF0ZWd5fWAsXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb24sIHdlIG5lZWQgdG8gbG9hZCBzZXF1ZW50aWFsbHlcbiAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIikge1xuICAgICAgICBjb25zdCBzdGFydFBhZ2UgPSBNYXRoLmZsb29yKHJhbmdlLnN0YXJ0IC8gcmFuZ2VTaXplKSArIDE7XG4gICAgICAgIGNvbnN0IGVuZFBhZ2UgPSBNYXRoLmZsb29yKHJhbmdlLmVuZCAvIHJhbmdlU2l6ZSkgKyAxO1xuXG4gICAgICAgIC8vIExpbWl0IGhvdyBtYW55IHBhZ2VzIHdlJ2xsIGxvYWQgYXQgb25jZVxuICAgICAgICBjb25zdCBtYXhQYWdlc1RvTG9hZCA9IDEwO1xuICAgICAgICBjb25zdCBjdXJyZW50SGlnaGVzdFBhZ2UgPSBoaWdoZXN0TG9hZGVkUGFnZSB8fCAwO1xuICAgICAgICBjb25zdCBsaW1pdGVkRW5kUGFnZSA9IE1hdGgubWluKFxuICAgICAgICAgIGVuZFBhZ2UsXG4gICAgICAgICAgY3VycmVudEhpZ2hlc3RQYWdlICsgbWF4UGFnZXNUb0xvYWQsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDdXJzb3IgbW9kZTogbmVlZCB0byBsb2FkIHBhZ2VzICR7c3RhcnRQYWdlfSB0byAke2VuZFBhZ2V9LCBsaW1pdGVkIHRvICR7bGltaXRlZEVuZFBhZ2V9YCxcbiAgICAgICAgLy8gKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGxvYWQgcGFnZXMgc2VxdWVudGlhbGx5XG4gICAgICAgIGZvciAobGV0IHBhZ2UgPSBzdGFydFBhZ2U7IHBhZ2UgPD0gbGltaXRlZEVuZFBhZ2U7IHBhZ2UrKykge1xuICAgICAgICAgIGNvbnN0IHJhbmdlSWQgPSBwYWdlIC0gMTsgLy8gQ29udmVydCB0byAwLWJhc2VkIHJhbmdlSWRcbiAgICAgICAgICBjb25zdCBvZmZzZXQgPSByYW5nZUlkICogcmFuZ2VTaXplO1xuXG4gICAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGJlaW5nIGxvYWRlZFxuICAgICAgICAgIGlmIChwZW5kaW5nUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICAgICAgLy8gUmFuZ2UgYWxyZWFkeSBiZWluZyBsb2FkZWRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkgJiYgIXBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb24sIHdlIG11c3QgbG9hZCBzZXF1ZW50aWFsbHlcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYWxsIHByZXZpb3VzIHBhZ2VzIGxvYWRlZFxuICAgICAgICAgICAgaWYgKHBhZ2UgPiAxKSB7XG4gICAgICAgICAgICAgIGxldCBjYW5Mb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgcHJldlBhZ2UgPSAxOyBwcmV2UGFnZSA8IHBhZ2U7IHByZXZQYWdlKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2UmFuZ2VJZCA9IHByZXZQYWdlIC0gMTtcbiAgICAgICAgICAgICAgICBpZiAoIWxvYWRlZFJhbmdlcy5oYXMocHJldlJhbmdlSWQpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDYW5ub3QgbG9hZCBwYWdlICR7cGFnZX0gLSBuZWVkIHRvIGxvYWQgcGFnZSAke3ByZXZQYWdlfSBmaXJzdGAsXG4gICAgICAgICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgICAgICAgY2FuTG9hZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gbG9hZCB0aGUgbWlzc2luZyBwYWdlXG4gICAgICAgICAgICAgICAgICBpZiAoIXBlbmRpbmdSYW5nZXMuaGFzKHByZXZSYW5nZUlkKSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGxvYWRSYW5nZShwcmV2UmFuZ2VJZCAqIHJhbmdlU2l6ZSwgcmFuZ2VTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYFtDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBwcmVyZXF1aXNpdGUgcGFnZSAke3ByZXZQYWdlfTpgLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIFN0b3AgdHJ5aW5nIHRvIGxvYWQgZnVydGhlciBwYWdlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoIWNhbkxvYWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCB0aGlzIHBhZ2UgZm9yIG5vd1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IGxvYWRSYW5nZShvZmZzZXQsIHJhbmdlU2l6ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgcGFnZSAke3BhZ2V9OmAsIGVycm9yKTtcbiAgICAgICAgICAgICAgYnJlYWs7IC8vIFN0b3Agc2VxdWVudGlhbCBsb2FkaW5nIG9uIGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuZFBhZ2UgPiBsaW1pdGVkRW5kUGFnZSkge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBTdG9wcGVkIGF0IHBhZ2UgJHtsaW1pdGVkRW5kUGFnZX0gdG8gcHJldmVudCBleGNlc3NpdmUgbG9hZGluZyAocmVxdWVzdGVkIHVwIHRvICR7ZW5kUGFnZX0pYCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBPcmlnaW5hbCBsb2dpYyBmb3Igb2Zmc2V0L3BhZ2Ugc3RyYXRlZ2llc1xuICAgICAgLy8gQ2FsY3VsYXRlIHJhbmdlIGJvdW5kYXJpZXNcbiAgICAgIGNvbnN0IHN0YXJ0UmFuZ2UgPSBNYXRoLmZsb29yKHJhbmdlLnN0YXJ0IC8gcmFuZ2VTaXplKTtcbiAgICAgIGNvbnN0IGVuZFJhbmdlID0gTWF0aC5mbG9vcihyYW5nZS5lbmQgLyByYW5nZVNpemUpO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBwYWdlIHN0cmF0ZWd5IC0gc3RhcnRSYW5nZTogJHtzdGFydFJhbmdlfSwgZW5kUmFuZ2U6ICR7ZW5kUmFuZ2V9LCBsb2FkZWRSYW5nZXM6IFske0FycmF5LmZyb20obG9hZGVkUmFuZ2VzKS5qb2luKFwiLCBcIil9XWAsXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBDb2xsZWN0IHJhbmdlcyB0aGF0IG5lZWQgbG9hZGluZ1xuICAgICAgY29uc3QgcmFuZ2VzVG9Mb2FkOiBudW1iZXJbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgcmFuZ2VJZCA9IHN0YXJ0UmFuZ2U7IHJhbmdlSWQgPD0gZW5kUmFuZ2U7IHJhbmdlSWQrKykge1xuICAgICAgICBpZiAoIWxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkgJiYgIXBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgICAgcmFuZ2VzVG9Mb2FkLnB1c2gocmFuZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJhbmdlc1RvTG9hZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gQWxsIHJhbmdlcyBhcmUgYWxyZWFkeSBsb2FkZWQgb3IgcGVuZGluZ1xuICAgICAgICAvLyBCdXQgdmVyaWZ5IHRoZSBkYXRhIGFjdHVhbGx5IGV4aXN0cyBpbiBpdGVtcyBhcnJheSAoZGVmZW5zaXZlIGNoZWNrKVxuICAgICAgICBmb3IgKGxldCByYW5nZUlkID0gc3RhcnRSYW5nZTsgcmFuZ2VJZCA8PSBlbmRSYW5nZTsgcmFuZ2VJZCsrKSB7XG4gICAgICAgICAgaWYgKGxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmFuZ2UgYWN0dWFsbHkgaGFzIGRhdGFcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlU3RhcnQgPSByYW5nZUlkICogcmFuZ2VTaXplO1xuICAgICAgICAgICAgY29uc3QgaGFzRGF0YSA9IGl0ZW1zXG4gICAgICAgICAgICAgIC5zbGljZShyYW5nZVN0YXJ0LCByYW5nZVN0YXJ0ICsgcmFuZ2VTaXplKVxuICAgICAgICAgICAgICAuc29tZSgoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICghaGFzRGF0YSkge1xuICAgICAgICAgICAgICAvLyBSYW5nZSBtYXJrZWQgbG9hZGVkIGJ1dCBubyBkYXRhIC0gZm9yY2UgcmVsb2FkXG4gICAgICAgICAgICAgIGxvYWRlZFJhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgICAgIHJhbmdlc1RvTG9hZC5wdXNoKHJhbmdlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgcXVldWVkIHJlcXVlc3RzIHdlIHNob3VsZCBwcm9jZXNzXG4gICAgICAgIGlmIChcbiAgICAgICAgICByYW5nZXNUb0xvYWQubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzXG4gICAgICAgICkge1xuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyYW5nZXNUb0xvYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIExvYWRpbmcgJHtyYW5nZXNUb0xvYWQubGVuZ3RofSByYW5nZXM6IFske3Jhbmdlc1RvTG9hZC5qb2luKFwiLCBcIil9XWAsXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBMb2FkIHJhbmdlcyBpbmRpdmlkdWFsbHkgLSBubyBtZXJnaW5nIHRvIGF2b2lkIGxvYWRpbmcgb2xkIHJhbmdlc1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSByYW5nZXNUb0xvYWQubWFwKChyYW5nZUlkKSA9PlxuICAgICAgICBsb2FkUmFuZ2UocmFuZ2VJZCAqIHJhbmdlU2l6ZSwgcmFuZ2VTaXplKSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBWZWxvY2l0eS1hd2FyZSB3cmFwcGVyIGZvciBsb2FkTWlzc2luZ1Jhbmdlc1xuICAgICAqL1xuICAgIGNvbnN0IGxvYWRNaXNzaW5nUmFuZ2VzID0gKFxuICAgICAgcmFuZ2U6IHtcbiAgICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgICAgZW5kOiBudW1iZXI7XG4gICAgICB9LFxuICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmFuZ2VLZXkgPSBnZXRSYW5nZUtleShyYW5nZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBsb2FkaW5nXG4gICAgICAgIGlmIChhY3RpdmVMb2FkUmFuZ2VzLmhhcyhyYW5nZUtleSkpIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBpZiBkcmFnZ2luZyB3aXRoIGxvdyB2ZWxvY2l0eSAoYnV0IG5vdCBpZiB3ZSdyZSBpZGxlKVxuICAgICAgICBpZiAoaXNEcmFnZ2luZyAmJiBjdXJyZW50VmVsb2NpdHkgPCAwLjUgJiYgY3VycmVudFZlbG9jaXR5ID4gMCkge1xuICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHZlbG9jaXR5IC0gaWYgdG9vIGhpZ2gsIGNhbmNlbCB0aGUgcmVxdWVzdCBlbnRpcmVseVxuICAgICAgICBpZiAoIWNhbkxvYWQoKSkge1xuICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGNhcGFjaXR5XG4gICAgICAgIGlmIChhY3RpdmVMb2FkQ291bnQgPCBtYXhDb25jdXJyZW50UmVxdWVzdHMpIHtcbiAgICAgICAgICAvLyBFeGVjdXRlIGltbWVkaWF0ZWx5XG4gICAgICAgICAgZXhlY3V0ZVF1ZXVlZExvYWQoe1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBwcmlvcml0eTogXCJub3JtYWxcIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICBjYWxsZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZW5hYmxlUmVxdWVzdFF1ZXVlICYmXG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPCBtYXhRdWV1ZVNpemVcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gUXVldWUgdGhlIHJlcXVlc3RcbiAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBwcmlvcml0eTogXCJub3JtYWxcIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICBjYWxsZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0xvYWRpbmdNYW5hZ2VyXSBRdWV1ZWQgcmVxdWVzdCAoYXQgY2FwYWNpdHkpLCBxdWV1ZSBzaXplOiAke2xvYWRSZXF1ZXN0UXVldWUubGVuZ3RofWBcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFF1ZXVlIGlzIGZ1bGwgLSBidXQgZG9uJ3QgZHJvcCBpZGxlL3JhbmdlLWNoYW5nZWQgcmVxdWVzdHMsIHRoZXkncmUgY3JpdGljYWwhXG4gICAgICAgICAgLy8gSW5zdGVhZCwgY2xlYXIgb2xkIHF1ZXVlZCByZXF1ZXN0cyBhbmQgYWRkIHRoZSBuZXcgb25lXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2FsbGVyID09PSBcInZpZXdwb3J0OmlkbGVcIiB8fFxuICAgICAgICAgICAgY2FsbGVyID09PSBcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gQ2xlYXIgb2xkIHF1ZXVlZCByZXF1ZXN0cyAtIHRoZXkncmUgZm9yIHJhbmdlcyB1c2VyIHNjcm9sbGVkIHBhc3RcbiAgICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUuZm9yRWFjaCgocikgPT4ge1xuICAgICAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgICAgICByLnJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICAgICAgLy8gUXVldWUgdGhpcyBwcmlvcml0eSByZXF1ZXN0XG4gICAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgICAgcHJpb3JpdHk6IFwiaGlnaFwiLFxuICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgICAgY2FsbGVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFF1ZXVlIG92ZXJmbG93IC0gcmVzb2x2ZSB0byBhdm9pZCBlcnJvcnNcbiAgICAgICAgICAgIGlmIChsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA+PSBtYXhRdWV1ZVNpemUpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGxvYWRSZXF1ZXN0UXVldWUuc3BsaWNlKFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggLSBtYXhRdWV1ZVNpemUsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJlbW92ZWQuZm9yRWFjaCgocikgPT4ge1xuICAgICAgICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgICAgICAgci5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHJ5IGEgZmFpbGVkIHJhbmdlXG4gICAgICovXG4gICAgY29uc3QgcmV0cnlGYWlsZWRSYW5nZSA9IGFzeW5jIChyYW5nZUlkOiBudW1iZXIpOiBQcm9taXNlPGFueVtdPiA9PiB7XG4gICAgICBmYWlsZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gcmFuZ2VJZCAqIHJhbmdlU2l6ZTtcbiAgICAgIHJldHVybiBsb2FkUmFuZ2Uob2Zmc2V0LCByYW5nZVNpemUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdG90YWwgaXRlbXMgY291bnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXRUb3RhbEl0ZW1zID0gKHRvdGFsOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIHRvdGFsSXRlbXMgPSB0b3RhbDtcblxuICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlJ3MgdG90YWwgaXRlbXNcbiAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPSB0b3RhbDtcbiAgICAgIH1cblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWRcIiwgeyB0b3RhbCB9KTtcbiAgICB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHZpZXdwb3J0IGluaXRpYWxpemF0aW9uXG4gICAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXRpYWxpemUoKTtcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgaW5pdGlhbCB0b3RhbCBpZiBwcm92aWRlZFxuICAgICAgaWYgKGNvbXBvbmVudC50b3RhbEl0ZW1zKSB7XG4gICAgICAgIHRvdGFsSXRlbXMgPSBjb21wb25lbnQudG90YWxJdGVtcztcbiAgICAgIH1cblxuICAgICAgLy8gTGlzdGVuIGZvciBkcmFnIGV2ZW50c1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpkcmFnLXN0YXJ0XCIsICgpID0+IHtcbiAgICAgICAgaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpkcmFnLWVuZFwiLCAoKSA9PiB7XG4gICAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gUHJvY2VzcyBhbnkgcXVldWVkIHJlcXVlc3RzIGFmdGVyIGRyYWcgZW5kcyAoc2FmZXR5IG1lYXN1cmUpXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBwbGFjZWhvbGRlcnMgYXJlIHJlcGxhY2VkIGV2ZW4gaWYgaWRsZSBkZXRlY3Rpb24gZmFpbHNcbiAgICAgICAgaWYgKGxvYWRPbkRyYWdFbmQpIHtcbiAgICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgcmFuZ2UgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIsIGFzeW5jIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgLy8gRG9uJ3QgbG9hZCBkdXJpbmcgZmFzdCBzY3JvbGxpbmcgLSBsb2FkTWlzc2luZ1JhbmdlcyB3aWxsIGhhbmRsZSB2ZWxvY2l0eSBjaGVja1xuXG4gICAgICAgIC8vIEV4dHJhY3QgcmFuZ2UgZnJvbSBldmVudCBkYXRhIC0gdmlydHVhbCBmZWF0dXJlIGVtaXRzIHsgcmFuZ2U6IHsgc3RhcnQsIGVuZCB9LCBzY3JvbGxQb3NpdGlvbiB9XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZGF0YS5yYW5nZSB8fCBkYXRhO1xuICAgICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHJhbmdlO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHJhbmdlIGJlZm9yZSBsb2FkaW5nXG4gICAgICAgIGlmICh0eXBlb2Ygc3RhcnQgIT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIGVuZCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIFwiW0NvbGxlY3Rpb25dIEludmFsaWQgcmFuZ2UgaW4gdmlld3BvcnQ6cmFuZ2UtY2hhbmdlZCBldmVudDpcIixcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTa2lwIGxvYWRpbmcgcGFnZSAxIGlmIHdlIGhhdmUgYW4gaW5pdGlhbFNjcm9sbEluZGV4IGFuZCBoYXZlbid0IGNvbXBsZXRlZCBpbml0aWFsIGxvYWQgeWV0XG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIHJlcXVlc3RBbmltYXRpb25GcmFtZSBpbiB2aXJ0dWFsLnRzIGZyb20gdHJpZ2dlcmluZyBhIHBhZ2UgMSBsb2FkXG4gICAgICAgIC8vIGFmdGVyIHdlJ3ZlIGFscmVhZHkgc3RhcnRlZCBsb2FkaW5nIHRoZSBjb3JyZWN0IGluaXRpYWwgcGFnZVxuICAgICAgICBpZiAoaGFzSW5pdGlhbFNjcm9sbEluZGV4ICYmICFoYXNDb21wbGV0ZWRJbml0aWFsUG9zaXRpb25Mb2FkKSB7XG4gICAgICAgICAgY29uc3QgcGFnZTFFbmRJbmRleCA9IHJhbmdlU2l6ZSAtIDE7IC8vIGUuZy4sIDI5IGZvciByYW5nZVNpemU9MzBcbiAgICAgICAgICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kIDw9IHBhZ2UxRW5kSW5kZXgpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSByZXF1ZXN0IGZvciBwYWdlIDEsIHNraXAgaXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIG1pc3NpbmcgcmFuZ2VzIGlmIG5lZWRlZFxuICAgICAgICBhd2FpdCBsb2FkTWlzc2luZ1Jhbmdlcyh7IHN0YXJ0LCBlbmQgfSwgXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIpO1xuXG4gICAgICAgIC8vIEV2aWN0IGRpc3RhbnQgaXRlbXMgdG8gcHJldmVudCBtZW1vcnkgYmxvYXRcbiAgICAgICAgZXZpY3REaXN0YW50SXRlbXMoc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgLy8gRm9yIGN1cnNvciBtb2RlLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSB2aXJ0dWFsIHNpemVcbiAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiICYmICFoYXNSZWFjaGVkRW5kKSB7XG4gICAgICAgICAgY29uc3QgbG9hZGVkSXRlbXNDb3VudCA9IGl0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgY29uc3QgbWFyZ2luSXRlbXMgPVxuICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QQUdJTkFUSU9OLkNVUlNPUl9TQ1JPTExfTUFSR0lOX01VTFRJUExJRVI7XG4gICAgICAgICAgY29uc3QgbWluVmlydHVhbEl0ZW1zID1cbiAgICAgICAgICAgIHJhbmdlU2l6ZSAqXG4gICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUEFHSU5BVElPTi5DVVJTT1JfTUlOX1ZJUlRVQUxfU0laRV9NVUxUSVBMSUVSO1xuICAgICAgICAgIGNvbnN0IGR5bmFtaWNUb3RhbCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgbG9hZGVkSXRlbXNDb3VudCArIG1hcmdpbkl0ZW1zLFxuICAgICAgICAgICAgbWluVmlydHVhbEl0ZW1zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoZHluYW1pY1RvdGFsICE9PSB0b3RhbEl0ZW1zKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGluZyBjdXJzb3IgdmlydHVhbCBzaXplIGZyb20gJHt0b3RhbEl0ZW1zfSB0byAke2R5bmFtaWNUb3RhbH1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIHNldFRvdGFsSXRlbXMoZHluYW1pY1RvdGFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHZlbG9jaXR5IGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmVsb2NpdHkgPSBjdXJyZW50VmVsb2NpdHk7XG4gICAgICAgIGN1cnJlbnRWZWxvY2l0eSA9IE1hdGguYWJzKGRhdGEudmVsb2NpdHkgfHwgMCk7XG5cbiAgICAgICAgLy8gV2hlbiB2ZWxvY2l0eSBkcm9wcyBiZWxvdyB0aHJlc2hvbGQsIHByb2Nlc3MgcXVldWVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXZpb3VzVmVsb2NpdHkgPiBjYW5jZWxMb2FkVGhyZXNob2xkICYmXG4gICAgICAgICAgY3VycmVudFZlbG9jaXR5IDw9IGNhbmNlbExvYWRUaHJlc2hvbGRcbiAgICAgICAgKSB7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGlkbGUgc3RhdGUgdG8gcHJvY2VzcyBxdWV1ZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppZGxlXCIsIGFzeW5jIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY3VycmVudFZlbG9jaXR5ID0gMDtcblxuICAgICAgICAvLyBSZXNldCBkcmFnZ2luZyBzdGF0ZSBvbiBpZGxlIHNpbmNlIHVzZXIgaGFzIHN0b3BwZWQgbW92aW5nXG4gICAgICAgIGlmIChpc0RyYWdnaW5nKSB7XG4gICAgICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGN1cnJlbnQgdmlzaWJsZSByYW5nZSBmcm9tIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IHZpZXdwb3J0U3RhdGU/LnZpc2libGVSYW5nZTtcblxuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgLy8gQ2xlYXIgc3RhbGUgcmVxdWVzdHMgZnJvbSBxdWV1ZSB0aGF0IGFyZSBmYXIgZnJvbSBjdXJyZW50IHZpc2libGUgcmFuZ2VcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSByYW5nZVNpemUgKiAyOyAvLyBBbGxvdyBzb21lIGJ1ZmZlclxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUgPSBsb2FkUmVxdWVzdFF1ZXVlLmZpbHRlcigocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEVuZCA9IHJlcXVlc3QucmFuZ2UuZW5kO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFN0YXJ0ID0gcmVxdWVzdC5yYW5nZS5zdGFydDtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVsZXZhbnQgPVxuICAgICAgICAgICAgICByZXF1ZXN0RW5kID49IHZpc2libGVSYW5nZS5zdGFydCAtIGJ1ZmZlciAmJlxuICAgICAgICAgICAgICByZXF1ZXN0U3RhcnQgPD0gdmlzaWJsZVJhbmdlLmVuZCArIGJ1ZmZlcjtcblxuICAgICAgICAgICAgaWYgKCFpc1JlbGV2YW50KSB7XG4gICAgICAgICAgICAgIHJlcXVlc3QucmVzb2x2ZSgpOyAvLyBSZXNvbHZlIHRvIGF2b2lkIGhhbmdpbmcgcHJvbWlzZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpc1JlbGV2YW50O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gTG9hZCB0aGUgY3VycmVudCB2aXNpYmxlIHJhbmdlIGlmIG5lZWRlZFxuICAgICAgICAgIGF3YWl0IGxvYWRNaXNzaW5nUmFuZ2VzKHZpc2libGVSYW5nZSwgXCJ2aWV3cG9ydDppZGxlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxzbyBwcm9jZXNzIGFueSBxdWV1ZWQgcmVxdWVzdHNcbiAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtIHJlbW92YWwgLSBET04nVCBjbGVhciBsb2FkZWRSYW5nZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZWxvYWRcbiAgICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgc2hpZnRlZCBsb2NhbGx5IGluIGFwaS50cyBhbmQgcmVuZGVyaW5nLnRzXG4gICAgICAvLyBSZWxvYWRpbmcgd291bGQgY2F1c2UgcmFjZSBjb25kaXRpb25zIGFuZCBvdmVyd3JpdGUgdGhlIGNvcnJlY3QgdG90YWxJdGVtc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtOnJlbW92ZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIGl0ZW06cmVtb3ZlZCBldmVudCAtIGluZGV4OiAke2RhdGEuaW5kZXh9YCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gaXRlbXMubGVuZ3RoOiAke2l0ZW1zLmxlbmd0aH1gKTtcblxuICAgICAgICAvLyBVcGRhdGUgZGlzY292ZXJlZFRvdGFsIHRvIG1hdGNoIHRoZSBuZXcgY291bnRcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzdGFsZSBkaXNjb3ZlcmVkVG90YWwgZnJvbSBiZWluZyB1c2VkIG9uIG5leHQgbG9hZFxuICAgICAgICBpZiAoZGlzY292ZXJlZFRvdGFsICE9PSBudWxsICYmIGRpc2NvdmVyZWRUb3RhbCA+IDApIHtcbiAgICAgICAgICBkaXNjb3ZlcmVkVG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgLSAxO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGVkIGRpc2NvdmVyZWRUb3RhbCB0bzogJHtkaXNjb3ZlcmVkVG90YWx9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogRG8gTk9UIGRlY3JlbWVudCB0b3RhbEl0ZW1zIGhlcmUhXG4gICAgICAgIC8vIGFwaS50cyBhbHJlYWR5IGNhbGxzIHNldFRvdGFsSXRlbXMoKSBhZnRlciBlbWl0dGluZyBpdGVtOnJlbW92ZS1yZXF1ZXN0LFxuICAgICAgICAvLyB3aGljaCBwcm9wZXJseSB1cGRhdGVzIHRvdGFsSXRlbXMuIERlY3JlbWVudGluZyBoZXJlIHdvdWxkIGNhdXNlIGEgZG91YmxlLWRlY3JlbWVudC5cblxuICAgICAgICAvLyBET04nVCBjbGVhciBsb2FkZWRSYW5nZXMgLSB3ZSB3YW50IHRvIGtlZXAgdXNpbmcgdGhlIGxvY2FsIGRhdGFcbiAgICAgICAgLy8gVGhlIGRhdGEgaGFzIGJlZW4gc2hpZnRlZCBsb2NhbGx5IGFuZCBpcyBzdGlsbCB2YWxpZFxuICAgICAgICAvLyBDbGVhcmluZyB3b3VsZCB0cmlnZ2VyIGEgcmVsb2FkIHdoaWNoIGNhdXNlcyByYWNlIGNvbmRpdGlvbnNcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBLZWVwaW5nIGxvYWRlZFJhbmdlcyBpbnRhY3Q6YCxcbiAgICAgICAgLy8gICBBcnJheS5mcm9tKGxvYWRlZFJhbmdlcyksXG4gICAgICAgIC8vICk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTG9hZCBpbml0aWFsIGRhdGEgaWYgY29sbGVjdGlvbiBpcyBhdmFpbGFibGUgYW5kIGF1dG9Mb2FkIGlzIGVuYWJsZWRcbiAgICAgIGlmIChjb2xsZWN0aW9uICYmIGF1dG9Mb2FkKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbCBzY3JvbGwgaW5kZXggT1IgYSBzZWxlY3RJZCwgbG9hZCBkYXRhIGZvciB0aGF0IHBvc2l0aW9uIGRpcmVjdGx5XG4gICAgICAgIC8vIERvbid0IHVzZSBzY3JvbGxUb0luZGV4KCkgYXMgaXQgdHJpZ2dlcnMgYW5pbWF0aW9uL3ZlbG9jaXR5IHRyYWNraW5nXG4gICAgICAgIC8vIHZpcnR1YWwudHMgaGFzIGFscmVhZHkgc2V0IHRoZSBzY3JvbGwgcG9zaXRpb24gYW5kIGNhbGN1bGF0ZWQgdGhlIHZpc2libGUgcmFuZ2VcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA+IDAgfHxcbiAgICAgICAgICAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBzZWxlY3RJZCAhPT0gbnVsbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSB2aXNpYmxlIHJhbmdlIHRoYXQgd2FzIGFscmVhZHkgY2FsY3VsYXRlZCBieSB2aXJ0dWFsLnRzXG4gICAgICAgICAgLy8gV2UgbWlzc2VkIHRoZSBpbml0aWFsIHZpZXdwb3J0OnJhbmdlLWNoYW5nZWQgZXZlbnQgYmVjYXVzZSBvdXIgbGlzdGVuZXIgd2Fzbid0IHJlYWR5IHlldFxuICAgICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0VmlzaWJsZVJhbmdlPy4oKTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHZpc2libGVSYW5nZSAmJlxuICAgICAgICAgICAgKHZpc2libGVSYW5nZS5zdGFydCA+IDAgfHwgdmlzaWJsZVJhbmdlLmVuZCA+IDApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBVc2UgdGhlIHByZS1jYWxjdWxhdGVkIHZpc2libGUgcmFuZ2UgZnJvbSB2aXJ0dWFsLnRzXG4gICAgICAgICAgICBsb2FkTWlzc2luZ1Jhbmdlcyh2aXNpYmxlUmFuZ2UsIFwiaW5pdGlhbC1wb3NpdGlvblwiKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gRW1pdCBldmVudCB0byBzZWxlY3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWQgaWYgc2VsZWN0SWQgaXMgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIltDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBpbml0aWFsIHBvc2l0aW9uIGRhdGE6XCIsXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlOyAvLyBBbGxvdyBub3JtYWwgbG9hZGluZyBldmVuIG9uIGVycm9yXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjazogY2FsY3VsYXRlIHJhbmdlIGZyb20gaW5pdGlhbFNjcm9sbEluZGV4XG4gICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgZWRnZSBjYXNlcyB3aGVyZSB2aXNpYmxlUmFuZ2Ugd2Fzbid0IHJlYWR5XG4gICAgICAgICAgICBjb25zdCBvdmVyc2NhbiA9IDI7XG4gICAgICAgICAgICBjb25zdCBlc3RpbWF0ZWRWaXNpYmxlQ291bnQgPSBNYXRoLmNlaWwoNjAwIC8gNTApOyAvLyB+MTIgaXRlbXNcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgaW5pdGlhbFNjcm9sbEluZGV4IC0gb3ZlcnNjYW4pO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gaW5pdGlhbFNjcm9sbEluZGV4ICsgZXN0aW1hdGVkVmlzaWJsZUNvdW50ICsgb3ZlcnNjYW47XG5cbiAgICAgICAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzKHsgc3RhcnQsIGVuZCB9LCBcImluaXRpYWwtcG9zaXRpb24tZmFsbGJhY2tcIilcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIEVtaXQgZXZlbnQgdG8gc2VsZWN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkIGlmIHNlbGVjdElkIGlzIHByb3ZpZGVkXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdElkLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgaW5pdGlhbCBwb3NpdGlvbiBkYXRhIChmYWxsYmFjayk6XCIsXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlOyAvLyBBbGxvdyBub3JtYWwgbG9hZGluZyBldmVuIG9uIGVycm9yXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBpbml0aWFsIHNjcm9sbCBpbmRleCAtIGxvYWQgZnJvbSBiZWdpbm5pbmcgYXMgbm9ybWFsXG4gICAgICAgIGxvYWRSYW5nZSgwLCByYW5nZVNpemUpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGF1dG9TZWxlY3RGaXJzdCAtIGdldCBmaXJzdCBpdGVtIElEIGFuZCBlbWl0IHNlbGVjdGlvbiBldmVudFxuICAgICAgICAgICAgaWYgKGF1dG9TZWxlY3RGaXJzdCAmJiBpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9IGl0ZW1zWzBdO1xuICAgICAgICAgICAgICBjb25zdCBmaXJzdElkID0gZmlyc3RJdGVtPy5faWQgfHwgZmlyc3RJdGVtPy5pZDtcbiAgICAgICAgICAgICAgaWYgKGZpcnN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RJZDogZmlyc3RJZCxcbiAgICAgICAgICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleDogMCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIltDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBpbml0aWFsIGRhdGE6XCIsIGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVzZXQgY29sbGVjdGlvbiBzdGF0ZSB3aXRob3V0IGRlc3Ryb3lpbmcgdGhlIGNvbXBvbmVudFxuICAgICAqIENsZWFycyBhbGwgbG9hZGVkIGRhdGEgYW5kIHByZXBhcmVzIGZvciBmcmVzaCBsb2FkXG4gICAgICovXG4gICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICBsb2dNZW1vcnlTdGF0cyhcInJlc2V0OmJlZm9yZVwiKTtcblxuICAgICAgLy8gQWJvcnQgYWxsIGluLWZsaWdodCByZXF1ZXN0c1xuICAgICAgYWJvcnRDb250cm9sbGVycy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gSWdub3JlIGFib3J0IGVycm9yc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgc3RydWN0dXJlc1xuICAgICAgaXRlbXMubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgcGVuZGluZ1Jhbmdlcy5jbGVhcigpO1xuICAgICAgZmFpbGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVMb2FkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVSZXF1ZXN0cy5jbGVhcigpO1xuICAgICAgY3Vyc29yTWFwLmNsZWFyKCk7XG4gICAgICBwYWdlVG9PZmZzZXRNYXAuY2xlYXIoKTtcblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIHRvdGFsSXRlbXMgPSAwO1xuICAgICAgY3VycmVudEN1cnNvciA9IG51bGw7XG4gICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IDA7XG4gICAgICBkaXNjb3ZlcmVkVG90YWwgPSBudWxsO1xuICAgICAgaGFzUmVhY2hlZEVuZCA9IGZhbHNlO1xuICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IGZhbHNlO1xuXG4gICAgICAvLyBSZXNldCBjb3VudGVyc1xuICAgICAgYWN0aXZlTG9hZENvdW50ID0gMDtcbiAgICAgIGNvbXBsZXRlZExvYWRzID0gMDtcbiAgICAgIGZhaWxlZExvYWRzID0gMDtcbiAgICAgIGNhbmNlbGxlZExvYWRzID0gMDtcblxuICAgICAgLy8gVXBkYXRlIGNvbXBvbmVudCByZWZlcmVuY2VcbiAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSAwO1xuXG4gICAgICBsb2dNZW1vcnlTdGF0cyhcInJlc2V0OmFmdGVyXCIpO1xuXG4gICAgICAvLyBFbWl0IHJlc2V0IGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjpyZXNldFwiKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGNvbGxlY3Rpb24gQVBJIHRvIHZpZXdwb3J0XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24gPSB7XG4gICAgICBsb2FkUmFuZ2U6IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcikgPT4gbG9hZFJhbmdlKG9mZnNldCwgbGltaXQpLFxuICAgICAgbG9hZE1pc3NpbmdSYW5nZXM6IChcbiAgICAgICAgcmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSxcbiAgICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICAgKSA9PiBsb2FkTWlzc2luZ1JhbmdlcyhyYW5nZSwgY2FsbGVyIHx8IFwidmlld3BvcnQuY29sbGVjdGlvblwiKSxcbiAgICAgIGdldExvYWRlZFJhbmdlczogKCkgPT4gbG9hZGVkUmFuZ2VzLFxuICAgICAgZ2V0UGVuZGluZ1JhbmdlczogKCkgPT4gcGVuZGluZ1JhbmdlcyxcbiAgICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiBmYWlsZWRSYW5nZXMuY2xlYXIoKSxcbiAgICAgIHJldHJ5RmFpbGVkUmFuZ2UsXG4gICAgICBzZXRUb3RhbEl0ZW1zLFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiBjdXJyZW50Q3Vyc29yLFxuICAgICAgZ2V0Q3Vyc29yRm9yUGFnZTogKHBhZ2U6IG51bWJlcikgPT4gY3Vyc29yTWFwLmdldChwYWdlKSB8fCBudWxsLFxuICAgICAgLy8gUmVzZXQgbWV0aG9kIGZvciByZWxvYWQgZnVuY3Rpb25hbGl0eVxuICAgICAgcmVzZXQsXG4gICAgfTtcblxuICAgIC8vIEFkZCBjb2xsZWN0aW9uIGRhdGEgYWNjZXNzIHdpdGggZGlyZWN0IGFzc2lnbm1lbnRcbiAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbiA9IHtcbiAgICAgIGl0ZW1zLFxuICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgZ2V0SXRlbTogKGluZGV4OiBudW1iZXIpID0+IGl0ZW1zW2luZGV4XSxcbiAgICAgIGxvYWRSYW5nZSxcbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzOiAoXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICAgICkgPT4gbG9hZE1pc3NpbmdSYW5nZXMocmFuZ2UsIGNhbGxlciB8fCBcImNvbXBvbmVudC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGluZ1N0YXRzOiAoKSA9PiAoe1xuICAgICAgICBwZW5kaW5nUmVxdWVzdHM6IGFjdGl2ZUxvYWRDb3VudCxcbiAgICAgICAgY29tcGxldGVkUmVxdWVzdHM6IGNvbXBsZXRlZExvYWRzLFxuICAgICAgICBmYWlsZWRSZXF1ZXN0czogZmFpbGVkTG9hZHMsXG4gICAgICAgIGNhbmNlbGxlZFJlcXVlc3RzOiBjYW5jZWxsZWRMb2FkcyxcbiAgICAgICAgY3VycmVudFZlbG9jaXR5LFxuICAgICAgICBjYW5Mb2FkOiBjYW5Mb2FkKCksXG4gICAgICAgIHF1ZXVlZFJlcXVlc3RzOiBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCxcbiAgICAgIH0pLFxuICAgICAgLy8gVG90YWwgaXRlbXMgbWFuYWdlbWVudFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAvLyBDdXJzb3IgbWV0aG9kc1xuICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICAgIC8vIFJlc2V0IG1ldGhvZCBmb3IgcmVsb2FkIGZ1bmN0aW9uYWxpdHlcbiAgICAgIHJlc2V0LFxuICAgIH07XG5cbiAgICAvLyBBbHNvIGVuc3VyZSBjb21wb25lbnQuaXRlbXMgaXMgdXBkYXRlZFxuICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgLy8gQ2xlYW51cCBmdW5jdGlvbiAtIGNvbXByZWhlbnNpdmUgbWVtb3J5IGNsZWFudXBcbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJkZXN0cm95OmJlZm9yZVwiKTtcblxuICAgICAgLy8gQWJvcnQgYWxsIGluLWZsaWdodCByZXF1ZXN0c1xuICAgICAgYWJvcnRDb250cm9sbGVycy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gSWdub3JlIGFib3J0IGVycm9yc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgc3RydWN0dXJlc1xuICAgICAgaXRlbXMubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgcGVuZGluZ1Jhbmdlcy5jbGVhcigpO1xuICAgICAgZmFpbGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVMb2FkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVSZXF1ZXN0cy5jbGVhcigpO1xuICAgICAgY3Vyc29yTWFwLmNsZWFyKCk7XG4gICAgICBwYWdlVG9PZmZzZXRNYXAuY2xlYXIoKTtcblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIHRvdGFsSXRlbXMgPSAwO1xuICAgICAgY3VycmVudEN1cnNvciA9IG51bGw7XG4gICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IDA7XG4gICAgICBkaXNjb3ZlcmVkVG90YWwgPSBudWxsO1xuICAgICAgaGFzUmVhY2hlZEVuZCA9IGZhbHNlO1xuXG4gICAgICAvLyBDbGVhciBjb21wb25lbnQgcmVmZXJlbmNlXG4gICAgICBpZiAoY29tcG9uZW50Lml0ZW1zID09PSBpdGVtcykge1xuICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJkZXN0cm95OmFmdGVyXCIpO1xuICAgIH07XG5cbiAgICAvLyBXaXJlIGRlc3Ryb3kgaW50byB0aGUgY29tcG9uZW50J3MgZGVzdHJveSBjaGFpblxuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgZGVzdHJveSk7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGNvbGxlY3Rpb246IHtcbiAgICAgICAgLy8gRGF0YSBhY2Nlc3MgbWV0aG9kc1xuICAgICAgICBpdGVtcyxcbiAgICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgICBnZXRJdGVtOiAoaW5kZXg6IG51bWJlcikgPT4gaXRlbXNbaW5kZXhdLFxuICAgICAgICAvLyBMb2FkaW5nIG1ldGhvZHNcbiAgICAgICAgbG9hZFJhbmdlLFxuICAgICAgICBsb2FkTWlzc2luZ1JhbmdlczogKFxuICAgICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICAgICApID0+IGxvYWRNaXNzaW5nUmFuZ2VzKHJhbmdlLCBjYWxsZXIgfHwgXCJyZXR1cm4uY29sbGVjdGlvblwiKSxcbiAgICAgICAgZ2V0TG9hZGVkUmFuZ2VzOiAoKSA9PiBsb2FkZWRSYW5nZXMsXG4gICAgICAgIGdldFBlbmRpbmdSYW5nZXM6ICgpID0+IHBlbmRpbmdSYW5nZXMsXG4gICAgICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiBmYWlsZWRSYW5nZXMuY2xlYXIoKSxcbiAgICAgICAgcmV0cnlGYWlsZWRSYW5nZSxcbiAgICAgICAgc2V0VG90YWxJdGVtcyxcbiAgICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgICAgLy8gQ3Vyc29yLXNwZWNpZmljIG1ldGhvZHNcbiAgICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgICAgZ2V0Q3Vyc29yRm9yUGFnZTogKHBhZ2U6IG51bWJlcikgPT4gY3Vyc29yTWFwLmdldChwYWdlKSB8fCBudWxsLFxuICAgICAgICAvLyBSZXNldCBtZXRob2QgZm9yIHJlbG9hZCBmdW5jdGlvbmFsaXR5XG4gICAgICAgIHJlc2V0LFxuICAgICAgfSxcbiAgICB9O1xuICB9O1xufVxuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9wbGFjZWhvbGRlcnMudHNcblxuLyoqXG4gKiBQbGFjZWhvbGRlciBGZWF0dXJlIC0gU21hcnQgcGxhY2Vob2xkZXIgZ2VuZXJhdGlvblxuICogQW5hbHl6ZXMgZmlyc3QgbG9hZGVkIGRhdGEgdG8gZ2VuZXJhdGUgcmVhbGlzdGljIG1hc2tlZCBwbGFjZWhvbGRlcnNcbiAqIFNob3dzIHBsYWNlaG9sZGVycyB3aGlsZSBkYXRhIGlzIGxvYWRpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4vY29sbGVjdGlvblwiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHBsYWNlaG9sZGVyIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFjZWhvbGRlckNvbmZpZyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBhbmFseXplRmlyc3RMb2FkPzogYm9vbGVhbjtcbiAgbWFza0NoYXJhY3Rlcj86IHN0cmluZztcbiAgcmFuZG9tTGVuZ3RoVmFyaWFuY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEZpZWxkIHN0cnVjdHVyZSBmb3IgcGxhY2Vob2xkZXIgZ2VuZXJhdGlvblxuICovXG5pbnRlcmZhY2UgRmllbGRTdHJ1Y3R1cmUge1xuICBtaW5MZW5ndGg6IG51bWJlcjtcbiAgbWF4TGVuZ3RoOiBudW1iZXI7XG4gIGF2Z0xlbmd0aDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYWNlaG9sZGVyQ29tcG9uZW50IHtcbiAgcGxhY2Vob2xkZXJzOiB7XG4gICAgYW5hbHl6ZURhdGFTdHJ1Y3R1cmU6IChpdGVtczogYW55W10pID0+IHZvaWQ7XG4gICAgaGFzQW5hbHl6ZWRTdHJ1Y3R1cmU6ICgpID0+IGJvb2xlYW47XG4gICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW06IChpbmRleDogbnVtYmVyKSA9PiBhbnk7XG4gICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zOiAocmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSkgPT4gYW55W107XG4gICAgc2hvd1BsYWNlaG9sZGVyczogKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pID0+IHZvaWQ7XG4gICAgaXNQbGFjZWhvbGRlcjogKGl0ZW06IGFueSkgPT4gYm9vbGVhbjtcbiAgICByZXBsYWNlUGxhY2Vob2xkZXJzOiAoaXRlbXM6IGFueVtdLCBvZmZzZXQ6IG51bWJlcikgPT4gdm9pZDtcbiAgICBjbGVhcjogKCkgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIHBsYWNlaG9sZGVyIGZ1bmN0aW9uYWxpdHkgdG8gdmlld3BvcnQgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUGxhY2Vob2xkZXJzKGNvbmZpZzogUGxhY2Vob2xkZXJDb25maWcgPSB7fSkge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBDb2xsZWN0aW9uQ29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFRcbiAgKTogVCAmIFBsYWNlaG9sZGVyQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICAgIGFuYWx5emVGaXJzdExvYWQgPSB0cnVlLFxuICAgICAgbWFza0NoYXJhY3RlciA9IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUixcbiAgICAgIHJhbmRvbUxlbmd0aFZhcmlhbmNlID0gVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSXG4gICAgICAgIC5SQU5ET01fTEVOR1RIX1ZBUklBTkNFLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCBmaWVsZFN0cnVjdHVyZXM6IE1hcDxzdHJpbmcsIEZpZWxkU3RydWN0dXJlPiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBoYXNBbmFseXplZCA9IGZhbHNlO1xuICAgIGxldCBwbGFjZWhvbGRlcklkQ291bnRlciA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBBbmFseXplIGRhdGEgc3RydWN0dXJlIGZyb20gZmlyc3QgbG9hZGVkIGl0ZW1zXG4gICAgICovXG4gICAgY29uc3QgYW5hbHl6ZURhdGFTdHJ1Y3R1cmUgPSAoaXRlbXM6IGFueVtdKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWVuYWJsZWQgfHwgaGFzQW5hbHl6ZWQgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBg8J+UjSBbUExBQ0VIT0xERVJTXSBBbmFseXppbmcgZGF0YSBzdHJ1Y3R1cmUgZnJvbSAke2l0ZW1zLmxlbmd0aH0gaXRlbXNgXG4gICAgICAvLyApO1xuXG4gICAgICBjb25zdCBzdHJ1Y3R1cmVzID0gbmV3IE1hcDxzdHJpbmcsIEZpZWxkU3RydWN0dXJlPigpO1xuICAgICAgY29uc3Qgc2FtcGxlU2l6ZSA9IE1hdGgubWluKFxuICAgICAgICBpdGVtcy5sZW5ndGgsXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVhfU0FNUExFX1NJWkVcbiAgICAgICk7XG5cbiAgICAgIC8vIEFuYWx5emUgZWFjaCBmaWVsZCBhY3Jvc3MgYWxsIHNhbXBsZSBpdGVtc1xuICAgICAgY29uc3QgZmllbGRTdGF0cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVTaXplOyBpKyspIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICBpZiAoIWl0ZW0gfHwgdHlwZW9mIGl0ZW0gIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGl0ZW0pLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgLy8gU2tpcCBpbnRlcm5hbCBmaWVsZHNcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmaWVsZC5zdGFydHNXaXRoKFwiX1wiKSB8fFxuICAgICAgICAgICAgZmllbGQgPT09IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5QTEFDRUhPTERFUl9GTEFHXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBTdHJpbmcoaXRlbVtmaWVsZF0gfHwgXCJcIik7XG4gICAgICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKCFmaWVsZFN0YXRzLmhhcyhmaWVsZCkpIHtcbiAgICAgICAgICAgIGZpZWxkU3RhdHMuc2V0KGZpZWxkLCBbXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkU3RhdHMuZ2V0KGZpZWxkKSEucHVzaChsZW5ndGgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIHN0YXRpc3RpY3MgZm9yIGVhY2ggZmllbGRcbiAgICAgIGZpZWxkU3RhdHMuZm9yRWFjaCgobGVuZ3RocywgZmllbGQpID0+IHtcbiAgICAgICAgaWYgKGxlbmd0aHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgbWluTGVuZ3RoID0gTWF0aC5taW4oLi4ubGVuZ3Rocyk7XG4gICAgICAgIGNvbnN0IG1heExlbmd0aCA9IE1hdGgubWF4KC4uLmxlbmd0aHMpO1xuICAgICAgICBjb25zdCBhdmdMZW5ndGggPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIGxlbmd0aHMucmVkdWNlKChzdW0sIGxlbikgPT4gc3VtICsgbGVuLCAwKSAvIGxlbmd0aHMubGVuZ3RoXG4gICAgICAgICk7XG5cbiAgICAgICAgc3RydWN0dXJlcy5zZXQoZmllbGQsIHtcbiAgICAgICAgICBtaW5MZW5ndGgsXG4gICAgICAgICAgbWF4TGVuZ3RoLFxuICAgICAgICAgIGF2Z0xlbmd0aCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZmllbGRTdHJ1Y3R1cmVzID0gc3RydWN0dXJlcztcbiAgICAgIGhhc0FuYWx5emVkID0gdHJ1ZTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGDinIUgW1BMQUNFSE9MREVSU10gU3RydWN0dXJlIGFuYWx5emVkOmAsXG4gICAgICAvLyAgIE9iamVjdC5mcm9tRW50cmllcyhzdHJ1Y3R1cmVzKVxuICAgICAgLy8gKTtcblxuICAgICAgLy8gRW1pdCBldmVudFxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnBsYWNlaG9sZGVycy1zdHJ1Y3R1cmUtYW5hbHl6ZWRcIiwge1xuICAgICAgICBzdHJ1Y3R1cmU6IE9iamVjdC5mcm9tRW50cmllcyhzdHJ1Y3R1cmVzKSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBhIHNpbmdsZSBwbGFjZWhvbGRlciBpdGVtXG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0gPSAoaW5kZXg6IG51bWJlcik6IGFueSA9PiB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlcjogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgICAgaWQ6IGBwbGFjZWhvbGRlci0ke3BsYWNlaG9sZGVySWRDb3VudGVyKyt9YCxcbiAgICAgICAgW1ZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5QTEFDRUhPTERFUl9GTEFHXTogdHJ1ZSxcbiAgICAgICAgX2luZGV4OiBpbmRleCxcbiAgICAgIH07XG5cbiAgICAgIGlmICghZmllbGRTdHJ1Y3R1cmVzIHx8IGZpZWxkU3RydWN0dXJlcy5zaXplID09PSAwKSB7XG4gICAgICAgIC8vIE5vIHN0cnVjdHVyZSBhbmFseXplZCB5ZXQgLSByZXR1cm4gYmFzaWMgcGxhY2Vob2xkZXJcbiAgICAgICAgcGxhY2Vob2xkZXIubGFiZWwgPSBtYXNrQ2hhcmFjdGVyLnJlcGVhdCgxMCk7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICAgIH1cblxuICAgICAgLy8gR2VuZXJhdGUgZmllbGRzIGJhc2VkIG9uIGFuYWx5emVkIHN0cnVjdHVyZVxuICAgICAgZmllbGRTdHJ1Y3R1cmVzLmZvckVhY2goKHN0cnVjdHVyZSwgZmllbGQpID0+IHtcbiAgICAgICAgbGV0IGxlbmd0aDogbnVtYmVyO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICByYW5kb21MZW5ndGhWYXJpYW5jZSAmJlxuICAgICAgICAgIHN0cnVjdHVyZS5taW5MZW5ndGggIT09IHN0cnVjdHVyZS5tYXhMZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gUmFuZG9tIGxlbmd0aCB3aXRoaW4gcmFuZ2VcbiAgICAgICAgICBsZW5ndGggPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSAqIChzdHJ1Y3R1cmUubWF4TGVuZ3RoIC0gc3RydWN0dXJlLm1pbkxlbmd0aCArIDEpICtcbiAgICAgICAgICAgICAgc3RydWN0dXJlLm1pbkxlbmd0aFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVXNlIGF2ZXJhZ2UgbGVuZ3RoXG4gICAgICAgICAgbGVuZ3RoID0gc3RydWN0dXJlLmF2Z0xlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IHNvbWUgdmFyaWF0aW9uIHRvIG1ha2UgaXQgbG9vayBtb3JlIG5hdHVyYWxcbiAgICAgICAgaWYgKHJhbmRvbUxlbmd0aFZhcmlhbmNlICYmIE1hdGgucmFuZG9tKCkgPCAwLjMpIHtcbiAgICAgICAgICBsZW5ndGggPSBNYXRoLm1heCgxLCBsZW5ndGggKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAzKSAtIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGxhY2Vob2xkZXJbZmllbGRdID0gbWFza0NoYXJhY3Rlci5yZXBlYXQobGVuZ3RoKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIG11bHRpcGxlIHBsYWNlaG9sZGVyIGl0ZW1zXG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zID0gKHJhbmdlOiB7XG4gICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgZW5kOiBudW1iZXI7XG4gICAgfSk6IGFueVtdID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1zOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IHJhbmdlLnN0YXJ0OyBpIDw9IHJhbmdlLmVuZDsgaSsrKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0oaSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTaG93IHBsYWNlaG9sZGVycyBmb3IgYSByYW5nZVxuICAgICAqL1xuICAgIGNvbnN0IHNob3dQbGFjZWhvbGRlcnMgPSAocmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyhyYW5nZSk7XG5cbiAgICAgIC8vIFVwZGF0ZSBpdGVtcyBhcnJheVxuICAgICAgaWYgKGNvbXBvbmVudC5pdGVtcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYWNlaG9sZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gcmFuZ2Uuc3RhcnQgKyBpO1xuICAgICAgICAgIGlmICghY29tcG9uZW50Lml0ZW1zW2luZGV4XSkge1xuICAgICAgICAgICAgY29tcG9uZW50Lml0ZW1zW2luZGV4XSA9IHBsYWNlaG9sZGVyc1tpXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGDwn5SEIFtQTEFDRUhPTERFUlNdIFNob3dpbmcgJHtwbGFjZWhvbGRlcnMubGVuZ3RofSBwbGFjZWhvbGRlcnMgZm9yIHJhbmdlICR7cmFuZ2Uuc3RhcnR9LSR7cmFuZ2UuZW5kfWBcbiAgICAgICk7XG5cbiAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtc2hvd25cIiwge1xuICAgICAgICByYW5nZSxcbiAgICAgICAgY291bnQ6IHBsYWNlaG9sZGVycy5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYW4gaXRlbSBpcyBhIHBsYWNlaG9sZGVyXG4gICAgICovXG4gICAgY29uc3QgaXNQbGFjZWhvbGRlciA9IChpdGVtOiBhbnkpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgaXRlbVtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR10gPT09IHRydWVcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2UgcGxhY2Vob2xkZXJzIHdpdGggcmVhbCBkYXRhXG4gICAgICovXG4gICAgY29uc3QgcmVwbGFjZVBsYWNlaG9sZGVycyA9IChpdGVtczogYW55W10sIG9mZnNldDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWNvbXBvbmVudC5pdGVtcykgcmV0dXJuO1xuXG4gICAgICBsZXQgcmVwbGFjZWRDb3VudCA9IDA7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBvZmZzZXQgKyBpO1xuICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IGNvbXBvbmVudC5pdGVtc1tpbmRleF07XG5cbiAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXIoY3VycmVudEl0ZW0pKSB7XG4gICAgICAgICAgY29tcG9uZW50Lml0ZW1zW2luZGV4XSA9IGl0ZW1zW2ldO1xuICAgICAgICAgIHJlcGxhY2VkQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmVwbGFjZWRDb3VudCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYOKcqCBbUExBQ0VIT0xERVJTXSBSZXBsYWNlZCAke3JlcGxhY2VkQ291bnR9IHBsYWNlaG9sZGVycyBhdCBvZmZzZXQgJHtvZmZzZXR9YFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnBsYWNlaG9sZGVycy1yZXBsYWNlZFwiLCB7XG4gICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgIGNvdW50OiByZXBsYWNlZENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIHBsYWNlaG9sZGVyIHN0YXRlXG4gICAgICovXG4gICAgY29uc3QgY2xlYXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBmaWVsZFN0cnVjdHVyZXMgPSBudWxsO1xuICAgICAgaGFzQW5hbHl6ZWQgPSBmYWxzZTtcbiAgICAgIHBsYWNlaG9sZGVySWRDb3VudGVyID0gMDtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBmdW5jdGlvblxuICAgIGNvbnN0IGluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcblxuICAgICAgLy8gTGlzdGVuIGZvciBmaXJzdCBkYXRhIGxvYWQgdG8gYW5hbHl6ZSBzdHJ1Y3R1cmVcbiAgICAgIGlmIChhbmFseXplRmlyc3RMb2FkKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZVJhbmdlTG9hZGVkID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghaGFzQW5hbHl6ZWQgJiYgZGF0YS5pdGVtcyAmJiBkYXRhLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFuYWx5emVEYXRhU3RydWN0dXJlKGRhdGEuaXRlbXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlcGxhY2UgYW55IHBsYWNlaG9sZGVycyB3aXRoIHJlYWwgZGF0YVxuICAgICAgICAgIHJlcGxhY2VQbGFjZWhvbGRlcnMoZGF0YS5pdGVtcywgZGF0YS5vZmZzZXQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIGhhbmRsZVJhbmdlTG9hZGVkKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdyBpbml0aWFsIHBsYWNlaG9sZGVycyBpZiBjb25maWd1cmVkXG4gICAgICBjb25zdCB0b3RhbEl0ZW1zID0gY29tcG9uZW50LmNvbGxlY3Rpb24/LmdldFRvdGFsSXRlbXMoKSB8fCAwO1xuICAgICAgaWYgKHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSYW5nZSA9IHtcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IE1hdGgubWluKFxuICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLk1BWF9TQU1QTEVfU0laRSAtIDEsXG4gICAgICAgICAgICB0b3RhbEl0ZW1zIC0gMVxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICAgIHNob3dQbGFjZWhvbGRlcnMoaW5pdGlhbFJhbmdlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2xlYW51cCBmdW5jdGlvblxuICAgIGNvbnN0IGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBjbGVhcigpO1xuICAgIH07XG5cbiAgICAvLyBTdG9yZSBmdW5jdGlvbnMgZm9yIHZpZXdwb3J0IHRvIGNhbGxcbiAgICAoY29tcG9uZW50IGFzIGFueSkuX3BsYWNlaG9sZGVyc0luaXRpYWxpemUgPSBpbml0aWFsaXplO1xuICAgIChjb21wb25lbnQgYXMgYW55KS5fcGxhY2Vob2xkZXJzRGVzdHJveSA9IGRlc3Ryb3k7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHBsYWNlaG9sZGVyczoge1xuICAgICAgICBhbmFseXplRGF0YVN0cnVjdHVyZSxcbiAgICAgICAgaGFzQW5hbHl6ZWRTdHJ1Y3R1cmU6ICgpID0+IGhhc0FuYWx5emVkLFxuICAgICAgICBnZW5lcmF0ZVBsYWNlaG9sZGVySXRlbSxcbiAgICAgICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zLFxuICAgICAgICBzaG93UGxhY2Vob2xkZXJzLFxuICAgICAgICBpc1BsYWNlaG9sZGVyLFxuICAgICAgICByZXBsYWNlUGxhY2Vob2xkZXJzLFxuICAgICAgICBjbGVhcixcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsCiAgICAiLyoqXG4gKiBSZW5kZXJpbmcgRmVhdHVyZSAtIEl0ZW0gcmVuZGVyaW5nIGFuZCBwb3NpdGlvbmluZyBmb3Igdmlld3BvcnRcbiAqIEhhbmRsZXMgRE9NIGVsZW1lbnQgY3JlYXRpb24sIHBvc2l0aW9uaW5nLCByZWN5Y2xpbmcsIGFuZCB1cGRhdGVzXG4gKi9cblxuaW1wb3J0IHsgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzLCBoYXNDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGlzUGxhY2Vob2xkZXIsXG4gIGdldFZpZXdwb3J0U3RhdGUsXG4gIHdyYXBJbml0aWFsaXplLFxuICB3cmFwRGVzdHJveSxcbn0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUxheW91dCB9IGZyb20gXCIuLi8uLi9sYXlvdXRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJpbmdDb25maWcge1xuICB0ZW1wbGF0ZT86IChcbiAgICBpdGVtOiBhbnksXG4gICAgaW5kZXg6IG51bWJlcixcbiAgKSA9PiBzdHJpbmcgfCBIVE1MRWxlbWVudCB8IGFueVtdIHwgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgb3ZlcnNjYW4/OiBudW1iZXI7XG4gIG1lYXN1cmVJdGVtcz86IGJvb2xlYW47XG4gIGVuYWJsZVJlY3ljbGluZz86IGJvb2xlYW47XG4gIG1heFBvb2xTaXplPzogbnVtYmVyO1xuICAvKipcbiAgICogTWFpbnRhaW4gRE9NIG9yZGVyIHRvIG1hdGNoIHZpc3VhbCBpbmRleCBvcmRlci5cbiAgICogRW5hYmxlcyBDU1Mgc2VsZWN0b3JzIGxpa2UgOmZpcnN0LWNoaWxkLCA6bnRoLWNoaWxkKCkgdG8gd29yayBjb3JyZWN0bHkuXG4gICAqIERlZmF1bHQ6IHRydWVcbiAgICovXG4gIG1haW50YWluRG9tT3JkZXI/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVmlld3BvcnRTdGF0ZSB7XG4gIHNjcm9sbFBvc2l0aW9uOiBudW1iZXI7XG4gIHRvdGFsSXRlbXM6IG51bWJlcjtcbiAgaXRlbVNpemU6IG51bWJlcjtcbiAgY29udGFpbmVyU2l6ZTogbnVtYmVyO1xuICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXI7XG4gIHZpc2libGVSYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9O1xuICBpdGVtc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsO1xufVxuXG4vKipcbiAqIFJlbmRlcmluZyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFJlbmRlcmluZyA9IChjb25maWc6IFJlbmRlcmluZ0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7XG4gICAgICB0ZW1wbGF0ZSxcbiAgICAgIG92ZXJzY2FuID0gNSxcbiAgICAgIG1lYXN1cmVJdGVtcyA9IGZhbHNlLFxuICAgICAgZW5hYmxlUmVjeWNsaW5nID0gdHJ1ZSxcbiAgICAgIG1heFBvb2xTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLlJFTkRFUklORy5ERUZBVUxUX01BWF9QT09MX1NJWkUsXG4gICAgICBtYWludGFpbkRvbU9yZGVyID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gSGVscGVyIHRvIGdldCBpdGVtcyBmcm9tIGNvbGxlY3Rpb24gKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgpXG4gICAgY29uc3QgZ2V0Q29sbGVjdGlvbkl0ZW1zID0gKCk6IGFueVtdID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5pdGVtcyB8fCAoY29tcG9uZW50IGFzIGFueSkuaXRlbXMgfHwgW11cbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFN0YXRlXG4gICAgY29uc3QgcmVuZGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBIVE1MRWxlbWVudD4oKTtcbiAgICBjb25zdCBlbGVtZW50UG9vbDogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGNvbnN0IHBvb2xTdGF0cyA9IHsgY3JlYXRlZDogMCwgcmVjeWNsZWQ6IDAsIHBvb2xTaXplOiAwLCByZWxlYXNlZDogMCB9O1xuXG4gICAgLy8gU3RvcmUgbGF5b3V0IHJlc3VsdHMgZm9yIHByb3BlciBjbGVhbnVwIChwcmV2ZW50cyBtZW1vcnkgbGVhaylcbiAgICBjb25zdCBsYXlvdXRSZXN1bHRzID0gbmV3IFdlYWtNYXA8SFRNTEVsZW1lbnQsIHsgZGVzdHJveTogKCkgPT4gdm9pZCB9PigpO1xuXG4gICAgLy8gUmV1c2FibGUgdGVtcGxhdGUgZWxlbWVudCBmb3IgSFRNTCBzdHJpbmcgcGFyc2luZyAobW9yZSBlZmZpY2llbnQgdGhhbiBkaXYpXG4gICAgY29uc3QgdGVtcGxhdGVQYXJzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5cbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogVmlld3BvcnRTdGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgbGV0IGxhc3RSZW5kZXJUaW1lID0gMDtcbiAgICBsZXQgaXNSZW1vdmluZ0l0ZW0gPSBmYWxzZTtcblxuICAgIC8vIEVsZW1lbnQgcG9vbCBtYW5hZ2VtZW50XG4gICAgY29uc3QgZ2V0UG9vbGVkRWxlbWVudCA9ICgpOiBIVE1MRWxlbWVudCA9PiB7XG4gICAgICBpZiAoZW5hYmxlUmVjeWNsaW5nICYmIGVsZW1lbnRQb29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcG9vbFN0YXRzLnJlY3ljbGVkKys7XG4gICAgICAgIHJldHVybiBlbGVtZW50UG9vbC5wb3AoKSE7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIjtcbiAgICAgIHBvb2xTdGF0cy5jcmVhdGVkKys7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVsZWFzZUVsZW1lbnQgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgIHBvb2xTdGF0cy5yZWxlYXNlZCsrO1xuXG4gICAgICAvLyBDUklUSUNBTDogQ2FsbCBkZXN0cm95IG9uIGxheW91dFJlc3VsdCB0byBjbGVhbiB1cCBjb21wb25lbnRzIGFuZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgIC8vIFRoaXMgZml4ZXMgdGhlIG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgbGF5b3V0IHRlbXBsYXRlc1xuICAgICAgY29uc3QgbGF5b3V0UmVzdWx0ID0gbGF5b3V0UmVzdWx0cy5nZXQoZWxlbWVudCk7XG4gICAgICBpZiAobGF5b3V0UmVzdWx0ICYmIHR5cGVvZiBsYXlvdXRSZXN1bHQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGF5b3V0UmVzdWx0LmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIElnbm9yZSBkZXN0cm95IGVycm9ycyAtIGVsZW1lbnQgbWF5IGFscmVhZHkgYmUgY2xlYW5lZCB1cFxuICAgICAgICB9XG4gICAgICAgIGxheW91dFJlc3VsdHMuZGVsZXRlKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVuYWJsZVJlY3ljbGluZykge1xuICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBDbGVhbiBlbGVtZW50IGZvciByZXVzZSAobm8gY2xvbmluZyAtIHJldXNlIHRoZSBhY3R1YWwgZWxlbWVudClcbiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIjtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1pbmRleFwiKTtcbiAgICAgIGVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IFwiXCI7XG4gICAgICBlbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XG5cbiAgICAgIC8vIFJlbW92ZSBmcm9tIERPTSBmaXJzdFxuICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0byBwb29sIGlmIG5vdCBmdWxsXG4gICAgICBpZiAoZWxlbWVudFBvb2wubGVuZ3RoIDwgbWF4UG9vbFNpemUpIHtcbiAgICAgICAgZWxlbWVudFBvb2wucHVzaChlbGVtZW50KTtcbiAgICAgICAgcG9vbFN0YXRzLnBvb2xTaXplID0gZWxlbWVudFBvb2wubGVuZ3RoO1xuICAgICAgfVxuICAgICAgLy8gSWYgcG9vbCBpcyBmdWxsLCBlbGVtZW50IGlzIGp1c3QgZGVyZWZlcmVuY2VkIGFuZCBHQydkXG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemVcbiAgICB3cmFwSW5pdGlhbGl6ZShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHZpZXdwb3J0U3RhdGUgPSBnZXRWaWV3cG9ydFN0YXRlKGNvbXBvbmVudCkgYXMgVmlld3BvcnRTdGF0ZTtcblxuICAgICAgLy8gU2V0IGluaXRpYWwgaXRlbXMgY29udGFpbmVyIGhlaWdodCBmcm9tIGN1cnJlbnQgdmlydHVhbCBzaXplXG4gICAgICBpZiAodmlld3BvcnRTdGF0ZT8uaXRlbXNDb250YWluZXIgJiYgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID4gMCkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke3ZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZX1weGA7XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbSB1cGRhdGUgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbTp1cGRhdGUtcmVxdWVzdFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGl0ZW0sIHByZXZpb3VzSXRlbSB9ID0gZGF0YTtcblxuICAgICAgICAvLyBJdGVtIGlzIGFscmVhZHkgdXBkYXRlZCBpbiBjb2xsZWN0aW9uLml0ZW1zIGJ5IGFwaS50c1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXRlbSBpcyBjdXJyZW50bHkgcmVuZGVyZWRcbiAgICAgICAgY29uc3QgZXhpc3RpbmdFbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoaW5kZXgpO1xuICAgICAgICBjb25zdCB3YXNWaXNpYmxlID0gISFleGlzdGluZ0VsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaXRlbSB3YXMgc2VsZWN0ZWQgYmVmb3JlIHVwZGF0ZVxuICAgICAgICBjb25zdCB3YXNTZWxlY3RlZCA9IGV4aXN0aW5nRWxlbWVudFxuICAgICAgICAgID8gaGFzQ2xhc3MoXG4gICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudCxcbiAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNFTEVDVElPTi5TRUxFQ1RFRF9DTEFTUyxcbiAgICAgICAgICAgICkgfHwgaGFzQ2xhc3MoZXhpc3RpbmdFbGVtZW50LCBcIm10cmwtdmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIilcbiAgICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAgIGlmIChleGlzdGluZ0VsZW1lbnQgJiYgZXhpc3RpbmdFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAvLyBSZS1yZW5kZXIgdGhlIGl0ZW1cbiAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpbmRleCk7XG5cbiAgICAgICAgICBpZiAobmV3RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gQ29weSBwb3NpdGlvbiBzdHlsZXMgZnJvbSBleGlzdGluZyBlbGVtZW50XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgICAgcG9zaXRpb246IGV4aXN0aW5nRWxlbWVudC5zdHlsZS5wb3NpdGlvbixcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiBleGlzdGluZ0VsZW1lbnQuc3R5bGUudHJhbnNmb3JtLFxuICAgICAgICAgICAgICB3aWR0aDogZXhpc3RpbmdFbGVtZW50LnN0eWxlLndpZHRoLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFByZXNlcnZlIHNlbGVjdGVkIHN0YXRlXG4gICAgICAgICAgICBpZiAod2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlNFTEVDVElPTi5TRUxFQ1RFRF9DTEFTUyk7XG4gICAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFwibXRybC12aWV3cG9ydC1pdGVtLS1zZWxlY3RlZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIHVwZGF0ZSBhbmltYXRpb24gY2xhc3MgdG8gaW5uZXIgY29udGVudCBmb3IgdmlzaWJpbGl0eVxuICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS11cGRhdGVkXCIpO1xuICAgICAgICAgICAgLy8gQWxzbyB0cnkgdG8gYWRkIHRvIGZpcnN0IGNoaWxkIGlmIGl0IGV4aXN0cyAodGhlIGFjdHVhbCBpdGVtIGNvbnRlbnQpXG4gICAgICAgICAgICBjb25zdCBpbm5lckl0ZW0gPSBuZXdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYgKGlubmVySXRlbSkge1xuICAgICAgICAgICAgICBhZGRDbGFzcyhpbm5lckl0ZW0sIFwiaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVwbGFjZSBpbiBET01cbiAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChcbiAgICAgICAgICAgICAgbmV3RWxlbWVudCxcbiAgICAgICAgICAgICAgZXhpc3RpbmdFbGVtZW50LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGluZGV4LCBuZXdFbGVtZW50KTtcbiAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGV4aXN0aW5nRWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYW5pbWF0aW9uIGNsYXNzIGFmdGVyIHRyYW5zaXRpb25cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICByZW1vdmVDbGFzcyhuZXdFbGVtZW50LCBcInZpZXdwb3J0LWl0ZW0tLXVwZGF0ZWRcIik7XG4gICAgICAgICAgICAgIGlmIChpbm5lckl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhpbm5lckl0ZW0sIFwiaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06dXBkYXRlZFwiLCB7XG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBwcmV2aW91c0l0ZW0sXG4gICAgICAgICAgd2FzVmlzaWJsZSxcbiAgICAgICAgICB3YXNTZWxlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtIHJlbW92ZSByZXF1ZXN0cyBmcm9tIEFQSVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtOnJlbW92ZS1yZXF1ZXN0XCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgaXRlbSB9ID0gZGF0YTtcbiAgICAgICAgaXNSZW1vdmluZ0l0ZW0gPSB0cnVlO1xuXG4gICAgICAgIC8vIEl0ZW0gaXMgYWxyZWFkeSByZW1vdmVkIGZyb20gY29sbGVjdGlvbi5pdGVtcyBieSBhcGkudHNcbiAgICAgICAgLy8gV2UganVzdCBuZWVkIHRvIHVwZGF0ZSByZW5kZXJlZCBlbGVtZW50c1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcmVuZGVyZWQgZWxlbWVudCBhdCB0aGlzIGluZGV4XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGV4aXN0aW5nRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuXG4gICAgICAgIC8vIFNoaWZ0IHJlbmRlcmVkIGVsZW1lbnRzIGluZGljZXMgZG93blxuICAgICAgICBjb25zdCByZW5kZXJlZEtleXMgPSBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMua2V5cygpKS5zb3J0KFxuICAgICAgICAgIChhLCBiKSA9PiBhIC0gYixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbmV3UmVuZGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVuZGVyZWRLZXlzKSB7XG4gICAgICAgICAgaWYgKGtleSA+IGluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSBkYXRhLWluZGV4IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5kZXggPSBTdHJpbmcoa2V5IC0gMSk7XG4gICAgICAgICAgICAgIG5ld1JlbmRlcmVkRWxlbWVudHMuc2V0KGtleSAtIDEsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5IDwgaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5zZXQoa2V5LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVsZW1lbnRdIG9mIG5ld1JlbmRlcmVkRWxlbWVudHMpIHtcbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChrZXksIGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVjcmVtZW50IHRvdGFsSXRlbXMgTk9XIHNvIHJlbmRlckl0ZW1zKCkgdXNlcyB0aGUgY29ycmVjdCBjb3VudFxuICAgICAgICAvLyBzZXRUb3RhbEl0ZW1zKCkgd2lsbCBiZSBjYWxsZWQgbGF0ZXIgYnkgdGhlIEFQSSwgd2hpY2ggd2lsbCBlbWl0XG4gICAgICAgIC8vIHZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWQgZm9yIHZpcnR1YWwgc2l6ZSByZWNhbGN1bGF0aW9uXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlICYmIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHZpc2libGUgcmFuZ2UgdG8gZm9yY2UgcmUtcmVuZGVyXG4gICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuXG4gICAgICAgIC8vIEVtaXQgY29tcGxldGlvbiBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTpyZW1vdmVkXCIsIHtcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZnRlciBpdGVtIHJlbW92YWwsIGNsZWFyIEFMTCBsb2FkZWRSYW5nZXNcbiAgICAgICAgLy8gVGhpcyBmb3JjZXMgYSBjb21wbGV0ZSByZWxvYWQgd2hpY2ggaXMgbW9yZSByZWxpYWJsZSB0aGFuIHRyeWluZyB0b1xuICAgICAgICAvLyB0cmFjayBzaGlmdGVkIGluZGljZXMuIFRoZSBpdGVtcyBhcnJheSBoYXMgYmVlbiBzcGxpY2VkIGFuZCBhbGwgaW5kaWNlc1xuICAgICAgICAvLyBhcmUgbm93IGRpZmZlcmVudCBmcm9tIHdoYXQgbG9hZGVkUmFuZ2VzIHRoaW5rcyB0aGV5IGFyZS5cbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldExvYWRlZFJhbmdlcykge1xuICAgICAgICAgIGNvbnN0IGxvYWRlZFJhbmdlcyA9IGNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCk7XG4gICAgICAgICAgbG9hZGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIHJlbG9hZCBvZiB2aXNpYmxlIHJhbmdlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25JdGVtc0FyciA9IGdldENvbGxlY3Rpb25JdGVtcygpO1xuICAgICAgICBjb25zdCBsb2FkZWRJdGVtc0NvdW50ID0gY29sbGVjdGlvbkl0ZW1zQXJyLmxlbmd0aDtcbiAgICAgICAgY29uc3QgdmlzaWJsZVJhbmdlID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2U/LigpO1xuICAgICAgICBpZiAodmlzaWJsZVJhbmdlICYmIGNvbGxlY3Rpb24/LmxvYWRNaXNzaW5nUmFuZ2VzKSB7XG4gICAgICAgICAgY29sbGVjdGlvbi5sb2FkTWlzc2luZ1JhbmdlcyhcbiAgICAgICAgICAgIHsgc3RhcnQ6IDAsIGVuZDogTWF0aC5tYXgodmlzaWJsZVJhbmdlLmVuZCwgbG9hZGVkSXRlbXNDb3VudCkgfSxcbiAgICAgICAgICAgIFwiaXRlbS1yZW1vdmFsXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgcmUtcmVuZGVyXG4gICAgICAgIHJlbmRlckl0ZW1zKCk7XG4gICAgICAgIGlzUmVtb3ZpbmdJdGVtID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtcyBhZGQgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbXM6YWRkLXJlcXVlc3RcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGl0ZW1zOiBuZXdJdGVtcywgcG9zaXRpb24sIHByZXZpb3VzQ291bnQgfSA9IGRhdGE7XG5cbiAgICAgICAgaWYgKCFuZXdJdGVtcyB8fCBuZXdJdGVtcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICAvLyBJdGVtcyBhcmUgYWxyZWFkeSBhZGRlZCB0byBjb2xsZWN0aW9uLml0ZW1zIGJ5IGFwaS50c1xuICAgICAgICAvLyBXZSBqdXN0IG5lZWQgdG8gdXBkYXRlIHJlbmRlcmVkIGVsZW1lbnRzIGluZGljZXMgaWYgcHJlcGVuZGluZ1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zQWRkZWQgPSBuZXdJdGVtcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgICAvLyBJdGVtcyB3ZXJlIHByZXBlbmRlZCAtIHNoaWZ0IHJlbmRlcmVkIGVsZW1lbnQgaW5kaWNlc1xuICAgICAgICAgIGNvbnN0IHJlbmRlcmVkS2V5cyA9IEFycmF5LmZyb20ocmVuZGVyZWRFbGVtZW50cy5rZXlzKCkpLnNvcnQoXG4gICAgICAgICAgICAoYSwgYikgPT4gYiAtIGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBuZXdSZW5kZXJlZEVsZW1lbnRzID0gbmV3IE1hcDxudW1iZXIsIEhUTUxFbGVtZW50PigpO1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHJlbmRlcmVkS2V5cykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGtleSkhO1xuICAgICAgICAgICAgY29uc3QgbmV3SW5kZXggPSBrZXkgKyBpdGVtc0FkZGVkO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWluZGV4XCIsIFN0cmluZyhuZXdJbmRleCkpO1xuICAgICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5zZXQobmV3SW5kZXgsIGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmNsZWFyKCk7XG4gICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5mb3JFYWNoKChlbCwgaWR4KSA9PlxuICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoaWR4LCBlbCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgYXBwZW5kLCBubyBpbmRleCBzaGlmdGluZyBuZWVkZWRcblxuICAgICAgICAvLyBVcGRhdGUgdG90YWxJdGVtcyBpbiB2aWV3cG9ydFN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID1cbiAgICAgICAgICAgICh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgfHwgMCkgKyBpdGVtc0FkZGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgdmlzaWJsZSByYW5nZSB0byBmb3JjZSByZS1yZW5kZXJcbiAgICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG5cbiAgICAgICAgLy8gQ2xlYXIgbG9hZGVkUmFuZ2VzIHRvIGVuc3VyZSBwcm9wZXIgcmVsb2FkIHRyYWNraW5nXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSk/LmNvbGxlY3Rpb247XG4gICAgICAgIGlmIChjb2xsZWN0aW9uPy5nZXRMb2FkZWRSYW5nZXMpIHtcbiAgICAgICAgICBjb25zdCBsb2FkZWRSYW5nZXMgPSBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpO1xuICAgICAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZS1yZW5kZXJcbiAgICAgICAgcmVuZGVySXRlbXMoKTtcblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW1zOnJlbmRlci1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgaXRlbXM6IG5ld0l0ZW1zLFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIHRvdGFsOiB2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zIHx8IDAsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBpdGVtcyBldmljdGVkIC0gY2xlYW4gdXAgcmVuZGVyZWQgZWxlbWVudHNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjppdGVtcy1ldmljdGVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBrZWVwU3RhcnQsIGtlZXBFbmQgfSA9IGRhdGE7XG5cbiAgICAgICAgLy8gUmVsZWFzZSByZW5kZXJlZCBlbGVtZW50cyBvdXRzaWRlIHRoZSBrZWVwIHJhbmdlXG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoaW5kZXggPCBrZWVwU3RhcnQgfHwgaW5kZXggPiBrZWVwRW5kKSB7XG4gICAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiByZXNldCB0byBjbGVhciByZW5kZXJpbmcgc3RhdGVcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyZXNldFwiLCAoKSA9PiB7XG4gICAgICAgIC8vIFJlbGVhc2UgYW5kIGNsZWFyIGFsbCByZW5kZXJlZCBlbGVtZW50c1xuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcblxuICAgICAgICAvLyBSZXNldCB2aXNpYmxlIHJhbmdlIHRyYWNraW5nXG4gICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBkYXRhIGxvYWRlZFxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmICghZGF0YS5pdGVtcz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgLy8gQW5hbHl6ZSBkYXRhIHN0cnVjdHVyZSBvbiBmaXJzdCBsb2FkXG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IChjb21wb25lbnQgYXMgYW55KS5wbGFjZWhvbGRlcnM7XG4gICAgICAgIGlmIChwbGFjZWhvbGRlcnMgJiYgIXBsYWNlaG9sZGVycy5oYXNBbmFseXplZFN0cnVjdHVyZSgpKSB7XG4gICAgICAgICAgcGxhY2Vob2xkZXJzLmFuYWx5emVEYXRhU3RydWN0dXJlKGRhdGEuaXRlbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXRlbXMgYXJlIGFscmVhZHkgaW4gY29sbGVjdGlvbi5pdGVtcyAtIHJlcGxhY2UgYW55IHBsYWNlaG9sZGVyIERPTSBlbGVtZW50c1xuICAgICAgICBkYXRhLml0ZW1zLmZvckVhY2goKGl0ZW06IGFueSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhLm9mZnNldCArIGk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGN1cnJlbnQgcmVuZGVyZWQgZWxlbWVudCBpcyBhIHBsYWNlaG9sZGVyIHRoYXQgbmVlZHMgcmVwbGFjaW5nXG4gICAgICAgICAgLy8gTm90ZTogVGhlIGFjdHVhbCBjbGFzcyBoYXMgJ210cmwtJyBwcmVmaXgsIHNvIGNoZWNrIGZvciBib3RoXG4gICAgICAgICAgY29uc3QgaXNQbGFjZWhvbGRlckVsZW1lbnQgPVxuICAgICAgICAgICAgZWxlbWVudD8uY2xhc3NMaXN0LmNvbnRhaW5zKFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUykgfHxcbiAgICAgICAgICAgIGVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucyhcbiAgICAgICAgICAgICAgYG10cmwtJHtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1N9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXJFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpbmRleCk7XG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudCkge1xuICAgICAgICAgICAgICAvLyBSZW1vdmUgcGxhY2Vob2xkZXIgY2xhc3NlcyBmcm9tIHdyYXBwZXJcbiAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgICAgICAgLy8gQWxzbyByZW1vdmUgZnJvbSBpbm5lciBlbGVtZW50IChmb3Igc3RyaW5nIHRlbXBsYXRlcylcbiAgICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1MsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIEFkZCByZXBsYWNlZCBjbGFzcyBmb3IgZmFkZS1pbiBhbmltYXRpb25cbiAgICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS1yZXBsYWNlZFwiKTtcblxuICAgICAgICAgICAgICAvLyBDb3B5IHBvc2l0aW9uIGFuZCByZXBsYWNlXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3RWxlbWVudC5zdHlsZSwge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBlbGVtZW50LnN0eWxlLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgd2lkdGg6IGVsZW1lbnQuc3R5bGUud2lkdGgsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBlbGVtZW50LnBhcmVudE5vZGU/LnJlcGxhY2VDaGlsZChuZXdFbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoaW5kZXgsIG5ld0VsZW1lbnQpO1xuICAgICAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHJlcGxhY2VkIGNsYXNzIGFmdGVyIGFuaW1hdGlvbiBjb21wbGV0ZXNcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS1yZXBsYWNlZFwiKTtcbiAgICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIHJlbmRlckl0ZW0gcmV0dXJuZWQgbnVsbCAtIHN0aWxsIHJlbGVhc2UgdGhlIG9sZCBlbGVtZW50XG4gICAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmRlbGV0ZShpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHJlbmRlciBuZXcgaXRlbXMgKGl0ZW1zIHRoYXQgd2VyZW4ndCByZW5kZXJlZCBhdCBhbGwpXG4gICAgICAgIGNvbnN0IHsgdmlzaWJsZVJhbmdlIH0gPSB2aWV3cG9ydFN0YXRlIHx8IHt9O1xuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgY29uc3QgcmVuZGVyU3RhcnQgPSBNYXRoLm1heCgwLCB2aXNpYmxlUmFuZ2Uuc3RhcnQgLSBvdmVyc2Nhbik7XG4gICAgICAgICAgY29uc3QgcmVuZGVyRW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zID8/IDAgLSAxLFxuICAgICAgICAgICAgdmlzaWJsZVJhbmdlLmVuZCArIG92ZXJzY2FuLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgbG9hZGVkU3RhcnQgPSBkYXRhLm9mZnNldDtcbiAgICAgICAgICBjb25zdCBsb2FkZWRFbmQgPSBkYXRhLm9mZnNldCArIGRhdGEuaXRlbXMubGVuZ3RoIC0gMTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGxvYWRlZCBkYXRhIG92ZXJsYXBzIHdpdGggcmVuZGVyIHJhbmdlIGFuZCB3ZSdyZSBtaXNzaW5nIHJlbmRlcmVkIGVsZW1lbnRzXG4gICAgICAgICAgY29uc3QgbmVlZHNSZW5kZXIgPVxuICAgICAgICAgICAgbG9hZGVkU3RhcnQgPD0gcmVuZGVyRW5kICYmXG4gICAgICAgICAgICBsb2FkZWRFbmQgPj0gcmVuZGVyU3RhcnQgJiZcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA8IHJlbmRlckVuZCAtIHJlbmRlclN0YXJ0ICsgMTtcblxuICAgICAgICAgIGlmIChuZWVkc1JlbmRlcikgcmVuZGVySXRlbXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgZXZlbnRzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIiwgcmVuZGVySXRlbXMpO1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwgdXBkYXRlSXRlbVBvc2l0aW9ucyk7XG5cbiAgICAgIC8vIFVwZGF0ZSBpdGVtcyBjb250YWluZXIgaGVpZ2h0IHdoZW4gdmlydHVhbCBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmlydHVhbC1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8uaXRlbXNDb250YWluZXIgJiZcbiAgICAgICAgICBkYXRhLnRvdGFsVmlydHVhbFNpemUgIT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke2RhdGEudG90YWxWaXJ0dWFsU2l6ZX1weGA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVtcGxhdGUgaGVscGVyc1xuICAgIGNvbnN0IGdldERlZmF1bHRUZW1wbGF0ZSA9ICgpID0+IChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIC8vIFVzZSBsYXlvdXQgc3lzdGVtIGZvciBkZWZhdWx0IHRlbXBsYXRlXG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICAgIGNsYXNzOiBcInZpZXdwb3J0LWl0ZW1cIixcbiAgICAgICAgICB0ZXh0OlxuICAgICAgICAgICAgdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgPyBpdGVtLm5hbWUgfHwgaXRlbS5sYWJlbCB8fCBpdGVtLnRleHQgfHwgYEl0ZW0gJHtpbmRleH1gXG4gICAgICAgICAgICAgIDogU3RyaW5nKGl0ZW0pLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9O1xuXG4gICAgLy8gUHJvY2VzcyBsYXlvdXQgc2NoZW1hIHdpdGggaXRlbSBkYXRhIHN1YnN0aXR1dGlvblxuICAgIGNvbnN0IHByb2Nlc3NMYXlvdXRTY2hlbWEgPSAoXG4gICAgICBzY2hlbWE6IGFueSxcbiAgICAgIGl0ZW06IGFueSxcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgKTogYW55ID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIC8vIEhhbmRsZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24gbGlrZSB7e25hbWV9fSwge3tpbmRleH19XG4gICAgICAgIHJldHVybiBzY2hlbWEucmVwbGFjZSgvXFx7XFx7KFtefV0rKVxcfVxcfS9nLCAobWF0Y2gsIGtleSkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgPT09IFwiaW5kZXhcIikgcmV0dXJuIFN0cmluZyhpbmRleCk7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJpdGVtXCIpIHJldHVybiBTdHJpbmcoaXRlbSk7XG5cbiAgICAgICAgICAvLyBIYW5kbGUgbmVzdGVkIHByb3BlcnRpZXMgbGlrZSB7e3VzZXIubmFtZX19XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBrZXkuc3BsaXQoXCIuXCIpLnJlZHVjZSgob2JqOiBhbnksIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG9iaj8uW3Byb3AudHJpbSgpXTtcbiAgICAgICAgICB9LCBpdGVtKTtcblxuICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHZhbHVlKSA6IG1hdGNoO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hLm1hcCgoY2hpbGQpID0+IHByb2Nlc3NMYXlvdXRTY2hlbWEoY2hpbGQsIGl0ZW0sIGluZGV4KSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiICYmIHNjaGVtYSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwcm9jZXNzZWQ6IGFueSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWEpKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkW2tleV0gPSBwcm9jZXNzTGF5b3V0U2NoZW1hKHZhbHVlLCBpdGVtLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNjaGVtYTtcbiAgICB9O1xuXG4gICAgLy8gUG9zaXRpb24gY2FsY3VsYXRpb25cbiAgICBjb25zdCBjYWxjdWxhdGVJdGVtUG9zaXRpb24gPSAoXG4gICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgc2Nyb2xsUG9zaXRpb246IG51bWJlcixcbiAgICAgIHRvdGFsSXRlbXM6IG51bWJlcixcbiAgICAgIGl0ZW1TaXplOiBudW1iZXIsXG4gICAgICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXIsXG4gICAgICBjb250YWluZXJTaXplOiBudW1iZXIsXG4gICAgICB0YXJnZXRTY3JvbGxJbmRleD86IG51bWJlcixcbiAgICApOiBudW1iZXIgPT4ge1xuICAgICAgY29uc3QgYWN0dWFsVG90YWxTaXplID0gdG90YWxJdGVtcyAqIGl0ZW1TaXplO1xuICAgICAgY29uc3QgaXNDb21wcmVzc2VkID1cbiAgICAgICAgYWN0dWFsVG90YWxTaXplID4gdmlydHVhbFRvdGFsU2l6ZSAmJiB2aXJ0dWFsVG90YWxTaXplID4gMDtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRhcmdldFNjcm9sbEluZGV4IChmcm9tIGluaXRpYWxTY3JvbGxJbmRleCksIHVzZSBpdCBkaXJlY3RseVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIGl0ZW1zIGFyZSBwb3NpdGlvbmVkIGNvcnJlY3RseSBldmVuIHdpdGggY29tcHJlc3Npb25cbiAgICAgIGlmICh0YXJnZXRTY3JvbGxJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAvLyBQb3NpdGlvbiBpdGVtcyByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGluZGV4XG4gICAgICAgIC8vIFRoZSB0YXJnZXQgaW5kZXggc2hvdWxkIGFwcGVhciBhdCB0aGUgdG9wIG9mIHRoZSB2aWV3cG9ydFxuICAgICAgICByZXR1cm4gKGluZGV4IC0gdGFyZ2V0U2Nyb2xsSW5kZXgpICogaXRlbVNpemU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNDb21wcmVzc2VkIHx8IHRvdGFsSXRlbXMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ICogaXRlbVNpemUgLSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gQ29tcHJlc3NlZCBzcGFjZSBoYW5kbGluZ1xuICAgICAgY29uc3QgbWF4U2Nyb2xsUG9zaXRpb24gPSB2aXJ0dWFsVG90YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbFBvc2l0aW9uIC0gc2Nyb2xsUG9zaXRpb247XG4gICAgICBjb25zdCBuZWFyQm90dG9tVGhyZXNob2xkID0gY29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKFxuICAgICAgICBkaXN0YW5jZUZyb21Cb3R0b20gPD0gbmVhckJvdHRvbVRocmVzaG9sZCAmJlxuICAgICAgICBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTFcbiAgICAgICkge1xuICAgICAgICAvLyBOZWFyIGJvdHRvbSBpbnRlcnBvbGF0aW9uXG4gICAgICAgIGNvbnN0IGl0ZW1zQXRCb3R0b20gPSBNYXRoLmZsb29yKGNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG4gICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUF0Qm90dG9tID0gTWF0aC5tYXgoMCwgdG90YWxJdGVtcyAtIGl0ZW1zQXRCb3R0b20pO1xuICAgICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgICAgY29uc3QgZXhhY3RTY3JvbGxJbmRleCA9IHNjcm9sbFJhdGlvICogdG90YWxJdGVtcztcbiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgIDAsXG4gICAgICAgICAgTWF0aC5taW4oMSwgMSAtIGRpc3RhbmNlRnJvbUJvdHRvbSAvIG5lYXJCb3R0b21UaHJlc2hvbGQpLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGJvdHRvbVBvc2l0aW9uID0gKGluZGV4IC0gZmlyc3RWaXNpYmxlQXRCb3R0b20pICogaXRlbVNpemU7XG4gICAgICAgIGNvbnN0IG5vcm1hbFBvc2l0aW9uID0gKGluZGV4IC0gZXhhY3RTY3JvbGxJbmRleCkgKiBpdGVtU2l6ZTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBub3JtYWxQb3NpdGlvbiArIChib3R0b21Qb3NpdGlvbiAtIG5vcm1hbFBvc2l0aW9uKSAqIGludGVycG9sYXRpb25cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gTm9ybWFsIGNvbXByZXNzZWQgc2Nyb2xsaW5nXG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgIHJldHVybiAoaW5kZXggLSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXMpICogaXRlbVNpemU7XG4gICAgfTtcblxuICAgIC8vIFJlbmRlciBzaW5nbGUgaXRlbVxuICAgIGNvbnN0IHJlbmRlckl0ZW0gPSAoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKTogSFRNTEVsZW1lbnQgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1UZW1wbGF0ZSA9IHRlbXBsYXRlIHx8IGdldERlZmF1bHRUZW1wbGF0ZSgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBpdGVtVGVtcGxhdGUoaXRlbSwgaW5kZXgpO1xuICAgICAgICBsZXQgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgcmVzdWx0IGlzIGEgbGF5b3V0IHNjaGVtYSAoYXJyYXkgb3Igb2JqZWN0KVxuICAgICAgICBpZiAoXG4gICAgICAgICAgQXJyYXkuaXNBcnJheShyZXN1bHQpIHx8XG4gICAgICAgICAgKHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIHJlc3VsdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIShyZXN1bHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFByb2Nlc3Mgc2NoZW1hIHRvIHN1YnN0aXR1dGUgdmFyaWFibGVzXG4gICAgICAgICAgY29uc3QgcHJvY2Vzc2VkU2NoZW1hID0gcHJvY2Vzc0xheW91dFNjaGVtYShyZXN1bHQsIGl0ZW0sIGluZGV4KTtcblxuICAgICAgICAgIC8vIFVzZSBsYXlvdXQgc3lzdGVtIHRvIGNyZWF0ZSBlbGVtZW50XG4gICAgICAgICAgY29uc3QgbGF5b3V0UmVzdWx0ID0gY3JlYXRlTGF5b3V0KHByb2Nlc3NlZFNjaGVtYSk7XG4gICAgICAgICAgZWxlbWVudCA9IGxheW91dFJlc3VsdC5lbGVtZW50O1xuXG4gICAgICAgICAgLy8gSWYgdGhlIGxheW91dCBjcmVhdGVkIGEgd3JhcHBlciwgdXNlIGl0IGRpcmVjdGx5XG4gICAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gRWxlbWVudCBpcyBhbHJlYWR5IGNyZWF0ZWQgYnkgbGF5b3V0IHN5c3RlbVxuICAgICAgICAgICAgLy8gU3RvcmUgbGF5b3V0UmVzdWx0IGZvciBjbGVhbnVwIHdoZW4gZWxlbWVudCBpcyByZWxlYXNlZCAocHJldmVudHMgbWVtb3J5IGxlYWspXG4gICAgICAgICAgICBsYXlvdXRSZXN1bHRzLnNldChlbGVtZW50LCBsYXlvdXRSZXN1bHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjayBpZiBsYXlvdXQgZGlkbid0IGNyZWF0ZSBhIHByb3BlciBlbGVtZW50XG4gICAgICAgICAgICBlbGVtZW50ID0gZ2V0UG9vbGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgaWYgKGxheW91dFJlc3VsdC5lbGVtZW50KSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobGF5b3V0UmVzdWx0LmVsZW1lbnQpO1xuICAgICAgICAgICAgICAvLyBTdG9yZSBsYXlvdXRSZXN1bHQgb24gd3JhcHBlciBlbGVtZW50IGZvciBjbGVhbnVwXG4gICAgICAgICAgICAgIGxheW91dFJlc3VsdHMuc2V0KGVsZW1lbnQsIGxheW91dFJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAvLyBQYXJzZSBIVE1MIHVzaW5nIHRlbXBsYXRlIGVsZW1lbnQgLSBvcHRpbWl6ZWQgcGF0aFxuICAgICAgICAgIC8vIE1vdmUgbm9kZXMgZGlyZWN0bHkgaW5zdGVhZCBvZiBjbG9uaW5nIC0gbXVjaCBmYXN0ZXIsIG5vIG1lbW9yeSBvdmVyaGVhZFxuICAgICAgICAgIHRlbXBsYXRlUGFyc2VyLmlubmVySFRNTCA9IHJlc3VsdDtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGVtcGxhdGVQYXJzZXIuY29udGVudDtcblxuICAgICAgICAgIGlmIChjb250ZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgLy8gU2luZ2xlIHJvb3QgZWxlbWVudCAtIG1vdmUgZGlyZWN0bHkgKGZhc3RlciB0aGFuIGNsb25lTm9kZSlcbiAgICAgICAgICAgIGVsZW1lbnQgPSBjb250ZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgY29udGVudC5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFwibXRybC12aWV3cG9ydC1pdGVtXCIpO1xuICAgICAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXIoaXRlbSkpIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTXVsdGlwbGUgY2hpbGRyZW4gLSBtb3ZlIGFsbCBpbnRvIHBvb2xlZCBlbGVtZW50XG4gICAgICAgICAgICBlbGVtZW50ID0gZ2V0UG9vbGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgd2hpbGUgKGNvbnRlbnQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbnRlbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgZWxlbWVudCA9IGdldFBvb2xlZEVsZW1lbnQoKTtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbUmVuZGVyaW5nXSBJbnZhbGlkIHRlbXBsYXRlIHJlc3VsdCBmb3IgaXRlbSAke2luZGV4fWApO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGNsYXNzZXNcbiAgICAgICAgaWYgKCFoYXNDbGFzcyhlbGVtZW50LCBcInZpZXdwb3J0LWl0ZW1cIikpXG4gICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtXCIpO1xuICAgICAgICBpZiAoaXNQbGFjZWhvbGRlcihpdGVtKSkge1xuICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUyk7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5kZXggPSBTdHJpbmcoaW5kZXgpO1xuXG4gICAgICAgIC8vIENvcHkgZGF0YS1pZCBmcm9tIGl0ZW0gdG8gdmlld3BvcnQgZWxlbWVudCBmb3Igc2VsZWN0aW9uIHN1cHBvcnRcbiAgICAgICAgY29uc3QgaXRlbUlkID0gaXRlbT8uX2lkIHx8IGl0ZW0/LmlkO1xuICAgICAgICBpZiAoaXRlbUlkICE9PSB1bmRlZmluZWQgJiYgaXRlbUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmlkID0gU3RyaW5nKGl0ZW1JZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbUmVuZGVyaW5nXSBFcnJvciByZW5kZXJpbmcgaXRlbSAke2luZGV4fTpgLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgcG9zaXRpb25zXG4gICAgY29uc3QgdXBkYXRlSXRlbVBvc2l0aW9ucyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSB8fCByZW5kZXJlZEVsZW1lbnRzLnNpemUgPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3Qge1xuICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgaXRlbVNpemU6IGl0ZW1TaXplLFxuICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICBjb250YWluZXJTaXplLFxuICAgICAgfSA9IHZpZXdwb3J0U3RhdGU7XG4gICAgICBjb25zdCBhY3R1YWxUb3RhbFNpemUgPSB0b3RhbEl0ZW1zICogaXRlbVNpemU7XG4gICAgICBjb25zdCBpc0NvbXByZXNzZWQgPVxuICAgICAgICBhY3R1YWxUb3RhbFNpemUgPiB2aXJ0dWFsVG90YWxTaXplICYmIHZpcnR1YWxUb3RhbFNpemUgPiAwO1xuXG4gICAgICBjb25zdCBzb3J0ZWRJbmRpY2VzID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmtleXMoKSkuc29ydChcbiAgICAgICAgKGEsIGIpID0+IGEgLSBiLFxuICAgICAgKTtcbiAgICAgIGlmICghc29ydGVkSW5kaWNlcy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgY29uc3QgZmlyc3RJbmRleCA9IHNvcnRlZEluZGljZXNbMF07XG4gICAgICBsZXQgY3VycmVudFBvc2l0aW9uID0gMDtcblxuICAgICAgaWYgKGlzQ29tcHJlc3NlZCkge1xuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB2aXJ0dWFsVG90YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gbWF4U2Nyb2xsIC0gc2Nyb2xsUG9zaXRpb247XG5cbiAgICAgICAgaWYgKGRpc3RhbmNlRnJvbUJvdHRvbSA8PSBjb250YWluZXJTaXplICYmIGRpc3RhbmNlRnJvbUJvdHRvbSA+PSAtMSkge1xuICAgICAgICAgIC8vIE5lYXIgYm90dG9tIGludGVycG9sYXRpb25cbiAgICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUF0Qm90dG9tID0gTWF0aC5tYXgoMCwgdG90YWxJdGVtcyAtIGl0ZW1zQXRCb3R0b20pO1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgICAgIGNvbnN0IGV4YWN0U2Nyb2xsSW5kZXggPSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXM7XG4gICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIE1hdGgubWluKDEsIDEgLSBkaXN0YW5jZUZyb21Cb3R0b20gLyBjb250YWluZXJTaXplKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgYm90dG9tUG9zID0gKGZpcnN0SW5kZXggLSBmaXJzdFZpc2libGVBdEJvdHRvbSkgKiBpdGVtU2l6ZTtcbiAgICAgICAgICBjb25zdCBub3JtYWxQb3MgPSAoZmlyc3RJbmRleCAtIGV4YWN0U2Nyb2xsSW5kZXgpICogaXRlbVNpemU7XG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uID0gbm9ybWFsUG9zICsgKGJvdHRvbVBvcyAtIG5vcm1hbFBvcykgKiBpbnRlcnBvbGF0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IChmaXJzdEluZGV4IC0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zKSAqIGl0ZW1TaXplO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50UG9zaXRpb24gPSBmaXJzdEluZGV4ICogaXRlbVNpemUgLSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gUG9zaXRpb24gZWFjaCBpdGVtXG4gICAgICBzb3J0ZWRJbmRpY2VzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChpbmRleCk7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke01hdGgucm91bmQoXG4gICAgICAgICAgICBjdXJyZW50UG9zaXRpb24sXG4gICAgICAgICAgKX1weClgO1xuXG4gICAgICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgbGFzdCBpdGVtc1xuICAgICAgICAgIC8vIGlmIChpbmRleCA+PSB0b3RhbEl0ZW1zIC0gNSkge1xuICAgICAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICAgIGBbUmVuZGVyaW5nXSBMYXN0IGl0ZW0gcG9zaXRpb25lZDogaW5kZXg9JHtpbmRleH0sIHBvc2l0aW9uPSR7TWF0aC5yb3VuZChcbiAgICAgICAgICAvLyAgICAgICBjdXJyZW50UG9zaXRpb25cbiAgICAgICAgICAvLyAgICAgKX1weCwgaXRlbVNpemU9JHtpdGVtU2l6ZX1weCwgdG90YWxJdGVtcz0ke3RvdGFsSXRlbXN9YFxuICAgICAgICAgIC8vICAgKTtcbiAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICBjdXJyZW50UG9zaXRpb24gKz0gaXRlbVNpemU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBNYWluIHJlbmRlciBmdW5jdGlvblxuICAgIGNvbnN0IHJlbmRlckl0ZW1zID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlPy5pdGVtc0NvbnRhaW5lcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdmlzaWJsZVJhbmdlLFxuICAgICAgICBpdGVtc0NvbnRhaW5lcixcbiAgICAgICAgdG90YWxJdGVtcyxcbiAgICAgICAgaXRlbVNpemUsXG4gICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBjb250YWluZXJTaXplLFxuICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgfSA9IHZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHJhbmdlIC0gc2tpcCByZW5kZXJpbmcgaWYgbm8gaXRlbXMgb3IgcmFuZ2UgaXMgaW52YWxpZFxuICAgICAgaWYgKFxuICAgICAgICAhdmlzaWJsZVJhbmdlIHx8XG4gICAgICAgIHRvdGFsSXRlbXMgPD0gMCB8fFxuICAgICAgICB2aXNpYmxlUmFuZ2Uuc3RhcnQgPCAwIHx8XG4gICAgICAgIHZpc2libGVSYW5nZS5zdGFydCA+PSB0b3RhbEl0ZW1zIHx8XG4gICAgICAgIHZpc2libGVSYW5nZS5lbmQgPCB2aXNpYmxlUmFuZ2Uuc3RhcnQgfHxcbiAgICAgICAgaXNOYU4odmlzaWJsZVJhbmdlLnN0YXJ0KSB8fFxuICAgICAgICBpc05hTih2aXNpYmxlUmFuZ2UuZW5kKVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIHRvdGFsSXRlbXMgaXMgMCwgY2xlYXIgYWxsIHJlbmRlcmVkIGVsZW1lbnRzIHRvIHJlbW92ZSBzdGFsZSBwbGFjZWhvbGRlcnNcbiAgICAgICAgaWYgKHRvdGFsSXRlbXMgPD0gMCAmJiByZW5kZXJlZEVsZW1lbnRzLnNpemUgPiAwKSB7XG4gICAgICAgICAgQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmVudHJpZXMoKSkuZm9yRWFjaCgoW2luZGV4LCBlbGVtZW50XSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmRlbGV0ZShpbmRleCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiByYW5nZSBjaGFuZ2VkXG4gICAgICBpZiAoXG4gICAgICAgIHZpc2libGVSYW5nZS5zdGFydCA9PT0gY3VycmVudFZpc2libGVSYW5nZS5zdGFydCAmJlxuICAgICAgICB2aXNpYmxlUmFuZ2UuZW5kID09PSBjdXJyZW50VmlzaWJsZVJhbmdlLmVuZCAmJlxuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNpemUgPiAwXG4gICAgICApIHtcbiAgICAgICAgdXBkYXRlSXRlbVBvc2l0aW9ucygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxhc3RSZW5kZXJUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHJlbmRlclN0YXJ0ID0gTWF0aC5tYXgoMCwgdmlzaWJsZVJhbmdlLnN0YXJ0IC0gb3ZlcnNjYW4pO1xuICAgICAgY29uc3QgcmVuZGVyRW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHZpc2libGVSYW5nZS5lbmQgKyBvdmVyc2Nhbik7XG5cbiAgICAgIC8vIGlmIChpc1JlbW92aW5nSXRlbSkge1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgICBgW1JFTkRFUi1GSVhdIHJlbmRlckl0ZW1zIGNhbGM6IHZpc2libGVSYW5nZT0ke0pTT04uc3RyaW5naWZ5KHZpc2libGVSYW5nZSl9LCBvdmVyc2Nhbj0ke292ZXJzY2FufSwgdG90YWxJdGVtcz0ke3RvdGFsSXRlbXN9YCxcbiAgICAgIC8vICAgKTtcbiAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAvLyAgICAgYFtSRU5ERVItRklYXSByZW5kZXJJdGVtcyBjYWxjOiByZW5kZXJTdGFydD0ke3JlbmRlclN0YXJ0fSwgcmVuZGVyRW5kPSR7cmVuZGVyRW5kfWAsXG4gICAgICAvLyAgICk7XG4gICAgICAvLyB9XG5cbiAgICAgIC8vIFJlbW92ZSBpdGVtcyBvdXRzaWRlIHJhbmdlXG4gICAgICBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMuZW50cmllcygpKVxuICAgICAgICAuZmlsdGVyKChbaW5kZXhdKSA9PiBpbmRleCA8IHJlbmRlclN0YXJ0IHx8IGluZGV4ID4gcmVuZGVyRW5kKVxuICAgICAgICAuZm9yRWFjaCgoW2luZGV4LCBlbGVtZW50XSkgPT4ge1xuICAgICAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUpIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEdldCBpdGVtcyBmcm9tIGNvbGxlY3Rpb24gKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgpXG4gICAgICBjb25zdCBpdGVtcyA9IGdldENvbGxlY3Rpb25JdGVtcygpO1xuICAgICAgY29uc3QgbWlzc2luZ0l0ZW1zOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAvLyBDb2xsZWN0IG5ldyBlbGVtZW50cyB0byBpbnNlcnQgKGluZGV4IC0+IGVsZW1lbnQpXG4gICAgICBjb25zdCBuZXdFbGVtZW50czogQXJyYXk8W251bWJlciwgSFRNTEVsZW1lbnRdPiA9IFtdO1xuXG4gICAgICAvLyBSZW5kZXIgaXRlbXMgaW4gcmFuZ2VcbiAgICAgIGZvciAobGV0IGkgPSByZW5kZXJTdGFydDsgaSA8PSByZW5kZXJFbmQ7IGkrKykge1xuICAgICAgICBpZiAoaSA8IDAgfHwgaSA+PSB0b3RhbEl0ZW1zIHx8IHJlbmRlcmVkRWxlbWVudHMuaGFzKGkpKSBjb250aW51ZTtcblxuICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICBtaXNzaW5nSXRlbXMucHVzaChpKTtcbiAgICAgICAgICAvLyBHZW5lcmF0ZSBwbGFjZWhvbGRlciAocmVuZGVyZWQgZHluYW1pY2FsbHksIG5vdCBzdG9yZWQpXG4gICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gKGNvbXBvbmVudCBhcyBhbnkpLnBsYWNlaG9sZGVycztcbiAgICAgICAgICBpdGVtID0gcGxhY2Vob2xkZXJzPy5nZW5lcmF0ZVBsYWNlaG9sZGVySXRlbShpKSB8fCB7XG4gICAgICAgICAgICBfcGxhY2Vob2xkZXI6IHRydWUsXG4gICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgIGlkOiBgcGxhY2Vob2xkZXItJHtpfWAsXG4gICAgICAgICAgICBuYW1lOiBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIucmVwZWF0KDE1KSxcbiAgICAgICAgICAgIHRleHQ6IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUi5yZXBlYXQoMjUpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUi5yZXBlYXQoNDApLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBHZXQgdGFyZ2V0U2Nyb2xsSW5kZXggZnJvbSB2aWV3cG9ydFN0YXRlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IHRhcmdldFNjcm9sbEluZGV4ID0gKHZpZXdwb3J0U3RhdGUgYXMgYW55KT8udGFyZ2V0U2Nyb2xsSW5kZXg7XG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBjYWxjdWxhdGVJdGVtUG9zaXRpb24oXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgICAgaXRlbVNpemUsXG4gICAgICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgICAgIHRhcmdldFNjcm9sbEluZGV4LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKCR7cG9zaXRpb259cHgpYCxcbiAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIENvbGxlY3QgZm9yIGJhdGNoIGluc2VydGlvbiAoaWYgbWFpbnRhaW5pbmcgb3JkZXIpIG9yIGp1c3QgYXBwZW5kXG4gICAgICAgICAgaWYgKG1haW50YWluRG9tT3JkZXIpIHtcbiAgICAgICAgICAgIG5ld0VsZW1lbnRzLnB1c2goW2ksIGVsZW1lbnRdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlbXNDb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGksIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJhdGNoIGluc2VydCBuZXcgZWxlbWVudHMgaW4gY29ycmVjdCBET00gb3JkZXIgKG9ubHkgd2hlbiBtYWludGFpbkRvbU9yZGVyIGlzIGVuYWJsZWQpXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgQ1NTIHNlbGVjdG9ycyBsaWtlIDpmaXJzdC1jaGlsZCwgOm50aC1jaGlsZCgpIHdvcmsgY29ycmVjdGx5XG4gICAgICBpZiAobWFpbnRhaW5Eb21PcmRlciAmJiBuZXdFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFNvcnQgbmV3IGVsZW1lbnRzIGJ5IGluZGV4XG4gICAgICAgIG5ld0VsZW1lbnRzLnNvcnQoKFthXSwgW2JdKSA9PiBhIC0gYik7XG5cbiAgICAgICAgLy8gR2V0IGV4aXN0aW5nIERPTSBjaGlsZHJlbiBzb3J0ZWQgYnkgdGhlaXIgZGF0YS1pbmRleFxuICAgICAgICBjb25zdCBleGlzdGluZ0NoaWxkcmVuID0gQXJyYXkuZnJvbShcbiAgICAgICAgICBpdGVtc0NvbnRhaW5lci5jaGlsZHJlbixcbiAgICAgICAgKSBhcyBIVE1MRWxlbWVudFtdO1xuXG4gICAgICAgIC8vIE1lcmdlIG5ldyBlbGVtZW50cyBpbnRvIGNvcnJlY3QgcG9zaXRpb25zXG4gICAgICAgIGxldCBuZXdJZHggPSAwO1xuICAgICAgICBsZXQgZXhpc3RpbmdJZHggPSAwO1xuXG4gICAgICAgIHdoaWxlIChuZXdJZHggPCBuZXdFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBbbmV3SW5kZXgsIG5ld0VsZW1lbnRdID0gbmV3RWxlbWVudHNbbmV3SWR4XTtcblxuICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGV4aXN0aW5nIGNoaWxkIHdpdGggaW5kZXggPiBuZXdJbmRleFxuICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgIGV4aXN0aW5nSWR4IDwgZXhpc3RpbmdDaGlsZHJlbi5sZW5ndGggJiZcbiAgICAgICAgICAgIHBhcnNlSW50KGV4aXN0aW5nQ2hpbGRyZW5bZXhpc3RpbmdJZHhdLmRhdGFzZXQuaW5kZXggfHwgXCItMVwiLCAxMCkgPFxuICAgICAgICAgICAgICBuZXdJbmRleFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZXhpc3RpbmdJZHgrKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXhpc3RpbmdJZHggPCBleGlzdGluZ0NoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gSW5zZXJ0IGJlZm9yZSB0aGUgZXhpc3RpbmcgY2hpbGRcbiAgICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmluc2VydEJlZm9yZShcbiAgICAgICAgICAgICAgbmV3RWxlbWVudCxcbiAgICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbltleGlzdGluZ0lkeF0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBcHBlbmQgYXQgdGhlIGVuZFxuICAgICAgICAgICAgaXRlbXNDb250YWluZXIuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5ld0lkeCsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcXVlc3QgbWlzc2luZyBpdGVtc1xuICAgICAgaWYgKFxuICAgICAgICBtaXNzaW5nSXRlbXMubGVuZ3RoID4gMCAmJlxuICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LmxvYWRNaXNzaW5nUmFuZ2VzXG4gICAgICApIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZE1pc3NpbmdSYW5nZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhcnQ6IE1hdGgubWluKC4uLm1pc3NpbmdJdGVtcyksXG4gICAgICAgICAgICBlbmQ6IE1hdGgubWF4KC4uLm1pc3NpbmdJdGVtcyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlbmRlcmluZzptaXNzaW5nLWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB2aXNpYmxlUmFuZ2U7XG5cbiAgICAgIC8vIEVtaXQgaXRlbXMgcmVuZGVyZWQgZXZlbnQgd2l0aCBlbGVtZW50cyBmb3Igc2l6ZSBjYWxjdWxhdGlvblxuICAgICAgY29uc3QgcmVuZGVyZWRFbGVtZW50c0FycmF5ID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLnZhbHVlcygpKTtcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtcy1yZW5kZXJlZFwiLCB7XG4gICAgICAgIGVsZW1lbnRzOiByZW5kZXJlZEVsZW1lbnRzQXJyYXksXG4gICAgICAgIHJhbmdlOiB2aXNpYmxlUmFuZ2UsXG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnJlbmRlcmVkXCIsIHtcbiAgICAgICAgcmFuZ2U6IHZpc2libGVSYW5nZSxcbiAgICAgICAgcmVuZGVyZWRDb3VudDogcmVuZGVyZWRFbGVtZW50cy5zaXplLFxuICAgICAgfSk7XG4gICAgICB1cGRhdGVJdGVtUG9zaXRpb25zKCk7XG5cbiAgICAgIC8vIExvYWQgZGF0YSBpZiBubyBpdGVtcyByZW5kZXJlZFxuICAgICAgaWYgKFxuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNpemUgPT09IDAgJiZcbiAgICAgICAgdG90YWxJdGVtcyA+IDAgJiZcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uXG4gICAgICApIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZE1pc3NpbmdSYW5nZXMoXG4gICAgICAgICAgdmlzaWJsZVJhbmdlLFxuICAgICAgICAgIFwicmVuZGVyaW5nOm5vLWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCB2aWV3cG9ydCBBUElcbiAgICBjb25zdCBvcmlnaW5hbFJlbmRlckl0ZW1zID0gY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcyA9ICgpID0+IHtcbiAgICAgIHJlbmRlckl0ZW1zKCk7XG4gICAgICBvcmlnaW5hbFJlbmRlckl0ZW1zPy4oKTtcbiAgICB9O1xuXG4gICAgLy8gQ2xlYW51cFxuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgLy8gUmVsZWFzZSBhbGwgcmVuZGVyZWQgZWxlbWVudHMgLSB1c2UgcmVsZWFzZUVsZW1lbnQgdG8gcHJvcGVybHkgZGVzdHJveSBsYXlvdXRSZXN1bHRzXG4gICAgICByZW5kZXJlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9KTtcbiAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgZWxlbWVudCBwb29sXG4gICAgICBlbGVtZW50UG9vbC5sZW5ndGggPSAwO1xuXG4gICAgICAvLyBSZXNldCBzdGF0ZVxuICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG4gICAgICB2aWV3cG9ydFN0YXRlID0gbnVsbDtcbiAgICAgIGxhc3RSZW5kZXJUaW1lID0gMDtcblxuICAgICAgLy8gUmVzZXQgcG9vbCBzdGF0c1xuICAgICAgcG9vbFN0YXRzLmNyZWF0ZWQgPSAwO1xuICAgICAgcG9vbFN0YXRzLnJlY3ljbGVkID0gMDtcbiAgICAgIHBvb2xTdGF0cy5wb29sU2l6ZSA9IDA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9O1xufTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzXG5cbi8qKlxuICogRXZlbnRzIEZlYXR1cmUgLSBDZW50cmFsaXplZCBldmVudCBzeXN0ZW0gZm9yIHZpZXdwb3J0XG4gKiBQcm92aWRlcyBldmVudCBlbWlzc2lvbiBhbmQgc3Vic2NyaXB0aW9uIGZvciBpbnRlci1mZWF0dXJlIGNvbW11bmljYXRpb25cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBFdmVudHNDb25maWcge1xuICBkZWJ1Zz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXZlbnRzIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBDZW50cmFsaXplcyBhbGwgZXZlbnQgaGFuZGxpbmcgZm9yIHZpZXdwb3J0IGZlYXR1cmVzXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRXZlbnRzID0gKGNvbmZpZzogRXZlbnRzQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHsgZGVidWcgPSBmYWxzZSB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIG1hcFxuICAgIGNvbnN0IGxpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8RnVuY3Rpb24+PigpO1xuXG4gICAgLy8gRW1pdCBhbiBldmVudFxuICAgIGNvbnN0IGVtaXQgPSAoZXZlbnQ6IHN0cmluZywgZGF0YT86IGFueSkgPT4ge1xuICAgICAgLy8gaWYgKGRlYnVnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBbRXZlbnRzXSBFbWl0OiAke2V2ZW50fWAsIGRhdGEpO1xuICAgICAgLy8gfVxuXG4gICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGRhdGEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbRXZlbnRzXSBFcnJvciBpbiBsaXN0ZW5lciBmb3IgJHtldmVudH06YCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFN1YnNjcmliZSB0byBhbiBldmVudFxuICAgIGNvbnN0IG9uID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICAgIGlmICghbGlzdGVuZXJzLmhhcyhldmVudCkpIHtcbiAgICAgICAgbGlzdGVuZXJzLnNldChldmVudCwgbmV3IFNldCgpKTtcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzLmdldChldmVudCkhLmFkZChoYW5kbGVyKTtcblxuICAgICAgLy8gaWYgKGRlYnVnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBbRXZlbnRzXSBTdWJzY3JpYmVkIHRvOiAke2V2ZW50fWApO1xuICAgICAgLy8gfVxuXG4gICAgICAvLyBSZXR1cm4gdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzLmdldChldmVudCk7XG4gICAgICAgIGlmIChldmVudExpc3RlbmVycykge1xuICAgICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICBpZiAoZXZlbnRMaXN0ZW5lcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gYW4gZXZlbnQgb25jZVxuICAgIGNvbnN0IG9uY2UgPSAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGhhbmRsZXIoZGF0YSk7XG4gICAgICAgIG9mZihldmVudCwgd3JhcHBlZEhhbmRsZXIpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBvbihldmVudCwgd3JhcHBlZEhhbmRsZXIpO1xuICAgIH07XG5cbiAgICAvLyBVbnN1YnNjcmliZSBmcm9tIGFuIGV2ZW50XG4gICAgY29uc3Qgb2ZmID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBDbGVhciBhbGwgbGlzdGVuZXJzIGZvciBhbiBldmVudFxuICAgIGNvbnN0IGNsZWFyID0gKGV2ZW50Pzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQWRkIGV2ZW50IG1ldGhvZHMgdG8gY29tcG9uZW50XG4gICAgY29tcG9uZW50LmVtaXQgPSBlbWl0O1xuICAgIGNvbXBvbmVudC5vbiA9IG9uO1xuICAgIGNvbXBvbmVudC5vbmNlID0gb25jZTtcbiAgICBjb21wb25lbnQub2ZmID0gb2ZmO1xuXG4gICAgLy8gQWRkIGV2ZW50cyBBUEkgdG8gdmlld3BvcnRcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuZXZlbnRzID0ge1xuICAgICAgZW1pdCxcbiAgICAgIG9uLFxuICAgICAgb25jZSxcbiAgICAgIG9mZixcbiAgICAgIGNsZWFyLFxuICAgICAgZ2V0TGlzdGVuZXJDb3VudDogKGV2ZW50Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBsaXN0ZW5lcnMuZ2V0KGV2ZW50KT8uc2l6ZSB8fCAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChzZXQpID0+ICh0b3RhbCArPSBzZXQuc2l6ZSkpO1xuICAgICAgICByZXR1cm4gdG90YWw7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBDbGVhbiB1cCBvbiBkZXN0cm95XG4gICAgaWYgKFwiZGVzdHJveVwiIGluIGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgICBjb21wb25lbnQuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgY2xlYXIoKTtcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzXG5cbi8qKlxuICogVkxpc3QgQ29tcG9uZW50IC0gVmlydHVhbCBMaXN0IHdpdGggZGlyZWN0IHZpZXdwb3J0IGludGVncmF0aW9uXG4gKlxuICogQSBzaW1wbGlmaWVkIHZpcnR1YWwgbGlzdCB0aGF0IHVzZXMgdGhlIHZpZXdwb3J0IGZlYXR1cmUgZGlyZWN0bHlcbiAqIHdpdGhvdXQgdGhlIGxpc3QtbWFuYWdlciBhYnN0cmFjdGlvbiBsYXllci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdENvbXBvbmVudCwgVkxpc3RJdGVtIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLy8gSW1wb3J0IG10cmwgY29tcG9zZSBzeXN0ZW1cbmltcG9ydCB7IHBpcGUgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgY3JlYXRlQmFzZSwgd2l0aEVsZW1lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgd2l0aEV2ZW50cywgd2l0aExpZmVjeWNsZSB9IGZyb20gXCJtdHJsXCI7XG5cbi8vIEltcG9ydCB2aWV3cG9ydCBmZWF0dXJlXG5pbXBvcnQgeyB3aXRoVmlld3BvcnQgfSBmcm9tIFwiLi9mZWF0dXJlcy92aWV3cG9ydFwiO1xuaW1wb3J0IHsgd2l0aEFQSSB9IGZyb20gXCIuL2ZlYXR1cmVzL2FwaVwiO1xuaW1wb3J0IHsgd2l0aFNlbGVjdGlvbiB9IGZyb20gXCIuL2ZlYXR1cmVzL3NlbGVjdGlvblwiO1xuaW1wb3J0IHsgd2l0aEtleWJvYXJkIH0gZnJvbSBcIi4vZmVhdHVyZXMva2V5Ym9hcmRcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFZMaXN0IGNvbXBvbmVudCB1c2luZyBkaXJlY3Qgdmlld3BvcnQgaW50ZWdyYXRpb25cbiAqXG4gKiBAcGFyYW0ge1ZMaXN0Q29uZmlnfSBjb25maWcgLSBMaXN0IGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMge1ZMaXN0Q29tcG9uZW50fSBBIGZ1bGx5IGNvbmZpZ3VyZWQgdmlydHVhbCBsaXN0IGNvbXBvbmVudFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB2bGlzdCA9IGNyZWF0ZVZMaXN0KHtcbiAqICAgY29udGFpbmVyOiAnI215LWxpc3QnLFxuICogICBjb2xsZWN0aW9uOiBteUFkYXB0ZXIsXG4gKiAgIHJhbmdlU2l6ZTogMjAsXG4gKiAgIHBhZ2luYXRpb25TdHJhdGVneTogJ3BhZ2UnLFxuICogICB0ZW1wbGF0ZTogKGl0ZW0sIGluZGV4KSA9PiBbXG4gKiAgICAgeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW0nLCBhdHRyaWJ1dGVzOiB7ICdkYXRhLWlkJzogaXRlbS5pZCB9fSxcbiAqICAgICBbeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW1fX25hbWUnLCB0ZXh0OiBpdGVtLm5hbWUgfV0sXG4gKiAgICAgW3sgY2xhc3M6ICd2aWV3cG9ydC1pdGVtX192YWx1ZScsIHRleHQ6IGl0ZW0udmFsdWUgfV1cbiAqICAgXVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVZMaXN0ID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+ID0ge30sXG4pOiBWTGlzdENvbXBvbmVudDxUPiA9PiB7XG4gIHRyeSB7XG4gICAgLy8gY29uc29sZS5sb2coYPCfk4sgQ3JlYXRpbmcgVkxpc3QgY29tcG9uZW50IHdpdGggZGlyZWN0IHZpZXdwb3J0IGludGVncmF0aW9uYCk7XG5cbiAgICAvLyBOb3RlOiBUcmFuc2Zvcm0gc2hvdWxkIGJlIGFwcGxpZWQgYnkgdGhlIGNvbGxlY3Rpb24gZmVhdHVyZSBpbiB2aWV3cG9ydFxuICAgIC8vIFZMaXN0IHNob3VsZCBub3QgaW50ZXJjZXB0IGNvbGxlY3Rpb24gcmVhZHMgYXMgaXQgYnlwYXNzZXMgdGhlIGxvYWRpbmcgbWFuYWdlclxuXG4gICAgLy8gQ3JlYXRlIHRoZSBjb21wb25lbnQgdGhyb3VnaCBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gICAgY29uc3QgZW5oYW5jZXJzID0gW1xuICAgICAgLy8gMS4gRm91bmRhdGlvbiBsYXllclxuICAgICAgY3JlYXRlQmFzZSxcbiAgICAgIHdpdGhFdmVudHMoKSxcbiAgICAgIHdpdGhFbGVtZW50KHtcbiAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICBjbGFzc05hbWU6IGNvbmZpZy5jbGFzc05hbWUgfHwgXCJtdHJsLXZsaXN0XCIsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICByb2xlOiBcImxpc3RcIixcbiAgICAgICAgICBcImFyaWEtbGFiZWxcIjogY29uZmlnLmFyaWFMYWJlbCB8fCBcIlZpcnR1YWwgTGlzdFwiLFxuICAgICAgICB9LFxuICAgICAgfSksXG5cbiAgICAgIC8vIDIuIFZpZXdwb3J0IGludGVncmF0aW9uXG4gICAgICAvLyBQYXNzIGF1dG9TZWxlY3RGaXJzdCBmcm9tIHNlbGVjdGlvbiBjb25maWcgdG8gdmlld3BvcnQgbGV2ZWxcbiAgICAgIHdpdGhWaWV3cG9ydCh7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgYXV0b1NlbGVjdEZpcnN0OiBjb25maWcuc2VsZWN0aW9uPy5hdXRvU2VsZWN0Rmlyc3QsXG4gICAgICB9KSxcblxuICAgICAgLy8gMy4gQ29tcG9uZW50IGxpZmVjeWNsZVxuICAgICAgd2l0aExpZmVjeWNsZSgpLFxuXG4gICAgICAvLyA0LiBQdWJsaWMgQVBJIGxheWVyXG4gICAgICB3aXRoQVBJKGNvbmZpZyksXG4gICAgXTtcblxuICAgIC8vIDQuNS4gU2VsZWN0aW9uIGNhcGFiaWxpdGllcyAoaWYgZW5hYmxlZCkgLSBtdXN0IGJlIGFmdGVyIEFQSVxuICAgIGlmIChjb25maWcuc2VsZWN0aW9uPy5lbmFibGVkKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaCh3aXRoU2VsZWN0aW9uKGNvbmZpZykpO1xuICAgIH1cblxuICAgIC8vIDUuIEtleWJvYXJkIG5hdmlnYXRpb24gKGlmIHNlbGVjdGlvbiBlbmFibGVkIG9yIGV4cGxpY2l0bHkgY29uZmlndXJlZClcbiAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8uZW5hYmxlZCB8fCBjb25maWcua2V5Ym9hcmQ/LmVuYWJsZWQpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKHdpdGhLZXlib2FyZChjb25maWcpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnQgPSBwaXBlKC4uLmVuaGFuY2Vycykoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY29tcG9uZW50TmFtZTogXCJ2bGlzdFwiLFxuICAgICAgcHJlZml4OiBjb25maWcucHJlZml4IHx8IFwibXRybFwiLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyBWTGlzdENvbXBvbmVudDxUPjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwi4p2MIFtWTElTVF0gRmFpbGVkIHRvIGNyZWF0ZSBWTGlzdCBjb21wb25lbnQ6XCIsIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvdmlld3BvcnQudHNcblxuLyoqXG4gKiBWaWV3cG9ydCBmZWF0dXJlIGZvciBWTGlzdFxuICogSW50ZWdyYXRlcyB0aGUgY29yZSB2aWV3cG9ydCBmdW5jdGlvbmFsaXR5IHdpdGggVkxpc3QgY29tcG9uZW50XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWTGlzdENvbmZpZywgVkxpc3RJdGVtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVWaWV3cG9ydCB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3ZpZXdwb3J0XCI7XG5cbi8qKlxuICogQWRkcyB2aWV3cG9ydCBmdW5jdGlvbmFsaXR5IHRvIFZMaXN0XG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoVmlld3BvcnQgPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4sXG4pID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgIC8vIFNldCBpbml0aWFsIGl0ZW1zIGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZy5pdGVtcykge1xuICAgICAgY29tcG9uZW50Lml0ZW1zID0gY29uZmlnLml0ZW1zO1xuICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSBjb25maWcuaXRlbXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIFNldCB0ZW1wbGF0ZSBpZiBwcm92aWRlZFxuICAgIGlmIChjb25maWcudGVtcGxhdGUpIHtcbiAgICAgIGNvbXBvbmVudC50ZW1wbGF0ZSA9IGNvbmZpZy50ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIGVsZW1lbnQgaGFzIGJvdGggdmxpc3QgYW5kIHZpZXdwb3J0IGNsYXNzZXNcbiAgICBjb25zdCB2aWV3cG9ydENvbmZpZyA9IHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNsYXNzTmFtZTogXCJtdHJsLXZpZXdwb3J0XCIsIC8vIFRoaXMgd2lsbCBiZSBhZGRlZCBieSB2aWV3cG9ydCBiYXNlIGZlYXR1cmVcbiAgICB9O1xuXG4gICAgLy8gUGFzcyBWTGlzdCBjb25maWcgZGlyZWN0bHkgdG8gdmlld3BvcnRcbiAgICBjb25zdCB2aWV3cG9ydEVuaGFuY2VkID0gY3JlYXRlVmlld3BvcnQodmlld3BvcnRDb25maWcgYXMgYW55KShjb21wb25lbnQpO1xuXG4gICAgLy8gSGFuZGxlIHBhcmVudCBlbGVtZW50IGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZy5wYXJlbnQgfHwgY29uZmlnLmNvbnRhaW5lcikge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gY29uZmlnLnBhcmVudCB8fCBjb25maWcuY29udGFpbmVyO1xuICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgIHR5cGVvZiBjb250YWluZXIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGFpbmVyKVxuICAgICAgICAgIDogY29udGFpbmVyO1xuXG4gICAgICBpZiAoZWxlbWVudCAmJiB2aWV3cG9ydEVuaGFuY2VkLmVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh2aWV3cG9ydEVuaGFuY2VkLmVsZW1lbnQpO1xuXG4gICAgICAgIC8vIEVuc3VyZSB2aWV3cG9ydCBpcyBpbml0aWFsaXplZCBhZnRlciBET00gYXR0YWNobWVudFxuICAgICAgICBpZiAodmlld3BvcnRFbmhhbmNlZC52aWV3cG9ydCAmJiB2aWV3cG9ydEVuaGFuY2VkLnZpZXdwb3J0LmluaXRpYWxpemUpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIvCfk4sgW1ZMaXN0XSBJbml0aWFsaXppbmcgdmlld3BvcnQgYWZ0ZXIgRE9NIGF0dGFjaG1lbnRcIik7XG4gICAgICAgICAgdmlld3BvcnRFbmhhbmNlZC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmlld3BvcnRFbmhhbmNlZDtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogQVBJIGZlYXR1cmUgZm9yIFZMaXN0XG4gKiBQcm92aWRlcyBhIGNsZWFuIHB1YmxpYyBBUEkgZm9yIHRoZSBWTGlzdCBjb21wb25lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdEl0ZW0sIFJlbW92ZUl0ZW1PcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8vIFJlLWV4cG9ydCBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB0eXBlIHsgUmVtb3ZlSXRlbU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IHdpdGhBUEkgPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4sXG4pID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgIC8vIEluaXRpYWxpemUgdmlld3BvcnQgb24gY3JlYXRpb25cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQgJiYgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUpIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUoKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcblxuICAgIC8vIFRyYWNrIGxvYWRpbmcgc3RhdGVcbiAgICBsZXQgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgbGV0IHNlbGVjdGVkSWRzID0gbmV3IFNldDxzdHJpbmcgfCBudW1iZXI+KCk7XG5cbiAgICAvLyBUcmFjayBwZW5kaW5nIHJlbW92YWxzIHRvIGZpbHRlciBvdXQgaXRlbXMgZnJvbSBzdGFsZSBzZXJ2ZXIgcmVzcG9uc2VzXG4gICAgLy8gVGhpcyBwcmV2ZW50cyByYWNlIGNvbmRpdGlvbnMgd2hlcmUgc2VydmVyIHJldHVybnMgb2xkIGRhdGEgYmVmb3JlIHVwZGF0ZXMgYXJlIGNvbW1pdHRlZFxuICAgIGNvbnN0IHBlbmRpbmdSZW1vdmFscyA9IG5ldyBTZXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xuXG4gICAgLy8gTGlzdGVuIGZvciBjb2xsZWN0aW9uIGV2ZW50c1xuICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwgKCkgPT4ge1xuICAgICAgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfSk7XG4gICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWZhaWxlZFwiLCAoKSA9PiB7XG4gICAgICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8vIERhdGEgb3BlcmF0aW9uc1xuXG4gICAgICAvKipcbiAgICAgICAqIFJlbG9hZCB0aGUgbGlzdCAtIGNsZWFycyBhbGwgZGF0YSBhbmQgZmV0Y2hlcyBmcmVzaCBmcm9tIHRoZSBhZGFwdGVyXG4gICAgICAgKiBUaGlzIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbiBkZXN0cm95aW5nIGFuZCByZWNyZWF0aW5nIHRoZSBWTGlzdFxuICAgICAgICovXG4gICAgICBhc3luYyByZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFJlc2V0IHRoZSBjb2xsZWN0aW9uIHN0YXRlXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LnJlc2V0KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ucmVzZXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHNjcm9sbCBwb3NpdGlvbiB0byB0b3BcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uc2Nyb2xsVG8pIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG8oMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciByZW5kZXJlZCBET00gY29udGVudCAoaXRlbXMgY29udGFpbmVyKVxuICAgICAgICBjb25zdCBpdGVtc0NvbnRhaW5lciA9IGNvbXBvbmVudC5lbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIFwiLm10cmwtdmlld3BvcnQtaXRlbXNcIixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGl0ZW1zQ29udGFpbmVyKSB7XG4gICAgICAgICAgaXRlbXNDb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IGluaXRpYWxpemF0aW9uIHN0YXRlIHNvIGluaXRpYWxpemUoKSB3aWxsIHJ1biBhZ2FpblxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5yZXNldEluaXRpYWxpemF0aW9uKSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlc2V0SW5pdGlhbGl6YXRpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlLWluaXRpYWxpemUgdG8gdHJpZ2dlciBmcmVzaCBkYXRhIGxvYWRcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uaW5pdGlhbGl6ZSkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwicmVsb2FkZWRcIik7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCBkYXRhIHdpdGhvdXQgcmVsb2FkaW5nXG4gICAgICAgKi9cbiAgICAgIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICAvLyBSZXNldCB0aGUgY29sbGVjdGlvbiBzdGF0ZVxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uPy5yZXNldCkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLnJlc2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCBzY3JvbGwgcG9zaXRpb24gdG8gdG9wXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvKSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvKDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgcmVuZGVyZWQgRE9NIGNvbnRlbnQgKGl0ZW1zIGNvbnRhaW5lcilcbiAgICAgICAgY29uc3QgaXRlbXNDb250YWluZXIgPSBjb21wb25lbnQuZWxlbWVudD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBcIi5tdHJsLXZpZXdwb3J0LWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpdGVtc0NvbnRhaW5lcikge1xuICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY2xlYXJlZFwiKTtcbiAgICAgIH0sXG5cbiAgICAgIHNldEl0ZW1zKGl0ZW1zOiBUW10pIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLnNldEl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcbiAgICAgICAgICBjb21wb25lbnQudG90YWxJdGVtcyA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbXM6c2V0XCIsIHsgaXRlbXMsIHRvdGFsOiBpdGVtcy5sZW5ndGggfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEFkZCBpdGVtcyB0byB0aGUgY29sbGVjdGlvbiBhdCB0aGUgc3RhcnQgb3IgZW5kXG4gICAgICAgKiBVcGRhdGVzIHRvdGFsSXRlbXMgYW5kIHRyaWdnZXJzIHJlLXJlbmRlciBvZiB2aXNpYmxlIGl0ZW1zXG4gICAgICAgKiBAcGFyYW0gbmV3SXRlbXMgLSBBcnJheSBvZiBpdGVtcyB0byBhZGRcbiAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiAtIFdoZXJlIHRvIGFkZCBpdGVtczogXCJzdGFydFwiIChkZWZhdWx0KSBvciBcImVuZFwiXG4gICAgICAgKi9cbiAgICAgIGFkZEl0ZW1zKG5ld0l0ZW1zOiBUW10sIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiID0gXCJzdGFydFwiKTogdm9pZCB7XG4gICAgICAgIGlmICghbmV3SXRlbXMgfHwgbmV3SXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW1ZMaXN0XSBhZGRJdGVtczogbm8gaXRlbXMgcHJvdmlkZWRcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uO1xuICAgICAgICBjb25zdCBjdXJyZW50SXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG5cbiAgICAgICAgLy8gQWRkIGl0ZW1zIHRvIHRoZSBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5XG4gICAgICAgIGlmIChjb2xsZWN0aW9uPy5pdGVtcykge1xuICAgICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XG4gICAgICAgICAgICAvLyBQcmVwZW5kIGl0ZW1zIChuZXdlc3QgZmlyc3QpXG4gICAgICAgICAgICBjb2xsZWN0aW9uLml0ZW1zLnVuc2hpZnQoLi4ubmV3SXRlbXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBcHBlbmQgaXRlbXNcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uaXRlbXMucHVzaCguLi5uZXdJdGVtcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBldmVudCBGSVJTVCBzbyByZW5kZXJpbmcgZmVhdHVyZSBjYW4gcmVidWlsZCBjb2xsZWN0aW9uSXRlbXNcbiAgICAgICAgLy8gQkVGT1JFIHNldFRvdGFsSXRlbXMgdHJpZ2dlcnMgYSByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW1zOmFkZC1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpdGVtczogbmV3SXRlbXMsXG4gICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNDb3VudDogY3VycmVudEl0ZW1zLmxlbmd0aCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRvdGFsSXRlbXMgLSB0aGlzIHRyaWdnZXJzIHZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWQgd2hpY2ggY2FsbHMgcmVuZGVySXRlbXNcbiAgICAgICAgY29uc3QgaXRlbXNBZGRlZCA9IG5ld0l0ZW1zLmxlbmd0aDtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldFRvdGFsSXRlbXMgJiYgY29sbGVjdGlvbj8uc2V0VG90YWxJdGVtcykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb3RhbCA9IGNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhjdXJyZW50VG90YWwgKyBpdGVtc0FkZGVkKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LnNldFRvdGFsSXRlbXMpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VG90YWwgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhcbiAgICAgICAgICAgIGN1cnJlbnRUb3RhbCArIGl0ZW1zQWRkZWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY29tcG9uZW50LnRvdGFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSBjb21wb25lbnQudG90YWxJdGVtcyArIGl0ZW1zQWRkZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBjb21wbGV0aW9uIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtczphZGRlZFwiLCB7XG4gICAgICAgICAgaXRlbXM6IG5ld0l0ZW1zLFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIHRvdGFsOiB0aGlzLmdldEl0ZW1Db3VudCgpLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgc2luZ2xlIGl0ZW0gdG8gdGhlIGNvbGxlY3Rpb24gYXQgdGhlIHN0YXJ0IG9yIGVuZFxuICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgd3JhcHMgYWRkSXRlbXMgZm9yIHNpbmdsZSBpdGVtIHVzZSBjYXNlXG4gICAgICAgKiBAcGFyYW0gaXRlbSAtIEl0ZW0gdG8gYWRkXG4gICAgICAgKiBAcGFyYW0gcG9zaXRpb24gLSBXaGVyZSB0byBhZGQgaXRlbTogXCJzdGFydFwiIChkZWZhdWx0KSBvciBcImVuZFwiXG4gICAgICAgKi9cbiAgICAgIGFkZEl0ZW0oaXRlbTogVCwgcG9zaXRpb246IFwic3RhcnRcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW1ZMaXN0XSBhZGRJdGVtOiBubyBpdGVtIHByb3ZpZGVkXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZEl0ZW1zKFtpdGVtXSwgcG9zaXRpb24pO1xuICAgICAgfSxcblxuICAgICAgZ2V0SXRlbXMoKTogVFtdIHtcbiAgICAgICAgLy8gQ29sbGVjdGlvbiBpcyBhZGRlZCBkaXJlY3RseSB0byBjb21wb25lbnQsIG5vdCB0byB2aWV3cG9ydC5jb2xsZWN0aW9uXG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uZ2V0SXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uZ2V0SXRlbXMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50Lml0ZW1zIHx8IFtdO1xuICAgICAgfSxcblxuICAgICAgZ2V0VmlzaWJsZUl0ZW1zKCk6IFRbXSB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2UoKSB8fCB7XG4gICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgZW5kOiAwLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLnNsaWNlKHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xuICAgICAgfSxcblxuICAgICAgZ2V0SXRlbUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudG90YWxJdGVtcyB8fCBjb21wb25lbnQuaXRlbXM/Lmxlbmd0aCB8fCAwO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgaXRlbSBhdCBhIHNwZWNpZmljIGluZGV4XG4gICAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0cmlldmVcbiAgICAgICAqIEByZXR1cm5zIFRoZSBpdGVtIGF0IHRoZSBpbmRleCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgICAgICovXG4gICAgICBnZXRJdGVtKGluZGV4OiBudW1iZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5nZXRJdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uLmdldEl0ZW0oaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICByZXR1cm4gaXRlbXNbaW5kZXhdO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVcGRhdGUgaXRlbSBhdCBhIHNwZWNpZmljIGluZGV4XG4gICAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gdXBkYXRlXG4gICAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBuZXcgaXRlbSBkYXRhIChmdWxsIHJlcGxhY2VtZW50KVxuICAgICAgICovXG4gICAgICB1cGRhdGVJdGVtKGluZGV4OiBudW1iZXIsIGl0ZW06IFQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG5cbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtWTGlzdF0gdXBkYXRlSXRlbTogaW5kZXggJHtpbmRleH0gb3V0IG9mIGJvdW5kc2ApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbSA9IGl0ZW1zW2luZGV4XTtcblxuICAgICAgICAvLyBVcGRhdGUgaW4gY29sbGVjdGlvbiBpdGVtcyBhcnJheVxuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/Lml0ZW1zKSB7XG4gICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uaXRlbXNbaW5kZXhdID0gaXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZXZlbnQgZm9yIHJlbmRlcmluZyBmZWF0dXJlIHRvIGhhbmRsZSBET00gdXBkYXRlXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnVwZGF0ZS1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIHByZXZpb3VzSXRlbSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFVwZGF0ZSBpdGVtIGJ5IElEXG4gICAgICAgKiBGaW5kcyB0aGUgaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBieSBpdHMgSUQgYW5kIHVwZGF0ZXMgaXQgd2l0aCBuZXcgZGF0YVxuICAgICAgICogUmUtcmVuZGVycyB0aGUgaXRlbSBpZiBjdXJyZW50bHkgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcbiAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpdGVtIElEIHRvIGZpbmRcbiAgICAgICAqIEBwYXJhbSBkYXRhIC0gUGFydGlhbCBkYXRhIHRvIG1lcmdlIHdpdGggZXhpc3RpbmcgaXRlbSwgb3IgZnVsbCBpdGVtIHJlcGxhY2VtZW50XG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFVwZGF0ZSBvcHRpb25zXG4gICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0ZW0gd2FzIGZvdW5kIGFuZCB1cGRhdGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAqL1xuICAgICAgdXBkYXRlSXRlbUJ5SWQoXG4gICAgICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgIGRhdGE6IFBhcnRpYWw8VD4sXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAvKiogSWYgdHJ1ZSwgcmVwbGFjZSB0aGUgZW50aXJlIGl0ZW0gaW5zdGVhZCBvZiBtZXJnaW5nIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgICAgICAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICAgICAgICAvKiogSWYgdHJ1ZSwgcmUtcmVuZGVyIGV2ZW4gaWYgbm90IHZpc2libGUgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICAgICAgICAgIGZvcmNlUmVuZGVyPzogYm9vbGVhbjtcbiAgICAgICAgfSA9IHt9LFxuICAgICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHsgcmVwbGFjZSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBpdGVtIGJ5IElEIChoYW5kbGUgc3BhcnNlIGFycmF5cyBmcm9tIHBhZ2luYXRpb24pXG4gICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHMgc2luY2UgaXRlbXMgbWF5IGhhdmUgZGlmZmVyZW50IElEIHN0cnVjdHVyZXNcbiAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHMgLSB1c2VyX2lkIGlzIGltcG9ydGFudCBmb3IgcHJvZmlsZS9jb250YWN0IGl0ZW1zXG4gICAgICAgICAgY29uc3QgaWRzVG9DaGVjayA9IFtpdGVtLmlkLCBpdGVtLl9pZCwgaXRlbS51c2VyX2lkXS5maWx0ZXIoXG4gICAgICAgICAgICAodikgPT4gdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gaWRzVG9DaGVjay5zb21lKFxuICAgICAgICAgICAgKGl0ZW1JZCkgPT4gaXRlbUlkID09PSBpZCB8fCBTdHJpbmcoaXRlbUlkKSA9PT0gU3RyaW5nKGlkKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHVwZGF0ZUl0ZW1CeUlkOiBpdGVtIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtID0gaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIC8vIENyZWF0ZSB1cGRhdGVkIGl0ZW0gLSBlaXRoZXIgcmVwbGFjZSBlbnRpcmVseSBvciBtZXJnZVxuICAgICAgICBsZXQgdXBkYXRlZEl0ZW06IFQ7XG4gICAgICAgIGlmIChyZXBsYWNlKSB7XG4gICAgICAgICAgdXBkYXRlZEl0ZW0gPSB7IC4uLmRhdGEsIGlkOiBwcmV2aW91c0l0ZW0uaWQgPz8gaWQgfSBhcyBUO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE9ubHkgbWVyZ2UgcHJvcGVydGllcyB0aGF0IGhhdmUgYWN0dWFsIHZhbHVlcyAobm90IHVuZGVmaW5lZClcbiAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHBhcnRpYWwgdXBkYXRlcyBmcm9tIG92ZXJ3cml0aW5nIGV4aXN0aW5nIGRhdGFcbiAgICAgICAgICB1cGRhdGVkSXRlbSA9IHsgLi4ucHJldmlvdXNJdGVtIH0gYXMgVDtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgKHVwZGF0ZWRJdGVtIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBpbiBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5XG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uaXRlbXMpIHtcbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbi5pdGVtc1tpbmRleF0gPSB1cGRhdGVkSXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZXZlbnQgZm9yIHJlbmRlcmluZyBmZWF0dXJlIHRvIGhhbmRsZSBET00gdXBkYXRlXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnVwZGF0ZS1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpdGVtOiB1cGRhdGVkSXRlbSxcbiAgICAgICAgICBwcmV2aW91c0l0ZW0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgaXRlbSBhdCBhIHNwZWNpZmljIGluZGV4XG4gICAgICAgKiBSZW1vdmVzIHRoZSBpdGVtIGZyb20gdGhlIGNvbGxlY3Rpb24sIHVwZGF0ZXMgdG90YWxJdGVtcywgYW5kIHRyaWdnZXJzIHJlLXJlbmRlclxuICAgICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJlbW92ZVxuICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgKi9cbiAgICAgIHJlbW92ZUl0ZW0oaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uO1xuXG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHJlbW92ZUl0ZW06IGluZGV4ICR7aW5kZXh9IG91dCBvZiBib3VuZHNgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZW1vdmVkSXRlbSA9IGl0ZW1zW2luZGV4XTtcblxuICAgICAgICAvLyBSZW1vdmUgZnJvbSBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5IChjb21wb25lbnQuY29sbGVjdGlvbi5pdGVtcyBpcyB0aGUgYWN0dWFsIGFycmF5KVxuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/Lml0ZW1zKSB7XG4gICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uaXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElNUE9SVEFOVDogRW1pdCBpdGVtOnJlbW92ZS1yZXF1ZXN0IEZJUlNUIHNvIHJlbmRlcmluZyBmZWF0dXJlIHJlYnVpbGRzIGNvbGxlY3Rpb25JdGVtc1xuICAgICAgICAvLyBCRUZPUkUgc2V0VG90YWxJdGVtcyB0cmlnZ2VycyBhIHJlbmRlciB2aWEgdmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTpyZW1vdmUtcmVxdWVzdFwiLCB7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaXRlbTogcmVtb3ZlZEl0ZW0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0b3RhbEl0ZW1zIC0gdGhpcyB3aWxsIHRyaWdnZXIgdmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZCB3aGljaCBjYWxscyByZW5kZXJJdGVtc1xuICAgICAgICAvLyBCeSBub3csIGNvbGxlY3Rpb25JdGVtcyBoYXMgYmVlbiByZWJ1aWx0IGJ5IHRoZSBpdGVtOnJlbW92ZS1yZXF1ZXN0IGhhbmRsZXJcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldFRvdGFsSXRlbXMgJiYgY29sbGVjdGlvbj8uc2V0VG90YWxJdGVtcykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb3RhbCA9IGNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhNYXRoLm1heCgwLCBjdXJyZW50VG90YWwgLSAxKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uPy5zZXRUb3RhbEl0ZW1zKSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gdmlld3BvcnQuY29sbGVjdGlvbiBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBjdXJyZW50VG90YWwgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhcbiAgICAgICAgICAgIE1hdGgubWF4KDAsIGN1cnJlbnRUb3RhbCAtIDEpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTGFzdCByZXNvcnQ6IHVwZGF0ZSBjb21wb25lbnQudG90YWxJdGVtcyBkaXJlY3RseVxuICAgICAgICAgIGlmIChjb21wb25lbnQudG90YWxJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb21wb25lbnQudG90YWxJdGVtcyA9IE1hdGgubWF4KDAsIGNvbXBvbmVudC50b3RhbEl0ZW1zIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBpdGVtIGJ5IElEXG4gICAgICAgKiBGaW5kcyB0aGUgaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBieSBpdHMgSUQgYW5kIHJlbW92ZXMgaXRcbiAgICAgICAqIFVwZGF0ZXMgdG90YWxJdGVtcyBhbmQgdHJpZ2dlcnMgcmUtcmVuZGVyIG9mIHZpc2libGUgaXRlbXNcbiAgICAgICAqIE9wdGlvbmFsbHkgdHJhY2tzIGFzIHBlbmRpbmcgcmVtb3ZhbCB0byBmaWx0ZXIgZnJvbSBmdXR1cmUgZmV0Y2hlc1xuICAgICAgICogQHBhcmFtIGlkIC0gVGhlIGl0ZW0gSUQgdG8gZmluZCBhbmQgcmVtb3ZlXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlbW92ZSBvcHRpb25zICh0cmFja1BlbmRpbmcsIHBlbmRpbmdUaW1lb3V0KVxuICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgKi9cbiAgICAgIHJlbW92ZUl0ZW1CeUlkKFxuICAgICAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICBvcHRpb25zOiBSZW1vdmVJdGVtT3B0aW9ucyA9IHt9LFxuICAgICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHsgdHJhY2tQZW5kaW5nID0gdHJ1ZSwgcGVuZGluZ1RpbWVvdXQgPSA1MDAwIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHJlbW92ZUl0ZW1CeUlkOiBpbnZhbGlkIGlkYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRvIHBlbmRpbmcgcmVtb3ZhbHMgdG8gZmlsdGVyIGZyb20gZnV0dXJlIHNlcnZlciByZXNwb25zZXNcbiAgICAgICAgaWYgKHRyYWNrUGVuZGluZykge1xuICAgICAgICAgIHBlbmRpbmdSZW1vdmFscy5hZGQoaWQpO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgZnJvbSBwZW5kaW5nIHJlbW92YWxzIGFmdGVyIHRpbWVvdXQgKHNlcnZlciBzaG91bGQgaGF2ZSB1cGRhdGVkIGJ5IHRoZW4pXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBwZW5kaW5nUmVtb3ZhbHMuZGVsZXRlKGlkKTtcbiAgICAgICAgICB9LCBwZW5kaW5nVGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBpdGVtIGJ5IElEIChoYW5kbGUgc3BhcnNlIGFycmF5cyBmcm9tIHBhZ2luYXRpb24pXG4gICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHMgc2luY2UgaXRlbXMgbWF5IGhhdmUgZGlmZmVyZW50IElEIHN0cnVjdHVyZXNcbiAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHNcbiAgICAgICAgICBjb25zdCBpZHNUb0NoZWNrID0gW2l0ZW0uaWQsIGl0ZW0uX2lkLCBpdGVtLnVzZXJfaWRdLmZpbHRlcihcbiAgICAgICAgICAgICh2KSA9PiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBpZHNUb0NoZWNrLnNvbWUoXG4gICAgICAgICAgICAoaXRlbUlkKSA9PiBpdGVtSWQgPT09IGlkIHx8IFN0cmluZyhpdGVtSWQpID09PSBTdHJpbmcoaWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVJdGVtKGluZGV4KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgYW4gaXRlbSBJRCBpcyBwZW5kaW5nIHJlbW92YWxcbiAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpdGVtIElEIHRvIGNoZWNrXG4gICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpdGVtIGlzIHBlbmRpbmcgcmVtb3ZhbFxuICAgICAgICovXG4gICAgICBpc1BlbmRpbmdSZW1vdmFsKGlkOiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdSZW1vdmFscy5oYXMoaWQpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIHBlbmRpbmcgcmVtb3ZhbCBJRHNcbiAgICAgICAqIEByZXR1cm5zIFNldCBvZiBwZW5kaW5nIHJlbW92YWwgSURzXG4gICAgICAgKi9cbiAgICAgIGdldFBlbmRpbmdSZW1vdmFscygpOiBTZXQ8c3RyaW5nIHwgbnVtYmVyPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KHBlbmRpbmdSZW1vdmFscyk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGEgc3BlY2lmaWMgcGVuZGluZyByZW1vdmFsXG4gICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgaXRlbSBJRCB0byBjbGVhciBmcm9tIHBlbmRpbmcgcmVtb3ZhbHNcbiAgICAgICAqL1xuICAgICAgY2xlYXJQZW5kaW5nUmVtb3ZhbChpZDogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHBlbmRpbmdSZW1vdmFscy5kZWxldGUoaWQpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhbGwgcGVuZGluZyByZW1vdmFsc1xuICAgICAgICovXG4gICAgICBjbGVhckFsbFBlbmRpbmdSZW1vdmFscygpOiB2b2lkIHtcbiAgICAgICAgcGVuZGluZ1JlbW92YWxzLmNsZWFyKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEZpbHRlciBpdGVtcyBhcnJheSB0byBleGNsdWRlIHBlbmRpbmcgcmVtb3ZhbHNcbiAgICAgICAqIFV0aWxpdHkgbWV0aG9kIGZvciB1c2UgaW4gY29sbGVjdGlvbiBhZGFwdGVyc1xuICAgICAgICogQHBhcmFtIGl0ZW1zIC0gQXJyYXkgb2YgaXRlbXMgdG8gZmlsdGVyXG4gICAgICAgKiBAcmV0dXJucyBGaWx0ZXJlZCBhcnJheSB3aXRob3V0IHBlbmRpbmcgcmVtb3ZhbCBpdGVtc1xuICAgICAgICovXG4gICAgICBmaWx0ZXJQZW5kaW5nUmVtb3ZhbHM8SSBleHRlbmRzIHsgaWQ/OiBhbnk7IF9pZD86IGFueSB9PihcbiAgICAgICAgaXRlbXM6IElbXSxcbiAgICAgICk6IElbXSB7XG4gICAgICAgIGlmIChwZW5kaW5nUmVtb3ZhbHMuc2l6ZSA9PT0gMCkgcmV0dXJuIGl0ZW1zO1xuXG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGl0ZW0uX2lkIHx8IGl0ZW0uaWQ7XG4gICAgICAgICAgcmV0dXJuICFwZW5kaW5nUmVtb3ZhbHMuaGFzKGlkKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvLyBMb2FkaW5nIG9wZXJhdGlvbnNcbiAgICAgIGFzeW5jIGxvYWRSYW5nZShcbiAgICAgICAgcGFnZTogbnVtYmVyLFxuICAgICAgICBsaW1pdDogbnVtYmVyLFxuICAgICAgICBzdHJhdGVneTogc3RyaW5nID0gXCJwYWdlXCIsXG4gICAgICAgIGFsaWdubWVudD86IHN0cmluZyxcbiAgICAgICkge1xuICAgICAgICBpc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCBvZmZzZXQgPSBzdHJhdGVneSA9PT0gXCJwYWdlXCIgPyAocGFnZSAtIDEpICogbGltaXQgOiBwYWdlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5sb2FkUmFuZ2Uob2Zmc2V0LCBsaW1pdCk7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwibG9hZFwiLCB7IHBhZ2UsIGxpbWl0LCBzdHJhdGVneSB9KTtcblxuICAgICAgICAgICAgLy8gU2Nyb2xsIHRvIHRoZSBsb2FkZWQgcmFuZ2UgaWYgYWxpZ25tZW50IGlzIHNwZWNpZmllZFxuICAgICAgICAgICAgaWYgKGFsaWdubWVudCkge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IG9mZnNldDtcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiZXJyb3JcIiwgeyBlcnJvciB9KTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8vIERhdGEgbG9hZGluZ1xuICAgICAgbG9hZE5leHQ6IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFtWTGlzdF0gbG9hZE5leHQoKWApO1xuXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbnN0IGxvYWRlZFJhbmdlcyA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpO1xuXG4gICAgICAgICAgLy8gRmluZCB0aGUgbmV4dCB1bmxvYWRlZCByYW5nZVxuICAgICAgICAgIGxldCBuZXh0T2Zmc2V0ID0gMDtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJhbmdlSWQgb2YgbG9hZGVkUmFuZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZUVuZCA9IChyYW5nZUlkICsgMSkgKiAoY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0IHx8IDIwKTtcbiAgICAgICAgICAgIGlmIChyYW5nZUVuZCA+IG5leHRPZmZzZXQpIHtcbiAgICAgICAgICAgICAgbmV4dE9mZnNldCA9IHJhbmdlRW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChuZXh0T2Zmc2V0IDwgdG90YWxJdGVtcykge1xuICAgICAgICAgICAgYXdhaXQgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZFJhbmdlKFxuICAgICAgICAgICAgICBuZXh0T2Zmc2V0LFxuICAgICAgICAgICAgICBjb25maWcucGFnaW5hdGlvbj8ubGltaXQgfHwgMjAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGlzTG9hZGluZztcbiAgICAgIH0sXG5cbiAgICAgIGhhc05leHQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCB0b3RhbCA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldEl0ZW1zKCk7XG4gICAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aCA8IHRvdGFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIE5vdGU6IFNlbGVjdGlvbiBvcGVyYXRpb25zIGFyZSBoYW5kbGVkIGJ5IHRoZSB3aXRoU2VsZWN0aW9uIGZlYXR1cmVcbiAgICAgIC8vIFRoZXNlIGFyZSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGJ1dCBkZWxlZ2F0ZSB0byBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgIGdldFNlbGVjdGVkSWRzKCk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIFVzZSBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBpbmRpY2VzID0gY29tcG9uZW50LmdldFNlbGVjdGVkSW5kaWNlcygpO1xuICAgICAgICAgIHJldHVybiBpbmRpY2VzLm1hcCgoaWR4OiBudW1iZXIpID0+IChpdGVtc1tpZHhdIGFzIGFueSk/LmlkIHx8IGlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gbG9jYWwgdHJhY2tpbmdcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oc2VsZWN0ZWRJZHMpO1xuICAgICAgfSxcblxuICAgICAgc2VsZWN0SXRlbShpZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnNlbGVjdEl0ZW1zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBVc2Ugc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGxvY2FsIHRyYWNraW5nXG4gICAgICAgICAgc2VsZWN0ZWRJZHMuYWRkKGlkKTtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7XG4gICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5nZXRTZWxlY3RlZElkcygpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBkZXNlbGVjdEl0ZW0oaWQ6IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5kZXNlbGVjdEl0ZW1zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBVc2Ugc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZGVzZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gbG9jYWwgdHJhY2tpbmdcbiAgICAgICAgICBzZWxlY3RlZElkcy5kZWxldGUoaWQpO1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJzZWxlY3Rpb246Y2hhbmdlXCIsIHtcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLmdldFNlbGVjdGVkSWRzKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5jbGVhclNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gVXNlIHNlbGVjdGlvbiBmZWF0dXJlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbXBvbmVudC5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGxvY2FsIHRyYWNraW5nXG4gICAgICAgICAgc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7IHNlbGVjdGVkOiBbXSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gU2Nyb2xsaW5nIG1ldGhvZHNcbiAgICAgIHNjcm9sbFRvSW5kZXg6IChcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICAgICAgYW5pbWF0ZT86IGJvb2xlYW4sXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIHRvIGluZGV4IGFuZCBzZWxlY3QgaXRlbSBhZnRlciBkYXRhIGxvYWRzXG4gICAgICAgKiBVc2VmdWwgZm9yIHJ1bnRpbWUgc2Nyb2xsK3NlbGVjdCB3aGVuIFZMaXN0IGlzIGFscmVhZHkgY3JlYXRlZFxuICAgICAgICovXG4gICAgICBzY3JvbGxUb0luZGV4QW5kU2VsZWN0OiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICAgIHNlbGVjdElkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciByYW5nZSBsb2FkIHRvIGNvbXBsZXRlLCB0aGVuIHNlbGVjdFxuICAgICAgICBjb25zdCBvblJhbmdlTG9hZGVkID0gKCkgPT4ge1xuICAgICAgICAgIGNvbXBvbmVudC5vZmY/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5zZWxlY3RCeUlkKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5zZWxlY3RCeUlkKHNlbGVjdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcblxuICAgICAgICAvLyBGYWxsYmFjayB0aW1lb3V0IGluIGNhc2UgZXZlbnQgZG9lc24ndCBmaXJlIChkYXRhIGFscmVhZHkgbG9hZGVkKVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wb25lbnQub2ZmPy4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwgb25SYW5nZUxvYWRlZCk7XG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5zZWxlY3RCeUlkKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VsZWN0QnlJZChzZWxlY3RJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAzMDApO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvSXRlbTogYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgICBpdGVtSWQ6IHN0cmluZyxcbiAgICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICAgICAgYW5pbWF0ZT86IGJvb2xlYW4sXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KFxuICAgICAgICAgIChpdGVtOiBhbnkpID0+IFN0cmluZyhpdGVtLmlkKSA9PT0gU3RyaW5nKGl0ZW1JZCksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQsIGFuaW1hdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS53YXJuKGBJdGVtICR7aXRlbUlkfSBub3QgZm91bmRgKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9Ub3A6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsVG9JbmRleCgwLCBcInN0YXJ0XCIpO1xuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9Cb3R0b206IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHRoaXMuZ2V0SXRlbUNvdW50KCk7XG4gICAgICAgIGlmICh0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgodG90YWxJdGVtcyAtIDEsIFwiZW5kXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvUGFnZTogYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgICBwYWdlTnVtOiBudW1iZXIsXG4gICAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgICAgIGFuaW1hdGU/OiBib29sZWFuLFxuICAgICAgKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbVkxpc3RdIHNjcm9sbFRvUGFnZSgke3BhZ2VOdW19KWApO1xuXG4gICAgICAgIC8vIEdldCBsaW1pdCBmcm9tIGNvbmZpZyAocmFuZ2VTaXplKSBvciBkZWZhdWx0XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0IHx8IDIwO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICAgIGlmIChjb25maWcucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgICAvLyBJbiBjdXJzb3IgbW9kZSwgd2UgbmVlZCB0byBoYW5kbGUgc2VxdWVudGlhbCBsb2FkaW5nXG4gICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgICBpZiAoY29sbGVjdGlvbikge1xuICAgICAgICAgICAgY29uc3QgbG9hZGVkUmFuZ2VzID0gY29sbGVjdGlvbi5nZXRMb2FkZWRSYW5nZXMoKTtcbiAgICAgICAgICAgIGNvbnN0IGhpZ2hlc3RMb2FkZWRQYWdlID0gbG9hZGVkUmFuZ2VzLnNpemU7XG5cbiAgICAgICAgICAgIGlmIChwYWdlTnVtID4gaGlnaGVzdExvYWRlZFBhZ2UgKyAxKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICBgW1ZMaXN0XSBDYW5ub3QganVtcCB0byBwYWdlICR7cGFnZU51bX0gaW4gY3Vyc29yIG1vZGUuIGAgK1xuICAgICAgICAgICAgICAgICAgYExvYWRpbmcgcGFnZXMgc2VxdWVudGlhbGx5IGZyb20gJHtcbiAgICAgICAgICAgICAgICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgKyAxXG4gICAgICAgICAgICAgICAgICB9IHRvICR7cGFnZU51bX1gLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSB2aWV3cG9ydCdzIHNjcm9sbFRvUGFnZSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uc2Nyb2xsVG9QYWdlKSB7XG4gICAgICAgICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvUGFnZShwYWdlTnVtLCBsaW1pdCwgYWxpZ25tZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBzY3JvbGxUb0luZGV4XG4gICAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSAocGFnZU51bSAtIDEpICogbGltaXQ7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxUb0luZGV4KHRhcmdldEluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBnZXRTY3JvbGxQb3NpdGlvbjogKCkgPT4ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRTY3JvbGxQb3NpdGlvbigpIHx8IDA7XG4gICAgICB9LFxuXG4gICAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSk/LmNvbGxlY3Rpb247XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uPy5nZXRDdXJyZW50Q3Vyc29yPy4oKSB8fCBudWxsO1xuICAgICAgfSxcblxuICAgICAgc2V0U2Nyb2xsQW5pbWF0aW9uKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gU3RvcmUgYW5pbWF0aW9uIHByZWZlcmVuY2UgKHdvdWxkIGJlIHVzZWQgYnkgdmlld3BvcnQgc2Nyb2xsaW5nIGZlYXR1cmUpXG4gICAgICAgIGNvbXBvbmVudC5zY3JvbGxBbmltYXRpb24gPSBlbmFibGVkO1xuICAgICAgfSxcblxuICAgICAgLy8gU3RhdGVcbiAgICAgIGdldFN0YXRlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGl0ZW1zOiB0aGlzLmdldEl0ZW1zKCksXG4gICAgICAgICAgdG90YWxJdGVtczogY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uXG4gICAgICAgICAgICA/IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKVxuICAgICAgICAgICAgOiBjb21wb25lbnQudG90YWxJdGVtcyB8fCAwLFxuICAgICAgICAgIHZpc2libGVSYW5nZTogY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2UoKSB8fCB7XG4gICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgIGVuZDogMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uOiBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCxcbiAgICAgICAgICBzZWxlY3RlZElkczogdGhpcy5nZXRTZWxlY3RlZElkcygpLFxuICAgICAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIExpZmVjeWNsZVxuICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uZGVzdHJveSkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImRlc3Ryb3llZFwiKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogbXRybC1hZGRvbnMgTGlzdCBDb21wb25lbnQgQ29uc3RhbnRzXG4gKlxuICogQ29uc3RhbnRzIGZvciB0aGUgYWRkb25zIGxpc3QgY29tcG9uZW50LlxuICogTm90ZTogQmFzZSBtdHJsIGxpc3QgZnVuY3Rpb25hbGl0eSBpcyBoYW5kbGVkIGJ5IG10cmwgY29yZS5cbiAqIFRoZXNlIGNvbnN0YW50cyBhcmUgZm9yIGFkZG9ucy1zcGVjaWZpYyBmZWF0dXJlcyBvbmx5LlxuICovXG5cbi8qKlxuICogQ1NTIGNsYXNzIG5hbWVzIGZvciBWTGlzdCBjb21wb25lbnRcbiAqIEZvbGxvd2luZyBCRU0gY29udmVudGlvbjogY29tcG9uZW50X19lbGVtZW50LS1tb2RpZmllclxuICogTm90ZTogbXRybCBwcmVmaXggaXMgYWRkZWQgYXV0b21hdGljYWxseSBieSBjb3JlIERPTSBjbGFzc2VzIHN5c3RlbVxuICovXG5leHBvcnQgY29uc3QgVkxJU1RfQ0xBU1NFUyA9IHtcbiAgLyoqIExpc3QgZWxlbWVudCAqL1xuICBMSVNUOiBcInZsaXN0XCIsXG4gIC8qKiBMaXN0IGl0ZW0gKi9cbiAgSVRFTTogXCJ2aWV3cG9ydC1pdGVtXCIsXG4gIC8qKiBTZWxlY3RlZCBsaXN0IGl0ZW0gKi9cbiAgU0VMRUNURUQ6IFwidmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIixcbiAgLyoqIEVtcHR5IHN0YXRlICovXG4gIEVNUFRZOiBcInZsaXN0LS1lbXB0eVwiLFxuICAvKiogU2Nyb2xsZWQgc3RhdGUgLSBsaXN0IGlzIG5vdCBhdCB0aGUgdG9wICovXG4gIFNDUk9MTEVEOiBcInZsaXN0LS1zY3JvbGxlZFwiLFxufSBhcyBjb25zdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvc2VsZWN0aW9uLnRzXG5cbmltcG9ydCB0eXBlIHsgVkxpc3RDb25maWcsIFZMaXN0Q29tcG9uZW50LCBWTGlzdEl0ZW0gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZMSVNUX0NMQVNTRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBQUkVGSVgsIGFkZENsYXNzLCByZW1vdmVDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogU2VsZWN0aW9uIHN0YXRlIGludGVyZmFjZVxuICovXG5pbnRlcmZhY2UgU2VsZWN0aW9uU3RhdGUge1xuICBzZWxlY3RlZElkczogU2V0PHN0cmluZyB8IG51bWJlcj47XG4gIG1vZGU6IFwibm9uZVwiIHwgXCJzaW5nbGVcIiB8IFwibXVsdGlwbGVcIjtcbiAgbGFzdFNlbGVjdGVkSW5kZXg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogR2V0IGl0ZW0gSUQgZnJvbSBlbGVtZW50IG9yIGl0ZW0gZGF0YVxuICovXG5jb25zdCBnZXRJdGVtSWQgPSAoaXRlbTogYW55KTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGl0ZW0/LmlkICE9PSB1bmRlZmluZWQpIHJldHVybiBpdGVtLmlkO1xuICBpZiAoaXRlbT8uX2lkICE9PSB1bmRlZmluZWQpIHJldHVybiBpdGVtLl9pZDtcbiAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBpdGVtID09PSBcIm51bWJlclwiKSByZXR1cm4gaXRlbTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogQWRkcyBzZWxlY3Rpb24gbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgdG8gVkxpc3QgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoU2VsZWN0aW9uID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+LFxuKSA9PiB7XG4gIHJldHVybiAoY29tcG9uZW50OiBWTGlzdENvbXBvbmVudDxUPik6IFZMaXN0Q29tcG9uZW50PFQ+ID0+IHtcbiAgICBpZiAoIWNvbmZpZy5zZWxlY3Rpb24/LmVuYWJsZWQgfHwgY29uZmlnLnNlbGVjdGlvbj8ubW9kZSA9PT0gXCJub25lXCIpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGU6IFNlbGVjdGlvblN0YXRlID0ge1xuICAgICAgc2VsZWN0ZWRJZHM6IG5ldyBTZXQoKSxcbiAgICAgIG1vZGU6IGNvbmZpZy5zZWxlY3Rpb24/Lm1vZGUgfHwgXCJzaW5nbGVcIixcbiAgICAgIGxhc3RTZWxlY3RlZEluZGV4OiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlcXVpcmVNb2RpZmllcnMgPSBjb25maWcuc2VsZWN0aW9uPy5yZXF1aXJlTW9kaWZpZXJzID8/IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQXBwbHkgc2VsZWN0aW9uIGNsYXNzIHRvIHJlbmRlcmVkIGVsZW1lbnRzIG1hdGNoaW5nIHNlbGVjdGVkIElEc1xuICAgICAqL1xuICAgIGNvbnN0IGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbXBvbmVudC5lbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtc2AsXG4gICAgICApO1xuICAgICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICAgICAgY29uc3QgaXRlbXMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnQtaXRlbVtkYXRhLWlkXWAsXG4gICAgICApO1xuXG4gICAgICBpdGVtcy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZWwgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGlkID0gZWxlbWVudC5kYXRhc2V0LmlkO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIENoZWNrIGJvdGggc3RyaW5nIGFuZCBudW1iZXIgdmVyc2lvbnMgb2YgdGhlIElEXG4gICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpIHx8IHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhOdW1iZXIoaWQpKTtcbiAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgVkxJU1RfQ0xBU1NFUy5TRUxFQ1RFRCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIFZMSVNUX0NMQVNTRVMuU0VMRUNURUQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBpdGVtIGNsaWNrIGZvciBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVJdGVtQ2xpY2sgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY29uc3Qgdmlld3BvcnRJdGVtID0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtW2RhdGEtaW5kZXhdYCxcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZXdwb3J0SXRlbSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHZpZXdwb3J0SXRlbS5kYXRhc2V0LmluZGV4IHx8IFwiLTFcIik7XG4gICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgIGNvbnN0IGl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbXM/LigpO1xuICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zPy5baW5kZXhdO1xuICAgICAgaWYgKCFpdGVtKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgIGlmIChpdGVtSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB3YXNTZWxlY3RlZCA9IHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpdGVtSWQpO1xuXG4gICAgICBpZiAoc3RhdGUubW9kZSA9PT0gXCJzaW5nbGVcIikge1xuICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICBpZiAoIXdhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5tb2RlID09PSBcIm11bHRpcGxlXCIpIHtcbiAgICAgICAgaWYgKGUuc2hpZnRLZXkgJiYgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5taW4oc3RhdGUubGFzdFNlbGVjdGVkSW5kZXgsIGluZGV4KTtcbiAgICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1heChzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCwgaW5kZXgpO1xuXG4gICAgICAgICAgaWYgKCFlLmN0cmxLZXkgJiYgIWUubWV0YUtleSkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlSXRlbSA9IGl0ZW1zPy5baV07XG4gICAgICAgICAgICBjb25zdCByYW5nZUl0ZW1JZCA9IGdldEl0ZW1JZChyYW5nZUl0ZW0pO1xuICAgICAgICAgICAgaWYgKHJhbmdlSXRlbUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKHJhbmdlSXRlbUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkge1xuICAgICAgICAgIGlmICh3YXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpdGVtSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChyZXF1aXJlTW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh3YXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpdGVtSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFbWl0IHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnRcbiAgICAgKi9cbiAgICBjb25zdCBlbWl0U2VsZWN0aW9uQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgaXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtcz8uKCkgfHwgW107XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBpdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgICAgcmV0dXJuIGlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBpdGVtcy5yZWR1Y2UoXG4gICAgICAgIChhY2M6IG51bWJlcltdLCBpdGVtOiBhbnksIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBnZXRJdGVtSWQoaXRlbSk7XG4gICAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgYWNjLnB1c2goaWR4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAgW10gYXMgbnVtYmVyW10sXG4gICAgICApO1xuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7IHNlbGVjdGVkSXRlbXMsIHNlbGVjdGVkSW5kaWNlcyB9KTtcblxuICAgICAgaWYgKGNvbmZpZy5zZWxlY3Rpb24/Lm9uU2VsZWN0aW9uQ2hhbmdlKSB7XG4gICAgICAgIGNvbmZpZy5zZWxlY3Rpb24ub25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0ZWRJdGVtcywgc2VsZWN0ZWRJbmRpY2VzKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU2V0dXA6IGxpc3RlbiBmb3IgcmVuZGVycyBhbmQgY2xpY2tzXG4gICAgY29uc3Qgc2V0dXAgPSAoKSA9PiB7XG4gICAgICAvLyBBZGQgbW9kZSBjbGFzcyB0byBjb250YWluZXJcbiAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICBhZGRDbGFzcyhjb21wb25lbnQuZWxlbWVudCwgXCJ2bGlzdC0tc2VsZWN0aW9uXCIpO1xuICAgICAgICBhZGRDbGFzcyhjb21wb25lbnQuZWxlbWVudCwgYHZsaXN0LS1zZWxlY3Rpb24tJHtzdGF0ZS5tb2RlfWApO1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlSXRlbUNsaWNrLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgc2VsZWN0aW9uIGFmdGVyIGVhY2ggcmVuZGVyXG4gICAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcbiAgICAgICAgXCJ2aWV3cG9ydDppdGVtcy1yZW5kZXJlZFwiLFxuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMsXG4gICAgICApO1xuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLm9uPy4oXCJ2aWV3cG9ydDpyZW5kZXJlZFwiLCBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMpO1xuXG4gICAgICAvLyBDbGVhbiB1cCBzZWxlY3Rpb24gd2hlbiBpdGVtIGlzIHJlbW92ZWRcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgICBcIml0ZW06cmVtb3ZlZFwiLFxuICAgICAgICAoZGF0YTogeyBpdGVtOiBhbnk7IGluZGV4OiBudW1iZXIgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChkYXRhLml0ZW0pO1xuICAgICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaXRlbUlkKSkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVtb3ZlZCBpdGVtIHdhcyB0aGUgbGFzdCBzZWxlY3RlZCBpbmRleCwgY2xlYXIgaXRcbiAgICAgICAgICAgIGlmIChzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9PT0gZGF0YS5pbmRleCkge1xuICAgICAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPiBkYXRhLmluZGV4XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gQWRqdXN0IGxhc3RTZWxlY3RlZEluZGV4IHNpbmNlIGl0ZW1zIHNoaWZ0ZWQgZG93blxuICAgICAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgYWZ0ZXIgY29tcG9uZW50IGlzIHJlYWR5XG4gICAgc2V0VGltZW91dChzZXR1cCwgMCk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGluaXRpYWwgbG9hZCBjb21wbGV0ZSB0byBhdXRvLXNlbGVjdCBpdGVtXG4gICAgLy8gVGhpcyBtdXN0IGJlIGluIHdpdGhTZWxlY3Rpb24gYmVjYXVzZSBzZWxlY3RCeUlkIGlzIGRlZmluZWQgaGVyZVxuICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLFxuICAgICAgKGRhdGE6IHsgc2VsZWN0SWQ6IHN0cmluZyB8IG51bWJlciB9KSA9PiB7XG4gICAgICAgIGlmIChkYXRhPy5zZWxlY3RJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gVXNlIHJlcXVlc3RBbmltYXRpb25GcmFtZSB0byBlbnN1cmUgcmVuZGVyaW5nIGlzIGNvbXBsZXRlXG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoZGF0YS5zZWxlY3RJZCk7XG4gICAgICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gQ2xlYW51cCBvbiBkZXN0cm95XG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBjb21wb25lbnQuZWxlbWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUl0ZW1DbGljaywgdHJ1ZSk7XG4gICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgIH07XG5cbiAgICAvLyBFbmhhbmNlZCBjb21wb25lbnQgd2l0aCBzZWxlY3Rpb24gQVBJXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgc2VsZWN0SXRlbXMoaW5kaWNlczogbnVtYmVyW10pIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSAodGhpcyBhcyBhbnkpLmdldEl0ZW1zPy4oKTtcbiAgICAgICAgaWYgKCFpdGVtcykgcmV0dXJuO1xuXG4gICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgICAgICAgLy8gSW4gc2luZ2xlIG1vZGUsIGNsZWFyIHByZXZpb3VzIHNlbGVjdGlvbiBiZWZvcmUgYWRkaW5nIG5ldyBvbmVcbiAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgIGlmIChpbmRpY2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGluZGljZXMgPSBbaW5kaWNlc1swXV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaW5kaWNlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtc1tpbmRleF0pO1xuICAgICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaW5kaWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cblxuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgfSxcblxuICAgICAgZGVzZWxlY3RJdGVtcyhpbmRpY2VzOiBudW1iZXJbXSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpO1xuICAgICAgICBpZiAoIWl0ZW1zKSByZXR1cm47XG5cbiAgICAgICAgaW5kaWNlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtc1tpbmRleF0pO1xuICAgICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgfSxcblxuICAgICAgZ2V0U2VsZWN0ZWRJdGVtcygpOiBUW10ge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpIHx8IFtdO1xuICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgICAgICByZXR1cm4gaWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIGdldFNlbGVjdGVkSW5kaWNlcygpOiBudW1iZXJbXSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCkgfHwgW107XG4gICAgICAgIHJldHVybiBpdGVtcy5yZWR1Y2UoKGFjYzogbnVtYmVyW10sIGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gZ2V0SXRlbUlkKGl0ZW0pO1xuICAgICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10gYXMgbnVtYmVyW10pO1xuICAgICAgfSxcblxuICAgICAgaXNTZWxlY3RlZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCk7XG4gICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtcz8uW2luZGV4XSk7XG4gICAgICAgIHJldHVybiBpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaXRlbUlkKTtcbiAgICAgIH0sXG5cbiAgICAgIHNlbGVjdEJ5SWQoaWQ6IHN0cmluZyB8IG51bWJlciwgc2lsZW50OiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gXCJzaW5nbGVcIikge1xuICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaWQpO1xuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENoZWNrIGlmIGFuIGl0ZW0gYXQgaW5kZXggaXMgZnVsbHkgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcbiAgICAgICAqIFVzZXMgRE9NIGVsZW1lbnQgcG9zaXRpb24gZm9yIHByZWNpc2UgY2hlY2tpbmdcbiAgICAgICAqL1xuICAgICAgaXNJdGVtRnVsbHlWaXNpYmxlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnQtaXRlbXNgLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnRgLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXZpZXdwb3J0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgaXRlbUVsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtW2RhdGEtaW5kZXg9XCIke2luZGV4fVwiXWAsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghaXRlbUVsZW1lbnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCB2aWV3cG9ydFJlY3QgPSB2aWV3cG9ydC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3QgPSBpdGVtRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBpdGVtIGlzIGZ1bGx5IHdpdGhpbiB2aWV3cG9ydCBib3VuZHNcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBpdGVtUmVjdC50b3AgPj0gdmlld3BvcnRSZWN0LnRvcCAmJlxuICAgICAgICAgIGl0ZW1SZWN0LmJvdHRvbSA8PSB2aWV3cG9ydFJlY3QuYm90dG9tXG4gICAgICAgICk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBpdGVtIGF0IGluZGV4LCBzY3JvbGxpbmcgYW5kIHdhaXRpbmcgZm9yIGRhdGEgaWYgbmVlZGVkXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKiBVc2VzIHByZWNpc2UgRE9NLWJhc2VkIHZpc2liaWxpdHkgY2hlY2tcbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0QXRJbmRleChpbmRleDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgY3VycmVudCBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lIG5hdmlnYXRpb24gZGlyZWN0aW9uXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRpY2VzID0gdGhpcy5nZXRTZWxlY3RlZEluZGljZXMoKTtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gY3VycmVudEluZGljZXMubGVuZ3RoID4gMCA/IGN1cnJlbnRJbmRpY2VzWzBdIDogLTE7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGluZGV4ID4gY3VycmVudEluZGV4ID8gXCJkb3duXCIgOiBcInVwXCI7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaXRlbSBpcyBmdWxseSB2aXNpYmxlIHVzaW5nIHByZWNpc2UgRE9NIGNoZWNrXG4gICAgICAgIGNvbnN0IGlzRnVsbHlWaXNpYmxlID0gdGhpcy5pc0l0ZW1GdWxseVZpc2libGUoaW5kZXgpO1xuXG4gICAgICAgIGlmICghaXNGdWxseVZpc2libGUgJiYgZW5oYW5jZWRDb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgpIHtcbiAgICAgICAgICAvLyBTY3JvbGwgd2l0aCBhbGlnbm1lbnQgYmFzZWQgb24gbmF2aWdhdGlvbiBkaXJlY3Rpb25cbiAgICAgICAgICAvLyBEb3duIG5hdmlnYXRpb246IGFsaWduIHRvIGVuZCAoaXRlbSBhdCBib3R0b20pXG4gICAgICAgICAgLy8gVXAgbmF2aWdhdGlvbjogYWxpZ24gdG8gc3RhcnQgKGl0ZW0gYXQgdG9wKVxuICAgICAgICAgIGNvbnN0IGFsaWdubWVudCA9IGRpcmVjdGlvbiA9PT0gXCJkb3duXCIgPyBcImVuZFwiIDogXCJzdGFydFwiO1xuICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcnkgdG8gc2VsZWN0IGltbWVkaWF0ZWx5IC0gd29ya3MgaWYgaXRlbSBpcyBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBjb25zdCBpdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1zPy4oKSB8fCBbXTtcbiAgICAgICAgaWYgKGl0ZW1zW2luZGV4XSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJdGVtIG5vdCBsb2FkZWQgeWV0IC0gd2FpdCBmb3IgZGF0YSB0byBsb2FkIHRoZW4gc2VsZWN0XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIGxldCByZXNvbHZlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgY29uc3Qgb25SYW5nZUxvYWRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29tcG9uZW50Lm9mZj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcblxuICAgICAgICAgIC8vIEZhbGxiYWNrIHRpbWVvdXQgaW4gY2FzZSBldmVudCBkb2Vzbid0IGZpcmUgKGRhdGEgYWxyZWFkeSBsb2FkZWQpXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5vZmY/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3QgbmV4dCBpdGVtIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKiBSZXNwZWN0cyBrZXlib2FyZC53cmFwIG9wdGlvbiBmb3Igd3JhcHBpbmcgYXQgbGlzdCBib3VuZGFyaWVzXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHNlbGVjdE5leHQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzID0gdGhpcy5nZXRTZWxlY3RlZEluZGljZXMoKTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcbiAgICAgICAgY29uc3Qgd3JhcCA9IGNvbmZpZy5rZXlib2FyZD8ud3JhcCA/PyB0cnVlOyAvLyBNRDMgZGVmYXVsdCBpcyB0cnVlXG5cbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBTZWxlY3QgZmlyc3QgaXRlbVxuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgoMCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBzZWxlY3RlZEluZGljZXNbMF07XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KG5leHRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdCB0aGUgZW5kIC0gd3JhcCB0byBiZWdpbm5pbmcgaWYgZW5hYmxlZFxuICAgICAgICBpZiAod3JhcCAmJiB0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgoMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBwcmV2aW91cyBpdGVtIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKiBSZXNwZWN0cyBrZXlib2FyZC53cmFwIG9wdGlvbiBmb3Igd3JhcHBpbmcgYXQgbGlzdCBib3VuZGFyaWVzXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHNlbGVjdFByZXZpb3VzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSW5kaWNlcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRpY2VzKCk7XG4gICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtQ291bnQ/LigpIHx8IDA7XG4gICAgICAgIGNvbnN0IHdyYXAgPSBjb25maWcua2V5Ym9hcmQ/LndyYXAgPz8gdHJ1ZTsgLy8gTUQzIGRlZmF1bHQgaXMgdHJ1ZVxuXG4gICAgICAgIGlmIChzZWxlY3RlZEluZGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgLy8gSWYgd3JhcCBlbmFibGVkLCBzZWxlY3QgbGFzdCBpdGVtOyBvdGhlcndpc2UgZG8gbm90aGluZ1xuICAgICAgICAgIGlmICh3cmFwICYmIHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KHRvdGFsSXRlbXMgLSAxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzWzBdO1xuICAgICAgICBjb25zdCBwcmV2SW5kZXggPSBjdXJyZW50SW5kZXggLSAxO1xuXG4gICAgICAgIGlmIChwcmV2SW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgocHJldkluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEF0IHRoZSBzdGFydCAtIHdyYXAgdG8gZW5kIGlmIGVuYWJsZWRcbiAgICAgICAgaWYgKHdyYXAgJiYgdG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KHRvdGFsSXRlbXMgLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTZWxlY3Rpb247XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2tleWJvYXJkLnRzXG5cbi8qKlxuICogS2V5Ym9hcmQgTmF2aWdhdGlvbiBGZWF0dXJlIGZvciBWTGlzdFxuICpcbiAqIEltcGxlbWVudHMgTWF0ZXJpYWwgRGVzaWduIDMgYWNjZXNzaWJpbGl0eSBndWlkZWxpbmVzIGZvciBsaXN0czpcbiAqIC0gQXJyb3cga2V5cyAoVXAvRG93bi9MZWZ0L1JpZ2h0KSBuYXZpZ2F0ZSBiZXR3ZWVuIGl0ZW1zIHdpdGggd3JhcHBpbmdcbiAqIC0gU3BhY2UvRW50ZXIgYWN0aXZhdGVzL3NlbGVjdHMgdGhlIGZvY3VzZWQgaXRlbVxuICogLSBUYWIgbW92ZXMgZm9jdXMgdG8vZnJvbSB0aGUgbGlzdFxuICogLSBIb21lL0VuZCBqdW1wIHRvIGZpcnN0L2xhc3QgaXRlbVxuICogLSBQYWdlIFVwL0Rvd24gc2tpcCBtdWx0aXBsZSBpdGVtc1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9tMy5tYXRlcmlhbC5pby9jb21wb25lbnRzL2xpc3RzL2FjY2Vzc2liaWxpdHlcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFZMaXN0Q29uZmlnLFxuICBWTGlzdENvbXBvbmVudCxcbiAgVkxpc3RJdGVtLFxuICBMaXN0S2V5Ym9hcmRDb25maWcsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUFJFRklYLCBhZGRDbGFzcywgcmVtb3ZlQ2xhc3MgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENsYXNzIG5hbWUgZm9yIGtleWJvYXJkIGZvY3VzIHN0eWxpbmdcbiAqL1xuY29uc3QgS0VZQk9BUkRfRk9DVVNfQ0xBU1MgPSBcIm10cmwtdmxpc3QtLWtleWJvYXJkLWZvY3VzXCI7XG5cbi8qKlxuICogQVJJQSByb2xlcyBhbmQgYXR0cmlidXRlcyBmb3IgYWNjZXNzaWJpbGl0eVxuICogRm9sbG93aW5nIE1EMyBXZWIgaW1wbGVtZW50YXRpb246XG4gKiAtIENvbnRhaW5lciByb2xlOiBsaXN0Ym94XG4gKiAtIExpc3QgaXRlbSByb2xlOiBvcHRpb25cbiAqIC0gU3RhdGU6IGFyaWEtc2VsZWN0ZWRcbiAqL1xuY29uc3QgQVJJQSA9IHtcbiAgUk9MRV9MSVNUQk9YOiBcImxpc3Rib3hcIixcbiAgUk9MRV9PUFRJT046IFwib3B0aW9uXCIsXG4gIEFSSUFfQUNUSVZFREVTQ0VOREFOVDogXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIixcbiAgQVJJQV9TRUxFQ1RFRDogXCJhcmlhLXNlbGVjdGVkXCIsXG4gIEFSSUFfTEFCRUw6IFwiYXJpYS1sYWJlbFwiLFxuICBBUklBX01VTFRJU0VMRUNUQUJMRTogXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLFxufTtcblxuLyoqXG4gKiBHZXQgdGhlIHZpZXdwb3J0IGl0ZW1zIGNvbnRhaW5lclxuICovXG5jb25zdCBnZXRJdGVtc0NvbnRhaW5lciA9IChcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXG4pOiBIVE1MRWxlbWVudCB8IG51bGwgPT4ge1xuICByZXR1cm4gZWxlbWVudD8ucXVlcnlTZWxlY3RvcihgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtc2ApIHx8IG51bGw7XG59O1xuXG4vKipcbiAqIEdldCBhbGwgcmVuZGVyZWQgaXRlbSBlbGVtZW50c1xuICovXG5jb25zdCBnZXRSZW5kZXJlZEl0ZW1zID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsKTogSFRNTEVsZW1lbnRbXSA9PiB7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5mcm9tKFxuICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKGAuJHtQUkVGSVh9LXZpZXdwb3J0LWl0ZW1bZGF0YS1pbmRleF1gKSxcbiAgKTtcbn07XG5cbi8qKlxuICogQWRkcyBrZXlib2FyZCBuYXZpZ2F0aW9uIGFuZCBhY2Nlc3NpYmlsaXR5IHRvIFZMaXN0IGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3Qgd2l0aEtleWJvYXJkID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+LFxuKSA9PiB7XG4gIHJldHVybiAoY29tcG9uZW50OiBWTGlzdENvbXBvbmVudDxUPik6IFZMaXN0Q29tcG9uZW50PFQ+ID0+IHtcbiAgICAvLyBPbmx5IGVuYWJsZSBrZXlib2FyZCBpZiBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICAgIGNvbnN0IHNlbGVjdGlvbkVuYWJsZWQgPVxuICAgICAgY29uZmlnLnNlbGVjdGlvbj8uZW5hYmxlZCAmJiBjb25maWcuc2VsZWN0aW9uPy5tb2RlICE9PSBcIm5vbmVcIjtcbiAgICBjb25zdCBrZXlib2FyZENvbmZpZyA9IGNvbmZpZy5rZXlib2FyZCB8fCB7fTtcbiAgICBjb25zdCBlbmFibGVkID0ga2V5Ym9hcmRDb25maWcuZW5hYmxlZCA/PyBzZWxlY3Rpb25FbmFibGVkO1xuXG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIE1EMyBzcGVjaWZpZXMgdGhhdCBhcnJvdyBrZXlzIHNob3VsZCB3cmFwIGJ5IGRlZmF1bHRcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgaG9tZUVuZDoga2V5Ym9hcmRDb25maWcuaG9tZUVuZCA/PyB0cnVlLFxuICAgICAgcGFnZVVwRG93bjoga2V5Ym9hcmRDb25maWcucGFnZVVwRG93biA/PyB0cnVlLFxuICAgICAgcGFnZVNpemU6IGtleWJvYXJkQ29uZmlnLnBhZ2VTaXplID8/IDEwLFxuICAgICAgdHlwZUFoZWFkOiBrZXlib2FyZENvbmZpZy50eXBlQWhlYWQgPz8gZmFsc2UsXG4gICAgICB0eXBlQWhlYWRUaW1lb3V0OiBrZXlib2FyZENvbmZpZy50eXBlQWhlYWRUaW1lb3V0ID8/IDUwMCxcbiAgICAgIHdyYXA6IGtleWJvYXJkQ29uZmlnLndyYXAgPz8gdHJ1ZSwgLy8gTUQzOiB3cmFwcyB0byB0b3AvYm90dG9tXG4gICAgICBvbk5hdmlnYXRlOiBrZXlib2FyZENvbmZpZy5vbk5hdmlnYXRlLFxuICAgIH07XG5cbiAgICAvLyBUeXBlLWFoZWFkIHN0YXRlXG4gICAgbGV0IHR5cGVBaGVhZEJ1ZmZlciA9IFwiXCI7XG4gICAgbGV0IHR5cGVBaGVhZFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gVHJhY2sgaWYgbGFzdCBpbnRlcmFjdGlvbiB3YXMgbW91c2UgKGZvciBmb2N1cyBzdHlsaW5nKVxuICAgIGxldCBsYXN0TW91c2VEb3duVGltZSA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBTZXR1cCBBUklBIGF0dHJpYnV0ZXMgZm9yIGFjY2Vzc2liaWxpdHlcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEFjY2Vzc2liaWxpdHkgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gY29tcG9uZW50LmVsZW1lbnQ7XG4gICAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcblxuICAgICAgLy8gU2V0IGxpc3Rib3ggcm9sZSBvbiB0aGUgY29tcG9uZW50XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgQVJJQS5ST0xFX0xJU1RCT1gpO1xuXG4gICAgICAvLyBTZXQgbXVsdGlzZWxlY3RhYmxlIGlmIGluIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlXG4gICAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8ubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKEFSSUEuQVJJQV9NVUxUSVNFTEVDVEFCTEUsIFwidHJ1ZVwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBmb2N1c2FibGVcbiAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiMFwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGFyaWEtbGFiZWwgaWYgbm90IHByZXNlbnRcbiAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoQVJJQS5BUklBX0xBQkVMKSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShBUklBLkFSSUFfTEFCRUwsIFwiTGlzdFwiKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIEFSSUEgYXR0cmlidXRlcyBvbiByZW5kZXJlZCBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUl0ZW1BY2Nlc3NpYmlsaXR5ID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0SXRlbXNDb250YWluZXIoY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgY29uc3QgaXRlbXMgPSBnZXRSZW5kZXJlZEl0ZW1zKGNvbnRhaW5lcik7XG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXM/LigpIHx8IFtdO1xuXG4gICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaXRlbS5kYXRhc2V0LmluZGV4IHx8IFwiLTFcIiwgMTApO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gU2V0IG9wdGlvbiByb2xlXG4gICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKFwicm9sZVwiLCBBUklBLlJPTEVfT1BUSU9OKTtcblxuICAgICAgICAvLyBTZXQgdW5pcXVlIElEIGZvciBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgICAgY29uc3QgaXRlbUlkID0gYCR7UFJFRklYfS12bGlzdC1pdGVtLSR7aW5kZXh9YDtcbiAgICAgICAgaXRlbS5pZCA9IGl0ZW1JZDtcblxuICAgICAgICAvLyBTZXQgc2VsZWN0ZWQgc3RhdGVcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGVkSW5kaWNlcy5pbmNsdWRlcyhpbmRleCk7XG4gICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKEFSSUEuQVJJQV9TRUxFQ1RFRCwgU3RyaW5nKGlzU2VsZWN0ZWQpKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBVcGRhdGUgYXJpYS1hY3RpdmVkZXNjZW5kYW50IG9uIGNvbnRhaW5lclxuICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPiAwICYmIGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUlkID0gYCR7UFJFRklYfS12bGlzdC1pdGVtLSR7c2VsZWN0ZWRJbmRpY2VzWzBdfWA7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnNldEF0dHJpYnV0ZShBUklBLkFSSUFfQUNUSVZFREVTQ0VOREFOVCwgYWN0aXZlSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LnJlbW92ZUF0dHJpYnV0ZShBUklBLkFSSUFfQUNUSVZFREVTQ0VOREFOVCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0eXBlLWFoZWFkIHNlYXJjaFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVR5cGVBaGVhZCA9IChjaGFyOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghb3B0aW9ucy50eXBlQWhlYWQpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgdGltZXJcbiAgICAgIGlmICh0eXBlQWhlYWRUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodHlwZUFoZWFkVGltZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgY2hhcmFjdGVyIHRvIGJ1ZmZlclxuICAgICAgdHlwZUFoZWFkQnVmZmVyICs9IGNoYXIudG9Mb3dlckNhc2UoKTtcblxuICAgICAgLy8gU2V0IHRpbWVyIHRvIGNsZWFyIGJ1ZmZlclxuICAgICAgdHlwZUFoZWFkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdHlwZUFoZWFkQnVmZmVyID0gXCJcIjtcbiAgICAgIH0sIG9wdGlvbnMudHlwZUFoZWFkVGltZW91dCk7XG5cbiAgICAgIC8vIFNlYXJjaCBmb3IgbWF0Y2hpbmcgaXRlbVxuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgaXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtcz8uKCkgfHwgW107XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXM/LigpIHx8IFtdO1xuICAgICAgY29uc3Qgc3RhcnRJbmRleCA9XG4gICAgICAgIHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRJbmRpY2VzWzBdICsgMSA6IDA7XG5cbiAgICAgIC8vIFNlYXJjaCBmcm9tIGN1cnJlbnQgcG9zaXRpb24gdG8gZW5kLCB0aGVuIHdyYXAgdG8gYmVnaW5uaW5nXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gKHN0YXJ0SW5kZXggKyBpKSAlIGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2luZGV4XTtcbiAgICAgICAgaWYgKCFpdGVtKSBjb250aW51ZTtcblxuICAgICAgICAvLyBHZXQgc2VhcmNoYWJsZSB0ZXh0IGZyb20gaXRlbVxuICAgICAgICBjb25zdCB0ZXh0ID0gZ2V0SXRlbVRleHQoaXRlbSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aCh0eXBlQWhlYWRCdWZmZXIpKSB7XG4gICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0QXRJbmRleD8uKGluZGV4KTtcbiAgICAgICAgICBvcHRpb25zLm9uTmF2aWdhdGU/LihpbmRleCwgXCJ0eXBlYWhlYWRcIik7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2VhcmNoYWJsZSB0ZXh0IGZyb20gYW4gaXRlbVxuICAgICAqL1xuICAgIGNvbnN0IGdldEl0ZW1UZXh0ID0gKGl0ZW06IGFueSk6IHN0cmluZyA9PiB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHJldHVybiBpdGVtO1xuICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgfHwgaXRlbS5uYW1lIHx8IGl0ZW0ubGFiZWwgfHwgaXRlbS50ZXh0IHx8IFwiXCI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBrZXlib2FyZCBldmVudHNcbiAgICAgKlxuICAgICAqIE1EMyBLZXlib2FyZCBOYXZpZ2F0aW9uOlxuICAgICAqIC0gVGFiOiBNb3ZlIGZvY3VzIHRvIGZpcnN0L2xhc3QgbGlzdCBpdGVtIG9yIG91dHNpZGVcbiAgICAgKiAtIERvd24vUmlnaHQ6IE1vdmUgdG8gbmV4dCBlbGVtZW50OyB3cmFwcyB0byB0b3AgaWYgYXQgZW5kXG4gICAgICogLSBVcC9MZWZ0OiBNb3ZlIHRvIHByZXZpb3VzIGVsZW1lbnQ7IHdyYXBzIHRvIGJvdHRvbSBpZiBhdCBzdGFydFxuICAgICAqIC0gU3BhY2UvRW50ZXI6IFNlbGVjdCBhIGxpc3QgaXRlbVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUtleURvd24gPSBhc3luYyAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgaWYgKHRvdGFsSXRlbXMgPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0U2VsZWN0ZWRJbmRpY2VzPy4oKSB8fCBbXTtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRJbmRpY2VzWzBdIDogLTE7XG5cbiAgICAgIGxldCB0YXJnZXRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBIZWxwZXIgdG8gbWFyayBldmVudCBhcyBoYW5kbGVkIGFuZCBzdG9wIHByb3BhZ2F0aW9uXG4gICAgICBjb25zdCBtYXJrSGFuZGxlZCA9ICgpID0+IHtcbiAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIH07XG5cbiAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgLy8gTUQzOiBEb3duL1JpZ2h0IG1vdmUgdG8gbmV4dCBlbGVtZW50XG4gICAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjpcbiAgICAgICAgY2FzZSBcIkFycm93UmlnaHRcIjpcbiAgICAgICAgICBtYXJrSGFuZGxlZCgpO1xuICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7XG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50SW5kZXggPCB0b3RhbEl0ZW1zIC0gMSkge1xuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy53cmFwKSB7XG4gICAgICAgICAgICAvLyBNRDM6IHdyYXBzIHRvIHRvcCBpZiBhdCBlbmRcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLy8gTUQzOiBVcC9MZWZ0IG1vdmUgdG8gcHJldmlvdXMgZWxlbWVudFxuICAgICAgICBjYXNlIFwiQXJyb3dVcFwiOlxuICAgICAgICBjYXNlIFwiQXJyb3dMZWZ0XCI6XG4gICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSB0b3RhbEl0ZW1zIC0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJbmRleCA+IDApIHtcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMud3JhcCkge1xuICAgICAgICAgICAgLy8gTUQzOiB3cmFwcyB0byBib3R0b20gaWYgYXQgc3RhcnRcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gdG90YWxJdGVtcyAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJIb21lXCI6XG4gICAgICAgICAgaWYgKG9wdGlvbnMuaG9tZUVuZCkge1xuICAgICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIkVuZFwiOlxuICAgICAgICAgIGlmIChvcHRpb25zLmhvbWVFbmQpIHtcbiAgICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgICB0YXJnZXRJbmRleCA9IHRvdGFsSXRlbXMgLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiUGFnZURvd25cIjpcbiAgICAgICAgICBpZiAob3B0aW9ucy5wYWdlVXBEb3duKSB7XG4gICAgICAgICAgICBtYXJrSGFuZGxlZCgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihvcHRpb25zLnBhZ2VTaXplIC0gMSwgdG90YWxJdGVtcyAtIDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggKyBvcHRpb25zLnBhZ2VTaXplLFxuICAgICAgICAgICAgICAgIHRvdGFsSXRlbXMgLSAxLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiUGFnZVVwXCI6XG4gICAgICAgICAgaWYgKG9wdGlvbnMucGFnZVVwRG93bikge1xuICAgICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gTWF0aC5tYXgoY3VycmVudEluZGV4IC0gb3B0aW9ucy5wYWdlU2l6ZSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIC8vIE1EMzogU3BhY2UvRW50ZXIgc2VsZWN0IGEgbGlzdCBpdGVtXG4gICAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8ubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgICAgICAgIC8vIEluIG11bHRpcGxlIG1vZGUsIHRvZ2dsZSBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGVuaGFuY2VkQ29tcG9uZW50LmlzU2VsZWN0ZWQ/LihjdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LmRlc2VsZWN0SXRlbXM/LihbY3VycmVudEluZGV4XSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0SXRlbXM/LihbY3VycmVudEluZGV4XSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIEluIHNpbmdsZSBtb2RlLCBlbnN1cmUgaXRlbSBpcyBzZWxlY3RlZCBhbmQgZW1pdCBhY3RpdmF0aW9uIGV2ZW50XG4gICAgICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LnNlbGVjdEl0ZW1zPy4oW2N1cnJlbnRJbmRleF0pO1xuICAgICAgICAgICAgICAvLyBFbWl0IGFjdGl2YXRlIGV2ZW50IGZvciBzaW5nbGUtYWN0aW9uIGxpc3RzXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOmFjdGl2YXRlXCIsIHtcbiAgICAgICAgICAgICAgICBpbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgICAgIGl0ZW06IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1zPy4oKT8uW2N1cnJlbnRJbmRleF0sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICBjYXNlIFwiQVwiOlxuICAgICAgICAgIC8vIEN0cmwrQSAvIENtZCtBIC0gc2VsZWN0IGFsbCBpbiBtdWx0aXBsZSBtb2RlXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGUuY3RybEtleSB8fCBlLm1ldGFLZXkpICYmXG4gICAgICAgICAgICBjb25maWcuc2VsZWN0aW9uPy5tb2RlID09PSBcIm11bHRpcGxlXCJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgICBjb25zdCBhbGxJbmRpY2VzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdG90YWxJdGVtcyB9LCAoXywgaSkgPT4gaSk7XG4gICAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC5zZWxlY3RJdGVtcz8uKGFsbEluZGljZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiRXNjYXBlXCI6XG4gICAgICAgICAgLy8gQ2xlYXIgc2VsZWN0aW9uXG4gICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC5jbGVhclNlbGVjdGlvbj8uKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBUeXBlLWFoZWFkIGZvciBwcmludGFibGUgY2hhcmFjdGVyc1xuICAgICAgICAgIGlmIChlLmtleS5sZW5ndGggPT09IDEgJiYgIWUuY3RybEtleSAmJiAhZS5tZXRhS2V5ICYmICFlLmFsdEtleSkge1xuICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZVR5cGVBaGVhZChlLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBOYXZpZ2F0ZSB0byB0YXJnZXQgaW5kZXhcbiAgICAgIGlmICh0YXJnZXRJbmRleCAhPT0gbnVsbCAmJiB0YXJnZXRJbmRleCAhPT0gY3VycmVudEluZGV4KSB7XG4gICAgICAgIC8vIEhhbmRsZSBzaGlmdCthcnJvdyBmb3IgcmFuZ2Ugc2VsZWN0aW9uIGluIG11bHRpcGxlIG1vZGVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGUuc2hpZnRLZXkgJiZcbiAgICAgICAgICBjb25maWcuc2VsZWN0aW9uPy5tb2RlID09PSBcIm11bHRpcGxlXCIgJiZcbiAgICAgICAgICBjdXJyZW50SW5kZXggPj0gMFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWluKGN1cnJlbnRJbmRleCwgdGFyZ2V0SW5kZXgpO1xuICAgICAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWF4KGN1cnJlbnRJbmRleCwgdGFyZ2V0SW5kZXgpO1xuICAgICAgICAgIGNvbnN0IHJhbmdlSW5kaWNlcyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgICB7IGxlbmd0aDogZW5kIC0gc3RhcnQgKyAxIH0sXG4gICAgICAgICAgICAoXywgaSkgPT4gc3RhcnQgKyBpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0SXRlbXM/LihyYW5nZUluZGljZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEF3YWl0IHNlbGVjdEF0SW5kZXggZm9yIHByb3BlciBzY3JvbGxpbmcgYW5kIGRhdGEgbG9hZGluZ1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBIb21lL0VuZC9QYWdlVXAvUGFnZURvd24gd2hpY2ggbWF5IGp1bXAgdG8gdW5sb2FkZWQgaXRlbXNcbiAgICAgICAgICBhd2FpdCBlbmhhbmNlZENvbXBvbmVudC5zZWxlY3RBdEluZGV4Py4odGFyZ2V0SW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMub25OYXZpZ2F0ZT8uKHRhcmdldEluZGV4LCBlLmtleSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQga2V5Ym9hcmQgZXZlbnQgZm9yIGV4dGVybmFsIGhhbmRsaW5nXG4gICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwia2V5Ym9hcmQ6bmF2aWdhdGVcIiwge1xuICAgICAgICAgIGtleTogZS5rZXksXG4gICAgICAgICAgaW5kZXg6IHRhcmdldEluZGV4ID8/IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleSxcbiAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGZvY3VzIGV2ZW50XG4gICAgICpcbiAgICAgKiBNRDMgRm9jdXMgQmVoYXZpb3IgZm9yIFNpbmdsZS1BY3Rpb24gTGlzdHM6XG4gICAgICogLSBUaGUgZmlyc3QgZWxlbWVudCBpbiBhIGxpc3Qgc2hvdWxkIHJlY2VpdmUgZm9jdXMgYnkgZGVmYXVsdFxuICAgICAqIC0gSWYgdGhlIGxpc3QgaGFzIGEgc2VsZWN0ZWQgZWxlbWVudCwgZm9jdXMgZ29lcyB0byB0aGUgc2VsZWN0ZWQgaXRlbSBpbnN0ZWFkXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRm9jdXMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXM/LigpIHx8IFtdO1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgLy8gQWRkIGtleWJvYXJkIGZvY3VzIGNsYXNzIG9ubHkgaWYgZm9jdXMgd2FzIE5PVCBmcm9tIGEgcmVjZW50IG1vdXNlIGNsaWNrXG4gICAgICAvLyAxMDBtcyB0aHJlc2hvbGQgYWNjb3VudHMgZm9yIHRoZSBkZWxheSBiZXR3ZWVuIG1vdXNlZG93biBhbmQgZm9jdXNcbiAgICAgIGNvbnN0IHdhc01vdXNlQ2xpY2sgPSBEYXRlLm5vdygpIC0gbGFzdE1vdXNlRG93blRpbWUgPCAxMDA7XG4gICAgICBpZiAoIXdhc01vdXNlQ2xpY2sgJiYgY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgYWRkQ2xhc3MoY29tcG9uZW50LmVsZW1lbnQsIEtFWUJPQVJEX0ZPQ1VTX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRvdGFsSXRlbXMgPT09IDApIHJldHVybjtcblxuICAgICAgLy8gTUQzOiBJZiBsaXN0IGhhcyBzZWxlY3RlZCBlbGVtZW50LCBmb2N1cyBnb2VzIHRvIHNlbGVjdGVkIGl0ZW1cbiAgICAgIC8vIE90aGVyd2lzZSwgZmlyc3QgZWxlbWVudCByZWNlaXZlcyBmb2N1c1xuICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0QXRJbmRleD8uKDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT25seSBzY3JvbGwgdG8gc2VsZWN0ZWQgaXRlbSBpZiBpdCdzIG5vdCBhbHJlYWR5IGZ1bGx5IHZpc2libGVcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB1bndhbnRlZCBzY3JvbGxpbmcgd2hlbiBjbGlja2luZyBvbiBhIHZpc2libGUgaXRlbVxuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzWzBdO1xuICAgICAgICBjb25zdCBpc1Zpc2libGUgPSBlbmhhbmNlZENvbXBvbmVudC5pc0l0ZW1GdWxseVZpc2libGU/LihzZWxlY3RlZEluZGV4KTtcbiAgICAgICAgaWYgKCFpc1Zpc2libGUgJiYgZW5oYW5jZWRDb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgpIHtcbiAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KHNlbGVjdGVkSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJrZXlib2FyZDpmb2N1c1wiKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGJsdXIgZXZlbnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVCbHVyID0gKCkgPT4ge1xuICAgICAgLy8gUmVtb3ZlIGtleWJvYXJkIGZvY3VzIGNsYXNzXG4gICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoY29tcG9uZW50LmVsZW1lbnQsIEtFWUJPQVJEX0ZPQ1VTX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdHlwZS1haGVhZCBvbiBibHVyXG4gICAgICB0eXBlQWhlYWRCdWZmZXIgPSBcIlwiO1xuICAgICAgaWYgKHR5cGVBaGVhZFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0eXBlQWhlYWRUaW1lcik7XG4gICAgICAgIHR5cGVBaGVhZFRpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcImtleWJvYXJkOmJsdXJcIik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuICAgIGNvbnN0IHNldHVwID0gKCkgPT4ge1xuICAgICAgc2V0dXBBY2Nlc3NpYmlsaXR5KCk7XG5cbiAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIGhhbmRsZUZvY3VzKTtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlQmx1cik7XG5cbiAgICAgICAgLy8gVHJhY2sgbW91c2UgY2xpY2tzIHRvIGRpc3Rpbmd1aXNoIGZyb20ga2V5Ym9hcmQgZm9jdXNcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAoKSA9PiB7XG4gICAgICAgICAgbGFzdE1vdXNlRG93blRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZGQgY2xpY2sgaGFuZGxlciB0byBmb2N1cyB0aGUgbGlzdCB3aGVuIGNsaWNrZWRcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICBjb21wb25lbnQuZWxlbWVudD8uZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBBUklBIGF0dHJpYnV0ZXMgd2hlbiBpdGVtcyBhcmUgcmVuZGVyZWRcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgICBcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsXG4gICAgICAgIHVwZGF0ZUl0ZW1BY2Nlc3NpYmlsaXR5LFxuICAgICAgKTtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFwidmlld3BvcnQ6cmVuZGVyZWRcIiwgdXBkYXRlSXRlbUFjY2Vzc2liaWxpdHkpO1xuXG4gICAgICAvLyBVcGRhdGUgQVJJQSB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzXG4gICAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcInNlbGVjdGlvbjpjaGFuZ2VcIiwgdXBkYXRlSXRlbUFjY2Vzc2liaWxpdHkpO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIGFmdGVyIGNvbXBvbmVudCBpcyByZWFkeVxuICAgIHNldFRpbWVvdXQoc2V0dXAsIDApO1xuXG4gICAgLy8gQ2xlYW51cCBvbiBkZXN0cm95XG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93bik7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBoYW5kbGVGb2N1cyk7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZUJsdXIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVBaGVhZFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0eXBlQWhlYWRUaW1lcik7XG4gICAgICB9XG4gICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgIH07XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50IHdpdGgga2V5Ym9hcmQgQVBJXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBGb2N1cyB0aGUgbGlzdCBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvblxuICAgICAgICovXG4gICAgICBmb2N1cygpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEJsdXIgdGhlIGxpc3RcbiAgICAgICAqL1xuICAgICAgYmx1cigpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LmJsdXIoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgbGlzdCBoYXMgZm9jdXNcbiAgICAgICAqL1xuICAgICAgaGFzRm9jdXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2VsZWN0IGZpcnN0IGl0ZW1cbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0Rmlyc3QoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcbiAgICAgICAgaWYgKHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIGVuaGFuY2VkQ29tcG9uZW50LnNlbGVjdEF0SW5kZXg/LigwKSA/PyBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBsYXN0IGl0ZW1cbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0TGFzdCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbUNvdW50Py4oKSB8fCAwO1xuICAgICAgICBpZiAodG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICByZXR1cm4gZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0QXRJbmRleD8uKHRvdGFsSXRlbXMgLSAxKSA/PyBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoS2V5Ym9hcmQ7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vZm9ybS50c1xuXG4vKipcbiAqIEZvcm0gQ29tcG9uZW50IC0gRnVuY3Rpb25hbCBmb3JtIGJ1aWxkZXIgd2l0aCBtdHJsIGNvbXBvc2l0aW9uXG4gKlxuICogQSBmb3JtIGNvbXBvbmVudCB0aGF0IHVzZXMgdGhlIG10cmwtYWRkb25zIGxheW91dCBzeXN0ZW0gdG8gYnVpbGRcbiAqIGZvcm1zIGZyb20gc2NoZW1hIGRlZmluaXRpb25zLCB3aXRoIGJ1aWx0LWluIGRhdGEgbWFuYWdlbWVudCxcbiAqIHZhbGlkYXRpb24sIGFuZCBzdWJtaXNzaW9uIGhhbmRsaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRm9ybUNvbmZpZywgRm9ybUNvbXBvbmVudCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIEltcG9ydCBtdHJsIGNvbXBvc2Ugc3lzdGVtXG5pbXBvcnQgeyBwaXBlIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IGNyZWF0ZUJhc2UsIHdpdGhFbGVtZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IHdpdGhFdmVudHMsIHdpdGhMaWZlY3ljbGUgfSBmcm9tIFwibXRybFwiO1xuXG4vLyBJbXBvcnQgZm9ybSBmZWF0dXJlc1xuaW1wb3J0IHtcbiAgd2l0aExheW91dCxcbiAgd2l0aEZpZWxkcyxcbiAgd2l0aERhdGEsXG4gIHdpdGhDb250cm9sbGVyLFxuICB3aXRoU3VibWl0LFxuICB3aXRoUHJvdGVjdGlvbixcbiAgd2l0aEFQSSxcbn0gZnJvbSBcIi4vZmVhdHVyZXNcIjtcblxuLy8gSW1wb3J0IGNvbmZpZ3VyYXRpb25cbmltcG9ydCB7IGNyZWF0ZUJhc2VDb25maWcsIGdldEVsZW1lbnRDb25maWcgfSBmcm9tIFwiLi9jb25maWdcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEZvcm0gY29tcG9uZW50IHVzaW5nIGZ1bmN0aW9uYWwgY29tcG9zaXRpb25cbiAqXG4gKiBAcGFyYW0ge0Zvcm1Db25maWd9IGNvbmZpZyAtIEZvcm0gY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyB7Rm9ybUNvbXBvbmVudH0gQSBmdWxseSBjb25maWd1cmVkIGZvcm0gY29tcG9uZW50XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGNyZWF0ZUZvcm0gfSBmcm9tICdtdHJsLWFkZG9ucydcbiAqIGltcG9ydCB7IGNyZWF0ZVRleHRmaWVsZCwgY3JlYXRlU3dpdGNoLCBjcmVhdGVDaGlwcyB9IGZyb20gJ210cmwnXG4gKlxuICogY29uc3QgZm9ybSA9IGNyZWF0ZUZvcm0oe1xuICogICBjbGFzczogJ2FjY291bnQtZm9ybScsXG4gKiAgIGFjdGlvbjogJy9hcGkvdXNlcnMvJyxcbiAqICAgbGF5b3V0OiBbXG4gKiAgICAgWydzZWN0aW9uJywgeyBjbGFzczogJ3VzZXItc2VjdGlvbicgfSxcbiAqICAgICAgIFsnZGl2JywgeyBjbGFzczogJ3NlY3Rpb24tdGl0bGUnLCB0ZXh0OiAnVXNlcicgfV0sXG4gKiAgICAgICBbY3JlYXRlVGV4dGZpZWxkLCAnaW5mby51c2VybmFtZScsIHsgbGFiZWw6ICdVc2VybmFtZScgfV0sXG4gKiAgICAgICBbY3JlYXRlQ2hpcHMsICdpbmZvLnJvbGUnLCB7XG4gKiAgICAgICAgIGxhYmVsOiAnUm9sZScsXG4gKiAgICAgICAgIGNoaXBzOiBbXG4gKiAgICAgICAgICAgeyB0ZXh0OiAncmVnaXN0ZXJlZCcsIHZhbHVlOiAncmVnaXN0ZXJlZCcgfSxcbiAqICAgICAgICAgICB7IHRleHQ6ICdhZG1pbicsIHZhbHVlOiAnYWRtaW4nIH0sXG4gKiAgICAgICAgICAgeyB0ZXh0OiAncHJlbWl1bScsIHZhbHVlOiAncHJlbWl1bScgfVxuICogICAgICAgICBdXG4gKiAgICAgICB9XSxcbiAqICAgICAgIFtjcmVhdGVTd2l0Y2gsICdpbmZvLmVuYWJsZWQnLCB7IGxhYmVsOiAnRW5hYmxlZCcgfV1cbiAqICAgICBdXG4gKiAgIF0sXG4gKiAgIG9uOiB7XG4gKiAgICAgY2hhbmdlOiAoZGF0YSkgPT4gY29uc29sZS5sb2coJ0Zvcm0gY2hhbmdlZDonLCBkYXRhKSxcbiAqICAgICBzdWJtaXQ6IChkYXRhKSA9PiBjb25zb2xlLmxvZygnRm9ybSBzdWJtaXR0ZWQ6JywgZGF0YSlcbiAqICAgfVxuICogfSlcbiAqXG4gKiAvLyBBcHBlbmQgdG8gRE9NXG4gKiBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGZvcm0uZWxlbWVudClcbiAqXG4gKiAvLyBTZXQgZGF0YVxuICogZm9ybS5zZXREYXRhKHtcbiAqICAgdXNlcm5hbWU6ICdqb2huX2RvZScsXG4gKiAgIHJvbGU6ICdhZG1pbicsXG4gKiAgIGVuYWJsZWQ6IHRydWVcbiAqIH0pXG4gKlxuICogLy8gR2V0IGRhdGFcbiAqIGNvbnN0IGRhdGEgPSBmb3JtLmdldERhdGEoKVxuICpcbiAqIC8vIENoZWNrIGlmIG1vZGlmaWVkXG4gKiBpZiAoZm9ybS5pc01vZGlmaWVkKCkpIHtcbiAqICAgYXdhaXQgZm9ybS5zdWJtaXQoKVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVGb3JtID0gKGNvbmZpZzogRm9ybUNvbmZpZyA9IHt9KTogRm9ybUNvbXBvbmVudCA9PiB7XG4gIHRyeSB7XG4gICAgLy8gUHJvY2VzcyBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHNcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gY3JlYXRlQmFzZUNvbmZpZyhjb25maWcpO1xuXG4gICAgLy8gQnVpbGQgdGhlIGZvcm0gdGhyb3VnaCBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gICAgLy8gRWFjaCBmdW5jdGlvbiBpbiB0aGUgcGlwZSBhZGRzIHNwZWNpZmljIGNhcGFiaWxpdGllc1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gICAgICAvLyAxLiBGb3VuZGF0aW9uIGxheWVyIC0gQmFzZSBjb21wb25lbnQgd2l0aCBjb25maWdcbiAgICAgIGNyZWF0ZUJhc2UsXG5cbiAgICAgIC8vIDIuIEV2ZW50IHN5c3RlbSAtIEFkZHMgb24vb2ZmL2VtaXQgbWV0aG9kc1xuICAgICAgd2l0aEV2ZW50cygpLFxuXG4gICAgICAvLyAzLiBET00gZWxlbWVudCAtIENyZWF0ZXMgdGhlIHJvb3QgY29udGFpbmVyIGVsZW1lbnRcbiAgICAgIHdpdGhFbGVtZW50KGdldEVsZW1lbnRDb25maWcoYmFzZUNvbmZpZykpLFxuXG4gICAgICAvLyA0LiBMYXlvdXQgLSBDcmVhdGVzIGZvcm0gZWxlbWVudCBhbmQgcHJvY2Vzc2VzIGxheW91dCBzY2hlbWFcbiAgICAgIHdpdGhMYXlvdXQoYmFzZUNvbmZpZyksXG5cbiAgICAgIC8vIDUuIEZpZWxkcyAtIEV4dHJhY3RzIGZpZWxkcyBmcm9tIGxheW91dCBhbmQgY3JlYXRlcyByZWdpc3RyeVxuICAgICAgd2l0aEZpZWxkcyhiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gNi4gRGF0YSAtIEFkZHMgZGF0YSBtYW5hZ2VtZW50IChnZXQvc2V0LCBjaGFuZ2UgdHJhY2tpbmcpXG4gICAgICB3aXRoRGF0YShiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gNy4gQ29udHJvbGxlciAtIEFkZHMgbW9kZSBtYW5hZ2VtZW50IChyZWFkL2NyZWF0ZS91cGRhdGUpXG4gICAgICB3aXRoQ29udHJvbGxlcihiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gOC4gU3VibWl0IC0gQWRkcyB2YWxpZGF0aW9uIGFuZCBzdWJtaXNzaW9uIGhhbmRsaW5nXG4gICAgICB3aXRoU3VibWl0KGJhc2VDb25maWcpLFxuXG4gICAgICAvLyA5LiBQcm90ZWN0aW9uIC0gQWRkcyBibG9ja2luZyBvdmVybGF5IHdoZW4gZm9ybSBoYXMgdW5zYXZlZCBjaGFuZ2VzXG4gICAgICB3aXRoUHJvdGVjdGlvbihiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gMTAuIExpZmVjeWNsZSAtIEFkZHMgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgKGRlc3Ryb3kpXG4gICAgICB3aXRoTGlmZWN5Y2xlKCksXG5cbiAgICAgIC8vIDExLiBBUEkgLSBDcmVhdGVzIGNsZWFuIHB1YmxpYyBBUElcbiAgICAgIHdpdGhBUEkoYmFzZUNvbmZpZyksXG4gICAgKShiYXNlQ29uZmlnKTtcblxuICAgIC8vIEFwcGVuZCB0byBjb250YWluZXIgaWYgcHJvdmlkZWRcbiAgICBpZiAoY29uZmlnLmNvbnRhaW5lciAmJiBjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgY29uZmlnLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjb21wb25lbnQuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyBGb3JtQ29tcG9uZW50O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJGb3JtIGNyZWF0aW9uIGVycm9yOlwiLCBlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZvcm06ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVGb3JtO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2xheW91dC50c1xuXG4vKipcbiAqIExheW91dCBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogQnVpbGRzIHRoZSBmb3JtIHN0cnVjdHVyZSBmcm9tIGEgbGF5b3V0IHNjaGVtYSB1c2luZyBtdHJsLWFkZG9ucyBsYXlvdXQgc3lzdGVtXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvbGF5b3V0XCI7XG5pbXBvcnQgdHlwZSB7IEZvcm1Db25maWcsIEJhc2VGb3JtQ29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0RFRkFVTFRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vLyBTY3JvbGwgdGhyZXNob2xkIGluIHBpeGVsc1xuY29uc3QgU0NST0xMRURfVEhSRVNIT0xEID0gMTtcblxuLy8gQ1NTIGNsYXNzIG5hbWVzXG5jb25zdCBTQ1JPTExFRF9DTEFTUyA9IFwibXRybC1mb3JtLS1zY3JvbGxlZFwiO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGZvcm0gZWxlbWVudFxuICovXG5jb25zdCBjcmVhdGVGb3JtRWxlbWVudCA9IChjb25maWc6IEZvcm1Db25maWcpOiBIVE1MRm9ybUVsZW1lbnQgPT4ge1xuICBjb25zdCBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvcm1cIik7XG5cbiAgaWYgKGNvbmZpZy5tZXRob2QpIHtcbiAgICBmb3JtLnNldEF0dHJpYnV0ZShcIm1ldGhvZFwiLCBjb25maWcubWV0aG9kKTtcbiAgfVxuXG4gIGlmIChjb25maWcuYWN0aW9uKSB7XG4gICAgZm9ybS5zZXRBdHRyaWJ1dGUoXCJhY3Rpb25cIiwgY29uZmlnLmFjdGlvbik7XG4gIH1cblxuICBpZiAoY29uZmlnLmF1dG9jb21wbGV0ZSkge1xuICAgIGZvcm0uc2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIsIGNvbmZpZy5hdXRvY29tcGxldGUpO1xuICB9XG5cbiAgLy8gUHJldmVudCBkZWZhdWx0IGZvcm0gc3VibWlzc2lvbiAtIHdlIGhhbmRsZSBpdCBwcm9ncmFtbWF0aWNhbGx5XG4gIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZvcm07XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBsYXlvdXQgc2NoZW1hIGFuZCBleHRyYWN0cyBuYW1lZCBjb21wb25lbnRzXG4gKi9cbmNvbnN0IHByb2Nlc3NMYXlvdXRTY2hlbWEgPSAoXG4gIHNjaGVtYTogdW5rbm93bltdLFxuICBmb3JtOiBIVE1MRm9ybUVsZW1lbnQsXG4gIGNvbmZpZzogRm9ybUNvbmZpZyxcbik6IHsgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBsYXlvdXRSZXN1bHQ6IHVua25vd24gfSA9PiB7XG4gIGlmICghc2NoZW1hIHx8ICFBcnJheS5pc0FycmF5KHNjaGVtYSkgfHwgc2NoZW1hLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7IHVpOiB7fSwgbGF5b3V0UmVzdWx0OiBudWxsIH07XG4gIH1cblxuICAvLyBVc2UgbXRybC1hZGRvbnMgY3JlYXRlTGF5b3V0IHRvIHByb2Nlc3MgdGhlIHNjaGVtYVxuICBjb25zdCBsYXlvdXRSZXN1bHQgPSBjcmVhdGVMYXlvdXQoc2NoZW1hLCBmb3JtLCB7fSk7XG5cbiAgLy8gRXh0cmFjdCBuYW1lZCBjb21wb25lbnRzIGZyb20gbGF5b3V0IHJlc3VsdFxuICBjb25zdCB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBpZiAobGF5b3V0UmVzdWx0ICYmIHR5cGVvZiBsYXlvdXRSZXN1bHQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAvLyBUaGUgbGF5b3V0IHJlc3VsdCBjb250YWlucyBjb21wb25lbnQgcmVmZXJlbmNlc1xuICAgIGNvbnN0IHJlc3VsdCA9IGxheW91dFJlc3VsdCBhcyB7IGNvbXBvbmVudD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgaWYgKHJlc3VsdC5jb21wb25lbnQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odWksIHJlc3VsdC5jb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHVpLCBsYXlvdXRSZXN1bHQgfTtcbn07XG5cbi8qKlxuICogU2V0cyB1cCBzY3JvbGwgZGV0ZWN0aW9uIG9uIGJvZHkgZWxlbWVudHMgdG8gdG9nZ2xlIC0tc2Nyb2xsZWQgY2xhc3Mgb24gZm9ybSBjb250YWluZXJcbiAqL1xuY29uc3Qgc2V0dXBTY3JvbGxJbmRpY2F0b3IgPSAoXG4gIGZvcm06IEhUTUxGb3JtRWxlbWVudCxcbiAgZm9ybUNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4pOiAoKCkgPT4gdm9pZCkgPT4ge1xuICBjb25zdCBjbGVhbnVwRm5zOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXG4gIC8vIEZpbmQgYm9keSBlbGVtZW50IHRvIGNhbGN1bGF0ZSBzaGFkb3cgcG9zaXRpb25cbiAgY29uc3QgYm9keUVsZW1lbnQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiLm10cmwtYm9keVwiKTtcbiAgaWYgKGJvZHlFbGVtZW50KSB7XG4gICAgLy8gU2V0IENTUyB2YXJpYWJsZSBmb3Igc2hhZG93IHBvc2l0aW9uaW5nIGF0IHRvcCBvZiBib2R5XG4gICAgY29uc3QgdXBkYXRlQm9keVRvcCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHlUb3AgPSBib2R5RWxlbWVudC5vZmZzZXRUb3A7XG4gICAgICBmb3JtQ29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KFwiLS1tdHJsLWZvcm0tYm9keS10b3BcIiwgYCR7Ym9keVRvcH1weGApO1xuICAgIH07XG4gICAgdXBkYXRlQm9keVRvcCgpO1xuXG4gICAgLy8gVXBkYXRlIG9uIHJlc2l6ZVxuICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKHVwZGF0ZUJvZHlUb3ApO1xuICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZm9ybSk7XG5cbiAgICBjbGVhbnVwRm5zLnB1c2goKCkgPT4ge1xuICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgZm9ybUNvbnRhaW5lci5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcIi0tbXRybC1mb3JtLWJvZHktdG9wXCIpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gRmluZCBib2R5IGVsZW1lbnRzIChtdHJsLWJvZHkgY2xhc3MgYWRkZWQgYnkgbGF5b3V0IHN5c3RlbSlcbiAgY29uc3QgYm9keUVsZW1lbnRzID0gZm9ybS5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcIi5tdHJsLWJvZHlcIik7XG5cbiAgYm9keUVsZW1lbnRzLmZvckVhY2goKGJvZHlFbGVtZW50KSA9PiB7XG4gICAgbGV0IGlzU2Nyb2xsZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGhhbmRsZVNjcm9sbCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEJlU2Nyb2xsZWQgPSBib2R5RWxlbWVudC5zY3JvbGxUb3AgPiBTQ1JPTExFRF9USFJFU0hPTEQ7XG4gICAgICBpZiAoc2hvdWxkQmVTY3JvbGxlZCAhPT0gaXNTY3JvbGxlZCkge1xuICAgICAgICBpc1Njcm9sbGVkID0gc2hvdWxkQmVTY3JvbGxlZDtcbiAgICAgICAgZm9ybUNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKFNDUk9MTEVEX0NMQVNTLCBzaG91bGRCZVNjcm9sbGVkKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbCBjaGVja1xuICAgIGhhbmRsZVNjcm9sbCgpO1xuXG4gICAgLy8gTGlzdGVuIGZvciBzY3JvbGwgZXZlbnRzXG4gICAgYm9keUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBoYW5kbGVTY3JvbGwsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNsZWFudXBGbnMucHVzaCgoKSA9PiB7XG4gICAgICBib2R5RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGhhbmRsZVNjcm9sbCk7XG4gICAgICBmb3JtQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoU0NST0xMRURfQ0xBU1MpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBSZXR1cm4gY2xlYW51cCBmdW5jdGlvblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGNsZWFudXBGbnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuICB9O1xufTtcblxuLyoqXG4gKiB3aXRoTGF5b3V0IGZlYXR1cmVcbiAqIEFkZHMgZm9ybSBlbGVtZW50IGNyZWF0aW9uIGFuZCBsYXlvdXQgcHJvY2Vzc2luZ1xuICovXG5leHBvcnQgY29uc3Qgd2l0aExheW91dCA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgQmFzZUZvcm1Db21wb25lbnQ+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHtcbiAgICBmb3JtOiBIVE1MRm9ybUVsZW1lbnQ7XG4gICAgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGxheW91dFJlc3VsdDogdW5rbm93bjtcbiAgICBfY2xlYW51cFNjcm9sbEluZGljYXRvcj86ICgpID0+IHZvaWQ7XG4gIH0gPT4ge1xuICAgIC8vIENyZWF0ZSB0aGUgZm9ybSBlbGVtZW50XG4gICAgY29uc3QgZm9ybSA9IGNyZWF0ZUZvcm1FbGVtZW50KGNvbmZpZyk7XG5cbiAgICAvLyBBcHBlbmQgZm9ybSB0byBjb21wb25lbnQncyByb290IGVsZW1lbnRcbiAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFwcGVuZENoaWxkKGZvcm0pO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgbGF5b3V0IHNjaGVtYSBpZiBwcm92aWRlZFxuICAgIGNvbnN0IHsgdWksIGxheW91dFJlc3VsdCB9ID0gY29uZmlnLmxheW91dFxuICAgICAgPyBwcm9jZXNzTGF5b3V0U2NoZW1hKGNvbmZpZy5sYXlvdXQsIGZvcm0sIGNvbmZpZylcbiAgICAgIDogeyB1aToge30sIGxheW91dFJlc3VsdDogbnVsbCB9O1xuXG4gICAgLy8gU2V0dXAgc2Nyb2xsIGluZGljYXRvciBvbiBib2R5IGVsZW1lbnRzXG4gICAgY29uc3QgY2xlYW51cFNjcm9sbEluZGljYXRvciA9IHNldHVwU2Nyb2xsSW5kaWNhdG9yKFxuICAgICAgZm9ybSxcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgZm9ybSxcbiAgICAgIHVpLFxuICAgICAgbGF5b3V0UmVzdWx0LFxuICAgICAgX2NsZWFudXBTY3JvbGxJbmRpY2F0b3I6IGNsZWFudXBTY3JvbGxJbmRpY2F0b3IsXG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhMYXlvdXQ7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vY29uc3RhbnRzLnRzXG5cbi8qKlxuICogRGF0YSBzdGF0ZSBjb25zdGFudHNcbiAqIFRyYWNrcyB3aGV0aGVyIGZvcm0gZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IERBVEFfU1RBVEUgPSB7XG4gIC8qKiBEYXRhIG1hdGNoZXMgaW5pdGlhbCBzdGF0ZSAtIG5vIGNoYW5nZXMgbWFkZSAqL1xuICBQUklTVElORTogXCJwcmlzdGluZVwiLFxuICAvKiogRGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGUgKi9cbiAgRElSVFk6IFwiZGlydHlcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRm9ybSBldmVudCBjb25zdGFudHNcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fRVZFTlRTID0ge1xuICAvKiogRmlyZWQgd2hlbiBhbnkgZmllbGQgdmFsdWUgY2hhbmdlcyAqL1xuICBDSEFOR0U6IFwiY2hhbmdlXCIsXG4gIC8qKiBGaXJlZCB3aGVuIGZvcm0gaXMgc3VibWl0dGVkICovXG4gIFNVQk1JVDogXCJzdWJtaXRcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBzdGF0ZSBjaGFuZ2VzIChwcmlzdGluZSA8LT4gZGlydHkpICovXG4gIFNUQVRFX0NIQU5HRTogXCJzdGF0ZTpjaGFuZ2VcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBpcyBzZXQgb24gdGhlIGZvcm0gKi9cbiAgREFUQV9TRVQ6IFwiZGF0YTpzZXRcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgZm9ybSAqL1xuICBEQVRBX0dFVDogXCJkYXRhOmdldFwiLFxuICAvKiogRmlyZWQgd2hlbiBhIHNwZWNpZmljIGZpZWxkIGNoYW5nZXMgKi9cbiAgRklFTERfQ0hBTkdFOiBcImZpZWxkOmNoYW5nZVwiLFxuICAvKiogRmlyZWQgd2hlbiB2YWxpZGF0aW9uIGZhaWxzICovXG4gIFZBTElEQVRJT05fRVJST1I6IFwidmFsaWRhdGlvbjplcnJvclwiLFxuICAvKiogRmlyZWQgd2hlbiBzdWJtaXQgc3VjY2VlZHMgKi9cbiAgU1VCTUlUX1NVQ0NFU1M6IFwic3VibWl0OnN1Y2Nlc3NcIixcbiAgLyoqIEZpcmVkIHdoZW4gc3VibWl0IGZhaWxzICovXG4gIFNVQk1JVF9FUlJPUjogXCJzdWJtaXQ6ZXJyb3JcIixcbiAgLyoqIEZpcmVkIHdoZW4gZm9ybSBpcyByZXNldCB0byBpbml0aWFsIHN0YXRlICovXG4gIFJFU0VUOiBcInJlc2V0XCIsXG4gIC8qKiBGaXJlZCB3aGVuIHNldERhdGEgaXMgY2FsbGVkIHdpdGggdW5zYXZlZCBjaGFuZ2VzIChwcm90ZWN0aW9uIGVuYWJsZWQpICovXG4gIERBVEFfQ09ORkxJQ1Q6IFwiZGF0YTpjb25mbGljdFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBGb3JtIENTUyBjbGFzcyBtb2RpZmllcnNcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fQ0xBU1NFUyA9IHtcbiAgLyoqIEFwcGxpZWQgd2hlbiBkYXRhIGhhcyBiZWVuIG1vZGlmaWVkICovXG4gIE1PRElGSUVEOiBcIm1vZGlmaWVkXCIsXG4gIC8qKiBBcHBsaWVkIHdoZW4gZm9ybSBpcyBzdWJtaXR0aW5nICovXG4gIFNVQk1JVFRJTkc6IFwic3VibWl0dGluZ1wiLFxuICAvKiogQXBwbGllZCB3aGVuIGZvcm0gaXMgZGlzYWJsZWQgKi9cbiAgRElTQUJMRUQ6IFwiZGlzYWJsZWRcIixcbiAgLyoqIEFwcGxpZWQgd2hlbiBmb3JtIGJvZHkgaXMgc2Nyb2xsZWQgYXdheSBmcm9tIHRvcCAqL1xuICBTQ1JPTExFRDogXCJtdHJsLWZvcm0tLXNjcm9sbGVkXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIERlZmF1bHQgZm9ybSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBGT1JNX0RFRkFVTFRTID0ge1xuICBwcmVmaXg6IFwibXRybFwiLFxuICBjb21wb25lbnROYW1lOiBcImZvcm1cIixcbiAgdGFnOiBcImRpdlwiLFxuICBmb3JtVGFnOiBcImZvcm1cIixcbiAgbWV0aG9kOiBcIlBPU1RcIixcbiAgYXV0b2NvbXBsZXRlOiBcIm9mZlwiLFxuICB1c2VDaGFuZ2VzOiB0cnVlLFxuICBjb250cm9sczogW1wic3VibWl0XCIsIFwiY2FuY2VsXCJdLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBGaWVsZCBuYW1lIHByZWZpeGVzIHVzZWQgZm9yIGV4dHJhY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IEZJRUxEX1BSRUZJWEVTID0ge1xuICBJTkZPOiBcImluZm8uXCIsXG4gIEZJTEU6IFwiZmlsZS5cIixcbiAgREFUQTogXCJkYXRhLlwiLFxufSBhcyBjb25zdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9jb25maWcudHNcblxuaW1wb3J0IHR5cGUgeyBGb3JtQ29uZmlnLCBGb3JtU3RhdGUsIEZvcm1EYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEZPUk1fREVGQVVMVFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLy8gUmUtZXhwb3J0IEZPUk1fREVGQVVMVFMgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzXG5leHBvcnQgeyBGT1JNX0RFRkFVTFRTIH07XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgYmFzZSBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHMgYXBwbGllZFxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQmFzZUNvbmZpZyA9IChjb25maWc6IEZvcm1Db25maWcgPSB7fSk6IEZvcm1Db25maWcgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLkZPUk1fREVGQVVMVFMsXG4gICAgLi4uY29uZmlnLFxuICAgIHByZWZpeDogY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeCxcbiAgICBjb21wb25lbnROYW1lOiBjb25maWcuY29tcG9uZW50TmFtZSB8fCBGT1JNX0RFRkFVTFRTLmNvbXBvbmVudE5hbWUsXG4gICAgY29udHJvbHM6XG4gICAgICBjb25maWcuY29udHJvbHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IGNvbmZpZy5jb250cm9sc1xuICAgICAgICA6IFsuLi5GT1JNX0RFRkFVTFRTLmNvbnRyb2xzXSxcbiAgICBzeXNpbmZvOiBjb25maWcuc3lzaW5mbyB8fCBbXSxcbiAgICB2YWxpZGF0aW9uOiBjb25maWcudmFsaWRhdGlvbiB8fCBbXSxcbiAgICBvbjogY29uZmlnLm9uIHx8IHt9LFxuICB9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBpbml0aWFsIGZvcm0gc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUluaXRpYWxTdGF0ZSA9IChjb25maWc6IEZvcm1Db25maWcpOiBGb3JtU3RhdGUgPT4ge1xuICBjb25zdCBpbml0aWFsRGF0YSA9IGNvbmZpZy5kYXRhID8geyAuLi5jb25maWcuZGF0YSB9IDoge307XG5cbiAgcmV0dXJuIHtcbiAgICBtb2RpZmllZDogZmFsc2UsXG4gICAgc3VibWl0dGluZzogZmFsc2UsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIGluaXRpYWxEYXRhLFxuICAgIGN1cnJlbnREYXRhOiB7IC4uLmluaXRpYWxEYXRhIH0sXG4gICAgZXJyb3JzOiB7fSxcbiAgfTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgZWxlbWVudCBjb25maWd1cmF0aW9uIGZvciB3aXRoRWxlbWVudFxuICovXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudENvbmZpZyA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeDtcbiAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IEZPUk1fREVGQVVMVFMuY29tcG9uZW50TmFtZTtcblxuICBjb25zdCBjbGFzc05hbWVzID0gW2Ake3ByZWZpeH0tJHtjb21wb25lbnROYW1lfWBdO1xuXG4gIGlmIChjb25maWcuY2xhc3MpIHtcbiAgICBjbGFzc05hbWVzLnB1c2goY29uZmlnLmNsYXNzKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGFnOiBcImRpdlwiLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKFwiIFwiKSxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICBcImRhdGEtY29tcG9uZW50XCI6IGNvbXBvbmVudE5hbWUsXG4gICAgfSxcbiAgfTtcbn07XG5cbi8qKlxuICogRXh0cmFjdHMgZmllbGQgbmFtZSBmcm9tIGEgcHJlZml4ZWQgbmFtZSAoZS5nLiwgJ2luZm8udXNlcm5hbWUnIC0+ICd1c2VybmFtZScpXG4gKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0RmllbGROYW1lID0gKHByZWZpeGVkTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGFydHMgPSBwcmVmaXhlZE5hbWUuc3BsaXQoXCIuXCIpO1xuICByZXR1cm4gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzLnNsaWNlKDEpLmpvaW4oXCIuXCIpIDogcHJlZml4ZWROYW1lO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBmdWxsIGZpZWxkIHBhdGggaW5jbHVkaW5nIHByZWZpeFxuICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGRQYXRoID0gKG5hbWU6IHN0cmluZywgcHJlZml4OiBzdHJpbmcgPSBcImluZm9cIik6IHN0cmluZyA9PiB7XG4gIGlmIChuYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgIHJldHVybiBuYW1lO1xuICB9XG4gIHJldHVybiBgJHtwcmVmaXh9LiR7bmFtZX1gO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBuYW1lIGlzIGEgZmllbGQgbmFtZSAoc3RhcnRzIHdpdGggaW5mby4gb3IgZGF0YS4pXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpZWxkTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIG5hbWUuc3RhcnRzV2l0aChcImluZm8uXCIpIHx8IG5hbWUuc3RhcnRzV2l0aChcImRhdGEuXCIpO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBuYW1lIGlzIGEgZmlsZSBmaWVsZCBuYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpbGVOYW1lID0gKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKFwiZmlsZS5cIik7XG59O1xuXG4vKipcbiAqIERlZXAgY29tcGFyaXNvbiBvZiB0d28gdmFsdWVzIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBpc1ZhbHVlRXF1YWwgPSAoYTogdW5rbm93biwgYjogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGEgPT0gYjtcblxuICAvLyBIYW5kbGUgYXJyYXlzXG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKHZhbCwgaWR4KSA9PiBpc1ZhbHVlRXF1YWwodmFsLCBiW2lkeF0pKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBvYmplY3RzXG4gIGlmICh0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgYiA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMoYSBhcyBvYmplY3QpO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMoYiBhcyBvYmplY3QpO1xuICAgIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBrZXlzQS5ldmVyeSgoa2V5KSA9PlxuICAgICAgaXNWYWx1ZUVxdWFsKFxuICAgICAgICAoYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSxcbiAgICAgICAgKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyBIYW5kbGUgcHJpbWl0aXZlcyAod2l0aCB0eXBlIGNvZXJjaW9uIGZvciBzdHJpbmcvbnVtYmVyIGNvbXBhcmlzb24pXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgcmV0dXJuIGEgPT0gYjtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGZvcm0gZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc0RhdGFDaGFuZ2VkID0gKFxuICBpbml0aWFsOiBGb3JtRGF0YSxcbiAgY3VycmVudDogRm9ybURhdGEsXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgYWxsS2V5cyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGluaXRpYWwpLCAuLi5PYmplY3Qua2V5cyhjdXJyZW50KV0pO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGFsbEtleXMpIHtcbiAgICBpZiAoIWlzVmFsdWVFcXVhbChpbml0aWFsW2tleV0sIGN1cnJlbnRba2V5XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogR2V0cyBvbmx5IHRoZSBtb2RpZmllZCBmaWVsZHMgYmV0d2VlbiBpbml0aWFsIGFuZCBjdXJyZW50IGRhdGFcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1vZGlmaWVkRmllbGRzID0gKFxuICBpbml0aWFsOiBGb3JtRGF0YSxcbiAgY3VycmVudDogRm9ybURhdGEsXG4pOiBGb3JtRGF0YSA9PiB7XG4gIGNvbnN0IG1vZGlmaWVkOiBGb3JtRGF0YSA9IHt9O1xuICBjb25zdCBhbGxLZXlzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoaW5pdGlhbCksIC4uLk9iamVjdC5rZXlzKGN1cnJlbnQpXSk7XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgYWxsS2V5cykge1xuICAgIGlmICghaXNWYWx1ZUVxdWFsKGluaXRpYWxba2V5XSwgY3VycmVudFtrZXldKSkge1xuICAgICAgbW9kaWZpZWRba2V5XSA9IGN1cnJlbnRba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbW9kaWZpZWQ7XG59O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2ZpZWxkcy50c1xuXG4vKipcbiAqIEZpZWxkcyBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogRXh0cmFjdHMgZmllbGRzIGZyb20gbGF5b3V0IGFuZCBtYW5hZ2VzIHRoZSBmaWVsZCByZWdpc3RyeVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1GaWVsZCxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIEZpZWxkVmFsdWUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNGaWVsZE5hbWUsIGlzRmlsZU5hbWUsIGV4dHJhY3RGaWVsZE5hbWUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIG9iamVjdCBpcyBhIHZhbGlkIGZvcm0gZmllbGQgY29tcG9uZW50XG4gKiBBIGZvcm0gZmllbGQgbXVzdCBoYXZlIGF0IGxlYXN0IGdldFZhbHVlIG9yIHNldFZhbHVlIG1ldGhvZFxuICovXG5jb25zdCBpc0Zvcm1GaWVsZCA9IChvYmo6IHVua25vd24pOiBvYmogaXMgRm9ybUZpZWxkID0+IHtcbiAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGNhbmRpZGF0ZSA9IG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBNdXN0IGhhdmUgZWxlbWVudCBwcm9wZXJ0eVxuICBpZiAoIWNhbmRpZGF0ZS5lbGVtZW50IHx8ICEoY2FuZGlkYXRlLmVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBNdXN0IGhhdmUgZ2V0VmFsdWUgb3Igc2V0VmFsdWVcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgY2FuZGlkYXRlLmdldFZhbHVlID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgY2FuZGlkYXRlLnNldFZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgKTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgZnJvbSBhIGZpZWxkIGNvbXBvbmVudFxuICogQWxsIG10cmwgY29tcG9uZW50cyBub3cgaGF2ZSB1bmlmaWVkIGdldFZhbHVlKCkgQVBJOlxuICogLSBUZXh0ZmllbGQ6IHJldHVybnMgc3RyaW5nXG4gKiAtIFNlbGVjdDogcmV0dXJucyBzdHJpbmcgb3Igc3RyaW5nW11cbiAqIC0gQ2hpcHM6IHJldHVybnMgc3RyaW5nW11cbiAqIC0gU3dpdGNoL0NoZWNrYm94OiByZXR1cm5zIGJvb2xlYW4gKHVwZGF0ZWQgaW4gbXRybCBjb3JlKVxuICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGRWYWx1ZSA9IChmaWVsZDogRm9ybUZpZWxkKTogRmllbGRWYWx1ZSA9PiB7XG4gIGlmICh0eXBlb2YgZmllbGQuZ2V0VmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBmaWVsZC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLy8gRmFsbGJhY2s6IGNoZWNrIGZvciB2YWx1ZSBwcm9wZXJ0eVxuICBjb25zdCBmaWVsZEFueSA9IGZpZWxkIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChcInZhbHVlXCIgaW4gZmllbGRBbnkpIHtcbiAgICByZXR1cm4gZmllbGRBbnkudmFsdWUgYXMgRmllbGRWYWx1ZTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9uIGEgZmllbGQgY29tcG9uZW50XG4gKiBBbGwgbXRybCBjb21wb25lbnRzIG5vdyBoYXZlIHVuaWZpZWQgc2V0VmFsdWUoKSBBUEk6XG4gKiAtIFRleHRmaWVsZDogYWNjZXB0cyBzdHJpbmdcbiAqIC0gU2VsZWN0OiBhY2NlcHRzIHN0cmluZyBvciBzdHJpbmdbXVxuICogLSBDaGlwczogYWNjZXB0cyBzdHJpbmdbXVxuICogLSBTd2l0Y2gvQ2hlY2tib3g6IGFjY2VwdHMgYm9vbGVhbiBvciBzdHJpbmcgKFwidHJ1ZVwiL1wiZmFsc2VcIikgKHVwZGF0ZWQgaW4gbXRybCBjb3JlKVxuICpcbiAqIEZvciBzaWxlbnQgdXBkYXRlcyAobm8gY2hhbmdlIGV2ZW50cyksIHdlIHNldCBkaXJlY3RseSBvbiB0aGUgaW5wdXQgZWxlbWVudFxuICovXG5leHBvcnQgY29uc3Qgc2V0RmllbGRWYWx1ZSA9IChcbiAgZmllbGQ6IEZvcm1GaWVsZCxcbiAgdmFsdWU6IEZpZWxkVmFsdWUsXG4gIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGZpZWxkQW55ID0gZmllbGQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgc2VsZWN0IGNvbXBvbmVudCAoaGFzIHRleHRmaWVsZCBwcm9wZXJ0eSlcbiAgLy8gU2VsZWN0IGNvbXBvbmVudHMgbXVzdCBhbHdheXMgdXNlIHNldFZhbHVlIHRvIHVwZGF0ZSBpbnRlcm5hbCBzdGF0ZVxuICBjb25zdCBpc1NlbGVjdENvbXBvbmVudCA9IFwidGV4dGZpZWxkXCIgaW4gZmllbGRBbnkgJiYgXCJtZW51XCIgaW4gZmllbGRBbnk7XG5cbiAgaWYgKHNpbGVudCAmJiAhaXNTZWxlY3RDb21wb25lbnQpIHtcbiAgICAvLyBTaWxlbnQgdXBkYXRlOiBzZXQgZGlyZWN0bHkgb24gaW5wdXQgdG8gYXZvaWQgdHJpZ2dlcmluZyBjaGFuZ2UgZXZlbnRzXG4gICAgLy8gU2tpcCB0aGlzIGZvciBzZWxlY3QgY29tcG9uZW50cyAtIHRoZXkgbmVlZCBzZXRWYWx1ZSB0byB1cGRhdGUgaW50ZXJuYWwgc3RhdGVcbiAgICBjb25zdCBpbnB1dCA9IGZpZWxkQW55LmlucHV0IGFzXG4gICAgICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgICAgIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2hlY2tib3gvc3dpdGNoIChoYXMgY2hlY2tlZCBwcm9wZXJ0eSlcbiAgICAgIC8vIE5lZWQgdG8gbmFycm93IHR5cGUgdG8gSFRNTElucHV0RWxlbWVudCBiZWZvcmUgYWNjZXNzaW5nIGNoZWNrZWRcbiAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgaW5wdXQudHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZEJlQ2hlY2tlZCA9XG4gICAgICAgICAgdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IFwidHJ1ZVwiIHx8IHZhbHVlID09PSAxO1xuICAgICAgICBpbnB1dC5jaGVja2VkID0gc2hvdWxkQmVDaGVja2VkO1xuICAgICAgICAvLyBVcGRhdGUgdmlzdWFsIHN0YXRlIGJ5IHRvZ2dsaW5nIHRoZSBjaGVja2VkIGNsYXNzXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaWVsZEFueS5lbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpO1xuICAgICAgICAgIGNvbnN0IGJhc2VDbGFzcyA9IGNsYXNzTGlzdC5maW5kKFxuICAgICAgICAgICAgKGMpID0+IGMuc3RhcnRzV2l0aChcIm10cmwtXCIpICYmICFjLmluY2x1ZGVzKFwiLS1cIiksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoYmFzZUNsYXNzKSB7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoYCR7YmFzZUNsYXNzfS0tY2hlY2tlZGAsIHNob3VsZEJlQ2hlY2tlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUZXh0IGlucHV0IC0gc2V0IHZhbHVlIGRpcmVjdGx5XG4gICAgICAgIGlucHV0LnZhbHVlID0gKHZhbHVlIGFzIHN0cmluZykgPz8gXCJcIjtcbiAgICAgICAgLy8gVXBkYXRlIHZpc3VhbCBzdGF0ZSAtIHRvZ2dsZSAtLWVtcHR5IGNsYXNzIGJhc2VkIG9uIHZhbHVlXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaWVsZEFueS5lbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpO1xuICAgICAgICAgIGNvbnN0IGJhc2VDbGFzcyA9IGNsYXNzTGlzdC5maW5kKFxuICAgICAgICAgICAgKGMpID0+IGMuc3RhcnRzV2l0aChcIm10cmwtXCIpICYmICFjLmluY2x1ZGVzKFwiLS1cIiksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoYmFzZUNsYXNzKSB7XG4gICAgICAgICAgICBjb25zdCBpc0VtcHR5ID0gIWlucHV0LnZhbHVlO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGAke2Jhc2VDbGFzc30tLWVtcHR5YCwgaXNFbXB0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZvciBjb21wb25lbnRzIHdpdGhvdXQgaW5wdXQgKGxpa2UgY2hpcHMsIHNlbGVjdCksIGZhbGwgdGhyb3VnaCB0byBzZXRWYWx1ZVxuICAgIC8vIGJ1dCBzdGlsbCB1c2Ugc2lsZW50IG1vZGUgYmVoYXZpb3IgKG5vIGV2ZW50cyB0cmlnZ2VyZWQpXG4gIH1cblxuICAvLyBOb3JtYWwgdXBkYXRlOiB1c2UgY29tcG9uZW50J3Mgc2V0VmFsdWUgbWV0aG9kXG4gIGlmICh0eXBlb2YgZmllbGQuc2V0VmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZpZWxkLnNldFZhbHVlKHZhbHVlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGYWxsYmFjazogc2V0IHZhbHVlIHByb3BlcnR5IGRpcmVjdGx5XG4gIGlmIChcInZhbHVlXCIgaW4gZmllbGRBbnkpIHtcbiAgICBmaWVsZEFueS52YWx1ZSA9IHZhbHVlO1xuICB9XG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIGZpZWxkcyBmcm9tIHRoZSBVSSBjb21wb25lbnQgcmVnaXN0cnlcbiAqIExvb2tzIGZvciBjb21wb25lbnRzIHdpdGggbmFtZXMgc3RhcnRpbmcgd2l0aCAnaW5mby4nIG9yICdkYXRhLidcbiAqL1xuY29uc3QgZXh0cmFjdEZpZWxkcyA9IChcbiAgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb25maWc6IEZvcm1Db25maWcsXG4pOiB7IGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7IGZpbGVzOiBGb3JtRmllbGRSZWdpc3RyeSB9ID0+IHtcbiAgY29uc3QgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeSA9IG5ldyBNYXAoKTtcbiAgY29uc3QgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xuXG4gIGlmICghdWkpIHJldHVybiB7IGZpZWxkcywgZmlsZXMgfTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRdIG9mIE9iamVjdC5lbnRyaWVzKHVpKSkge1xuICAgIC8vIFNraXAgbm9uLWZpZWxkIGNvbXBvbmVudHNcbiAgICBpZiAoIWlzRm9ybUZpZWxkKGNvbXBvbmVudCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKGlzRmllbGROYW1lKG5hbWUpKSB7XG4gICAgICAvLyBFeHRyYWN0IGZpZWxkIG5hbWUgd2l0aG91dCBwcmVmaXggKGluZm8udXNlcm5hbWUgLT4gdXNlcm5hbWUpXG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBleHRyYWN0RmllbGROYW1lKG5hbWUpO1xuICAgICAgZmllbGRzLnNldChmaWVsZE5hbWUsIGNvbXBvbmVudCk7XG4gICAgfSBlbHNlIGlmIChpc0ZpbGVOYW1lKG5hbWUpKSB7XG4gICAgICAvLyBFeHRyYWN0IGZpbGUgbmFtZSB3aXRob3V0IHByZWZpeCAoZmlsZS5hdmF0YXIgLT4gYXZhdGFyKVxuICAgICAgY29uc3QgZmlsZU5hbWUgPSBleHRyYWN0RmllbGROYW1lKG5hbWUpO1xuICAgICAgZmlsZXMuc2V0KGZpbGVOYW1lLCBjb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGZpZWxkcywgZmlsZXMgfTtcbn07XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIGZpZWxkIHZhbHVlcyBmb3IgZXF1YWxpdHlcbiAqIEhhbmRsZXMgYXJyYXlzIChmb3IgY2hpcHMvbXVsdGktc2VsZWN0KSBhbmQgcHJpbWl0aXZlIHZhbHVlc1xuICovXG5jb25zdCB2YWx1ZXNFcXVhbCA9IChhOiBGaWVsZFZhbHVlLCBiOiBGaWVsZFZhbHVlKTogYm9vbGVhbiA9PiB7XG4gIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZFxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSGFuZGxlIGFycmF5cyAoY2hpcHMsIG11bHRpLXNlbGVjdClcbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYS5ldmVyeSgodmFsLCBpKSA9PiB2YWwgPT09IGJbaV0pO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBCaW5kcyBjaGFuZ2UgYW5kIGlucHV0IGV2ZW50cyB0byBmaWVsZHNcbiAqIENhbGxzIHRoZSBwcm92aWRlZCBjYWxsYmFjayB3aGVuIGFueSBmaWVsZCBjaGFuZ2VzXG4gKlxuICogTGlzdGVucyB0byBib3RoICdpbnB1dCcgKGZvciBpbW1lZGlhdGUgZmVlZGJhY2sgd2hpbGUgdHlwaW5nKVxuICogYW5kICdjaGFuZ2UnIChmb3IgY29tcG9uZW50cyB0aGF0IG9ubHkgZW1pdCBvbiBibHVyL3NlbGVjdGlvbilcbiAqXG4gKiBEZWR1cGxpY2F0ZXMgZXZlbnRzIHRvIHByZXZlbnQgZG91YmxlLWZpcmluZyB3aGVuIGJvdGggaW5wdXQgYW5kIGNoYW5nZVxuICogZW1pdCBmb3IgdGhlIHNhbWUgdmFsdWUgKGUuZy4sIHRleHRmaWVsZCBpbnB1dCBmb2xsb3dlZCBieSBibHVyKVxuICovXG4vKipcbiAqIFRyYWNrcyBsYXN0IGVtaXR0ZWQgdmFsdWVzIHBlciBmaWVsZCBmb3IgZGVkdXBsaWNhdGlvblxuICogRXhwb3NlZCBzbyB0aGF0IHNldERhdGEgY2FuIHVwZGF0ZSBpdCB3aGVuIHNldHRpbmcgdmFsdWVzIHNpbGVudGx5XG4gKi9cbmxldCBmaWVsZFZhbHVlVHJhY2tlcjogTWFwPHN0cmluZywgRmllbGRWYWx1ZT4gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB0cmFja2VkIHZhbHVlIGZvciBhIGZpZWxkXG4gKiBDYWxsZWQgd2hlbiBzZXREYXRhIGlzIHVzZWQgd2l0aCBzaWxlbnQ9dHJ1ZSB0byBrZWVwIGRlZHVwbGljYXRpb24gaW4gc3luY1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlVHJhY2tlZEZpZWxkVmFsdWUgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IEZpZWxkVmFsdWUsXG4pOiB2b2lkID0+IHtcbiAgaWYgKGZpZWxkVmFsdWVUcmFja2VyKSB7XG4gICAgZmllbGRWYWx1ZVRyYWNrZXIuc2V0KG5hbWUsIHZhbHVlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBVcGRhdGVzIGFsbCB0cmFja2VkIGZpZWxkIHZhbHVlcyBmcm9tIGEgZmllbGRzIHJlZ2lzdHJ5XG4gKiBDYWxsZWQgYWZ0ZXIgc2lsZW50IHNldERhdGEgdG8gc3luYyBkZWR1cGxpY2F0aW9uIHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBzeW5jVHJhY2tlZEZpZWxkVmFsdWVzID0gKGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnkpOiB2b2lkID0+IHtcbiAgaWYgKGZpZWxkVmFsdWVUcmFja2VyKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgICAgZmllbGRWYWx1ZVRyYWNrZXIuc2V0KG5hbWUsIGdldEZpZWxkVmFsdWUoZmllbGQpKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmVzZXRzIHRoZSBmaWVsZCB2YWx1ZSB0cmFja2VyIGZvciBhIG5ldyBmb3JtXG4gKiBTaG91bGQgYmUgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiB3aXRoRmllbGRzIGJlZm9yZSBiaW5kRmllbGRFdmVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0RmllbGRWYWx1ZVRyYWNrZXIgPSAoKTogdm9pZCA9PiB7XG4gIGZpZWxkVmFsdWVUcmFja2VyID0gbmV3IE1hcDxzdHJpbmcsIEZpZWxkVmFsdWU+KCk7XG59O1xuXG5jb25zdCBiaW5kRmllbGRFdmVudHMgPSAoXG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnksXG4gIG9uRmllbGRDaGFuZ2U6IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBGaWVsZFZhbHVlKSA9PiB2b2lkLFxuKTogdm9pZCA9PiB7XG4gIC8vIFVzZSB0aGUgc2hhcmVkIHRyYWNrZXIgKHNob3VsZCBiZSBpbml0aWFsaXplZCBieSByZXNldEZpZWxkVmFsdWVUcmFja2VyIGJlZm9yZSB0aGlzKVxuICBpZiAoIWZpZWxkVmFsdWVUcmFja2VyKSB7XG4gICAgZmllbGRWYWx1ZVRyYWNrZXIgPSBuZXcgTWFwPHN0cmluZywgRmllbGRWYWx1ZT4oKTtcbiAgfVxuXG4gIGNvbnN0IGxhc3RFbWl0dGVkVmFsdWVzID0gZmllbGRWYWx1ZVRyYWNrZXI7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIGlmICh0eXBlb2YgZmllbGQub24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGN1cnJlbnQgdmFsdWVcbiAgICAgIGxhc3RFbWl0dGVkVmFsdWVzLnNldChuYW1lLCBnZXRGaWVsZFZhbHVlKGZpZWxkKSk7XG5cbiAgICAgIC8vIEhhbmRsZXIgdGhhdCBkZWR1cGVzIGJhc2VkIG9uIHZhbHVlXG4gICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0RmllbGRWYWx1ZShmaWVsZCk7XG4gICAgICAgIGNvbnN0IGxhc3RWYWx1ZSA9IGxhc3RFbWl0dGVkVmFsdWVzLmdldChuYW1lKTtcblxuICAgICAgICAvLyBPbmx5IGVtaXQgaWYgdmFsdWUgYWN0dWFsbHkgY2hhbmdlZFxuICAgICAgICBpZiAoIXZhbHVlc0VxdWFsKHZhbHVlLCBsYXN0VmFsdWUpKSB7XG4gICAgICAgICAgbGFzdEVtaXR0ZWRWYWx1ZXMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICBvbkZpZWxkQ2hhbmdlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gTGlzdGVuIHRvICdpbnB1dCcgZm9yIGltbWVkaWF0ZSBmZWVkYmFjayAodGV4dGZpZWxkcyBlbWl0IHRoaXMgb24gZXZlcnkga2V5c3Ryb2tlKVxuICAgICAgZmllbGQub24oXCJpbnB1dFwiLCBoYW5kbGVDaGFuZ2UpO1xuXG4gICAgICAvLyBBbHNvIGxpc3RlbiB0byAnY2hhbmdlJyBmb3IgY29tcG9uZW50cyB0aGF0IG9ubHkgZW1pdCBvbiBibHVyL3NlbGVjdGlvblxuICAgICAgLy8gKGUuZy4sIHNlbGVjdCwgY2hpcHMsIHN3aXRjaClcbiAgICAgIGZpZWxkLm9uKFwiY2hhbmdlXCIsIGhhbmRsZUNoYW5nZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIHdpdGhGaWVsZHMgZmVhdHVyZVxuICogQWRkcyBmaWVsZCBleHRyYWN0aW9uIGFuZCByZWdpc3RyeSBtYW5hZ2VtZW50IHRvIHRoZSBmb3JtXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRmllbGRzID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICAgIGdldEZpZWxkOiAobmFtZTogc3RyaW5nKSA9PiBGb3JtRmllbGQgfCB1bmRlZmluZWQ7XG4gICAgZ2V0RmllbGROYW1lczogKCkgPT4gc3RyaW5nW107XG4gICAgaGFzRmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIH0gPT4ge1xuICAgIC8vIEV4dHJhY3QgZmllbGRzIGZyb20gVUkgcmVnaXN0cnlcbiAgICBjb25zdCB7IGZpZWxkcywgZmlsZXMgfSA9IGV4dHJhY3RGaWVsZHMoY29tcG9uZW50LnVpIHx8IHt9LCBjb25maWcpO1xuXG4gICAgLy8gUmVzZXQgdHJhY2tlciBmb3IgdGhpcyBuZXcgZm9ybSBpbnN0YW5jZVxuICAgIC8vIFRoaXMgZW5zdXJlcyBlYWNoIGZvcm0gaGFzIGl0cyBvd24gdHJhY2tlciBhbmQgcHJldmVudHMgY3Jvc3MtZm9ybSBpbnRlcmZlcmVuY2VcbiAgICByZXNldEZpZWxkVmFsdWVUcmFja2VyKCk7XG5cbiAgICAvLyBCaW5kIGNoYW5nZSBldmVudHMgaWYgY29tcG9uZW50IGhhcyBlbWl0XG4gICAgaWYgKGNvbXBvbmVudC5lbWl0KSB7XG4gICAgICBiaW5kRmllbGRFdmVudHMoZmllbGRzLCAobmFtZSwgdmFsdWUpID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImZpZWxkOmNoYW5nZVwiLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY2hhbmdlXCIsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxzbyBiaW5kIGNoYW5nZSBldmVudHMgdG8gZmlsZSBmaWVsZHNcbiAgICAgIGJpbmRGaWVsZEV2ZW50cyhmaWxlcywgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJmaWxlOmNoYW5nZVwiLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY2hhbmdlXCIsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgZmllbGRzLFxuICAgICAgZmlsZXMsXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgZmllbGQgY29tcG9uZW50IGJ5IG5hbWVcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGQobmFtZTogc3RyaW5nKTogRm9ybUZpZWxkIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkcy5nZXQobmFtZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgZmllbGQgbmFtZXNcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGROYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGZpZWxkcy5rZXlzKCkpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBhIGZpZWxkIGV4aXN0c1xuICAgICAgICovXG4gICAgICBoYXNGaWVsZChuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkcy5oYXMobmFtZSk7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoRmllbGRzO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2RhdGEudHNcblxuLyoqXG4gKiBEYXRhIGZlYXR1cmUgZm9yIEZvcm0gY29tcG9uZW50XG4gKiBIYW5kbGVzIGZvcm0gZGF0YSBvcGVyYXRpb25zOiBnZXQvc2V0IGRhdGEsIGNoYW5nZSB0cmFja2luZywgc25hcHNob3RzLFxuICogYW5kIGNoYW5nZSBwcm90ZWN0aW9uIChiZWZvcmV1bmxvYWQgd2FybmluZywgZGF0YSBjb25mbGljdCBkZXRlY3Rpb24pXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIEZvcm1TdGF0ZSxcbiAgRmllbGRWYWx1ZSxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIFByb3RlY3RDaGFuZ2VzQ29uZmlnLFxuICBEYXRhQ29uZmxpY3RFdmVudCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVJbml0aWFsU3RhdGUsXG4gIGhhc0RhdGFDaGFuZ2VkLFxuICBnZXRNb2RpZmllZEZpZWxkcyxcbn0gZnJvbSBcIi4uL2NvbmZpZ1wiO1xuaW1wb3J0IHsgZ2V0RmllbGRWYWx1ZSwgc2V0RmllbGRWYWx1ZSwgc3luY1RyYWNrZWRGaWVsZFZhbHVlcyB9IGZyb20gXCIuL2ZpZWxkc1wiO1xuaW1wb3J0IHsgRk9STV9FVkVOVFMsIERBVEFfU1RBVEUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQ29sbGVjdHMgY3VycmVudCB2YWx1ZXMgZnJvbSBhbGwgZmllbGRzXG4gKi9cbmNvbnN0IGNvbGxlY3RGaWVsZERhdGEgPSAoZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeSk6IEZvcm1EYXRhID0+IHtcbiAgY29uc3QgZGF0YTogRm9ybURhdGEgPSB7fTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKGZpZWxkKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufTtcblxuLyoqXG4gKiBTZXRzIHZhbHVlcyBvbiBmaWVsZHMgZnJvbSBhIGRhdGEgb2JqZWN0XG4gKiBTdXBwb3J0cyBkb3Qgbm90YXRpb24gZm9yIG5lc3RlZCB2YWx1ZXMgKGUuZy4sIHsgJ3VzZXIubmFtZSc6ICdKb2huJyB9KVxuICovXG5jb25zdCBzZXRGaWVsZHNEYXRhID0gKFxuICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBkYXRhOiBGb3JtRGF0YSxcbiAgc2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4pOiB2b2lkID0+IHtcbiAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIC8vIENoZWNrIGZvciBleGFjdCBtYXRjaCBmaXJzdFxuICAgIGlmIChuYW1lIGluIGRhdGEpIHtcbiAgICAgIHNldEZpZWxkVmFsdWUoZmllbGQsIGRhdGFbbmFtZV0sIHNpbGVudCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbmVzdGVkIHZhbHVlIHVzaW5nIGRvdCBub3RhdGlvblxuICAgIC8vIGUuZy4sIGZpZWxkIG5hbWUgJ3VzZXJuYW1lJyBtaWdodCBiZSBpbiBkYXRhIGFzIG5lc3RlZCB7IGluZm86IHsgdXNlcm5hbWU6ICd2YWx1ZScgfSB9XG4gICAgY29uc3QgdmFsdWUgPSBnZXROZXN0ZWRWYWx1ZShkYXRhLCBuYW1lKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2V0RmllbGRWYWx1ZShmaWVsZCwgdmFsdWUgYXMgRmllbGRWYWx1ZSwgc2lsZW50KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2V0cyBhIG5lc3RlZCB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb25cbiAqL1xuY29uc3QgZ2V0TmVzdGVkVmFsdWUgPSAoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBhdGg6IHN0cmluZyxcbik6IHVua25vd24gPT4ge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICBsZXQgY3VycmVudDogdW5rbm93biA9IG9iajtcblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY3VycmVudCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3VycmVudCA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwYXJ0XTtcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50O1xufTtcblxuLyoqXG4gKiBTZXRzIGEgbmVzdGVkIHZhbHVlIGluIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb25cbiAqL1xuY29uc3Qgc2V0TmVzdGVkVmFsdWUgPSAoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKCEocGFydCBpbiBjdXJyZW50KSB8fCB0eXBlb2YgY3VycmVudFtwYXJ0XSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgY3VycmVudFtwYXJ0XSA9IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIGN1cnJlbnRbcGFydHNbcGFydHMubGVuZ3RoIC0gMV1dID0gdmFsdWU7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGZsYXQgZmllbGQgZGF0YSB0byBuZXN0ZWQgb2JqZWN0IHN0cnVjdHVyZVxuICogZS5nLiwgeyAndXNlci5uYW1lJzogJ0pvaG4nIH0gLT4geyB1c2VyOiB7IG5hbWU6ICdKb2huJyB9IH1cbiAqL1xuY29uc3QgZmxhdFRvTmVzdGVkID0gKGRhdGE6IEZvcm1EYXRhKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICBpZiAoa2V5LmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgc2V0TmVzdGVkVmFsdWUocmVzdWx0LCBrZXksIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemVzIHByb3RlY3Rpb24gY29uZmlnIHRvIGEgY29uc2lzdGVudCBvYmplY3QgZm9ybWF0XG4gKi9cbmNvbnN0IG5vcm1hbGl6ZVByb3RlY3RDb25maWcgPSAoXG4gIGNvbmZpZzogYm9vbGVhbiB8IFByb3RlY3RDaGFuZ2VzQ29uZmlnIHwgdW5kZWZpbmVkLFxuKTogUHJvdGVjdENoYW5nZXNDb25maWcgPT4ge1xuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiB7IGJlZm9yZVVubG9hZDogZmFsc2UsIG9uRGF0YU92ZXJ3cml0ZTogZmFsc2UgfTtcbiAgfVxuICBpZiAoY29uZmlnID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHsgYmVmb3JlVW5sb2FkOiB0cnVlLCBvbkRhdGFPdmVyd3JpdGU6IHRydWUgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGJlZm9yZVVubG9hZDogY29uZmlnLmJlZm9yZVVubG9hZCA/PyBmYWxzZSxcbiAgICBvbkRhdGFPdmVyd3JpdGU6IGNvbmZpZy5vbkRhdGFPdmVyd3JpdGUgPz8gZmFsc2UsXG4gIH07XG59O1xuXG4vKipcbiAqIHdpdGhEYXRhIGZlYXR1cmVcbiAqIEFkZHMgZGF0YSBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyB0byB0aGUgZm9ybVxuICovXG5leHBvcnQgY29uc3Qgd2l0aERhdGEgPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8XG4gICAgVCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50ICYge1xuICAgICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgfSxcbiAgPihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7XG4gICAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgICBnZXREYXRhOiAoKSA9PiBGb3JtRGF0YTtcbiAgICBzZXREYXRhOiAoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgZ2V0RmllbGRWYWx1ZTogKG5hbWU6IHN0cmluZykgPT4gRmllbGRWYWx1ZTtcbiAgICBzZXRGaWVsZFZhbHVlOiAobmFtZTogc3RyaW5nLCB2YWx1ZTogRmllbGRWYWx1ZSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcbiAgICBpc01vZGlmaWVkOiAoKSA9PiBib29sZWFuO1xuICAgIGdldE1vZGlmaWVkRGF0YTogKCkgPT4gRm9ybURhdGE7XG4gICAgc25hcHNob3Q6ICgpID0+IHZvaWQ7XG4gICAgcmVzZXQ6IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gICAgY2xlYXI6IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gIH0gPT4ge1xuICAgIC8vIEluaXRpYWxpemUgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUluaXRpYWxTdGF0ZShjb25maWcpO1xuXG4gICAgLy8gTm9ybWFsaXplIHByb3RlY3Rpb24gY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHByb3RlY3RDb25maWcgPSBub3JtYWxpemVQcm90ZWN0Q29uZmlnKGNvbmZpZy5wcm90ZWN0Q2hhbmdlcyk7XG5cbiAgICAvLyBUcmFjayB0aGUgYmVmb3JldW5sb2FkIGhhbmRsZXIgc28gd2UgY2FuIHJlbW92ZSBpdFxuICAgIGxldCBiZWZvcmVVbmxvYWRIYW5kbGVyOiAoKGU6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQmVmb3JldW5sb2FkIGhhbmRsZXIgLSB3YXJucyB1c2VyIHdoZW4gbGVhdmluZyB3aXRoIHVuc2F2ZWQgY2hhbmdlc1xuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUJlZm9yZVVubG9hZCA9IChlOiBCZWZvcmVVbmxvYWRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHN0YXRlLm1vZGlmaWVkKSB7XG4gICAgICAgIC8vIFN0YW5kYXJkIHdheSB0byB0cmlnZ2VyIHRoZSBicm93c2VyJ3MgXCJ1bnNhdmVkIGNoYW5nZXNcIiBkaWFsb2dcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvLyBGb3Igb2xkZXIgYnJvd3NlcnMgLSByZXR1cm5WYWx1ZSBtdXN0IGJlIHNldFxuICAgICAgICBlLnJldHVyblZhbHVlID0gXCJcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIHRoZSBiZWZvcmV1bmxvYWQgaGFuZGxlciBpZiBwcm90ZWN0aW9uIGlzIGVuYWJsZWRcbiAgICAgKi9cbiAgICBjb25zdCByZWdpc3RlckJlZm9yZVVubG9hZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChwcm90ZWN0Q29uZmlnLmJlZm9yZVVubG9hZCAmJiAhYmVmb3JlVW5sb2FkSGFuZGxlcikge1xuICAgICAgICBiZWZvcmVVbmxvYWRIYW5kbGVyID0gaGFuZGxlQmVmb3JlVW5sb2FkO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBiZWZvcmVVbmxvYWRIYW5kbGVyKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlcnMgdGhlIGJlZm9yZXVubG9hZCBoYW5kbGVyXG4gICAgICovXG4gICAgY29uc3QgdW5yZWdpc3RlckJlZm9yZVVubG9hZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChiZWZvcmVVbmxvYWRIYW5kbGVyKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIGJlZm9yZVVubG9hZEhhbmRsZXIpO1xuICAgICAgICBiZWZvcmVVbmxvYWRIYW5kbGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBiZWZvcmV1bmxvYWQgcmVnaXN0cmF0aW9uIGJhc2VkIG9uIG1vZGlmaWVkIHN0YXRlXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUgPSAobW9kaWZpZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgIGlmIChwcm90ZWN0Q29uZmlnLmJlZm9yZVVubG9hZCkge1xuICAgICAgICBpZiAobW9kaWZpZWQpIHtcbiAgICAgICAgICByZWdpc3RlckJlZm9yZVVubG9hZCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGtlZXAgdGhlIGhhbmRsZXIgcmVnaXN0ZXJlZCBidXQgaXQgb25seSBwcmV2ZW50cyB1bmxvYWQgd2hlbiBtb2RpZmllZFxuICAgICAgICAvLyBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gY29uc3RhbnRseSBhZGRpbmcvcmVtb3ZpbmcgdGhlIGxpc3RlbmVyXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIElmIGluaXRpYWwgZGF0YSB3YXMgcHJvdmlkZWQsIHNldCBpdCBvbiBmaWVsZHNcbiAgICBpZiAoY29uZmlnLmRhdGEgJiYgY29tcG9uZW50LmZpZWxkcykge1xuICAgICAgc2V0RmllbGRzRGF0YShjb21wb25lbnQuZmllbGRzLCBjb25maWcuZGF0YSwgdHJ1ZSk7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICBzdGF0ZS5pbml0aWFsRGF0YSA9IHsgLi4uc3RhdGUuY3VycmVudERhdGEgfTtcbiAgICAgIC8vIFN5bmMgdGhlIGZpZWxkIHZhbHVlIHRyYWNrZXIgZm9yIGV2ZW50IGRlZHVwbGljYXRpb25cbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBjaGFuZ2UgZGV0ZWN0aW9uIHdvcmtzIGNvcnJlY3RseSB3aGVuIGZpZWxkcyBhcmUgbW9kaWZpZWRcbiAgICAgIHN5bmNUcmFja2VkRmllbGRWYWx1ZXMoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBiZWZvcmV1bmxvYWQgcHJvdGVjdGlvbiBpZiBlbmFibGVkXG4gICAgaWYgKHByb3RlY3RDb25maWcuYmVmb3JlVW5sb2FkKSB7XG4gICAgICByZWdpc3RlckJlZm9yZVVubG9hZCgpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZXIgZm9yIGZpZWxkL2ZpbGUgY2hhbmdlcyB0byB1cGRhdGUgc3RhdGVcbiAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQ6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogRmllbGRWYWx1ZSB9KSA9PiB7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YVtldmVudC5uYW1lXSA9IGV2ZW50LnZhbHVlO1xuICAgICAgY29uc3Qgd2FzTW9kaWZpZWQgPSBzdGF0ZS5tb2RpZmllZDtcbiAgICAgIHN0YXRlLm1vZGlmaWVkID0gaGFzRGF0YUNoYW5nZWQoc3RhdGUuaW5pdGlhbERhdGEsIHN0YXRlLmN1cnJlbnREYXRhKTtcblxuICAgICAgLy8gVXBkYXRlIGJlZm9yZXVubG9hZCBzdGF0ZSB3aGVuIG1vZGlmaWVkIGNoYW5nZXNcbiAgICAgIGlmICh3YXNNb2RpZmllZCAhPT0gc3RhdGUubW9kaWZpZWQpIHtcbiAgICAgICAgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUoc3RhdGUubW9kaWZpZWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IHN0YXRlOmNoYW5nZSBldmVudCB3aGVuIG1vZGlmaWVkIHN0YXRlIGNoYW5nZXNcbiAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBjb250cm9sbGVyIHRvIGVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzIGFjY29yZGluZ2x5XG4gICAgICBpZiAod2FzTW9kaWZpZWQgIT09IHN0YXRlLm1vZGlmaWVkKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLCB7XG4gICAgICAgICAgbW9kaWZpZWQ6IHN0YXRlLm1vZGlmaWVkLFxuICAgICAgICAgIHN0YXRlOiBzdGF0ZS5tb2RpZmllZCA/IERBVEFfU1RBVEUuRElSVFkgOiBEQVRBX1NUQVRFLlBSSVNUSU5FLFxuICAgICAgICAgIG5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICAgICAgdmFsdWU6IGV2ZW50LnZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIGZvciBmaWVsZCBjaGFuZ2VzIHRvIHVwZGF0ZSBzdGF0ZVxuICAgIGlmIChjb21wb25lbnQub24pIHtcbiAgICAgIGNvbXBvbmVudC5vbihcImZpZWxkOmNoYW5nZVwiLCBoYW5kbGVDaGFuZ2UpO1xuICAgICAgLy8gQWxzbyBsaXN0ZW4gZm9yIGZpbGUgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uKFwiZmlsZTpjaGFuZ2VcIiwgaGFuZGxlQ2hhbmdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBhY3R1YWwgc2V0RGF0YSBvcGVyYXRpb25cbiAgICAgKi9cbiAgICBjb25zdCBwZXJmb3JtU2V0RGF0YSA9IChkYXRhOiBGb3JtRGF0YSwgc2lsZW50OiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICBzZXRGaWVsZHNEYXRhKGNvbXBvbmVudC5maWVsZHMsIGRhdGEsIHNpbGVudCk7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG5cbiAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgLy8gV2hlbiBzZXR0aW5nIGRhdGEgc2lsZW50bHksIGFsc28gdXBkYXRlIGluaXRpYWwgZGF0YSBzbmFwc2hvdFxuICAgICAgICAvLyBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gbG9hZGluZyBkYXRhIGZyb20gc2VydmVyXG4gICAgICAgIHN0YXRlLmluaXRpYWxEYXRhID0geyAuLi5zdGF0ZS5jdXJyZW50RGF0YSB9O1xuICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICAvLyBTeW5jIHRoZSBmaWVsZCB2YWx1ZSB0cmFja2VyIGZvciBldmVudCBkZWR1cGxpY2F0aW9uXG4gICAgICAgIHN5bmNUcmFja2VkRmllbGRWYWx1ZXMoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGUgc2luY2Ugd2UncmUgbm8gbG9uZ2VyIG1vZGlmaWVkXG4gICAgICAgIHVwZGF0ZUJlZm9yZVVubG9hZFN0YXRlKGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9TRVQsIHN0YXRlLmN1cnJlbnREYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgYWN0dWFsIHJlc2V0IG9wZXJhdGlvblxuICAgICAqL1xuICAgIGNvbnN0IHBlcmZvcm1SZXNldCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHNldEZpZWxkc0RhdGEoY29tcG9uZW50LmZpZWxkcywgc3RhdGUuaW5pdGlhbERhdGEsIHRydWUpO1xuICAgICAgc3RhdGUuY3VycmVudERhdGEgPSB7IC4uLnN0YXRlLmluaXRpYWxEYXRhIH07XG4gICAgICBzdGF0ZS5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgc3RhdGUuZXJyb3JzID0ge307XG4gICAgICAvLyBVcGRhdGUgYmVmb3JldW5sb2FkIHN0YXRlIHNpbmNlIHdlJ3JlIG5vIGxvbmdlciBtb2RpZmllZFxuICAgICAgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUoZmFsc2UpO1xuICAgICAgLy8gRW1pdCBzdGF0ZTpjaGFuZ2Ugc28gcHJvdGVjdGlvbiBvdmVybGF5IGdldHMgcmVtb3ZlZFxuICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5TVEFURV9DSEFOR0UsIHtcbiAgICAgICAgbW9kaWZpZWQ6IGZhbHNlLFxuICAgICAgICBzdGF0ZTogREFUQV9TVEFURS5QUklTVElORSxcbiAgICAgIH0pO1xuICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5SRVNFVCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBjbGVhciBvcGVyYXRpb25cbiAgICAgKi9cbiAgICBjb25zdCBwZXJmb3JtQ2xlYXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBlbXB0eURhdGE6IEZvcm1EYXRhID0ge307XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgY29tcG9uZW50LmZpZWxkcy5rZXlzKCkpIHtcbiAgICAgICAgZW1wdHlEYXRhW25hbWVdID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHNldEZpZWxkc0RhdGEoY29tcG9uZW50LmZpZWxkcywgZW1wdHlEYXRhLCB0cnVlKTtcbiAgICAgIHN0YXRlLmN1cnJlbnREYXRhID0ge307XG4gICAgICBzdGF0ZS5pbml0aWFsRGF0YSA9IHt9O1xuICAgICAgc3RhdGUubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGVcbiAgICAgIHVwZGF0ZUJlZm9yZVVubG9hZFN0YXRlKGZhbHNlKTtcbiAgICAgIC8vIEVtaXQgc3RhdGU6Y2hhbmdlIHNvIHByb3RlY3Rpb24gb3ZlcmxheSBnZXRzIHJlbW92ZWRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLCB7XG4gICAgICAgIG1vZGlmaWVkOiBmYWxzZSxcbiAgICAgICAgc3RhdGU6IERBVEFfU1RBVEUuUFJJU1RJTkUsXG4gICAgICB9KTtcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuUkVTRVQpO1xuICAgIH07XG5cbiAgICBjb25zdCBlbmhhbmNlZCA9IHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHN0YXRlLFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgZm9ybSBkYXRhXG4gICAgICAgKi9cbiAgICAgIGdldERhdGEoKTogRm9ybURhdGEge1xuICAgICAgICAvLyBBbHdheXMgY29sbGVjdCBmcmVzaCBkYXRhIGZyb20gZmllbGRzXG4gICAgICAgIGNvbnN0IGRhdGEgPSBjb2xsZWN0RmllbGREYXRhKGNvbXBvbmVudC5maWVsZHMpO1xuICAgICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IGRhdGE7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9HRVQsIGRhdGEpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGZvcm0gZGF0YVxuICAgICAgICogQHBhcmFtIGRhdGEgLSBEYXRhIG9iamVjdCB0byBzZXRcbiAgICAgICAqIEBwYXJhbSBzaWxlbnQgLSBJZiB0cnVlLCBkb24ndCBlbWl0IGNoYW5nZSBldmVudHMgYW5kIHVwZGF0ZSBpbml0aWFsIHN0YXRlXG4gICAgICAgKlxuICAgICAgICogV2hlbiBwcm90ZWN0Q2hhbmdlcy5vbkRhdGFPdmVyd3JpdGUgaXMgZW5hYmxlZCBhbmQgdGhlIGZvcm0gaGFzIHVuc2F2ZWQgY2hhbmdlcyxcbiAgICAgICAqIHRoaXMgd2lsbCBlbWl0IGEgJ2RhdGE6Y29uZmxpY3QnIGV2ZW50LiBUaGUgZXZlbnQgaGFuZGxlciBjYW4gY2FsbCBjYW5jZWwoKVxuICAgICAgICogdG8gcHJldmVudCB0aGUgZGF0YSBmcm9tIGJlaW5nIHNldCwgb3IgbGV0IGl0IHByb2NlZWQgYnkgZGVmYXVsdC5cbiAgICAgICAqL1xuICAgICAgc2V0RGF0YShkYXRhOiBGb3JtRGF0YSwgc2lsZW50OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGRhdGEgY29uZmxpY3QgcHJvdGVjdGlvblxuICAgICAgICAvLyBPbmx5IGFwcGxpZXMgd2hlbjpcbiAgICAgICAgLy8gLSBQcm90ZWN0aW9uIGlzIGVuYWJsZWRcbiAgICAgICAgLy8gLSBGb3JtIGhhcyBiZWVuIG1vZGlmaWVkXG4gICAgICAgIC8vIC0gTm90IGEgc2lsZW50IG9wZXJhdGlvbiAoc2lsZW50IGlzIGZvciBsb2FkaW5nIGRhdGEpXG4gICAgICAgIGlmIChwcm90ZWN0Q29uZmlnLm9uRGF0YU92ZXJ3cml0ZSAmJiBzdGF0ZS5tb2RpZmllZCAmJiAhc2lsZW50KSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGNvbmZsaWN0IGV2ZW50XG4gICAgICAgICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICAgIGxldCBwcm9jZWVkZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQ6IERhdGFDb25mbGljdEV2ZW50ID0ge1xuICAgICAgICAgICAgY3VycmVudERhdGE6IHsgLi4uc3RhdGUuY3VycmVudERhdGEgfSxcbiAgICAgICAgICAgIG5ld0RhdGE6IGRhdGEsXG4gICAgICAgICAgICBjYW5jZWxsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbmZsaWN0RXZlbnQuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9jZWVkOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHByb2NlZWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgIHBlcmZvcm1TZXREYXRhKGRhdGEsIHNpbGVudCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBFbWl0IHRoZSBjb25mbGljdCBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9DT05GTElDVCwgY29uZmxpY3RFdmVudCk7XG5cbiAgICAgICAgICAvLyBJZiBjYW5jZWxsZWQsIGRvbid0IHNldCB0aGUgZGF0YVxuICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBwcm9jZWVkKCkgd2FzIGNhbGxlZCBpbiB0aGUgaGFuZGxlciwgZGF0YSBpcyBhbHJlYWR5IHNldFxuICAgICAgICAgIGlmIChwcm9jZWVkZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBuZWl0aGVyIGNhbmNlbCgpIG5vciBwcm9jZWVkKCkgd2FzIGNhbGxlZCwgcHJvY2VlZCBieSBkZWZhdWx0XG4gICAgICAgICAgLy8gVGhpcyBtYWludGFpbnMgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGVyZm9ybSB0aGUgYWN0dWFsIHNldERhdGEgb3BlcmF0aW9uXG4gICAgICAgIHBlcmZvcm1TZXREYXRhKGRhdGEsIHNpbGVudCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhIHNwZWNpZmljIGZpZWxkJ3MgdmFsdWVcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRWYWx1ZShuYW1lOiBzdHJpbmcpOiBGaWVsZFZhbHVlIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb21wb25lbnQuZmllbGRzLmdldChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgcmV0dXJuIGdldEZpZWxkVmFsdWUoZmllbGQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZS5jdXJyZW50RGF0YVtuYW1lXTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICovXG4gICAgICBzZXRGaWVsZFZhbHVlKFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHZhbHVlOiBGaWVsZFZhbHVlLFxuICAgICAgICBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbXBvbmVudC5maWVsZHMuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICBzZXRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgc2lsZW50KTtcbiAgICAgICAgICBzdGF0ZS5jdXJyZW50RGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgICAgICAgIHN0YXRlLm1vZGlmaWVkID0gaGFzRGF0YUNoYW5nZWQoc3RhdGUuaW5pdGlhbERhdGEsIHN0YXRlLmN1cnJlbnREYXRhKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGVcbiAgICAgICAgICB1cGRhdGVCZWZvcmVVbmxvYWRTdGF0ZShzdGF0ZS5tb2RpZmllZCk7XG5cbiAgICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5GSUVMRF9DSEFOR0UsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLkNIQU5HRSwgeyBuYW1lLCB2YWx1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgZm9ybSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAgICAgICAqL1xuICAgICAgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY3VycmVudERhdGEgPSBjb2xsZWN0RmllbGREYXRhKGNvbXBvbmVudC5maWVsZHMpO1xuICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGhhc0RhdGFDaGFuZ2VkKHN0YXRlLmluaXRpYWxEYXRhLCBjdXJyZW50RGF0YSk7XG4gICAgICAgIHJldHVybiBzdGF0ZS5tb2RpZmllZDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IG9ubHkgdGhlIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZFxuICAgICAgICovXG4gICAgICBnZXRNb2RpZmllZERhdGEoKTogRm9ybURhdGEge1xuICAgICAgICBjb25zdCBjdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICAgIHJldHVybiBnZXRNb2RpZmllZEZpZWxkcyhzdGF0ZS5pbml0aWFsRGF0YSwgY3VycmVudERhdGEpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBUYWtlIGEgc25hcHNob3Qgb2YgY3VycmVudCBkYXRhIGFzIHRoZSBuZXcgYmFzZWxpbmVcbiAgICAgICAqIEZ1dHVyZSBpc01vZGlmaWVkKCkgY2FsbHMgd2lsbCBjb21wYXJlIGFnYWluc3QgdGhpcyBzbmFwc2hvdFxuICAgICAgICovXG4gICAgICBzbmFwc2hvdCgpOiB2b2lkIHtcbiAgICAgICAgc3RhdGUuaW5pdGlhbERhdGEgPSB7IC4uLmNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcykgfTtcbiAgICAgICAgc3RhdGUuY3VycmVudERhdGEgPSB7IC4uLnN0YXRlLmluaXRpYWxEYXRhIH07XG4gICAgICAgIHN0YXRlLm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGUgc2luY2Ugd2UncmUgbm8gbG9uZ2VyIG1vZGlmaWVkXG4gICAgICAgIHVwZGF0ZUJlZm9yZVVubG9hZFN0YXRlKGZhbHNlKTtcbiAgICAgICAgLy8gRW1pdCBzdGF0ZTpjaGFuZ2Ugc28gcHJvdGVjdGlvbiBvdmVybGF5IGdldHMgcmVtb3ZlZFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlNUQVRFX0NIQU5HRSwge1xuICAgICAgICAgIG1vZGlmaWVkOiBmYWxzZSxcbiAgICAgICAgICBzdGF0ZTogREFUQV9TVEFURS5QUklTVElORSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlc2V0IGZvcm0gdG8gaW5pdGlhbCBkYXRhIHN0YXRlXG4gICAgICAgKlxuICAgICAgICogTm90ZTogUHJvdGVjdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBibG9ja2luZyBvdmVybGF5IGluIHRoZSBwcm90ZWN0aW9uIGZlYXR1cmUuXG4gICAgICAgKiByZXNldCgpIG5vIGxvbmdlciBlbWl0cyBkYXRhOmNvbmZsaWN0IGV2ZW50cyAtIGl0IGp1c3QgcmVzZXRzIHRoZSBmb3JtLlxuICAgICAgICogVXNlIGZvcmNlIHBhcmFtZXRlciBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKGlnbm9yZWQpLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgLSBJZ25vcmVkIChrZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSlcbiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBbHdheXMgcmV0dXJucyB0cnVlXG4gICAgICAgKi9cbiAgICAgIHJlc2V0KGZvcmNlOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICAgICAgcGVyZm9ybVJlc2V0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqXG4gICAgICAgKiBOb3RlOiBQcm90ZWN0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIGJsb2NraW5nIG92ZXJsYXkgaW4gdGhlIHByb3RlY3Rpb24gZmVhdHVyZS5cbiAgICAgICAqIGNsZWFyKCkgbm8gbG9uZ2VyIGVtaXRzIGRhdGE6Y29uZmxpY3QgZXZlbnRzIC0gaXQganVzdCBjbGVhcnMgdGhlIGZvcm0uXG4gICAgICAgKiBVc2UgZm9yY2UgcGFyYW1ldGVyIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAoaWdub3JlZCkuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZSAtIElnbm9yZWQgKGtlcHQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxuICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IEFsd2F5cyByZXR1cm5zIHRydWVcbiAgICAgICAqL1xuICAgICAgY2xlYXIoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgICAgICBwZXJmb3JtQ2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBSZWdpc3RlciBjbGVhbnVwIGZvciBiZWZvcmV1bmxvYWQgaGFuZGxlciB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWRcbiAgICAvLyBXZSBuZWVkIHRvIGhvb2sgaW50byB0aGUgbGlmZWN5Y2xlIGRlc3Ryb3kgbWVjaGFuaXNtXG4gICAgY29uc3Qgb3JpZ2luYWxMaWZlY3ljbGUgPSBjb21wb25lbnQubGlmZWN5Y2xlO1xuICAgIGlmIChvcmlnaW5hbExpZmVjeWNsZSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gb3JpZ2luYWxMaWZlY3ljbGUuZGVzdHJveTtcbiAgICAgIG9yaWdpbmFsTGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGJlZm9yZXVubG9hZCBoYW5kbGVyXG4gICAgICAgIHVucmVnaXN0ZXJCZWZvcmVVbmxvYWQoKTtcbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlZDtcbiAgfTtcbn07XG5cbmV4cG9ydCB7IGZsYXRUb05lc3RlZCwgZ2V0TmVzdGVkVmFsdWUsIHNldE5lc3RlZFZhbHVlIH07XG5leHBvcnQgZGVmYXVsdCB3aXRoRGF0YTtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9jb250cm9sbGVyLnRzXG5cbi8qKlxuICogQ29udHJvbGxlciBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogTWFuYWdlcyBjb250cm9sIGJ1dHRvbnMgKHN1Ym1pdC9jYW5jZWwpIGJhc2VkIG9uIGRhdGEgc3RhdGUgKHByaXN0aW5lL2RpcnR5KVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1TdGF0ZSxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIEZvcm1GaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBEQVRBX1NUQVRFLCBGT1JNX0VWRU5UUywgRk9STV9DTEFTU0VTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRk9STV9ERUZBVUxUUyB9IGZyb20gXCIuLi9jb25maWdcIjtcblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBmb3JtJ3Mgc3RhdGUgQ1NTIGNsYXNzXG4gKi9cbmNvbnN0IHVwZGF0ZVN0YXRlQ2xhc3MgPSAoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBtb2RpZmllZDogYm9vbGVhbixcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGNvbXBvbmVudE5hbWU6IHN0cmluZyxcbik6IHZvaWQgPT4ge1xuICBjb25zdCBtb2RpZmllZENsYXNzID0gYCR7cHJlZml4fS0ke2NvbXBvbmVudE5hbWV9LS0ke0ZPUk1fQ0xBU1NFUy5NT0RJRklFRH1gO1xuICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUobW9kaWZpZWRDbGFzcywgbW9kaWZpZWQpO1xufTtcblxuLyoqXG4gKiBFbmFibGVzIG9yIGRpc2FibGVzIGFsbCBmb3JtIGZpZWxkc1xuICovXG5jb25zdCBzZXRGaWVsZHNFbmFibGVkID0gKFxuICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBlbmFibGVkOiBib29sZWFuLFxuKTogdm9pZCA9PiB7XG4gIGZvciAoY29uc3QgWywgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIGlmIChlbmFibGVkICYmIHR5cGVvZiBmaWVsZC5lbmFibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZmllbGQuZW5hYmxlKCk7XG4gICAgfSBlbHNlIGlmICghZW5hYmxlZCAmJiB0eXBlb2YgZmllbGQuZGlzYWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBmaWVsZC5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdldHMgY29udHJvbCBidXR0b24gY29tcG9uZW50cyBmcm9tIHRoZSBVSSByZWdpc3RyeVxuICovXG5jb25zdCBnZXRDb250cm9sQnV0dG9ucyA9IChcbiAgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb250cm9sTmFtZXM6IHN0cmluZ1tdLFxuKTogTWFwPHN0cmluZywgRm9ybUZpZWxkPiA9PiB7XG4gIGNvbnN0IGNvbnRyb2xzID0gbmV3IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4oKTtcblxuICBmb3IgKGNvbnN0IG5hbWUgb2YgY29udHJvbE5hbWVzKSB7XG4gICAgY29uc3QgY29udHJvbCA9IHVpW25hbWVdO1xuICAgIGlmIChjb250cm9sICYmIHR5cGVvZiBjb250cm9sID09PSBcIm9iamVjdFwiICYmIFwiZWxlbWVudFwiIGluIGNvbnRyb2wpIHtcbiAgICAgIGNvbnRyb2xzLnNldChuYW1lLCBjb250cm9sIGFzIEZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbnRyb2xzO1xufTtcblxuLyoqXG4gKiBFbmFibGVzIG9yIGRpc2FibGVzIGNvbnRyb2wgYnV0dG9uc1xuICovXG5jb25zdCBzZXRDb250cm9sc0VuYWJsZWQgPSAoXG4gIGNvbnRyb2xzOiBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+LFxuICBlbmFibGVkOiBib29sZWFuLFxuKTogdm9pZCA9PiB7XG4gIGZvciAoY29uc3QgWywgY29udHJvbF0gb2YgY29udHJvbHMpIHtcbiAgICBpZiAoZW5hYmxlZCAmJiB0eXBlb2YgY29udHJvbC5lbmFibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29udHJvbC5lbmFibGUoKTtcbiAgICB9IGVsc2UgaWYgKCFlbmFibGVkICYmIHR5cGVvZiBjb250cm9sLmRpc2FibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29udHJvbC5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIHdpdGhDb250cm9sbGVyIGZlYXR1cmVcbiAqIEFkZHMgY29udHJvbCBidXR0b24gaGFuZGxpbmcgYmFzZWQgb24gZGF0YSBzdGF0ZSAocHJpc3RpbmUvZGlydHkpXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQ29udHJvbGxlciA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIDxcbiAgICBUIGV4dGVuZHMgQmFzZUZvcm1Db21wb25lbnQgJiB7XG4gICAgICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICAgICAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBvbj86IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgICB9LFxuICA+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHtcbiAgICBjb250cm9sczogTWFwPHN0cmluZywgRm9ybUZpZWxkPjtcbiAgICBnZXREYXRhU3RhdGU6ICgpID0+IHN0cmluZztcbiAgICBlbmFibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgICBkaXNhYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gICAgZW5hYmxlRmllbGRzOiAoKSA9PiB2b2lkO1xuICAgIGRpc2FibGVGaWVsZHM6ICgpID0+IHZvaWQ7XG4gIH0gPT4ge1xuICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZy5wcmVmaXggfHwgRk9STV9ERUZBVUxUUy5wcmVmaXg7XG4gICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IEZPUk1fREVGQVVMVFMuY29tcG9uZW50TmFtZTtcbiAgICBjb25zdCBjb250cm9sTmFtZXMgPSBjb25maWcuY29udHJvbHNcbiAgICAgID8gWy4uLmNvbmZpZy5jb250cm9sc11cbiAgICAgIDogWy4uLkZPUk1fREVGQVVMVFMuY29udHJvbHNdO1xuXG4gICAgLy8gR2V0IGNvbnRyb2wgYnV0dG9ucyBmcm9tIFVJXG4gICAgY29uc3QgY29udHJvbHMgPSBjb250cm9sTmFtZXNcbiAgICAgID8gZ2V0Q29udHJvbEJ1dHRvbnMoY29tcG9uZW50LnVpIHx8IHt9LCBjb250cm9sTmFtZXMpXG4gICAgICA6IG5ldyBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+KCk7XG5cbiAgICAvLyBJbml0aWFsaXplIGNvbnRyb2xzIGFzIGRpc2FibGVkIChwcmlzdGluZSBzdGF0ZSlcbiAgICBpZiAoY29udHJvbHMuc2l6ZSA+IDApIHtcbiAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgZmFsc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuaGFuY2VkID0ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgY29udHJvbHMsXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGN1cnJlbnQgZGF0YSBzdGF0ZSAocHJpc3RpbmUgb3IgZGlydHkpXG4gICAgICAgKi9cbiAgICAgIGdldERhdGFTdGF0ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnN0YXRlLm1vZGlmaWVkXG4gICAgICAgICAgPyBEQVRBX1NUQVRFLkRJUlRZXG4gICAgICAgICAgOiBEQVRBX1NUQVRFLlBSSVNUSU5FO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgY29udHJvbCBidXR0b25zXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUNvbnRyb2xzKCk6IHZvaWQge1xuICAgICAgICBzZXRDb250cm9sc0VuYWJsZWQoY29udHJvbHMsIHRydWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEaXNhYmxlIGNvbnRyb2wgYnV0dG9uc1xuICAgICAgICovXG4gICAgICBkaXNhYmxlQ29udHJvbHMoKTogdm9pZCB7XG4gICAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUZpZWxkcygpOiB2b2lkIHtcbiAgICAgICAgc2V0RmllbGRzRW5hYmxlZChjb21wb25lbnQuZmllbGRzLCB0cnVlKTtcbiAgICAgICAgY29tcG9uZW50LnN0YXRlLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVGaWVsZHMoKTogdm9pZCB7XG4gICAgICAgIHNldEZpZWxkc0VuYWJsZWQoY29tcG9uZW50LmZpZWxkcywgZmFsc2UpO1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIGZvciBzdGF0ZSBjaGFuZ2VzIHRvIGVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzXG4gICAgaWYgKGNvbmZpZy51c2VDaGFuZ2VzICE9PSBmYWxzZSAmJiBjb21wb25lbnQub24pIHtcbiAgICAgIGNvbXBvbmVudC5vbihcbiAgICAgICAgRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLFxuICAgICAgICAoZXZlbnQ6IHsgbW9kaWZpZWQ6IGJvb2xlYW47IHN0YXRlOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5tb2RpZmllZCkge1xuICAgICAgICAgICAgLy8gRGF0YSBpcyBkaXJ0eSAtIGVuYWJsZSBjb250cm9sc1xuICAgICAgICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCB0cnVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRGF0YSBpcyBwcmlzdGluZSAtIGRpc2FibGUgY29udHJvbHNcbiAgICAgICAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgZmFsc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFVwZGF0ZSBDU1MgY2xhc3NcbiAgICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHVwZGF0ZVN0YXRlQ2xhc3MoXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LFxuICAgICAgICAgICAgICBldmVudC5tb2RpZmllZCxcbiAgICAgICAgICAgICAgcHJlZml4LFxuICAgICAgICAgICAgICBjb21wb25lbnROYW1lLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlZDtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhDb250cm9sbGVyO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL3N1Ym1pdC50c1xuXG4vKipcbiAqIFN1Ym1pdCBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogSGFuZGxlcyBmb3JtIHZhbGlkYXRpb24gYW5kIHN1Ym1pc3Npb24gd2l0aCBhdXRvbWF0aWMgZmllbGQgZXJyb3IgZGlzcGxheVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1EYXRhLFxuICBGb3JtU3RhdGUsXG4gIEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBGb3JtRmllbGQsXG4gIEZvcm1WYWxpZGF0aW9uUnVsZSxcbiAgRm9ybVZhbGlkYXRpb25SZXN1bHQsXG4gIEZvcm1TdWJtaXRPcHRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEZPUk1fRVZFTlRTLCBGT1JNX0NMQVNTRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogRGVmYXVsdCBoZWFkZXJzIGZvciBKU09OIHJlcXVlc3RzXG4gKi9cbmNvbnN0IERFRkFVTFRfSEVBREVSUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyBmb3JtIGRhdGEgYWdhaW5zdCB2YWxpZGF0aW9uIHJ1bGVzXG4gKi9cbmNvbnN0IHZhbGlkYXRlRGF0YSA9IChcbiAgZGF0YTogRm9ybURhdGEsXG4gIHJ1bGVzOiBGb3JtVmFsaWRhdGlvblJ1bGVbXSxcbik6IEZvcm1WYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgY29uc3QgZXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGxldCB2YWxpZCA9IHRydWU7XG5cbiAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBkYXRhW3J1bGUuZmllbGRdO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJ1bGUudmFsaWRhdGUodmFsdWUsIGRhdGEpO1xuXG4gICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICBlcnJvcnNbcnVsZS5maWVsZF0gPSBydWxlLm1lc3NhZ2UgfHwgYCR7cnVsZS5maWVsZH0gaXMgaW52YWxpZGA7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgZXJyb3JzW3J1bGUuZmllbGRdID0gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHZhbGlkLCBlcnJvcnMgfTtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgc2luZ2xlIGZpZWxkIGFnYWluc3QgaXRzIHZhbGlkYXRpb24gcnVsZXNcbiAqL1xuY29uc3QgdmFsaWRhdGVGaWVsZCA9IChcbiAgZmllbGROYW1lOiBzdHJpbmcsXG4gIGRhdGE6IEZvcm1EYXRhLFxuICBydWxlczogRm9ybVZhbGlkYXRpb25SdWxlW10sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBmaWVsZFJ1bGVzID0gcnVsZXMuZmlsdGVyKChydWxlKSA9PiBydWxlLmZpZWxkID09PSBmaWVsZE5hbWUpO1xuXG4gIGZvciAoY29uc3QgcnVsZSBvZiBmaWVsZFJ1bGVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBkYXRhW3J1bGUuZmllbGRdO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJ1bGUudmFsaWRhdGUodmFsdWUsIGRhdGEpO1xuXG4gICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBydWxlLm1lc3NhZ2UgfHwgYCR7cnVsZS5maWVsZH0gaXMgaW52YWxpZGA7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBhY3R1YWwgSFRUUCByZXF1ZXN0XG4gKi9cbmNvbnN0IHBlcmZvcm1SZXF1ZXN0ID0gYXN5bmMgKFxuICB1cmw6IHN0cmluZyxcbiAgZGF0YTogRm9ybURhdGEsXG4gIG9wdGlvbnM6IEZvcm1TdWJtaXRPcHRpb25zLFxuKTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gIGNvbnN0IG1ldGhvZCA9IG9wdGlvbnMubWV0aG9kIHx8IFwiUE9TVFwiO1xuICBjb25zdCBoZWFkZXJzID0geyAuLi5ERUZBVUxUX0hFQURFUlMsIC4uLm9wdGlvbnMuaGVhZGVycyB9O1xuXG4gIGNvbnN0IGZldGNoT3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnMsXG4gIH07XG5cbiAgLy8gQWRkIGJvZHkgZm9yIG5vbi1HRVQgcmVxdWVzdHNcbiAgaWYgKG1ldGhvZCAhPT0gXCJHRVRcIikge1xuICAgIGZldGNoT3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgZmV0Y2hPcHRpb25zKTtcblxuICAvLyBQYXJzZSByZXNwb25zZVxuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpO1xuICBsZXQgcmVzdWx0OiB1bmtub3duO1xuXG4gIGlmIChjb250ZW50VHlwZSAmJiBjb250ZW50VHlwZS5pbmNsdWRlcyhcImFwcGxpY2F0aW9uL2pzb25cIikpIHtcbiAgICByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIEhUVFAgZXJyb3JzXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAvLyBUcnkgdG8gZXh0cmFjdCBlcnJvciBtZXNzYWdlIGZyb20gc2VydmVyIHJlc3BvbnNlXG4gICAgbGV0IGVycm9yTWVzc2FnZSA9IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWA7XG4gICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBzZXJ2ZXJFcnJvciA9IChyZXN1bHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmVycm9yO1xuICAgICAgaWYgKHR5cGVvZiBzZXJ2ZXJFcnJvciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSBzZXJ2ZXJFcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAoZXJyb3IgYXMgRXJyb3IgJiB7IHJlc3BvbnNlOiB1bmtub3duIH0pLnJlc3BvbnNlID0gcmVzdWx0O1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogd2l0aFN1Ym1pdCBmZWF0dXJlXG4gKiBBZGRzIHZhbGlkYXRpb24gYW5kIHN1Ym1pc3Npb24gY2FwYWJpbGl0aWVzIHRvIHRoZSBmb3JtXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoU3VibWl0ID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFxuICAgIFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudCAmIHtcbiAgICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgICBzdGF0ZTogRm9ybVN0YXRlO1xuICAgICAgZ2V0RGF0YTogKCkgPT4gRm9ybURhdGE7XG4gICAgICBnZXRNb2RpZmllZERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICAgICAgZW5hYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gICAgICBkaXNhYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gICAgICBzbmFwc2hvdDogKCkgPT4gdm9pZDtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBvbj86IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiAoZGF0YTogdW5rbm93bikgPT4gdm9pZCkgPT4gdm9pZDtcbiAgICB9LFxuICA+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHtcbiAgICB2YWxpZGF0ZTogKCkgPT4gRm9ybVZhbGlkYXRpb25SZXN1bHQ7XG4gICAgdmFsaWRhdGVGaWVsZDogKGZpZWxkTmFtZTogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgc3VibWl0OiAob3B0aW9ucz86IEZvcm1TdWJtaXRPcHRpb25zKSA9PiBQcm9taXNlPHVua25vd24+O1xuICAgIHNldFZhbGlkYXRpb25SdWxlczogKHJ1bGVzOiBGb3JtVmFsaWRhdGlvblJ1bGVbXSkgPT4gdm9pZDtcbiAgICBjbGVhckVycm9yczogKCkgPT4gdm9pZDtcbiAgICBjbGVhckZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHNldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSA9PiB2b2lkO1xuICAgIGdldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH0gPT4ge1xuICAgIC8vIFZhbGlkYXRpb24gcnVsZXMgY2FuIGJlIHVwZGF0ZWQgYXQgcnVudGltZVxuICAgIGxldCB2YWxpZGF0aW9uUnVsZXMgPSBjb25maWcudmFsaWRhdGlvbiB8fCBbXTtcblxuICAgIC8vIFdoZXRoZXIgdG8gc2hvdyBlcnJvciBtZXNzYWdlcyBpbiBmaWVsZCBoZWxwZXIgdGV4dCAoZGVmYXVsdDogdHJ1ZSlcbiAgICBjb25zdCBzaG93TWVzc2FnZXMgPSBjb25maWcuc2hvd0ZpZWxkRXJyb3JNZXNzYWdlcyAhPT0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBvciBjbGVhcnMgZXJyb3Igb24gYSBmaWVsZCBjb21wb25lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzaG93RmllbGRFcnJvciA9IChcbiAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgZXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkID0gY29tcG9uZW50LmZpZWxkcy5nZXQoZmllbGROYW1lKSBhcyBGb3JtRmllbGQgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZmllbGQgJiYgdHlwZW9mIGZpZWxkLnNldEVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgLy8gT25seSBwYXNzIG1lc3NhZ2UgaWYgc2hvd0ZpZWxkRXJyb3JNZXNzYWdlcyBpcyBlbmFibGVkXG4gICAgICAgICAgZmllbGQuc2V0RXJyb3IodHJ1ZSwgc2hvd01lc3NhZ2VzID8gZXJyb3IgOiB1bmRlZmluZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFBhc3MgZW1wdHkgc3RyaW5nIHRvIGFsc28gY2xlYXIgdGhlIGhlbHBlci9zdXBwb3J0aW5nIHRleHQgbWVzc2FnZVxuICAgICAgICAgIGZpZWxkLnNldEVycm9yKGZhbHNlLCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBlcnJvcnMgb24gYWxsIGZpZWxkIGNvbXBvbmVudHNcbiAgICAgKi9cbiAgICBjb25zdCBzaG93QWxsRmllbGRFcnJvcnMgPSAoZXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogdm9pZCA9PiB7XG4gICAgICAvLyBDbGVhciBhbGwgZmllbGQgZXJyb3JzIGZpcnN0XG4gICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWVdIG9mIGNvbXBvbmVudC5maWVsZHMpIHtcbiAgICAgICAgc2hvd0ZpZWxkRXJyb3IoZmllbGROYW1lLCB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgLy8gU2hvdyBuZXcgZXJyb3JzXG4gICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIGVycm9yXSBvZiBPYmplY3QuZW50cmllcyhlcnJvcnMpKSB7XG4gICAgICAgIHNob3dGaWVsZEVycm9yKGZpZWxkTmFtZSwgZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGZpZWxkIGNoYW5nZXMgdG8gYXV0by1jbGVhci9yZXZhbGlkYXRlIGVycm9yc1xuICAgIGlmIChjb21wb25lbnQub24pIHtcbiAgICAgIC8vIENsZWFyIHZpc3VhbCBlcnJvcnMgd2hlbiBmb3JtIGlzIHJlc2V0XG4gICAgICBjb21wb25lbnQub24oXCJyZXNldFwiLCAoKSA9PiB7XG4gICAgICAgIHNob3dBbGxGaWVsZEVycm9ycyh7fSk7XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uKFwiZmllbGQ6Y2hhbmdlXCIsIChldmVudDogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCB7IG5hbWUgfSA9IGV2ZW50IGFzIHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9O1xuXG4gICAgICAgIC8vIElmIHRoaXMgZmllbGQgaGFkIGFuIGVycm9yLCByZS12YWxpZGF0ZSBpdFxuICAgICAgICBpZiAoY29tcG9uZW50LnN0YXRlLmVycm9yc1tuYW1lXSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGVGaWVsZChuYW1lLCBkYXRhLCB2YWxpZGF0aW9uUnVsZXMpO1xuXG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBTdGlsbCBoYXMgZXJyb3IgLSB1cGRhdGUgbWVzc2FnZVxuICAgICAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9yc1tuYW1lXSA9IGVycm9yO1xuICAgICAgICAgICAgc2hvd0ZpZWxkRXJyb3IobmFtZSwgZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGaWVsZCBpcyBub3cgdmFsaWQgLSBjbGVhciBlcnJvclxuICAgICAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbbmFtZV07XG4gICAgICAgICAgICBzaG93RmllbGRFcnJvcihuYW1lLCB1bmRlZmluZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZWQgPSB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8qKlxuICAgICAgICogVmFsaWRhdGUgZm9ybSBkYXRhIGFnYWluc3QgY29uZmlndXJlZCBydWxlc1xuICAgICAgICogQXV0b21hdGljYWxseSBzaG93cyBlcnJvcnMgb24gZmllbGQgY29tcG9uZW50c1xuICAgICAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCB2YWxpZCBmbGFnIGFuZCBlcnJvcnMgb2JqZWN0XG4gICAgICAgKi9cbiAgICAgIHZhbGlkYXRlKCk6IEZvcm1WYWxpZGF0aW9uUmVzdWx0IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRlRGF0YShkYXRhLCB2YWxpZGF0aW9uUnVsZXMpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzdGF0ZSB3aXRoIHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnMgPSByZXN1bHQuZXJyb3JzO1xuXG4gICAgICAgIC8vIFNob3cgZXJyb3JzIG9uIGZpZWxkIGNvbXBvbmVudHNcbiAgICAgICAgc2hvd0FsbEZpZWxkRXJyb3JzKHJlc3VsdC5lcnJvcnMpO1xuXG4gICAgICAgIC8vIEVtaXQgdmFsaWRhdGlvbiBldmVudCBpZiB0aGVyZSBhcmUgZXJyb3JzXG4gICAgICAgIGlmICghcmVzdWx0LnZhbGlkKSB7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5WQUxJREFUSU9OX0VSUk9SLCByZXN1bHQuZXJyb3JzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFZhbGlkYXRlIGEgc2luZ2xlIGZpZWxkXG4gICAgICAgKiBAcmV0dXJucyBFcnJvciBtZXNzYWdlIGlmIGludmFsaWQsIHVuZGVmaW5lZCBpZiB2YWxpZFxuICAgICAgICovXG4gICAgICB2YWxpZGF0ZUZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGVGaWVsZChmaWVsZE5hbWUsIGRhdGEsIHZhbGlkYXRpb25SdWxlcyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9yc1tmaWVsZE5hbWVdID0gZXJyb3I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGROYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNob3dGaWVsZEVycm9yKGZpZWxkTmFtZSwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFN1Ym1pdCB0aGUgZm9ybVxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBzdWJtaXQgY29uZmlndXJhdGlvblxuICAgICAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHNlcnZlciByZXNwb25zZVxuICAgICAgICovXG4gICAgICBhc3luYyBzdWJtaXQob3B0aW9uczogRm9ybVN1Ym1pdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICAvLyBQcmV2ZW50IGRvdWJsZSBzdWJtaXNzaW9uXG4gICAgICAgIGlmIChjb21wb25lbnQuc3RhdGUuc3VibWl0dGluZykge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGb3JtIGlzIGFscmVhZHkgc3VibWl0dGluZ1wiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBpZiByZXF1ZXN0ZWQgKGRlZmF1bHQ6IHRydWUpXG4gICAgICAgIGlmIChvcHRpb25zLnZhbGlkYXRlICE9PSBmYWxzZSAmJiB2YWxpZGF0aW9uUnVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVmFsaWRhdGlvbiBmYWlsZWRcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgYXMgc3VibWl0dGluZ1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuc3VibWl0dGluZyA9IHRydWU7XG5cbiAgICAgICAgLy8gSW1tZWRpYXRlbHkgZGlzYWJsZSBjb250cm9scyB0byBwcmV2ZW50IGRvdWJsZS1jbGlja3NcbiAgICAgICAgY29tcG9uZW50LmRpc2FibGVDb250cm9scygpO1xuXG4gICAgICAgIC8vIEFkZCBzdWJtaXR0aW5nIGNsYXNzIHRvIGVsZW1lbnRcbiAgICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBcIm10cmxcIjtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgXCJmb3JtXCI7XG4gICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuY2xhc3NMaXN0LmFkZChcbiAgICAgICAgICAgIGAke3ByZWZpeH0tJHtjb21wb25lbnROYW1lfS0tJHtGT1JNX0NMQVNTRVMuU1VCTUlUVElOR31gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IHN1Ym1pdCBldmVudFxuICAgICAgICBjb25zdCBkYXRhID0gY29tcG9uZW50LmdldERhdGEoKTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5TVUJNSVQsIGRhdGEpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IHJlc3VsdDogdW5rbm93bjtcblxuICAgICAgICAgIC8vIFVzZSBjdXN0b20gaGFuZGxlciBpZiBwcm92aWRlZFxuICAgICAgICAgIGlmIChvcHRpb25zLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IG9wdGlvbnMuaGFuZGxlcihcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgY29tcG9uZW50IGFzIHVua25vd24gYXMgaW1wb3J0KFwiLi4vdHlwZXNcIikuRm9ybUNvbXBvbmVudCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb25maWcuYWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBVc2UgZGVmYXVsdCBmZXRjaFxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcGVyZm9ybVJlcXVlc3QoY29uZmlnLmFjdGlvbiwgZGF0YSwge1xuICAgICAgICAgICAgICBtZXRob2Q6IG9wdGlvbnMubWV0aG9kIHx8IGNvbmZpZy5tZXRob2QgfHwgXCJQT1NUXCIsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBObyBhY3Rpb24gVVJMLCBqdXN0IHJldHVybiB0aGUgZGF0YVxuICAgICAgICAgICAgcmVzdWx0ID0gZGF0YTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdWNjZXNzIVxuICAgICAgICAgIGNvbXBvbmVudC5zdGF0ZS5zdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9ycyA9IHt9O1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIHN1Ym1pdHRpbmcgY2xhc3NcbiAgICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZy5wcmVmaXggfHwgXCJtdHJsXCI7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgXCJmb3JtXCI7XG4gICAgICAgICAgICBjb21wb25lbnQuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFxuICAgICAgICAgICAgICBgJHtwcmVmaXh9LSR7Y29tcG9uZW50TmFtZX0tLSR7Rk9STV9DTEFTU0VTLlNVQk1JVFRJTkd9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVGFrZSBzbmFwc2hvdCBvZiBjdXJyZW50IGRhdGEgYXMgbmV3IGJhc2VsaW5lXG4gICAgICAgICAgLy8gVGhpcyByZXNldHMgbW9kaWZpZWQgc3RhdGUgdG8gZmFsc2UsIHdoaWNoIHdpbGwgdHJpZ2dlciBzdGF0ZTpjaGFuZ2VcbiAgICAgICAgICBjb21wb25lbnQuc25hcHNob3QoKTtcblxuICAgICAgICAgIC8vIERpc2FibGUgY29udHJvbHMgKGZvcm0gaXMgbm93IHByaXN0aW5lKVxuICAgICAgICAgIGNvbXBvbmVudC5kaXNhYmxlQ29udHJvbHMoKTtcblxuICAgICAgICAgIC8vIEVtaXQgc3VjY2VzcyBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1VCTUlUX1NVQ0NFU1MsIHJlc3VsdCk7XG5cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIEVycm9yIVxuICAgICAgICAgIGNvbXBvbmVudC5zdGF0ZS5zdWJtaXR0aW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAvLyBSZW1vdmUgc3VibWl0dGluZyBjbGFzc1xuICAgICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBcIm10cmxcIjtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjb25maWcuY29tcG9uZW50TmFtZSB8fCBcImZvcm1cIjtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICAgICAgICAgIGAke3ByZWZpeH0tJHtjb21wb25lbnROYW1lfS0tJHtGT1JNX0NMQVNTRVMuU1VCTUlUVElOR31gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZS1lbmFibGUgY29udHJvbHMgc28gdXNlciBjYW4gcmV0cnkgKGZvcm0gc3RpbGwgaGFzIHVuc2F2ZWQgY2hhbmdlcylcbiAgICAgICAgICBjb21wb25lbnQuZW5hYmxlQ29udHJvbHMoKTtcblxuICAgICAgICAgIC8vIEVtaXQgZXJyb3IgZXZlbnRcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlNVQk1JVF9FUlJPUiwgZXJyb3IpO1xuXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IHZhbGlkYXRpb24gcnVsZXMgYXQgcnVudGltZVxuICAgICAgICovXG4gICAgICBzZXRWYWxpZGF0aW9uUnVsZXMocnVsZXM6IEZvcm1WYWxpZGF0aW9uUnVsZVtdKTogdm9pZCB7XG4gICAgICAgIHZhbGlkYXRpb25SdWxlcyA9IHJ1bGVzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhbGwgdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHZpc3VhbCBlcnJvciBzdGF0ZXNcbiAgICAgICAqL1xuICAgICAgY2xlYXJFcnJvcnMoKTogdm9pZCB7XG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnMgPSB7fTtcbiAgICAgICAgc2hvd0FsbEZpZWxkRXJyb3JzKHt9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqL1xuICAgICAgY2xlYXJGaWVsZEVycm9yKGZpZWxkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdO1xuICAgICAgICBzaG93RmllbGRFcnJvcihmaWVsZCwgdW5kZWZpbmVkKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGFuIGVycm9yIGZvciBhIHNwZWNpZmljIGZpZWxkIChhbHNvIHNob3dzIG9uIGNvbXBvbmVudClcbiAgICAgICAqL1xuICAgICAgc2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdID0gZXJyb3I7XG4gICAgICAgIHNob3dGaWVsZEVycm9yKGZpZWxkLCBlcnJvcik7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCB0aGUgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGVuaGFuY2VkO1xuICB9O1xufTtcblxuZXhwb3J0IHsgdmFsaWRhdGVEYXRhLCB2YWxpZGF0ZUZpZWxkLCBwZXJmb3JtUmVxdWVzdCB9O1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN1Ym1pdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9wcm90ZWN0aW9uLnRzXG5cbi8qKlxuICogUHJvdGVjdGlvbiBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogSGFuZGxlcyBibG9ja2luZyBvdmVybGF5IHRvIHByZXZlbnQgY2xpY2tzIG91dHNpZGUgdGhlIGZvcm0gd2hlbiBpdCBoYXMgdW5zYXZlZCBjaGFuZ2VzXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIEZvcm1TdGF0ZSxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIFByb3RlY3RDaGFuZ2VzQ29uZmlnLFxuICBEYXRhQ29uZmxpY3RFdmVudCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0VWRU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBOb3JtYWxpemVzIHByb3RlY3Rpb24gY29uZmlnIHRvIGEgY29uc2lzdGVudCBvYmplY3QgZm9ybWF0XG4gKi9cbmNvbnN0IG5vcm1hbGl6ZVByb3RlY3RDb25maWcgPSAoXG4gIGNvbmZpZzogYm9vbGVhbiB8IFByb3RlY3RDaGFuZ2VzQ29uZmlnIHwgdW5kZWZpbmVkLFxuKTogUHJvdGVjdENoYW5nZXNDb25maWcgPT4ge1xuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiB7IGJlZm9yZVVubG9hZDogZmFsc2UsIG9uRGF0YU92ZXJ3cml0ZTogZmFsc2UgfTtcbiAgfVxuICBpZiAoY29uZmlnID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHsgYmVmb3JlVW5sb2FkOiB0cnVlLCBvbkRhdGFPdmVyd3JpdGU6IHRydWUgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGJlZm9yZVVubG9hZDogY29uZmlnLmJlZm9yZVVubG9hZCA/PyBmYWxzZSxcbiAgICBvbkRhdGFPdmVyd3JpdGU6IGNvbmZpZy5vbkRhdGFPdmVyd3JpdGUgPz8gZmFsc2UsXG4gIH07XG59O1xuXG4vKipcbiAqIHdpdGhQcm90ZWN0aW9uIGZlYXR1cmVcbiAqIEFkZHMgYmxvY2tpbmcgb3ZlcmxheSBwcm90ZWN0aW9uIHRvIHByZXZlbnQgY2xpY2tzIG91dHNpZGUgdGhlIGZvcm0gd2hlbiBtb2RpZmllZFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFByb3RlY3Rpb24gPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8XG4gICAgVCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50ICYge1xuICAgICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICAgIHN0YXRlOiBGb3JtU3RhdGU7XG4gICAgICBlbWl0PzogKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgICAgb24/OiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWQ7XG4gICAgICByZXNldD86IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gICAgICBjbGVhckVycm9ycz86ICgpID0+IHZvaWQ7XG4gICAgICBkaXNhYmxlQ29udHJvbHM/OiAoKSA9PiB2b2lkO1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUID0+IHtcbiAgICAvLyBOb3JtYWxpemUgcHJvdGVjdGlvbiBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgcHJvdGVjdENvbmZpZyA9IG5vcm1hbGl6ZVByb3RlY3RDb25maWcoY29uZmlnLnByb3RlY3RDaGFuZ2VzKTtcblxuICAgIC8vIElmIG92ZXJsYXkgcHJvdGVjdGlvbiBpcyBub3QgZW5hYmxlZCwgcmV0dXJuIGNvbXBvbmVudCB1bmNoYW5nZWRcbiAgICBpZiAoIXByb3RlY3RDb25maWcub25EYXRhT3ZlcndyaXRlKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIFRyYWNrIGJsb2NraW5nIG92ZXJsYXkgZWxlbWVudHMgKHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodClcbiAgICBsZXQgYmxvY2tpbmdPdmVybGF5czogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICAgLy8gUmVzaXplL3Njcm9sbCBoYW5kbGVyIGZvciB1cGRhdGluZyBvdmVybGF5IHBvc2l0aW9uc1xuICAgIGxldCByZXNpemVIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIFRyYWNrIGlmIHVzZXIgaGFzIGludGVyYWN0ZWQgd2l0aCB0aGUgZm9ybSAobWFkZSBhY3R1YWwgY2hhbmdlcylcbiAgICAvLyBUaGlzIHByZXZlbnRzIG92ZXJsYXlzIGZyb20gc2hvd2luZyBvbiBpbml0aWFsIGxvYWRcbiAgICBsZXQgaGFzVXNlckludGVyYWN0ZWQgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIGRhdGEgaGFzIGJlZW4gbG9hZGVkIGF0IGxlYXN0IG9uY2VcbiAgICAvLyBUaGlzIGhlbHBzIGRpc3Rpbmd1aXNoIGJldHdlZW4gaW5pdGlhbCBsb2FkIGFuZCB1c2VyIGVkaXRzXG4gICAgbGV0IGRhdGFIYXNCZWVuTG9hZGVkID0gZmFsc2U7XG5cbiAgICAvLyBUcmFjayBpZiB3ZSdyZSBjdXJyZW50bHkgbG9hZGluZyBkYXRhIChpZ25vcmUgZmllbGQ6Y2hhbmdlIGV2ZW50cyBkdXJpbmcgdGhpcyB0aW1lKVxuICAgIGxldCBpc0xvYWRpbmdEYXRhID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGJsb2NraW5nIG92ZXJsYXkgZWxlbWVudHMgYXJvdW5kIHRoZSBmb3JtXG4gICAgICogVGhlc2Ugb3ZlcmxheXMgcHJldmVudCBjbGlja3Mgb3V0c2lkZSB0aGUgZm9ybSB3aGVuIGl0IGhhcyB1bnNhdmVkIGNoYW5nZXNcbiAgICAgKi9cbiAgICBjb25zdCBjcmVhdGVCbG9ja2luZ092ZXJsYXlzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGJsb2NraW5nT3ZlcmxheXMubGVuZ3RoID4gMCkgcmV0dXJuOyAvLyBBbHJlYWR5IGNyZWF0ZWRcblxuICAgICAgY29uc3QgZm9ybUVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZm9ybUVsZW1lbnQpIHJldHVybjtcblxuICAgICAgLy8gR2V0IGZvcm0gcG9zaXRpb24gYW5kIGRpbWVuc2lvbnMgKHJlbGF0aXZlIHRvIHZpZXdwb3J0IGZvciBmaXhlZCBwb3NpdGlvbmluZylcbiAgICAgIGNvbnN0IHJlY3QgPSBmb3JtRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgLy8gQ29tbW9uIG92ZXJsYXkgc3R5bGVzIC0gdXNpbmcgZml4ZWQgcG9zaXRpb25pbmcgZm9yIHZpZXdwb3J0LXJlbGF0aXZlIHBsYWNlbWVudFxuICAgICAgLy8gei1pbmRleDogOTk5IGlzIGJlbG93IGRpYWxvZydzIG1vZGFsIHotaW5kZXggKDEwMDApIHNvIGRpYWxvZ3MgYXBwZWFyIGFib3ZlXG4gICAgICBjb25zdCBiYXNlU3R5bGVzID0gYFxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICB6LWluZGV4OiA5OTk7XG4gICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gICAgICBgO1xuXG4gICAgICAvLyBDcmVhdGUgdG9wIG92ZXJsYXkgKGZyb20gdG9wIG9mIHZpZXdwb3J0IHRvIHRvcCBvZiBmb3JtKVxuICAgICAgY29uc3QgdG9wT3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICB0b3BPdmVybGF5LmNsYXNzTmFtZSA9XG4gICAgICAgIFwibXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXkgbXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXktLXRvcFwiO1xuICAgICAgdG9wT3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gYCR7YmFzZVN0eWxlc31cbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAke3JlY3QudG9wfXB4O1xuICAgICAgYDtcblxuICAgICAgLy8gQ3JlYXRlIGJvdHRvbSBvdmVybGF5IChmcm9tIGJvdHRvbSBvZiBmb3JtIHRvIGJvdHRvbSBvZiB2aWV3cG9ydClcbiAgICAgIGNvbnN0IGJvdHRvbU92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgYm90dG9tT3ZlcmxheS5jbGFzc05hbWUgPVxuICAgICAgICBcIm10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5IG10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5LS1ib3R0b21cIjtcbiAgICAgIGJvdHRvbU92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGAke2Jhc2VTdHlsZXN9XG4gICAgICAgIHRvcDogJHtyZWN0LmJvdHRvbX1weDtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgIGA7XG5cbiAgICAgIC8vIENyZWF0ZSBsZWZ0IG92ZXJsYXkgKGZyb20gbGVmdCBvZiB2aWV3cG9ydCB0byBsZWZ0IG9mIGZvcm0sIGJldHdlZW4gdG9wIGFuZCBib3R0b20pXG4gICAgICBjb25zdCBsZWZ0T3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBsZWZ0T3ZlcmxheS5jbGFzc05hbWUgPVxuICAgICAgICBcIm10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5IG10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5LS1sZWZ0XCI7XG4gICAgICBsZWZ0T3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gYCR7YmFzZVN0eWxlc31cbiAgICAgICAgdG9wOiAke3JlY3QudG9wfXB4O1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB3aWR0aDogJHtyZWN0LmxlZnR9cHg7XG4gICAgICAgIGhlaWdodDogJHtyZWN0LmhlaWdodH1weDtcbiAgICAgIGA7XG5cbiAgICAgIC8vIENyZWF0ZSByaWdodCBvdmVybGF5IChmcm9tIHJpZ2h0IG9mIGZvcm0gdG8gcmlnaHQgb2Ygdmlld3BvcnQsIGJldHdlZW4gdG9wIGFuZCBib3R0b20pXG4gICAgICBjb25zdCByaWdodE92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgcmlnaHRPdmVybGF5LmNsYXNzTmFtZSA9XG4gICAgICAgIFwibXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXkgbXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXktLXJpZ2h0XCI7XG4gICAgICByaWdodE92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGAke2Jhc2VTdHlsZXN9XG4gICAgICAgIHRvcDogJHtyZWN0LnRvcH1weDtcbiAgICAgICAgbGVmdDogJHtyZWN0LnJpZ2h0fXB4O1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAke3JlY3QuaGVpZ2h0fXB4O1xuICAgICAgYDtcblxuICAgICAgLy8gQWRkIGNsaWNrIGhhbmRsZXIgdG8gc2hvdyBkaWFsb2cgd2hlbiBjbGlja2luZyBvbiBvdmVybGF5XG4gICAgICBjb25zdCBoYW5kbGVPdmVybGF5Q2xpY2sgPSAoZTogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgLy8gRW1pdCBkYXRhOmNvbmZsaWN0IGV2ZW50IHRvIHNob3cgZGlhbG9nXG4gICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQ6IERhdGFDb25mbGljdEV2ZW50ID0ge1xuICAgICAgICAgIGN1cnJlbnREYXRhOiB7IC4uLmNvbXBvbmVudC5zdGF0ZS5jdXJyZW50RGF0YSB9LFxuICAgICAgICAgIG5ld0RhdGE6IHt9LFxuICAgICAgICAgIGNhbmNlbGxlZDogZmFsc2UsXG4gICAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBVc2VyIGNob3NlIHRvIGtlZXAgZWRpdGluZyAtIGRvIG5vdGhpbmcsIG92ZXJsYXlzIHN0YXlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb2NlZWQ6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIFVzZXIgY2hvc2UgdG8gZGlzY2FyZCAtIHJlc2V0IGZvcm0gdG8gaW5pdGlhbCBzdGF0ZVxuICAgICAgICAgICAgLy8gU2FtZSBhcyBjYW5jZWwgYnV0dG9uIGJlaGF2aW9yXG4gICAgICAgICAgICBoYXNVc2VySW50ZXJhY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gUmVzZXQgZm9ybSB0byBpbml0aWFsIGRhdGEgKGZvcmNlPXRydWUgYnlwYXNzZXMgcHJvdGVjdGlvbilcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZXNldD8uKHRydWUpO1xuICAgICAgICAgICAgLy8gQ2xlYXIgYW55IHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICAgICAgICBjb21wb25lbnQuY2xlYXJFcnJvcnM/LigpO1xuICAgICAgICAgICAgLy8gRGlzYWJsZSBjb250cm9scyAoZm9ybSBpcyBub3cgcHJpc3RpbmUpXG4gICAgICAgICAgICBjb21wb25lbnQuZGlzYWJsZUNvbnRyb2xzPy4oKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9DT05GTElDVCwgY29uZmxpY3RFdmVudCk7XG4gICAgICB9O1xuXG4gICAgICBbdG9wT3ZlcmxheSwgYm90dG9tT3ZlcmxheSwgbGVmdE92ZXJsYXksIHJpZ2h0T3ZlcmxheV0uZm9yRWFjaChcbiAgICAgICAgKG92ZXJsYXkpID0+IHtcbiAgICAgICAgICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVPdmVybGF5Q2xpY2spO1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gICAgICAgICAgYmxvY2tpbmdPdmVybGF5cy5wdXNoKG92ZXJsYXkpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBibG9ja2luZyBvdmVybGF5IGVsZW1lbnRzXG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlQmxvY2tpbmdPdmVybGF5cyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChibG9ja2luZ092ZXJsYXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBibG9ja2luZ092ZXJsYXlzLmZvckVhY2goKG92ZXJsYXkpID0+IHtcbiAgICAgICAgb3ZlcmxheS5yZW1vdmUoKTtcbiAgICAgIH0pO1xuICAgICAgYmxvY2tpbmdPdmVybGF5cyA9IFtdO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGJsb2NraW5nIG92ZXJsYXlzIHBvc2l0aW9uIChlLmcuLCBvbiB3aW5kb3cgcmVzaXplKVxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUJsb2NraW5nT3ZlcmxheXMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoYmxvY2tpbmdPdmVybGF5cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgZm9ybUVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZm9ybUVsZW1lbnQpIHJldHVybjtcblxuICAgICAgY29uc3QgcmVjdCA9IGZvcm1FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAvLyBVcGRhdGUgZWFjaCBvdmVybGF5IHBvc2l0aW9uICh1c2luZyBmaXhlZCBwb3NpdGlvbmluZywgbm8gc2Nyb2xsIG9mZnNldCBuZWVkZWQpXG4gICAgICBjb25zdCBbdG9wT3ZlcmxheSwgYm90dG9tT3ZlcmxheSwgbGVmdE92ZXJsYXksIHJpZ2h0T3ZlcmxheV0gPVxuICAgICAgICBibG9ja2luZ092ZXJsYXlzO1xuXG4gICAgICBpZiAodG9wT3ZlcmxheSkge1xuICAgICAgICB0b3BPdmVybGF5LnN0eWxlLmhlaWdodCA9IGAke3JlY3QudG9wfXB4YDtcbiAgICAgIH1cbiAgICAgIGlmIChib3R0b21PdmVybGF5KSB7XG4gICAgICAgIGJvdHRvbU92ZXJsYXkuc3R5bGUudG9wID0gYCR7cmVjdC5ib3R0b219cHhgO1xuICAgICAgfVxuICAgICAgaWYgKGxlZnRPdmVybGF5KSB7XG4gICAgICAgIGxlZnRPdmVybGF5LnN0eWxlLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcbiAgICAgICAgbGVmdE92ZXJsYXkuc3R5bGUud2lkdGggPSBgJHtyZWN0LmxlZnR9cHhgO1xuICAgICAgICBsZWZ0T3ZlcmxheS5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0LmhlaWdodH1weGA7XG4gICAgICB9XG4gICAgICBpZiAocmlnaHRPdmVybGF5KSB7XG4gICAgICAgIHJpZ2h0T3ZlcmxheS5zdHlsZS50b3AgPSBgJHtyZWN0LnRvcH1weGA7XG4gICAgICAgIHJpZ2h0T3ZlcmxheS5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5yaWdodH1weGA7XG4gICAgICAgIHJpZ2h0T3ZlcmxheS5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0LmhlaWdodH1weGA7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgYmxvY2tpbmcgb3ZlcmxheXMgYmFzZWQgb24gbW9kaWZpZWQgc3RhdGVcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVQcm90ZWN0aW9uU3RhdGUgPSAobW9kaWZpZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgIGlmIChtb2RpZmllZCAmJiBoYXNVc2VySW50ZXJhY3RlZCkge1xuICAgICAgICBjcmVhdGVCbG9ja2luZ092ZXJsYXlzKCk7XG4gICAgICAgIC8vIEFkZCByZXNpemUvc2Nyb2xsIGxpc3RlbmVycyB0byB1cGRhdGUgb3ZlcmxheSBwb3NpdGlvbnNcbiAgICAgICAgaWYgKCFyZXNpemVIYW5kbGVyKSB7XG4gICAgICAgICAgcmVzaXplSGFuZGxlciA9IHVwZGF0ZUJsb2NraW5nT3ZlcmxheXM7XG4gICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZUJsb2NraW5nT3ZlcmxheXMoKTtcbiAgICAgICAgLy8gUmVtb3ZlIHJlc2l6ZS9zY3JvbGwgbGlzdGVuZXJzXG4gICAgICAgIGlmIChyZXNpemVIYW5kbGVyKSB7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgcmVzaXplSGFuZGxlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIGZvciBmaWVsZDpjaGFuZ2UgZXZlbnRzIHRvIGRldGVjdCBhY3R1YWwgdXNlciBlZGl0c1xuICAgIC8vIFRoaXMgaXMgbW9yZSByZWxpYWJsZSB0aGFuIFNUQVRFX0NIQU5HRSBiZWNhdXNlIGl0IGZpcmVzIG9uIGV2ZXJ5IGZpZWxkIGVkaXRcbiAgICBjb21wb25lbnQub24/LihcImZpZWxkOmNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICAvLyBJZ25vcmUgZmllbGQ6Y2hhbmdlIGV2ZW50cyBkdXJpbmcgZGF0YSBsb2FkaW5nXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBmcm9tIHByb2dyYW1tYXRpYyBmaWVsZCB1cGRhdGVzXG4gICAgICBpZiAoaXNMb2FkaW5nRGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgc2V0IGhhc1VzZXJJbnRlcmFjdGVkIGlmIGRhdGEgaGFzIGJlZW4gbG9hZGVkXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBkdXJpbmcgaW5pdGlhbCBmb3JtIHNldHVwXG4gICAgICBpZiAoZGF0YUhhc0JlZW5Mb2FkZWQgJiYgIWhhc1VzZXJJbnRlcmFjdGVkKSB7XG4gICAgICAgIGhhc1VzZXJJbnRlcmFjdGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBzaG93IG92ZXJsYXlzIG5vd1xuICAgICAgICBpZiAoY29tcG9uZW50LnN0YXRlLm1vZGlmaWVkKSB7XG4gICAgICAgICAgdXBkYXRlUHJvdGVjdGlvblN0YXRlKHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHN0YXRlIGNoYW5nZXMgdG8gc2hvdy9oaWRlIG92ZXJsYXlzXG4gICAgY29tcG9uZW50Lm9uPy4oRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLCAoZXZlbnQ6IHsgbW9kaWZpZWQ6IGJvb2xlYW4gfSkgPT4ge1xuICAgICAgLy8gV2hlbiBmb3JtIGJlY29tZXMgcHJpc3RpbmUgKGRhdGEgbG9hZGVkKSwgcmVzZXQgdGhlIGludGVyYWN0aW9uIGZsYWdcbiAgICAgIC8vIGFuZCBtYXJrIHRoYXQgZGF0YSBoYXMgYmVlbiBsb2FkZWRcbiAgICAgIGlmICghZXZlbnQubW9kaWZpZWQpIHtcbiAgICAgICAgaGFzVXNlckludGVyYWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgZGF0YUhhc0JlZW5Mb2FkZWQgPSB0cnVlO1xuICAgICAgICBpc0xvYWRpbmdEYXRhID0gdHJ1ZTtcblxuICAgICAgICAvLyBDbGVhciB0aGUgbG9hZGluZyBmbGFnIGFmdGVyIGEgc2hvcnQgZGVsYXkgdG8gYWxsb3cgYWxsIHByb2dyYW1tYXRpY1xuICAgICAgICAvLyBmaWVsZCB1cGRhdGVzIHRvIGNvbXBsZXRlIChjdXN0b20gZmllbGRzIG1heSB1cGRhdGUgYXN5bmMpXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlzTG9hZGluZ0RhdGEgPSBmYWxzZTtcbiAgICAgICAgfSwgMTAwKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHByb3RlY3Rpb24gc3RhdGVcbiAgICAgIHVwZGF0ZVByb3RlY3Rpb25TdGF0ZShldmVudC5tb2RpZmllZCk7XG4gICAgfSk7XG5cbiAgICAvLyBBbHNvIGxpc3RlbiBmb3IgcmVzZXQgZXZlbnQgdG8gcmVtb3ZlIG92ZXJsYXlzXG4gICAgY29tcG9uZW50Lm9uPy4oRk9STV9FVkVOVFMuUkVTRVQsICgpID0+IHtcbiAgICAgIHVwZGF0ZVByb3RlY3Rpb25TdGF0ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlciBjbGVhbnVwIHdoZW4gY29tcG9uZW50IGlzIGRlc3Ryb3llZFxuICAgIGNvbnN0IG9yaWdpbmFsTGlmZWN5Y2xlID0gY29tcG9uZW50LmxpZmVjeWNsZTtcbiAgICBpZiAob3JpZ2luYWxMaWZlY3ljbGUpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IG9yaWdpbmFsTGlmZWN5Y2xlLmRlc3Ryb3k7XG4gICAgICBvcmlnaW5hbExpZmVjeWNsZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBDbGVhbiB1cCBibG9ja2luZyBvdmVybGF5c1xuICAgICAgICByZW1vdmVCbG9ja2luZ092ZXJsYXlzKCk7XG4gICAgICAgIGlmIChyZXNpemVIYW5kbGVyKSB7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgcmVzaXplSGFuZGxlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoUHJvdGVjdGlvbjtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9hcGkudHNcblxuLyoqXG4gKiBBUEkgZmVhdHVyZSBmb3IgRm9ybSBjb21wb25lbnRcbiAqIFByb3ZpZGVzIGEgY2xlYW4sIHVuaWZpZWQgcHVibGljIEFQSSBmb3IgdGhlIGZvcm1cbiAqIEFsc28gd2lyZXMgdXAgY29udHJvbCBidXR0b24gY2xpY2sgaGFuZGxlcnMgKHN1Ym1pdC9jYW5jZWwpXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIERhdGFTdGF0ZSxcbiAgRm9ybVN0YXRlLFxuICBGb3JtRmllbGQsXG4gIEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBGb3JtVmFsaWRhdGlvblJlc3VsdCxcbiAgRm9ybVN1Ym1pdE9wdGlvbnMsXG4gIEZpZWxkVmFsdWUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRk9STV9FVkVOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogV2lyZXMgdXAgY2xpY2sgaGFuZGxlcnMgZm9yIGNvbnRyb2wgYnV0dG9ucyAoc3VibWl0LCBjYW5jZWwpXG4gKi9cbmNvbnN0IHdpcmVDb250cm9sQnV0dG9ucyA9IChcbiAgY29udHJvbHM6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4sXG4gIGFwaTogRm9ybUNvbXBvbmVudCxcbiAgY29uZmlnOiBGb3JtQ29uZmlnLFxuKTogdm9pZCA9PiB7XG4gIC8vIFdpcmUgc3VibWl0IGJ1dHRvblxuICBjb25zdCBzdWJtaXRCdXR0b24gPSBjb250cm9scy5nZXQoXCJzdWJtaXRcIik7XG4gIGlmIChzdWJtaXRCdXR0b24/LmVsZW1lbnQpIHtcbiAgICBzdWJtaXRCdXR0b24uZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGNvbmZpZy5vblN1Ym1pdCkge1xuICAgICAgICAvLyBVc2UgY3VzdG9tIHN1Ym1pdCBoYW5kbGVyXG4gICAgICAgIC8vIE5vdGU6IFdlIGRvIE5PVCBhdXRvLWRpc2FibGUgY29udHJvbHMgaGVyZSAtIHRoZSBjdXN0b20gaGFuZGxlclxuICAgICAgICAvLyBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgY29udHJvbCBzdGF0ZSAoZS5nLiwgaXQgbWF5IG9wZW4gYSBkaWFsb2dcbiAgICAgICAgLy8gZm9yIGFzeW5jIG9wZXJhdGlvbnMgbGlrZSBmaWxlIHVwbG9hZHMpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGFwaS5nZXREYXRhKCk7XG4gICAgICAgICAgYXdhaXQgY29uZmlnLm9uU3VibWl0KGRhdGEsIGFwaSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkZvcm0gc3VibWl0IGVycm9yOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzZSBkZWZhdWx0IGZvcm0gc3VibWl0IChoYW5kbGVzIGRpc2FibGluZyBpbnRlcm5hbGx5KVxuICAgICAgICBhd2FpdCBhcGkuc3VibWl0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBXaXJlIGNhbmNlbCBidXR0b25cbiAgY29uc3QgY2FuY2VsQnV0dG9uID0gY29udHJvbHMuZ2V0KFwiY2FuY2VsXCIpO1xuICBpZiAoY2FuY2VsQnV0dG9uPy5lbGVtZW50KSB7XG4gICAgY2FuY2VsQnV0dG9uLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIGlmIChjb25maWcub25DYW5jZWwpIHtcbiAgICAgICAgLy8gVXNlIGN1c3RvbSBjYW5jZWwgaGFuZGxlclxuICAgICAgICBjb25maWcub25DYW5jZWwoYXBpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERlZmF1bHQ6IHJlc2V0IGZvcm0gdG8gaW5pdGlhbCBzdGF0ZVxuICAgICAgICAvLyBVc2UgZm9yY2U9dHJ1ZSB0byBieXBhc3MgcHJvdGVjdGlvbiBzaW5jZSB0aGlzIGlzIGFuIGludGVudGlvbmFsIHVzZXIgYWN0aW9uXG4gICAgICAgIGFwaS5yZXNldCh0cnVlKTtcbiAgICAgIH1cbiAgICAgIC8vIENsZWFyIGFueSB2YWxpZGF0aW9uIGVycm9ycyAodmlzdWFsIHN0YXRlIG9uIGZpZWxkcylcbiAgICAgIGFwaS5jbGVhckVycm9ycygpO1xuICAgICAgLy8gQWZ0ZXIgY2FuY2VsLCBkaXNhYmxlIGNvbnRyb2xzIChmb3JtIGlzIG5vdyBwcmlzdGluZSlcbiAgICAgIGFwaS5kaXNhYmxlQ29udHJvbHMoKTtcbiAgICB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBFeHRlbmRlZCBjb21wb25lbnQgaW50ZXJmYWNlIGJlZm9yZSBBUEkgaXMgYXBwbGllZFxuICovXG5pbnRlcmZhY2UgRW5oYW5jZWRGb3JtQ29tcG9uZW50IGV4dGVuZHMgQmFzZUZvcm1Db21wb25lbnQge1xuICBmb3JtOiBIVE1MRm9ybUVsZW1lbnQ7XG4gIHVpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICBzdGF0ZTogRm9ybVN0YXRlO1xuICBjb250cm9sczogTWFwPHN0cmluZywgRm9ybUZpZWxkPjtcblxuICAvLyBEYXRhIG1ldGhvZHNcbiAgZ2V0RGF0YTogKCkgPT4gRm9ybURhdGE7XG4gIHNldERhdGE6IChkYXRhOiBGb3JtRGF0YSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcbiAgZ2V0RmllbGRWYWx1ZTogKG5hbWU6IHN0cmluZykgPT4gRmllbGRWYWx1ZTtcbiAgc2V0RmllbGRWYWx1ZTogKG5hbWU6IHN0cmluZywgdmFsdWU6IEZpZWxkVmFsdWUsIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gIGlzTW9kaWZpZWQ6ICgpID0+IGJvb2xlYW47XG4gIGdldE1vZGlmaWVkRGF0YTogKCkgPT4gRm9ybURhdGE7XG4gIHNuYXBzaG90OiAoKSA9PiB2b2lkO1xuICByZXNldDogKGZvcmNlPzogYm9vbGVhbikgPT4gYm9vbGVhbjtcbiAgY2xlYXI6IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG5cbiAgLy8gRmllbGQgbWV0aG9kc1xuICBnZXRGaWVsZDogKG5hbWU6IHN0cmluZykgPT4gRm9ybUZpZWxkIHwgdW5kZWZpbmVkO1xuICBnZXRGaWVsZE5hbWVzOiAoKSA9PiBzdHJpbmdbXTtcbiAgaGFzRmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XG5cbiAgLy8gQ29udHJvbGxlciBtZXRob2RzXG4gIGdldERhdGFTdGF0ZTogKCkgPT4gRGF0YVN0YXRlO1xuICBlbmFibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgZGlzYWJsZUNvbnRyb2xzOiAoKSA9PiB2b2lkO1xuICBlbmFibGVGaWVsZHM6ICgpID0+IHZvaWQ7XG4gIGRpc2FibGVGaWVsZHM6ICgpID0+IHZvaWQ7XG5cbiAgLy8gU3VibWl0L1ZhbGlkYXRpb24gbWV0aG9kc1xuICB2YWxpZGF0ZTogKCkgPT4gRm9ybVZhbGlkYXRpb25SZXN1bHQ7XG4gIHZhbGlkYXRlRmllbGQ6IChmaWVsZE5hbWU6IHN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBzdWJtaXQ6IChvcHRpb25zPzogRm9ybVN1Ym1pdE9wdGlvbnMpID0+IFByb21pc2U8dW5rbm93bj47XG4gIHNldFZhbGlkYXRpb25SdWxlczogKHJ1bGVzOiBpbXBvcnQoXCIuLi90eXBlc1wiKS5Gb3JtVmFsaWRhdGlvblJ1bGVbXSkgPT4gdm9pZDtcbiAgY2xlYXJFcnJvcnM6ICgpID0+IHZvaWQ7XG4gIGNsZWFyRmllbGRFcnJvcjogKGZpZWxkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSA9PiB2b2lkO1xuICBnZXRGaWVsZEVycm9yOiAoZmllbGQ6IHN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEV2ZW50IG1ldGhvZHNcbiAgb24/OiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWQ7XG4gIG9mZj86IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgZW1pdD86IChldmVudDogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZDtcblxuICAvLyBMaWZlY3ljbGVcbiAgbGlmZWN5Y2xlPzoge1xuICAgIGRlc3Ryb3k6ICgpID0+IHZvaWQ7XG4gIH07XG59XG5cbi8qKlxuICogd2l0aEFQSSBmZWF0dXJlXG4gKiBDcmVhdGVzIGEgY2xlYW4gcHVibGljIEFQSSBmb3IgdGhlIGZvcm0gY29tcG9uZW50XG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQVBJID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gKGNvbXBvbmVudDogRW5oYW5jZWRGb3JtQ29tcG9uZW50KTogRm9ybUNvbXBvbmVudCA9PiB7XG4gICAgLy8gUmVnaXN0ZXIgZXZlbnQgaGFuZGxlcnMgZnJvbSBjb25maWdcbiAgICBpZiAoY29uZmlnLm9uICYmIGNvbXBvbmVudC5vbikge1xuICAgICAgZm9yIChjb25zdCBbZXZlbnQsIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5vbikpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBjb21wb25lbnQub24oZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBwdWJsaWMgQVBJXG4gICAgY29uc3QgYXBpOiBGb3JtQ29tcG9uZW50ID0ge1xuICAgICAgLy8gQ29yZSBwcm9wZXJ0aWVzXG4gICAgICBlbGVtZW50OiBjb21wb25lbnQuZWxlbWVudCxcbiAgICAgIGZvcm06IGNvbXBvbmVudC5mb3JtLFxuICAgICAgdWk6IGNvbXBvbmVudC51aSxcbiAgICAgIGZpZWxkczogY29tcG9uZW50LmZpZWxkcyxcbiAgICAgIHN0YXRlOiBjb21wb25lbnQuc3RhdGUsXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gRGF0YSBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgZm9ybSBkYXRhIGFzIGEga2V5LXZhbHVlIG9iamVjdFxuICAgICAgICovXG4gICAgICBnZXREYXRhKCk6IEZvcm1EYXRhIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBmb3JtIGRhdGEgZnJvbSBhIGtleS12YWx1ZSBvYmplY3RcbiAgICAgICAqIEBwYXJhbSBkYXRhIC0gRGF0YSB0byBzZXRcbiAgICAgICAqIEBwYXJhbSBzaWxlbnQgLSBJZiB0cnVlLCBkb24ndCBlbWl0IGNoYW5nZSBldmVudHNcbiAgICAgICAqL1xuICAgICAgc2V0RGF0YShkYXRhOiBGb3JtRGF0YSwgc2lsZW50PzogYm9vbGVhbik6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuc2V0RGF0YShkYXRhLCBzaWxlbnQpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYSBzcGVjaWZpYyBmaWVsZCdzIHZhbHVlXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIEZpZWxkIG5hbWVcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRWYWx1ZShuYW1lOiBzdHJpbmcpOiBGaWVsZFZhbHVlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXRGaWVsZFZhbHVlKG5hbWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgYSBzcGVjaWZpYyBmaWVsZCdzIHZhbHVlXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIEZpZWxkIG5hbWVcbiAgICAgICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHNldFxuICAgICAgICogQHBhcmFtIHNpbGVudCAtIElmIHRydWUsIGRvbid0IGVtaXQgY2hhbmdlIGV2ZW50c1xuICAgICAgICovXG4gICAgICBzZXRGaWVsZFZhbHVlKFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHZhbHVlOiBGaWVsZFZhbHVlLFxuICAgICAgICBzaWxlbnQ/OiBib29sZWFuLFxuICAgICAgKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5zZXRGaWVsZFZhbHVlKG5hbWUsIHZhbHVlLCBzaWxlbnQpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYSBmaWVsZCBjb21wb25lbnQgYnkgbmFtZVxuICAgICAgICogQHBhcmFtIG5hbWUgLSBGaWVsZCBuYW1lXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkKG5hbWU6IHN0cmluZyk6IEZvcm1GaWVsZCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RmllbGQobmFtZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgZmllbGQgbmFtZXNcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGROYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RmllbGROYW1lcygpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBmb3JtIGhhcyBiZWVuIG1vZGlmaWVkIGZyb20gaW5pdGlhbC9zbmFwc2hvdCBzdGF0ZVxuICAgICAgICovXG4gICAgICBpc01vZGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmlzTW9kaWZpZWQoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gU3RhdGUgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZGF0YSBzdGF0ZSAocHJpc3RpbmUgb3IgZGlydHkpXG4gICAgICAgKi9cbiAgICAgIGdldERhdGFTdGF0ZSgpOiBEYXRhU3RhdGUge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldERhdGFTdGF0ZSgpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBWYWxpZGF0aW9uIEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogVmFsaWRhdGUgdGhlIGZvcm0gYWdhaW5zdCBjb25maWd1cmVkIHJ1bGVzXG4gICAgICAgKiBBdXRvbWF0aWNhbGx5IHNob3dzIGVycm9ycyBvbiBmaWVsZCBjb21wb25lbnRzXG4gICAgICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIHZhbGlkIGZsYWcgYW5kIGVycm9yc1xuICAgICAgICovXG4gICAgICB2YWxpZGF0ZSgpOiBGb3JtVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudmFsaWRhdGUoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogVmFsaWRhdGUgYSBzaW5nbGUgZmllbGRcbiAgICAgICAqIEBwYXJhbSBmaWVsZE5hbWUgLSBGaWVsZCBuYW1lIHRvIHZhbGlkYXRlXG4gICAgICAgKiBAcmV0dXJucyBFcnJvciBtZXNzYWdlIGlmIGludmFsaWQsIHVuZGVmaW5lZCBpZiB2YWxpZFxuICAgICAgICovXG4gICAgICB2YWxpZGF0ZUZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC52YWxpZGF0ZUZpZWxkKGZpZWxkTmFtZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAgICovXG4gICAgICBjbGVhckVycm9ycygpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmNsZWFyRXJyb3JzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGVycm9yIGZvciBhIHNwZWNpZmljIGZpZWxkXG4gICAgICAgKiBAcGFyYW0gZmllbGQgLSBGaWVsZCBuYW1lXG4gICAgICAgKi9cbiAgICAgIGNsZWFyRmllbGRFcnJvcihmaWVsZDogc3RyaW5nKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5jbGVhckZpZWxkRXJyb3IoZmllbGQpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqIEBwYXJhbSBmaWVsZCAtIEZpZWxkIG5hbWVcbiAgICAgICAqIEBwYXJhbSBlcnJvciAtIEVycm9yIG1lc3NhZ2VcbiAgICAgICAqL1xuICAgICAgc2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5zZXRGaWVsZEVycm9yKGZpZWxkLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBlcnJvciBmb3IgYSBzcGVjaWZpYyBmaWVsZFxuICAgICAgICogQHBhcmFtIGZpZWxkIC0gRmllbGQgbmFtZVxuICAgICAgICogQHJldHVybnMgRXJyb3IgbWVzc2FnZSBvciB1bmRlZmluZWRcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXRGaWVsZEVycm9yKGZpZWxkKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gU3VibWl0IEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogU3VibWl0IHRoZSBmb3JtXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHN1Ym1pdCBjb25maWd1cmF0aW9uXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHN1Ym1pdChvcHRpb25zPzogRm9ybVN1Ym1pdE9wdGlvbnMpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5zdWJtaXQob3B0aW9ucyk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIFN0YXRlIE1hbmFnZW1lbnQgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBSZXNldCBmb3JtIHRvIGluaXRpYWwvc25hcHNob3Qgc3RhdGVcbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgLSBJZiB0cnVlLCBieXBhc3MgcHJvdGVjdGlvbiBhbmQgcmVzZXQgaW1tZWRpYXRlbHlcbiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHJlc2V0IHdhcyBwZXJmb3JtZWQsIGZhbHNlIGlmIGNhbmNlbGxlZCBieSBwcm90ZWN0aW9uXG4gICAgICAgKi9cbiAgICAgIHJlc2V0KGZvcmNlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnJlc2V0KGZvcmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlIC0gSWYgdHJ1ZSwgYnlwYXNzIHByb3RlY3Rpb24gYW5kIGNsZWFyIGltbWVkaWF0ZWx5XG4gICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBjbGVhciB3YXMgcGVyZm9ybWVkLCBmYWxzZSBpZiBjYW5jZWxsZWQgYnkgcHJvdGVjdGlvblxuICAgICAgICovXG4gICAgICBjbGVhcihmb3JjZT86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5jbGVhcihmb3JjZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFRha2UgYSBzbmFwc2hvdCBvZiBjdXJyZW50IGRhdGEgYXMgdGhlIG5ldyBiYXNlbGluZVxuICAgICAgICogUmVzZXRzIG1vZGlmaWVkIHN0YXRlIHRvIGZhbHNlIGFuZCByZW1vdmVzIHByb3RlY3Rpb24gb3ZlcmxheXNcbiAgICAgICAqIFVzZWZ1bCBhZnRlciBzdWNjZXNzZnVsIGZvcm0gc3VibWlzc2lvblxuICAgICAgICovXG4gICAgICBzbmFwc2hvdCgpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LnNuYXBzaG90KCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqL1xuICAgICAgZW5hYmxlKCk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuZW5hYmxlRmllbGRzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGUoKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5kaXNhYmxlRmllbGRzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBjb250cm9sIGJ1dHRvbnMgKHN1Ym1pdCwgY2FuY2VsLCBldGMuKVxuICAgICAgICovXG4gICAgICBlbmFibGVDb250cm9scygpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmVuYWJsZUNvbnRyb2xzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgY29udHJvbCBidXR0b25zXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVDb250cm9scygpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmRpc2FibGVDb250cm9scygpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBFdmVudCBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lclxuICAgICAgICogQHBhcmFtIGV2ZW50IC0gRXZlbnQgbmFtZVxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKi9cbiAgICAgIG9uKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5vbj8uKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgKiBAcGFyYW0gZXZlbnQgLSBFdmVudCBuYW1lXG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqL1xuICAgICAgb2ZmKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5vZmY/LihldmVudCwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVtaXQgYW4gZXZlbnRcbiAgICAgICAqIEBwYXJhbSBldmVudCAtIEV2ZW50IG5hbWVcbiAgICAgICAqIEBwYXJhbSBkYXRhIC0gRXZlbnQgZGF0YVxuICAgICAgICovXG4gICAgICBlbWl0KGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oZXZlbnQsIGRhdGEpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBMaWZlY3ljbGUgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBEZXN0cm95IHRoZSBmb3JtIGFuZCBjbGVhbiB1cCByZXNvdXJjZXNcbiAgICAgICAqL1xuICAgICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2xlYXIgYWxsIGZpZWxkIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICBmb3IgKGNvbnN0IFssIGZpZWxkXSBvZiBjb21wb25lbnQuZmllbGRzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGZpZWxkLmRlc3Ryb3koKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBjb250cm9sIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICBmb3IgKGNvbnN0IFssIGNvbnRyb2xdIG9mIGNvbXBvbmVudC5jb250cm9scykge1xuICAgICAgICAgIGlmICh0eXBlb2YgY29udHJvbC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuZGVzdHJveSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGwgbGlmZWN5Y2xlIGRlc3Ryb3kgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmIChjb21wb25lbnQubGlmZWN5Y2xlPy5kZXN0cm95KSB7XG4gICAgICAgICAgY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgZm9ybSBlbGVtZW50IGZyb20gRE9NXG4gICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudD8ucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBkZXN0cm95IGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuUkVTRVQpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gV2lyZSB1cCBjb250cm9sIGJ1dHRvbiBjbGljayBoYW5kbGVyc1xuICAgIHdpcmVDb250cm9sQnV0dG9ucyhjb21wb25lbnQuY29udHJvbHMsIGFwaSwgY29uZmlnKTtcblxuICAgIHJldHVybiBhcGk7XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoQVBJO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9jb2xvcnBpY2tlci50c1xuXG5pbXBvcnQgeyBwaXBlIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IGNyZWF0ZUJhc2UsIHdpdGhFbGVtZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IHdpdGhFdmVudHMsIHdpdGhEaXNhYmxlZCwgd2l0aExpZmVjeWNsZSB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgeyB3aXRoQXJlYSB9IGZyb20gXCIuL2ZlYXR1cmVzL2FyZWFcIjtcbmltcG9ydCB7IHdpdGhIdWUgfSBmcm9tIFwiLi9mZWF0dXJlcy9odWVcIjtcbmltcG9ydCB7IHdpdGhTd2F0Y2hlcyB9IGZyb20gXCIuL2ZlYXR1cmVzL3N3YXRjaGVzXCI7XG5pbXBvcnQgeyB3aXRoSW5wdXQgfSBmcm9tIFwiLi9mZWF0dXJlcy9pbnB1dFwiO1xuaW1wb3J0IHsgd2l0aFZhcmlhbnQgfSBmcm9tIFwiLi9mZWF0dXJlcy92YXJpYW50XCI7XG5pbXBvcnQgeyB3aXRoUGlwZXR0ZSwgaXNFeWVEcm9wcGVyU3VwcG9ydGVkIH0gZnJvbSBcIi4vZmVhdHVyZXMvcGlwZXR0ZVwiO1xuaW1wb3J0IHsgd2l0aE9wYWNpdHkgfSBmcm9tIFwiLi9mZWF0dXJlcy9vcGFjaXR5XCI7XG5pbXBvcnQgeyB3aXRoQVBJIH0gZnJvbSBcIi4vYXBpXCI7XG5pbXBvcnQgeyBDb2xvclBpY2tlckNvbmZpZywgQ29sb3JQaWNrZXJDb21wb25lbnQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlQmFzZUNvbmZpZywgZ2V0RWxlbWVudENvbmZpZywgZ2V0QXBpQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgeyBDT0xPUlBJQ0tFUl9WQVJJQU5UUywgQ09MT1JQSUNLRVJfREVOU0lUSUVTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBDb2xvclBpY2tlciBjb21wb25lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQSBjb2xvciBwaWNrZXIgd2l0aCBvcHRpb25hbCBzYXR1cmF0aW9uL2JyaWdodG5lc3MgYXJlYSwgaHVlIHNsaWRlcixcbiAqIGhleCBpbnB1dCwgYW5kIGNvbG9yIHN3YXRjaGVzLiBTdXBwb3J0cyBpbmxpbmUsIGRyb3Bkb3duLCBhbmQgZGlhbG9nIHZhcmlhbnRzLlxuICpcbiAqIFRoZSBDb2xvclBpY2tlciBjb21wb25lbnQgaXMgY3JlYXRlZCB1c2luZyBhIGZ1bmN0aW9uYWwgY29tcG9zaXRpb24gcGF0dGVybixcbiAqIGFwcGx5aW5nIHZhcmlvdXMgZmVhdHVyZXMgdGhyb3VnaCB0aGUgcGlwZSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0NvbG9yUGlja2VyQ29uZmlnfSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBjb2xvciBwaWNrZXJcbiAqIEByZXR1cm5zIHtDb2xvclBpY2tlckNvbXBvbmVudH0gQSBmdWxseSBjb25maWd1cmVkIGNvbG9yIHBpY2tlciBjb21wb25lbnQgaW5zdGFuY2VcbiAqIEB0aHJvd3Mge0Vycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgY29sb3IgcGlja2VyIGNyZWF0aW9uIGZhaWxzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBJbmxpbmUgdmFyaWFudCAoZGVmYXVsdCkgLSBhbHdheXMgdmlzaWJsZVxuICogY29uc3QgcGlja2VyID0gY3JlYXRlQ29sb3JQaWNrZXIoe1xuICogICB2YWx1ZTogJyNmZjU3MjInLFxuICogICBzd2F0Y2hlczogWycjZjQ0MzM2JywgJyNlOTFlNjMnLCAnIzljMjdiMCddLFxuICogICBvbkNoYW5nZTogKGNvbG9yKSA9PiBjb25zb2xlLmxvZygnQ29sb3I6JywgY29sb3IpXG4gKiB9KTtcbiAqIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocGlja2VyLmVsZW1lbnQpO1xuICpcbiAqIC8vIERyb3Bkb3duIHZhcmlhbnQgd2l0aCB0cmlnZ2VyIGVsZW1lbnRcbiAqIGNvbnN0IGRyb3Bkb3duID0gY3JlYXRlQ29sb3JQaWNrZXIoe1xuICogICB2YXJpYW50OiAnZHJvcGRvd24nLFxuICogICB0cmlnZ2VyOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sb3ItYnV0dG9uJyksXG4gKiAgIHZhbHVlOiAnI2ZmNTcyMicsXG4gKiAgIG9uQ2hhbmdlOiAoY29sb3IpID0+IGNvbnNvbGUubG9nKCdDb2xvcjonLCBjb2xvcilcbiAqIH0pO1xuICpcbiAqIC8vIE1pbmltYWwgcGlja2VyIHdpdGggb25seSBzd2F0Y2hlc1xuICogY29uc3Qgc3dhdGNoUGlja2VyID0gY3JlYXRlQ29sb3JQaWNrZXIoe1xuICogICB2YXJpYW50OiAnZHJvcGRvd24nLFxuICogICB0cmlnZ2VyOiBteUJ1dHRvbixcbiAqICAgc2hvd0FyZWE6IGZhbHNlLFxuICogICBzaG93SHVlOiBmYWxzZSxcbiAqICAgc2hvd0lucHV0OiBmYWxzZSxcbiAqICAgc3dhdGNoZXM6IFsnI2ZmMDAwMCcsICcjMDBmZjAwJywgJyMwMDAwZmYnXVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAY2F0ZWdvcnkgQ29tcG9uZW50c1xuICovXG5jb25zdCBjcmVhdGVDb2xvclBpY2tlciA9IChcbiAgY29uZmlnOiBDb2xvclBpY2tlckNvbmZpZyA9IHt9LFxuKTogQ29sb3JQaWNrZXJDb21wb25lbnQgPT4ge1xuICBjb25zdCBiYXNlQ29uZmlnID0gY3JlYXRlQmFzZUNvbmZpZyhjb25maWcpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgbmVlZHNWYXJpYW50QmVoYXZpb3IgPVxuICAgICAgYmFzZUNvbmZpZy52YXJpYW50ID09PSBDT0xPUlBJQ0tFUl9WQVJJQU5UUy5EUk9QRE9XTiB8fFxuICAgICAgYmFzZUNvbmZpZy52YXJpYW50ID09PSBDT0xPUlBJQ0tFUl9WQVJJQU5UUy5ESUFMT0c7XG5cbiAgICBjb25zdCBjb2xvclBpY2tlciA9IHBpcGUoXG4gICAgICBjcmVhdGVCYXNlLFxuICAgICAgd2l0aEV2ZW50cygpLFxuICAgICAgd2l0aEVsZW1lbnQoZ2V0RWxlbWVudENvbmZpZyhiYXNlQ29uZmlnKSksXG4gICAgICB3aXRoRGlzYWJsZWQoYmFzZUNvbmZpZyksXG4gICAgICAvLyBBcHBseSB2YXJpYW50IGZlYXR1cmUgZm9yIGRyb3Bkb3duL2RpYWxvZyAocmVzdHJ1Y3R1cmVzIERPTSlcbiAgICAgIG5lZWRzVmFyaWFudEJlaGF2aW9yID8gd2l0aFZhcmlhbnQoYmFzZUNvbmZpZykgOiAoYzogYW55KSA9PiBjLFxuICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgZmVhdHVyZXMgYmFzZWQgb24gY29uZmlnXG4gICAgICBiYXNlQ29uZmlnLnNob3dBcmVhICE9PSBmYWxzZSA/IHdpdGhBcmVhKGJhc2VDb25maWcpIDogKGM6IGFueSkgPT4gYyxcbiAgICAgIGJhc2VDb25maWcuc2hvd0h1ZSAhPT0gZmFsc2UgPyB3aXRoSHVlKGJhc2VDb25maWcpIDogKGM6IGFueSkgPT4gYyxcbiAgICAgIGJhc2VDb25maWcuc2hvd09wYWNpdHkgPT09IHRydWUgPyB3aXRoT3BhY2l0eShiYXNlQ29uZmlnKSA6IChjOiBhbnkpID0+IGMsXG4gICAgICBiYXNlQ29uZmlnLnNob3dJbnB1dCAhPT0gZmFsc2UgfHwgYmFzZUNvbmZpZy5zaG93UHJldmlldyAhPT0gZmFsc2VcbiAgICAgICAgPyB3aXRoSW5wdXQoYmFzZUNvbmZpZylcbiAgICAgICAgOiAoYzogYW55KSA9PiBjLFxuICAgICAgYmFzZUNvbmZpZy5zaG93U3dhdGNoZXMgIT09IGZhbHNlXG4gICAgICAgID8gd2l0aFN3YXRjaGVzKGJhc2VDb25maWcpXG4gICAgICAgIDogKGM6IGFueSkgPT4gYyxcbiAgICAgIC8vIEFkZCBwaXBldHRlIGlmIGVuYWJsZWQgb3IgaW1hZ2Ugc291cmNlIHByb3ZpZGVkXG4gICAgICBiYXNlQ29uZmlnLnNob3dQaXBldHRlICE9PSBmYWxzZSAmJlxuICAgICAgICAoaXNFeWVEcm9wcGVyU3VwcG9ydGVkKCkgfHwgYmFzZUNvbmZpZy5pbWFnZVNvdXJjZSlcbiAgICAgICAgPyB3aXRoUGlwZXR0ZShiYXNlQ29uZmlnKVxuICAgICAgICA6IChjOiBhbnkpID0+IGMsXG4gICAgICB3aXRoTGlmZWN5Y2xlKCksXG4gICAgICAoY29tcDogYW55KSA9PiB3aXRoQVBJKGdldEFwaUNvbmZpZyhjb21wKSkoY29tcCksXG4gICAgKShiYXNlQ29uZmlnKTtcblxuICAgIHJldHVybiBjb2xvclBpY2tlcjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiQ29sb3JQaWNrZXIgY3JlYXRpb24gZXJyb3I6XCIsIGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBDb2xvclBpY2tlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCxcbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDb2xvclBpY2tlcjtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvY29sb3JwaWNrZXIvY29uc3RhbnRzLnRzXG5cbi8qKlxuICogQ29sb3IgcGlja2VyIGNvbXBvbmVudCBjb25zdGFudHNcbiAqIEBtb2R1bGUgY29tcG9uZW50cy9jb2xvcnBpY2tlclxuICovXG5cbi8qKlxuICogQ29sb3IgcGlja2VyIGV2ZW50c1xuICovXG5leHBvcnQgY29uc3QgQ09MT1JQSUNLRVJfRVZFTlRTID0ge1xuICAvKiogRmlyZWQgd2hlbiBjb2xvciB2YWx1ZSBjaGFuZ2VzIChjb21taXR0ZWQpICovXG4gIENIQU5HRTogXCJjaGFuZ2VcIixcbiAgLyoqIEZpcmVkIGR1cmluZyBjb2xvciBzZWxlY3Rpb24gKGxpdmUgcHJldmlldykgKi9cbiAgSU5QVVQ6IFwiaW5wdXRcIixcbiAgLyoqIEZpcmVkIHdoZW4gYSBzd2F0Y2ggaXMgY2xpY2tlZCAqL1xuICBTV0FUQ0hfU0VMRUNUOiBcInN3YXRjaFNlbGVjdFwiLFxuICAvKiogRmlyZWQgd2hlbiBzd2F0Y2hlcyBhcmUgdXBkYXRlZCAqL1xuICBTV0FUQ0hFU19DSEFOR0U6IFwic3dhdGNoZXNDaGFuZ2VcIixcbiAgLyoqIEZpcmVkIHdoZW4gcGlja2VyIG9wZW5zIChkcm9wZG93bi9kaWFsb2cgdmFyaWFudHMpICovXG4gIE9QRU46IFwib3BlblwiLFxuICAvKiogRmlyZWQgd2hlbiBwaWNrZXIgY2xvc2VzIChkcm9wZG93bi9kaWFsb2cgdmFyaWFudHMpICovXG4gIENMT1NFOiBcImNsb3NlXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIENvbG9yIHBpY2tlciB2YXJpYW50c1xuICovXG5leHBvcnQgY29uc3QgQ09MT1JQSUNLRVJfVkFSSUFOVFMgPSB7XG4gIC8qKiBJbmxpbmUgLSBhbHdheXMgdmlzaWJsZSwgbm8gdHJpZ2dlciAqL1xuICBJTkxJTkU6IFwiaW5saW5lXCIsXG4gIC8qKiBEcm9wZG93biAtIGF0dGFjaGVkIHRvIHRyaWdnZXIsIG9wZW5zIGJlbG93L2Fib3ZlICovXG4gIERST1BET1dOOiBcImRyb3Bkb3duXCIsXG4gIC8qKiBEaWFsb2cgLSBtb2RhbCBvdmVybGF5IGNlbnRlcmVkIG9uIHNjcmVlbiAqL1xuICBESUFMT0c6IFwiZGlhbG9nXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIENvbG9yIHBpY2tlciBkZW5zaXRpZXNcbiAqL1xuZXhwb3J0IGNvbnN0IENPTE9SUElDS0VSX0RFTlNJVElFUyA9IHtcbiAgLyoqIERlZmF1bHQgZGVuc2l0eSB3aXRoIHN0YW5kYXJkIHNwYWNpbmcgKi9cbiAgREVGQVVMVDogXCJkZWZhdWx0XCIsXG4gIC8qKiBDb21wYWN0IGRlbnNpdHkgLSBtaW5pbWFsIGxheW91dCwgaHVlIGJhciB1bmRlciBhcmVhICovXG4gIENPTVBBQ1Q6IFwiY29tcGFjdFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBDb2xvciBwaWNrZXIgc2l6ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IENPTE9SUElDS0VSX1NJWkVTID0ge1xuICAvKiogU21hbGwgLSAyMDBweCB3aWRlICovXG4gIFM6IFwic1wiLFxuICAvKiogTWVkaXVtIC0gMjgwcHggd2lkZSAoZGVmYXVsdCkgKi9cbiAgTTogXCJtXCIsXG4gIC8qKiBMYXJnZSAtIDM2MHB4IHdpZGUgKi9cbiAgTDogXCJsXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIFN3YXRjaCBzaXplcyBpbiBwaXhlbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFNXQVRDSF9TSVpFUyA9IHtcbiAgUzogMjQsXG4gIE06IDMyLFxuICBMOiA0MCxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogQ1NTIGNsYXNzZXMgdXNlZCBieSB0aGUgY29sb3IgcGlja2VyIGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3QgQ09MT1JQSUNLRVJfQ0xBU1NFUyA9IHtcbiAgUk9PVDogXCJjb2xvcnBpY2tlclwiLFxuXG4gIC8vIE1haW4gYXJlYXNcbiAgQVJFQTogXCJjb2xvcnBpY2tlcl9fYXJlYVwiLFxuICBBUkVBX0dSQURJRU5UOiBcImNvbG9ycGlja2VyX19hcmVhLWdyYWRpZW50XCIsXG4gIEFSRUFfSEFORExFOiBcImNvbG9ycGlja2VyX19hcmVhLWhhbmRsZVwiLFxuXG4gIC8vIEh1ZSBzbGlkZXJcbiAgSFVFOiBcImNvbG9ycGlja2VyX19odWVcIixcbiAgSFVFX1NMSURFUjogXCJjb2xvcnBpY2tlcl9faHVlLXNsaWRlclwiLFxuICBIVUVfSEFORExFOiBcImNvbG9ycGlja2VyX19odWUtaGFuZGxlXCIsXG5cbiAgLy8gU3dhdGNoZXNcbiAgU1dBVENIRVM6IFwiY29sb3JwaWNrZXJfX3N3YXRjaGVzXCIsXG4gIFNXQVRDSDogXCJjb2xvcnBpY2tlcl9fc3dhdGNoXCIsXG4gIFNXQVRDSF9TRUxFQ1RFRDogXCJjb2xvcnBpY2tlcl9fc3dhdGNoLS1zZWxlY3RlZFwiLFxuICBTV0FUQ0hfQUREOiBcImNvbG9ycGlja2VyX19zd2F0Y2gtLWFkZFwiLFxuXG4gIC8vIFByZXZpZXcgYW5kIHZhbHVlXG4gIFBSRVZJRVc6IFwiY29sb3JwaWNrZXJfX3ByZXZpZXdcIixcbiAgVkFMVUU6IFwiY29sb3JwaWNrZXJfX3ZhbHVlXCIsXG4gIFZBTFVFX0lOUFVUOiBcImNvbG9ycGlja2VyX192YWx1ZS1pbnB1dFwiLFxuXG4gIC8vIENvbnRhaW5lciBmb3IgZHJvcGRvd24vZGlhbG9nIHZhcmlhbnRzXG4gIENPTlRBSU5FUjogXCJjb2xvcnBpY2tlcl9fY29udGFpbmVyXCIsXG4gIEJBQ0tEUk9QOiBcImNvbG9ycGlja2VyX19iYWNrZHJvcFwiLFxuXG4gIC8vIFN0YXRlc1xuICBESVNBQkxFRDogXCJjb2xvcnBpY2tlci0tZGlzYWJsZWRcIixcbiAgRFJBR0dJTkc6IFwiY29sb3JwaWNrZXItLWRyYWdnaW5nXCIsXG4gIE9QRU46IFwiY29sb3JwaWNrZXItLW9wZW5cIixcbiAgUE9TSVRJT05fVE9QOiBcImNvbG9ycGlja2VyLS1wb3NpdGlvbi10b3BcIixcbiAgQ09NUEFDVDogXCJjb2xvcnBpY2tlci0tY29tcGFjdFwiLFxuXG4gIC8vIFZhcmlhbnRzXG4gIElOTElORTogXCJjb2xvcnBpY2tlci0taW5saW5lXCIsXG4gIERST1BET1dOOiBcImNvbG9ycGlja2VyLS1kcm9wZG93blwiLFxuICBESUFMT0c6IFwiY29sb3JwaWNrZXItLWRpYWxvZ1wiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBEZWZhdWx0IGNvbG9yIHBpY2tlciBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBDT0xPUlBJQ0tFUl9ERUZBVUxUUyA9IHtcbiAgLyoqIERlZmF1bHQgY29sb3IgdmFsdWUgKi9cbiAgVkFMVUU6IFwiI2ZmMDAwMFwiLFxuICAvKiogRGVmYXVsdCBjb21wb25lbnQgc2l6ZSAqL1xuICBTSVpFOiBDT0xPUlBJQ0tFUl9TSVpFUy5NLFxuICAvKiogRGVmYXVsdCBzd2F0Y2ggc2l6ZSAqL1xuICBTV0FUQ0hfU0laRTogU1dBVENIX1NJWkVTLk0sXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIGhleCBpbnB1dCAqL1xuICBTSE9XX0lOUFVUOiB0cnVlLFxuICAvKiogV2hldGhlciB0byBzaG93IHRoZSBwcmV2aWV3IHNxdWFyZSAqL1xuICBTSE9XX1BSRVZJRVc6IHRydWUsXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgc3dhdGNoZXMgKi9cbiAgU0hPV19TV0FUQ0hFUzogdHJ1ZSxcbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIHN3YXRjaGVzICovXG4gIE1BWF9TV0FUQ0hFUzogOCxcbiAgLyoqIERlZmF1bHQgdmFyaWFudCAqL1xuICBWQVJJQU5UOiBDT0xPUlBJQ0tFUl9WQVJJQU5UUy5JTkxJTkUsXG4gIC8qKiBDbG9zZSBvbiBzd2F0Y2ggc2VsZWN0IChkcm9wZG93bi9kaWFsb2cpICovXG4gIENMT1NFX09OX1NFTEVDVDogdHJ1ZSxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogU2l6ZSBkaW1lbnNpb25zIGluIHBpeGVsc1xuICovXG5leHBvcnQgY29uc3QgU0laRV9ESU1FTlNJT05TID0ge1xuICBbQ09MT1JQSUNLRVJfU0laRVMuU106IHtcbiAgICB3aWR0aDogMjAwLFxuICAgIGFyZWFIZWlnaHQ6IDEyMCxcbiAgICBodWVIZWlnaHQ6IDE2LFxuICB9LFxuICBbQ09MT1JQSUNLRVJfU0laRVMuTV06IHtcbiAgICB3aWR0aDogMjgwLFxuICAgIGFyZWFIZWlnaHQ6IDE2MCxcbiAgICBodWVIZWlnaHQ6IDIwLFxuICB9LFxuICBbQ09MT1JQSUNLRVJfU0laRVMuTF06IHtcbiAgICB3aWR0aDogMzYwLFxuICAgIGFyZWFIZWlnaHQ6IDIwMCxcbiAgICBodWVIZWlnaHQ6IDI0LFxuICB9LFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBWaWJyYW50IHBhbGV0dGUgc3dhdGNoIGtleXMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZVxuICovXG5leHBvcnQgY29uc3QgUEFMRVRURV9TV0FUQ0hfT1JERVIgPSBbXG4gIFwiVmlicmFudFwiLFxuICBcIk11dGVkXCIsXG4gIFwiRGFya1ZpYnJhbnRcIixcbiAgXCJEYXJrTXV0ZWRcIixcbiAgXCJMaWdodFZpYnJhbnRcIixcbiAgXCJMaWdodE11dGVkXCIsXG5dIGFzIGNvbnN0O1xuXG4vLyBUeXBlIGV4cG9ydHNcbmV4cG9ydCB0eXBlIENvbG9yUGlja2VyRXZlbnQgPVxuICAodHlwZW9mIENPTE9SUElDS0VSX0VWRU5UUylba2V5b2YgdHlwZW9mIENPTE9SUElDS0VSX0VWRU5UU107XG5leHBvcnQgdHlwZSBDb2xvclBpY2tlclNpemUgPVxuICAodHlwZW9mIENPTE9SUElDS0VSX1NJWkVTKVtrZXlvZiB0eXBlb2YgQ09MT1JQSUNLRVJfU0laRVNdO1xuZXhwb3J0IHR5cGUgQ29sb3JQaWNrZXJWYXJpYW50ID1cbiAgKHR5cGVvZiBDT0xPUlBJQ0tFUl9WQVJJQU5UUylba2V5b2YgdHlwZW9mIENPTE9SUElDS0VSX1ZBUklBTlRTXTtcbmV4cG9ydCB0eXBlIFN3YXRjaFNpemUgPSAodHlwZW9mIFNXQVRDSF9TSVpFUylba2V5b2YgdHlwZW9mIFNXQVRDSF9TSVpFU107XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2NvbG9ycGlja2VyL3V0aWxzLnRzXG5cbmltcG9ydCB7IEhTVkNvbG9yLCBSR0JDb2xvciB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQ29udmVydHMgSFNWIHRvIFJHQlxuICogQHBhcmFtIGggLSBIdWUgKDAtMzYwKVxuICogQHBhcmFtIHMgLSBTYXR1cmF0aW9uICgwLTEwMClcbiAqIEBwYXJhbSB2IC0gVmFsdWUgKDAtMTAwKVxuICogQHJldHVybnMgUkdCIGNvbG9yIG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgaHN2VG9SZ2IgPSAoaDogbnVtYmVyLCBzOiBudW1iZXIsIHY6IG51bWJlcik6IFJHQkNvbG9yID0+IHtcbiAgY29uc3Qgc05vcm0gPSBzIC8gMTAwO1xuICBjb25zdCB2Tm9ybSA9IHYgLyAxMDA7XG5cbiAgY29uc3QgYyA9IHZOb3JtICogc05vcm07XG4gIGNvbnN0IHggPSBjICogKDEgLSBNYXRoLmFicygoKGggLyA2MCkgJSAyKSAtIDEpKTtcbiAgY29uc3QgbSA9IHZOb3JtIC0gYztcblxuICBsZXQgclByaW1lID0gMDtcbiAgbGV0IGdQcmltZSA9IDA7XG4gIGxldCBiUHJpbWUgPSAwO1xuXG4gIGlmIChoID49IDAgJiYgaCA8IDYwKSB7XG4gICAgclByaW1lID0gYztcbiAgICBnUHJpbWUgPSB4O1xuICAgIGJQcmltZSA9IDA7XG4gIH0gZWxzZSBpZiAoaCA+PSA2MCAmJiBoIDwgMTIwKSB7XG4gICAgclByaW1lID0geDtcbiAgICBnUHJpbWUgPSBjO1xuICAgIGJQcmltZSA9IDA7XG4gIH0gZWxzZSBpZiAoaCA+PSAxMjAgJiYgaCA8IDE4MCkge1xuICAgIHJQcmltZSA9IDA7XG4gICAgZ1ByaW1lID0gYztcbiAgICBiUHJpbWUgPSB4O1xuICB9IGVsc2UgaWYgKGggPj0gMTgwICYmIGggPCAyNDApIHtcbiAgICByUHJpbWUgPSAwO1xuICAgIGdQcmltZSA9IHg7XG4gICAgYlByaW1lID0gYztcbiAgfSBlbHNlIGlmIChoID49IDI0MCAmJiBoIDwgMzAwKSB7XG4gICAgclByaW1lID0geDtcbiAgICBnUHJpbWUgPSAwO1xuICAgIGJQcmltZSA9IGM7XG4gIH0gZWxzZSB7XG4gICAgclByaW1lID0gYztcbiAgICBnUHJpbWUgPSAwO1xuICAgIGJQcmltZSA9IHg7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHI6IE1hdGgucm91bmQoKHJQcmltZSArIG0pICogMjU1KSxcbiAgICBnOiBNYXRoLnJvdW5kKChnUHJpbWUgKyBtKSAqIDI1NSksXG4gICAgYjogTWF0aC5yb3VuZCgoYlByaW1lICsgbSkgKiAyNTUpLFxuICB9O1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBSR0IgdG8gSFNWXG4gKiBAcGFyYW0gciAtIFJlZCAoMC0yNTUpXG4gKiBAcGFyYW0gZyAtIEdyZWVuICgwLTI1NSlcbiAqIEBwYXJhbSBiIC0gQmx1ZSAoMC0yNTUpXG4gKiBAcmV0dXJucyBIU1YgY29sb3Igb2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCByZ2JUb0hzdiA9IChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogSFNWQ29sb3IgPT4ge1xuICBjb25zdCByTm9ybSA9IHIgLyAyNTU7XG4gIGNvbnN0IGdOb3JtID0gZyAvIDI1NTtcbiAgY29uc3QgYk5vcm0gPSBiIC8gMjU1O1xuXG4gIGNvbnN0IG1heCA9IE1hdGgubWF4KHJOb3JtLCBnTm9ybSwgYk5vcm0pO1xuICBjb25zdCBtaW4gPSBNYXRoLm1pbihyTm9ybSwgZ05vcm0sIGJOb3JtKTtcbiAgY29uc3QgZGVsdGEgPSBtYXggLSBtaW47XG5cbiAgbGV0IGggPSAwO1xuICBsZXQgcyA9IDA7XG4gIGNvbnN0IHYgPSBtYXggKiAxMDA7XG5cbiAgaWYgKGRlbHRhICE9PSAwKSB7XG4gICAgcyA9IChkZWx0YSAvIG1heCkgKiAxMDA7XG5cbiAgICBpZiAobWF4ID09PSByTm9ybSkge1xuICAgICAgaCA9IDYwICogKCgoZ05vcm0gLSBiTm9ybSkgLyBkZWx0YSkgJSA2KTtcbiAgICB9IGVsc2UgaWYgKG1heCA9PT0gZ05vcm0pIHtcbiAgICAgIGggPSA2MCAqICgoYk5vcm0gLSByTm9ybSkgLyBkZWx0YSArIDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoID0gNjAgKiAoKHJOb3JtIC0gZ05vcm0pIC8gZGVsdGEgKyA0KTtcbiAgICB9XG4gIH1cblxuICBpZiAoaCA8IDApIHtcbiAgICBoICs9IDM2MDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaDogTWF0aC5yb3VuZChoKSxcbiAgICBzOiBNYXRoLnJvdW5kKHMpLFxuICAgIHY6IE1hdGgucm91bmQodiksXG4gIH07XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIFJHQiB0byBoZXggc3RyaW5nXG4gKiBAcGFyYW0gciAtIFJlZCAoMC0yNTUpXG4gKiBAcGFyYW0gZyAtIEdyZWVuICgwLTI1NSlcbiAqIEBwYXJhbSBiIC0gQmx1ZSAoMC0yNTUpXG4gKiBAcmV0dXJucyBIZXggY29sb3Igc3RyaW5nIChlLmcuLCAnI2ZmMDAwMCcpXG4gKi9cbmV4cG9ydCBjb25zdCByZ2JUb0hleCA9IChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdG9IZXggPSAobjogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBoZXggPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQobikpKS50b1N0cmluZygxNik7XG4gICAgcmV0dXJuIGhleC5sZW5ndGggPT09IDEgPyBcIjBcIiArIGhleCA6IGhleDtcbiAgfTtcbiAgcmV0dXJuIGAjJHt0b0hleChyKX0ke3RvSGV4KGcpfSR7dG9IZXgoYil9YDtcbn07XG5cbi8qKlxuICogQ29udmVydHMgaGV4IHN0cmluZyB0byBSR0JcbiAqIEBwYXJhbSBoZXggLSBIZXggY29sb3Igc3RyaW5nIChlLmcuLCAnI2ZmMDAwMCcgb3IgJ2ZmMDAwMCcpXG4gKiBAcmV0dXJucyBSR0IgY29sb3Igb2JqZWN0IG9yIG51bGwgaWYgaW52YWxpZFxuICovXG5leHBvcnQgY29uc3QgaGV4VG9SZ2IgPSAoaGV4OiBzdHJpbmcpOiBSR0JDb2xvciB8IG51bGwgPT4ge1xuICAvLyBSZW1vdmUgIyBpZiBwcmVzZW50XG4gIGNvbnN0IGNsZWFuSGV4ID0gaGV4LnJlcGxhY2UoL14jLywgXCJcIik7XG5cbiAgLy8gSGFuZGxlIDMtY2hhcmFjdGVyIGhleFxuICBsZXQgZnVsbEhleCA9IGNsZWFuSGV4O1xuICBpZiAoY2xlYW5IZXgubGVuZ3RoID09PSAzKSB7XG4gICAgZnVsbEhleCA9IGNsZWFuSGV4XG4gICAgICAuc3BsaXQoXCJcIilcbiAgICAgIC5tYXAoKGMpID0+IGMgKyBjKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBoZXggc3RyaW5nXG4gIGlmICghL15bMC05QS1GYS1mXXs2fSQvLnRlc3QoZnVsbEhleCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG51bSA9IHBhcnNlSW50KGZ1bGxIZXgsIDE2KTtcbiAgcmV0dXJuIHtcbiAgICByOiAobnVtID4+IDE2KSAmIDI1NSxcbiAgICBnOiAobnVtID4+IDgpICYgMjU1LFxuICAgIGI6IG51bSAmIDI1NSxcbiAgfTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgSFNWIHRvIGhleCBzdHJpbmdcbiAqIEBwYXJhbSBoIC0gSHVlICgwLTM2MClcbiAqIEBwYXJhbSBzIC0gU2F0dXJhdGlvbiAoMC0xMDApXG4gKiBAcGFyYW0gdiAtIFZhbHVlICgwLTEwMClcbiAqIEByZXR1cm5zIEhleCBjb2xvciBzdHJpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IGhzdlRvSGV4ID0gKGg6IG51bWJlciwgczogbnVtYmVyLCB2OiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCByZ2IgPSBoc3ZUb1JnYihoLCBzLCB2KTtcbiAgcmV0dXJuIHJnYlRvSGV4KHJnYi5yLCByZ2IuZywgcmdiLmIpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBoZXggc3RyaW5nIHRvIEhTVlxuICogQHBhcmFtIGhleCAtIEhleCBjb2xvciBzdHJpbmdcbiAqIEByZXR1cm5zIEhTViBjb2xvciBvYmplY3Qgb3IgbnVsbCBpZiBpbnZhbGlkXG4gKi9cbmV4cG9ydCBjb25zdCBoZXhUb0hzdiA9IChoZXg6IHN0cmluZyk6IEhTVkNvbG9yIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHJnYiA9IGhleFRvUmdiKGhleCk7XG4gIGlmICghcmdiKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHJnYlRvSHN2KHJnYi5yLCByZ2IuZywgcmdiLmIpO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBoZXggY29sb3Igc3RyaW5nXG4gKiBAcGFyYW0gaGV4IC0gU3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHZhbGlkIGhleCBjb2xvclxuICovXG5leHBvcnQgY29uc3QgaXNWYWxpZEhleCA9IChoZXg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gL14jPyhbMC05QS1GYS1mXXszfXxbMC05QS1GYS1mXXs2fSkkLy50ZXN0KGhleCk7XG59O1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBoZXggY29sb3IgdG8gNi1jaGFyYWN0ZXIgZm9ybWF0IHdpdGggI1xuICogQHBhcmFtIGhleCAtIEhleCBjb2xvciBzdHJpbmdcbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgaGV4IHN0cmluZyBvciBvcmlnaW5hbCBpZiBpbnZhbGlkXG4gKi9cbmV4cG9ydCBjb25zdCBub3JtYWxpemVIZXggPSAoaGV4OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIWlzVmFsaWRIZXgoaGV4KSkgcmV0dXJuIGhleDtcblxuICBsZXQgY2xlYW5IZXggPSBoZXgucmVwbGFjZSgvXiMvLCBcIlwiKTtcblxuICAvLyBFeHBhbmQgMy1jaGFyYWN0ZXIgaGV4XG4gIGlmIChjbGVhbkhleC5sZW5ndGggPT09IDMpIHtcbiAgICBjbGVhbkhleCA9IGNsZWFuSGV4XG4gICAgICAuc3BsaXQoXCJcIilcbiAgICAgIC5tYXAoKGMpID0+IGMgKyBjKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICByZXR1cm4gYCMke2NsZWFuSGV4LnRvTG93ZXJDYXNlKCl9YDtcbn07XG5cbi8qKlxuICogQ2xhbXBzIGEgbnVtYmVyIGJldHdlZW4gbWluIGFuZCBtYXhcbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIGNsYW1wXG4gKiBAcGFyYW0gbWluIC0gTWluaW11bSB2YWx1ZVxuICogQHBhcmFtIG1heCAtIE1heGltdW0gdmFsdWVcbiAqIEByZXR1cm5zIENsYW1wZWQgdmFsdWVcbiAqL1xuZXhwb3J0IGNvbnN0IGNsYW1wID0gKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciA9PiB7XG4gIHJldHVybiBNYXRoLm1pbihNYXRoLm1heCh2YWx1ZSwgbWluKSwgbWF4KTtcbn07XG5cbi8qKlxuICogR2V0cyBjb250cmFzdGluZyB0ZXh0IGNvbG9yIChibGFjayBvciB3aGl0ZSkgZm9yIGEgYmFja2dyb3VuZFxuICogQHBhcmFtIGhleCAtIEJhY2tncm91bmQgaGV4IGNvbG9yXG4gKiBAcmV0dXJucyAnIzAwMDAwMCcgb3IgJyNmZmZmZmYnXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb250cmFzdENvbG9yID0gKGhleDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcmdiID0gaGV4VG9SZ2IoaGV4KTtcbiAgaWYgKCFyZ2IpIHJldHVybiBcIiMwMDAwMDBcIjtcblxuICAvLyBDYWxjdWxhdGUgcmVsYXRpdmUgbHVtaW5hbmNlXG4gIGNvbnN0IGx1bWluYW5jZSA9ICgwLjI5OSAqIHJnYi5yICsgMC41ODcgKiByZ2IuZyArIDAuMTE0ICogcmdiLmIpIC8gMjU1O1xuXG4gIHJldHVybiBsdW1pbmFuY2UgPiAwLjUgPyBcIiMwMDAwMDBcIiA6IFwiI2ZmZmZmZlwiO1xufTtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvY29sb3JwaWNrZXIvY29uZmlnLnRzXG5cbmltcG9ydCB7XG4gIENPTE9SUElDS0VSX0RFRkFVTFRTLFxuICBDT0xPUlBJQ0tFUl9TSVpFUyxcbiAgQ09MT1JQSUNLRVJfVkFSSUFOVFMsXG4gIENPTE9SUElDS0VSX0NMQVNTRVMsXG4gIENPTE9SUElDS0VSX0RFTlNJVElFUyxcbiAgU0laRV9ESU1FTlNJT05TLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbG9yUGlja2VyQ29uZmlnLCBDb2xvclBpY2tlclN0YXRlLCBIU1ZDb2xvciB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBoZXhUb0hzdiwgbm9ybWFsaXplSGV4IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBDb2xvclBpY2tlciBjb21wb25lbnQuXG4gKiBUaGVzZSB2YWx1ZXMgd2lsbCBiZSB1c2VkIHdoZW4gbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLlxuICpcbiAqIEBjYXRlZ29yeSBDb21wb25lbnRzXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29uZmlnOiBDb2xvclBpY2tlckNvbmZpZyA9IHtcbiAgdmFsdWU6IENPTE9SUElDS0VSX0RFRkFVTFRTLlZBTFVFLFxuICB2YXJpYW50OiBDT0xPUlBJQ0tFUl9WQVJJQU5UUy5JTkxJTkUsXG4gIHNpemU6IENPTE9SUElDS0VSX1NJWkVTLk0sXG4gIGRlbnNpdHk6IENPTE9SUElDS0VSX0RFTlNJVElFUy5ERUZBVUxULFxuICBzd2F0Y2hTaXplOiBDT0xPUlBJQ0tFUl9ERUZBVUxUUy5TV0FUQ0hfU0laRSxcbiAgc2hvd0lucHV0OiBDT0xPUlBJQ0tFUl9ERUZBVUxUUy5TSE9XX0lOUFVULFxuICBzaG93UHJldmlldzogQ09MT1JQSUNLRVJfREVGQVVMVFMuU0hPV19QUkVWSUVXLFxuICBzaG93U3dhdGNoZXM6IENPTE9SUElDS0VSX0RFRkFVTFRTLlNIT1dfU1dBVENIRVMsXG4gIHNob3dIdWU6IHRydWUsXG4gIHNob3dBcmVhOiB0cnVlLFxuICBtYXhTd2F0Y2hlczogQ09MT1JQSUNLRVJfREVGQVVMVFMuTUFYX1NXQVRDSEVTLFxuICBjbG9zZU9uU2VsZWN0OiBDT0xPUlBJQ0tFUl9ERUZBVUxUUy5DTE9TRV9PTl9TRUxFQ1QsXG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgcHJlZml4OiBcIm10cmxcIixcbiAgY29tcG9uZW50TmFtZTogXCJjb2xvcnBpY2tlclwiLFxufTtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBiYXNlIGNvbmZpZ3VyYXRpb24gZm9yIENvbG9yUGlja2VyIGNvbXBvbmVudCBieSBtZXJnaW5nXG4gKiB1c2VyLXByb3ZpZGVkIGNvbmZpZyB3aXRoIGRlZmF1bHQgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBVc2VyIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIENvbXBsZXRlIGNvbmZpZ3VyYXRpb24gd2l0aCBkZWZhdWx0cyBhcHBsaWVkXG4gKiBAY2F0ZWdvcnkgQ29tcG9uZW50c1xuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVCYXNlQ29uZmlnID0gKFxuICBjb25maWc6IENvbG9yUGlja2VyQ29uZmlnID0ge30sXG4pOiBSZXF1aXJlZDxcbiAgUGljazxcbiAgICBDb2xvclBpY2tlckNvbmZpZyxcbiAgICB8IFwidmFsdWVcIlxuICAgIHwgXCJ2YXJpYW50XCJcbiAgICB8IFwic2l6ZVwiXG4gICAgfCBcImRlbnNpdHlcIlxuICAgIHwgXCJzd2F0Y2hTaXplXCJcbiAgICB8IFwic2hvd0lucHV0XCJcbiAgICB8IFwic2hvd1ByZXZpZXdcIlxuICAgIHwgXCJzaG93U3dhdGNoZXNcIlxuICAgIHwgXCJzaG93SHVlXCJcbiAgICB8IFwic2hvd0FyZWFcIlxuICAgIHwgXCJtYXhTd2F0Y2hlc1wiXG4gICAgfCBcImNsb3NlT25TZWxlY3RcIlxuICAgIHwgXCJkaXNhYmxlZFwiXG4gICAgfCBcInByZWZpeFwiXG4gICAgfCBcImNvbXBvbmVudE5hbWVcIlxuICA+XG4+ICZcbiAgQ29sb3JQaWNrZXJDb25maWcgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLmRlZmF1bHRDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICAgIHZhbHVlOiBjb25maWcudmFsdWUgfHwgZGVmYXVsdENvbmZpZy52YWx1ZSEsXG4gICAgdmFyaWFudDogY29uZmlnLnZhcmlhbnQgfHwgZGVmYXVsdENvbmZpZy52YXJpYW50ISxcbiAgICBzaXplOiBjb25maWcuc2l6ZSB8fCBkZWZhdWx0Q29uZmlnLnNpemUhLFxuICAgIGRlbnNpdHk6IGNvbmZpZy5kZW5zaXR5IHx8IGRlZmF1bHRDb25maWcuZGVuc2l0eSEsXG4gICAgc3dhdGNoU2l6ZTogY29uZmlnLnN3YXRjaFNpemUgPz8gZGVmYXVsdENvbmZpZy5zd2F0Y2hTaXplISxcbiAgICBzaG93SW5wdXQ6IGNvbmZpZy5zaG93SW5wdXQgPz8gZGVmYXVsdENvbmZpZy5zaG93SW5wdXQhLFxuICAgIHNob3dQcmV2aWV3OiBjb25maWcuc2hvd1ByZXZpZXcgPz8gZGVmYXVsdENvbmZpZy5zaG93UHJldmlldyEsXG4gICAgc2hvd1N3YXRjaGVzOiBjb25maWcuc2hvd1N3YXRjaGVzID8/IGRlZmF1bHRDb25maWcuc2hvd1N3YXRjaGVzISxcbiAgICBzaG93SHVlOiBjb25maWcuc2hvd0h1ZSA/PyB0cnVlLFxuICAgIHNob3dBcmVhOiBjb25maWcuc2hvd0FyZWEgPz8gdHJ1ZSxcbiAgICBtYXhTd2F0Y2hlczogY29uZmlnLm1heFN3YXRjaGVzIHx8IGRlZmF1bHRDb25maWcubWF4U3dhdGNoZXMhLFxuICAgIGNsb3NlT25TZWxlY3Q6IGNvbmZpZy5jbG9zZU9uU2VsZWN0ID8/IGRlZmF1bHRDb25maWcuY2xvc2VPblNlbGVjdCEsXG4gICAgZGlzYWJsZWQ6IGNvbmZpZy5kaXNhYmxlZCB8fCBmYWxzZSxcbiAgICBwcmVmaXg6IGNvbmZpZy5wcmVmaXggfHwgZGVmYXVsdENvbmZpZy5wcmVmaXghLFxuICAgIGNvbXBvbmVudE5hbWU6IGRlZmF1bHRDb25maWcuY29tcG9uZW50TmFtZSEsXG4gIH07XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGVsZW1lbnQgY29uZmlndXJhdGlvbiBmb3Igd2l0aEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbG9yIHBpY2tlciBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBFbGVtZW50IGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAY2F0ZWdvcnkgQ29tcG9uZW50c1xuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50Q29uZmlnID0gKGNvbmZpZzogQ29sb3JQaWNrZXJDb25maWcpID0+IHtcbiAgY29uc3QgZGltZW5zaW9ucyA9IGdldFNpemVEaW1lbnNpb25zKGNvbmZpZy5zaXplIHx8IFwibVwiKTtcbiAgY29uc3QgdmFyaWFudCA9IGNvbmZpZy52YXJpYW50IHx8IENPTE9SUElDS0VSX1ZBUklBTlRTLklOTElORTtcbiAgY29uc3QgZGVuc2l0eSA9IGNvbmZpZy5kZW5zaXR5IHx8IENPTE9SUElDS0VSX0RFTlNJVElFUy5ERUZBVUxUO1xuXG4gIC8vIEJ1aWxkIHZhcmlhbnQgY2xhc3NcbiAgbGV0IHZhcmlhbnRDbGFzczogc3RyaW5nO1xuICBpZiAodmFyaWFudCA9PT0gQ09MT1JQSUNLRVJfVkFSSUFOVFMuRFJPUERPV04pIHtcbiAgICB2YXJpYW50Q2xhc3MgPSBgJHtjb25maWcucHJlZml4fS0ke0NPTE9SUElDS0VSX0NMQVNTRVMuRFJPUERPV059YDtcbiAgfSBlbHNlIGlmICh2YXJpYW50ID09PSBDT0xPUlBJQ0tFUl9WQVJJQU5UUy5ESUFMT0cpIHtcbiAgICB2YXJpYW50Q2xhc3MgPSBgJHtjb25maWcucHJlZml4fS0ke0NPTE9SUElDS0VSX0NMQVNTRVMuRElBTE9HfWA7XG4gIH0gZWxzZSB7XG4gICAgdmFyaWFudENsYXNzID0gYCR7Y29uZmlnLnByZWZpeH0tJHtDT0xPUlBJQ0tFUl9DTEFTU0VTLklOTElORX1gO1xuICB9XG5cbiAgLy8gQnVpbGQgZGVuc2l0eSBjbGFzc1xuICBjb25zdCBkZW5zaXR5Q2xhc3MgPVxuICAgIGRlbnNpdHkgPT09IENPTE9SUElDS0VSX0RFTlNJVElFUy5DT01QQUNUXG4gICAgICA/IGAke2NvbmZpZy5wcmVmaXh9LSR7Q09MT1JQSUNLRVJfQ0xBU1NFUy5DT01QQUNUfWBcbiAgICAgIDogbnVsbDtcblxuICByZXR1cm4ge1xuICAgIHRhZzogXCJkaXZcIixcbiAgICBjb21wb25lbnROYW1lOiBjb25maWcuY29tcG9uZW50TmFtZSxcbiAgICBjbGFzc05hbWU6IFt2YXJpYW50Q2xhc3MsIGRlbnNpdHlDbGFzcywgY29uZmlnLmNsYXNzXS5maWx0ZXIoXG4gICAgICBCb29sZWFuLFxuICAgICkgYXMgc3RyaW5nW10sXG4gICAgc3R5bGU6IGB3aWR0aDogJHtkaW1lbnNpb25zLndpZHRofXB4YCxcbiAgfTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBkaW1lbnNpb25zIGJhc2VkIG9uIHRoZSBzaXplIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAcGFyYW0gc2l6ZSAtIFNpemUga2V5ICgncycsICdtJywgJ2wnKVxuICogQHJldHVybnMgRGltZW5zaW9uIG9iamVjdCB3aXRoIHdpZHRoLCBhcmVhSGVpZ2h0LCBodWVIZWlnaHRcbiAqIEBjYXRlZ29yeSBDb21wb25lbnRzXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFNpemVEaW1lbnNpb25zID0gKFxuICBzaXplOiBzdHJpbmcsXG4pOiB7IHdpZHRoOiBudW1iZXI7IGFyZWFIZWlnaHQ6IG51bWJlcjsgaHVlSGVpZ2h0OiBudW1iZXIgfSA9PiB7XG4gIHJldHVybiAoXG4gICAgU0laRV9ESU1FTlNJT05TW3NpemUgYXMga2V5b2YgdHlwZW9mIFNJWkVfRElNRU5TSU9OU10gfHxcbiAgICBTSVpFX0RJTUVOU0lPTlNbQ09MT1JQSUNLRVJfU0laRVMuTV1cbiAgKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgaW5pdGlhbCBzdGF0ZSBmb3IgdGhlIGNvbG9yIHBpY2tlclxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb2xvciBwaWNrZXIgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgSW5pdGlhbCBzdGF0ZSBvYmplY3RcbiAqIEBjYXRlZ29yeSBDb21wb25lbnRzXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUluaXRpYWxTdGF0ZSA9IChcbiAgY29uZmlnOiBDb2xvclBpY2tlckNvbmZpZyxcbik6IENvbG9yUGlja2VyU3RhdGUgPT4ge1xuICBjb25zdCBpbml0aWFsSHN2OiBIU1ZDb2xvciA9IGhleFRvSHN2KFxuICAgIGNvbmZpZy52YWx1ZSB8fCBDT0xPUlBJQ0tFUl9ERUZBVUxUUy5WQUxVRSxcbiAgKSB8fCB7XG4gICAgaDogMCxcbiAgICBzOiAxMDAsXG4gICAgdjogMTAwLFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgaHN2OiBpbml0aWFsSHN2LFxuICAgIGhleDogbm9ybWFsaXplSGV4KGNvbmZpZy52YWx1ZSB8fCBDT0xPUlBJQ0tFUl9ERUZBVUxUUy5WQUxVRSksXG4gICAgb3BhY2l0eTogY29uZmlnLm9wYWNpdHkgPz8gMSxcbiAgICBpc0RyYWdnaW5nOiBmYWxzZSxcbiAgICBkcmFnVGFyZ2V0OiBudWxsLFxuICAgIHN3YXRjaGVzOiBbXSxcbiAgICBpc09wZW46IGZhbHNlLFxuICAgIHJlZnM6IHt9LFxuICB9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBBUEkgY29uZmlndXJhdGlvbiBmb3IgdGhlIENvbG9yUGlja2VyIGNvbXBvbmVudC5cbiAqIFRoaXMgY29ubmVjdHMgdGhlIGNvcmUgY29tcG9uZW50IGZlYXR1cmVzIHRvIHRoZSBwdWJsaWMgQVBJIG1ldGhvZHMuXG4gKlxuICogQHBhcmFtIGNvbXAgLSBDb21wb25lbnQgd2l0aCBmZWF0dXJlcyBhcHBsaWVkXG4gKiBAcmV0dXJucyBBUEkgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEBjYXRlZ29yeSBDb21wb25lbnRzXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFwaUNvbmZpZyA9IChjb21wOiB7XG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICBjb25maWc6IENvbG9yUGlja2VyQ29uZmlnO1xuICBnZXRDbGFzczogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nO1xuICBlbWl0OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gIG9uOiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbiAgb2ZmOiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbiAgZGlzYWJsZWQ6IHtcbiAgICBlbmFibGU6ICgpID0+IHZvaWQ7XG4gICAgZGlzYWJsZTogKCkgPT4gdm9pZDtcbiAgICBpc0Rpc2FibGVkOiAoKSA9PiBib29sZWFuO1xuICB9O1xuICBsaWZlY3ljbGU6IHtcbiAgICBkZXN0cm95OiAoKSA9PiB2b2lkO1xuICB9O1xuICAvLyBPcHRpb25hbCBmZWF0dXJlc1xuICBzdGF0ZT86IENvbG9yUGlja2VyU3RhdGU7XG4gIGFyZWE/OiB7XG4gICAgdXBkYXRlQmFja2dyb3VuZDogKCkgPT4gdm9pZDtcbiAgICB1cGRhdGVIYW5kbGU6ICgpID0+IHZvaWQ7XG4gIH07XG4gIGh1ZT86IHtcbiAgICB1cGRhdGVIYW5kbGU6ICgpID0+IHZvaWQ7XG4gIH07XG4gIG9wYWNpdHk/OiB7XG4gICAgdXBkYXRlQmFja2dyb3VuZDogKCkgPT4gdm9pZDtcbiAgICB1cGRhdGVIYW5kbGU6ICgpID0+IHZvaWQ7XG4gIH07XG4gIHN3YXRjaGVzPzoge1xuICAgIHVwZGF0ZTogKCkgPT4gdm9pZDtcbiAgICBzZXQ6IChzd2F0Y2hlczogdW5rbm93bltdKSA9PiB2b2lkO1xuICAgIGFkZDogKGNvbG9yOiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHJlbW92ZTogKGNvbG9yOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgY2xlYXI6ICgpID0+IHZvaWQ7XG4gICAgZ2V0OiAoKSA9PiB1bmtub3duW107XG4gIH07XG4gIGlucHV0Pzoge1xuICAgIHVwZGF0ZTogKCkgPT4gdm9pZDtcbiAgfTtcbiAgdmFyaWFudD86IHtcbiAgICBvcGVuOiAoKSA9PiB2b2lkO1xuICAgIGNsb3NlOiAoKSA9PiB2b2lkO1xuICAgIHRvZ2dsZTogKCkgPT4gdm9pZDtcbiAgICBpc09wZW46ICgpID0+IGJvb2xlYW47XG4gIH07XG59KSA9PiAoe1xuICBlbGVtZW50OiBjb21wLmVsZW1lbnQsXG4gIGNvbmZpZzogY29tcC5jb25maWcsXG4gIGdldENsYXNzOiBjb21wLmdldENsYXNzLFxuICBlbWl0OiBjb21wLmVtaXQsXG4gIG9uOiBjb21wLm9uLFxuICBvZmY6IGNvbXAub2ZmLFxuICBkaXNhYmxlZDogY29tcC5kaXNhYmxlZCxcbiAgbGlmZWN5Y2xlOiBjb21wLmxpZmVjeWNsZSxcbiAgc3RhdGU6IGNvbXAuc3RhdGUsXG4gIGFyZWE6IGNvbXAuYXJlYSxcbiAgaHVlOiBjb21wLmh1ZSxcbiAgb3BhY2l0eTogY29tcC5vcGFjaXR5LFxuICBzd2F0Y2hlczogY29tcC5zd2F0Y2hlcyxcbiAgaW5wdXQ6IGNvbXAuaW5wdXQsXG4gIHZhcmlhbnQ6IGNvbXAudmFyaWFudCxcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0Q29uZmlnO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9mZWF0dXJlcy9hcmVhLnRzXG5cbmltcG9ydCB7IENPTE9SUElDS0VSX0NMQVNTRVMsIENPTE9SUElDS0VSX0VWRU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbG9yUGlja2VyQ29uZmlnLCBDb2xvclBpY2tlclN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBoc3ZUb0hleCxcbiAgY2xhbXAsXG4gIGdldENvbnRyYXN0Q29sb3IsXG4gIGhleFRvSHN2LFxuICBub3JtYWxpemVIZXgsXG59IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgZ2V0U2l6ZURpbWVuc2lvbnMsIGNyZWF0ZUluaXRpYWxTdGF0ZSB9IGZyb20gXCIuLi9jb25maWdcIjtcblxuLyoqXG4gKiBBcmVhIGZlYXR1cmUgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXJlYUZlYXR1cmUge1xuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgZ3JhZGllbnQ6IEhUTUxFbGVtZW50O1xuICBoYW5kbGU6IEhUTUxFbGVtZW50O1xuICB1cGRhdGVCYWNrZ3JvdW5kOiAoKSA9PiB2b2lkO1xuICB1cGRhdGVIYW5kbGU6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogQWRkcyB0aGUgc2F0dXJhdGlvbi9icmlnaHRuZXNzIGFyZWEgdG8gYSBjb2xvciBwaWNrZXIgY29tcG9uZW50XG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbG9yIHBpY2tlciBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBDb21wb25lbnQgZW5oYW5jZXIgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhBcmVhID1cbiAgKGNvbmZpZzogQ29sb3JQaWNrZXJDb25maWcpID0+XG4gIDxcbiAgICBUIGV4dGVuZHMge1xuICAgICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgICBnZXRDbGFzczogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgICAgZW1pdDogKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgICAgc3RhdGU/OiBDb2xvclBpY2tlclN0YXRlO1xuICAgICAgcGlja2VyQ29udGVudD86IEhUTUxFbGVtZW50O1xuICAgICAgaW5wdXQ/OiB7XG4gICAgICAgIHVwZGF0ZTogKCkgPT4gdm9pZDtcbiAgICAgIH07XG4gICAgICBvcGFjaXR5Pzoge1xuICAgICAgICB1cGRhdGVCYWNrZ3JvdW5kOiAoKSA9PiB2b2lkO1xuICAgICAgICB1cGRhdGVIYW5kbGU6ICgpID0+IHZvaWQ7XG4gICAgICB9O1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYgeyBhcmVhOiBBcmVhRmVhdHVyZTsgc3RhdGU6IENvbG9yUGlja2VyU3RhdGUgfSA9PiB7XG4gICAgY29uc3QgeyBlbGVtZW50LCBnZXRDbGFzcywgZW1pdCB9ID0gY29tcG9uZW50O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSBpZiBub3QgcHJlc2VudFxuICAgIGNvbnN0IHN0YXRlOiBDb2xvclBpY2tlclN0YXRlID1cbiAgICAgIGNvbXBvbmVudC5zdGF0ZSB8fCBjcmVhdGVJbml0aWFsU3RhdGUoY29uZmlnKTtcblxuICAgIC8vIEdldCBkaW1lbnNpb25zIGJhc2VkIG9uIHNpemVcbiAgICBjb25zdCBkaW1lbnNpb25zID0gZ2V0U2l6ZURpbWVuc2lvbnMoY29uZmlnLnNpemUgfHwgXCJtXCIpO1xuXG4gICAgLy8gVXNlIHBpY2tlckNvbnRlbnQgaWYgYXZhaWxhYmxlIChmb3IgZHJvcGRvd24vZGlhbG9nKSwgb3RoZXJ3aXNlIHVzZSBlbGVtZW50XG4gICAgY29uc3QgY29udGFpbmVyID0gY29tcG9uZW50LnBpY2tlckNvbnRlbnQgfHwgZWxlbWVudDtcblxuICAgIC8vIENyZWF0ZSBhcmVhIGNvbnRhaW5lclxuICAgIGNvbnN0IGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGFyZWEuY2xhc3NOYW1lID0gZ2V0Q2xhc3MoQ09MT1JQSUNLRVJfQ0xBU1NFUy5BUkVBKTtcbiAgICBhcmVhLnN0eWxlLmhlaWdodCA9IGAke2RpbWVuc2lvbnMuYXJlYUhlaWdodH1weGA7XG5cbiAgICAvLyBDcmVhdGUgZ3JhZGllbnQgb3ZlcmxheVxuICAgIGNvbnN0IGdyYWRpZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBncmFkaWVudC5jbGFzc05hbWUgPSBnZXRDbGFzcyhDT0xPUlBJQ0tFUl9DTEFTU0VTLkFSRUFfR1JBRElFTlQpO1xuXG4gICAgLy8gQ3JlYXRlIGhhbmRsZVxuICAgIGNvbnN0IGhhbmRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgaGFuZGxlLmNsYXNzTmFtZSA9IGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuQVJFQV9IQU5ETEUpO1xuXG4gICAgYXJlYS5hcHBlbmRDaGlsZChncmFkaWVudCk7XG4gICAgYXJlYS5hcHBlbmRDaGlsZChoYW5kbGUpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChhcmVhKTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXJlYSBiYWNrZ3JvdW5kIGJhc2VkIG9uIGN1cnJlbnQgaHVlXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlQmFja2dyb3VuZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGh1ZUNvbG9yID0gaHN2VG9IZXgoc3RhdGUuaHN2LmgsIDEwMCwgMTAwKTtcbiAgICAgIGdyYWRpZW50LnN0eWxlLmJhY2tncm91bmQgPSBgXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCh0byB0b3AsICMwMDAsIHRyYW5zcGFyZW50KSxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjZmZmLCAke2h1ZUNvbG9yfSlcbiAgICAgIGA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgaGFuZGxlIHBvc2l0aW9uIGFuZCBjb2xvclxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUhhbmRsZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHggPSAoc3RhdGUuaHN2LnMgLyAxMDApICogYXJlYS5vZmZzZXRXaWR0aDtcbiAgICAgIGNvbnN0IHkgPSAoKDEwMCAtIHN0YXRlLmhzdi52KSAvIDEwMCkgKiBhcmVhLm9mZnNldEhlaWdodDtcbiAgICAgIGhhbmRsZS5zdHlsZS5sZWZ0ID0gYCR7eH1weGA7XG4gICAgICBoYW5kbGUuc3R5bGUudG9wID0gYCR7eX1weGA7XG4gICAgICBoYW5kbGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gc3RhdGUuaGV4O1xuICAgICAgaGFuZGxlLnN0eWxlLmJvcmRlckNvbG9yID0gZ2V0Q29udHJhc3RDb2xvcihzdGF0ZS5oZXgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgbW91c2UvdG91Y2ggbW92ZSBvbiBhcmVhXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQXJlYU1vdmUgPSAoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSBhcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgeCA9IGNsYW1wKGNsaWVudFggLSByZWN0LmxlZnQsIDAsIHJlY3Qud2lkdGgpO1xuICAgICAgY29uc3QgeSA9IGNsYW1wKGNsaWVudFkgLSByZWN0LnRvcCwgMCwgcmVjdC5oZWlnaHQpO1xuXG4gICAgICBjb25zdCBzID0gKHggLyByZWN0LndpZHRoKSAqIDEwMDtcbiAgICAgIGNvbnN0IHYgPSAxMDAgLSAoeSAvIHJlY3QuaGVpZ2h0KSAqIDEwMDtcblxuICAgICAgc3RhdGUuaHN2LnMgPSBNYXRoLnJvdW5kKHMpO1xuICAgICAgc3RhdGUuaHN2LnYgPSBNYXRoLnJvdW5kKHYpO1xuICAgICAgc3RhdGUuaGV4ID0gaHN2VG9IZXgoc3RhdGUuaHN2LmgsIHN0YXRlLmhzdi5zLCBzdGF0ZS5oc3Yudik7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGlzIGZlYXR1cmVcbiAgICAgIHVwZGF0ZUhhbmRsZSgpO1xuXG4gICAgICAvLyBVcGRhdGUgb3RoZXIgZmVhdHVyZXMgdGhhdCBkZXBlbmQgb24gY29sb3IgdmlhIHJlZnNcbiAgICAgIHN0YXRlLnJlZnMuaW5wdXQ/LnVwZGF0ZT8uKCk7XG4gICAgICBzdGF0ZS5yZWZzLm9wYWNpdHk/LnVwZGF0ZUJhY2tncm91bmQ/LigpO1xuICAgICAgc3RhdGUucmVmcy5vcGFjaXR5Py51cGRhdGVIYW5kbGU/LigpO1xuXG4gICAgICBlbWl0KENPTE9SUElDS0VSX0VWRU5UUy5JTlBVVCwgc3RhdGUuaGV4KTtcbiAgICAgIGNvbmZpZy5vbklucHV0Py4oc3RhdGUuaGV4KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIG1vdXNlIGRvd24gb24gYXJlYVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZU1vdXNlRG93biA9IChlOiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoY29uZmlnLmRpc2FibGVkKSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHN0YXRlLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgc3RhdGUuZHJhZ1RhcmdldCA9IFwiYXJlYVwiO1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuRFJBR0dJTkcpKTtcblxuICAgICAgaGFuZGxlQXJlYU1vdmUoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIG1vdXNlIG1vdmUgKGRvY3VtZW50IGxldmVsKVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZU1vdXNlTW92ZSA9IChlOiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXN0YXRlLmlzRHJhZ2dpbmcgfHwgc3RhdGUuZHJhZ1RhcmdldCAhPT0gXCJhcmVhXCIpIHJldHVybjtcbiAgICAgIGhhbmRsZUFyZWFNb3ZlKGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIG1vdXNlIHVwIChkb2N1bWVudCBsZXZlbClcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVNb3VzZVVwID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHN0YXRlLmlzRHJhZ2dpbmcgJiYgc3RhdGUuZHJhZ1RhcmdldCA9PT0gXCJhcmVhXCIpIHtcbiAgICAgICAgc3RhdGUuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5kcmFnVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuRFJBR0dJTkcpKTtcblxuICAgICAgICBlbWl0KENPTE9SUElDS0VSX0VWRU5UUy5DSEFOR0UsIHN0YXRlLmhleCk7XG4gICAgICAgIGNvbmZpZy5vbkNoYW5nZT8uKHN0YXRlLmhleCk7XG4gICAgICB9XG5cbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2ggc3RhcnQgb24gYXJlYVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVRvdWNoU3RhcnQgPSAoZTogVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGNvbmZpZy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBzdGF0ZS5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmRyYWdUYXJnZXQgPSBcImFyZWFcIjtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhDT0xPUlBJQ0tFUl9DTEFTU0VTLkRSQUdHSU5HKSk7XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gZS50b3VjaGVzWzBdO1xuICAgICAgaGFuZGxlQXJlYU1vdmUodG91Y2guY2xpZW50WCwgdG91Y2guY2xpZW50WSk7XG5cbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlLCB7XG4gICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgaGFuZGxlVG91Y2hFbmQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2ggbW92ZSAoZG9jdW1lbnQgbGV2ZWwpXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gKGU6IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghc3RhdGUuaXNEcmFnZ2luZyB8fCBzdGF0ZS5kcmFnVGFyZ2V0ICE9PSBcImFyZWFcIikgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgdG91Y2ggPSBlLnRvdWNoZXNbMF07XG4gICAgICBoYW5kbGVBcmVhTW92ZSh0b3VjaC5jbGllbnRYLCB0b3VjaC5jbGllbnRZKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoIGVuZCAoZG9jdW1lbnQgbGV2ZWwpXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoc3RhdGUuaXNEcmFnZ2luZyAmJiBzdGF0ZS5kcmFnVGFyZ2V0ID09PSBcImFyZWFcIikge1xuICAgICAgICBzdGF0ZS5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLmRyYWdUYXJnZXQgPSBudWxsO1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoZ2V0Q2xhc3MoQ09MT1JQSUNLRVJfQ0xBU1NFUy5EUkFHR0lORykpO1xuXG4gICAgICAgIGVtaXQoQ09MT1JQSUNLRVJfRVZFTlRTLkNIQU5HRSwgc3RhdGUuaGV4KTtcbiAgICAgICAgY29uZmlnLm9uQ2hhbmdlPy4oc3RhdGUuaGV4KTtcbiAgICAgIH1cblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIGhhbmRsZVRvdWNoRW5kKTtcbiAgICB9O1xuXG4gICAgLy8gQXR0YWNoIGV2ZW50IGxpc3RlbmVyc1xuICAgIGFyZWEuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBoYW5kbGVNb3VzZURvd24pO1xuICAgIGFyZWEuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgaGFuZGxlVG91Y2hTdGFydCwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcblxuICAgIC8vIEluaXRpYWwgcmVuZGVyXG4gICAgdXBkYXRlQmFja2dyb3VuZCgpO1xuICAgIHVwZGF0ZUhhbmRsZSgpO1xuXG4gICAgLy8gQ3JlYXRlIGFyZWEgZmVhdHVyZSBvYmplY3RcbiAgICBjb25zdCBhcmVhRmVhdHVyZTogQXJlYUZlYXR1cmUgPSB7XG4gICAgICBlbGVtZW50OiBhcmVhLFxuICAgICAgZ3JhZGllbnQsXG4gICAgICBoYW5kbGUsXG4gICAgICB1cGRhdGVCYWNrZ3JvdW5kLFxuICAgICAgdXBkYXRlSGFuZGxlLFxuICAgIH07XG5cbiAgICAvLyBFeHRlbmQgbGlmZWN5Y2xlIGRlc3Ryb3kgaWYgaXQgZXhpc3RzXG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gKGNvbXBvbmVudCBhcyBhbnkpLmxpZmVjeWNsZT8uZGVzdHJveTtcbiAgICBpZiAob3JpZ2luYWxEZXN0cm95KSB7XG4gICAgICAoY29tcG9uZW50IGFzIGFueSkubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIGFyZWEucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBoYW5kbGVNb3VzZURvd24pO1xuICAgICAgICBhcmVhLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIGhhbmRsZVRvdWNoU3RhcnQpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCBoYW5kbGVUb3VjaEVuZCk7XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveSgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgc3RhdGUsXG4gICAgICBhcmVhOiBhcmVhRmVhdHVyZSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9mZWF0dXJlcy9odWUudHNcblxuaW1wb3J0IHsgQ09MT1JQSUNLRVJfQ0xBU1NFUywgQ09MT1JQSUNLRVJfRVZFTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ29sb3JQaWNrZXJDb25maWcsIENvbG9yUGlja2VyU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGhzdlRvSGV4IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBjcmVhdGVJbml0aWFsU3RhdGUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5cbi8qKlxuICogSHVlIGZlYXR1cmUgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHVlRmVhdHVyZSB7XG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICBoYW5kbGU6IEhUTUxFbGVtZW50O1xuICB1cGRhdGVIYW5kbGU6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogQWRkcyBhIHNpbXBsZSBodWUgYmFyIHdpdGggcmFpbmJvdyBncmFkaWVudCBhbmQgZHJhZ2dhYmxlIGhhbmRsZVxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb2xvciBwaWNrZXIgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgQ29tcG9uZW50IGVuaGFuY2VyIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoSHVlID1cbiAgKGNvbmZpZzogQ29sb3JQaWNrZXJDb25maWcpID0+XG4gIDxcbiAgICBUIGV4dGVuZHMge1xuICAgICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgICBnZXRDbGFzczogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgICAgZW1pdDogKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgICAgc3RhdGU/OiBDb2xvclBpY2tlclN0YXRlO1xuICAgICAgcGlja2VyQ29udGVudD86IEhUTUxFbGVtZW50O1xuICAgICAgYXJlYT86IHtcbiAgICAgICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgICAgIHVwZGF0ZUJhY2tncm91bmQ6ICgpID0+IHZvaWQ7XG4gICAgICAgIHVwZGF0ZUhhbmRsZTogKCkgPT4gdm9pZDtcbiAgICAgIH07XG4gICAgfSxcbiAgPihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7IGh1ZTogSHVlRmVhdHVyZTsgc3RhdGU6IENvbG9yUGlja2VyU3RhdGUgfSA9PiB7XG4gICAgY29uc3QgeyBlbGVtZW50LCBnZXRDbGFzcywgZW1pdCB9ID0gY29tcG9uZW50O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSBpZiBub3QgcHJlc2VudFxuICAgIGNvbnN0IHN0YXRlOiBDb2xvclBpY2tlclN0YXRlID1cbiAgICAgIGNvbXBvbmVudC5zdGF0ZSB8fCBjcmVhdGVJbml0aWFsU3RhdGUoY29uZmlnKTtcblxuICAgIC8vIFVzZSBwaWNrZXJDb250ZW50IGlmIGF2YWlsYWJsZSAoZm9yIGRyb3Bkb3duL2RpYWxvZyksIG90aGVyd2lzZSB1c2UgZWxlbWVudFxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbXBvbmVudC5waWNrZXJDb250ZW50IHx8IGVsZW1lbnQ7XG5cbiAgICAvLyBDcmVhdGUgaHVlIGJhciBjb250YWluZXJcbiAgICBjb25zdCBodWVCYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGh1ZUJhci5jbGFzc05hbWUgPSBnZXRDbGFzcyhDT0xPUlBJQ0tFUl9DTEFTU0VTLkhVRSk7XG5cbiAgICAvLyBDcmVhdGUgcmFpbmJvdyBncmFkaWVudCB0cmFja1xuICAgIGNvbnN0IHRyYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0cmFjay5jbGFzc05hbWUgPSBnZXRDbGFzcyhDT0xPUlBJQ0tFUl9DTEFTU0VTLkhVRV9TTElERVIpO1xuICAgIGh1ZUJhci5hcHBlbmRDaGlsZCh0cmFjayk7XG5cbiAgICAvLyBDcmVhdGUgZHJhZ2dhYmxlIGhhbmRsZVxuICAgIGNvbnN0IGhhbmRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgaGFuZGxlLmNsYXNzTmFtZSA9IGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuSFVFX0hBTkRMRSk7XG4gICAgaHVlQmFyLmFwcGVuZENoaWxkKGhhbmRsZSk7XG5cbiAgICAvLyBJbnNlcnQgYWZ0ZXIgYXJlYSBlbGVtZW50IGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIGFwcGVuZFxuICAgIGlmIChjb21wb25lbnQuYXJlYT8uZWxlbWVudCkge1xuICAgICAgY29tcG9uZW50LmFyZWEuZWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmVuZFwiLCBodWVCYXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaHVlQmFyKTtcbiAgICB9XG5cbiAgICAvLyBEcmFnZ2luZyBzdGF0ZVxuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgaGFuZGxlIHBvc2l0aW9uIGJhc2VkIG9uIGN1cnJlbnQgaHVlXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlSGFuZGxlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgcGVyY2VudCA9IChzdGF0ZS5oc3YuaCAvIDM2MCkgKiAxMDA7XG4gICAgICBoYW5kbGUuc3R5bGUubGVmdCA9IGAke3BlcmNlbnR9JWA7XG4gICAgICAvLyBTZXQgaGFuZGxlIGNvbG9yIHRvIGN1cnJlbnQgaHVlIGF0IGZ1bGwgc2F0dXJhdGlvbi92YWx1ZVxuICAgICAgaGFuZGxlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGhzdlRvSGV4KHN0YXRlLmhzdi5oLCAxMDAsIDEwMCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSBodWUgZnJvbSBtb3VzZS90b3VjaCBwb3NpdGlvblxuICAgICAqL1xuICAgIGNvbnN0IGdldEh1ZUZyb21Qb3NpdGlvbiA9IChjbGllbnRYOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgY29uc3QgcmVjdCA9IGh1ZUJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihjbGllbnRYIC0gcmVjdC5sZWZ0LCByZWN0LndpZHRoKSk7XG4gICAgICBjb25zdCBwZXJjZW50ID0geCAvIHJlY3Qud2lkdGg7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZChwZXJjZW50ICogMzYwKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHN0YXRlIGFuZCBlbWl0IGV2ZW50c1xuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUh1ZSA9IChoOiBudW1iZXIsIGlzQ29tbWl0OiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICBzdGF0ZS5oc3YuaCA9IGg7XG4gICAgICBzdGF0ZS5oZXggPSBoc3ZUb0hleChzdGF0ZS5oc3YuaCwgc3RhdGUuaHN2LnMsIHN0YXRlLmhzdi52KTtcblxuICAgICAgdXBkYXRlSGFuZGxlKCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBhcmVhIGlmIHByZXNlbnRcbiAgICAgIGlmIChjb21wb25lbnQuYXJlYSkge1xuICAgICAgICBjb21wb25lbnQuYXJlYS51cGRhdGVCYWNrZ3JvdW5kKCk7XG4gICAgICAgIGNvbXBvbmVudC5hcmVhLnVwZGF0ZUhhbmRsZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgb3RoZXIgZmVhdHVyZXMgdGhhdCBkZXBlbmQgb24gY29sb3IgdmlhIHJlZnNcbiAgICAgIHN0YXRlLnJlZnMuaW5wdXQ/LnVwZGF0ZT8uKCk7XG4gICAgICBzdGF0ZS5yZWZzLm9wYWNpdHk/LnVwZGF0ZUJhY2tncm91bmQ/LigpO1xuICAgICAgc3RhdGUucmVmcy5vcGFjaXR5Py51cGRhdGVIYW5kbGU/LigpO1xuXG4gICAgICBpZiAoaXNDb21taXQpIHtcbiAgICAgICAgZW1pdChDT0xPUlBJQ0tFUl9FVkVOVFMuQ0hBTkdFLCBzdGF0ZS5oZXgpO1xuICAgICAgICBjb25maWcub25DaGFuZ2U/LihzdGF0ZS5oZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW1pdChDT0xPUlBJQ0tFUl9FVkVOVFMuSU5QVVQsIHN0YXRlLmhleCk7XG4gICAgICAgIGNvbmZpZy5vbklucHV0Py4oc3RhdGUuaGV4KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHBvaW50ZXIgZG93biBvbiBodWUgYmFyXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlUG9pbnRlckRvd24gPSAoZTogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoY29uZmlnLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgc3RhdGUuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICBzdGF0ZS5kcmFnVGFyZ2V0ID0gXCJodWVcIjtcblxuICAgICAgLy8gQ2FwdHVyZSBwb2ludGVyIGZvciB0cmFja2luZyBvdXRzaWRlIGVsZW1lbnRcbiAgICAgIGh1ZUJhci5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG5cbiAgICAgIC8vIEFkZCBkcmFnZ2luZyBjbGFzc1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuRFJBR0dJTkcpKTtcblxuICAgICAgLy8gVXBkYXRlIGh1ZSBpbW1lZGlhdGVseVxuICAgICAgY29uc3QgaCA9IGdldEh1ZUZyb21Qb3NpdGlvbihlLmNsaWVudFgpO1xuICAgICAgdXBkYXRlSHVlKGgsIGZhbHNlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHBvaW50ZXIgbW92ZVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVBvaW50ZXJNb3ZlID0gKGU6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGggPSBnZXRIdWVGcm9tUG9zaXRpb24oZS5jbGllbnRYKTtcbiAgICAgIHVwZGF0ZUh1ZShoLCBmYWxzZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBwb2ludGVyIHVwXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlUG9pbnRlclVwID0gKGU6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgIHN0YXRlLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgIHN0YXRlLmRyYWdUYXJnZXQgPSBudWxsO1xuXG4gICAgICAvLyBSZWxlYXNlIHBvaW50ZXIgY2FwdHVyZVxuICAgICAgaHVlQmFyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG5cbiAgICAgIC8vIFJlbW92ZSBkcmFnZ2luZyBjbGFzc1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuRFJBR0dJTkcpKTtcblxuICAgICAgLy8gRW1pdCBmaW5hbCBjaGFuZ2VcbiAgICAgIGNvbnN0IGggPSBnZXRIdWVGcm9tUG9zaXRpb24oZS5jbGllbnRYKTtcbiAgICAgIHVwZGF0ZUh1ZShoLCB0cnVlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGtleWJvYXJkIG5hdmlnYXRpb25cbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmIChjb25maWcuZGlzYWJsZWQpIHJldHVybjtcblxuICAgICAgbGV0IGggPSBzdGF0ZS5oc3YuaDtcbiAgICAgIGNvbnN0IHN0ZXAgPSBlLnNoaWZ0S2V5ID8gMTAgOiAxO1xuXG4gICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgIGNhc2UgXCJBcnJvd0xlZnRcIjpcbiAgICAgICAgY2FzZSBcIkFycm93RG93blwiOlxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBoID0gKGggLSBzdGVwICsgMzYwKSAlIDM2MDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkFycm93UmlnaHRcIjpcbiAgICAgICAgY2FzZSBcIkFycm93VXBcIjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgaCA9IChoICsgc3RlcCkgJSAzNjA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJIb21lXCI6XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGggPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRW5kXCI6XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGggPSAzNTk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGVIdWUoaCwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lcnNcbiAgICBodWVCYXIuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICBodWVCYXIuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIGhhbmRsZVBvaW50ZXJNb3ZlKTtcbiAgICBodWVCYXIuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBoYW5kbGVQb2ludGVyVXApO1xuICAgIGh1ZUJhci5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmNhbmNlbFwiLCBoYW5kbGVQb2ludGVyVXApO1xuXG4gICAgLy8gTWFrZSBodWUgYmFyIGZvY3VzYWJsZSBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvblxuICAgIGh1ZUJhci50YWJJbmRleCA9IDA7XG4gICAgaHVlQmFyLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJzbGlkZXJcIik7XG4gICAgaHVlQmFyLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJIdWVcIik7XG4gICAgaHVlQmFyLnNldEF0dHJpYnV0ZShcImFyaWEtdmFsdWVtaW5cIiwgXCIwXCIpO1xuICAgIGh1ZUJhci5zZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbWF4XCIsIFwiMzYwXCIpO1xuICAgIGh1ZUJhci5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcblxuICAgIC8vIEluaXRpYWwgaGFuZGxlIHBvc2l0aW9uXG4gICAgdXBkYXRlSGFuZGxlKCk7XG5cbiAgICAvLyBDcmVhdGUgaHVlIGZlYXR1cmUgb2JqZWN0XG4gICAgY29uc3QgaHVlRmVhdHVyZTogSHVlRmVhdHVyZSA9IHtcbiAgICAgIGVsZW1lbnQ6IGh1ZUJhcixcbiAgICAgIGhhbmRsZSxcbiAgICAgIHVwZGF0ZUhhbmRsZSxcbiAgICB9O1xuXG4gICAgLy8gRXh0ZW5kIGxpZmVjeWNsZSBkZXN0cm95IGlmIGl0IGV4aXN0c1xuICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IChjb21wb25lbnQgYXMgYW55KS5saWZlY3ljbGU/LmRlc3Ryb3k7XG4gICAgaWYgKG9yaWdpbmFsRGVzdHJveSkge1xuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmxpZmVjeWNsZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICBodWVCYXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgaHVlQmFyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBoYW5kbGVQb2ludGVyTW92ZSk7XG4gICAgICAgIGh1ZUJhci5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGhhbmRsZVBvaW50ZXJVcCk7XG4gICAgICAgIGh1ZUJhci5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmNhbmNlbFwiLCBoYW5kbGVQb2ludGVyVXApO1xuICAgICAgICBodWVCYXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93bik7XG4gICAgICAgIGh1ZUJhci5yZW1vdmUoKTtcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95KCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBzdGF0ZSxcbiAgICAgIGh1ZTogaHVlRmVhdHVyZSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9mZWF0dXJlcy9zd2F0Y2hlcy50c1xuXG5pbXBvcnQgeyBDT0xPUlBJQ0tFUl9DTEFTU0VTLCBDT0xPUlBJQ0tFUl9FVkVOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDb2xvclBpY2tlckNvbmZpZywgQ29sb3JQaWNrZXJTdGF0ZSwgQ29sb3JTd2F0Y2ggfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUhleCwgaGV4VG9Ic3YsIGhzdlRvSGV4IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBjcmVhdGVJbml0aWFsU3RhdGUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5cbi8qKlxuICogU3dhdGNoZXMgZmVhdHVyZSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2F0Y2hlc0ZlYXR1cmUge1xuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgdXBkYXRlOiAoKSA9PiB2b2lkO1xuICBzZXQ6IChzd2F0Y2hlczogc3RyaW5nW10gfCBDb2xvclN3YXRjaFtdKSA9PiB2b2lkO1xuICBhZGQ6IChjb2xvcjogc3RyaW5nLCBsYWJlbD86IHN0cmluZykgPT4gdm9pZDtcbiAgcmVtb3ZlOiAoY29sb3I6IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXI6ICgpID0+IHZvaWQ7XG4gIGdldDogKCkgPT4gQ29sb3JTd2F0Y2hbXTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgc3dhdGNoZXMgYXJyYXkgdG8gQ29sb3JTd2F0Y2ggb2JqZWN0c1xuICovXG5jb25zdCBub3JtYWxpemVTd2F0Y2hlcyA9IChcbiAgc3dhdGNoZXM6IHN0cmluZ1tdIHwgQ29sb3JTd2F0Y2hbXSxcbiAgbWF4U3dhdGNoZXM6IG51bWJlcixcbik6IENvbG9yU3dhdGNoW10gPT4ge1xuICByZXR1cm4gc3dhdGNoZXMuc2xpY2UoMCwgbWF4U3dhdGNoZXMpLm1hcCgocykgPT4ge1xuICAgIGlmICh0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHsgY29sb3I6IG5vcm1hbGl6ZUhleChzKSwgc2VsZWN0ZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIHJldHVybiB7IC4uLnMsIGNvbG9yOiBub3JtYWxpemVIZXgocy5jb2xvcikgfTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEFkZHMgc3dhdGNoZXMgKGNvbG9yIHByZXNldHMpIHRvIGEgY29sb3IgcGlja2VyIGNvbXBvbmVudFxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb2xvciBwaWNrZXIgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgQ29tcG9uZW50IGVuaGFuY2VyIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoU3dhdGNoZXMgPVxuICAoY29uZmlnOiBDb2xvclBpY2tlckNvbmZpZykgPT5cbiAgPFxuICAgIFQgZXh0ZW5kcyB7XG4gICAgICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICAgIGdldENsYXNzOiAobmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XG4gICAgICBlbWl0OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBzdGF0ZT86IENvbG9yUGlja2VyU3RhdGU7XG4gICAgICBwaWNrZXJDb250ZW50PzogSFRNTEVsZW1lbnQ7XG4gICAgICB2YXJpYW50Pzoge1xuICAgICAgICBjbG9zZTogKCkgPT4gdm9pZDtcbiAgICAgIH07XG4gICAgICBhcmVhPzoge1xuICAgICAgICB1cGRhdGVCYWNrZ3JvdW5kOiAoKSA9PiB2b2lkO1xuICAgICAgICB1cGRhdGVIYW5kbGU6ICgpID0+IHZvaWQ7XG4gICAgICB9O1xuICAgICAgaHVlPzoge1xuICAgICAgICB1cGRhdGVIYW5kbGU6ICgpID0+IHZvaWQ7XG4gICAgICB9O1xuICAgICAgaW5wdXQ/OiB7XG4gICAgICAgIHVwZGF0ZTogKCkgPT4gdm9pZDtcbiAgICAgIH07XG4gICAgfSxcbiAgPihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7IHN3YXRjaGVzOiBTd2F0Y2hlc0ZlYXR1cmU7IHN0YXRlOiBDb2xvclBpY2tlclN0YXRlIH0gPT4ge1xuICAgIGNvbnN0IHsgZWxlbWVudCwgZ2V0Q2xhc3MsIGVtaXQgfSA9IGNvbXBvbmVudDtcblxuICAgIC8vIEluaXRpYWxpemUgc3RhdGUgaWYgbm90IHByZXNlbnRcbiAgICBjb25zdCBzdGF0ZTogQ29sb3JQaWNrZXJTdGF0ZSA9XG4gICAgICBjb21wb25lbnQuc3RhdGUgfHwgY3JlYXRlSW5pdGlhbFN0YXRlKGNvbmZpZyk7XG5cbiAgICAvLyBVc2UgcGlja2VyQ29udGVudCBpZiBhdmFpbGFibGUgKGZvciBkcm9wZG93bi9kaWFsb2cpLCBvdGhlcndpc2UgdXNlIGVsZW1lbnRcbiAgICBjb25zdCBjb250YWluZXIgPSBjb21wb25lbnQucGlja2VyQ29udGVudCB8fCBlbGVtZW50O1xuXG4gICAgY29uc3Qgc3dhdGNoU2l6ZSA9IGNvbmZpZy5zd2F0Y2hTaXplIHx8IDMyO1xuICAgIGNvbnN0IG1heFN3YXRjaGVzID0gY29uZmlnLm1heFN3YXRjaGVzIHx8IDg7XG5cbiAgICAvLyBJbml0aWFsaXplIHN3YXRjaGVzIGZyb20gY29uZmlnXG4gICAgaWYgKGNvbmZpZy5zd2F0Y2hlcykge1xuICAgICAgc3RhdGUuc3dhdGNoZXMgPSBub3JtYWxpemVTd2F0Y2hlcyhjb25maWcuc3dhdGNoZXMsIG1heFN3YXRjaGVzKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc3dhdGNoZXMgY29udGFpbmVyXG4gICAgY29uc3Qgc3dhdGNoZXNDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHN3YXRjaGVzQ29udGFpbmVyLmNsYXNzTmFtZSA9IGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuU1dBVENIRVMpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzd2F0Y2hlc0NvbnRhaW5lcik7XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYWxsIFVJIGZlYXR1cmVzXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlQWxsVUkgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjb21wb25lbnQuYXJlYT8udXBkYXRlQmFja2dyb3VuZD8uKCk7XG4gICAgICBjb21wb25lbnQuYXJlYT8udXBkYXRlSGFuZGxlPy4oKTtcbiAgICAgIGNvbXBvbmVudC5odWU/LnVwZGF0ZUhhbmRsZT8uKCk7XG4gICAgICBzdGF0ZS5yZWZzLm9wYWNpdHk/LnVwZGF0ZUJhY2tncm91bmQ/LigpO1xuICAgICAgc3RhdGUucmVmcy5vcGFjaXR5Py51cGRhdGVIYW5kbGU/LigpO1xuICAgICAgc3RhdGUucmVmcy5pbnB1dD8udXBkYXRlPy4oKTtcbiAgICAgIHVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgc3dhdGNoIGNsaWNrXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlU3dhdGNoQ2xpY2sgPSAoc3dhdGNoOiBDb2xvclN3YXRjaCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGNvbmZpZy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgICAvLyBVcGRhdGUgc3RhdGUgZGlyZWN0bHlcbiAgICAgIGNvbnN0IGhzdiA9IGhleFRvSHN2KHN3YXRjaC5jb2xvcik7XG4gICAgICBpZiAoaHN2KSB7XG4gICAgICAgIHN0YXRlLmhzdiA9IGhzdjtcbiAgICAgICAgc3RhdGUuaGV4ID0gbm9ybWFsaXplSGV4KHN3YXRjaC5jb2xvcik7XG5cbiAgICAgICAgLy8gVXBkYXRlIGFsbCBVSVxuICAgICAgICB1cGRhdGVBbGxVSSgpO1xuXG4gICAgICAgIC8vIEVtaXQgY2hhbmdlIGV2ZW50XG4gICAgICAgIGVtaXQoQ09MT1JQSUNLRVJfRVZFTlRTLkNIQU5HRSwgc3RhdGUuaGV4KTtcbiAgICAgICAgY29uZmlnLm9uQ2hhbmdlPy4oc3RhdGUuaGV4KTtcbiAgICAgIH1cblxuICAgICAgZW1pdChDT0xPUlBJQ0tFUl9FVkVOVFMuU1dBVENIX1NFTEVDVCwgc3dhdGNoLmNvbG9yKTtcblxuICAgICAgLy8gQ2xvc2UgZHJvcGRvd24vZGlhbG9nIGlmIGNvbmZpZ3VyZWRcbiAgICAgIGlmIChjb25maWcuY2xvc2VPblNlbGVjdCAmJiBjb21wb25lbnQudmFyaWFudCkge1xuICAgICAgICBjb21wb25lbnQudmFyaWFudC5jbG9zZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHN3YXRjaGVzIGRpc3BsYXlcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGUgPSAoKTogdm9pZCA9PiB7XG4gICAgICBzd2F0Y2hlc0NvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuXG4gICAgICBzdGF0ZS5zd2F0Y2hlcy5mb3JFYWNoKChzd2F0Y2gpID0+IHtcbiAgICAgICAgY29uc3Qgc3dhdGNoRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICBzd2F0Y2hFbC50eXBlID0gXCJidXR0b25cIjtcbiAgICAgICAgc3dhdGNoRWwuY2xhc3NOYW1lID0gZ2V0Q2xhc3MoQ09MT1JQSUNLRVJfQ0xBU1NFUy5TV0FUQ0gpO1xuICAgICAgICBzd2F0Y2hFbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBzd2F0Y2guY29sb3I7XG5cbiAgICAgICAgLy8gTWFyayBhcyBzZWxlY3RlZCBpZiBtYXRjaGVzIGN1cnJlbnQgY29sb3JcbiAgICAgICAgaWYgKHN3YXRjaC5jb2xvci50b0xvd2VyQ2FzZSgpID09PSBzdGF0ZS5oZXgudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIHN3YXRjaEVsLmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoQ09MT1JQSUNLRVJfQ0xBU1NFUy5TV0FUQ0hfU0VMRUNURUQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCB0b29sdGlwIGlmIGxhYmVsIGV4aXN0c1xuICAgICAgICBpZiAoc3dhdGNoLmxhYmVsKSB7XG4gICAgICAgICAgc3dhdGNoRWwudGl0bGUgPSBzd2F0Y2gubGFiZWw7XG4gICAgICAgIH1cblxuICAgICAgICBzd2F0Y2hFbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4gaGFuZGxlU3dhdGNoQ2xpY2soc3dhdGNoKSk7XG5cbiAgICAgICAgc3dhdGNoZXNDb250YWluZXIuYXBwZW5kQ2hpbGQoc3dhdGNoRWwpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCBzd2F0Y2hlcyBhcnJheVxuICAgICAqL1xuICAgIGNvbnN0IHNldCA9IChzd2F0Y2hlczogc3RyaW5nW10gfCBDb2xvclN3YXRjaFtdKTogdm9pZCA9PiB7XG4gICAgICBzdGF0ZS5zd2F0Y2hlcyA9IG5vcm1hbGl6ZVN3YXRjaGVzKHN3YXRjaGVzLCBtYXhTd2F0Y2hlcyk7XG4gICAgICB1cGRhdGUoKTtcbiAgICAgIGVtaXQoQ09MT1JQSUNLRVJfRVZFTlRTLlNXQVRDSEVTX0NIQU5HRSwgc3RhdGUuc3dhdGNoZXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBzd2F0Y2hcbiAgICAgKi9cbiAgICBjb25zdCBhZGQgPSAoY29sb3I6IHN0cmluZywgbGFiZWw/OiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgIGlmIChzdGF0ZS5zd2F0Y2hlcy5sZW5ndGggPj0gbWF4U3dhdGNoZXMpIHtcbiAgICAgICAgc3RhdGUuc3dhdGNoZXMuc2hpZnQoKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLnN3YXRjaGVzLnB1c2goe1xuICAgICAgICBjb2xvcjogbm9ybWFsaXplSGV4KGNvbG9yKSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgdXBkYXRlKCk7XG4gICAgICBlbWl0KENPTE9SUElDS0VSX0VWRU5UUy5TV0FUQ0hFU19DSEFOR0UsIHN0YXRlLnN3YXRjaGVzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGEgc3dhdGNoIGJ5IGNvbG9yXG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlID0gKGNvbG9yOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRDb2xvciA9IG5vcm1hbGl6ZUhleChjb2xvcik7XG4gICAgICBzdGF0ZS5zd2F0Y2hlcyA9IHN0YXRlLnN3YXRjaGVzLmZpbHRlcihcbiAgICAgICAgKHMpID0+IHMuY29sb3IudG9Mb3dlckNhc2UoKSAhPT0gbm9ybWFsaXplZENvbG9yLnRvTG93ZXJDYXNlKCksXG4gICAgICApO1xuICAgICAgdXBkYXRlKCk7XG4gICAgICBlbWl0KENPTE9SUElDS0VSX0VWRU5UUy5TV0FUQ0hFU19DSEFOR0UsIHN0YXRlLnN3YXRjaGVzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIHN3YXRjaGVzXG4gICAgICovXG4gICAgY29uc3QgY2xlYXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBzdGF0ZS5zd2F0Y2hlcyA9IFtdO1xuICAgICAgdXBkYXRlKCk7XG4gICAgICBlbWl0KENPTE9SUElDS0VSX0VWRU5UUy5TV0FUQ0hFU19DSEFOR0UsIHN0YXRlLnN3YXRjaGVzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogR2V0IGN1cnJlbnQgc3dhdGNoZXNcbiAgICAgKi9cbiAgICBjb25zdCBnZXQgPSAoKTogQ29sb3JTd2F0Y2hbXSA9PiB7XG4gICAgICByZXR1cm4gWy4uLnN0YXRlLnN3YXRjaGVzXTtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbCByZW5kZXJcbiAgICB1cGRhdGUoKTtcblxuICAgIC8vIENyZWF0ZSBzd2F0Y2hlcyBmZWF0dXJlIG9iamVjdFxuICAgIGNvbnN0IHN3YXRjaGVzRmVhdHVyZTogU3dhdGNoZXNGZWF0dXJlID0ge1xuICAgICAgZWxlbWVudDogc3dhdGNoZXNDb250YWluZXIsXG4gICAgICB1cGRhdGUsXG4gICAgICBzZXQsXG4gICAgICBhZGQsXG4gICAgICByZW1vdmUsXG4gICAgICBjbGVhcixcbiAgICAgIGdldCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHN0YXRlLFxuICAgICAgc3dhdGNoZXM6IHN3YXRjaGVzRmVhdHVyZSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9mZWF0dXJlcy9pbnB1dC50c1xuXG5pbXBvcnQgeyBjcmVhdGVUZXh0ZmllbGQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgQ09MT1JQSUNLRVJfQ0xBU1NFUywgQ09MT1JQSUNLRVJfRVZFTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ29sb3JQaWNrZXJDb25maWcsIENvbG9yUGlja2VyU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzVmFsaWRIZXgsIG5vcm1hbGl6ZUhleCwgaGV4VG9Ic3YgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUluaXRpYWxTdGF0ZSB9IGZyb20gXCIuLi9jb25maWdcIjtcblxuLyoqXG4gKiBJbnB1dCBmZWF0dXJlIGludGVyZmFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIElucHV0RmVhdHVyZSB7XG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICB0ZXh0ZmllbGQ6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVRleHRmaWVsZD4gfCBudWxsO1xuICBwcmV2aWV3OiBIVE1MRWxlbWVudCB8IG51bGw7XG4gIHVwZGF0ZTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBoZXggaW5wdXQgZmllbGQgKHVzaW5nIG10cmwgdGV4dGZpZWxkKSBhbmQgY29sb3IgcHJldmlldyB0byBhIGNvbG9yIHBpY2tlciBjb21wb25lbnRcbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29sb3IgcGlja2VyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIENvbXBvbmVudCBlbmhhbmNlciBmdW5jdGlvblxuICovXG5leHBvcnQgY29uc3Qgd2l0aElucHV0ID1cbiAgKGNvbmZpZzogQ29sb3JQaWNrZXJDb25maWcpID0+XG4gIDxcbiAgICBUIGV4dGVuZHMge1xuICAgICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgICBnZXRDbGFzczogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgICAgZW1pdDogKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgICAgc3RhdGU/OiBDb2xvclBpY2tlclN0YXRlO1xuICAgICAgcGlja2VyQ29udGVudD86IEhUTUxFbGVtZW50O1xuICAgICAgdmFyaWFudD86IHtcbiAgICAgICAgY2xvc2U6ICgpID0+IHZvaWQ7XG4gICAgICB9O1xuICAgICAgYXJlYT86IHtcbiAgICAgICAgdXBkYXRlQmFja2dyb3VuZDogKCkgPT4gdm9pZDtcbiAgICAgICAgdXBkYXRlSGFuZGxlOiAoKSA9PiB2b2lkO1xuICAgICAgfTtcbiAgICAgIGh1ZT86IHtcbiAgICAgICAgdXBkYXRlSGFuZGxlOiAoKSA9PiB2b2lkO1xuICAgICAgfTtcbiAgICB9LFxuICA+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHsgaW5wdXQ6IElucHV0RmVhdHVyZTsgc3RhdGU6IENvbG9yUGlja2VyU3RhdGUgfSA9PiB7XG4gICAgY29uc3QgeyBlbGVtZW50LCBnZXRDbGFzcywgZW1pdCB9ID0gY29tcG9uZW50O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSBpZiBub3QgcHJlc2VudFxuICAgIGNvbnN0IHN0YXRlOiBDb2xvclBpY2tlclN0YXRlID1cbiAgICAgIGNvbXBvbmVudC5zdGF0ZSB8fCBjcmVhdGVJbml0aWFsU3RhdGUoY29uZmlnKTtcblxuICAgIC8vIFVzZSBwaWNrZXJDb250ZW50IGlmIGF2YWlsYWJsZSAoZm9yIGRyb3Bkb3duL2RpYWxvZyksIG90aGVyd2lzZSB1c2UgZWxlbWVudFxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbXBvbmVudC5waWNrZXJDb250ZW50IHx8IGVsZW1lbnQ7XG5cbiAgICBjb25zdCBzaG93SW5wdXQgPSBjb25maWcuc2hvd0lucHV0ID8/IHRydWU7XG4gICAgY29uc3Qgc2hvd1ByZXZpZXcgPSBjb25maWcuc2hvd1ByZXZpZXcgPz8gdHJ1ZTtcblxuICAgIC8vIE9ubHkgY3JlYXRlIGlmIGF0IGxlYXN0IG9uZSBpcyBlbmFibGVkXG4gICAgaWYgKCFzaG93SW5wdXQgJiYgIXNob3dQcmV2aWV3KSB7XG4gICAgICBjb25zdCBlbXB0eUZlYXR1cmU6IElucHV0RmVhdHVyZSA9IHtcbiAgICAgICAgZWxlbWVudDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxcbiAgICAgICAgdGV4dGZpZWxkOiBudWxsLFxuICAgICAgICBwcmV2aWV3OiBudWxsLFxuICAgICAgICB1cGRhdGU6ICgpID0+IHt9LFxuICAgICAgfTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgICAgc3RhdGUsXG4gICAgICAgIGlucHV0OiBlbXB0eUZlYXR1cmUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSByb3cgY29udGFpbmVyXG4gICAgY29uc3Qgcm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICByb3cuY2xhc3NOYW1lID0gZ2V0Q2xhc3MoQ09MT1JQSUNLRVJfQ0xBU1NFUy5WQUxVRSk7XG5cbiAgICBsZXQgcHJldmlld0VsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCB0ZXh0ZmllbGRDb21wb25lbnQ6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZVRleHRmaWVsZD4gfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaW5wdXRFbDogSFRNTElucHV0RWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gQ3JlYXRlIHByZXZpZXcgc3F1YXJlXG4gICAgaWYgKHNob3dQcmV2aWV3KSB7XG4gICAgICBwcmV2aWV3RWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgcHJldmlld0VsLmNsYXNzTmFtZSA9IGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuUFJFVklFVyk7XG4gICAgICByb3cuYXBwZW5kQ2hpbGQocHJldmlld0VsKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGV4dGZpZWxkIHN5bmNocm9ub3VzbHlcbiAgICBpZiAoc2hvd0lucHV0KSB7XG4gICAgICB0ZXh0ZmllbGRDb21wb25lbnQgPSBjcmVhdGVUZXh0ZmllbGQoe1xuICAgICAgICB2YXJpYW50OiBcImZpbGxlZFwiLFxuICAgICAgICBkZW5zaXR5OiBcImNvbXBhY3RcIixcbiAgICAgICAgbGFiZWw6IGNvbmZpZy5pbnB1dExhYmVsIHx8IFwiSGV4XCIsXG4gICAgICAgIHZhbHVlOiBzdGF0ZS5oZXgudG9VcHBlckNhc2UoKSxcbiAgICAgICAgbWF4TGVuZ3RoOiA3LFxuICAgICAgICBjbGFzczogZ2V0Q2xhc3MoXCJjb2xvcnBpY2tlcl9fdGV4dGZpZWxkXCIpLFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEdldCB0aGUgYWN0dWFsIGlucHV0IGVsZW1lbnRcbiAgICAgIGlucHV0RWwgPSB0ZXh0ZmllbGRDb21wb25lbnQuaW5wdXQgYXMgSFRNTElucHV0RWxlbWVudDtcblxuICAgICAgLy8gU3R5bGUgYWRqdXN0bWVudHMgZm9yIGNvbG9yIHBpY2tlciBjb250ZXh0XG4gICAgICBpZiAodGV4dGZpZWxkQ29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgdGV4dGZpZWxkQ29tcG9uZW50LmVsZW1lbnQuc3R5bGUuZmxleCA9IFwiMVwiO1xuICAgICAgICByb3cuYXBwZW5kQ2hpbGQodGV4dGZpZWxkQ29tcG9uZW50LmVsZW1lbnQpO1xuXG4gICAgICAgIC8vIEFwcGx5IG1vbm9zcGFjZSBmb250IHRvIGlucHV0XG4gICAgICAgIGlmIChpbnB1dEVsKSB7XG4gICAgICAgICAgaW5wdXRFbC5zdHlsZS5mb250RmFtaWx5ID0gXCJtb25vc3BhY2VcIjtcbiAgICAgICAgICBpbnB1dEVsLnN0eWxlLnRleHRUcmFuc2Zvcm0gPSBcInVwcGVyY2FzZVwiO1xuICAgICAgICAgIGlucHV0RWwuc3BlbGxjaGVjayA9IGZhbHNlO1xuICAgICAgICAgIGlucHV0RWwuYXV0b2NvbXBsZXRlID0gXCJvZmZcIjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgaW5wdXQgY2hhbmdlXG4gICAgICB0ZXh0ZmllbGRDb21wb25lbnQub24oXCJjaGFuZ2VcIiwgaGFuZGxlSW5wdXRDaGFuZ2UpO1xuICAgICAgdGV4dGZpZWxkQ29tcG9uZW50Lm9uKFwiYmx1clwiLCBoYW5kbGVCbHVyKTtcblxuICAgICAgLy8gSGFuZGxlIGtleWRvd24gZm9yIEVudGVyL0VzY2FwZVxuICAgICAgaWYgKGlucHV0RWwpIHtcbiAgICAgICAgaW5wdXRFbC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQocm93KTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhbGwgVUkgZmVhdHVyZXNcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVBbGxVSSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbXBvbmVudC5hcmVhPy51cGRhdGVCYWNrZ3JvdW5kPy4oKTtcbiAgICAgIGNvbXBvbmVudC5hcmVhPy51cGRhdGVIYW5kbGU/LigpO1xuICAgICAgY29tcG9uZW50Lmh1ZT8udXBkYXRlSGFuZGxlPy4oKTtcbiAgICAgIHVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHByZXZpZXcgY29sb3JcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVQcmV2aWV3ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHByZXZpZXdFbCkge1xuICAgICAgICBwcmV2aWV3RWwuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gc3RhdGUuaGV4O1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHRleHRmaWVsZCB2YWx1ZSAob25seSBpZiBub3QgZm9jdXNlZClcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVJbnB1dCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICh0ZXh0ZmllbGRDb21wb25lbnQgJiYgaW5wdXRFbCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSBpbnB1dEVsKSB7XG4gICAgICAgIHRleHRmaWVsZENvbXBvbmVudC5zZXRWYWx1ZShzdGF0ZS5oZXgudG9VcHBlckNhc2UoKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBib3RoIHByZXZpZXcgYW5kIGlucHV0XG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgdXBkYXRlUHJldmlldygpO1xuICAgICAgdXBkYXRlSW5wdXQoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGlucHV0IGNoYW5nZSAoYmx1ciBvciBlbnRlcilcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYW5kbGVJbnB1dENoYW5nZSgpOiB2b2lkIHtcbiAgICAgIGlmICghdGV4dGZpZWxkQ29tcG9uZW50KSByZXR1cm47XG5cbiAgICAgIGxldCB2YWx1ZSA9IHRleHRmaWVsZENvbXBvbmVudC5nZXRWYWx1ZSgpLnRyaW0oKTtcblxuICAgICAgLy8gQWRkICMgaWYgbWlzc2luZ1xuICAgICAgaWYgKHZhbHVlICYmICF2YWx1ZS5zdGFydHNXaXRoKFwiI1wiKSkge1xuICAgICAgICB2YWx1ZSA9IFwiI1wiICsgdmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc1ZhbGlkSGV4KHZhbHVlKSkge1xuICAgICAgICBjb25zdCBoc3YgPSBoZXhUb0hzdih2YWx1ZSk7XG4gICAgICAgIGlmIChoc3YpIHtcbiAgICAgICAgICBzdGF0ZS5oc3YgPSBoc3Y7XG4gICAgICAgICAgc3RhdGUuaGV4ID0gbm9ybWFsaXplSGV4KHZhbHVlKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSBhbGwgVUlcbiAgICAgICAgICB1cGRhdGVBbGxVSSgpO1xuXG4gICAgICAgICAgZW1pdChDT0xPUlBJQ0tFUl9FVkVOVFMuQ0hBTkdFLCBzdGF0ZS5oZXgpO1xuICAgICAgICAgIGNvbmZpZy5vbkNoYW5nZT8uKHN0YXRlLmhleCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJldmVydCB0byBjdXJyZW50IHZhbGlkIGNvbG9yXG4gICAgICAgIHRleHRmaWVsZENvbXBvbmVudC5zZXRWYWx1ZShzdGF0ZS5oZXgudG9VcHBlckNhc2UoKSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGtleWRvd24gb24gaW5wdXRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYW5kbGVLZXlEb3duKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB7XG4gICAgICAgIGhhbmRsZUlucHV0Q2hhbmdlKCk7XG4gICAgICAgIGlucHV0RWw/LmJsdXIoKTtcbiAgICAgIH1cbiAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAvLyBSZXZlcnQgYW5kIGJsdXJcbiAgICAgICAgaWYgKHRleHRmaWVsZENvbXBvbmVudCkge1xuICAgICAgICAgIHRleHRmaWVsZENvbXBvbmVudC5zZXRWYWx1ZShzdGF0ZS5oZXgudG9VcHBlckNhc2UoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaW5wdXRFbD8uYmx1cigpO1xuICAgICAgICAvLyBDbG9zZSBkcm9wZG93bi9kaWFsb2cgaWYgZXhpc3RzXG4gICAgICAgIGlmIChjb21wb25lbnQudmFyaWFudCkge1xuICAgICAgICAgIGNvbXBvbmVudC52YXJpYW50LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgYmx1ciBvbiBpbnB1dFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGhhbmRsZUJsdXIoKTogdm9pZCB7XG4gICAgICBoYW5kbGVJbnB1dENoYW5nZSgpO1xuICAgIH1cblxuICAgIC8vIEluaXRpYWwgcmVuZGVyXG4gICAgdXBkYXRlUHJldmlldygpO1xuXG4gICAgLy8gQ3JlYXRlIGlucHV0IGZlYXR1cmUgb2JqZWN0XG4gICAgY29uc3QgaW5wdXRGZWF0dXJlOiBJbnB1dEZlYXR1cmUgPSB7XG4gICAgICBlbGVtZW50OiByb3csXG4gICAgICB0ZXh0ZmllbGQ6IHRleHRmaWVsZENvbXBvbmVudCxcbiAgICAgIHByZXZpZXc6IHByZXZpZXdFbCxcbiAgICAgIHVwZGF0ZSxcbiAgICB9O1xuXG4gICAgLy8gUmVnaXN0ZXIgaW4gcmVmcyBmb3IgY3Jvc3MtZmVhdHVyZSBhY2Nlc3NcbiAgICBzdGF0ZS5yZWZzLmlucHV0ID0geyB1cGRhdGUgfTtcblxuICAgIC8vIEV4dGVuZCBsaWZlY3ljbGUgZGVzdHJveSBpZiBpdCBleGlzdHNcbiAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSAoY29tcG9uZW50IGFzIGFueSkubGlmZWN5Y2xlPy5kZXN0cm95O1xuICAgIGlmIChvcmlnaW5hbERlc3Ryb3kpIHtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgaWYgKGlucHV0RWwpIHtcbiAgICAgICAgICBpbnB1dEVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0ZmllbGRDb21wb25lbnQpIHtcbiAgICAgICAgICB0ZXh0ZmllbGRDb21wb25lbnQuZGVzdHJveSgpO1xuICAgICAgICB9XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveSgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgc3RhdGUsXG4gICAgICBpbnB1dDogaW5wdXRGZWF0dXJlLFxuICAgIH07XG4gIH07XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2NvbG9ycGlja2VyL2ZlYXR1cmVzL3ZhcmlhbnQudHNcblxuaW1wb3J0IHtcbiAgQ09MT1JQSUNLRVJfQ0xBU1NFUyxcbiAgQ09MT1JQSUNLRVJfRVZFTlRTLFxuICBDT0xPUlBJQ0tFUl9WQVJJQU5UUyxcbn0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ29sb3JQaWNrZXJDb25maWcsIENvbG9yUGlja2VyU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUluaXRpYWxTdGF0ZSB9IGZyb20gXCIuLi9jb25maWdcIjtcblxuLyoqXG4gKiBWYXJpYW50IGZlYXR1cmUgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFyaWFudEZlYXR1cmUge1xuICBiYWNrZHJvcDogSFRNTEVsZW1lbnQgfCBudWxsO1xuICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICBvcGVuOiAoKSA9PiB2b2lkO1xuICBjbG9zZTogKCkgPT4gdm9pZDtcbiAgdG9nZ2xlOiAoKSA9PiB2b2lkO1xuICBpc09wZW46ICgpID0+IGJvb2xlYW47XG4gIHBvc2l0aW9uOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIEFkZHMgdmFyaWFudC1zcGVjaWZpYyBiZWhhdmlvciAoZHJvcGRvd24vZGlhbG9nKSB0byBhIGNvbG9yIHBpY2tlciBjb21wb25lbnQuXG4gKiBIYW5kbGVzIHBvc2l0aW9uaW5nLCBvcGVuL2Nsb3NlLCBiYWNrZHJvcCwgYW5kIGV2ZW50IG1hbmFnZW1lbnQgdGhhdCBDU1MgY2Fubm90IGhhbmRsZS5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29sb3IgcGlja2VyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIENvbXBvbmVudCBlbmhhbmNlciBmdW5jdGlvblxuICovXG5leHBvcnQgY29uc3Qgd2l0aFZhcmlhbnQgPVxuICAoY29uZmlnOiBDb2xvclBpY2tlckNvbmZpZykgPT5cbiAgPFxuICAgIFQgZXh0ZW5kcyB7XG4gICAgICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICAgIGdldENsYXNzOiAobmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XG4gICAgICBlbWl0OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBzdGF0ZT86IENvbG9yUGlja2VyU3RhdGU7XG4gICAgfSxcbiAgPihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7XG4gICAgdmFyaWFudDogVmFyaWFudEZlYXR1cmU7XG4gICAgcGlja2VyQ29udGVudDogSFRNTEVsZW1lbnQ7XG4gICAgc3RhdGU6IENvbG9yUGlja2VyU3RhdGU7XG4gIH0gPT4ge1xuICAgIGNvbnN0IHsgZWxlbWVudCwgZ2V0Q2xhc3MsIGVtaXQgfSA9IGNvbXBvbmVudDtcblxuICAgIC8vIEluaXRpYWxpemUgc3RhdGUgaWYgbm90IHByZXNlbnRcbiAgICBjb25zdCBzdGF0ZTogQ29sb3JQaWNrZXJTdGF0ZSA9XG4gICAgICBjb21wb25lbnQuc3RhdGUgfHwgY3JlYXRlSW5pdGlhbFN0YXRlKGNvbmZpZyk7XG5cbiAgICBjb25zdCB2YXJpYW50VHlwZSA9IGNvbmZpZy52YXJpYW50IHx8IENPTE9SUElDS0VSX1ZBUklBTlRTLklOTElORTtcblxuICAgIC8vIE9ubHkgYXBwbHkgdmFyaWFudCBiZWhhdmlvciBmb3IgZHJvcGRvd24vZGlhbG9nIHZhcmlhbnRzXG4gICAgY29uc3QgbmVlZHNWYXJpYW50QmVoYXZpb3IgPVxuICAgICAgdmFyaWFudFR5cGUgPT09IENPTE9SUElDS0VSX1ZBUklBTlRTLkRST1BET1dOIHx8XG4gICAgICB2YXJpYW50VHlwZSA9PT0gQ09MT1JQSUNLRVJfVkFSSUFOVFMuRElBTE9HO1xuXG4gICAgaWYgKCFuZWVkc1ZhcmlhbnRCZWhhdmlvcikge1xuICAgICAgLy8gUmV0dXJuIGEgbm8tb3AgdmFyaWFudCBmZWF0dXJlIGZvciBpbmxpbmUgdmFyaWFudFxuICAgICAgY29uc3Qgbm9vcEZlYXR1cmU6IFZhcmlhbnRGZWF0dXJlID0ge1xuICAgICAgICBiYWNrZHJvcDogbnVsbCxcbiAgICAgICAgY29udGFpbmVyOiBlbGVtZW50LFxuICAgICAgICBvcGVuOiAoKSA9PiB7fSxcbiAgICAgICAgY2xvc2U6ICgpID0+IHt9LFxuICAgICAgICB0b2dnbGU6ICgpID0+IHt9LFxuICAgICAgICBpc09wZW46ICgpID0+IHRydWUsXG4gICAgICAgIHBvc2l0aW9uOiAoKSA9PiB7fSxcbiAgICAgIH07XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb21wb25lbnQsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBwaWNrZXJDb250ZW50OiBlbGVtZW50LFxuICAgICAgICB2YXJpYW50OiBub29wRmVhdHVyZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGJhY2tkcm9wIChmb3IgZGlhbG9nIG9yIGNsaWNrLW91dHNpZGUgZGV0ZWN0aW9uKVxuICAgIGNvbnN0IGJhY2tkcm9wID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBiYWNrZHJvcC5jbGFzc05hbWUgPSBnZXRDbGFzcyhDT0xPUlBJQ0tFUl9DTEFTU0VTLkJBQ0tEUk9QKTtcbiAgICBlbGVtZW50Lmluc2VydEJlZm9yZShiYWNrZHJvcCwgZWxlbWVudC5maXJzdENoaWxkKTtcblxuICAgIC8vIENyZWF0ZSBjb250YWluZXIgZm9yIHBpY2tlciBjb250ZW50XG4gICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb250YWluZXIuY2xhc3NOYW1lID0gZ2V0Q2xhc3MoQ09MT1JQSUNLRVJfQ0xBU1NFUy5DT05UQUlORVIpO1xuXG4gICAgLy8gQWRkIGNvbnRhaW5lciB0byBlbGVtZW50XG4gICAgZWxlbWVudC5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuXG4gICAgLy8gQXBwZW5kIHRvIGJvZHkgZm9yIHByb3BlciBwb3NpdGlvbmluZ1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG5cbiAgICAvKipcbiAgICAgKiBQb3NpdGlvbiB0aGUgY29udGFpbmVyIHJlbGF0aXZlIHRvIHRyaWdnZXIgKGRyb3Bkb3duKSBvciBjZW50ZXIgKGRpYWxvZylcbiAgICAgKi9cbiAgICBjb25zdCBwb3NpdGlvbiA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICghY29uZmlnLnRyaWdnZXIpIHJldHVybjtcblxuICAgICAgY29uc3QgdHJpZ2dlclJlY3QgPSBjb25maWcudHJpZ2dlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHZpZXdwb3J0V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcbiAgICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgICAgY29uc3QgbWFyZ2luID0gNDtcblxuICAgICAgaWYgKHZhcmlhbnRUeXBlID09PSBDT0xPUlBJQ0tFUl9WQVJJQU5UUy5ESUFMT0cpIHtcbiAgICAgICAgLy8gQ2VudGVyIG9uIHNjcmVlblxuICAgICAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcImZpeGVkXCI7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gYCR7KHZpZXdwb3J0V2lkdGggLSBjb250YWluZXJSZWN0LndpZHRoKSAvIDJ9cHhgO1xuICAgICAgICBjb250YWluZXIuc3R5bGUudG9wID0gYCR7KHZpZXdwb3J0SGVpZ2h0IC0gY29udGFpbmVyUmVjdC5oZWlnaHQpIC8gMn1weGA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEcm9wZG93biBwb3NpdGlvbmluZ1xuICAgICAgICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcImZpeGVkXCI7XG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS53aWR0aCA9IGAke3RyaWdnZXJSZWN0LndpZHRofXB4YDtcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLm1pbldpZHRoID0gYCR7dHJpZ2dlclJlY3Qud2lkdGh9cHhgO1xuXG4gICAgICAgIC8vIEhvcml6b250YWw6IGFsaWduIHdpdGggdHJpZ2dlciBsZWZ0IGVkZ2VcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLmxlZnQgPSBgJHt0cmlnZ2VyUmVjdC5sZWZ0fXB4YDtcblxuICAgICAgICAvLyBNZWFzdXJlIGNvbnRhaW5lciBoZWlnaHQgYWZ0ZXIgc2V0dGluZyB3aWR0aFxuICAgICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIC8vIFZlcnRpY2FsOiBwcmVmZXIgYmVsb3cgdHJpZ2dlciwgYnV0IGZsaXAgYWJvdmUgaWYgbm8gc3BhY2VcbiAgICAgICAgY29uc3Qgc3BhY2VCZWxvdyA9IHZpZXdwb3J0SGVpZ2h0IC0gdHJpZ2dlclJlY3QuYm90dG9tIC0gbWFyZ2luO1xuICAgICAgICBjb25zdCBzcGFjZUFib3ZlID0gdHJpZ2dlclJlY3QudG9wIC0gbWFyZ2luO1xuXG4gICAgICAgIC8vIFJlbW92ZSBwb3NpdGlvbiBjbGFzcyBmaXJzdFxuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoZ2V0Q2xhc3MoXCJjb2xvcnBpY2tlci0tcG9zaXRpb24tdG9wXCIpKTtcblxuICAgICAgICBpZiAoc3BhY2VCZWxvdyA8IGNvbnRhaW5lclJlY3QuaGVpZ2h0ICYmIHNwYWNlQWJvdmUgPiBzcGFjZUJlbG93KSB7XG4gICAgICAgICAgLy8gUG9zaXRpb24gYWJvdmVcbiAgICAgICAgICBjb25zdCB0b3AgPSB0cmlnZ2VyUmVjdC50b3AgLSBjb250YWluZXJSZWN0LmhlaWdodCAtIG1hcmdpbjtcbiAgICAgICAgICBjb250YWluZXIuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJjb2xvcnBpY2tlci0tcG9zaXRpb24tdG9wXCIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQb3NpdGlvbiBiZWxvd1xuICAgICAgICAgIGNvbnN0IHRvcCA9IHRyaWdnZXJSZWN0LmJvdHRvbSArIG1hcmdpbjtcbiAgICAgICAgICBjb250YWluZXIuc3R5bGUudG9wID0gYCR7dG9wfXB4YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBPcGVuIHRoZSBwaWNrZXJcbiAgICAgKi9cbiAgICBjb25zdCBvcGVuID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHN0YXRlLmlzT3BlbiB8fCBjb25maWcuZGlzYWJsZWQpIHJldHVybjtcblxuICAgICAgc3RhdGUuaXNPcGVuID0gdHJ1ZTtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhDT0xPUlBJQ0tFUl9DTEFTU0VTLk9QRU4pKTtcblxuICAgICAgLy8gUG9zaXRpb24gYWZ0ZXIgYWRkaW5nIG9wZW4gY2xhc3MgKHNvIHdlIGNhbiBtZWFzdXJlKVxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgcG9zaXRpb24oKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBBZGQgZG9jdW1lbnQgY2xpY2sgbGlzdGVuZXIgYWZ0ZXIgYSBzaG9ydCBkZWxheSAobGlrZSBtZW51IGRvZXMpXG4gICAgICAvLyB0byBhdm9pZCBjbG9zaW5nIGltbWVkaWF0ZWx5IGZyb20gdGhlIHNhbWUgY2xpY2sgdGhhdCBvcGVuZWQgaXRcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoc3RhdGUuaXNPcGVuKSB7XG4gICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZURvY3VtZW50Q2xpY2spO1xuICAgICAgICB9XG4gICAgICB9LCAwKTtcblxuICAgICAgZW1pdChDT0xPUlBJQ0tFUl9FVkVOVFMuT1BFTik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENsb3NlIHRoZSBwaWNrZXJcbiAgICAgKi9cbiAgICBjb25zdCBjbG9zZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICghc3RhdGUuaXNPcGVuKSByZXR1cm47XG5cbiAgICAgIHN0YXRlLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuT1BFTikpO1xuXG4gICAgICAvLyBSZW1vdmUgZG9jdW1lbnQgY2xpY2sgbGlzdGVuZXJcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVEb2N1bWVudENsaWNrKTtcblxuICAgICAgZW1pdChDT0xPUlBJQ0tFUl9FVkVOVFMuQ0xPU0UpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBUb2dnbGUgb3Blbi9jbG9zZWRcbiAgICAgKi9cbiAgICBjb25zdCB0b2dnbGUgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoc3RhdGUuaXNPcGVuKSB7XG4gICAgICAgIGNsb3NlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcGVuKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENoZWNrIGlmIG9wZW5cbiAgICAgKi9cbiAgICBjb25zdCBpc09wZW4gPSAoKTogYm9vbGVhbiA9PiBzdGF0ZS5pc09wZW47XG5cbiAgICAvLyA9PT09PT09PT09PT09IEV2ZW50IEhhbmRsZXJzID09PT09PT09PT09PT1cblxuICAgIGNvbnN0IGhhbmRsZVRyaWdnZXJDbGljayA9IChlOiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgdG9nZ2xlKCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZUJhY2tkcm9wQ2xpY2sgPSAoZTogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGUudGFyZ2V0ID09PSBiYWNrZHJvcCkge1xuICAgICAgICBjbG9zZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVEb2N1bWVudENsaWNrID0gKGU6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIC8vIERvbid0IGNsb3NlIGlmIGNsaWNrZWQgaW5zaWRlIHRoZSBwaWNrZXIgY29udGFpbmVyXG4gICAgICBpZiAoY29udGFpbmVyLmNvbnRhaW5zKGUudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRG9uJ3QgY2xvc2UgaWYgY2xpY2tlZCBvbiB0aGUgdHJpZ2dlclxuICAgICAgaWYgKGNvbmZpZy50cmlnZ2VyICYmIGNvbmZpZy50cmlnZ2VyLmNvbnRhaW5zKGUudGFyZ2V0IGFzIE5vZGUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xvc2UgdGhlIHBpY2tlclxuICAgICAgY2xvc2UoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlOiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIgJiYgc3RhdGUuaXNPcGVuKSB7XG4gICAgICAgIGNsb3NlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVJlc2l6ZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChzdGF0ZS5pc09wZW4pIHtcbiAgICAgICAgcG9zaXRpb24oKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlU2Nyb2xsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHN0YXRlLmlzT3BlbiAmJiB2YXJpYW50VHlwZSA9PT0gQ09MT1JQSUNLRVJfVkFSSUFOVFMuRFJPUERPV04pIHtcbiAgICAgICAgcG9zaXRpb24oKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gPT09PT09PT09PT09PSBBdHRhY2ggRXZlbnQgTGlzdGVuZXJzID09PT09PT09PT09PT1cblxuICAgIGlmIChjb25maWcudHJpZ2dlcikge1xuICAgICAgY29uZmlnLnRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZVRyaWdnZXJDbGljayk7XG4gICAgfVxuXG4gICAgYmFja2Ryb3AuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUJhY2tkcm9wQ2xpY2spO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24pO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIGhhbmRsZVJlc2l6ZSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgaGFuZGxlU2Nyb2xsLCB0cnVlKTtcblxuICAgIC8vIENyZWF0ZSB2YXJpYW50IGZlYXR1cmUgb2JqZWN0XG4gICAgY29uc3QgdmFyaWFudEZlYXR1cmU6IFZhcmlhbnRGZWF0dXJlID0ge1xuICAgICAgYmFja2Ryb3AsXG4gICAgICBjb250YWluZXIsXG4gICAgICBvcGVuLFxuICAgICAgY2xvc2UsXG4gICAgICB0b2dnbGUsXG4gICAgICBpc09wZW4sXG4gICAgICBwb3NpdGlvbixcbiAgICB9O1xuXG4gICAgLy8gRXh0ZW5kIGxpZmVjeWNsZSBkZXN0cm95IGlmIGl0IGV4aXN0c1xuICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IChjb21wb25lbnQgYXMgYW55KS5saWZlY3ljbGU/LmRlc3Ryb3k7XG4gICAgaWYgKG9yaWdpbmFsRGVzdHJveSkge1xuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmxpZmVjeWNsZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICBpZiAoY29uZmlnLnRyaWdnZXIpIHtcbiAgICAgICAgICBjb25maWcudHJpZ2dlci5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlVHJpZ2dlckNsaWNrKTtcbiAgICAgICAgfVxuICAgICAgICBiYWNrZHJvcC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlQmFja2Ryb3BDbGljayk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVEb2N1bWVudENsaWNrKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93bik7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIGhhbmRsZVJlc2l6ZSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGhhbmRsZVNjcm9sbCwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBvcmlnaW5hbERlc3Ryb3koKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHN0YXRlLFxuICAgICAgcGlja2VyQ29udGVudDogY29udGFpbmVyLFxuICAgICAgdmFyaWFudDogdmFyaWFudEZlYXR1cmUsXG4gICAgfTtcbiAgfTtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvY29sb3JwaWNrZXIvZmVhdHVyZXMvcGlwZXR0ZS50c1xuXG5pbXBvcnQgeyBjcmVhdGVJY29uQnV0dG9uIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IENPTE9SUElDS0VSX0VWRU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbG9yUGlja2VyQ29uZmlnLCBDb2xvclBpY2tlclN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyByZ2JUb0hleCwgaGV4VG9Ic3YgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUluaXRpYWxTdGF0ZSB9IGZyb20gXCIuLi9jb25maWdcIjtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgbmF0aXZlIEV5ZURyb3BwZXIgQVBJIGlzIHN1cHBvcnRlZFxuICovXG5leHBvcnQgY29uc3QgaXNFeWVEcm9wcGVyU3VwcG9ydGVkID0gKCk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gXCJFeWVEcm9wcGVyXCIgaW4gd2luZG93O1xufTtcblxuLyoqXG4gKiBQaXBldHRlIGZlYXR1cmUgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZXR0ZUZlYXR1cmUge1xuICAvKiogVGhlIHBpcGV0dGUgYnV0dG9uIGVsZW1lbnQgKi9cbiAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gIC8qKiBTdGFydCBwaXBldHRlIHNhbXBsaW5nICovXG4gIHBpY2s6ICgpID0+IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIC8qKiBTZXQgdGhlIGltYWdlIHNvdXJjZSBmb3IgY2FudmFzIGZhbGxiYWNrICovXG4gIHNldEltYWdlU291cmNlOiAoc291cmNlOiBIVE1MSW1hZ2VFbGVtZW50IHwgc3RyaW5nIHwgbnVsbCkgPT4gdm9pZDtcbiAgLyoqIENoZWNrIGlmIGN1cnJlbnRseSBzYW1wbGluZyAqL1xuICBpc1NhbXBsaW5nOiAoKSA9PiBib29sZWFuO1xuICAvKiogRGVzdHJveSBhbmQgY2xlYW51cCAqL1xuICBkZXN0cm95OiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBpcGV0dGUgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZXR0ZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIHBpcGV0dGUgYnV0dG9uXG4gICAqIEBkZWZhdWx0IHRydWUgKHdoZW4gc3VwcG9ydGVkIG9yIGltYWdlU291cmNlIHByb3ZpZGVkKVxuICAgKi9cbiAgc2hvd1BpcGV0dGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbWFnZSBzb3VyY2UgZm9yIGNhbnZhcy1iYXNlZCBmYWxsYmFjayBzYW1wbGluZ1xuICAgKiBDYW4gYmUgYW4gSFRNTEltYWdlRWxlbWVudCwgVVJMIHN0cmluZywgb3IgbnVsbFxuICAgKi9cbiAgaW1hZ2VTb3VyY2U/OiBIVE1MSW1hZ2VFbGVtZW50IHwgc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiBwaXBldHRlIHNhbXBsaW5nIHN0YXJ0c1xuICAgKi9cbiAgb25QaXBldHRlU3RhcnQ/OiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB3aGVuIHBpcGV0dGUgc2FtcGxpbmcgZW5kc1xuICAgKi9cbiAgb25QaXBldHRlRW5kPzogKGNvbG9yOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkO1xufVxuXG4vLyBFeHRlbmQgQ29sb3JQaWNrZXJDb25maWcgdG8gaW5jbHVkZSBwaXBldHRlIG9wdGlvbnNcbmRlY2xhcmUgbW9kdWxlIFwiLi4vdHlwZXNcIiB7XG4gIGludGVyZmFjZSBDb2xvclBpY2tlckNvbmZpZyBleHRlbmRzIFBpcGV0dGVDb25maWcge31cbn1cblxuLyoqXG4gKiBQaXBldHRlIGljb24gU1ZHIHBhdGhcbiAqL1xuY29uc3QgUElQRVRURV9JQ09OID0gYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCI+XG4gIDxwYXRoIGQ9XCJNMjAuNzEgNS42M2wtMi4zNC0yLjM0YTEgMSAwIDAgMC0xLjQxIDBsLTMuMTIgMy4xMi0xLjQxLTEuNDEtMS40MiAxLjQxIDEuNDIgMS40Mi04LjI5IDguMjlhMSAxIDAgMCAwLS4yOS43VjE5YTEgMSAwIDAgMCAxIDFoMi4xN2ExIDEgMCAwIDAgLjcxLS4yOWw4LjI5LTguMjkgMS40MSAxLjQxIDEuNDEtMS40MS0xLjQxLTEuNDEgMy4xMi0zLjEyYTEgMSAwIDAgMCAuMTYtMS4yNnpNNi40MSAxOUg1di0xLjQxbDguMjktOC4yOSAxLjQxIDEuNDF6XCIvPlxuPC9zdmc+YDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2FudmFzLWJhc2VkIGNvbG9yIHNhbXBsZXIgZm9yIGFuIGltYWdlXG4gKi9cbmNsYXNzIENhbnZhc1NhbXBsZXIge1xuICBwcml2YXRlIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIHByaXZhdGUgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gIHByaXZhdGUgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBvdmVybGF5OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1hZ25pZmllcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjcm9zc2hhaXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29sb3JQcmV2aWV3OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlzQWN0aXZlID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb2x2ZVByb21pc2U6ICgoY29sb3I6IHN0cmluZyB8IG51bGwpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYm91bmRNb3VzZU1vdmU6IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIGJvdW5kTW91c2VEb3duOiAoZTogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBib3VuZEtleURvd246IChlOiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIGJvdW5kVG91Y2hNb3ZlOiAoZTogVG91Y2hFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBib3VuZFRvdWNoRW5kOiAoZTogVG91Y2hFdmVudCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIiwgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSkhO1xuXG4gICAgdGhpcy5ib3VuZE1vdXNlTW92ZSA9IHRoaXMuaGFuZGxlTW91c2VNb3ZlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5ib3VuZE1vdXNlRG93biA9IHRoaXMuaGFuZGxlTW91c2VEb3duLmJpbmQodGhpcyk7XG4gICAgdGhpcy5ib3VuZEtleURvd24gPSB0aGlzLmhhbmRsZUtleURvd24uYmluZCh0aGlzKTtcbiAgICB0aGlzLmJvdW5kVG91Y2hNb3ZlID0gdGhpcy5oYW5kbGVUb3VjaE1vdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmJvdW5kVG91Y2hFbmQgPSB0aGlzLmhhbmRsZVRvdWNoRW5kLmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBpbWFnZSB0byBzYW1wbGUgZnJvbVxuICAgKi9cbiAgc2V0SW1hZ2Uoc291cmNlOiBIVE1MSW1hZ2VFbGVtZW50IHwgc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgIGlmIChzb3VyY2UuY29tcGxldGUgJiYgc291cmNlLm5hdHVyYWxXaWR0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmltYWdlID0gc291cmNlO1xuICAgICAgICAgIHRoaXMuZHJhd1RvQ2FudmFzKCk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvdXJjZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmltYWdlID0gc291cmNlO1xuICAgICAgICAgICAgdGhpcy5kcmF3VG9DYW52YXMoKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHNvdXJjZS5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5jcm9zc09yaWdpbiA9IFwiYW5vbnltb3VzXCI7XG4gICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbWFnZSA9IGltZztcbiAgICAgICAgICB0aGlzLmRyYXdUb0NhbnZhcygpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW1nLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgIGltZy5zcmMgPSBzb3VyY2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBpbWFnZSBzb3VyY2VcIikpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIGltYWdlIHRvIHRoZSBpbnRlcm5hbCBjYW52YXNcbiAgICovXG4gIHByaXZhdGUgZHJhd1RvQ2FudmFzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbWFnZSkgcmV0dXJuO1xuICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy5pbWFnZS5uYXR1cmFsV2lkdGg7XG4gICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gdGhpcy5pbWFnZS5uYXR1cmFsSGVpZ2h0O1xuICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLmltYWdlLCAwLCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbG9yIGF0IGEgc3BlY2lmaWMgcG9zaXRpb24gaW4gdGhlIGltYWdlXG4gICAqL1xuICBnZXRDb2xvckF0KHg6IG51bWJlciwgeTogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmltYWdlKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENsYW1wIGNvb3JkaW5hdGVzIHRvIGltYWdlIGJvdW5kc1xuICAgIGNvbnN0IGNsYW1wZWRYID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oeCwgdGhpcy5jYW52YXMud2lkdGggLSAxKSk7XG4gICAgY29uc3QgY2xhbXBlZFkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih5LCB0aGlzLmNhbnZhcy5oZWlnaHQgLSAxKSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGl4ZWwgPSB0aGlzLmN0eC5nZXRJbWFnZURhdGEoY2xhbXBlZFgsIGNsYW1wZWRZLCAxLCAxKS5kYXRhO1xuICAgICAgcmV0dXJuIHJnYlRvSGV4KHBpeGVsWzBdLCBwaXhlbFsxXSwgcGl4ZWxbMl0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBnZXQgcGl4ZWwgY29sb3IgKENPUlMgaXNzdWU/KTpcIiwgZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBzYW1wbGluZyBvdmVybGF5IFVJXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZU92ZXJsYXkoKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGZ1bGxzY3JlZW4gb3ZlcmxheVxuICAgIHRoaXMub3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5vdmVybGF5LmNsYXNzTmFtZSA9IFwibXRybC1waXBldHRlLW92ZXJsYXlcIjtcbiAgICB0aGlzLm92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHRvcDogMDtcbiAgICAgIGxlZnQ6IDA7XG4gICAgICB3aWR0aDogMTAwdnc7XG4gICAgICBoZWlnaHQ6IDEwMHZoO1xuICAgICAgei1pbmRleDogMTAwMDA7XG4gICAgICBjdXJzb3I6IGNyb3NzaGFpcjtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYDtcblxuICAgIC8vIENyZWF0ZSBpbWFnZSBjb250YWluZXJcbiAgICBjb25zdCBpbWFnZUNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgaW1hZ2VDb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIG1heC13aWR0aDogOTB2dztcbiAgICAgIG1heC1oZWlnaHQ6IDkwdmg7XG4gICAgICBib3gtc2hhZG93OiAwIDhweCAzMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYDtcblxuICAgIC8vIENsb25lIGFuZCBkaXNwbGF5IHRoZSBpbWFnZVxuICAgIGNvbnN0IGRpc3BsYXlJbWFnZSA9IHRoaXMuaW1hZ2UhLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGRpc3BsYXlJbWFnZS5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBtYXgtd2lkdGg6IDkwdnc7XG4gICAgICBtYXgtaGVpZ2h0OiA5MHZoO1xuICAgICAgb2JqZWN0LWZpdDogY29udGFpbjtcbiAgICBgO1xuICAgIGRpc3BsYXlJbWFnZS5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICBpbWFnZUNvbnRhaW5lci5hcHBlbmRDaGlsZChkaXNwbGF5SW1hZ2UpO1xuXG4gICAgLy8gQ3JlYXRlIGNyb3NzaGFpclxuICAgIHRoaXMuY3Jvc3NoYWlyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLmNyb3NzaGFpci5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICBib3JkZXI6IDJweCBzb2xpZCB3aGl0ZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMyksIGluc2V0IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMyk7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICBgO1xuICAgIGltYWdlQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY3Jvc3NoYWlyKTtcblxuICAgIC8vIENyZWF0ZSBtYWduaWZpZXIgKG9wdGlvbmFsIHpvb20gcHJldmlldylcbiAgICB0aGlzLm1hZ25pZmllciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5tYWduaWZpZXIuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHdpZHRoOiA4MHB4O1xuICAgICAgaGVpZ2h0OiA4MHB4O1xuICAgICAgYm9yZGVyOiAzcHggc29saWQgd2hpdGU7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IDQwMCU7XG4gICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7XG4gICAgYDtcbiAgICBpbWFnZUNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm1hZ25pZmllcik7XG5cbiAgICAvLyBDcmVhdGUgY29sb3IgcHJldmlld1xuICAgIHRoaXMuY29sb3JQcmV2aWV3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLmNvbG9yUHJldmlldy5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgYm90dG9tOiAyMHB4O1xuICAgICAgbGVmdDogNTAlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDEycHg7XG4gICAgICBwYWRkaW5nOiAxMnB4IDIwcHg7XG4gICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDI0cHg7XG4gICAgICBib3gtc2hhZG93OiAwIDRweCAyMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWksIHNhbnMtc2VyaWY7XG4gICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgYDtcblxuICAgIGNvbnN0IGNvbG9yU3dhdGNoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb2xvclN3YXRjaC5jbGFzc05hbWUgPSBcInBpcGV0dGUtc3dhdGNoXCI7XG4gICAgY29sb3JTd2F0Y2guc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgIHdpZHRoOiAzMnB4O1xuICAgICAgaGVpZ2h0OiAzMnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgYm9yZGVyOiAycHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpO1xuICAgIGA7XG5cbiAgICBjb25zdCBjb2xvclRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBjb2xvclRleHQuY2xhc3NOYW1lID0gXCJwaXBldHRlLXRleHRcIjtcbiAgICBjb2xvclRleHQudGV4dENvbnRlbnQgPSBcIkNsaWNrIHRvIHNlbGVjdCBjb2xvclwiO1xuICAgIGNvbG9yVGV4dC5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcbiAgICAgIG1pbi13aWR0aDogNzBweDtcbiAgICBgO1xuXG4gICAgY29uc3QgaGVscFRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBoZWxwVGV4dC50ZXh0Q29udGVudCA9IFwiRVNDIHRvIGNhbmNlbFwiO1xuICAgIGhlbHBUZXh0LnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICBjb2xvcjogIzY2NjtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBgO1xuXG4gICAgdGhpcy5jb2xvclByZXZpZXcuYXBwZW5kQ2hpbGQoY29sb3JTd2F0Y2gpO1xuICAgIHRoaXMuY29sb3JQcmV2aWV3LmFwcGVuZENoaWxkKGNvbG9yVGV4dCk7XG4gICAgdGhpcy5jb2xvclByZXZpZXcuYXBwZW5kQ2hpbGQoaGVscFRleHQpO1xuXG4gICAgdGhpcy5vdmVybGF5LmFwcGVuZENoaWxkKGltYWdlQ29udGFpbmVyKTtcbiAgICB0aGlzLm92ZXJsYXkuYXBwZW5kQ2hpbGQodGhpcy5jb2xvclByZXZpZXcpO1xuXG4gICAgLy8gU3RvcmUgcmVmZXJlbmNlIHRvIGltYWdlIGNvbnRhaW5lciBmb3IgY29vcmRpbmF0ZSBjYWxjdWxhdGlvbnNcbiAgICAodGhpcy5vdmVybGF5IGFzIGFueSkuX2ltYWdlQ29udGFpbmVyID0gaW1hZ2VDb250YWluZXI7XG4gICAgKHRoaXMub3ZlcmxheSBhcyBhbnkpLl9kaXNwbGF5SW1hZ2UgPSBkaXNwbGF5SW1hZ2U7XG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMub3ZlcmxheSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBzYW1wbGluZyBvdmVybGF5XG4gICAqL1xuICBwcml2YXRlIHJlbW92ZU92ZXJsYXkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3ZlcmxheSkge1xuICAgICAgdGhpcy5vdmVybGF5LnJlbW92ZSgpO1xuICAgICAgdGhpcy5vdmVybGF5ID0gbnVsbDtcbiAgICAgIHRoaXMubWFnbmlmaWVyID0gbnVsbDtcbiAgICAgIHRoaXMuY3Jvc3NoYWlyID0gbnVsbDtcbiAgICAgIHRoaXMuY29sb3JQcmV2aWV3ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGltYWdlIGNvb3JkaW5hdGVzIGZyb20gbW91c2UgZXZlbnRcbiAgICovXG4gIHByaXZhdGUgZ2V0SW1hZ2VDb29yZGluYXRlcyhcbiAgICBjbGllbnRYOiBudW1iZXIsXG4gICAgY2xpZW50WTogbnVtYmVyLFxuICApOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBpbWFnZVg6IG51bWJlcjsgaW1hZ2VZOiBudW1iZXIgfSB8IG51bGwge1xuICAgIGlmICghdGhpcy5vdmVybGF5IHx8ICF0aGlzLmltYWdlKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGRpc3BsYXlJbWFnZSA9ICh0aGlzLm92ZXJsYXkgYXMgYW55KVxuICAgICAgLl9kaXNwbGF5SW1hZ2UgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCByZWN0ID0gZGlzcGxheUltYWdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgbW91c2UgaXMgb3ZlciB0aGUgaW1hZ2VcbiAgICBpZiAoXG4gICAgICBjbGllbnRYIDwgcmVjdC5sZWZ0IHx8XG4gICAgICBjbGllbnRYID4gcmVjdC5yaWdodCB8fFxuICAgICAgY2xpZW50WSA8IHJlY3QudG9wIHx8XG4gICAgICBjbGllbnRZID4gcmVjdC5ib3R0b21cbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbiByZWxhdGl2ZSB0byBpbWFnZVxuICAgIGNvbnN0IHggPSBjbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIGNvbnN0IHkgPSBjbGllbnRZIC0gcmVjdC50b3A7XG5cbiAgICAvLyBTY2FsZSB0byBhY3R1YWwgaW1hZ2UgZGltZW5zaW9uc1xuICAgIGNvbnN0IHNjYWxlWCA9IHRoaXMuaW1hZ2UubmF0dXJhbFdpZHRoIC8gcmVjdC53aWR0aDtcbiAgICBjb25zdCBzY2FsZVkgPSB0aGlzLmltYWdlLm5hdHVyYWxIZWlnaHQgLyByZWN0LmhlaWdodDtcbiAgICBjb25zdCBpbWFnZVggPSBNYXRoLmZsb29yKHggKiBzY2FsZVgpO1xuICAgIGNvbnN0IGltYWdlWSA9IE1hdGguZmxvb3IoeSAqIHNjYWxlWSk7XG5cbiAgICByZXR1cm4geyB4LCB5LCBpbWFnZVgsIGltYWdlWSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgVUkgZHVyaW5nIHNhbXBsaW5nXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVNhbXBsaW5nVUkoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjb29yZHMgPSB0aGlzLmdldEltYWdlQ29vcmRpbmF0ZXMoY2xpZW50WCwgY2xpZW50WSk7XG5cbiAgICBpZiAoIWNvb3Jkcykge1xuICAgICAgaWYgKHRoaXMuY3Jvc3NoYWlyKSB0aGlzLmNyb3NzaGFpci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICBpZiAodGhpcy5tYWduaWZpZXIpIHRoaXMubWFnbmlmaWVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb2xvciA9IHRoaXMuZ2V0Q29sb3JBdChjb29yZHMuaW1hZ2VYLCBjb29yZHMuaW1hZ2VZKTtcblxuICAgIC8vIFVwZGF0ZSBjcm9zc2hhaXIgcG9zaXRpb25cbiAgICBpZiAodGhpcy5jcm9zc2hhaXIpIHtcbiAgICAgIHRoaXMuY3Jvc3NoYWlyLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICB0aGlzLmNyb3NzaGFpci5zdHlsZS5sZWZ0ID0gYCR7Y29vcmRzLnh9cHhgO1xuICAgICAgdGhpcy5jcm9zc2hhaXIuc3R5bGUudG9wID0gYCR7Y29vcmRzLnl9cHhgO1xuICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgIHRoaXMuY3Jvc3NoYWlyLnN0eWxlLmJvcmRlckNvbG9yID0gdGhpcy5pc0xpZ2h0Q29sb3IoY29sb3IpXG4gICAgICAgICAgPyBcIiMzMzNcIlxuICAgICAgICAgIDogXCIjZmZmXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIG1hZ25pZmllclxuICAgIGlmICh0aGlzLm1hZ25pZmllciAmJiB0aGlzLmltYWdlKSB7XG4gICAgICB0aGlzLm1hZ25pZmllci5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgLy8gUG9zaXRpb24gbWFnbmlmaWVyIG9mZnNldCBmcm9tIGN1cnNvclxuICAgICAgY29uc3Qgb2Zmc2V0WCA9XG4gICAgICAgIGNvb3Jkcy54ICsgMTAwID4gKHRoaXMub3ZlcmxheSBhcyBhbnkpLl9kaXNwbGF5SW1hZ2Uud2lkdGggPyAtMTAwIDogNTA7XG4gICAgICBjb25zdCBvZmZzZXRZID1cbiAgICAgICAgY29vcmRzLnkgKyAxMDAgPiAodGhpcy5vdmVybGF5IGFzIGFueSkuX2Rpc3BsYXlJbWFnZS5oZWlnaHQgPyAtMTAwIDogNTA7XG4gICAgICB0aGlzLm1hZ25pZmllci5zdHlsZS5sZWZ0ID0gYCR7Y29vcmRzLnggKyBvZmZzZXRYfXB4YDtcbiAgICAgIHRoaXMubWFnbmlmaWVyLnN0eWxlLnRvcCA9IGAke2Nvb3Jkcy55ICsgb2Zmc2V0WX1weGA7XG5cbiAgICAgIC8vIFNldCBtYWduaWZpZWQgYmFja2dyb3VuZFxuICAgICAgY29uc3QgYmdYID0gKGNvb3Jkcy5pbWFnZVggLyB0aGlzLmltYWdlLm5hdHVyYWxXaWR0aCkgKiAxMDA7XG4gICAgICBjb25zdCBiZ1kgPSAoY29vcmRzLmltYWdlWSAvIHRoaXMuaW1hZ2UubmF0dXJhbEhlaWdodCkgKiAxMDA7XG4gICAgICB0aGlzLm1hZ25pZmllci5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBgdXJsKCR7dGhpcy5pbWFnZS5zcmN9KWA7XG4gICAgICB0aGlzLm1hZ25pZmllci5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb24gPSBgJHtiZ1h9JSAke2JnWX0lYDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY29sb3IgcHJldmlld1xuICAgIGlmICh0aGlzLmNvbG9yUHJldmlldyAmJiBjb2xvcikge1xuICAgICAgY29uc3Qgc3dhdGNoID0gdGhpcy5jb2xvclByZXZpZXcucXVlcnlTZWxlY3RvcihcbiAgICAgICAgXCIucGlwZXR0ZS1zd2F0Y2hcIixcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5jb2xvclByZXZpZXcucXVlcnlTZWxlY3RvcihcbiAgICAgICAgXCIucGlwZXR0ZS10ZXh0XCIsXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKHN3YXRjaCkgc3dhdGNoLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xuICAgICAgaWYgKHRleHQpIHRleHQudGV4dENvbnRlbnQgPSBjb2xvci50b1VwcGVyQ2FzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGNvbG9yIGlzIGxpZ2h0IChmb3IgY29udHJhc3QpXG4gICAqL1xuICBwcml2YXRlIGlzTGlnaHRDb2xvcihoZXg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHIgPSBwYXJzZUludChoZXguc2xpY2UoMSwgMyksIDE2KTtcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoaGV4LnNsaWNlKDMsIDUpLCAxNik7XG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGhleC5zbGljZSg1LCA3KSwgMTYpO1xuICAgIGNvbnN0IGx1bWluYW5jZSA9ICgwLjI5OSAqIHIgKyAwLjU4NyAqIGcgKyAwLjExNCAqIGIpIC8gMjU1O1xuICAgIHJldHVybiBsdW1pbmFuY2UgPiAwLjU7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIG1vdXNlIG1vdmUgZHVyaW5nIHNhbXBsaW5nXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZU1vdXNlTW92ZShlOiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGVTYW1wbGluZ1VJKGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbW91c2UgZG93biB0byBzZWxlY3QgY29sb3JcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlTW91c2VEb3duKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUpIHJldHVybjtcblxuICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuZ2V0SW1hZ2VDb29yZGluYXRlcyhlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgaWYgKGNvb3Jkcykge1xuICAgICAgY29uc3QgY29sb3IgPSB0aGlzLmdldENvbG9yQXQoY29vcmRzLmltYWdlWCwgY29vcmRzLmltYWdlWSk7XG4gICAgICB0aGlzLmVuZFNhbXBsaW5nKGNvbG9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoIG1vdmUgZHVyaW5nIHNhbXBsaW5nXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVRvdWNoTW92ZShlOiBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlIHx8ICFlLnRvdWNoZXMubGVuZ3RoKSByZXR1cm47XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHRvdWNoID0gZS50b3VjaGVzWzBdO1xuICAgIHRoaXMudXBkYXRlU2FtcGxpbmdVSSh0b3VjaC5jbGllbnRYLCB0b3VjaC5jbGllbnRZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdG91Y2ggZW5kIHRvIHNlbGVjdCBjb2xvclxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaEVuZChlOiBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlKSByZXR1cm47XG5cbiAgICBjb25zdCB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgY29uc3QgY29vcmRzID0gdGhpcy5nZXRJbWFnZUNvb3JkaW5hdGVzKHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpO1xuICAgIGlmIChjb29yZHMpIHtcbiAgICAgIGNvbnN0IGNvbG9yID0gdGhpcy5nZXRDb2xvckF0KGNvb3Jkcy5pbWFnZVgsIGNvb3Jkcy5pbWFnZVkpO1xuICAgICAgdGhpcy5lbmRTYW1wbGluZyhjb2xvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBrZXlib2FyZCBldmVudHNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlS2V5RG93bihlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICB0aGlzLmVuZFNhbXBsaW5nKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBzYW1wbGluZyBtb2RlXG4gICAqL1xuICBzdGFydFNhbXBsaW5nKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmltYWdlKSB7XG4gICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICB0aGlzLnJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcblxuICAgICAgdGhpcy5jcmVhdGVPdmVybGF5KCk7XG5cbiAgICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5ib3VuZE1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIHRoaXMuYm91bmRNb3VzZURvd24pO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5ib3VuZEtleURvd24pO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCB0aGlzLmJvdW5kVG91Y2hNb3ZlLCB7XG4gICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgdGhpcy5ib3VuZFRvdWNoRW5kKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmQgc2FtcGxpbmcgbW9kZVxuICAgKi9cbiAgcHJpdmF0ZSBlbmRTYW1wbGluZyhjb2xvcjogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcblxuICAgIC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMuYm91bmRNb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgdGhpcy5ib3VuZE1vdXNlRG93bik7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5ib3VuZEtleURvd24pO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgdGhpcy5ib3VuZFRvdWNoTW92ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIHRoaXMuYm91bmRUb3VjaEVuZCk7XG5cbiAgICB0aGlzLnJlbW92ZU92ZXJsYXkoKTtcblxuICAgIGlmICh0aGlzLnJlc29sdmVQcm9taXNlKSB7XG4gICAgICB0aGlzLnJlc29sdmVQcm9taXNlKGNvbG9yKTtcbiAgICAgIHRoaXMucmVzb2x2ZVByb21pc2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50bHkgc2FtcGxpbmdcbiAgICovXG4gIGlzU2FtcGxpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNBY3RpdmU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW51cFxuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmVuZFNhbXBsaW5nKG51bGwpO1xuICAgIHRoaXMuaW1hZ2UgPSBudWxsO1xuICB9XG59XG5cbi8qKlxuICogVXNlIHRoZSBuYXRpdmUgRXllRHJvcHBlciBBUElcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXNlTmF0aXZlRXllRHJvcHBlcigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgaWYgKCFpc0V5ZURyb3BwZXJTdXBwb3J0ZWQoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBAdHMtaWdub3JlIC0gRXllRHJvcHBlciBBUElcbiAgICBjb25zdCBleWVEcm9wcGVyID0gbmV3IHdpbmRvdy5FeWVEcm9wcGVyKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXllRHJvcHBlci5vcGVuKCk7XG4gICAgcmV0dXJuIHJlc3VsdC5zUkdCSGV4O1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVXNlciBjYW5jZWxsZWQgb3IgZXJyb3Igb2NjdXJyZWRcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgcGlwZXR0ZS9jb2xvciBwaWNrZXIgZnVuY3Rpb25hbGl0eSB0byBhIGNvbG9yIHBpY2tlciBjb21wb25lbnRcbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29sb3IgcGlja2VyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIENvbXBvbmVudCBlbmhhbmNlciBmdW5jdGlvblxuICovXG5leHBvcnQgY29uc3Qgd2l0aFBpcGV0dGUgPVxuICAoY29uZmlnOiBDb2xvclBpY2tlckNvbmZpZykgPT5cbiAgPFxuICAgIFQgZXh0ZW5kcyB7XG4gICAgICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICAgIGdldENsYXNzOiAobmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XG4gICAgICBlbWl0OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBzdGF0ZT86IENvbG9yUGlja2VyU3RhdGU7XG4gICAgICBwaWNrZXJDb250ZW50PzogSFRNTEVsZW1lbnQ7XG4gICAgICBpbnB1dD86IHtcbiAgICAgICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgICB9O1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYgeyBwaXBldHRlOiBQaXBldHRlRmVhdHVyZTsgc3RhdGU6IENvbG9yUGlja2VyU3RhdGUgfSA9PiB7XG4gICAgY29uc3QgeyBlbGVtZW50LCBnZXRDbGFzcywgZW1pdCB9ID0gY29tcG9uZW50O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSBpZiBub3QgcHJlc2VudFxuICAgIGNvbnN0IHN0YXRlOiBDb2xvclBpY2tlclN0YXRlID1cbiAgICAgIGNvbXBvbmVudC5zdGF0ZSB8fCBjcmVhdGVJbml0aWFsU3RhdGUoY29uZmlnKTtcblxuICAgIC8vIFVzZSBwaWNrZXJDb250ZW50IGlmIGF2YWlsYWJsZSAoZm9yIGRyb3Bkb3duL2RpYWxvZyksIG90aGVyd2lzZSB1c2UgZWxlbWVudFxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbXBvbmVudC5waWNrZXJDb250ZW50IHx8IGVsZW1lbnQ7XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHNob3cgdGhlIHBpcGV0dGVcbiAgICBjb25zdCBoYXNJbWFnZVNvdXJjZSA9ICEhY29uZmlnLmltYWdlU291cmNlO1xuICAgIGNvbnN0IGhhc05hdGl2ZVN1cHBvcnQgPSBpc0V5ZURyb3BwZXJTdXBwb3J0ZWQoKTtcbiAgICBjb25zdCBzaG93UGlwZXR0ZSA9XG4gICAgICBjb25maWcuc2hvd1BpcGV0dGUgPz8gKGhhc05hdGl2ZVN1cHBvcnQgfHwgaGFzSW1hZ2VTb3VyY2UpO1xuXG4gICAgaWYgKCFzaG93UGlwZXR0ZSkge1xuICAgICAgLy8gQ3JlYXRlIGEgbm8tb3AgZmVhdHVyZVxuICAgICAgY29uc3QgZW1wdHlGZWF0dXJlOiBQaXBldHRlRmVhdHVyZSA9IHtcbiAgICAgICAgZWxlbWVudDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxcbiAgICAgICAgcGljazogYXN5bmMgKCkgPT4gbnVsbCxcbiAgICAgICAgc2V0SW1hZ2VTb3VyY2U6ICgpID0+IHt9LFxuICAgICAgICBpc1NhbXBsaW5nOiAoKSA9PiBmYWxzZSxcbiAgICAgICAgZGVzdHJveTogKCkgPT4ge30sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcGlwZXR0ZTogZW1wdHlGZWF0dXJlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY2FudmFzIHNhbXBsZXIgZm9yIGZhbGxiYWNrXG4gICAgY29uc3QgY2FudmFzU2FtcGxlciA9IG5ldyBDYW52YXNTYW1wbGVyKCk7XG4gICAgbGV0IGN1cnJlbnRJbWFnZVNvdXJjZTogSFRNTEltYWdlRWxlbWVudCB8IHN0cmluZyB8IG51bGwgPVxuICAgICAgY29uZmlnLmltYWdlU291cmNlIHx8IG51bGw7XG4gICAgbGV0IGlzU2FtcGxpbmcgPSBmYWxzZTtcblxuICAgIC8vIEluaXRpYWxpemUgaW1hZ2Ugc291cmNlIGlmIHByb3ZpZGVkXG4gICAgaWYgKGN1cnJlbnRJbWFnZVNvdXJjZSkge1xuICAgICAgY2FudmFzU2FtcGxlci5zZXRJbWFnZShjdXJyZW50SW1hZ2VTb3VyY2UpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBsb2FkIHBpcGV0dGUgaW1hZ2Ugc291cmNlOlwiLCBlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBwaXBldHRlIGJ1dHRvbiAodG8gYmUgaW5zZXJ0ZWQgaW5zaWRlIHRoZSB2YWx1ZSByb3cgYWZ0ZXIgdGV4dGZpZWxkKVxuICAgIGNvbnN0IGJ1dHRvbiA9IGNyZWF0ZUljb25CdXR0b24oe1xuICAgICAgaWNvbjogUElQRVRURV9JQ09OLFxuICAgICAgYXJpYUxhYmVsOiBcIlBpY2sgY29sb3IgZnJvbSBpbWFnZVwiLFxuICAgICAgdmFyaWFudDogXCJzdGFuZGFyZFwiLFxuICAgICAgY2xhc3M6IGdldENsYXNzKFwiY29sb3JwaWNrZXJfX3BpcGV0dGUtYnRuXCIpLFxuICAgIH0pO1xuXG4gICAgLy8gSW5zZXJ0IGluc2lkZSB0aGUgdmFsdWUgcm93IChhZnRlciB0ZXh0ZmllbGQpIG9yIGF0IHRoZSBlbmQgb2YgY29udGFpbmVyXG4gICAgaWYgKGNvbXBvbmVudC5pbnB1dD8uZWxlbWVudCkge1xuICAgICAgY29tcG9uZW50LmlucHV0LmVsZW1lbnQuYXBwZW5kQ2hpbGQoYnV0dG9uLmVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhbGwgVUkgZmVhdHVyZXNcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVBbGxVSSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5hcmVhPy51cGRhdGVCYWNrZ3JvdW5kPy4oKTtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5hcmVhPy51cGRhdGVIYW5kbGU/LigpO1xuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmh1ZT8udXBkYXRlSGFuZGxlPy4oKTtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5pbnB1dD8udXBkYXRlPy4oKTtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5zd2F0Y2hlcz8udXBkYXRlPy4oKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHBpY2tlZCBjb2xvclxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVBpY2tlZENvbG9yID0gKGNvbG9yOiBzdHJpbmcgfCBudWxsKTogdm9pZCA9PiB7XG4gICAgICBpc1NhbXBsaW5nID0gZmFsc2U7XG4gICAgICBjb25maWcub25QaXBldHRlRW5kPy4oY29sb3IpO1xuXG4gICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgY29uc3QgaHN2ID0gaGV4VG9Ic3YoY29sb3IpO1xuICAgICAgICBpZiAoaHN2KSB7XG4gICAgICAgICAgc3RhdGUuaHN2ID0gaHN2O1xuICAgICAgICAgIHN0YXRlLmhleCA9IGNvbG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgdXBkYXRlQWxsVUkoKTtcblxuICAgICAgICAgIGVtaXQoQ09MT1JQSUNLRVJfRVZFTlRTLklOUFVULCBzdGF0ZS5oZXgpO1xuICAgICAgICAgIGVtaXQoQ09MT1JQSUNLRVJfRVZFTlRTLkNIQU5HRSwgc3RhdGUuaGV4KTtcbiAgICAgICAgICBjb25maWcub25JbnB1dD8uKHN0YXRlLmhleCk7XG4gICAgICAgICAgY29uZmlnLm9uQ2hhbmdlPy4oc3RhdGUuaGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTdGFydCBwaXBldHRlIHBpY2tpbmdcbiAgICAgKi9cbiAgICBjb25zdCBwaWNrID0gYXN5bmMgKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4gPT4ge1xuICAgICAgaWYgKGlzU2FtcGxpbmcpIHJldHVybiBudWxsO1xuXG4gICAgICBpc1NhbXBsaW5nID0gdHJ1ZTtcbiAgICAgIGNvbmZpZy5vblBpcGV0dGVTdGFydD8uKCk7XG5cbiAgICAgIGxldCBjb2xvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgIC8vIFRyeSBuYXRpdmUgQVBJIGZpcnN0IGlmIHN1cHBvcnRlZCBhbmQgbm8gc3BlY2lmaWMgaW1hZ2Ugc291cmNlXG4gICAgICBpZiAoaGFzTmF0aXZlU3VwcG9ydCAmJiAhY3VycmVudEltYWdlU291cmNlKSB7XG4gICAgICAgIGNvbG9yID0gYXdhaXQgdXNlTmF0aXZlRXllRHJvcHBlcigpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50SW1hZ2VTb3VyY2UpIHtcbiAgICAgICAgLy8gVXNlIGNhbnZhcyBzYW1wbGVyIGZvciBzcGVjaWZpYyBpbWFnZVxuICAgICAgICBjb2xvciA9IGF3YWl0IGNhbnZhc1NhbXBsZXIuc3RhcnRTYW1wbGluZygpO1xuICAgICAgfSBlbHNlIGlmIChoYXNOYXRpdmVTdXBwb3J0KSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIG5hdGl2ZSBpZiBhdmFpbGFibGVcbiAgICAgICAgY29sb3IgPSBhd2FpdCB1c2VOYXRpdmVFeWVEcm9wcGVyKCk7XG4gICAgICB9XG5cbiAgICAgIGhhbmRsZVBpY2tlZENvbG9yKGNvbG9yKTtcbiAgICAgIHJldHVybiBjb2xvcjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBpbWFnZSBzb3VyY2UgZm9yIGNhbnZhcyBzYW1wbGluZ1xuICAgICAqL1xuICAgIGNvbnN0IHNldEltYWdlU291cmNlID0gKHNvdXJjZTogSFRNTEltYWdlRWxlbWVudCB8IHN0cmluZyB8IG51bGwpOiB2b2lkID0+IHtcbiAgICAgIGN1cnJlbnRJbWFnZVNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgY2FudmFzU2FtcGxlci5zZXRJbWFnZShzb3VyY2UpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIGxvYWQgcGlwZXR0ZSBpbWFnZSBzb3VyY2U6XCIsIGUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQnV0dG9uIGNsaWNrIGhhbmRsZXJcbiAgICBidXR0b24ub24oXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBwaWNrKCk7XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgcGlwZXR0ZSBmZWF0dXJlIG9iamVjdFxuICAgIGNvbnN0IHBpcGV0dGVGZWF0dXJlOiBQaXBldHRlRmVhdHVyZSA9IHtcbiAgICAgIGVsZW1lbnQ6IGJ1dHRvbi5lbGVtZW50LFxuICAgICAgcGljayxcbiAgICAgIHNldEltYWdlU291cmNlLFxuICAgICAgaXNTYW1wbGluZzogKCkgPT4gaXNTYW1wbGluZyB8fCBjYW52YXNTYW1wbGVyLmlzU2FtcGxpbmcoKSxcbiAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgY2FudmFzU2FtcGxlci5kZXN0cm95KCk7XG4gICAgICAgIGJ1dHRvbi5kZXN0cm95Py4oKTtcbiAgICAgICAgYnV0dG9uLmVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBFeHRlbmQgbGlmZWN5Y2xlIGRlc3Ryb3kgaWYgaXQgZXhpc3RzXG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gKGNvbXBvbmVudCBhcyBhbnkpLmxpZmVjeWNsZT8uZGVzdHJveTtcbiAgICBpZiAob3JpZ2luYWxEZXN0cm95KSB7XG4gICAgICAoY29tcG9uZW50IGFzIGFueSkubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIHBpcGV0dGVGZWF0dXJlLmRlc3Ryb3koKTtcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95KCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBzdGF0ZSxcbiAgICAgIHBpcGV0dGU6IHBpcGV0dGVGZWF0dXJlLFxuICAgIH07XG4gIH07XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2NvbG9ycGlja2VyL2ZlYXR1cmVzL29wYWNpdHkudHNcblxuaW1wb3J0IHsgQ09MT1JQSUNLRVJfRVZFTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ29sb3JQaWNrZXJDb25maWcsIENvbG9yUGlja2VyU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGhzdlRvSGV4IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBjcmVhdGVJbml0aWFsU3RhdGUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5cbi8qKlxuICogT3BhY2l0eSBmZWF0dXJlIGludGVyZmFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wYWNpdHlGZWF0dXJlIHtcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gIGhhbmRsZTogSFRNTEVsZW1lbnQ7XG4gIHVwZGF0ZUhhbmRsZTogKCkgPT4gdm9pZDtcbiAgdXBkYXRlQmFja2dyb3VuZDogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBBZGRzIGFuIG9wYWNpdHkvYWxwaGEgYmFyIHdpdGggY2hlY2tlcmJvYXJkIGJhY2tncm91bmQgYW5kIGRyYWdnYWJsZSBoYW5kbGVcbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29sb3IgcGlja2VyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIENvbXBvbmVudCBlbmhhbmNlciBmdW5jdGlvblxuICovXG5leHBvcnQgY29uc3Qgd2l0aE9wYWNpdHkgPVxuICAoY29uZmlnOiBDb2xvclBpY2tlckNvbmZpZykgPT5cbiAgPFxuICAgIFQgZXh0ZW5kcyB7XG4gICAgICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICAgIGdldENsYXNzOiAobmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XG4gICAgICBlbWl0OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBzdGF0ZT86IENvbG9yUGlja2VyU3RhdGU7XG4gICAgICBwaWNrZXJDb250ZW50PzogSFRNTEVsZW1lbnQ7XG4gICAgICBodWU/OiB7XG4gICAgICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgICAgfTtcbiAgICB9LFxuICA+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHsgb3BhY2l0eTogT3BhY2l0eUZlYXR1cmU7IHN0YXRlOiBDb2xvclBpY2tlclN0YXRlIH0gPT4ge1xuICAgIGNvbnN0IHsgZWxlbWVudCwgZ2V0Q2xhc3MsIGVtaXQgfSA9IGNvbXBvbmVudDtcblxuICAgIC8vIEluaXRpYWxpemUgc3RhdGUgaWYgbm90IHByZXNlbnRcbiAgICBjb25zdCBzdGF0ZTogQ29sb3JQaWNrZXJTdGF0ZSA9XG4gICAgICBjb21wb25lbnQuc3RhdGUgfHwgY3JlYXRlSW5pdGlhbFN0YXRlKGNvbmZpZyk7XG5cbiAgICAvLyBJbml0aWFsaXplIG9wYWNpdHkgaW4gc3RhdGUgaWYgbm90IHByZXNlbnRcbiAgICBpZiAoc3RhdGUub3BhY2l0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdGF0ZS5vcGFjaXR5ID0gY29uZmlnLm9wYWNpdHkgPz8gMTtcbiAgICB9XG5cbiAgICAvLyBVc2UgcGlja2VyQ29udGVudCBpZiBhdmFpbGFibGUgKGZvciBkcm9wZG93bi9kaWFsb2cpLCBvdGhlcndpc2UgdXNlIGVsZW1lbnRcbiAgICBjb25zdCBjb250YWluZXIgPSBjb21wb25lbnQucGlja2VyQ29udGVudCB8fCBlbGVtZW50O1xuXG4gICAgLy8gQ3JlYXRlIG9wYWNpdHkgYmFyIGNvbnRhaW5lclxuICAgIGNvbnN0IG9wYWNpdHlCYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIG9wYWNpdHlCYXIuY2xhc3NOYW1lID0gZ2V0Q2xhc3MoXCJjb2xvcnBpY2tlcl9fb3BhY2l0eVwiKTtcblxuICAgIC8vIENyZWF0ZSBjaGVja2VyYm9hcmQgYmFja2dyb3VuZCAoZm9yIHRyYW5zcGFyZW5jeSB2aXN1YWxpemF0aW9uKVxuICAgIGNvbnN0IGNoZWNrZXJib2FyZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY2hlY2tlcmJvYXJkLmNsYXNzTmFtZSA9IGdldENsYXNzKFwiY29sb3JwaWNrZXJfX29wYWNpdHktY2hlY2tlcmJvYXJkXCIpO1xuICAgIG9wYWNpdHlCYXIuYXBwZW5kQ2hpbGQoY2hlY2tlcmJvYXJkKTtcblxuICAgIC8vIENyZWF0ZSBncmFkaWVudCB0cmFjayAodHJhbnNwYXJlbnQgdG8gc29saWQgY29sb3IpXG4gICAgY29uc3QgdHJhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRyYWNrLmNsYXNzTmFtZSA9IGdldENsYXNzKFwiY29sb3JwaWNrZXJfX29wYWNpdHktdHJhY2tcIik7XG4gICAgb3BhY2l0eUJhci5hcHBlbmRDaGlsZCh0cmFjayk7XG5cbiAgICAvLyBDcmVhdGUgZHJhZ2dhYmxlIGhhbmRsZVxuICAgIGNvbnN0IGhhbmRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgaGFuZGxlLmNsYXNzTmFtZSA9IGdldENsYXNzKFwiY29sb3JwaWNrZXJfX29wYWNpdHktaGFuZGxlXCIpO1xuICAgIG9wYWNpdHlCYXIuYXBwZW5kQ2hpbGQoaGFuZGxlKTtcblxuICAgIC8vIEluc2VydCBhZnRlciBodWUgZWxlbWVudCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBhcHBlbmRcbiAgICBpZiAoY29tcG9uZW50Lmh1ZT8uZWxlbWVudCkge1xuICAgICAgY29tcG9uZW50Lmh1ZS5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyZW5kXCIsIG9wYWNpdHlCYXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQob3BhY2l0eUJhcik7XG4gICAgfVxuXG4gICAgLy8gRHJhZ2dpbmcgc3RhdGVcbiAgICBsZXQgaXNEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBncmFkaWVudCBiYWNrZ3JvdW5kIGJhc2VkIG9uIGN1cnJlbnQgY29sb3JcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVCYWNrZ3JvdW5kID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgc29saWRDb2xvciA9IGhzdlRvSGV4KHN0YXRlLmhzdi5oLCBzdGF0ZS5oc3Yucywgc3RhdGUuaHN2LnYpO1xuICAgICAgdHJhY2suc3R5bGUuYmFja2dyb3VuZCA9IGBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHRyYW5zcGFyZW50LCAke3NvbGlkQ29sb3J9KWA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBoYW5kbGUgcG9zaXRpb24gYmFzZWQgb24gY3VycmVudCBvcGFjaXR5XG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlSGFuZGxlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgcGVyY2VudCA9IHN0YXRlLm9wYWNpdHkgKiAxMDA7XG4gICAgICBoYW5kbGUuc3R5bGUubGVmdCA9IGAke3BlcmNlbnR9JWA7XG4gICAgICAvLyBTZXQgaGFuZGxlIGNvbG9yIHdpdGggY3VycmVudCBvcGFjaXR5XG4gICAgICBjb25zdCBzb2xpZENvbG9yID0gaHN2VG9IZXgoc3RhdGUuaHN2LmgsIHN0YXRlLmhzdi5zLCBzdGF0ZS5oc3Yudik7XG4gICAgICBoYW5kbGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gc29saWRDb2xvcjtcbiAgICAgIGhhbmRsZS5zdHlsZS5vcGFjaXR5ID0gU3RyaW5nKHN0YXRlLm9wYWNpdHkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgb3BhY2l0eSBmcm9tIG1vdXNlL3RvdWNoIHBvc2l0aW9uXG4gICAgICovXG4gICAgY29uc3QgZ2V0T3BhY2l0eUZyb21Qb3NpdGlvbiA9IChjbGllbnRYOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgY29uc3QgcmVjdCA9IG9wYWNpdHlCYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oY2xpZW50WCAtIHJlY3QubGVmdCwgcmVjdC53aWR0aCkpO1xuICAgICAgY29uc3QgcGVyY2VudCA9IHggLyByZWN0LndpZHRoO1xuICAgICAgcmV0dXJuIE1hdGgucm91bmQocGVyY2VudCAqIDEwMCkgLyAxMDA7IC8vIFJvdW5kIHRvIDIgZGVjaW1hbCBwbGFjZXNcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHN0YXRlIGFuZCBlbWl0IGV2ZW50c1xuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZU9wYWNpdHkgPSAob3BhY2l0eTogbnVtYmVyLCBpc0NvbW1pdDogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgc3RhdGUub3BhY2l0eSA9IG9wYWNpdHk7XG5cbiAgICAgIHVwZGF0ZUhhbmRsZSgpO1xuXG4gICAgICAvLyBVcGRhdGUgYXJpYSB2YWx1ZVxuICAgICAgb3BhY2l0eUJhci5zZXRBdHRyaWJ1dGUoXG4gICAgICAgIFwiYXJpYS12YWx1ZW5vd1wiLFxuICAgICAgICBTdHJpbmcoTWF0aC5yb3VuZChvcGFjaXR5ICogMTAwKSksXG4gICAgICApO1xuXG4gICAgICAvLyBVcGRhdGUgaW5wdXQgZmllbGQgdmlhIHJlZnNcbiAgICAgIHN0YXRlLnJlZnMuaW5wdXQ/LnVwZGF0ZT8uKCk7XG5cbiAgICAgIGlmIChpc0NvbW1pdCkge1xuICAgICAgICBlbWl0KENPTE9SUElDS0VSX0VWRU5UUy5DSEFOR0UsIHN0YXRlLmhleCk7XG4gICAgICAgIGNvbmZpZy5vbkNoYW5nZT8uKHN0YXRlLmhleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbWl0KENPTE9SUElDS0VSX0VWRU5UUy5JTlBVVCwgc3RhdGUuaGV4KTtcbiAgICAgICAgY29uZmlnLm9uSW5wdXQ/LihzdGF0ZS5oZXgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgcG9pbnRlciBkb3duIG9uIG9wYWNpdHkgYmFyXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlUG9pbnRlckRvd24gPSAoZTogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoY29uZmlnLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgc3RhdGUuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICBzdGF0ZS5kcmFnVGFyZ2V0ID0gXCJvcGFjaXR5XCI7XG5cbiAgICAgIC8vIENhcHR1cmUgcG9pbnRlciBmb3IgdHJhY2tpbmcgb3V0c2lkZSBlbGVtZW50XG4gICAgICBvcGFjaXR5QmFyLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcblxuICAgICAgLy8gQWRkIGRyYWdnaW5nIGNsYXNzXG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJjb2xvcnBpY2tlci0tZHJhZ2dpbmdcIikpO1xuXG4gICAgICAvLyBVcGRhdGUgb3BhY2l0eSBpbW1lZGlhdGVseVxuICAgICAgY29uc3Qgb3BhY2l0eSA9IGdldE9wYWNpdHlGcm9tUG9zaXRpb24oZS5jbGllbnRYKTtcbiAgICAgIHVwZGF0ZU9wYWNpdHkob3BhY2l0eSwgZmFsc2UpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgcG9pbnRlciBtb3ZlXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlUG9pbnRlck1vdmUgPSAoZTogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzRHJhZ2dpbmcpIHJldHVybjtcblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IGdldE9wYWNpdHlGcm9tUG9zaXRpb24oZS5jbGllbnRYKTtcbiAgICAgIHVwZGF0ZU9wYWNpdHkob3BhY2l0eSwgZmFsc2UpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgcG9pbnRlciB1cFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVBvaW50ZXJVcCA9IChlOiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghaXNEcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICBzdGF0ZS5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICBzdGF0ZS5kcmFnVGFyZ2V0ID0gbnVsbDtcblxuICAgICAgLy8gUmVsZWFzZSBwb2ludGVyIGNhcHR1cmVcbiAgICAgIG9wYWNpdHlCYXIucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcblxuICAgICAgLy8gUmVtb3ZlIGRyYWdnaW5nIGNsYXNzXG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoZ2V0Q2xhc3MoXCJjb2xvcnBpY2tlci0tZHJhZ2dpbmdcIikpO1xuXG4gICAgICAvLyBFbWl0IGZpbmFsIGNoYW5nZVxuICAgICAgY29uc3Qgb3BhY2l0eSA9IGdldE9wYWNpdHlGcm9tUG9zaXRpb24oZS5jbGllbnRYKTtcbiAgICAgIHVwZGF0ZU9wYWNpdHkob3BhY2l0eSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlOiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoY29uZmlnLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICAgIGxldCBvcGFjaXR5ID0gc3RhdGUub3BhY2l0eTtcbiAgICAgIGNvbnN0IHN0ZXAgPSBlLnNoaWZ0S2V5ID8gMC4xIDogMC4wMTtcblxuICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICBjYXNlIFwiQXJyb3dMZWZ0XCI6XG4gICAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgb3BhY2l0eSA9IE1hdGgubWF4KDAsIG9wYWNpdHkgLSBzdGVwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkFycm93UmlnaHRcIjpcbiAgICAgICAgY2FzZSBcIkFycm93VXBcIjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgb3BhY2l0eSA9IE1hdGgubWluKDEsIG9wYWNpdHkgKyBzdGVwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkhvbWVcIjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgb3BhY2l0eSA9IDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJFbmRcIjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgb3BhY2l0eSA9IDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSb3VuZCB0byBhdm9pZCBmbG9hdGluZyBwb2ludCBpc3N1ZXNcbiAgICAgIG9wYWNpdHkgPSBNYXRoLnJvdW5kKG9wYWNpdHkgKiAxMDApIC8gMTAwO1xuICAgICAgdXBkYXRlT3BhY2l0eShvcGFjaXR5LCB0cnVlKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVyc1xuICAgIG9wYWNpdHlCYXIuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICBvcGFjaXR5QmFyLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBoYW5kbGVQb2ludGVyTW92ZSk7XG4gICAgb3BhY2l0eUJhci5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGhhbmRsZVBvaW50ZXJVcCk7XG4gICAgb3BhY2l0eUJhci5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmNhbmNlbFwiLCBoYW5kbGVQb2ludGVyVXApO1xuXG4gICAgLy8gTWFrZSBvcGFjaXR5IGJhciBmb2N1c2FibGUgZm9yIGtleWJvYXJkIG5hdmlnYXRpb25cbiAgICBvcGFjaXR5QmFyLnRhYkluZGV4ID0gMDtcbiAgICBvcGFjaXR5QmFyLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJzbGlkZXJcIik7XG4gICAgb3BhY2l0eUJhci5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiT3BhY2l0eVwiKTtcbiAgICBvcGFjaXR5QmFyLnNldEF0dHJpYnV0ZShcImFyaWEtdmFsdWVtaW5cIiwgXCIwXCIpO1xuICAgIG9wYWNpdHlCYXIuc2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZW1heFwiLCBcIjEwMFwiKTtcbiAgICBvcGFjaXR5QmFyLnNldEF0dHJpYnV0ZShcbiAgICAgIFwiYXJpYS12YWx1ZW5vd1wiLFxuICAgICAgU3RyaW5nKE1hdGgucm91bmQoc3RhdGUub3BhY2l0eSAqIDEwMCkpLFxuICAgICk7XG4gICAgb3BhY2l0eUJhci5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcblxuICAgIC8vIFJlZ2lzdGVyIGluIHJlZnMgZm9yIGNyb3NzLWZlYXR1cmUgYWNjZXNzXG4gICAgc3RhdGUucmVmcy5vcGFjaXR5ID0geyB1cGRhdGVCYWNrZ3JvdW5kLCB1cGRhdGVIYW5kbGUgfTtcblxuICAgIC8vIEluaXRpYWwgdXBkYXRlc1xuICAgIHVwZGF0ZUJhY2tncm91bmQoKTtcbiAgICB1cGRhdGVIYW5kbGUoKTtcblxuICAgIC8vIENyZWF0ZSBvcGFjaXR5IGZlYXR1cmUgb2JqZWN0XG4gICAgY29uc3Qgb3BhY2l0eUZlYXR1cmU6IE9wYWNpdHlGZWF0dXJlID0ge1xuICAgICAgZWxlbWVudDogb3BhY2l0eUJhcixcbiAgICAgIGhhbmRsZSxcbiAgICAgIHVwZGF0ZUhhbmRsZSxcbiAgICAgIHVwZGF0ZUJhY2tncm91bmQsXG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCBsaWZlY3ljbGUgZGVzdHJveSBpZiBpdCBleGlzdHNcbiAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSAoY29tcG9uZW50IGFzIGFueSkubGlmZWN5Y2xlPy5kZXN0cm95O1xuICAgIGlmIChvcmlnaW5hbERlc3Ryb3kpIHtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgb3BhY2l0eUJhci5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgaGFuZGxlUG9pbnRlckRvd24pO1xuICAgICAgICBvcGFjaXR5QmFyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBoYW5kbGVQb2ludGVyTW92ZSk7XG4gICAgICAgIG9wYWNpdHlCYXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBoYW5kbGVQb2ludGVyVXApO1xuICAgICAgICBvcGFjaXR5QmFyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyY2FuY2VsXCIsIGhhbmRsZVBvaW50ZXJVcCk7XG4gICAgICAgIG9wYWNpdHlCYXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93bik7XG4gICAgICAgIG9wYWNpdHlCYXIucmVtb3ZlKCk7XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveSgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgc3RhdGUsXG4gICAgICBvcGFjaXR5OiBvcGFjaXR5RmVhdHVyZSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9hcGkudHNcblxuaW1wb3J0IHtcbiAgQ29sb3JQaWNrZXJDb21wb25lbnQsXG4gIENvbG9yUGlja2VyQ29uZmlnLFxuICBDb2xvclBpY2tlclN0YXRlLFxuICBDb2xvclN3YXRjaCxcbiAgSFNWQ29sb3IsXG4gIFJHQkNvbG9yLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgaGV4VG9Ic3YsIGhleFRvUmdiLCBoc3ZUb0hleCwgcmdiVG9IZXgsIG5vcm1hbGl6ZUhleCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBDT0xPUlBJQ0tFUl9FVkVOVFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEFyZWFGZWF0dXJlIH0gZnJvbSBcIi4vZmVhdHVyZXMvYXJlYVwiO1xuaW1wb3J0IHsgSHVlRmVhdHVyZSB9IGZyb20gXCIuL2ZlYXR1cmVzL2h1ZVwiO1xuaW1wb3J0IHsgU3dhdGNoZXNGZWF0dXJlIH0gZnJvbSBcIi4vZmVhdHVyZXMvc3dhdGNoZXNcIjtcbmltcG9ydCB7IElucHV0RmVhdHVyZSB9IGZyb20gXCIuL2ZlYXR1cmVzL2lucHV0XCI7XG5pbXBvcnQgeyBWYXJpYW50RmVhdHVyZSB9IGZyb20gXCIuL2ZlYXR1cmVzL3ZhcmlhbnRcIjtcbmltcG9ydCB7IFBpcGV0dGVGZWF0dXJlIH0gZnJvbSBcIi4vZmVhdHVyZXMvcGlwZXR0ZVwiO1xuaW1wb3J0IHsgT3BhY2l0eUZlYXR1cmUgfSBmcm9tIFwiLi9mZWF0dXJlcy9vcGFjaXR5XCI7XG5cbi8qKlxuICogQVBJIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgY29sb3IgcGlja2VyIGNvbXBvbmVudFxuICogQGNhdGVnb3J5IENvbXBvbmVudHNcbiAqIEBpbnRlcm5hbFxuICovXG5pbnRlcmZhY2UgQXBpT3B0aW9ucyB7XG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICBjb25maWc6IENvbG9yUGlja2VyQ29uZmlnO1xuICBnZXRDbGFzczogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nO1xuICBlbWl0OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gIG9uOiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbiAgb2ZmOiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbiAgZGlzYWJsZWQ6IHtcbiAgICBlbmFibGU6ICgpID0+IHZvaWQ7XG4gICAgZGlzYWJsZTogKCkgPT4gdm9pZDtcbiAgICBpc0Rpc2FibGVkOiAoKSA9PiBib29sZWFuO1xuICB9O1xuICBsaWZlY3ljbGU6IHtcbiAgICBkZXN0cm95OiAoKSA9PiB2b2lkO1xuICB9O1xuICAvLyBPcHRpb25hbCBmZWF0dXJlc1xuICBzdGF0ZT86IENvbG9yUGlja2VyU3RhdGU7XG4gIGFyZWE/OiBBcmVhRmVhdHVyZTtcbiAgaHVlPzogSHVlRmVhdHVyZTtcbiAgc3dhdGNoZXM/OiBTd2F0Y2hlc0ZlYXR1cmU7XG4gIGlucHV0PzogSW5wdXRGZWF0dXJlO1xuICB2YXJpYW50PzogVmFyaWFudEZlYXR1cmU7XG4gIHBpcGV0dGU/OiBQaXBldHRlRmVhdHVyZTtcbiAgb3BhY2l0eT86IE9wYWNpdHlGZWF0dXJlO1xufVxuXG4vKipcbiAqIEVuaGFuY2VzIGEgY29sb3IgcGlja2VyIGNvbXBvbmVudCB3aXRoIEFQSSBtZXRob2RzLlxuICogVGhpcyBmb2xsb3dzIHRoZSBoaWdoZXItb3JkZXIgZnVuY3Rpb24gcGF0dGVybiB0byBhZGQgcHVibGljIEFQSSBtZXRob2RzXG4gKiB0byB0aGUgY29tcG9uZW50LCBtYWtpbmcgdGhlbSBhdmFpbGFibGUgdG8gdGhlIGVuZCB1c2VyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQVBJIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgSGlnaGVyLW9yZGVyIGZ1bmN0aW9uIHRoYXQgYWRkcyBBUEkgbWV0aG9kcyB0byBjb21wb25lbnRcbiAqIEBjYXRlZ29yeSBDb21wb25lbnRzXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhBUEkgPVxuICAob3B0aW9uczogQXBpT3B0aW9ucykgPT5cbiAgKGNvbXBvbmVudDogdW5rbm93bik6IENvbG9yUGlja2VyQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBlbGVtZW50LFxuICAgICAgY29uZmlnLFxuICAgICAgZ2V0Q2xhc3MsXG4gICAgICBlbWl0LFxuICAgICAgb24sXG4gICAgICBvZmYsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGxpZmVjeWNsZSxcbiAgICAgIHN0YXRlLFxuICAgICAgYXJlYSxcbiAgICAgIGh1ZSxcbiAgICAgIHN3YXRjaGVzLFxuICAgICAgaW5wdXQsXG4gICAgICB2YXJpYW50LFxuICAgICAgcGlwZXR0ZSxcbiAgICAgIG9wYWNpdHksXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBFbnN1cmUgc3RhdGUgZXhpc3RzXG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29sb3JQaWNrZXI6IHN0YXRlIGlzIHJlcXVpcmVkXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhbGwgVUkgZWxlbWVudHNcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVVSSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGFyZWE/LnVwZGF0ZUJhY2tncm91bmQoKTtcbiAgICAgIGFyZWE/LnVwZGF0ZUhhbmRsZSgpO1xuICAgICAgaHVlPy51cGRhdGVIYW5kbGUoKTtcbiAgICAgIG9wYWNpdHk/LnVwZGF0ZUJhY2tncm91bmQoKTtcbiAgICAgIG9wYWNpdHk/LnVwZGF0ZUhhbmRsZSgpO1xuICAgICAgaW5wdXQ/LnVwZGF0ZSgpO1xuICAgICAgc3dhdGNoZXM/LnVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXQgY29sb3IgZnJvbSBoZXggdmFsdWVcbiAgICAgKi9cbiAgICBjb25zdCBzZXRDb2xvciA9IChoZXg6IHN0cmluZywgZW1pdENoYW5nZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBoc3YgPSBoZXhUb0hzdihoZXgpO1xuICAgICAgaWYgKCFoc3YpIHJldHVybjtcblxuICAgICAgc3RhdGUuaHN2ID0gaHN2O1xuICAgICAgc3RhdGUuaGV4ID0gbm9ybWFsaXplSGV4KGhleCk7XG4gICAgICB1cGRhdGVVSSgpO1xuXG4gICAgICBpZiAoZW1pdENoYW5nZSkge1xuICAgICAgICBlbWl0KENPTE9SUElDS0VSX0VWRU5UUy5DSEFOR0UsIHN0YXRlLmhleCk7XG4gICAgICAgIGNvbmZpZy5vbkNoYW5nZT8uKHN0YXRlLmhleCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCBjb2xvciBmcm9tIEhTViB2YWx1ZXNcbiAgICAgKi9cbiAgICBjb25zdCBzZXRIU1ZJbnRlcm5hbCA9IChcbiAgICAgIGhzdjogSFNWQ29sb3IsXG4gICAgICBlbWl0Q2hhbmdlOiBib29sZWFuID0gZmFsc2UsXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBzdGF0ZS5oc3YgPSB7XG4gICAgICAgIGg6IE1hdGgubWF4KDAsIE1hdGgubWluKDM2MCwgaHN2LmgpKSxcbiAgICAgICAgczogTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBoc3YucykpLFxuICAgICAgICB2OiBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIGhzdi52KSksXG4gICAgICB9O1xuICAgICAgc3RhdGUuaGV4ID0gaHN2VG9IZXgoc3RhdGUuaHN2LmgsIHN0YXRlLmhzdi5zLCBzdGF0ZS5oc3Yudik7XG4gICAgICB1cGRhdGVVSSgpO1xuXG4gICAgICBpZiAoZW1pdENoYW5nZSkge1xuICAgICAgICBlbWl0KENPTE9SUElDS0VSX0VWRU5UUy5DSEFOR0UsIHN0YXRlLmhleCk7XG4gICAgICAgIGNvbmZpZy5vbkNoYW5nZT8uKHN0YXRlLmhleCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEJ1aWxkIHRoZSBjb21wb25lbnQgQVBJXG4gICAgY29uc3QgY29sb3JQaWNrZXJDb21wb25lbnQ6IENvbG9yUGlja2VyQ29tcG9uZW50ID0ge1xuICAgICAgZWxlbWVudCxcblxuICAgICAgLy8gPT09PT09PT09PT09PSBWYWx1ZSBNZXRob2RzID09PT09PT09PT09PT1cblxuICAgICAgZ2V0VmFsdWU6ICgpID0+IHN0YXRlLmhleCxcblxuICAgICAgc2V0VmFsdWU6IChjb2xvcjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHNldENvbG9yKGNvbG9yLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBjb2xvclBpY2tlckNvbXBvbmVudDtcbiAgICAgIH0sXG5cbiAgICAgIGdldEhTVjogKCkgPT4gKHsgLi4uc3RhdGUuaHN2IH0pLFxuXG4gICAgICBzZXRIU1Y6IChoc3Y6IEhTVkNvbG9yKSA9PiB7XG4gICAgICAgIHNldEhTVkludGVybmFsKGhzdiwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gY29sb3JQaWNrZXJDb21wb25lbnQ7XG4gICAgICB9LFxuXG4gICAgICBnZXRSR0I6ICgpOiBSR0JDb2xvciA9PiB7XG4gICAgICAgIGNvbnN0IHJnYiA9IGhleFRvUmdiKHN0YXRlLmhleCk7XG4gICAgICAgIHJldHVybiByZ2IgfHwgeyByOiAwLCBnOiAwLCBiOiAwIH07XG4gICAgICB9LFxuXG4gICAgICBzZXRSR0I6IChyZ2I6IFJHQkNvbG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IGhleCA9IHJnYlRvSGV4KHJnYi5yLCByZ2IuZywgcmdiLmIpO1xuICAgICAgICBzZXRDb2xvcihoZXgsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGlja2VyQ29tcG9uZW50O1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PSBTd2F0Y2hlcyBNZXRob2RzID09PT09PT09PT09PT1cblxuICAgICAgc2V0U3dhdGNoZXM6IChzd2F0Y2hlc0FycmF5OiBzdHJpbmdbXSB8IENvbG9yU3dhdGNoW10pID0+IHtcbiAgICAgICAgaWYgKHN3YXRjaGVzKSB7XG4gICAgICAgICAgc3dhdGNoZXMuc2V0KHN3YXRjaGVzQXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xvclBpY2tlckNvbXBvbmVudDtcbiAgICAgIH0sXG5cbiAgICAgIGdldFN3YXRjaGVzOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBzd2F0Y2hlcyA/IHN3YXRjaGVzLmdldCgpIDogW107XG4gICAgICB9LFxuXG4gICAgICBhZGRTd2F0Y2g6IChjb2xvcjogc3RyaW5nLCBsYWJlbD86IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoc3dhdGNoZXMpIHtcbiAgICAgICAgICBzd2F0Y2hlcy5hZGQoY29sb3IsIGxhYmVsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sb3JQaWNrZXJDb21wb25lbnQ7XG4gICAgICB9LFxuXG4gICAgICByZW1vdmVTd2F0Y2g6IChjb2xvcjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChzd2F0Y2hlcykge1xuICAgICAgICAgIHN3YXRjaGVzLnJlbW92ZShjb2xvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbG9yUGlja2VyQ29tcG9uZW50O1xuICAgICAgfSxcblxuICAgICAgY2xlYXJTd2F0Y2hlczogKCkgPT4ge1xuICAgICAgICBpZiAoc3dhdGNoZXMpIHtcbiAgICAgICAgICBzd2F0Y2hlcy5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xvclBpY2tlckNvbXBvbmVudDtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT0gU3RhdGUgTWV0aG9kcyA9PT09PT09PT09PT09XG5cbiAgICAgIGVuYWJsZTogKCkgPT4ge1xuICAgICAgICBkaXNhYmxlZC5lbmFibGUoKTtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGlja2VyQ29tcG9uZW50O1xuICAgICAgfSxcblxuICAgICAgZGlzYWJsZTogKCkgPT4ge1xuICAgICAgICBkaXNhYmxlZC5kaXNhYmxlKCk7XG4gICAgICAgIHJldHVybiBjb2xvclBpY2tlckNvbXBvbmVudDtcbiAgICAgIH0sXG5cbiAgICAgIGlzRGlzYWJsZWQ6ICgpID0+IGRpc2FibGVkLmlzRGlzYWJsZWQoKSxcblxuICAgICAgLy8gPT09PT09PT09PT09PSBWYXJpYW50IE1ldGhvZHMgKGRyb3Bkb3duL2RpYWxvZykgPT09PT09PT09PT09PVxuXG4gICAgICBvcGVuOiAoKSA9PiB7XG4gICAgICAgIGlmICh2YXJpYW50KSB7XG4gICAgICAgICAgdmFyaWFudC5vcGVuKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbG9yUGlja2VyQ29tcG9uZW50O1xuICAgICAgfSxcblxuICAgICAgY2xvc2U6ICgpID0+IHtcbiAgICAgICAgaWYgKHZhcmlhbnQpIHtcbiAgICAgICAgICB2YXJpYW50LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbG9yUGlja2VyQ29tcG9uZW50O1xuICAgICAgfSxcblxuICAgICAgdG9nZ2xlOiAoKSA9PiB7XG4gICAgICAgIGlmICh2YXJpYW50KSB7XG4gICAgICAgICAgdmFyaWFudC50b2dnbGUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sb3JQaWNrZXJDb21wb25lbnQ7XG4gICAgICB9LFxuXG4gICAgICBpc09wZW46ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHZhcmlhbnQgPyB2YXJpYW50LmlzT3BlbigpIDogdHJ1ZTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT0gUGlwZXR0ZSBNZXRob2RzID09PT09PT09PT09PT1cblxuICAgICAgcGlja0NvbG9yOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChwaXBldHRlKSB7XG4gICAgICAgICAgcmV0dXJuIHBpcGV0dGUucGljaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSxcblxuICAgICAgc2V0SW1hZ2VTb3VyY2U6IChzb3VyY2U6IEhUTUxJbWFnZUVsZW1lbnQgfCBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGlmIChwaXBldHRlKSB7XG4gICAgICAgICAgcGlwZXR0ZS5zZXRJbWFnZVNvdXJjZShzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xvclBpY2tlckNvbXBvbmVudDtcbiAgICAgIH0sXG5cbiAgICAgIGlzU2FtcGxpbmc6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHBpcGV0dGUgPyBwaXBldHRlLmlzU2FtcGxpbmcoKSA6IGZhbHNlO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PSBPcGFjaXR5IE1ldGhvZHMgPT09PT09PT09PT09PVxuXG4gICAgICBnZXRPcGFjaXR5OiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5vcGFjaXR5O1xuICAgICAgfSxcblxuICAgICAgc2V0T3BhY2l0eTogKG9wYWNpdHlWYWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgIHN0YXRlLm9wYWNpdHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBvcGFjaXR5VmFsdWUpKTtcbiAgICAgICAgb3BhY2l0eT8udXBkYXRlSGFuZGxlKCk7XG4gICAgICAgIHJldHVybiBjb2xvclBpY2tlckNvbXBvbmVudDtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT0gRXZlbnQgTWV0aG9kcyA9PT09PT09PT09PT09XG5cbiAgICAgIG9uOiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCkgPT4ge1xuICAgICAgICBvbihldmVudCwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiBjb2xvclBpY2tlckNvbXBvbmVudDtcbiAgICAgIH0sXG5cbiAgICAgIG9mZjogKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQpID0+IHtcbiAgICAgICAgb2ZmKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGlja2VyQ29tcG9uZW50O1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PSBMaWZlY3ljbGUgTWV0aG9kcyA9PT09PT09PT09PT09XG5cbiAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgbGlmZWN5Y2xlLmRlc3Ryb3koKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIEF0dGFjaCBpbnRlcm5hbCBtZXRob2RzIHRvIGNvbXBvbmVudCBmb3IgZmVhdHVyZXMgdG8gdXNlXG4gICAgKGNvbG9yUGlja2VyQ29tcG9uZW50IGFzIGFueSkuc2V0Q29sb3IgPSBzZXRDb2xvcjtcbiAgICAoY29sb3JQaWNrZXJDb21wb25lbnQgYXMgYW55KS51cGRhdGVVSSA9IHVwZGF0ZVVJO1xuXG4gICAgLy8gSW5pdGlhbCBVSSB1cGRhdGUgZm9yIGlubGluZSB2YXJpYW50XG4gICAgaWYgKCF2YXJpYW50IHx8IHZhcmlhbnQuaXNPcGVuKCkpIHtcbiAgICAgIHVwZGF0ZVVJKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbG9yUGlja2VyQ29tcG9uZW50O1xuICB9O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQk8sU0FBUyxXQUFXLENBQ3pCLElBQ0EsSUFDQSxJQUNBLElBQ1E7QUFBQSxFQUNSLE9BQU8sS0FBSyxLQUFLLEtBQUssSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQUE7QUFZdkQsU0FBUyxRQUFRLENBQ3RCLElBQ0EsSUFDQSxJQUNBLElBQ1E7QUFBQSxFQUNSLE1BQU0sUUFBUyxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssRUFBRSxJQUFJLE1BQU8sS0FBSztBQUFBLEVBQzFELE9BQU8sUUFBUSxJQUFJLFFBQVEsTUFBTTtBQUFBO0FBVzVCLFNBQVMsa0JBQWtCLENBQ2hDLE1BQ0EsZUFDQSxPQUNjO0FBQUEsRUFDZCxNQUFNLFVBQVUsS0FBSyxJQUFJO0FBQUEsRUFDekIsSUFBSSxtQkFBbUI7QUFBQSxF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QUNyRCxTQUFTLGFBQWE7QUFBQSxNQUN0QixPQUFPO0FBQUE7QUFBQSxJQUtULElBQUksQ0FBQyxPQUFlLFlBQTBDO0FBQUEsTUFDNUQsR0FBRyxPQUFPLE9BQU87QUFBQSxNQUNqQixPQUFPO0FBQUE7QUFBQSxJQUdULEtBQUssQ0FBQyxPQUFlLFlBQTBDO0FBQUEsTUFDN0QsSUFBSSxPQUFPLE9BQU87QUFBQSxNQUNsQixPQUFPO0FBQUE7QUFBQSxJQUtULFNBQVMsTUFBTTtBQUFBLE1BQ2IsVUFBVSxRQUFRO0FBQUE7QUFBQSxFQUV0QjtBQUFBLEVBR0MscUJBQTZCLFdBQVc7QUFBQSxFQUN4QyxxQkFBNkIsV0FBVztBQUFBLEVBR3pDLElBQUksQ0FBQyxXQUFXLFFBQVEsT0FBTyxHQUFHO0FBQUEsSUFDaEMsU0FBUztBQUFBLEVBQ1g7QUFBQSxFQUVBLE9BQU87QUFBQTs7O0FYcFBYLElBQU0sb0JBQW9CLENBQ3hCLFNBQTRCLENBQUMsTUFDSjtBQUFBLEVBQ3pCLE1BQU0sYUFBYSxrQkFBaUIsTUFBTTtBQUFBLEVBRTFDLElBQUk7QUFBQSxJQUNGLE1BQU0sdUJBQ0osV0FBVyxZQUFZLHFCQUFxQixZQUM1QyxXQUFXLFlBQVkscUJBQXFCO0FBQUEsSUFFOUMsTUFBTSxjQUFjLG1CQUNsQiwwQkFDQSx5QkFBVyxHQUNYLDBCQUFZLGtCQUFpQixVQUFVLENBQUMsR0FDeEMsMkJBQWEsVUFBVSxHQUV2Qix1QkFBdUIsWUFBWSxVQUFVLElBQUksQ0FBQyxNQUFXLEdBRTdELFdBQVcsYUFBYSxRQUFRLFNBQVMsVUFBVSxJQUFJLENBQUMsTUFBVyxHQUNuRSxXQUFXLFlBQVksUUFBUSxRQUFRLFVBQVUsSUFBSSxDQUFDLE1BQVcsR0FDakUsV0FBVyxnQkFBZ0IsT0FBTyxZQUFZLFVBQVUsSUFBSSxDQUFDLE1BQVcsR0FDeEUsV0FBVyxjQUFjLFNBQVMsV0FBVyxnQkFBZ0IsUUFDekQsVUFBVSxVQUFVLElBQ3BCLENBQUMsTUFBVyxHQUNoQixXQUFXLGlCQUFpQixRQUN4QixhQUFhLFVBQVUsSUFDdkIsQ0FBQyxNQUFXLEdBRWhCLFdBQVcsZ0JBQWdCLFVBQ3hCLHNCQUFzQixLQUFLLFdBQVcsZUFDckMsWUFBWSxVQUFVLElBQ3RCLENBQUMsTUFBVyxHQUNoQiw0QkFBYyxHQUNkLENBQUMsU0FBYyxTQUFRLGFBQWEsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUNqRCxFQUFFLFVBQVU7QUFBQSxJQUVaLE9BQU87QUFBQSxJQUNQLE9BQU8sT0FBTztBQUFBLElBQ2QsUUFBUSxNQUFNLCtCQUErQixLQUFLO0FBQUEsSUFDbEQsTUFBTSxJQUFJLE1BQ1IsaUNBQWtDLE1BQWdCLFNBQ3BEO0FBQUE7QUFBQTtBQUlKLElBQWU7IiwKICAiZGVidWdJZCI6ICJFNjQ2RjQ3ODcxRTJENzhBNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
9108
|
+
//# debugId=AB57C3535EAAC08964756E2164756E21
|
|
9109
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdXRpbHMudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvdGFwLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL2xvbmdwcmVzcy50cyIsICIuLi9zcmMvY29yZS9nZXN0dXJlcy9wYW4udHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcGluY2gudHMiLCAiLi4vc3JjL2NvcmUvZ2VzdHVyZXMvcm90YXRlLnRzIiwgIi4uL3NyYy9jb3JlL2dlc3R1cmVzL21hbmFnZXIudHMiLCAiLi4vc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy9pbmRleC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3RhcC50cyIsICIuLi9zcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3N3aXBlLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvbG9uZ3ByZXNzLnRzIiwgIi4uL3NyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMvcGFuLnRzIiwgIi4uL3NyYy9jb3JlL2xheW91dC9zY2hlbWEudHMiLCAiLi4vc3JjL2NvcmUvbGF5b3V0L2NvbmZpZy50cyIsICIuLi9zcmMvY29yZS9sYXlvdXQvanN4LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3V0aWxzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2Jhc2UudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvY29uc3RhbnRzLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3ZpcnR1YWwudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvc2Nyb2xsaW5nLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL21vbWVudHVtLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3Njcm9sbGJhci50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9jb2xsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL3BsYWNlaG9sZGVycy50cyIsICIuLi9zcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9yZW5kZXJpbmcudHMiLCAiLi4vc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL3ZpZXdwb3J0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2FwaS50cyIsICIuLi9zcmMvY29tcG9uZW50cy92bGlzdC9jb25zdGFudHMudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvc2VsZWN0aW9uLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2tleWJvYXJkLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZm9ybS50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2xheW91dC50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbnN0YW50cy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2NvbmZpZy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2ZpZWxkcy50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2RhdGEudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9jb250cm9sbGVyLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvc3VibWl0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2Zvcm0vZmVhdHVyZXMvcHJvdGVjdGlvbi50cyIsICIuLi9zcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2FwaS50cyIsICIuLi9zcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9jb2xvcnBpY2tlci50cyIsICIuLi9zcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9jb25zdGFudHMudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvY29sb3JwaWNrZXIvdXRpbHMudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvY29sb3JwaWNrZXIvY29uZmlnLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2NvbG9ycGlja2VyL2ZlYXR1cmVzL2FyZWEudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvY29sb3JwaWNrZXIvZmVhdHVyZXMvaHVlLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2NvbG9ycGlja2VyL2ZlYXR1cmVzL3N3YXRjaGVzLnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2NvbG9ycGlja2VyL2ZlYXR1cmVzL2lucHV0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2NvbG9ycGlja2VyL2ZlYXR1cmVzL3ZhcmlhbnQudHMiLCAiLi4vc3JjL2NvbXBvbmVudHMvY29sb3JwaWNrZXIvZmVhdHVyZXMvcGlwZXR0ZS50cyIsICIuLi9zcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9mZWF0dXJlcy9vcGFjaXR5LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL2NvbG9ycGlja2VyL2FwaS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy91dGlscy50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBHZXN0dXJlRXZlbnQsIEdlc3R1cmVTdGF0ZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQ2FsY3VsYXRlIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50c1xuICpcbiAqIEBwYXJhbSB4MSAtIFggY29vcmRpbmF0ZSBvZiBmaXJzdCBwb2ludFxuICogQHBhcmFtIHkxIC0gWSBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0geDIgLSBYIGNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50XG4gKiBAcGFyYW0geTIgLSBZIGNvb3JkaW5hdGUgb2Ygc2Vjb25kIHBvaW50XG4gKiBAcmV0dXJucyBEaXN0YW5jZSBiZXR3ZWVuIHRoZSBwb2ludHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldERpc3RhbmNlKFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICB4MjogbnVtYmVyLFxuICB5MjogbnVtYmVyXG4pOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHgyIC0geDEsIDIpICsgTWF0aC5wb3coeTIgLSB5MSwgMikpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSBhbmdsZSBiZXR3ZWVuIHR3byBwb2ludHMgaW4gZGVncmVlcyAoMC0zNjApXG4gKlxuICogQHBhcmFtIHgxIC0gWCBjb29yZGluYXRlIG9mIGZpcnN0IHBvaW50XG4gKiBAcGFyYW0geTEgLSBZIGNvb3JkaW5hdGUgb2YgZmlyc3QgcG9pbnRcbiAqIEBwYXJhbSB4MiAtIFggY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEBwYXJhbSB5MiAtIFkgY29vcmRpbmF0ZSBvZiBzZWNvbmQgcG9pbnRcbiAqIEByZXR1cm5zIEFuZ2xlIGluIGRlZ3JlZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEFuZ2xlKFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICB4MjogbnVtYmVyLFxuICB5MjogbnVtYmVyXG4pOiBudW1iZXIge1xuICBjb25zdCBhbmdsZSA9IChNYXRoLmF0YW4yKHkyIC0geTEsIHgyIC0geDEpICogMTgwKSAvIE1hdGguUEk7XG4gIHJldHVybiBhbmdsZSA8IDAgPyBhbmdsZSArIDM2MCA6IGFuZ2xlO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhIGJhc2UgZ2VzdHVyZSBldmVudFxuICpcbiAqIEBwYXJhbSB0eXBlIC0gVHlwZSBvZiBnZXN0dXJlXG4gKiBAcGFyYW0gb3JpZ2luYWxFdmVudCAtIE9yaWdpbmFsIERPTSBldmVudFxuICogQHBhcmFtIHN0YXRlIC0gQ3VycmVudCBnZXN0dXJlIHN0YXRlXG4gKiBAcmV0dXJucyBCYXNlIGdlc3R1cmUgZXZlbnQgb2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVHZXN0dXJlRXZlbnQoXG4gIHR5cGU6IHN0cmluZyxcbiAgb3JpZ2luYWxFdmVudDogRXZlbnQsXG4gIHN0YXRlOiBHZXN0dXJlU3RhdGVcbik6IEdlc3R1cmVFdmVudCB7XG4gIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGV2ZW50OiBHZXN0dXJlRXZlbnQgPSB7XG4gICAgdHlwZSxcbiAgICBvcmlnaW5hbEV2ZW50LFxuICAgIHRhcmdldDpcbiAgICAgIChzdGF0ZS50YXJnZXQgYXMgRXZlbnRUYXJnZXQpIHx8IChvcmlnaW5hbEV2ZW50LnRhcmdldCBhcyBFdmVudFRhcmdldCksXG4gICAgc3RhcnRUaW1lOiBzdGF0ZS5zdGFydFRpbWUsXG4gICAgZW5kVGltZSxcbiAgICBkdXJhdGlvbjogZW5kVGltZSAtIHN0YXRlLnN0YXJ0VGltZSxcbiAgICBkZWZhdWx0UHJldmVudGVkLFxuICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICBkZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgIGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgaWYgKG9yaWdpbmFsRXZlbnQuY2FuY2VsYWJsZSkge1xuICAgICAgICBvcmlnaW5hbEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgIG9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gZXZlbnQ7XG59XG5cbi8qKlxuICogRGV0ZWN0IGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdG91Y2ggZXZlbnRzXG4gKlxuICogQHJldHVybnMgV2hldGhlciB0b3VjaCBpcyBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1RvdWNoU3VwcG9ydCgpOiBib29sZWFuIHtcbiAgY29uc3QgbWF4UG9pbnRzID0gKG5hdmlnYXRvciBhcyBhbnkpLm1heFRvdWNoUG9pbnRzO1xuICByZXR1cm4gKFxuICAgIFwib250b3VjaHN0YXJ0XCIgaW4gd2luZG93IHx8ICh0eXBlb2YgbWF4UG9pbnRzID09PSBcIm51bWJlclwiICYmIG1heFBvaW50cyA+IDApXG4gICk7XG59XG5cbi8qKlxuICogRGV0ZWN0IGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgcG9pbnRlciBldmVudHNcbiAqXG4gKiBAcmV0dXJucyBXaGV0aGVyIHBvaW50ZXIgZXZlbnRzIGFyZSBzdXBwb3J0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhc1BvaW50ZXJTdXBwb3J0KCk6IGJvb2xlYW4ge1xuICByZXR1cm4gISF3aW5kb3cuUG9pbnRlckV2ZW50O1xufVxuXG4vKipcbiAqIEV4dHJhY3Qgbm9ybWFsaXplZCB0b3VjaCBjb29yZGluYXRlcyBmcm9tIGFuIGV2ZW50XG4gKiBXb3JrcyB3aXRoIG1vdXNlIGV2ZW50cywgdG91Y2ggZXZlbnRzIGFuZCBwb2ludGVyIGV2ZW50c1xuICpcbiAqIEBwYXJhbSBlIC0gRE9NIGV2ZW50XG4gKiBAcmV0dXJucyBPYmplY3Qgd2l0aCBjbGllbnRYIGFuZCBjbGllbnRZIGNvb3JkaW5hdGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb3VjaENvb3JkaW5hdGVzKFxuICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCB8IFBvaW50ZXJFdmVudFxuKTogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9IHtcbiAgaWYgKFwidG91Y2hlc1wiIGluIGUgJiYgQXJyYXkuaXNBcnJheShlLnRvdWNoZXMpICYmIGUudG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNsaWVudFg6IGUudG91Y2hlc1swXS5jbGllbnRYLFxuICAgICAgY2xpZW50WTogZS50b3VjaGVzWzBdLmNsaWVudFksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY2xpZW50WDogKGUgYXMgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCkuY2xpZW50WCxcbiAgICBjbGllbnRZOiAoZSBhcyBNb3VzZUV2ZW50IHwgUG9pbnRlckV2ZW50KS5jbGllbnRZLFxuICB9O1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy90YXAudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gVGFwIGdlc3R1cmUgZGV0ZWN0aW9uXG4gKi9cblxuaW1wb3J0IHsgVGFwRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBEZXRlY3QgdGFwIGdlc3R1cmVcbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBUYXAgZXZlbnQgb3IgbnVsbCBpZiBubyB0YXAgZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFRhcChjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCk6IFRhcEV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG4gIFxuICAvLyBDYWxjdWxhdGUgZGlzdGFuY2UgYmV0d2VlbiBzdGFydCBhbmQgY3VycmVudCBwb3NpdGlvblxuICBjb25zdCBkZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLnN0YXJ0WDtcbiAgY29uc3QgZGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5zdGFydFk7XG4gIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gIFxuICAvLyBDaGVjayBpZiBtb3ZlbWVudCBpcyB3aXRoaW4gdGhyZXNob2xkXG4gIGlmIChkaXN0YW5jZSA8IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQpIHtcbiAgICAvLyBDaGVjayBmb3IgZG91YmxlIHRhcFxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgaXNEb3VibGVUYXAgPSBub3cgLSBzdGF0ZS5sYXN0VGFwVGltZSA8IDMwMDtcbiAgICBcbiAgICBjb25zdCB0YXBDb3VudCA9IGlzRG91YmxlVGFwID8gc3RhdGUudGFwQ291bnQgKyAxIDogMTtcbiAgICBcbiAgICAvLyBDcmVhdGUgdGFwIGV2ZW50XG4gICAgY29uc3QgdGFwRXZlbnQ6IFRhcEV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KCd0YXAnLCBvcmlnaW5hbEV2ZW50LCBzdGF0ZSksXG4gICAgICB0eXBlOiAndGFwJyxcbiAgICAgIGNvdW50OiB0YXBDb3VudCxcbiAgICAgIHg6IHN0YXRlLmN1cnJlbnRYLFxuICAgICAgeTogc3RhdGUuY3VycmVudFlcbiAgICB9O1xuICAgIFxuICAgIHJldHVybiB0YXBFdmVudDtcbiAgfVxuICBcbiAgcmV0dXJuIG51bGw7XG59IiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9zd2lwZS50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBTd2lwZSBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFN3aXBlRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LCBTV0lQRV9ESVJFQ1RJT05TIH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQgfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBEZXRlcm1pbmUgc3dpcGUgZGlyZWN0aW9uIGJhc2VkIG9uIGRlbHRhIFggYW5kIFlcbiAqIFxuICogQHBhcmFtIGRlbHRhWCAtIERpc3RhbmNlIG1vdmVkIGluIFggZGlyZWN0aW9uXG4gKiBAcGFyYW0gZGVsdGFZIC0gRGlzdGFuY2UgbW92ZWQgaW4gWSBkaXJlY3Rpb25cbiAqIEByZXR1cm5zIERpcmVjdGlvbiBvZiB0aGUgc3dpcGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN3aXBlRGlyZWN0aW9uKGRlbHRhWDogbnVtYmVyLCBkZWx0YVk6IG51bWJlcik6IFNXSVBFX0RJUkVDVElPTlMge1xuICBpZiAoTWF0aC5hYnMoZGVsdGFYKSA+IE1hdGguYWJzKGRlbHRhWSkpIHtcbiAgICByZXR1cm4gZGVsdGFYID4gMCA/IFNXSVBFX0RJUkVDVElPTlMuUklHSFQgOiBTV0lQRV9ESVJFQ1RJT05TLkxFRlQ7XG4gIH1cbiAgcmV0dXJuIGRlbHRhWSA+IDAgPyBTV0lQRV9ESVJFQ1RJT05TLkRPV04gOiBTV0lQRV9ESVJFQ1RJT05TLlVQO1xufVxuXG4vKipcbiAqIERldGVjdCBzd2lwZSBnZXN0dXJlXG4gKiBcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHJldHVybnMgU3dpcGUgZXZlbnQgb3IgbnVsbCBpZiBubyBzd2lwZSBkZXRlY3RlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0U3dpcGUoY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQpOiBTd2lwZUV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG4gIFxuICAvLyBDYWxjdWxhdGUgZGVsdGFzIGFuZCBkaXN0YW5jZVxuICBjb25zdCBkZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLnN0YXJ0WDtcbiAgY29uc3QgZGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5zdGFydFk7XG4gIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gIFxuICAvLyBDYWxjdWxhdGUgdGltZSBhbmQgdmVsb2NpdHlcbiAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCk7XG4gIGNvbnN0IGRlbHRhVGltZSA9IGVuZFRpbWUgLSBzdGF0ZS5zdGFydFRpbWU7XG4gIGNvbnN0IHZlbG9jaXR5ID0gZGlzdGFuY2UgLyBkZWx0YVRpbWU7XG4gIFxuICAvLyBDaGVjayBpZiBpdCdzIGEgc3dpcGVcbiAgaWYgKGRpc3RhbmNlID49IG9wdGlvbnMuc3dpcGVUaHJlc2hvbGQgJiYgZGVsdGFUaW1lIDw9IG9wdGlvbnMuc3dpcGVUaW1lVGhyZXNob2xkKSB7XG4gICAgY29uc3QgZGlyZWN0aW9uID0gZ2V0U3dpcGVEaXJlY3Rpb24oZGVsdGFYLCBkZWx0YVkpO1xuICAgIFxuICAgIC8vIENyZWF0ZSBzd2lwZSBldmVudFxuICAgIGNvbnN0IHN3aXBlRXZlbnQ6IFN3aXBlRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoJ3N3aXBlJywgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogJ3N3aXBlJyxcbiAgICAgIGRpcmVjdGlvbixcbiAgICAgIGRlbHRhWCxcbiAgICAgIGRlbHRhWSxcbiAgICAgIGRpc3RhbmNlLFxuICAgICAgdmVsb2NpdHksXG4gICAgICBzdGFydFg6IHN0YXRlLnN0YXJ0WCxcbiAgICAgIHN0YXJ0WTogc3RhdGUuc3RhcnRZLFxuICAgICAgZW5kWDogc3RhdGUuY3VycmVudFgsXG4gICAgICBlbmRZOiBzdGF0ZS5jdXJyZW50WVxuICAgIH07XG4gICAgXG4gICAgcmV0dXJuIHN3aXBlRXZlbnQ7XG4gIH1cbiAgXG4gIHJldHVybiBudWxsO1xufSIsCiAgICAiLy8gc3JjL2NvcmUvZ2VzdHVyZXMvbG9uZ3ByZXNzLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIExvbmcgcHJlc3MgZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBMb25nUHJlc3NFdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCB9IGZyb20gJy4vdXRpbHMnO1xuXG4vKipcbiAqIERldGVjdCBsb25nIHByZXNzIGdlc3R1cmVcbiAqIFxuICogVGhpcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgZnJvbSBvdGhlciBnZXN0dXJlIGRldGVjdG9ycyBhcyBpdCBzZXRzIHVwIGEgdGltZXJcbiAqIGFuZCByZXR1cm5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSB0aW1lciBjb21wbGV0ZXMuXG4gKiBcbiAqIEBwYXJhbSBjb250ZXh0IC0gR2VzdHVyZSBkZXRlY3Rpb24gY29udGV4dFxuICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIGxvbmcgcHJlc3MgaXMgZGV0ZWN0ZWRcbiAqIEByZXR1cm5zIENsZWFudXAgZnVuY3Rpb24gdG8gY2FuY2VsIHRoZSBsb25nIHByZXNzIGRldGVjdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZGV0ZWN0TG9uZ1ByZXNzKFxuICBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCxcbiAgY2FsbGJhY2s6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbik6ICgpID0+IHZvaWQge1xuICBjb25zdCB7IHN0YXRlLCBvcHRpb25zLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuICBcbiAgLy8gU2V0IGEgdGltZXIgZm9yIGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gIGNvbnN0IHRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgIC8vIE9ubHkgdHJpZ2dlciBpZiBnZXN0dXJlIGlzIHN0aWxsIGFjdGl2ZVxuICAgIGlmIChzdGF0ZS5hY3RpdmUpIHtcbiAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHdpdGhpbiB0aHJlc2hvbGRcbiAgICAgIGNvbnN0IGRpZmZYID0gTWF0aC5hYnMoc3RhdGUuY3VycmVudFggLSBzdGF0ZS5zdGFydFgpO1xuICAgICAgY29uc3QgZGlmZlkgPSBNYXRoLmFicyhzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WSk7XG4gICAgICBcbiAgICAgIGlmIChkaWZmWCA8IG9wdGlvbnMudGFwRGlzdGFuY2VUaHJlc2hvbGQgJiYgZGlmZlkgPCBvcHRpb25zLnRhcERpc3RhbmNlVGhyZXNob2xkKSB7XG4gICAgICAgIC8vIENyZWF0ZSBsb25nIHByZXNzIGV2ZW50XG4gICAgICAgIGNvbnN0IGxvbmdQcmVzc0V2ZW50OiBMb25nUHJlc3NFdmVudCA9IHtcbiAgICAgICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoJ2xvbmdwcmVzcycsIG9yaWdpbmFsRXZlbnQsIHN0YXRlKSxcbiAgICAgICAgICB0eXBlOiAnbG9uZ3ByZXNzJyxcbiAgICAgICAgICB4OiBzdGF0ZS5jdXJyZW50WCxcbiAgICAgICAgICB5OiBzdGF0ZS5jdXJyZW50WVxuICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgLy8gVHJpZ2dlciBjYWxsYmFja1xuICAgICAgICBjYWxsYmFjayhsb25nUHJlc3NFdmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9LCBvcHRpb25zLmxvbmdQcmVzc1RpbWUpO1xuICBcbiAgLy8gUmV0dXJuIGNsZWFudXAgZnVuY3Rpb25cbiAgcmV0dXJuICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICB9O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIG1vdmVtZW50IHdvdWxkIGNhbmNlbCBhIGxvbmcgcHJlc3NcbiAqIFxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBsb25nIHByZXNzIHNob3VsZCBiZSBjYW5jZWxlZFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsTG9uZ1ByZXNzKGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0KTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgc3RhdGUsIG9wdGlvbnMgfSA9IGNvbnRleHQ7XG4gIFxuICBjb25zdCBkaWZmWCA9IE1hdGguYWJzKHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYKTtcbiAgY29uc3QgZGlmZlkgPSBNYXRoLmFicyhzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WSk7XG4gIFxuICByZXR1cm4gZGlmZlggPiBvcHRpb25zLnRhcERpc3RhbmNlVGhyZXNob2xkIHx8IGRpZmZZID4gb3B0aW9ucy50YXBEaXN0YW5jZVRocmVzaG9sZDtcbn0iLAogICAgIi8vIHNyYy9jb3JlL2dlc3R1cmVzL3Bhbi50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBQYW4gZ2VzdHVyZSBkZXRlY3Rpb25cbiAqL1xuXG5pbXBvcnQgeyBQYW5FdmVudCwgR2VzdHVyZURldGVjdGlvbkNvbnRleHQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlR2VzdHVyZUV2ZW50IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZXRlY3QgcGFuIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEByZXR1cm5zIFBhbiBldmVudCBvciBudWxsIGlmIG5vIHNpZ25pZmljYW50IG1vdmVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXRlY3RQYW4oY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQpOiBQYW5FdmVudCB8IG51bGwge1xuICBjb25zdCB7IHN0YXRlLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuXG4gIC8vIENhbGN1bGF0ZSBkZWx0YSBmcm9tIHN0YXJ0IHBvc2l0aW9uXG4gIGNvbnN0IGRlbHRhWCA9IHN0YXRlLmN1cnJlbnRYIC0gc3RhdGUuc3RhcnRYO1xuICBjb25zdCBkZWx0YVkgPSBzdGF0ZS5jdXJyZW50WSAtIHN0YXRlLnN0YXJ0WTtcblxuICAvLyBDYWxjdWxhdGUgZGVsdGEgZnJvbSBsYXN0IHBvc2l0aW9uIHRvIGRldGVybWluZSBpZiB0aGVyZSdzIHNpZ25pZmljYW50IG1vdmVtZW50XG4gIGNvbnN0IG1vdmVEZWx0YVggPSBzdGF0ZS5jdXJyZW50WCAtIHN0YXRlLmxhc3RYO1xuICBjb25zdCBtb3ZlRGVsdGFZID0gc3RhdGUuY3VycmVudFkgLSBzdGF0ZS5sYXN0WTtcbiAgY29uc3QgbW92ZURlbHRhID0gTWF0aC5zcXJ0KFxuICAgIG1vdmVEZWx0YVggKiBtb3ZlRGVsdGFYICsgbW92ZURlbHRhWSAqIG1vdmVEZWx0YVlcbiAgKTtcblxuICAvLyBDaGVjayBpZiBtb3ZlbWVudCBpcyBzaWduaWZpY2FudFxuICBpZiAobW92ZURlbHRhID4gMCkge1xuICAgIC8vIENyZWF0ZSBwYW4gZXZlbnRcbiAgICBjb25zdCBwYW5FdmVudDogUGFuRXZlbnQgPSB7XG4gICAgICAuLi5jcmVhdGVHZXN0dXJlRXZlbnQoXCJwYW5cIiwgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogXCJwYW5cIixcbiAgICAgIGRlbHRhWCxcbiAgICAgIGRlbHRhWSxcbiAgICAgIHN0YXJ0WDogc3RhdGUuc3RhcnRYLFxuICAgICAgc3RhcnRZOiBzdGF0ZS5zdGFydFksXG4gICAgICBjdXJyZW50WDogc3RhdGUuY3VycmVudFgsXG4gICAgICBjdXJyZW50WTogc3RhdGUuY3VycmVudFksXG4gICAgfTtcblxuICAgIHJldHVybiBwYW5FdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9waW5jaC50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBQaW5jaCBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFBpbmNoRXZlbnQsIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUdlc3R1cmVFdmVudCwgZ2V0RGlzdGFuY2UgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIERldGVjdCBwaW5jaCBnZXN0dXJlXG4gKlxuICogQHBhcmFtIGNvbnRleHQgLSBHZXN0dXJlIGRldGVjdGlvbiBjb250ZXh0XG4gKiBAcGFyYW0gdG91Y2gxIC0gRmlyc3QgdG91Y2ggcG9pbnRcbiAqIEBwYXJhbSB0b3VjaDIgLSBTZWNvbmQgdG91Y2ggcG9pbnRcbiAqIEByZXR1cm5zIFBpbmNoIGV2ZW50IG9yIG51bGwgaWYgbm8gcGluY2ggZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFBpbmNoKFxuICBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCxcbiAgdG91Y2gxOiBUb3VjaCxcbiAgdG91Y2gyOiBUb3VjaFxuKTogUGluY2hFdmVudCB8IG51bGwge1xuICBjb25zdCB7IHN0YXRlLCBvcmlnaW5hbEV2ZW50IH0gPSBjb250ZXh0O1xuXG4gIC8vIENhbGN1bGF0ZSBjdXJyZW50IGRpc3RhbmNlIGJldHdlZW4gdG91Y2ggcG9pbnRzXG4gIGNvbnN0IGN1cnJlbnREaXN0YW5jZSA9IGdldERpc3RhbmNlKFxuICAgIHRvdWNoMS5jbGllbnRYLFxuICAgIHRvdWNoMS5jbGllbnRZLFxuICAgIHRvdWNoMi5jbGllbnRYLFxuICAgIHRvdWNoMi5jbGllbnRZXG4gICk7XG5cbiAgLy8gTWluaW11bSBtb3ZlbWVudCB0aHJlc2hvbGQgZm9yIHBpbmNoIGRldGVjdGlvblxuICBjb25zdCBQSU5DSF9USFJFU0hPTEQgPSAxMDtcblxuICAvLyBDaGVjayBpZiB0aGUgZGlzdGFuY2UgY2hhbmdlIGlzIHNpZ25pZmljYW50XG4gIGlmIChNYXRoLmFicyhjdXJyZW50RGlzdGFuY2UgLSBzdGF0ZS5zdGFydERpc3RhbmNlKSA+IFBJTkNIX1RIUkVTSE9MRCkge1xuICAgIC8vIENhbGN1bGF0ZSBzY2FsZSBmYWN0b3JcbiAgICBjb25zdCBzY2FsZSA9IGN1cnJlbnREaXN0YW5jZSAvIHN0YXRlLnN0YXJ0RGlzdGFuY2U7XG5cbiAgICAvLyBDYWxjdWxhdGUgY2VudGVyIHBvaW50XG4gICAgY29uc3QgY2VudGVyWCA9ICh0b3VjaDEuY2xpZW50WCArIHRvdWNoMi5jbGllbnRYKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9ICh0b3VjaDEuY2xpZW50WSArIHRvdWNoMi5jbGllbnRZKSAvIDI7XG5cbiAgICAvLyBDcmVhdGUgcGluY2ggZXZlbnRcbiAgICBjb25zdCBwaW5jaEV2ZW50OiBQaW5jaEV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KFwicGluY2hcIiwgb3JpZ2luYWxFdmVudCwgc3RhdGUpLFxuICAgICAgdHlwZTogXCJwaW5jaFwiLFxuICAgICAgc2NhbGUsXG4gICAgICBjZW50ZXJYLFxuICAgICAgY2VudGVyWSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHBpbmNoRXZlbnQ7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cbiIsCiAgICAiLy8gc3JjL2NvcmUvZ2VzdHVyZXMvcm90YXRlLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIFJvdGF0ZSBnZXN0dXJlIGRldGVjdGlvblxuICovXG5cbmltcG9ydCB7IFJvdGF0ZUV2ZW50LCBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVHZXN0dXJlRXZlbnQsIGdldEFuZ2xlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZXRlY3Qgcm90YXRlIGdlc3R1cmVcbiAqXG4gKiBAcGFyYW0gY29udGV4dCAtIEdlc3R1cmUgZGV0ZWN0aW9uIGNvbnRleHRcbiAqIEBwYXJhbSB0b3VjaDEgLSBGaXJzdCB0b3VjaCBwb2ludFxuICogQHBhcmFtIHRvdWNoMiAtIFNlY29uZCB0b3VjaCBwb2ludFxuICogQHJldHVybnMgUm90YXRlIGV2ZW50IG9yIG51bGwgaWYgbm8gcm90YXRpb24gZGV0ZWN0ZWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFJvdGF0ZShcbiAgY29udGV4dDogR2VzdHVyZURldGVjdGlvbkNvbnRleHQsXG4gIHRvdWNoMTogVG91Y2gsXG4gIHRvdWNoMjogVG91Y2hcbik6IFJvdGF0ZUV2ZW50IHwgbnVsbCB7XG4gIGNvbnN0IHsgc3RhdGUsIG9yaWdpbmFsRXZlbnQgfSA9IGNvbnRleHQ7XG5cbiAgLy8gQ2FsY3VsYXRlIGN1cnJlbnQgYW5nbGUgYmV0d2VlbiB0b3VjaCBwb2ludHNcbiAgY29uc3QgY3VycmVudEFuZ2xlID0gZ2V0QW5nbGUoXG4gICAgdG91Y2gxLmNsaWVudFgsXG4gICAgdG91Y2gxLmNsaWVudFksXG4gICAgdG91Y2gyLmNsaWVudFgsXG4gICAgdG91Y2gyLmNsaWVudFlcbiAgKTtcblxuICAvLyBNaW5pbXVtIHJvdGF0aW9uIHRocmVzaG9sZCBmb3IgZGV0ZWN0aW9uXG4gIGNvbnN0IFJPVEFUSU9OX1RIUkVTSE9MRCA9IDEwO1xuXG4gIC8vIENhbGN1bGF0ZSByb3RhdGlvbiBkaWZmZXJlbmNlXG4gIGNvbnN0IHJvdGF0aW9uRGlmZiA9IGN1cnJlbnRBbmdsZSAtIHN0YXRlLnN0YXJ0QW5nbGU7XG5cbiAgLy8gQ2hlY2sgaWYgcm90YXRpb24gaXMgc2lnbmlmaWNhbnRcbiAgaWYgKE1hdGguYWJzKHJvdGF0aW9uRGlmZikgPiBST1RBVElPTl9USFJFU0hPTEQpIHtcbiAgICAvLyBDYWxjdWxhdGUgY2VudGVyIHBvaW50XG4gICAgY29uc3QgY2VudGVyWCA9ICh0b3VjaDEuY2xpZW50WCArIHRvdWNoMi5jbGllbnRYKSAvIDI7XG4gICAgY29uc3QgY2VudGVyWSA9ICh0b3VjaDEuY2xpZW50WSArIHRvdWNoMi5jbGllbnRZKSAvIDI7XG5cbiAgICAvLyBDcmVhdGUgcm90YXRlIGV2ZW50XG4gICAgY29uc3Qgcm90YXRlRXZlbnQ6IFJvdGF0ZUV2ZW50ID0ge1xuICAgICAgLi4uY3JlYXRlR2VzdHVyZUV2ZW50KFwicm90YXRlXCIsIG9yaWdpbmFsRXZlbnQsIHN0YXRlKSxcbiAgICAgIHR5cGU6IFwicm90YXRlXCIsXG4gICAgICByb3RhdGlvbjogcm90YXRpb25EaWZmLFxuICAgICAgY2VudGVyWCxcbiAgICAgIGNlbnRlclksXG4gICAgfTtcblxuICAgIHJldHVybiByb3RhdGVFdmVudDtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS9nZXN0dXJlcy9tYW5hZ2VyLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEdlc3R1cmUgbWFuYWdlbWVudCBzeXN0ZW0gZm9yIGhhbmRsaW5nIHRvdWNoIGFuZCBtb3VzZSBpbnRlcmFjdGlvbnNcbiAqL1xuXG5pbXBvcnQgeyBcbiAgR2VzdHVyZUNvbmZpZyxcbiAgR2VzdHVyZU1hbmFnZXIsXG4gIEdlc3R1cmVTdGF0ZSxcbiAgR2VzdHVyZUhhbmRsZXIsXG4gIEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0LFxuICBBbnlHZXN0dXJlRXZlbnQsXG4gIEdFU1RVUkVfVFlQRVMsXG4gIFNXSVBFX0RJUkVDVElPTlNcbn0gZnJvbSAnLi90eXBlcyc7XG5cbmltcG9ydCB7IGRldGVjdFRhcCB9IGZyb20gJy4vdGFwJztcbmltcG9ydCB7IGRldGVjdFN3aXBlIH0gZnJvbSAnLi9zd2lwZSc7XG5pbXBvcnQgeyBkZXRlY3RMb25nUHJlc3MsIHNob3VsZENhbmNlbExvbmdQcmVzcyB9IGZyb20gJy4vbG9uZ3ByZXNzJztcbmltcG9ydCB7IGRldGVjdFBhbiB9IGZyb20gJy4vcGFuJztcbmltcG9ydCB7IGRldGVjdFBpbmNoIH0gZnJvbSAnLi9waW5jaCc7XG5pbXBvcnQgeyBkZXRlY3RSb3RhdGUgfSBmcm9tICcuL3JvdGF0ZSc7XG5pbXBvcnQgeyBoYXNUb3VjaFN1cHBvcnQsIGhhc1BvaW50ZXJTdXBwb3J0LCBnZXRUb3VjaENvb3JkaW5hdGVzIH0gZnJvbSAnLi91dGlscyc7XG5cbi8vIFJlLWV4cG9ydCB0eXBlcyBhbmQgY29uc3RhbnRzXG5leHBvcnQgeyBHRVNUVVJFX1RZUEVTLCBTV0lQRV9ESVJFQ1RJT05TIH07XG5cbi8qKlxuICogQ3JlYXRlcyBhIGdlc3R1cmUgbWFuYWdlciBmb3IgaGFuZGxpbmcgdG91Y2ggYW5kIG1vdXNlIGludGVyYWN0aW9uc1xuICogXG4gKiBAcGFyYW0gZWxlbWVudCAtIERPTSBlbGVtZW50IHRvIGF0dGFjaCBnZXN0dXJlIHJlY29nbml0aW9uIHRvXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyBHZXN0dXJlIG1hbmFnZXIgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUdlc3R1cmVNYW5hZ2VyID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbiAgY29uZmlnOiBHZXN0dXJlQ29uZmlnID0ge31cbik6IEdlc3R1cmVNYW5hZ2VyID0+IHtcbiAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gIGNvbnN0IG9wdGlvbnM6IFJlcXVpcmVkPEdlc3R1cmVDb25maWc+ID0ge1xuICAgIHN3aXBlVGhyZXNob2xkOiAzMCxcbiAgICBzd2lwZVRpbWVUaHJlc2hvbGQ6IDMwMCxcbiAgICBsb25nUHJlc3NUaW1lOiA1MDAsXG4gICAgdGFwRGlzdGFuY2VUaHJlc2hvbGQ6IDEwLFxuICAgIHByZXZlbnREZWZhdWx0OiB0cnVlLFxuICAgIHN0b3BQcm9wYWdhdGlvbjogZmFsc2UsXG4gICAgLi4uY29uZmlnXG4gIH07XG4gIFxuICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gIGNvbnN0IGhhbmRsZXJzOiBNYXA8c3RyaW5nLCBTZXQ8R2VzdHVyZUhhbmRsZXI+PiA9IG5ldyBNYXAoKTtcbiAgXG4gIC8vIEdlc3R1cmUgc3RhdGVcbiAgY29uc3Qgc3RhdGU6IEdlc3R1cmVTdGF0ZSA9IHtcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIHN0YXJ0VGltZTogMCxcbiAgICBzdGFydFg6IDAsXG4gICAgc3RhcnRZOiAwLFxuICAgIGxhc3RYOiAwLFxuICAgIGxhc3RZOiAwLFxuICAgIGN1cnJlbnRYOiAwLFxuICAgIGN1cnJlbnRZOiAwLFxuICAgIHRvdWNoQ291bnQ6IDAsXG4gICAgbG9uZ1ByZXNzVGltZXI6IG51bGwsXG4gICAgc3RhcnREaXN0YW5jZTogMCxcbiAgICBzdGFydEFuZ2xlOiAwLFxuICAgIGxhc3RUYXBUaW1lOiAwLFxuICAgIHRhcENvdW50OiAwLFxuICAgIHRhcmdldDogbnVsbFxuICB9O1xuICBcbiAgLy8gRGV0ZWN0IGZlYXR1cmUgc3VwcG9ydFxuICBjb25zdCBzdXBwb3J0VG91Y2ggPSBoYXNUb3VjaFN1cHBvcnQoKTtcbiAgY29uc3Qgc3VwcG9ydFBvaW50ZXIgPSBoYXNQb2ludGVyU3VwcG9ydCgpO1xuICAgIFxuICBjb25zdCBnZXN0dXJlU3VwcG9ydCA9IHtcbiAgICB0YXA6IHRydWUsXG4gICAgc3dpcGU6IHRydWUsXG4gICAgc3dpcGVsZWZ0OiB0cnVlLFxuICAgIHN3aXBlcmlnaHQ6IHRydWUsXG4gICAgc3dpcGV1cDogdHJ1ZSxcbiAgICBzd2lwZWRvd246IHRydWUsXG4gICAgbG9uZ3ByZXNzOiB0cnVlLFxuICAgIHBhbjogdHJ1ZSxcbiAgICBwaW5jaDogc3VwcG9ydFRvdWNoIHx8IHN1cHBvcnRQb2ludGVyLFxuICAgIHJvdGF0ZTogc3VwcG9ydFRvdWNoIHx8IHN1cHBvcnRQb2ludGVyXG4gIH07XG4gIFxuICAvKipcbiAgICogRGlzcGF0Y2ggYSBnZXN0dXJlIGV2ZW50XG4gICAqL1xuICBjb25zdCBkaXNwYXRjaEdlc3R1cmUgPSAoZXZlbnQ6IEFueUdlc3R1cmVFdmVudCk6IHZvaWQgPT4ge1xuICAgIC8vIEdldCBoYW5kbGVycyBmb3IgdGhpcyBldmVudCB0eXBlXG4gICAgY29uc3QgZXZlbnRIYW5kbGVycyA9IGhhbmRsZXJzLmdldChldmVudC50eXBlKTtcbiAgICBpZiAoIWV2ZW50SGFuZGxlcnMpIHJldHVybjtcbiAgICBcbiAgICAvLyBDYWxsIGVhY2ggaGFuZGxlclxuICAgIGV2ZW50SGFuZGxlcnMuZm9yRWFjaChoYW5kbGVyID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoZXZlbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gZ2VzdHVyZSBoYW5kbGVyIGZvciAke2V2ZW50LnR5cGV9OmAsIGVycm9yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBcbiAgICAvLyBGb3Igc3dpcGUsIGFsc28gZGlzcGF0Y2ggZGlyZWN0aW9uLXNwZWNpZmljIGV2ZW50c1xuICAgIGlmIChldmVudC50eXBlID09PSAnc3dpcGUnICYmICdkaXJlY3Rpb24nIGluIGV2ZW50KSB7XG4gICAgICBjb25zdCBkaXJlY3Rpb25FdmVudCA9IHsgLi4uZXZlbnQsIHR5cGU6IGBzd2lwZSR7ZXZlbnQuZGlyZWN0aW9ufWAgYXMgYW55IH07XG4gICAgICBkaXNwYXRjaEdlc3R1cmUoZGlyZWN0aW9uRXZlbnQgYXMgYW55KTtcbiAgICB9XG4gICAgXG4gICAgLy8gQXBwbHkgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBwcmV2ZW50RGVmYXVsdCBhbmQgc3RvcFByb3BhZ2F0aW9uXG4gICAgaWYgKG9wdGlvbnMucHJldmVudERlZmF1bHQgJiYgIWV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIFxuICAgIGlmIChvcHRpb25zLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfVxuICB9O1xuICBcbiAgLy8gUmVmZXJlbmNlIHRvIHRoZSBsb25ncHJlc3MgY2xlYW51cCBmdW5jdGlvblxuICBsZXQgbG9uZ1ByZXNzQ2xlYW51cDogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIHN0YXJ0XG4gICAqL1xuICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IHRvdWNoID0gZ2V0VG91Y2hDb29yZGluYXRlcyhlKTtcbiAgICBjb25zdCB0b3VjaENvdW50ID0gJ3RvdWNoZXMnIGluIGUgPyBlLnRvdWNoZXMubGVuZ3RoIDogMTtcbiAgICBcbiAgICAvLyBTdG9yZSBnZXN0dXJlIHN0YXRlXG4gICAgc3RhdGUuYWN0aXZlID0gdHJ1ZTtcbiAgICBzdGF0ZS5zdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHN0YXRlLnN0YXJ0WCA9IHN0YXRlLmxhc3RYID0gc3RhdGUuY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgIHN0YXRlLnN0YXJ0WSA9IHN0YXRlLmxhc3RZID0gc3RhdGUuY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuICAgIHN0YXRlLnRvdWNoQ291bnQgPSB0b3VjaENvdW50O1xuICAgIHN0YXRlLnRhcmdldCA9IGUudGFyZ2V0O1xuICAgIFxuICAgIC8vIEhhbmRsZSBtdWx0aS10b3VjaCBnZXN0dXJlc1xuICAgIGlmICh0b3VjaENvdW50ID09PSAyICYmICd0b3VjaGVzJyBpbiBlKSB7XG4gICAgICBjb25zdCB0b3VjaDEgPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCB0b3VjaDIgPSBlLnRvdWNoZXNbMV07XG4gICAgICBcbiAgICAgIC8vIFNldCBpbml0aWFsIHZhbHVlcyBmb3IgcGluY2ggYW5kIHJvdGF0ZVxuICAgICAgc3RhdGUuc3RhcnREaXN0YW5jZSA9IE1hdGguc3FydChcbiAgICAgICAgTWF0aC5wb3codG91Y2gyLmNsaWVudFggLSB0b3VjaDEuY2xpZW50WCwgMikgKyBcbiAgICAgICAgTWF0aC5wb3codG91Y2gyLmNsaWVudFkgLSB0b3VjaDEuY2xpZW50WSwgMilcbiAgICAgICk7XG4gICAgICBcbiAgICAgIHN0YXRlLnN0YXJ0QW5nbGUgPSBNYXRoLmF0YW4yKFxuICAgICAgICB0b3VjaDIuY2xpZW50WSAtIHRvdWNoMS5jbGllbnRZLFxuICAgICAgICB0b3VjaDIuY2xpZW50WCAtIHRvdWNoMS5jbGllbnRYXG4gICAgICApICogMTgwIC8gTWF0aC5QSTtcbiAgICAgIFxuICAgICAgaWYgKHN0YXRlLnN0YXJ0QW5nbGUgPCAwKSBzdGF0ZS5zdGFydEFuZ2xlICs9IDM2MDtcbiAgICB9XG4gICAgXG4gICAgLy8gU2V0dXAgY29udGV4dCBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICBjb25zdCBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIHN0YXRlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICB9O1xuICAgIFxuICAgIC8vIFN0YXJ0IGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gICAgaWYgKGxvbmdQcmVzc0NsZWFudXApIHtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICB9XG4gICAgXG4gICAgbG9uZ1ByZXNzQ2xlYW51cCA9IGRldGVjdExvbmdQcmVzcyhjb250ZXh0LCAobG9uZ1ByZXNzRXZlbnQpID0+IHtcbiAgICAgIGRpc3BhdGNoR2VzdHVyZShsb25nUHJlc3NFdmVudCk7XG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoL21vdXNlIG1vdmVcbiAgICovXG4gIGNvbnN0IGhhbmRsZU1vdmUgPSAoZTogVG91Y2hFdmVudCB8IE1vdXNlRXZlbnQgfCBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoIXN0YXRlLmFjdGl2ZSkgcmV0dXJuO1xuICAgIFxuICAgIGNvbnN0IHRvdWNoID0gZ2V0VG91Y2hDb29yZGluYXRlcyhlKTtcbiAgICBjb25zdCB0b3VjaENvdW50ID0gJ3RvdWNoZXMnIGluIGUgPyBlLnRvdWNoZXMubGVuZ3RoIDogMTtcbiAgICBcbiAgICAvLyBVcGRhdGUgcG9zaXRpb25zXG4gICAgc3RhdGUubGFzdFggPSBzdGF0ZS5jdXJyZW50WDtcbiAgICBzdGF0ZS5sYXN0WSA9IHN0YXRlLmN1cnJlbnRZO1xuICAgIHN0YXRlLmN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICBzdGF0ZS5jdXJyZW50WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgXG4gICAgLy8gU2V0dXAgY29udGV4dCBmb3IgZ2VzdHVyZSBkZXRlY3Rpb25cbiAgICBjb25zdCBjb250ZXh0OiBHZXN0dXJlRGV0ZWN0aW9uQ29udGV4dCA9IHtcbiAgICAgIHN0YXRlLFxuICAgICAgb3B0aW9ucyxcbiAgICAgIG9yaWdpbmFsRXZlbnQ6IGVcbiAgICB9O1xuICAgIFxuICAgIC8vIENoZWNrIGlmIHdlIHNob3VsZCBjYW5jZWwgbG9uZ3ByZXNzXG4gICAgaWYgKHNob3VsZENhbmNlbExvbmdQcmVzcyhjb250ZXh0KSAmJiBsb25nUHJlc3NDbGVhbnVwKSB7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwKCk7XG4gICAgICBsb25nUHJlc3NDbGVhbnVwID0gbnVsbDtcbiAgICB9XG4gICAgXG4gICAgLy8gRGV0ZWN0IHBhbiBnZXN0dXJlXG4gICAgY29uc3QgcGFuRXZlbnQgPSBkZXRlY3RQYW4oY29udGV4dCk7XG4gICAgaWYgKHBhbkV2ZW50KSB7XG4gICAgICBkaXNwYXRjaEdlc3R1cmUocGFuRXZlbnQpO1xuICAgIH1cbiAgICBcbiAgICAvLyBNdWx0aS10b3VjaCBnZXN0dXJlc1xuICAgIGlmICh0b3VjaENvdW50ID09PSAyICYmICd0b3VjaGVzJyBpbiBlKSB7XG4gICAgICBjb25zdCB0b3VjaDEgPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCB0b3VjaDIgPSBlLnRvdWNoZXNbMV07XG4gICAgICBcbiAgICAgIC8vIERldGVjdCBwaW5jaFxuICAgICAgY29uc3QgcGluY2hFdmVudCA9IGRldGVjdFBpbmNoKGNvbnRleHQsIHRvdWNoMSwgdG91Y2gyKTtcbiAgICAgIGlmIChwaW5jaEV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoR2VzdHVyZShwaW5jaEV2ZW50KTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gRGV0ZWN0IHJvdGF0ZVxuICAgICAgY29uc3Qgcm90YXRlRXZlbnQgPSBkZXRlY3RSb3RhdGUoY29udGV4dCwgdG91Y2gxLCB0b3VjaDIpO1xuICAgICAgaWYgKHJvdGF0ZUV2ZW50KSB7XG4gICAgICAgIGRpc3BhdGNoR2VzdHVyZShyb3RhdGVFdmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBcbiAgLyoqXG4gICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICovXG4gIGNvbnN0IGhhbmRsZUVuZCA9IChlOiBUb3VjaEV2ZW50IHwgTW91c2VFdmVudCB8IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgIGlmICghc3RhdGUuYWN0aXZlKSByZXR1cm47XG4gICAgXG4gICAgLy8gQ2FuY2VsIGFueSBvbmdvaW5nIGxvbmcgcHJlc3MgZGV0ZWN0aW9uXG4gICAgaWYgKGxvbmdQcmVzc0NsZWFudXApIHtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAoKTtcbiAgICAgIGxvbmdQcmVzc0NsZWFudXAgPSBudWxsO1xuICAgIH1cbiAgICBcbiAgICAvLyBTZXR1cCBjb250ZXh0IGZvciBnZXN0dXJlIGRldGVjdGlvblxuICAgIGNvbnN0IGNvbnRleHQ6IEdlc3R1cmVEZXRlY3Rpb25Db250ZXh0ID0ge1xuICAgICAgc3RhdGUsXG4gICAgICBvcHRpb25zLFxuICAgICAgb3JpZ2luYWxFdmVudDogZVxuICAgIH07XG4gICAgXG4gICAgLy8gRGV0ZWN0IHRhcFxuICAgIGNvbnN0IHRhcEV2ZW50ID0gZGV0ZWN0VGFwKGNvbnRleHQpO1xuICAgIGlmICh0YXBFdmVudCkge1xuICAgICAgLy8gVXBkYXRlIHRhcCBjb3VudCBmb3IgbmV4dCB0YXBcbiAgICAgIHN0YXRlLmxhc3RUYXBUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIHN0YXRlLnRhcENvdW50ID0gdGFwRXZlbnQuY291bnQ7XG4gICAgICBcbiAgICAgIGRpc3BhdGNoR2VzdHVyZSh0YXBFdmVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERldGVjdCBzd2lwZVxuICAgICAgY29uc3Qgc3dpcGVFdmVudCA9IGRldGVjdFN3aXBlKGNvbnRleHQpO1xuICAgICAgaWYgKHN3aXBlRXZlbnQpIHtcbiAgICAgICAgZGlzcGF0Y2hHZXN0dXJlKHN3aXBlRXZlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBSZXNldCBzdGF0ZVxuICAgIHN0YXRlLmFjdGl2ZSA9IGZhbHNlO1xuICB9O1xuICBcbiAgLyoqXG4gICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBjYW5jZWxcbiAgICovXG4gIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAvLyBDYW5jZWwgbG9uZyBwcmVzcyBkZXRlY3Rpb25cbiAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCgpO1xuICAgICAgbG9uZ1ByZXNzQ2xlYW51cCA9IG51bGw7XG4gICAgfVxuICAgIFxuICAgIC8vIFJlc2V0IHN0YXRlXG4gICAgc3RhdGUuYWN0aXZlID0gZmFsc2U7XG4gIH07XG4gIFxuICAvLyBFdmVudCBsaXN0ZW5lciByZWZlcmVuY2VzXG4gIGxldCBldmVudExpc3RlbmVyczogeyBcbiAgICBbZXZlbnQ6IHN0cmluZ106IEV2ZW50TGlzdGVuZXIgXG4gIH0gPSB7fTtcbiAgXG4gIC8qKlxuICAgKiBTZXQgdXAgZXZlbnQgbGlzdGVuZXJzIGJhc2VkIG9uIGF2YWlsYWJsZSBBUElzXG4gICAqL1xuICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgIGlmIChzdXBwb3J0UG9pbnRlcikge1xuICAgICAgLy8gVXNlIFBvaW50ZXIgRXZlbnRzIEFQSVxuICAgICAgZXZlbnRMaXN0ZW5lcnMgPSB7XG4gICAgICAgIHBvaW50ZXJkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVybW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVydXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBwb2ludGVyY2FuY2VsOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lclxuICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKHN1cHBvcnRUb3VjaCkge1xuICAgICAgLy8gVXNlIFRvdWNoIEV2ZW50cyBBUElcbiAgICAgIGV2ZW50TGlzdGVuZXJzID0ge1xuICAgICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICB0b3VjaG1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICB0b3VjaGNhbmNlbDogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXJcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEZhbGwgYmFjayB0byBNb3VzZSBFdmVudHMgQVBJXG4gICAgICBldmVudExpc3RlbmVycyA9IHtcbiAgICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgICBtb3VzZW1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICAgIG1vdXNlbGVhdmU6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyXG4gICAgICB9O1xuICAgIH1cbiAgICBcbiAgICAvLyBBZGQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICBPYmplY3QuZW50cmllcyhldmVudExpc3RlbmVycykuZm9yRWFjaCgoW2V2ZW50LCBsaXN0ZW5lcl0pID0+IHtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIHsgcGFzc2l2ZTogIW9wdGlvbnMucHJldmVudERlZmF1bHQgfSk7XG4gICAgfSk7XG4gIH07XG4gIFxuICAvKipcbiAgICogUmVtb3ZlIGFsbCBldmVudCBsaXN0ZW5lcnNcbiAgICovXG4gIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgIC8vIFJlbW92ZSBhbGwgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgfSk7XG4gICAgXG4gICAgLy8gQ2xlYXIgZXZlbnRMaXN0ZW5lcnMgb2JqZWN0XG4gICAgZXZlbnRMaXN0ZW5lcnMgPSB7fTtcbiAgfTtcbiAgXG4gIC8vIEluaXRpYWxpemUgZXZlbnQgbGlzdGVuZXJzXG4gIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgXG4gIHJldHVybiB7XG4gICAgLyoqXG4gICAgICogQWRkIGEgZ2VzdHVyZSBldmVudCBsaXN0ZW5lclxuICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgdG8gbGlzdGVuIGZvclxuICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBvbihldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpOiBHZXN0dXJlTWFuYWdlciB7XG4gICAgICBpZiAoIWhhbmRsZXJzLmhhcyhldmVudFR5cGUpKSB7XG4gICAgICAgIGhhbmRsZXJzLnNldChldmVudFR5cGUsIG5ldyBTZXQoKSk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGhhbmRsZXJzLmdldChldmVudFR5cGUpIS5hZGQoaGFuZGxlcik7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIFxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIGdlc3R1cmUgZXZlbnQgbGlzdGVuZXJcbiAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlXG4gICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIHRvIHJlbW92ZVxuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBvZmYoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgY29uc3QgZXZlbnRIYW5kbGVycyA9IGhhbmRsZXJzLmdldChldmVudFR5cGUpO1xuICAgICAgaWYgKGV2ZW50SGFuZGxlcnMpIHtcbiAgICAgICAgZXZlbnRIYW5kbGVycy5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIFxuICAgICAgICBpZiAoZXZlbnRIYW5kbGVycy5zaXplID09PSAwKSB7XG4gICAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGV2ZW50VHlwZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYSBnZXN0dXJlIGlzIHN1cHBvcnRlZCBvbiB0aGUgY3VycmVudCBkZXZpY2VcbiAgICAgKiBAcGFyYW0gZ2VzdHVyZVR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgICAqL1xuICAgIGlzU3VwcG9ydGVkKGdlc3R1cmVUeXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiBnZXN0dXJlVHlwZSBpbiBnZXN0dXJlU3VwcG9ydCAmJiBnZXN0dXJlU3VwcG9ydFtnZXN0dXJlVHlwZSBhcyBrZXlvZiB0eXBlb2YgZ2VzdHVyZVN1cHBvcnRdO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogRW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gYnkgYWRkaW5nIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqIEByZXR1cm5zIEdlc3R1cmUgbWFuYWdlciBmb3IgY2hhaW5pbmdcbiAgICAgKi9cbiAgICBlbmFibGUoKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICBcbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gYnkgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzXG4gICAgICogQHJldHVybnMgR2VzdHVyZSBtYW5hZ2VyIGZvciBjaGFpbmluZ1xuICAgICAqL1xuICAgIGRpc2FibGUoKTogR2VzdHVyZU1hbmFnZXIge1xuICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgXG4gICAgLyoqXG4gICAgICogQ2xlYW4gdXAgZXZlbnQgbGlzdGVuZXJzIGFuZCB0aW1lcnNcbiAgICAgKi9cbiAgICBkZXN0cm95KCk6IHZvaWQge1xuICAgICAgLy8gQ2xlYW4gdXAgbGlzdGVuZXJzXG4gICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgXG4gICAgICAvLyBDbGVhciBsb25nIHByZXNzIHRpbWVyXG4gICAgICBpZiAobG9uZ1ByZXNzQ2xlYW51cCkge1xuICAgICAgICBsb25nUHJlc3NDbGVhbnVwKCk7XG4gICAgICAgIGxvbmdQcmVzc0NsZWFudXAgPSBudWxsO1xuICAgICAgfVxuICAgICAgXG4gICAgICAvLyBDbGVhciBoYW5kbGVyIHJlZmVyZW5jZXNcbiAgICAgIGhhbmRsZXJzLmNsZWFyKCk7XG4gICAgfVxuICB9O1xufTsiLAogICAgIi8vIHNyYy9jb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXMudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50LCBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7XG4gIGNyZWF0ZUdlc3R1cmVNYW5hZ2VyLFxuICBHZXN0dXJlTWFuYWdlcixcbiAgR2VzdHVyZUNvbmZpZyxcbiAgR2VzdHVyZUhhbmRsZXIsXG4gIEFueUdlc3R1cmVFdmVudCxcbn0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGdlc3R1cmVzIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXN0dXJlc0ZlYXR1cmVDb25maWcgZXh0ZW5kcyBHZXN0dXJlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlR2VzdHVyZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsIGdlc3R1cmUgZXZlbnQgaGFuZGxlcnNcbiAgICovXG4gIGdlc3R1cmVIYW5kbGVycz86IFJlY29yZDxzdHJpbmcsIEdlc3R1cmVIYW5kbGVyPjtcblxuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IHdpdGggZ2VzdHVyZSByZWNvZ25pdGlvbiBjYXBhYmlsaXRpZXNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZXN0dXJlc0NvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogR2VzdHVyZSBtYW5hZ2VyIGluc3RhbmNlXG4gICAqL1xuICBnZXN0dXJlczogR2VzdHVyZU1hbmFnZXI7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGdlc3R1cmUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uR2VzdHVyZTogKGV2ZW50VHlwZTogc3RyaW5nLCBoYW5kbGVyOiBHZXN0dXJlSGFuZGxlcikgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIGdlc3R1cmUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZkdlc3R1cmU6IChldmVudFR5cGU6IHN0cmluZywgaGFuZGxlcjogR2VzdHVyZUhhbmRsZXIpID0+IEdlc3R1cmVzQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGdlc3R1cmUgdHlwZSBpcyBzdXBwb3J0ZWQgb24gdGhlIGN1cnJlbnQgZGV2aWNlXG4gICAqIEBwYXJhbSBnZXN0dXJlVHlwZSAtIFR5cGUgb2YgZ2VzdHVyZSB0byBjaGVja1xuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgKi9cbiAgaXNHZXN0dXJlU3VwcG9ydGVkOiAoZ2VzdHVyZVR5cGU6IHN0cmluZykgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogRW5hYmxlIGdlc3R1cmUgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVHZXN0dXJlczogKCkgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBHZXN0dXJlc0NvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGRpc2FibGVHZXN0dXJlczogKCkgPT4gR2VzdHVyZXNDb21wb25lbnQ7XG59XG5cbi8qKlxuICogQWRkcyBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllcyB0byBhIGNvbXBvbmVudC5cbiAqIFRoaXMgaXMgYSBjb21wcmVoZW5zaXZlIGdlc3R1cmUgZmVhdHVyZSB0aGF0IGFkZHMgc3VwcG9ydCBmb3IgYWxsIGdlc3R1cmUgdHlwZXMuXG4gKiBGb3IgbW9yZSBsaWdodHdlaWdodCwgc3BlY2lmaWMgZ2VzdHVyZXMsIHVzZSB0aGUgaW5kaXZpZHVhbCBnZXN0dXJlIGZlYXR1cmVzLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIGdlc3R1cmUgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBnZXN0dXJlIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnRcbiAqIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gKiAgIGNyZWF0ZUJhc2UsXG4gKiAgIHdpdGhFbGVtZW50KC4uLiksXG4gKiAgIHdpdGhHZXN0dXJlcyh7XG4gKiAgICAgc3dpcGVUaHJlc2hvbGQ6IDUwLFxuICogICAgIGdlc3R1cmVIYW5kbGVyczoge1xuICogICAgICAgJ3RhcCc6IChlKSA9PiBoYW5kbGVUYXAoZSksXG4gKiAgICAgICAnc3dpcGVsZWZ0JzogKGUpID0+IG5hdmlnYXRlRm9yd2FyZChlKSxcbiAqICAgICAgICdzd2lwZXJpZ2h0JzogKGUpID0+IG5hdmlnYXRlQmFjayhlKVxuICogICAgIH1cbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aEdlc3R1cmVzID1cbiAgKGNvbmZpZzogR2VzdHVyZXNGZWF0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIEdlc3R1cmVzQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIEdlc3R1cmVzQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGVuYWJsZUdlc3R1cmVzID0gdHJ1ZSxcbiAgICAgIGdlc3R1cmVIYW5kbGVycyA9IHt9LFxuICAgICAgLi4uZ2VzdHVyZUNvbmZpZ1xuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBDcmVhdGUgZ2VzdHVyZSBtYW5hZ2VyXG4gICAgY29uc3QgZ2VzdHVyZU1hbmFnZXIgPSBjcmVhdGVHZXN0dXJlTWFuYWdlcihcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LFxuICAgICAgZ2VzdHVyZUNvbmZpZ1xuICAgICk7XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBnZXN0dXJlIGhhbmRsZXJzXG4gICAgT2JqZWN0LmVudHJpZXMoZ2VzdHVyZUhhbmRsZXJzKS5mb3JFYWNoKChbZXZlbnRUeXBlLCBoYW5kbGVyXSkgPT4ge1xuICAgICAgZ2VzdHVyZU1hbmFnZXIub24oZXZlbnRUeXBlLCBoYW5kbGVyKTtcbiAgICB9KTtcblxuICAgIC8vIEVuYWJsZS9kaXNhYmxlIGJhc2VkIG9uIGNvbmZpZ1xuICAgIGlmICghZW5hYmxlR2VzdHVyZXMpIHtcbiAgICAgIGdlc3R1cmVNYW5hZ2VyLmRpc2FibGUoKTtcbiAgICB9XG5cbiAgICAvLyBDb25uZWN0IHdpdGggZXhpc3RpbmcgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgIC8vIEZvcndhcmQgZ2VzdHVyZSBldmVudHMgdG8gdGhlIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbVxuICAgICAgY29uc3QgZm9yd2FyZEdlc3R1cmVFdmVudHMgPSAoZXZlbnQ6IEFueUdlc3R1cmVFdmVudCkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZW1pdChldmVudC50eXBlLCBldmVudCk7XG4gICAgICB9O1xuXG4gICAgICAvLyBSZWdpc3RlciBmb3J3YXJkZXIgZm9yIGNvbW1vbiBnZXN0dXJlIHR5cGVzXG4gICAgICBbXG4gICAgICAgIFwidGFwXCIsXG4gICAgICAgIFwic3dpcGVcIixcbiAgICAgICAgXCJzd2lwZWxlZnRcIixcbiAgICAgICAgXCJzd2lwZXJpZ2h0XCIsXG4gICAgICAgIFwic3dpcGV1cFwiLFxuICAgICAgICBcInN3aXBlZG93blwiLFxuICAgICAgICBcImxvbmdwcmVzc1wiLFxuICAgICAgICBcInBpbmNoXCIsXG4gICAgICAgIFwicm90YXRlXCIsXG4gICAgICAgIFwicGFuXCIsXG4gICAgICBdLmZvckVhY2goKHR5cGUpID0+IHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIub24odHlwZSwgZm9yd2FyZEdlc3R1cmVFdmVudHMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGdlc3R1cmUgbWFuYWdlclxuICAgICAgICBnZXN0dXJlTWFuYWdlci5kZXN0cm95KCk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBnZXN0dXJlczogZ2VzdHVyZU1hbmFnZXIsXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgZ2VzdHVyZSBldmVudCBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIGV2ZW50XG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqIEByZXR1cm5zIEdlc3R1cmVzQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvbkdlc3R1cmUoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKSB7XG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLm9uKGV2ZW50VHlwZSwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgYSBnZXN0dXJlIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBldmVudFR5cGUgLSBUeXBlIG9mIGdlc3R1cmUgZXZlbnRcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9mZkdlc3R1cmUoZXZlbnRUeXBlOiBzdHJpbmcsIGhhbmRsZXI6IEdlc3R1cmVIYW5kbGVyKSB7XG4gICAgICAgIGdlc3R1cmVNYW5hZ2VyLm9mZihldmVudFR5cGUsIGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgYSBnZXN0dXJlIHR5cGUgaXMgc3VwcG9ydGVkIG9uIHRoZSBjdXJyZW50IGRldmljZVxuICAgICAgICogQHBhcmFtIGdlc3R1cmVUeXBlIC0gVHlwZSBvZiBnZXN0dXJlIHRvIGNoZWNrXG4gICAgICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBnZXN0dXJlIGlzIHN1cHBvcnRlZFxuICAgICAgICovXG4gICAgICBpc0dlc3R1cmVTdXBwb3J0ZWQoZ2VzdHVyZVR5cGU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gZ2VzdHVyZU1hbmFnZXIuaXNTdXBwb3J0ZWQoZ2VzdHVyZVR5cGUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUdlc3R1cmVzKCkge1xuICAgICAgICBnZXN0dXJlTWFuYWdlci5lbmFibGUoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgZ2VzdHVyZSByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgR2VzdHVyZXNDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVHZXN0dXJlcygpIHtcbiAgICAgICAgZ2VzdHVyZU1hbmFnZXIuZGlzYWJsZSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy90YXAudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgVGFwRXZlbnQsIEdlc3R1cmVIYW5kbGVyIH0gZnJvbSBcIi4uLy4uLy4uL2dlc3R1cmVzXCI7XG5pbXBvcnQgeyBoYXNMaWZlY3ljbGUsIGhhc0VtaXQgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHRhcCBnZXN0dXJlIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYXBHZXN0dXJlQ29uZmlnIHtcbiAgLyoqXG4gICAqIERpc3RhbmNlIHRocmVzaG9sZCAoaW4gcGl4ZWxzKSBmb3IgdGFwIHJlY29nbml0aW9uXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICB0YXBEaXN0YW5jZVRocmVzaG9sZD86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JzIG9uIHRvdWNoIGV2ZW50c1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHRhcCBnZXN0dXJlXG4gICAqL1xuICBvblRhcD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSB0YXAgcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhcEdlc3R1cmVDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIEFkZCBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblRhcDogKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpID0+IFRhcEdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZUYXA6IChoYW5kbGVyOiAoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkKSA9PiBUYXBHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgdGFwIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZVRhcDogKCkgPT4gVGFwR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSB0YXAgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZGlzYWJsZVRhcDogKCkgPT4gVGFwR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBZGRzIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIHRhcCBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgdGFwIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggdGFwIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoVGFwR2VzdHVyZSh7XG4gKiAgICAgb25UYXA6IChlKSA9PiBjb25zb2xlLmxvZygnVGFwcGVkIGF0JywgZS54LCBlLnkpXG4gKiAgIH0pXG4gKiApKGNvbmZpZyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhUYXBHZXN0dXJlID1cbiAgKGNvbmZpZzogVGFwR2VzdHVyZUNvbmZpZyA9IHt9KSA9PlxuICA8QyBleHRlbmRzIEVsZW1lbnRDb21wb25lbnQ+KGNvbXBvbmVudDogQyk6IEMgJiBUYXBHZXN0dXJlQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIHRhcCBnZXN0dXJlIHJlY29nbml0aW9uOiBtaXNzaW5nIGVsZW1lbnRcIik7XG4gICAgICByZXR1cm4gY29tcG9uZW50IGFzIEMgJiBUYXBHZXN0dXJlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIHRhcERpc3RhbmNlVGhyZXNob2xkID0gMTAsXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvblRhcCxcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gICAgY29uc3QgaGFuZGxlcnM6IFNldDwoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkPiA9IG5ldyBTZXQoKTtcblxuICAgIC8vIElmIGluaXRpYWwgaGFuZGxlciBwcm92aWRlZCwgYWRkIGl0XG4gICAgaWYgKG9uVGFwKSB7XG4gICAgICBoYW5kbGVycy5hZGQob25UYXAgYXMgKGV2ZW50OiBUYXBFdmVudCkgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgLy8gR2VzdHVyZSBzdGF0ZSBmb3IgdHJhY2tpbmdcbiAgICBsZXQgc3RhcnRYID0gMDtcbiAgICBsZXQgc3RhcnRZID0gMDtcbiAgICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gICAgbGV0IHN0YXJ0VGltZSA9IDA7XG4gICAgbGV0IGxhc3RUYXBUaW1lID0gMDtcbiAgICBsZXQgdGFwQ291bnQgPSAwO1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkO1xuXG4gICAgLyoqXG4gICAgICogRGlzcGF0Y2ggYSB0YXAgZXZlbnQgdG8gYWxsIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hUYXAgPSAoXG4gICAgICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCxcbiAgICAgIHg6IG51bWJlcixcbiAgICAgIHk6IG51bWJlclxuICAgICk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGlzRG91YmxlVGFwID0gbm93IC0gbGFzdFRhcFRpbWUgPCAzMDA7XG5cbiAgICAgIGlmIChpc0RvdWJsZVRhcCkge1xuICAgICAgICB0YXBDb3VudCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFwQ291bnQgPSAxO1xuICAgICAgfVxuXG4gICAgICBsYXN0VGFwVGltZSA9IG5vdztcblxuICAgICAgLy8gQ3JlYXRlIHRoZSB0YXAgZXZlbnRcbiAgICAgIGNvbnN0IHRhcEV2ZW50OiBUYXBFdmVudCA9IHtcbiAgICAgICAgdHlwZTogXCJ0YXBcIixcbiAgICAgICAgb3JpZ2luYWxFdmVudDogZSxcbiAgICAgICAgdGFyZ2V0OiBlLnRhcmdldCEsXG4gICAgICAgIHN0YXJ0VGltZSxcbiAgICAgICAgZW5kVGltZTogbm93LFxuICAgICAgICBkdXJhdGlvbjogbm93IC0gc3RhcnRUaW1lLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICB0YXBFdmVudC5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzdG9wUHJvcGFnYXRpb246ICgpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgICBjb3VudDogdGFwQ291bnQsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICB9O1xuXG4gICAgICAvLyBDYWxsIGVhY2ggaGFuZGxlclxuICAgICAgaGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIodGFwRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiB0YXAgaGFuZGxlcjpcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gRm9yd2FyZCB0byBjb21wb25lbnQncyBldmVudCBzeXN0ZW0gaWYgYXZhaWxhYmxlXG4gICAgICBpZiAoaGFzRW1pdChjb21wb25lbnQpKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0KFwidGFwXCIsIHRhcEV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICF0YXBFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7XG4gICAgICAgIHRhcEV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBzdGFydFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVN0YXJ0ID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICBzdGFydFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgc3RhcnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgZW5kXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRW5kID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID1cbiAgICAgICAgXCJjaGFuZ2VkVG91Y2hlc1wiIGluIGUgJiYgZS5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBlLmNoYW5nZWRUb3VjaGVzWzBdXG4gICAgICAgICAgOiAoZSBhcyBNb3VzZUV2ZW50KTtcblxuICAgICAgY29uc3QgZW5kWCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBjb25zdCBlbmRZID0gdG91Y2guY2xpZW50WTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIGRpc3RhbmNlIG1vdmVkXG4gICAgICBjb25zdCBkZWx0YVggPSBlbmRYIC0gc3RhcnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gZW5kWSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG5cbiAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IGlzIHdpdGhpbiB0aHJlc2hvbGRcbiAgICAgIGlmIChkaXN0YW5jZSA8IHRhcERpc3RhbmNlVGhyZXNob2xkKSB7XG4gICAgICAgIGRpc3BhdGNoVGFwKGUsIGVuZFgsIGVuZFkpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNldXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGhhbmRsZXJzXG4gICAgICAgIGhhbmRsZXJzLmNsZWFyKCk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgdGFwIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvblRhcChoYW5kbGVyOiAoZXZlbnQ6IFRhcEV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhIHRhcCBldmVudCBoYW5kbGVyXG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICAgICAqL1xuICAgICAgb2ZmVGFwKGhhbmRsZXI6IChldmVudDogVGFwRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRW5hYmxlIHRhcCByZWNvZ25pdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBlbmFibGVUYXAoKSB7XG4gICAgICAgIGlmICghaXNFbmFibGVkKSB7XG4gICAgICAgICAgaXNFbmFibGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgdGFwIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVUYXAoKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3N3aXBlLnRzXG4vKipcbiAqIEBtb2R1bGUgY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzXG4gKiBAZGVzY3JpcHRpb24gQWRkcyBzd2lwZSBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGNvbXBvbmVudHNcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEJhc2VDb21wb25lbnQsIEVsZW1lbnRDb21wb25lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHtcbiAgU3dpcGVFdmVudCxcbiAgU1dJUEVfRElSRUNUSU9OUyxcbiAgR2VzdHVyZUhhbmRsZXIsXG59IGZyb20gXCIuLi8uLi8uLi9nZXN0dXJlc1wiO1xuaW1wb3J0IHsgaGFzTGlmZWN5Y2xlLCBoYXNFbWl0IH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBzd2lwZSBnZXN0dXJlIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2lwZUdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogTWluaW11bSBkaXN0YW5jZSAoaW4gcGl4ZWxzKSB0byByZWNvZ25pemUgYSBzd2lwZVxuICAgKiBAZGVmYXVsdCAzMFxuICAgKi9cbiAgc3dpcGVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdGltZSAoaW4gbXMpIGluIHdoaWNoIGEgc3dpcGUgbXVzdCBiZSBjb21wbGV0ZWRcbiAgICogQGRlZmF1bHQgMzAwXG4gICAqL1xuICBzd2lwZVRpbWVUaHJlc2hvbGQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcHJldmVudCBkZWZhdWx0IGJlaGF2aW9ycyBvbiB0b3VjaCBldmVudHNcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcHJldmVudERlZmF1bHQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIGZvciBhbnkgc3dpcGUgZGlyZWN0aW9uXG4gICAqL1xuICBvblN3aXBlPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciBsZWZ0IHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZUxlZnQ/OiBHZXN0dXJlSGFuZGxlcjtcblxuICAvKipcbiAgICogSGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIHJpZ2h0IHN3aXBlc1xuICAgKi9cbiAgb25Td2lwZVJpZ2h0PzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciB1cCBzd2lwZXNcbiAgICovXG4gIG9uU3dpcGVVcD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgZG93biBzd2lwZXNcbiAgICovXG4gIG9uU3dpcGVEb3duPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZW5hYmxlIHN3aXBlIHJlY29nbml0aW9uIGltbWVkaWF0ZWx5XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2l0aCBzd2lwZSBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFN3aXBlR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBmb3IgYW55IHN3aXBlIGRpcmVjdGlvblxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25Td2lwZTogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgbGVmdCBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVMZWZ0OiAoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSA9PiBTd2lwZUdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgc3BlY2lmaWNhbGx5IGZvciByaWdodCBzd2lwZXNcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uU3dpcGVSaWdodDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBoYW5kbGVyIHNwZWNpZmljYWxseSBmb3IgdXAgc3dpcGVzXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblN3aXBlVXA6IChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogQWRkIGEgaGFuZGxlciBzcGVjaWZpY2FsbHkgZm9yIGRvd24gc3dpcGVzXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblN3aXBlRG93bjogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBzd2lwZSBldmVudCBoYW5kbGVyIGZvciBhbnkgZGlyZWN0aW9uXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZTd2lwZTogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBsZWZ0IHN3aXBlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlTGVmdDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSByaWdodCBzd2lwZSBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZTd2lwZVJpZ2h0OiAoXG4gICAgaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkXG4gICkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYW4gdXAgc3dpcGUgZXZlbnQgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmU3dpcGVVcDogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBkb3duIHN3aXBlIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlN3aXBlRG93bjogKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkgPT4gU3dpcGVHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgc3dpcGUgcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZW5hYmxlU3dpcGU6ICgpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBzd2lwZSByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlU3dpcGU6ICgpID0+IFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgc3dpcGUgZGlyZWN0aW9uIGJhc2VkIG9uIGRlbHRhIFggYW5kIFlcbiAqXG4gKiBAcGFyYW0gZGVsdGFYIC0gRGlzdGFuY2UgbW92ZWQgaW4gWCBkaXJlY3Rpb25cbiAqIEBwYXJhbSBkZWx0YVkgLSBEaXN0YW5jZSBtb3ZlZCBpbiBZIGRpcmVjdGlvblxuICogQHJldHVybnMgRGlyZWN0aW9uIG9mIHRoZSBzd2lwZVxuICovXG5mdW5jdGlvbiBnZXRTd2lwZURpcmVjdGlvbihkZWx0YVg6IG51bWJlciwgZGVsdGFZOiBudW1iZXIpOiBTV0lQRV9ESVJFQ1RJT05TIHtcbiAgaWYgKE1hdGguYWJzKGRlbHRhWCkgPiBNYXRoLmFicyhkZWx0YVkpKSB7XG4gICAgcmV0dXJuIGRlbHRhWCA+IDAgPyBTV0lQRV9ESVJFQ1RJT05TLlJJR0hUIDogU1dJUEVfRElSRUNUSU9OUy5MRUZUO1xuICB9XG4gIHJldHVybiBkZWx0YVkgPiAwID8gU1dJUEVfRElSRUNUSU9OUy5ET1dOIDogU1dJUEVfRElSRUNUSU9OUy5VUDtcbn1cblxuLyoqXG4gKiBBZGRzIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gYSBjb21wb25lbnQuXG4gKiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgYWx0ZXJuYXRpdmUgdG8gdGhlIGZ1bGwgZ2VzdHVyZSBzeXN0ZW0sXG4gKiBmb2N1c2VkIG9ubHkgb24gc3dpcGUgZGV0ZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIHN3aXBlIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggc3dpcGUgY2FwYWJpbGl0aWVzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBBZGQgc3dpcGUgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudFxuICogY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAqICAgY3JlYXRlQmFzZSxcbiAqICAgd2l0aEVsZW1lbnQoLi4uKSxcbiAqICAgd2l0aFN3aXBlR2VzdHVyZSh7XG4gKiAgICAgb25Td2lwZUxlZnQ6ICgpID0+IHNob3dOZXh0UGFnZSgpLFxuICogICAgIG9uU3dpcGVSaWdodDogKCkgPT4gc2hvd1ByZXZpb3VzUGFnZSgpXG4gKiAgIH0pXG4gKiApKGNvbmZpZyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhTd2lwZUdlc3R1cmUgPVxuICAoY29uZmlnOiBTd2lwZUdlc3R1cmVDb25maWcgPSB7fSkgPT5cbiAgPEMgZXh0ZW5kcyBFbGVtZW50Q29tcG9uZW50Pihjb21wb25lbnQ6IEMpOiBDICYgU3dpcGVHZXN0dXJlQ29tcG9uZW50ID0+IHtcbiAgICBpZiAoIWNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgYWRkIHN3aXBlIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIFN3aXBlR2VzdHVyZUNvbXBvbmVudDtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IGNvbmZpZ3VyYXRpb25cbiAgICBjb25zdCB7XG4gICAgICBzd2lwZVRocmVzaG9sZCA9IDMwLFxuICAgICAgc3dpcGVUaW1lVGhyZXNob2xkID0gMzAwLFxuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlLFxuICAgICAgb25Td2lwZSxcbiAgICAgIG9uU3dpcGVMZWZ0LFxuICAgICAgb25Td2lwZVJpZ2h0LFxuICAgICAgb25Td2lwZVVwLFxuICAgICAgb25Td2lwZURvd24sXG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgaGFuZGxlcnMgc3RvcmFnZSBieSBkaXJlY3Rpb25cbiAgICBjb25zdCBoYW5kbGVycyA9IHtcbiAgICAgIHN3aXBlOiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHN3aXBlbGVmdDogbmV3IFNldDwoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgICBzd2lwZXJpZ2h0OiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHN3aXBldXA6IG5ldyBTZXQ8KGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkPigpLFxuICAgICAgc3dpcGVkb3duOiBuZXcgU2V0PChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZD4oKSxcbiAgICB9O1xuXG4gICAgLy8gQWRkIGluaXRpYWwgaGFuZGxlcnMgaWYgcHJvdmlkZWRcbiAgICBpZiAob25Td2lwZSkgaGFuZGxlcnMuc3dpcGUuYWRkKG9uU3dpcGUgYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25Td2lwZUxlZnQpXG4gICAgICBoYW5kbGVycy5zd2lwZWxlZnQuYWRkKG9uU3dpcGVMZWZ0IGFzIChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uU3dpcGVSaWdodClcbiAgICAgIGhhbmRsZXJzLnN3aXBlcmlnaHQuYWRkKG9uU3dpcGVSaWdodCBhcyAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblN3aXBlVXApXG4gICAgICBoYW5kbGVycy5zd2lwZXVwLmFkZChvblN3aXBlVXAgYXMgKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKTtcbiAgICBpZiAob25Td2lwZURvd24pXG4gICAgICBoYW5kbGVycy5zd2lwZWRvd24uYWRkKG9uU3dpcGVEb3duIGFzIChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCk7XG5cbiAgICAvLyBHZXN0dXJlIHN0YXRlIGZvciB0cmFja2luZ1xuICAgIGxldCBzdGFydFggPSAwO1xuICAgIGxldCBzdGFydFkgPSAwO1xuICAgIGxldCBhY3RpdmUgPSBmYWxzZTtcbiAgICBsZXQgc3RhcnRUaW1lID0gMDtcbiAgICBsZXQgaXNFbmFibGVkID0gZW5hYmxlZDtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgc3dpcGUgZXZlbnQgdG8gYWxsIHJlZ2lzdGVyZWQgaGFuZGxlcnNcbiAgICAgKi9cbiAgICBjb25zdCBkaXNwYXRjaFN3aXBlID0gKFxuICAgICAgZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQsXG4gICAgICBlbmRYOiBudW1iZXIsXG4gICAgICBlbmRZOiBudW1iZXJcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGVuZFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBlbmRZIC0gc3RhcnRZO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcbiAgICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgZHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lO1xuICAgICAgY29uc3QgdmVsb2NpdHkgPSBkaXN0YW5jZSAvIGR1cmF0aW9uO1xuICAgICAgY29uc3QgZGlyZWN0aW9uID0gZ2V0U3dpcGVEaXJlY3Rpb24oZGVsdGFYLCBkZWx0YVkpO1xuXG4gICAgICAvLyBDcmVhdGUgdGhlIHN3aXBlIGV2ZW50XG4gICAgICBjb25zdCBzd2lwZUV2ZW50OiBTd2lwZUV2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcInN3aXBlXCIsXG4gICAgICAgIG9yaWdpbmFsRXZlbnQ6IGUsXG4gICAgICAgIHRhcmdldDogZS50YXJnZXQhLFxuICAgICAgICBzdGFydFRpbWUsXG4gICAgICAgIGVuZFRpbWUsXG4gICAgICAgIGR1cmF0aW9uLFxuICAgICAgICBkZWZhdWx0UHJldmVudGVkOiBmYWxzZSxcbiAgICAgICAgcHJldmVudERlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICBzd2lwZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlO1xuICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHN0b3BQcm9wYWdhdGlvbjogKCkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0sXG4gICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgZGVsdGFYLFxuICAgICAgICBkZWx0YVksXG4gICAgICAgIGRpc3RhbmNlLFxuICAgICAgICB2ZWxvY2l0eSxcbiAgICAgICAgc3RhcnRYLFxuICAgICAgICBzdGFydFksXG4gICAgICAgIGVuZFgsXG4gICAgICAgIGVuZFksXG4gICAgICB9O1xuXG4gICAgICAvLyBGaXJzdCB0cmlnZ2VyIGdlbmVyaWMgc3dpcGUgaGFuZGxlcnNcbiAgICAgIGhhbmRsZXJzLnN3aXBlLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoYW5kbGVyKHN3aXBlRXZlbnQpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBpbiBzd2lwZSBoYW5kbGVyOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBUaGVuIHRyaWdnZXIgZGlyZWN0aW9uLXNwZWNpZmljIGhhbmRsZXJzXG4gICAgICBjb25zdCBkaXJlY3Rpb25LZXkgPSBgc3dpcGUke2RpcmVjdGlvbn1gIGFzIGtleW9mIHR5cGVvZiBoYW5kbGVycztcbiAgICAgIGhhbmRsZXJzW2RpcmVjdGlvbktleV0uZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGhhbmRsZXIoeyAuLi5zd2lwZUV2ZW50LCB0eXBlOiBkaXJlY3Rpb25LZXkgfSBhcyBTd2lwZUV2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBpbiAke2RpcmVjdGlvbktleX0gaGFuZGxlcjpgLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBGb3J3YXJkIHRvIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbSBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoXCJzd2lwZVwiLCBzd2lwZUV2ZW50KTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoZGlyZWN0aW9uS2V5LCBzd2lwZUV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICFzd2lwZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgc3dpcGVFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgc3RhcnRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIHN0YXJ0WSA9IHRvdWNoLmNsaWVudFk7XG4gICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgYWN0aXZlID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGVuZFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUVuZCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFhY3RpdmUgfHwgIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9XG4gICAgICAgIFwiY2hhbmdlZFRvdWNoZXNcIiBpbiBlICYmIGUuY2hhbmdlZFRvdWNoZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gZS5jaGFuZ2VkVG91Y2hlc1swXVxuICAgICAgICAgIDogKGUgYXMgTW91c2VFdmVudCk7XG5cbiAgICAgIGNvbnN0IGVuZFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY29uc3QgZW5kWSA9IHRvdWNoLmNsaWVudFk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBzd2lwZSBwcm9wZXJ0aWVzXG4gICAgICBjb25zdCBkZWx0YVggPSBlbmRYIC0gc3RhcnRYO1xuICAgICAgY29uc3QgZGVsdGFZID0gZW5kWSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG4gICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBzdGFydFRpbWU7XG5cbiAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSBzd2lwZVxuICAgICAgaWYgKGRpc3RhbmNlID49IHN3aXBlVGhyZXNob2xkICYmIGR1cmF0aW9uIDw9IHN3aXBlVGltZVRocmVzaG9sZCkge1xuICAgICAgICBkaXNwYXRjaFN3aXBlKGUsIGVuZFgsIGVuZFkpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIGNhbmNlbFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGFjdGl2ZSA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNldXA6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2VsZWF2ZTogaGFuZGxlQ2FuY2VsIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaHN0YXJ0OiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGhhbmRsZXJzXG4gICAgICAgIE9iamVjdC52YWx1ZXMoaGFuZGxlcnMpLmZvckVhY2goKGhhbmRsZXJTZXQpID0+IGhhbmRsZXJTZXQuY2xlYXIoKSk7XG5cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95IG1ldGhvZFxuICAgICAgICBvcmlnaW5hbERlc3Ryb3kuY2FsbChjb21wb25lbnQubGlmZWN5Y2xlKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8vIEFkZCBoYW5kbGVyIG1ldGhvZHNcbiAgICAgIG9uU3dpcGUoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblN3aXBlTGVmdChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVsZWZ0LmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblN3aXBlUmlnaHQoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlcmlnaHQuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uU3dpcGVVcChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGV1cC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb25Td2lwZURvd24oaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlZG93bi5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gUmVtb3ZlIGhhbmRsZXIgbWV0aG9kc1xuICAgICAgb2ZmU3dpcGUoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZTd2lwZUxlZnQoaGFuZGxlcjogKGV2ZW50OiBTd2lwZUV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnN3aXBlbGVmdC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVSaWdodChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGVyaWdodC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVVcChoYW5kbGVyOiAoZXZlbnQ6IFN3aXBlRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMuc3dpcGV1cC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmU3dpcGVEb3duKGhhbmRsZXI6IChldmVudDogU3dpcGVFdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5zd2lwZWRvd24uZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuYWJsZS9kaXNhYmxlIG1ldGhvZHNcbiAgICAgIGVuYWJsZVN3aXBlKCkge1xuICAgICAgICBpZiAoIWlzRW5hYmxlZCkge1xuICAgICAgICAgIGlzRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgZGlzYWJsZVN3aXBlKCkge1xuICAgICAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICAgICAgaXNFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlcy9sb25ncHJlc3MudHNcbi8qKlxuICogQG1vZHVsZSBjb3JlL2NvbXBvc2UvZmVhdHVyZXMvZ2VzdHVyZXNcbiAqIEBkZXNjcmlwdGlvbiBBZGRzIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBjb21wb25lbnRzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBCYXNlQ29tcG9uZW50LCBFbGVtZW50Q29tcG9uZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IExvbmdQcmVzc0V2ZW50LCBHZXN0dXJlSGFuZGxlciB9IGZyb20gXCIuLi8uLi8uLi9nZXN0dXJlc1wiO1xuaW1wb3J0IHsgaGFzTGlmZWN5Y2xlLCBoYXNFbWl0IH0gZnJvbSBcIm10cmxcIjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBsb25nIHByZXNzIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvbmdQcmVzc0dlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogVGltZSAoaW4gbXMpIHRvIHJlY29nbml6ZSBhIGxvbmcgcHJlc3NcbiAgICogQGRlZmF1bHQgNTAwXG4gICAqL1xuICBsb25nUHJlc3NUaW1lPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBEaXN0YW5jZSB0aHJlc2hvbGQgKGluIHBpeGVscykgZm9yIG1vdmVtZW50IHRoYXQgY2FuY2VscyBsb25nIHByZXNzXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICBtb3ZlVGhyZXNob2xkPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHByZXZlbnQgZGVmYXVsdCBiZWhhdmlvcnMgb24gdG91Y2ggZXZlbnRzXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHByZXZlbnREZWZhdWx0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSGFuZGxlciBmb3IgbG9uZyBwcmVzcyBnZXN0dXJlXG4gICAqL1xuICBvbkxvbmdQcmVzcz86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uIGltbWVkaWF0ZWx5XG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgd2l0aCBsb25nIHByZXNzIGdlc3R1cmUgcmVjb2duaXRpb24gY2FwYWJpbGl0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTG9uZ1ByZXNzR2VzdHVyZUNvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQge1xuICAvKipcbiAgICogQWRkIGEgbG9uZyBwcmVzcyBldmVudCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvbkxvbmdQcmVzczogKFxuICAgIGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbiAgKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBSZW1vdmUgYSBsb25nIHByZXNzIGV2ZW50IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZkxvbmdQcmVzczogKFxuICAgIGhhbmRsZXI6IChldmVudDogTG9uZ1ByZXNzRXZlbnQpID0+IHZvaWRcbiAgKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgbG9uZyBwcmVzcyByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBlbmFibGVMb25nUHJlc3M6ICgpID0+IExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIERpc2FibGUgbG9uZyBwcmVzcyByZWNvZ25pdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBkaXNhYmxlTG9uZ1ByZXNzOiAoKSA9PiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xufVxuXG4vKipcbiAqIEFkZHMgbG9uZyBwcmVzcyBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIGxvbmcgcHJlc3MgZGV0ZWN0aW9uLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIGxvbmcgcHJlc3Mgc2V0dGluZ3NcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIHRoYXQgZW5oYW5jZXMgYSBjb21wb25lbnQgd2l0aCBsb25nIHByZXNzIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbiB0byBhIGNvbXBvbmVudFxuICogY29uc3QgY29tcG9uZW50ID0gcGlwZShcbiAqICAgY3JlYXRlQmFzZSxcbiAqICAgd2l0aEVsZW1lbnQoLi4uKSxcbiAqICAgd2l0aExvbmdQcmVzc0dlc3R1cmUoe1xuICogICAgIGxvbmdQcmVzc1RpbWU6IDgwMCxcbiAqICAgICBvbkxvbmdQcmVzczogKGUpID0+IHNob3dDb250ZXh0TWVudShlLngsIGUueSlcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aExvbmdQcmVzc0dlc3R1cmUgPVxuICAoY29uZmlnOiBMb25nUHJlc3NHZXN0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIExvbmdQcmVzc0dlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJDYW5ub3QgYWRkIGxvbmcgcHJlc3MgZ2VzdHVyZSByZWNvZ25pdGlvbjogbWlzc2luZyBlbGVtZW50XCJcbiAgICAgICk7XG4gICAgICByZXR1cm4gY29tcG9uZW50IGFzIEMgJiBMb25nUHJlc3NHZXN0dXJlQ29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIERlZmF1bHQgY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGxvbmdQcmVzc1RpbWUgPSA1MDAsXG4gICAgICBtb3ZlVGhyZXNob2xkID0gMTAsXG4gICAgICBwcmV2ZW50RGVmYXVsdCA9IHRydWUsXG4gICAgICBvbkxvbmdQcmVzcyxcbiAgICAgIGVuYWJsZWQgPSB0cnVlLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBFdmVudCBoYW5kbGVycyBzdG9yYWdlXG4gICAgY29uc3QgaGFuZGxlcnM6IFNldDwoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkPiA9IG5ldyBTZXQoKTtcblxuICAgIC8vIElmIGluaXRpYWwgaGFuZGxlciBwcm92aWRlZCwgYWRkIGl0XG4gICAgaWYgKG9uTG9uZ1ByZXNzKSB7XG4gICAgICBoYW5kbGVycy5hZGQob25Mb25nUHJlc3MgYXMgKGV2ZW50OiBMb25nUHJlc3NFdmVudCkgPT4gdm9pZCk7XG4gICAgfVxuXG4gICAgLy8gR2VzdHVyZSBzdGF0ZSBmb3IgdHJhY2tpbmdcbiAgICBsZXQgc3RhcnRYID0gMDtcbiAgICBsZXQgc3RhcnRZID0gMDtcbiAgICBsZXQgY3VycmVudFggPSAwO1xuICAgIGxldCBjdXJyZW50WSA9IDA7XG4gICAgbGV0IGFjdGl2ZSA9IGZhbHNlO1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBsb25nUHJlc3NUaW1lcjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlzRW5hYmxlZCA9IGVuYWJsZWQ7XG5cbiAgICAvKipcbiAgICAgKiBEaXNwYXRjaCBhIGxvbmcgcHJlc3MgZXZlbnQgdG8gYWxsIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hMb25nUHJlc3MgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIC8vIENyZWF0ZSB0aGUgbG9uZyBwcmVzcyBldmVudFxuICAgICAgY29uc3QgbG9uZ1ByZXNzRXZlbnQ6IExvbmdQcmVzc0V2ZW50ID0ge1xuICAgICAgICB0eXBlOiBcImxvbmdwcmVzc1wiLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0ISxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbmRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2UsXG4gICAgICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICAgICAgbG9uZ1ByZXNzRXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgeDogY3VycmVudFgsXG4gICAgICAgIHk6IGN1cnJlbnRZLFxuICAgICAgfTtcblxuICAgICAgLy8gQ2FsbCBlYWNoIGhhbmRsZXJcbiAgICAgIGhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBoYW5kbGVyKGxvbmdQcmVzc0V2ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgaW4gbG9uZyBwcmVzcyBoYW5kbGVyOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBGb3J3YXJkIHRvIGNvbXBvbmVudCdzIGV2ZW50IHN5c3RlbSBpZiBhdmFpbGFibGVcbiAgICAgIGlmIChoYXNFbWl0KGNvbXBvbmVudCkpIHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQoXCJsb25ncHJlc3NcIiwgbG9uZ1ByZXNzRXZlbnQpO1xuICAgICAgfVxuXG4gICAgICAvLyBBcHBseSBwcmV2ZW50RGVmYXVsdCBpZiBjb25maWd1cmVkXG4gICAgICBpZiAocHJldmVudERlZmF1bHQgJiYgIWxvbmdQcmVzc0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgbG9uZ1ByZXNzRXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoL21vdXNlIHN0YXJ0XG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlU3RhcnQgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gXCJ0b3VjaGVzXCIgaW4gZSA/IGUudG91Y2hlc1swXSA6IGU7XG5cbiAgICAgIHN0YXJ0WCA9IGN1cnJlbnRYID0gdG91Y2guY2xpZW50WDtcbiAgICAgIHN0YXJ0WSA9IGN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuXG4gICAgICAvLyBDYW5jZWwgYW55IGV4aXN0aW5nIHRpbWVyXG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICB9XG5cbiAgICAgIC8vIFNldCB1cCBsb25nIHByZXNzIHRpbWVyXG4gICAgICBsb25nUHJlc3NUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICAgIC8vIENoZWNrIGlmIG1vdmVtZW50IHdhcyB3aXRoaW4gdGhyZXNob2xkXG4gICAgICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFggLSBzdGFydFg7XG4gICAgICAgICAgY29uc3QgZGVsdGFZID0gY3VycmVudFkgLSBzdGFydFk7XG4gICAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnNxcnQoZGVsdGFYICogZGVsdGFYICsgZGVsdGFZICogZGVsdGFZKTtcblxuICAgICAgICAgIGlmIChkaXN0YW5jZSA8IG1vdmVUaHJlc2hvbGQpIHtcbiAgICAgICAgICAgIGRpc3BhdGNoTG9uZ1ByZXNzKGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH0sIGxvbmdQcmVzc1RpbWUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgbW92ZVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZU1vdmUgPSAoZTogTW91c2VFdmVudCB8IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghYWN0aXZlIHx8ICFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAvLyBDaGVjayBpZiBtb3ZlbWVudCBleGNlZWRzIHRocmVzaG9sZFxuICAgICAgY29uc3QgZGVsdGFYID0gY3VycmVudFggLSBzdGFydFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBjdXJyZW50WSAtIHN0YXJ0WTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5zcXJ0KGRlbHRhWCAqIGRlbHRhWCArIGRlbHRhWSAqIGRlbHRhWSk7XG5cbiAgICAgIGlmIChkaXN0YW5jZSA+IG1vdmVUaHJlc2hvbGQpIHtcbiAgICAgICAgLy8gQ2FuY2VsIGxvbmcgcHJlc3MgaWYgbW92ZWQgdG9vIG11Y2hcbiAgICAgICAgaWYgKGxvbmdQcmVzc1RpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBlbmRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVFbmQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBjYW5jZWxcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVDYW5jZWwgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAobG9uZ1ByZXNzVGltZXIgIT09IG51bGwpIHtcbiAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgIGxvbmdQcmVzc1RpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgYWN0aXZlID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBkaWN0aW9uYXJ5XG4gICAgY29uc3QgZXZlbnRMaXN0ZW5lcnM6IFJlY29yZDxzdHJpbmcsIEV2ZW50TGlzdGVuZXI+ID0ge1xuICAgICAgbW91c2Vkb3duOiBoYW5kbGVTdGFydCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2Vtb3ZlOiBoYW5kbGVNb3ZlIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZXVwOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNlbGVhdmU6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hzdGFydDogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNobW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hlbmQ6IGhhbmRsZUVuZCBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgdG91Y2hjYW5jZWw6IGhhbmRsZUNhbmNlbCBhcyBFdmVudExpc3RlbmVyLFxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXJzIHRvIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCB7XG4gICAgICAgICAgcGFzc2l2ZTogIXByZXZlbnREZWZhdWx0LFxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzIGZyb20gZWxlbWVudFxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZUV2ZW50TGlzdGVuZXJzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgT2JqZWN0LmVudHJpZXMoZXZlbnRMaXN0ZW5lcnMpLmZvckVhY2goKFtldmVudCwgbGlzdGVuZXJdKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBTZXR1cCBsaXN0ZW5lcnMgaWYgaW5pdGlhbGx5IGVuYWJsZWRcbiAgICBpZiAoaXNFbmFibGVkKSB7XG4gICAgICBzZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGxpZmVjeWNsZSBpbnRlZ3JhdGlvblxuICAgIGlmIChoYXNMaWZlY3ljbGUoY29tcG9uZW50KSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95O1xuXG4gICAgICBjb21wb25lbnQubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgIC8vIENsZWFyIGFueSB0aW1lcnNcbiAgICAgICAgaWYgKGxvbmdQcmVzc1RpbWVyICE9PSBudWxsKSB7XG4gICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgbG9uZ1ByZXNzVGltZXIgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgaGFuZGxlcnNcbiAgICAgICAgaGFuZGxlcnMuY2xlYXIoKTtcblxuICAgICAgICAvLyBDYWxsIG9yaWdpbmFsIGRlc3Ryb3kgbWV0aG9kXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveS5jYWxsKGNvbXBvbmVudC5saWZlY3ljbGUpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBBZGQgYSBsb25nIHByZXNzIGV2ZW50IGhhbmRsZXJcbiAgICAgICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgICAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgICAgICovXG4gICAgICBvbkxvbmdQcmVzcyhoYW5kbGVyOiAoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBhIGxvbmcgcHJlc3MgZXZlbnQgaGFuZGxlclxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIG9mZkxvbmdQcmVzcyhoYW5kbGVyOiAoZXZlbnQ6IExvbmdQcmVzc0V2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUxvbmdQcmVzcygpIHtcbiAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogRGlzYWJsZSBsb25nIHByZXNzIHJlY29nbml0aW9uXG4gICAgICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVMb25nUHJlc3MoKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgYW55IHRpbWVyc1xuICAgICAgICAgIGlmIChsb25nUHJlc3NUaW1lciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChsb25nUHJlc3NUaW1lcik7XG4gICAgICAgICAgICBsb25nUHJlc3NUaW1lciA9IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29yZS9jb21wb3NlL2ZlYXR1cmVzL2dlc3R1cmVzL3Bhbi50c1xuLyoqXG4gKiBAbW9kdWxlIGNvcmUvY29tcG9zZS9mZWF0dXJlcy9nZXN0dXJlc1xuICogQGRlc2NyaXB0aW9uIEFkZHMgcGFuIGdlc3R1cmUgcmVjb2duaXRpb24gdG8gY29tcG9uZW50c1xuICovXG5cbmltcG9ydCB0eXBlIHsgQmFzZUNvbXBvbmVudCwgRWxlbWVudENvbXBvbmVudCB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgeyBQYW5FdmVudCwgR2VzdHVyZUhhbmRsZXIgfSBmcm9tIFwiLi4vLi4vLi4vZ2VzdHVyZXNcIjtcbmltcG9ydCB7IGhhc0xpZmVjeWNsZSwgaGFzRW1pdCB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgcGFuIGdlc3R1cmUgZmVhdHVyZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhbkdlc3R1cmVDb25maWcge1xuICAvKipcbiAgICogV2hldGhlciB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3JzIG9uIHRvdWNoIGV2ZW50c1xuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBzdGFydCAoZmlyc3QgbW92ZW1lbnQpXG4gICAqL1xuICBvblBhblN0YXJ0PzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBtb3ZlIChjb250aW51b3VzIHVwZGF0ZXMgZHVyaW5nIHBhbilcbiAgICovXG4gIG9uUGFuPzogR2VzdHVyZUhhbmRsZXI7XG5cbiAgLyoqXG4gICAqIEhhbmRsZXIgZm9yIHBhbiBlbmQgKHRvdWNoL21vdXNlIHJlbGVhc2UpXG4gICAqL1xuICBvblBhbkVuZD86IEdlc3R1cmVIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVuYWJsZSBwYW4gcmVjb2duaXRpb24gaW1tZWRpYXRlbHlcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgZW5hYmxlZD86IGJvb2xlYW47XG5cbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG4vKipcbiAqIEV4dGVuZCB0aGUgUGFuRXZlbnQgaW50ZXJmYWNlIHRvIHN1cHBvcnQgb3VyIGN1c3RvbSBldmVudCB0eXBlc1xuICovXG5pbnRlcmZhY2UgRXh0ZW5kZWRQYW5FdmVudCBleHRlbmRzIE9taXQ8UGFuRXZlbnQsIFwidHlwZVwiPiB7XG4gIHR5cGU6IFwicGFuXCIgfCBcInBhbnN0YXJ0XCIgfCBcInBhbmVuZFwiO1xufVxuXG4vKipcbiAqIENvbXBvbmVudCB3aXRoIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFBhbkdlc3R1cmVDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBzdGFydFxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb25QYW5TdGFydDogKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpID0+IFBhbkdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBtb3ZlIChjb250aW51b3VzIHVwZGF0ZXMpXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvblBhbjogKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpID0+IFBhbkdlc3R1cmVDb21wb25lbnQ7XG5cbiAgLyoqXG4gICAqIEFkZCBhIGhhbmRsZXIgZm9yIHBhbiBlbmRcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9uUGFuRW5kOiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIHN0YXJ0IGhhbmRsZXJcbiAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIG9mZlBhblN0YXJ0OiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIG1vdmUgaGFuZGxlclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgb2ZmUGFuOiAoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogUmVtb3ZlIGEgcGFuIGVuZCBoYW5kbGVyXG4gICAqIEBwYXJhbSBoYW5kbGVyIC0gRXZlbnQgaGFuZGxlciBmdW5jdGlvblxuICAgKiBAcmV0dXJucyBDb21wb25lbnQgZm9yIGNoYWluaW5nXG4gICAqL1xuICBvZmZQYW5FbmQ6IChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSA9PiBQYW5HZXN0dXJlQ29tcG9uZW50O1xuXG4gIC8qKlxuICAgKiBFbmFibGUgcGFuIHJlY29nbml0aW9uXG4gICAqIEByZXR1cm5zIENvbXBvbmVudCBmb3IgY2hhaW5pbmdcbiAgICovXG4gIGVuYWJsZVBhbjogKCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcblxuICAvKipcbiAgICogRGlzYWJsZSBwYW4gcmVjb2duaXRpb25cbiAgICogQHJldHVybnMgQ29tcG9uZW50IGZvciBjaGFpbmluZ1xuICAgKi9cbiAgZGlzYWJsZVBhbjogKCkgPT4gUGFuR2VzdHVyZUNvbXBvbmVudDtcbn1cblxuLyoqXG4gKiBBZGRzIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50LlxuICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IGFsdGVybmF0aXZlIHRvIHRoZSBmdWxsIGdlc3R1cmUgc3lzdGVtLFxuICogZm9jdXNlZCBvbmx5IG9uIHBhbiBkZXRlY3Rpb24uXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbmZpZ3VyYXRpb24gb2JqZWN0IGNvbnRhaW5pbmcgcGFuIHNldHRpbmdzXG4gKiBAcmV0dXJucyBGdW5jdGlvbiB0aGF0IGVuaGFuY2VzIGEgY29tcG9uZW50IHdpdGggcGFuIGNhcGFiaWxpdGllc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gQWRkIHBhbiBnZXN0dXJlIHJlY29nbml0aW9uIHRvIGEgY29tcG9uZW50XG4gKiBjb25zdCBjb21wb25lbnQgPSBwaXBlKFxuICogICBjcmVhdGVCYXNlLFxuICogICB3aXRoRWxlbWVudCguLi4pLFxuICogICB3aXRoUGFuR2VzdHVyZSh7XG4gKiAgICAgb25QYW5TdGFydDogKGUpID0+IHN0YXJ0RHJhZyhlKSxcbiAqICAgICBvblBhbjogKGUpID0+IHVwZGF0ZURyYWdQb3NpdGlvbihlKSxcbiAqICAgICBvblBhbkVuZDogKGUpID0+IGVuZERyYWcoZSlcbiAqICAgfSlcbiAqICkoY29uZmlnKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFBhbkdlc3R1cmUgPVxuICAoY29uZmlnOiBQYW5HZXN0dXJlQ29uZmlnID0ge30pID0+XG4gIDxDIGV4dGVuZHMgRWxlbWVudENvbXBvbmVudD4oY29tcG9uZW50OiBDKTogQyAmIFBhbkdlc3R1cmVDb21wb25lbnQgPT4ge1xuICAgIGlmICghY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkNhbm5vdCBhZGQgcGFuIGdlc3R1cmUgcmVjb2duaXRpb246IG1pc3NpbmcgZWxlbWVudFwiKTtcbiAgICAgIHJldHVybiBjb21wb25lbnQgYXMgQyAmIFBhbkdlc3R1cmVDb21wb25lbnQ7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCBjb25maWd1cmF0aW9uXG4gICAgY29uc3Qge1xuICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlLFxuICAgICAgb25QYW5TdGFydCxcbiAgICAgIG9uUGFuLFxuICAgICAgb25QYW5FbmQsXG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgaGFuZGxlcnMgc3RvcmFnZSBieSBwYW4gcGhhc2VcbiAgICBjb25zdCBoYW5kbGVycyA9IHtcbiAgICAgIHBhbnN0YXJ0OiBuZXcgU2V0PChldmVudDogUGFuRXZlbnQpID0+IHZvaWQ+KCksXG4gICAgICBwYW46IG5ldyBTZXQ8KGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZD4oKSxcbiAgICAgIHBhbmVuZDogbmV3IFNldDwoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkPigpLFxuICAgIH07XG5cbiAgICAvLyBBZGQgaW5pdGlhbCBoYW5kbGVycyBpZiBwcm92aWRlZFxuICAgIGlmIChvblBhblN0YXJ0KVxuICAgICAgaGFuZGxlcnMucGFuc3RhcnQuYWRkKG9uUGFuU3RhcnQgYXMgKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCk7XG4gICAgaWYgKG9uUGFuKSBoYW5kbGVycy5wYW4uYWRkKG9uUGFuIGFzIChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpO1xuICAgIGlmIChvblBhbkVuZCkgaGFuZGxlcnMucGFuZW5kLmFkZChvblBhbkVuZCBhcyAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKTtcblxuICAgIC8vIEdlc3R1cmUgc3RhdGUgZm9yIHRyYWNraW5nXG4gICAgbGV0IHN0YXJ0WCA9IDA7XG4gICAgbGV0IHN0YXJ0WSA9IDA7XG4gICAgbGV0IGxhc3RYID0gMDtcbiAgICBsZXQgbGFzdFkgPSAwO1xuICAgIGxldCBjdXJyZW50WCA9IDA7XG4gICAgbGV0IGN1cnJlbnRZID0gMDtcbiAgICBsZXQgYWN0aXZlID0gZmFsc2U7XG4gICAgbGV0IGlzUGFubmluZyA9IGZhbHNlO1xuICAgIGxldCBzdGFydFRpbWUgPSAwO1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkO1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgcGFuIGV2ZW50IHdpdGggdGhlIGN1cnJlbnQgc3RhdGVcbiAgICAgKi9cbiAgICBjb25zdCBjcmVhdGVQYW5FdmVudCA9IChcbiAgICAgIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50LFxuICAgICAgdHlwZTogXCJwYW5zdGFydFwiIHwgXCJwYW5cIiB8IFwicGFuZW5kXCJcbiAgICApOiBFeHRlbmRlZFBhbkV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IGV2ZW50OiBFeHRlbmRlZFBhbkV2ZW50ID0ge1xuICAgICAgICB0eXBlLFxuICAgICAgICBvcmlnaW5hbEV2ZW50OiBlLFxuICAgICAgICB0YXJnZXQ6IGUudGFyZ2V0ISxcbiAgICAgICAgc3RhcnRUaW1lLFxuICAgICAgICBlbmRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICBkdXJhdGlvbjogRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSxcbiAgICAgICAgZGVmYXVsdFByZXZlbnRlZDogZmFsc2UsXG4gICAgICAgIHByZXZlbnREZWZhdWx0OiAoKSA9PiB7XG4gICAgICAgICAgZXZlbnQuZGVmYXVsdFByZXZlbnRlZCA9IHRydWU7XG4gICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc3RvcFByb3BhZ2F0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGVsdGFYOiBjdXJyZW50WCAtIHN0YXJ0WCxcbiAgICAgICAgZGVsdGFZOiBjdXJyZW50WSAtIHN0YXJ0WSxcbiAgICAgICAgc3RhcnRYLFxuICAgICAgICBzdGFydFksXG4gICAgICAgIGN1cnJlbnRYLFxuICAgICAgICBjdXJyZW50WSxcbiAgICAgIH07XG4gICAgICByZXR1cm4gZXZlbnQ7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIERpc3BhdGNoIGEgcGFuIGV2ZW50IHRvIGFsbCByZWdpc3RlcmVkIGhhbmRsZXJzXG4gICAgICovXG4gICAgY29uc3QgZGlzcGF0Y2hQYW4gPSAoXG4gICAgICBlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCxcbiAgICAgIHR5cGU6IFwicGFuc3RhcnRcIiB8IFwicGFuXCIgfCBcInBhbmVuZFwiXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBleHRlbmRlZFBhbkV2ZW50ID0gY3JlYXRlUGFuRXZlbnQoZSwgdHlwZSk7XG5cbiAgICAgIC8vIENhbGwgZWFjaCBoYW5kbGVyIGZvciB0aGlzIHBoYXNlXG4gICAgICBoYW5kbGVyc1t0eXBlXS5mb3JFYWNoKChoYW5kbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gVHlwZSBhc3NlcnRpb24gZm9yIHRoZSBoYW5kbGVyIGNhbGwgLSB3ZSdyZSBkZWxpYmVyYXRlbHkgcGFzc2luZyBvdXIgZXh0ZW5kZWQgZXZlbnRcbiAgICAgICAgICBoYW5kbGVyKGV4dGVuZGVkUGFuRXZlbnQgYXMgdW5rbm93biBhcyBQYW5FdmVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgRXJyb3IgaW4gJHt0eXBlfSBoYW5kbGVyOmAsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEZvcndhcmQgdG8gY29tcG9uZW50J3MgZXZlbnQgc3lzdGVtIGlmIGF2YWlsYWJsZVxuICAgICAgaWYgKGhhc0VtaXQoY29tcG9uZW50KSkge1xuICAgICAgICBjb21wb25lbnQuZW1pdCh0eXBlLCBleHRlbmRlZFBhbkV2ZW50KTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgcHJldmVudERlZmF1bHQgaWYgY29uZmlndXJlZFxuICAgICAgaWYgKHByZXZlbnREZWZhdWx0ICYmICFleHRlbmRlZFBhbkV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgZXh0ZW5kZWRQYW5FdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2Ugc3RhcnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVTdGFydCA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0VuYWJsZWQpIHJldHVybjtcblxuICAgICAgY29uc3QgdG91Y2ggPSBcInRvdWNoZXNcIiBpbiBlID8gZS50b3VjaGVzWzBdIDogZTtcblxuICAgICAgc3RhcnRYID0gbGFzdFggPSBjdXJyZW50WCA9IHRvdWNoLmNsaWVudFg7XG4gICAgICBzdGFydFkgPSBsYXN0WSA9IGN1cnJlbnRZID0gdG91Y2guY2xpZW50WTtcbiAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICBhY3RpdmUgPSB0cnVlO1xuICAgICAgaXNQYW5uaW5nID0gZmFsc2U7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0b3VjaC9tb3VzZSBtb3ZlXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlTW92ZSA9IChlOiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFhY3RpdmUgfHwgIWlzRW5hYmxlZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0b3VjaCA9IFwidG91Y2hlc1wiIGluIGUgPyBlLnRvdWNoZXNbMF0gOiBlO1xuXG4gICAgICAvLyBVcGRhdGUgcG9zaXRpb25cbiAgICAgIGxhc3RYID0gY3VycmVudFg7XG4gICAgICBsYXN0WSA9IGN1cnJlbnRZO1xuICAgICAgY3VycmVudFggPSB0b3VjaC5jbGllbnRYO1xuICAgICAgY3VycmVudFkgPSB0b3VjaC5jbGllbnRZO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgbW92ZW1lbnQgZGVsdGFcbiAgICAgIGNvbnN0IG1vdmVEZWx0YVggPSBjdXJyZW50WCAtIGxhc3RYO1xuICAgICAgY29uc3QgbW92ZURlbHRhWSA9IGN1cnJlbnRZIC0gbGFzdFk7XG4gICAgICBjb25zdCBtb3ZlRGVsdGEgPSBNYXRoLnNxcnQoXG4gICAgICAgIG1vdmVEZWx0YVggKiBtb3ZlRGVsdGFYICsgbW92ZURlbHRhWSAqIG1vdmVEZWx0YVlcbiAgICAgICk7XG5cbiAgICAgIC8vIERldGVjdCBzaWduaWZpY2FudCBtb3ZlbWVudFxuICAgICAgaWYgKG1vdmVEZWx0YSA+IDApIHtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3Qgc2lnbmlmaWNhbnQgbW92ZW1lbnQsIHRyaWdnZXIgcGFuc3RhcnRcbiAgICAgICAgaWYgKCFpc1Bhbm5pbmcpIHtcbiAgICAgICAgICBpc1Bhbm5pbmcgPSB0cnVlO1xuICAgICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuc3RhcnRcIik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVuIHRyaWdnZXIgdGhlIGNvbnRpbnVvdXMgcGFuIGV2ZW50XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuXCIpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgZW5kXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRW5kID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIElmIHdlIHdlcmUgcGFubmluZywgdHJpZ2dlciB0aGUgcGFuZW5kIGV2ZW50XG4gICAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuZW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2gvbW91c2UgY2FuY2VsXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQ2FuY2VsID0gKGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWFjdGl2ZSB8fCAhaXNFbmFibGVkKSByZXR1cm47XG5cbiAgICAgIC8vIElmIHdlIHdlcmUgcGFubmluZywgdHJpZ2dlciB0aGUgcGFuZW5kIGV2ZW50XG4gICAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICAgIGRpc3BhdGNoUGFuKGUsIFwicGFuZW5kXCIpO1xuICAgICAgfVxuXG4gICAgICBhY3RpdmUgPSBmYWxzZTtcbiAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuICAgIH07XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZGljdGlvbmFyeVxuICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzOiBSZWNvcmQ8c3RyaW5nLCBFdmVudExpc3RlbmVyPiA9IHtcbiAgICAgIG1vdXNlZG93bjogaGFuZGxlU3RhcnQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIG1vdXNlbW92ZTogaGFuZGxlTW92ZSBhcyBFdmVudExpc3RlbmVyLFxuICAgICAgbW91c2V1cDogaGFuZGxlRW5kIGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICBtb3VzZWxlYXZlOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoc3RhcnQ6IGhhbmRsZVN0YXJ0IGFzIEV2ZW50TGlzdGVuZXIsXG4gICAgICB0b3VjaG1vdmU6IGhhbmRsZU1vdmUgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoZW5kOiBoYW5kbGVFbmQgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICAgIHRvdWNoY2FuY2VsOiBoYW5kbGVDYW5jZWwgYXMgRXZlbnRMaXN0ZW5lcixcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkIGV2ZW50IGxpc3RlbmVycyB0byBlbGVtZW50XG4gICAgICovXG4gICAgY29uc3Qgc2V0dXBFdmVudExpc3RlbmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwge1xuICAgICAgICAgIHBhc3NpdmU6ICFwcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlIGV2ZW50IGxpc3RlbmVycyBmcm9tIGVsZW1lbnRcbiAgICAgKi9cbiAgICBjb25zdCByZW1vdmVFdmVudExpc3RlbmVycyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIE9iamVjdC5lbnRyaWVzKGV2ZW50TGlzdGVuZXJzKS5mb3JFYWNoKChbZXZlbnQsIGxpc3RlbmVyXSkgPT4ge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lcik7XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gU2V0dXAgbGlzdGVuZXJzIGlmIGluaXRpYWxseSBlbmFibGVkXG4gICAgaWYgKGlzRW5hYmxlZCkge1xuICAgICAgc2V0dXBFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBsaWZlY3ljbGUgaW50ZWdyYXRpb25cbiAgICBpZiAoaGFzTGlmZWN5Y2xlKGNvbXBvbmVudCkpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IGNvbXBvbmVudC5saWZlY3ljbGUuZGVzdHJveTtcblxuICAgICAgY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBDbGVhbiB1cCBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgICAgICAvLyBDbGVhciBoYW5kbGVyc1xuICAgICAgICBPYmplY3QudmFsdWVzKGhhbmRsZXJzKS5mb3JFYWNoKChoYW5kbGVyU2V0KSA9PiBoYW5kbGVyU2V0LmNsZWFyKCkpO1xuXG4gICAgICAgIC8vIENhbGwgb3JpZ2luYWwgZGVzdHJveSBtZXRob2RcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95LmNhbGwoY29tcG9uZW50LmxpZmVjeWNsZSk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBlbmhhbmNlZCBjb21wb25lbnRcbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuXG4gICAgICAvLyBBZGQgaGFuZGxlciBtZXRob2RzXG4gICAgICBvblBhblN0YXJ0KGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuc3RhcnQuYWRkKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIG9uUGFuKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuLmFkZChoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvblBhbkVuZChoYW5kbGVyOiAoZXZlbnQ6IFBhbkV2ZW50KSA9PiB2b2lkKSB7XG4gICAgICAgIGhhbmRsZXJzLnBhbmVuZC5hZGQoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgLy8gUmVtb3ZlIGhhbmRsZXIgbWV0aG9kc1xuICAgICAgb2ZmUGFuU3RhcnQoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW5zdGFydC5kZWxldGUoaGFuZGxlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcblxuICAgICAgb2ZmUGFuKGhhbmRsZXI6IChldmVudDogUGFuRXZlbnQpID0+IHZvaWQpIHtcbiAgICAgICAgaGFuZGxlcnMucGFuLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICB9LFxuXG4gICAgICBvZmZQYW5FbmQoaGFuZGxlcjogKGV2ZW50OiBQYW5FdmVudCkgPT4gdm9pZCkge1xuICAgICAgICBoYW5kbGVycy5wYW5lbmQuZGVsZXRlKGhhbmRsZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIC8vIEVuYWJsZS9kaXNhYmxlIG1ldGhvZHNcbiAgICAgIGVuYWJsZVBhbigpIHtcbiAgICAgICAgaWYgKCFpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgIHNldHVwRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgIH0sXG5cbiAgICAgIGRpc2FibGVQYW4oKSB7XG4gICAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgICBpc0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICByZW1vdmVFdmVudExpc3RlbmVycygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgfSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvKipcbiAqIEBtb2R1bGUgY29yZS9sYXlvdXQvc2NoZW1hXG4gKiBAZGVzY3JpcHRpb24gVW5pZmllZCBsYXlvdXQgc2NoZW1hIHByb2Nlc3NvciB3aXRoIGludGVncmF0ZWQgb3B0aW1pemF0aW9uc1xuICogQ29uc29saWRhdGVzIGFycmF5LCBvYmplY3QsIEpTWCwgYW5kIHRlbXBsYXRlIHByb2Nlc3Npbmcgd2l0aCBidWlsdC1pbiBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHNcbiAqL1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBUWVBFUyAoRXNzZW50aWFsIG9ubHkpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGF5b3V0Q29uZmlnIHtcbiAgLyoqIEJhc2UgbGF5b3V0IHR5cGUgKi9cbiAgdHlwZT86IFwic3RhY2tcIiB8IFwicm93XCIgfCBcImdyaWRcIiB8IHN0cmluZztcbiAgLyoqIFNwYWNpbmcgYmV0d2VlbiBlbGVtZW50cyAqL1xuICBnYXA/OiBudW1iZXIgfCBzdHJpbmc7XG4gIC8qKiBBZGRpdGlvbmFsIENTUyBjbGFzc2VzICovXG4gIGNsYXNzPzogc3RyaW5nO1xuICAvKiogQWxpZ25tZW50IG9mIGl0ZW1zIGFsb25nIHRoZSBjcm9zcyBheGlzICovXG4gIGFsaWduPzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgfCBcInN0cmV0Y2hcIjtcbiAgLyoqIEFsaWdubWVudCBvZiBpdGVtcyBhbG9uZyB0aGUgbWFpbiBheGlzICovXG4gIGp1c3RpZnk/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiB8IFwiYmV0d2VlblwiIHwgXCJhcm91bmRcIiB8IFwiZXZlbmx5XCI7XG4gIC8qKiBXaGV0aGVyIGFuZCBob3cgaXRlbXMgc2hvdWxkIHdyYXAgKi9cbiAgd3JhcD86IGJvb2xlYW4gfCBcInJldmVyc2VcIiB8IFwibm93cmFwXCI7XG4gIC8qKiBXaGV0aGVyIHJvdyBpdGVtcyBzaG91bGQgc3RhY2sgdmVydGljYWxseSBvbiBtb2JpbGUgKi9cbiAgbW9iaWxlU3RhY2s/OiBib29sZWFuO1xuICAvKiogV2hldGhlciByb3cgaXRlbXMgc2hvdWxkIHNjcm9sbCBob3Jpem9udGFsbHkgb24gbW9iaWxlICovXG4gIG1vYmlsZVNjcm9sbD86IGJvb2xlYW47XG4gIC8qKiBOdW1iZXIgb2YgY29sdW1ucyBvciBhdXRvbWF0aWMgc2l6aW5nIG1ldGhvZCAqL1xuICBjb2x1bW5zPzogbnVtYmVyIHwgXCJhdXRvLWZpdFwiIHwgXCJhdXRvLWZpbGxcIjtcbiAgLyoqIFdoZXRoZXIgdG8gdXNlIGRlbnNlIHBhY2tpbmcgYWxnb3JpdGhtIGZvciBncmlkICovXG4gIGRlbnNlPzogYm9vbGVhbjtcbiAgLyoqIFdoZXRoZXIgZ3JpZCBpdGVtcyBzaG91bGQgYWRqdXN0IGhlaWdodCBhdXRvbWF0aWNhbGx5ICovXG4gIGF1dG9IZWlnaHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dEl0ZW1Db25maWcge1xuICAvKiogQ29sdW1uIHdpZHRoIGluIGEgMTItY29sdW1uIGdyaWQgKi9cbiAgd2lkdGg/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBzbWFsbCBzY3JlZW5zICovXG4gIHNtPzogbnVtYmVyO1xuICAvKiogV2lkdGggb24gbWVkaXVtIHNjcmVlbnMgKi9cbiAgbWQ/OiBudW1iZXI7XG4gIC8qKiBXaWR0aCBvbiBsYXJnZSBzY3JlZW5zICovXG4gIGxnPzogbnVtYmVyO1xuICAvKiogV2lkdGggb24gZXh0cmEtbGFyZ2Ugc2NyZWVucyAqL1xuICB4bD86IG51bWJlcjtcbiAgLyoqIE51bWJlciBvZiBncmlkIGNvbHVtbnMgdG8gc3BhbiAqL1xuICBzcGFuPzogbnVtYmVyO1xuICAvKiogTnVtYmVyIG9mIGdyaWQgcm93cyB0byBzcGFuICovXG4gIHJvd1NwYW4/OiBudW1iZXI7XG4gIC8qKiBEaXNwbGF5IG9yZGVyICovXG4gIG9yZGVyPzogbnVtYmVyIHwgXCJmaXJzdFwiIHwgXCJsYXN0XCI7XG4gIC8qKiBTZWxmLWFsaWdubWVudCB3aXRoaW4gY29udGFpbmVyICovXG4gIGFsaWduPzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgfCBcInN0cmV0Y2hcIjtcbiAgLyoqIFdoZXRoZXIgaXRlbSBzaG91bGQgYXV0b21hdGljYWxseSBzaXplICovXG4gIGF1dG8/OiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dE9wdGlvbnMge1xuICAvKiogRGVmYXVsdCBjcmVhdG9yIGZ1bmN0aW9uIHRvIHVzZSBpZiBub3Qgc3BlY2lmaWVkIGluIHNjaGVtYSAqL1xuICBjcmVhdG9yPzogRnVuY3Rpb247XG4gIC8qKiBXaGV0aGVyIHRvIGFwcGx5IENTUyBjbGFzcyBwcmVmaXggQGRlZmF1bHQgdHJ1ZSAqL1xuICBwcmVmaXg/OiBib29sZWFuO1xuICAvKiogQWRkaXRpb25hbCBvcHRpb25zICovXG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMYXlvdXRSZXN1bHQge1xuICAvKiogVGhlIHJhdyBsYXlvdXQgb2JqZWN0IHdpdGggYWxsIGNvbXBvbmVudHMgKi9cbiAgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogUmVmZXJlbmNlIHRvIHRoZSByb290IGVsZW1lbnQgZm9yIGNvbnZlbmllbmNlICovXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgYW55O1xuICAvKiogRmxhdHRlbmVkIGNvbXBvbmVudCBtYXAgKi9cbiAgY29tcG9uZW50OiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAvKiogR2V0cyBhIGNvbXBvbmVudCBieSBuYW1lICovXG4gIGdldChuYW1lOiBzdHJpbmcpOiBhbnk7XG4gIC8qKiBHZXRzIGFsbCBjb21wb25lbnRzIGluIGEgZmxhdHRlbmVkIG1hcCAqL1xuICBnZXRBbGwoKTogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgLyoqIERlc3Ryb3lzIHRoZSBsYXlvdXQsIGNsZWFuaW5nIHVwIGFsbCBjb21wb25lbnRzICovXG4gIGRlc3Ryb3koKTogdm9pZDtcbn1cblxudHlwZSBDb21wb25lbnRMaWtlID0geyBlbGVtZW50OiBIVE1MRWxlbWVudDsgW2tleTogc3RyaW5nXTogYW55IH07XG50eXBlIFNjaGVtYUl0ZW0gPSBGdW5jdGlvbiB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGFueT4gfCBTY2hlbWFJdGVtW107XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEJVSUxULUlOIE9QVElNSVpBVElPTlNcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBGcmFnbWVudCBQb29sIGZvciBlZmZpY2llbnQgRG9jdW1lbnRGcmFnbWVudCByZXVzZVxuICogUmVkdWNlcyBHQyBwcmVzc3VyZSBpbiBoaWdoLWZyZXF1ZW5jeSBsYXlvdXQgY3JlYXRpb24gc2NlbmFyaW9zXG4gKi9cbmNsYXNzIEZyYWdtZW50UG9vbCB7XG4gIHByaXZhdGUgcG9vbDogRG9jdW1lbnRGcmFnbWVudFtdID0gW107XG4gIHByaXZhdGUgbWF4U2l6ZSA9IDg7IC8vIE9wdGltaXplZCBzaXplIGZvciBtZW1vcnkgZWZmaWNpZW5jeVxuXG4gIGdldCgpOiBEb2N1bWVudEZyYWdtZW50IHtcbiAgICByZXR1cm4gdGhpcy5wb29sLnBvcCgpIHx8IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgfVxuXG4gIHJlbGVhc2UoZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wb29sLmxlbmd0aCA8IHRoaXMubWF4U2l6ZSAmJiBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5wb29sLnB1c2goZnJhZ21lbnQpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMucG9vbC5sZW5ndGggPSAwO1xuICB9XG59XG5cbmNvbnN0IGZyYWdtZW50UG9vbCA9IG5ldyBGcmFnbWVudFBvb2woKTtcblxuLyoqXG4gKiBDbGFzcyBuYW1lIGNhY2hlIGZvciBsYXlvdXQgY29uZmlndXJhdGlvbnNcbiAqIFJlZHVjZXMgc3RyaW5nIG9wZXJhdGlvbnMgYnkgY2FjaGluZyBnZW5lcmF0ZWQgY2xhc3MgbmFtZXNcbiAqL1xuY29uc3QgY2xhc3NDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbi8vIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG5jb25zdCBQUkVGSVggPSBcIm10cmxcIjsgLy8gVE9ETzogTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZVxuY29uc3QgUFJFRklYX1dJVEhfREFTSCA9IGAke1BSRUZJWH0tYDtcblxuLyoqXG4gKiBHZXRzIGEgY2FjaGVkIGNsYXNzIG5hbWUgZm9yIGxheW91dCBjb25maWd1cmF0aW9uXG4gKiBPcHRpbWl6ZWQgZm9yIGRpZmZlcmVudCBjbGFzcyBuYW1pbmcgcGF0dGVybnNcbiAqL1xuZnVuY3Rpb24gZ2V0Q2FjaGVkQ2xhc3NOYW1lKFxuICB0eXBlOiBzdHJpbmcsXG4gIHByb3BlcnR5OiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsXG4pOiBzdHJpbmcge1xuICBjb25zdCBrZXkgPSBgJHt0eXBlfS0ke3Byb3BlcnR5fS0ke3ZhbHVlfWA7XG4gIGlmICghY2xhc3NDYWNoZS5oYXMoa2V5KSkge1xuICAgIGlmICh0eXBlID09PSBcIml0ZW1cIikge1xuICAgICAgY2xhc3NDYWNoZS5zZXQoXG4gICAgICAgIGtleSxcbiAgICAgICAgcHJvcGVydHkgPT09IFwiXCJcbiAgICAgICAgICA/IGBsYXlvdXRfX2l0ZW0tLSR7dmFsdWV9YFxuICAgICAgICAgIDogYGxheW91dF9faXRlbS0tJHtwcm9wZXJ0eX0tJHt2YWx1ZX1gLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRm9yIGxheW91dCBjbGFzc2VzLCBhbGlnbiB1c2VzIGxheW91dC0te3R5cGV9LXt2YWx1ZX1cbiAgICAgIC8vIGJ1dCBqdXN0aWZ5IGFuZCBvdGhlcnMgdXNlIGxheW91dC0te3R5cGV9LXtwcm9wZXJ0eX0te3ZhbHVlfVxuICAgICAgaWYgKHByb3BlcnR5ID09PSBcImFsaWduXCIpIHtcbiAgICAgICAgY2xhc3NDYWNoZS5zZXQoa2V5LCBgbGF5b3V0LS0ke3R5cGV9LSR7dmFsdWV9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGFzc0NhY2hlLnNldChrZXksIGBsYXlvdXQtLSR7dHlwZX0tJHtwcm9wZXJ0eX0tJHt2YWx1ZX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNsYXNzQ2FjaGUuZ2V0KGtleSkhO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBPUFRJTUlaRUQgVVRJTElUSUVTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgdmFsdWUgaXMgYSBjb21wb25lbnQgb2JqZWN0IChoYXMgYW4gZWxlbWVudCBwcm9wZXJ0eSlcbiAqL1xuZnVuY3Rpb24gaXNDb21wb25lbnQodmFsdWU6IGFueSk6IHZhbHVlIGlzIENvbXBvbmVudExpa2Uge1xuICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmIFwiZWxlbWVudFwiIGluIHZhbHVlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkb2N1bWVudCBmcmFnbWVudCB1c2luZyBwb29saW5nIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2VcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnQoKTogRG9jdW1lbnRGcmFnbWVudCB7XG4gIHJldHVybiBmcmFnbWVudFBvb2wuZ2V0KCk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgYSBmcmFnbWVudCBiYWNrIHRvIHRoZSBwb29sIGZvciByZXVzZVxuICovXG5mdW5jdGlvbiByZWxlYXNlRnJhZ21lbnQoZnJhZ21lbnQ6IERvY3VtZW50RnJhZ21lbnQpOiB2b2lkIHtcbiAgZnJhZ21lbnRQb29sLnJlbGVhc2UoZnJhZ21lbnQpO1xufVxuXG4vKipcbiAqIE9wdGltaXplZCBjbGFzcyBwcm9jZXNzaW5nIHdpdGggbWluaW1hbCBzdHJpbmcgb3BlcmF0aW9uc1xuICogSGFuZGxlcyBhcnJheXMsIHN0cmluZ3MsIGNsYXNzTmFtZSBhbGlhc2VzLCBhbmQgcmF3Q2xhc3MgZWZmaWNpZW50bHlcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc0NsYXNzTmFtZXMoXG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHNraXBQcmVmaXggPSBmYWxzZSxcbik6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICBpZiAoIW9wdGlvbnMpIHJldHVybiBvcHRpb25zO1xuXG4gIGNvbnN0IGhhc1Jhd0NsYXNzID0gb3B0aW9ucy5yYXdDbGFzcztcbiAgY29uc3QgaGFzUmVndWxhckNsYXNzID0gb3B0aW9ucy5jbGFzcyB8fCBvcHRpb25zLmNsYXNzTmFtZTtcblxuICAvLyBGYXN0IHBhdGg6IG5vIGNsYXNzIHByb3BlcnRpZXMgYXQgYWxsXG4gIGlmICghaGFzUmF3Q2xhc3MgJiYgIWhhc1JlZ3VsYXJDbGFzcykgcmV0dXJuIG9wdGlvbnM7XG5cbiAgLy8gRmFzdCBwYXRoOiBvbmx5IHJhd0NsYXNzIGFuZCBza2lwcGluZyBwcmVmaXggKG1vc3QgY29tbW9uIHJhd0NsYXNzIHNjZW5hcmlvKVxuICBpZiAoaGFzUmF3Q2xhc3MgJiYgIWhhc1JlZ3VsYXJDbGFzcyAmJiBza2lwUHJlZml4KSB7XG4gICAgY29uc3QgcHJvY2Vzc2VkID0geyAuLi5vcHRpb25zIH07XG4gICAgZGVsZXRlIHByb2Nlc3NlZC5yYXdDbGFzcztcblxuICAgIC8vIERpcmVjdCBhc3NpZ25tZW50IGZvciBzaW1wbGUgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBoYXNSYXdDbGFzcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcHJvY2Vzc2VkLmNsYXNzID0gaGFzUmF3Q2xhc3M7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEhhbmRsZSBhcnJheSBjYXNlXG4gICAgICBwcm9jZXNzZWQuY2xhc3MgPSBoYXNSYXdDbGFzcy5qb2luKFwiIFwiKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2Nlc3NlZDtcbiAgfVxuXG4gIC8vIEZ1bGwgcHJvY2Vzc2luZyBwYXRoIChvbmx5IHdoZW4gbmVlZGVkKVxuICBjb25zdCBwcm9jZXNzZWQgPSB7IC4uLm9wdGlvbnMgfTtcbiAgbGV0IGZpbmFsQ2xhc3NlcyA9IFwiXCI7XG5cbiAgLy8gSGFuZGxlIHByZWZpeGVkIGNsYXNzZXMgb25seSBpZiBub3Qgc2tpcHBpbmcgcHJlZml4XG4gIGlmICghc2tpcFByZWZpeCAmJiBoYXNSZWd1bGFyQ2xhc3MpIHtcbiAgICBsZXQgcHJlZml4ZWRTdHJpbmcgPSBcIlwiO1xuXG4gICAgaWYgKHByb2Nlc3NlZC5jbGFzcykge1xuICAgICAgcHJlZml4ZWRTdHJpbmcgKz0gQXJyYXkuaXNBcnJheShwcm9jZXNzZWQuY2xhc3MpXG4gICAgICAgID8gcHJvY2Vzc2VkLmNsYXNzLmpvaW4oXCIgXCIpXG4gICAgICAgIDogcHJvY2Vzc2VkLmNsYXNzO1xuICAgIH1cbiAgICBpZiAocHJvY2Vzc2VkLmNsYXNzTmFtZSkge1xuICAgICAgcHJlZml4ZWRTdHJpbmcgKz0gKHByZWZpeGVkU3RyaW5nID8gXCIgXCIgOiBcIlwiKSArIHByb2Nlc3NlZC5jbGFzc05hbWU7XG4gICAgfVxuXG4gICAgaWYgKHByZWZpeGVkU3RyaW5nKSB7XG4gICAgICBmaW5hbENsYXNzZXMgPSBwcmVmaXhlZFN0cmluZ1xuICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgIC5tYXAoKGNscykgPT5cbiAgICAgICAgICBjbHMuc3RhcnRzV2l0aChQUkVGSVhfV0lUSF9EQVNIKSA/IGNscyA6IFBSRUZJWF9XSVRIX0RBU0ggKyBjbHMsXG4gICAgICAgIClcbiAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEhhbmRsZSByYXdDbGFzcyAoYWx3YXlzIHByb2Nlc3NlZCB3aGVuIHByZXNlbnQpXG4gIGlmIChoYXNSYXdDbGFzcykge1xuICAgIGNvbnN0IHJhd1N0cmluZyA9IEFycmF5LmlzQXJyYXkoaGFzUmF3Q2xhc3MpXG4gICAgICA/IGhhc1Jhd0NsYXNzLmZpbHRlcihCb29sZWFuKS5qb2luKFwiIFwiKVxuICAgICAgOiBoYXNSYXdDbGFzcztcblxuICAgIGZpbmFsQ2xhc3NlcyArPSAoZmluYWxDbGFzc2VzID8gXCIgXCIgOiBcIlwiKSArIHJhd1N0cmluZztcbiAgfVxuXG4gIGlmIChmaW5hbENsYXNzZXMpIHtcbiAgICBwcm9jZXNzZWQuY2xhc3MgPSBmaW5hbENsYXNzZXM7XG4gIH1cblxuICAvLyBDbGVhbiB1cCBpbiBvbmUgb3BlcmF0aW9uXG4gIGRlbGV0ZSBwcm9jZXNzZWQuY2xhc3NOYW1lO1xuICBkZWxldGUgcHJvY2Vzc2VkLnJhd0NsYXNzO1xuXG4gIHJldHVybiBwcm9jZXNzZWQ7XG59XG5cbi8qKlxuICogT3B0aW1pemVkIHBhcmFtZXRlciBleHRyYWN0aW9uIGZvciBhcnJheSBzY2hlbWFzXG4gKiBSZWR1Y2VzIG11bHRpcGxlIGFycmF5IGxvb2t1cHMgd2l0aCBiYXRjaCBwcm9jZXNzaW5nXG4gKi9cbmludGVyZmFjZSBFeHRyYWN0ZWRQYXJhbWV0ZXJzIHtcbiAgY3JlYXRvcjogRnVuY3Rpb247XG4gIG5hbWU/OiBzdHJpbmc7XG4gIG9wdGlvbnM6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gIGNvbnN1bWVkOiBudW1iZXI7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RQYXJhbWV0ZXJzKFxuICBzY2hlbWE6IFNjaGVtYUl0ZW1bXSxcbiAgc3RhcnRJbmRleDogbnVtYmVyLFxuICBkZWZhdWx0Q3JlYXRvcjogRnVuY3Rpb24sXG4pOiBFeHRyYWN0ZWRQYXJhbWV0ZXJzIHtcbiAgY29uc3QgaXRlbXMgPSBzY2hlbWEuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIDMpO1xuICBsZXQgY3JlYXRvciwgbmFtZSwgb3B0aW9ucztcbiAgbGV0IGNvbnN1bWVkID0gMTtcblxuICBjb25zdCBbZmlyc3QsIHNlY29uZCwgdGhpcmRdID0gaXRlbXM7XG5cbiAgaWYgKHR5cGVvZiBmaXJzdCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY3JlYXRvciA9IGZpcnN0O1xuICAgIGlmICh0eXBlb2Ygc2Vjb25kID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBuYW1lID0gc2Vjb25kO1xuICAgICAgY29uc3VtZWQgPSAyO1xuICAgICAgaWYgKGlzT2JqZWN0KHRoaXJkKSkge1xuICAgICAgICBvcHRpb25zID0gdGhpcmQ7XG4gICAgICAgIGNvbnN1bWVkID0gMztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KHNlY29uZCkpIHtcbiAgICAgIG9wdGlvbnMgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBmaXJzdCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNyZWF0b3IgPSBkZWZhdWx0Q3JlYXRvcjtcbiAgICBuYW1lID0gZmlyc3Q7XG4gICAgaWYgKGlzT2JqZWN0KHNlY29uZCkpIHtcbiAgICAgIG9wdGlvbnMgPSBzZWNvbmQ7XG4gICAgICBjb25zdW1lZCA9IDI7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGZpcnN0KSkge1xuICAgIGNyZWF0b3IgPSBkZWZhdWx0Q3JlYXRvcjtcbiAgICBvcHRpb25zID0gZmlyc3Q7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGNyZWF0b3I6IGNyZWF0b3IgfHwgZGVmYXVsdENyZWF0b3IsXG4gICAgbmFtZSxcbiAgICBvcHRpb25zOiAob3B0aW9ucyB8fCB7fSkgYXMgUmVjb3JkPHN0cmluZywgYW55PixcbiAgICBjb25zdW1lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBTaW1wbGUgb2JqZWN0IHR5cGUgY2hlY2tcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gRE9NIFVUSUxJVElFUyAoU2ltcGxpZmllZClcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBTaW1wbGUgRE9NIGVsZW1lbnQgY3JlYXRpb25cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWxlbWVudChvcHRpb25zOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge30pOiBIVE1MRWxlbWVudCB7XG4gIGNvbnN0IHRhZyA9IG9wdGlvbnMudGFnIHx8IFwiZGl2XCI7XG4gIGNvbnN0IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7XG5cbiAgaWYgKG9wdGlvbnMuY2xhc3MpIHtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9IG9wdGlvbnMuY2xhc3M7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdHlsZSkge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5zdHlsZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJzdHlsZVwiLCBvcHRpb25zLnN0eWxlKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBvcHRpb25zLnN0eWxlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIG9wdGlvbnMuc3R5bGUpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLnRleHRDb250ZW50KSB7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbnMudGV4dENvbnRlbnQ7XG4gIH1cblxuICBpZiAob3B0aW9ucy50ZXh0KSB7XG4gICAgZWxlbWVudC50ZXh0Q29udGVudCA9IG9wdGlvbnMudGV4dDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50O1xufVxuXG4vKipcbiAqIEFkZHMgYSBDU1MgY2xhc3MgdG8gYW4gZWxlbWVudFxuICovXG5mdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50OiBIVE1MRWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGVsZW1lbnQgJiYgY2xhc3NOYW1lKSB7XG4gICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgZWxlbWVudCBoYXMgYSBDU1MgY2xhc3NcbiAqL1xuZnVuY3Rpb24gaGFzQ2xhc3MoZWxlbWVudDogSFRNTEVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFVOSUZJRUQgQ09NUE9ORU5UIENSRUFUSU9OICh3aXRoIGRlc3RydWN0dXJpbmcgb3B0aW1pemF0aW9uKVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENyZWF0ZXMgYSBjb21wb25lbnQgaW5zdGFuY2Ugd2l0aCBvcHRpbWl6ZWQgb3B0aW9uIHByb2Nlc3NpbmdcbiAqIFVzZXMgZGVzdHJ1Y3R1cmluZyBmb3IgY2xlYW5lciBzZXBhcmF0aW9uIG9mIGNvbmNlcm5zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKFxuICBDb21wb25lbnQ6IGFueSxcbiAgb3B0aW9uczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuKTogYW55IHtcbiAgdHJ5IHtcbiAgICAvLyBEZXN0cnVjdHVyZSBzcGVjaWFsIGNvbmZpZ3MgaW4gb25lIG9wZXJhdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGxheW91dDogbGF5b3V0Q29uZmlnLFxuICAgICAgbGF5b3V0SXRlbTogbGF5b3V0SXRlbUNvbmZpZyxcbiAgICAgIHN0eWxlOiBzdHlsZUNvbmZpZyxcbiAgICAgIGF0dHJpYnV0ZXM6IGF0dHJpYnV0ZXNDb25maWcsXG4gICAgICBldmVudHM6IGV2ZW50c0NvbmZpZyxcbiAgICAgIGV2ZW50LCAvLyBMZWdhY3kgc3VwcG9ydFxuICAgICAgLi4uY2xlYW5PcHRpb25zXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBVc2UgZXZlbnRzIG92ZXIgZXZlbnQgKGV2ZW50cyBpcyBwcmVmZXJyZWQpXG4gICAgY29uc3QgZmluYWxFdmVudHNDb25maWcgPSBldmVudHNDb25maWcgfHwgZXZlbnQ7XG5cbiAgICAvLyBJZiBzdHlsZSBpcyBhIHN0cmluZywgYWx3YXlzIHBhc3MgaXQgdGhyb3VnaCB0byB0aGUgY29tcG9uZW50XG4gICAgaWYgKHN0eWxlQ29uZmlnICYmIHR5cGVvZiBzdHlsZUNvbmZpZyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY2xlYW5PcHRpb25zLnN0eWxlID0gc3R5bGVDb25maWc7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNvbXBvbmVudFxuICAgIGNvbnN0IGlzQ2xhc3MgPVxuICAgICAgdHlwZW9mIENvbXBvbmVudCA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKENvbXBvbmVudCwgXCJwcm90b3R5cGVcIik/LndyaXRhYmxlID09PVxuICAgICAgICBmYWxzZTtcblxuICAgIGNvbnN0IGNvbXBvbmVudCA9IGlzQ2xhc3NcbiAgICAgID8gbmV3IENvbXBvbmVudChjbGVhbk9wdGlvbnMpXG4gICAgICA6IENvbXBvbmVudChjbGVhbk9wdGlvbnMpO1xuXG4gICAgLy8gQXBwbHkgY29uZmlndXJhdGlvbnMgaWYgY29tcG9uZW50IGhhcyBlbGVtZW50XG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50IHx8XG4gICAgICAgIChjb21wb25lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA/IGNvbXBvbmVudCA6IG51bGwpO1xuICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgLy8gQXBwbHkgbGF5b3V0IGNsYXNzZXNcbiAgICAgICAgaWYgKGxheW91dENvbmZpZykgYXBwbHlMYXlvdXRDbGFzc2VzKGVsZW1lbnQsIGxheW91dENvbmZpZyk7XG5cbiAgICAgICAgLy8gQXBwbHkgbGF5b3V0IGl0ZW0gY2xhc3Nlc1xuICAgICAgICBpZiAobGF5b3V0SXRlbUNvbmZpZykgYXBwbHlMYXlvdXRJdGVtQ2xhc3NlcyhlbGVtZW50LCBsYXlvdXRJdGVtQ29uZmlnKTtcblxuICAgICAgICAvLyBBcHBseSBzdHlsZVxuICAgICAgICBpZiAoc3R5bGVDb25maWcgJiYgdHlwZW9mIHN0eWxlQ29uZmlnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZUNvbmZpZyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBhdHRyaWJ1dGVzXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzQ29uZmlnICYmIHR5cGVvZiBhdHRyaWJ1dGVzQ29uZmlnID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXR0cmlidXRlc0NvbmZpZykpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgZXZlbnRzXG4gICAgICAgIGlmIChmaW5hbEV2ZW50c0NvbmZpZyAmJiB0eXBlb2YgZmluYWxFdmVudHNDb25maWcgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaW5hbEV2ZW50c0NvbmZpZykpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZXZlbnREZWYgb2YgZmluYWxFdmVudHNDb25maWcpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZXZlbnREZWYpICYmIGV2ZW50RGVmLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW2V2ZW50TmFtZSwgaGFuZGxlcl0gPSBldmVudERlZjtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgZXZlbnROYW1lID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAgICAgICB0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBbZXZlbnROYW1lLCBoYW5kbGVyXSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICAgICAgZmluYWxFdmVudHNDb25maWcsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBjcmVhdGluZyBjb21wb25lbnQgaW5zdGFuY2U6XCIsIGVycm9yKTtcbiAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgfVxufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBJTlRFR1JBVEVEIExBWU9VVCBDT05GSUdVUkFUSU9OICh3aXRoIGNhY2hpbmcpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQXBwbGllcyBsYXlvdXQgY2xhc3NlcyBiYXNlZCBvbiBjb25maWd1cmF0aW9uXG4gKiBVc2VzIGludGVncmF0ZWQgY2FjaGluZyBmb3Igb3B0aW1hbCBwZXJmb3JtYW5jZVxuICovXG5mdW5jdGlvbiBhcHBseUxheW91dENsYXNzZXMoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBsYXlvdXRDb25maWc6IExheW91dENvbmZpZyxcbik6IHZvaWQge1xuICBpZiAoIWVsZW1lbnQgfHwgIWxheW91dENvbmZpZykgcmV0dXJuO1xuXG4gIC8vIEFwcGx5IGJhc2UgbGF5b3V0IHR5cGVcbiAgaWYgKGxheW91dENvbmZpZy50eXBlKSB7XG4gICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLSR7bGF5b3V0Q29uZmlnLnR5cGV9YCk7XG4gIH1cblxuICAvLyBBcHBseSBwcm9wZXJ0aWVzIHdpdGggY2FjaGluZ1xuICBjb25zdCBsYXlvdXRUeXBlID0gbGF5b3V0Q29uZmlnLnR5cGUgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KTtcbiAgaWYgKGxheW91dFR5cGUpIHtcbiAgICBpZiAobGF5b3V0Q29uZmlnLmdhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKGxheW91dFR5cGUsIFwiZ2FwXCIsIGxheW91dENvbmZpZy5nYXApLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGxheW91dENvbmZpZy5hbGlnbikge1xuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIFBSRUZJWF9XSVRIX0RBU0ggK1xuICAgICAgICAgIGdldENhY2hlZENsYXNzTmFtZShsYXlvdXRUeXBlLCBcImFsaWduXCIsIGxheW91dENvbmZpZy5hbGlnbiksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmp1c3RpZnkpIHtcbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBQUkVGSVhfV0lUSF9EQVNIICtcbiAgICAgICAgICBnZXRDYWNoZWRDbGFzc05hbWUobGF5b3V0VHlwZSwgXCJqdXN0aWZ5XCIsIGxheW91dENvbmZpZy5qdXN0aWZ5KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gR3JpZC1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gIGlmIChsYXlvdXRDb25maWcudHlwZSA9PT0gXCJncmlkXCIgfHwgZ2V0TGF5b3V0VHlwZShlbGVtZW50KSA9PT0gXCJncmlkXCIpIHtcbiAgICBpZiAodHlwZW9mIGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcIm51bWJlclwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgICAgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiZ3JpZFwiLCBcImNvbHNcIiwgbGF5b3V0Q29uZmlnLmNvbHVtbnMpLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGxheW91dENvbmZpZy5jb2x1bW5zID09PSBcImF1dG8tZmlsbFwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcImdyaWRcIiwgXCJmaWxsXCIsIFwiYXV0b1wiKSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChsYXlvdXRDb25maWcuY29sdW1ucyA9PT0gXCJhdXRvLWZpdFwiKSB7XG4gICAgICBhZGRDbGFzcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcImdyaWRcIiwgXCJjb2xzXCIsIFwiYXV0by1maXRcIiksXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLmRlbnNlKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWdyaWQtZGVuc2VgKTtcbiAgICBpZiAobGF5b3V0Q29uZmlnLmF1dG9IZWlnaHQpXG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZC1hdXRvLWhlaWdodGApO1xuICB9XG5cbiAgLy8gUm93LXNwZWNpZmljIHByb3BlcnRpZXNcbiAgaWYgKGxheW91dENvbmZpZy50eXBlID09PSBcInJvd1wiIHx8IGdldExheW91dFR5cGUoZWxlbWVudCkgPT09IFwicm93XCIpIHtcbiAgICBpZiAobGF5b3V0Q29uZmlnLndyYXAgPT09IGZhbHNlIHx8IGxheW91dENvbmZpZy53cmFwID09PSBcIm5vd3JhcFwiKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LW5vd3JhcGApO1xuICAgIH0gZWxzZSBpZiAobGF5b3V0Q29uZmlnLndyYXAgPT09IFwicmV2ZXJzZVwiKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93LXdyYXAtcmV2ZXJzZWApO1xuICAgIH1cbiAgICBpZiAobGF5b3V0Q29uZmlnLm1vYmlsZVN0YWNrKVxuICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLXJvdy1tb2JpbGUtc3RhY2tgKTtcbiAgICBpZiAobGF5b3V0Q29uZmlnLm1vYmlsZVNjcm9sbClcbiAgICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1yb3ctbW9iaWxlLXNjcm9sbGApO1xuICB9XG5cbiAgLy8gQ3VzdG9tIGNsYXNzZXNcbiAgaWYgKGxheW91dENvbmZpZy5jbGFzcykge1xuICAgIGxheW91dENvbmZpZy5jbGFzc1xuICAgICAgLnNwbGl0KFwiIFwiKVxuICAgICAgLmZpbHRlcihCb29sZWFuKVxuICAgICAgLmZvckVhY2goKGNscykgPT4gZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNscykpO1xuICB9XG59XG5cbi8qKlxuICogQXBwbGllcyBsYXlvdXQgaXRlbSBjbGFzc2VzIGJhc2VkIG9uIGNvbmZpZ3VyYXRpb25cbiAqIFVzZXMgaW50ZWdyYXRlZCBjYWNoaW5nIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIGFwcGx5TGF5b3V0SXRlbUNsYXNzZXMoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBpdGVtQ29uZmlnOiBMYXlvdXRJdGVtQ29uZmlnLFxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhaXRlbUNvbmZpZykgcmV0dXJuO1xuXG4gIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0X19pdGVtYCk7XG5cbiAgLy8gV2lkdGggYW5kIHJlc3BvbnNpdmUgY2xhc3NlcyB3aXRoIGNhY2hpbmdcbiAgaWYgKGl0ZW1Db25maWcud2lkdGggJiYgaXRlbUNvbmZpZy53aWR0aCA+PSAxICYmIGl0ZW1Db25maWcud2lkdGggPD0gMTIpIHtcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIlwiLCBpdGVtQ29uZmlnLndpZHRoKSxcbiAgICApO1xuICB9XG4gIGlmIChpdGVtQ29uZmlnLnNtKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic21cIiwgaXRlbUNvbmZpZy5zbSksXG4gICAgKTtcbiAgaWYgKGl0ZW1Db25maWcubWQpXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJtZFwiLCBpdGVtQ29uZmlnLm1kKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5sZylcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcImxnXCIsIGl0ZW1Db25maWcubGcpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLnhsKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwieGxcIiwgaXRlbUNvbmZpZy54bCksXG4gICAgKTtcblxuICAvLyBHcmlkIHNwYW4gY2xhc3Nlc1xuICBpZiAoaXRlbUNvbmZpZy5zcGFuKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic3BhblwiLCBpdGVtQ29uZmlnLnNwYW4pLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLnJvd1NwYW4pXG4gICAgYWRkQ2xhc3MoXG4gICAgICBlbGVtZW50LFxuICAgICAgUFJFRklYX1dJVEhfREFTSCArXG4gICAgICAgIGdldENhY2hlZENsYXNzTmFtZShcIml0ZW1cIiwgXCJyb3ctc3BhblwiLCBpdGVtQ29uZmlnLnJvd1NwYW4pLFxuICAgICk7XG5cbiAgLy8gT3JkZXIgYW5kIGFsaWdubWVudFxuICBpZiAoaXRlbUNvbmZpZy5vcmRlcilcbiAgICBhZGRDbGFzcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBQUkVGSVhfV0lUSF9EQVNIICsgZ2V0Q2FjaGVkQ2xhc3NOYW1lKFwiaXRlbVwiLCBcIm9yZGVyXCIsIGl0ZW1Db25maWcub3JkZXIpLFxuICAgICk7XG4gIGlmIChpdGVtQ29uZmlnLmFsaWduKVxuICAgIGFkZENsYXNzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIFBSRUZJWF9XSVRIX0RBU0ggKyBnZXRDYWNoZWRDbGFzc05hbWUoXCJpdGVtXCIsIFwic2VsZlwiLCBpdGVtQ29uZmlnLmFsaWduKSxcbiAgICApO1xuICBpZiAoaXRlbUNvbmZpZy5hdXRvKVxuICAgIGFkZENsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0X19pdGVtLS1hdXRvYCk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgbGF5b3V0IHR5cGUgZnJvbSBlbGVtZW50IGNsYXNzZXNcbiAqL1xuZnVuY3Rpb24gZ2V0TGF5b3V0VHlwZShlbGVtZW50OiBIVE1MRWxlbWVudCk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tc3RhY2tgKVxuICAgID8gXCJzdGFja1wiXG4gICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93YClcbiAgICAgID8gXCJyb3dcIlxuICAgICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tZ3JpZGApXG4gICAgICAgID8gXCJncmlkXCJcbiAgICAgICAgOiBcIlwiO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBVTklGSUVEIFNDSEVNQSBQUk9DRVNTT1JTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogUHJvY2Vzc2VzIGFycmF5LWJhc2VkIHNjaGVtYSBkZWZpbml0aW9uc1xuICogT3B0aW1pemVkIHdpdGggcGFyYW1ldGVyIGV4dHJhY3Rpb24gYW5kIGludGVncmF0ZWQgY29uZmlndXJhdGlvblxuICovXG5mdW5jdGlvbiBwcm9jZXNzQXJyYXlTY2hlbWEoXG4gIHNjaGVtYTogU2NoZW1hSXRlbVtdIHwgYW55LFxuICBwYXJlbnRFbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsLFxuICBsZXZlbDogbnVtYmVyID0gMCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgbGV2ZWwrKztcbiAgY29uc3QgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGNvbnN0IGNvbXBvbmVudHM6IEFycmF5PFtzdHJpbmcsIGFueV0+ID0gW107XG4gIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgbGV0IGNvbXBvbmVudCA9IG51bGw7XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHNjaGVtYSkpIHtcbiAgICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG4gIH1cblxuICBjb25zdCBkZWZhdWx0Q3JlYXRvciA9IChvcHRpb25zIGFzIGFueSkuY3JlYXRvciB8fCBjcmVhdGVFbGVtZW50O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgaXRlbSA9IHNjaGVtYVtpXTtcbiAgICBpZiAoIWl0ZW0pIGNvbnRpbnVlO1xuXG4gICAgLy8gSGFuZGxlIG5lc3RlZCBhcnJheXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gY29tcG9uZW50IHx8IHBhcmVudEVsZW1lbnQ7XG4gICAgICBjb25zdCByZXN1bHQgPSBwcm9jZXNzQXJyYXlTY2hlbWEoaXRlbSwgY29udGFpbmVyLCBsZXZlbCwgb3B0aW9ucyk7XG4gICAgICAvLyBNZXJnZSBuZXN0ZWQgY29tcG9uZW50cyBhcnJheSBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShyZXN1bHQubGF5b3V0LmNvbXBvbmVudHMpKSB7XG4gICAgICAgIGNvbXBvbmVudHMucHVzaCguLi5yZXN1bHQubGF5b3V0LmNvbXBvbmVudHMpO1xuICAgICAgICBkZWxldGUgcmVzdWx0LmxheW91dC5jb21wb25lbnRzO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIHJlc3VsdC5sYXlvdXQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgLy8gVXNlIG9wdGltaXplZCBwYXJhbWV0ZXIgZXh0cmFjdGlvblxuICAgIGNvbnN0IHtcbiAgICAgIGNyZWF0b3IsXG4gICAgICBuYW1lLFxuICAgICAgb3B0aW9uczogaXRlbU9wdGlvbnMsXG4gICAgICBjb25zdW1lZCxcbiAgICB9ID0gZXh0cmFjdFBhcmFtZXRlcnMoc2NoZW1hLCBpLCBkZWZhdWx0Q3JlYXRvcik7XG5cbiAgICBpZiAoIWNyZWF0b3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIlNraXBwaW5nIHVuc3VwcG9ydGVkIGl0ZW0gdHlwZTpcIiwgaXRlbSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IHRvIGRpdiBmb3IgY3JlYXRlRWxlbWVudFxuICAgIGlmIChjcmVhdG9yID09PSBjcmVhdGVFbGVtZW50ICYmICEoXCJ0YWdcIiBpbiBpdGVtT3B0aW9ucykpIHtcbiAgICAgIGl0ZW1PcHRpb25zLnRhZyA9IFwiZGl2XCI7XG4gICAgfVxuXG4gICAgLy8gQWR2YW5jZSBpbmRleCBieSBjb25zdW1lZCBpdGVtcyBtaW51cyAxIChsb29wIGluY3JlbWVudCBoYW5kbGVzIHRoZSArMSlcbiAgICBpICs9IGNvbnN1bWVkIC0gMTtcblxuICAgIC8vIFByb2Nlc3Mgb3B0aW9ucyB3aXRoIHByZWZpeCAtIG9wdGltaXplZCBkZWNpc2lvbiBsb2dpY1xuICAgIGNvbnN0IHNob3VsZEFwcGx5UHJlZml4ID1cbiAgICAgIFwicHJlZml4XCIgaW4gaXRlbU9wdGlvbnMgPyBpdGVtT3B0aW9ucy5wcmVmaXggOiBvcHRpb25zLnByZWZpeCAhPT0gZmFsc2U7XG5cbiAgICAvLyBGYXN0IHBhdGg6IHByb2Nlc3Mgb25seSB3aGVuIG5lZWRlZFxuICAgIGNvbnN0IHByb2Nlc3NlZE9wdGlvbnMgPVxuICAgICAgc2hvdWxkQXBwbHlQcmVmaXggfHwgaXRlbU9wdGlvbnMucmF3Q2xhc3NcbiAgICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhpdGVtT3B0aW9ucywgIXNob3VsZEFwcGx5UHJlZml4KVxuICAgICAgICA6IGl0ZW1PcHRpb25zOyAvLyBObyBjb3B5IG5lZWRlZCBpZiBubyBwcm9jZXNzaW5nXG5cbiAgICAvLyBBZGQgbmFtZSB0byBvcHRpb25zIGlmIG5lZWRlZFxuICAgIGlmIChcbiAgICAgIG5hbWUgJiZcbiAgICAgICEoXCJuYW1lXCIgaW4gcHJvY2Vzc2VkT3B0aW9ucykgJiZcbiAgICAgICEoY3JlYXRvciA9PT0gY3JlYXRlRWxlbWVudCB8fCAoY3JlYXRvciBhcyBhbnkpLmlzRWxlbWVudClcbiAgICApIHtcbiAgICAgIHByb2Nlc3NlZE9wdGlvbnMubmFtZSA9IG5hbWU7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNvbXBvbmVudFxuICAgIGNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGNyZWF0b3IsIHByb2Nlc3NlZE9wdGlvbnMpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBpc0NvbXBvbmVudChjb21wb25lbnQpID8gY29tcG9uZW50LmVsZW1lbnQgOiBjb21wb25lbnQ7XG5cbiAgICBpZiAobGV2ZWwgPT09IDEpIGxheW91dC5lbGVtZW50ID0gZWxlbWVudDtcbiAgICBpZiAobmFtZSkge1xuICAgICAgbGF5b3V0W25hbWVdID0gY29tcG9uZW50O1xuICAgICAgY29tcG9uZW50cy5wdXNoKFtuYW1lLCBjb21wb25lbnRdKTtcbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgdG8gRE9NXG4gICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgaWYgKFwiaW5zZXJ0XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuaW5zZXJ0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgY29tcG9uZW50Lmluc2VydChmcmFnbWVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBhcmVudEVsZW1lbnQpIHtcbiAgICAgICAgY29tcG9uZW50Ll9jb250YWluZXIgPSBwYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgXCJvbkluc2VydGVkXCIgaW4gY29tcG9uZW50ICYmXG4gICAgICAgICAgdHlwZW9mIGNvbXBvbmVudC5vbkluc2VydGVkID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29tcG9uZW50Lm9uSW5zZXJ0ZWQocGFyZW50RWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBBcHBlbmQgZnJhZ21lbnQgdG8gcGFyZW50XG4gIGlmIChwYXJlbnRFbGVtZW50ICYmIGZyYWdtZW50Lmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBpc0NvbXBvbmVudChwYXJlbnRFbGVtZW50KVxuICAgICAgPyBwYXJlbnRFbGVtZW50LmVsZW1lbnRcbiAgICAgIDogcGFyZW50RWxlbWVudDtcbiAgICB3cmFwcGVyLmFwcGVuZENoaWxkKGZyYWdtZW50KTtcbiAgfVxuXG4gIC8vIFJlbGVhc2UgZnJhZ21lbnQgYmFjayB0byBwb29sXG4gIHJlbGVhc2VGcmFnbWVudChmcmFnbWVudCk7XG5cbiAgbGF5b3V0LmNvbXBvbmVudHMgPSBjb21wb25lbnRzO1xuICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIG9iamVjdC1iYXNlZCBzY2hlbWEgZGVmaW5pdGlvbnNcbiAqIFNpbXBsaWZpZWQgYW5kIG9wdGltaXplZCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gKi9cbmZ1bmN0aW9uIHByb2Nlc3NPYmplY3RTY2hlbWEoXG4gIHNjaGVtYTogUmVjb3JkPHN0cmluZywgYW55PiB8IHN0cmluZyxcbiAgcGFyZW50RWxlbWVudDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbCxcbiAgb3B0aW9uczogTGF5b3V0T3B0aW9ucyA9IHt9LFxuKTogTGF5b3V0UmVzdWx0IHtcbiAgY29uc3QgbGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge307XG4gIGNvbnN0IGRlZmF1bHRDcmVhdG9yID0gb3B0aW9ucy5jcmVhdG9yIHx8IGNyZWF0ZUVsZW1lbnQ7XG5cbiAgLy8gSGFuZGxlIHJvb3QgZWxlbWVudCBjcmVhdGlvblxuICBpZiAoKHNjaGVtYSBhcyBhbnkpLmVsZW1lbnQgJiYgIXBhcmVudEVsZW1lbnQpIHtcbiAgICBjb25zdCBlbGVtZW50RGVmID0gKHNjaGVtYSBhcyBhbnkpLmVsZW1lbnQ7XG4gICAgY29uc3QgY3JlYXRlRWxlbWVudEZuID0gZWxlbWVudERlZi5jcmVhdG9yIHx8IGRlZmF1bHRDcmVhdG9yO1xuXG4gICAgY29uc3QgZWxlbWVudE9wdGlvbnMgPSBlbGVtZW50RGVmLm9wdGlvbnMgfHwge307XG4gICAgY29uc3QgcHJvY2Vzc2VkT3B0aW9ucyA9XG4gICAgICBvcHRpb25zLnByZWZpeCAhPT0gZmFsc2VcbiAgICAgICAgPyBwcm9jZXNzQ2xhc3NOYW1lcyhlbGVtZW50T3B0aW9ucylcbiAgICAgICAgOiB7IC4uLmVsZW1lbnRPcHRpb25zIH07XG5cbiAgICBjb25zdCByb290Q29tcG9uZW50ID0gY3JlYXRlQ29tcG9uZW50SW5zdGFuY2UoXG4gICAgICBjcmVhdGVFbGVtZW50Rm4sXG4gICAgICBwcm9jZXNzZWRPcHRpb25zLFxuICAgICk7XG4gICAgbGF5b3V0LmVsZW1lbnQgPSByb290Q29tcG9uZW50O1xuICAgIGlmIChlbGVtZW50RGVmLm5hbWUpIGxheW91dFtlbGVtZW50RGVmLm5hbWVdID0gcm9vdENvbXBvbmVudDtcblxuICAgIC8vIFByb2Nlc3MgY2hpbGRyZW5cbiAgICBpZiAoZWxlbWVudERlZi5jaGlsZHJlbikge1xuICAgICAgY29uc3Qgcm9vdEVsZW1lbnQgPSBpc0NvbXBvbmVudChyb290Q29tcG9uZW50KVxuICAgICAgICA/IHJvb3RDb21wb25lbnQuZWxlbWVudFxuICAgICAgICA6IHJvb3RDb21wb25lbnQ7XG4gICAgICBjb25zdCBjaGlsZFJlc3VsdCA9IHByb2Nlc3NPYmplY3RTY2hlbWEoXG4gICAgICAgIGVsZW1lbnREZWYuY2hpbGRyZW4sXG4gICAgICAgIHJvb3RFbGVtZW50LFxuICAgICAgICBvcHRpb25zLFxuICAgICAgKTtcbiAgICAgIE9iamVjdC5hc3NpZ24obGF5b3V0LCBjaGlsZFJlc3VsdC5sYXlvdXQpO1xuICAgIH1cblxuICAgIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbiAgfVxuXG4gIC8vIFByb2Nlc3Mgbm9ybWFsIHNjaGVtYSBlbGVtZW50c1xuICBjb25zdCBmcmFnbWVudCA9IHBhcmVudEVsZW1lbnQgPyBjcmVhdGVGcmFnbWVudCgpIDogbnVsbDtcblxuICBmb3IgKGNvbnN0IGtleSBpbiBzY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGNvbnN0IGRlZiA9IChzY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgYW55Pilba2V5XTtcbiAgICBpZiAoIWRlZikgY29udGludWU7XG5cbiAgICBjb25zdCBlbGVtZW50Q3JlYXRvciA9IGRlZi5jcmVhdG9yIHx8IGRlZmF1bHRDcmVhdG9yO1xuICAgIGNvbnN0IGVsZW1lbnRPcHRpb25zID0gZGVmLm9wdGlvbnMgfHwge307XG4gICAgY29uc3Qgc2hvdWxkQXBwbHlQcmVmaXggPVxuICAgICAgXCJwcmVmaXhcIiBpbiBlbGVtZW50T3B0aW9uc1xuICAgICAgICA/IGVsZW1lbnRPcHRpb25zLnByZWZpeFxuICAgICAgICA6IG9wdGlvbnMucHJlZml4ICE9PSBmYWxzZTtcbiAgICBjb25zdCBwcm9jZXNzZWRPcHRpb25zID0gc2hvdWxkQXBwbHlQcmVmaXhcbiAgICAgID8gcHJvY2Vzc0NsYXNzTmFtZXMoZWxlbWVudE9wdGlvbnMpXG4gICAgICA6IHsgLi4uZWxlbWVudE9wdGlvbnMgfTtcblxuICAgIGlmICghZGVmLm5hbWUgJiYga2V5ICE9PSBcImVsZW1lbnRcIikge1xuICAgICAgZGVmLm5hbWUgPSBrZXk7XG4gICAgfVxuXG4gICAgY29uc3QgY3JlYXRlZCA9IGNyZWF0ZUNvbXBvbmVudEluc3RhbmNlKGVsZW1lbnRDcmVhdG9yLCBwcm9jZXNzZWRPcHRpb25zKTtcbiAgICBsYXlvdXRba2V5XSA9IGNyZWF0ZWQ7XG4gICAgaWYgKGRlZi5uYW1lICYmIGRlZi5uYW1lICE9PSBrZXkpIGxheW91dFtkZWYubmFtZV0gPSBjcmVhdGVkO1xuXG4gICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGNyZWF0ZWQpID8gY3JlYXRlZC5lbGVtZW50IDogY3JlYXRlZDtcbiAgICBpZiAoZnJhZ21lbnQpIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuXG4gICAgLy8gUHJvY2VzcyBjaGlsZHJlblxuICAgIGlmIChkZWYuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGNoaWxkUmVzdWx0ID0gcHJvY2Vzc09iamVjdFNjaGVtYShkZWYuY2hpbGRyZW4sIGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgT2JqZWN0LmFzc2lnbihsYXlvdXQsIGNoaWxkUmVzdWx0LmxheW91dCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQXBwZW5kIHRvIHBhcmVudFxuICBpZiAocGFyZW50RWxlbWVudCAmJiBmcmFnbWVudCkge1xuICAgIGNvbnN0IHBhcmVudERvbSA9IGlzQ29tcG9uZW50KHBhcmVudEVsZW1lbnQpXG4gICAgICA/IHBhcmVudEVsZW1lbnQuZWxlbWVudFxuICAgICAgOiBwYXJlbnRFbGVtZW50O1xuICAgIHBhcmVudERvbS5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgcmVsZWFzZUZyYWdtZW50KGZyYWdtZW50KTtcbiAgfVxuXG4gIHJldHVybiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0KTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gTEFZT1VUIFJFU1VMVCBDUkVBVElPTlxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIEZsYXR0ZW5zIGEgbmVzdGVkIGxheW91dCBpbnRvIGEgc2ltcGxlIG9iamVjdCB3aXRoIGVsZW1lbnQgYW5kIGNvbXBvbmVudCByZWZlcmVuY2VzXG4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5MYXlvdXQobGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gIGNvbnN0IGZsYXR0ZW5lZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuXG4gIGlmICghbGF5b3V0IHx8IHR5cGVvZiBsYXlvdXQgIT09IFwib2JqZWN0XCIpIHJldHVybiBmbGF0dGVuZWQ7XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBsYXlvdXRba2V5XTtcbiAgICBpZiAoXG4gICAgICB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8XG4gICAgICAgICh0eXBlb2YgU1ZHRWxlbWVudCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHx8XG4gICAgICAgIGlzQ29tcG9uZW50KHZhbHVlKSlcbiAgICApIHtcbiAgICAgIGZsYXR0ZW5lZFtrZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZsYXR0ZW5lZDtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF5b3V0IHJlc3VsdCBvYmplY3Qgd2l0aCB1dGlsaXR5IGZ1bmN0aW9uc1xuICovXG5mdW5jdGlvbiBjcmVhdGVMYXlvdXRSZXN1bHQobGF5b3V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogTGF5b3V0UmVzdWx0IHtcbiAgY29uc3QgZmxhdHRlbmVkQ29tcG9uZW50cyA9IGZsYXR0ZW5MYXlvdXQobGF5b3V0KTtcblxuICByZXR1cm4ge1xuICAgIGxheW91dCxcbiAgICBlbGVtZW50OiBsYXlvdXQuZWxlbWVudCxcbiAgICBjb21wb25lbnQ6IGZsYXR0ZW5lZENvbXBvbmVudHMsXG5cbiAgICBnZXQobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICAgIHJldHVybiBsYXlvdXRbbmFtZV0gPz8gbnVsbDtcbiAgICB9LFxuXG4gICAgZ2V0QWxsKCk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgICAgcmV0dXJuIGZsYXR0ZW5lZENvbXBvbmVudHM7XG4gICAgfSxcblxuICAgIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAvLyBUcmFjayBkZXN0cm95ZWQgY29tcG9uZW50cyB0byBhdm9pZCBkb3VibGUtZGVzdHJveVxuICAgICAgY29uc3QgZGVzdHJveWVkID0gbmV3IFNldDxhbnk+KCk7XG5cbiAgICAgIC8vIEhlbHBlciB0byBzYWZlbHkgZGVzdHJveSBhIGNvbXBvbmVudFxuICAgICAgY29uc3QgZGVzdHJveUNvbXBvbmVudCA9IChjb21wb25lbnQ6IGFueSk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIWNvbXBvbmVudCB8fCBkZXN0cm95ZWQuaGFzKGNvbXBvbmVudCkpIHJldHVybjtcblxuICAgICAgICAvLyBTa2lwIHBsYWluIEhUTUwgZWxlbWVudHMgYW5kIG5vbi1vYmplY3RzXG4gICAgICAgIGlmIChjb21wb25lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCB0eXBlb2YgY29tcG9uZW50ICE9PSBcIm9iamVjdFwiKVxuICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGEgY29tcG9uZW50IHdpdGggZGVzdHJveSBtZXRob2RcbiAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgZGVzdHJveWVkLmFkZChjb21wb25lbnQpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZGVzdHJveSgpO1xuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBkZXN0cm95IGVycm9ycyAtIGNvbXBvbmVudCBtYXkgYWxyZWFkeSBiZSBjbGVhbmVkIHVwXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBGaXJzdCBkZXN0cm95IGNvbXBvbmVudHMgZnJvbSB0aGUgY29tcG9uZW50cyBhcnJheSAoaWYgcHJlc2VudClcbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBhbGwgbmFtZWQgY29tcG9uZW50cyBhcmUgZGVzdHJveWVkIGV2ZW4gaWYgbmVzdGVkXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShsYXlvdXQuY29tcG9uZW50cykpIHtcbiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgY29tcG9uZW50XSBvZiBsYXlvdXQuY29tcG9uZW50cykge1xuICAgICAgICAgIGRlc3Ryb3lDb21wb25lbnQoY29tcG9uZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGVuIGl0ZXJhdGUgb3ZlciBhbGwgbGF5b3V0IGtleXMgZm9yIGFueSBtaXNzZWQgY29tcG9uZW50c1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gbGF5b3V0KSB7XG4gICAgICAgIGlmIChrZXkgPT09IFwiZWxlbWVudFwiIHx8IGtleSA9PT0gXCJjb21wb25lbnRzXCIpIGNvbnRpbnVlO1xuICAgICAgICBkZXN0cm95Q29tcG9uZW50KGxheW91dFtrZXldKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdGhlIGNvbXBvbmVudHMgYXJyYXlcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGxheW91dC5jb21wb25lbnRzKSkge1xuICAgICAgICBsYXlvdXQuY29tcG9uZW50cy5sZW5ndGggPSAwO1xuICAgICAgfVxuXG4gICAgICAvLyBSZW1vdmUgcm9vdCBlbGVtZW50IGZyb20gRE9NXG4gICAgICBpZiAobGF5b3V0LmVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IGlzQ29tcG9uZW50KGxheW91dC5lbGVtZW50KVxuICAgICAgICAgID8gbGF5b3V0LmVsZW1lbnQuZWxlbWVudFxuICAgICAgICAgIDogbGF5b3V0LmVsZW1lbnQ7XG4gICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDbGVhciByZWZlcmVuY2VzIHRvIGhlbHAgR0NcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGxheW91dCkge1xuICAgICAgICBkZWxldGUgbGF5b3V0W2tleV07XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVU5JRklFRCBFTlRSWSBQT0lOVFxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vKipcbiAqIENyZWF0ZXMgYSBsYXlvdXQgZnJvbSB2YXJpb3VzIHNjaGVtYSBmb3JtYXRzXG4gKiBVbmlmaWVkIHByb2Nlc3NvciBmb3IgYXJyYXlzLCBvYmplY3RzLCBKU1gsIGFuZCBIVE1MIHN0cmluZ3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxheW91dChcbiAgc2NoZW1hOiBhbnksXG4gIHBhcmVudEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGwsXG4gIG9wdGlvbnM6IExheW91dE9wdGlvbnMgPSB7fSxcbik6IExheW91dFJlc3VsdCB7XG4gIC8vIEhhbmRsZSBmdW5jdGlvbiBzY2hlbWFzXG4gIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBzY2hlbWEgPSBzY2hlbWEoKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBIVE1MIHN0cmluZyBzY2hlbWFzXG4gIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG4gICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gc2NoZW1hLnRyaW0oKTtcbiAgICBjb25zdCBmcmFnbWVudCA9IHRlbXBsYXRlLmNvbnRlbnQ7XG5cbiAgICBpZiAocGFyZW50RWxlbWVudCAmJiBmcmFnbWVudC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgIHBhcmVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoZnJhZ21lbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IGxheW91dCA9IHsgZWxlbWVudDogZnJhZ21lbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQgfTtcbiAgICByZXR1cm4gY3JlYXRlTGF5b3V0UmVzdWx0KGxheW91dCk7XG4gIH1cblxuICAvLyBIYW5kbGUgSlNYLWxpa2Ugc2NoZW1hcyAoYXJyYXkgd2l0aCBmdW5jdGlvbiwgc3RyaW5nLCBvYmplY3QgcGF0dGVybilcbiAgaWYgKFxuICAgIEFycmF5LmlzQXJyYXkoc2NoZW1hKSAmJlxuICAgIHNjaGVtYS5sZW5ndGggPj0gMyAmJlxuICAgIHR5cGVvZiBzY2hlbWFbMF0gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHR5cGVvZiBzY2hlbWFbMV0gPT09IFwic3RyaW5nXCIgJiZcbiAgICBpc09iamVjdChzY2hlbWFbMl0pXG4gICkge1xuICAgIHJldHVybiBwcm9jZXNzQXJyYXlTY2hlbWEoc2NoZW1hLCBwYXJlbnRFbGVtZW50LCAwLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIFJvdXRlIHRvIGFwcHJvcHJpYXRlIHByb2Nlc3NvclxuICByZXR1cm4gQXJyYXkuaXNBcnJheShzY2hlbWEpXG4gICAgPyBwcm9jZXNzQXJyYXlTY2hlbWEoc2NoZW1hLCBwYXJlbnRFbGVtZW50LCAwLCBvcHRpb25zKVxuICAgIDogcHJvY2Vzc09iamVjdFNjaGVtYShzY2hlbWEsIHBhcmVudEVsZW1lbnQsIG9wdGlvbnMpO1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBFWFBPUlRTXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIENsZWFyIGZ1bmN0aW9ucyBmb3IgdGhlIHVuaWZpZWQgc3lzdGVtXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJDbGFzc0NhY2hlKCk6IHZvaWQge1xuICBjbGFzc0NhY2hlLmNsZWFyKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhckZyYWdtZW50UG9vbCgpOiB2b2lkIHtcbiAgZnJhZ21lbnRQb29sLmNsZWFyKCk7XG59XG5cbmV4cG9ydCB7XG4gIHByb2Nlc3NDbGFzc05hbWVzLFxuICBpc0NvbXBvbmVudCxcbiAgZmxhdHRlbkxheW91dCxcbiAgYXBwbHlMYXlvdXRDbGFzc2VzLFxuICBhcHBseUxheW91dEl0ZW1DbGFzc2VzLFxuICBjcmVhdGVMYXlvdXRSZXN1bHQsXG59O1xuIiwKICAgICIvKipcbiAqIEBtb2R1bGUgY29yZS9sYXlvdXQvY29uZmlnXG4gKiBAZGVzY3JpcHRpb24gRXNzZW50aWFsIGxheW91dCBjb25maWd1cmF0aW9uIHV0aWxpdGllc1xuICogQ29yZSBmdW5jdGlvbmFsaXR5IGlzIGludGVncmF0ZWQgaW50byBzY2hlbWEudHMgZm9yIGJldHRlciBwZXJmb3JtYW5jZVxuICovXG5cbi8vIENvbmZpZ3VyYXRpb24gY29uc3RhbnRzXG5jb25zdCBQUkVGSVggPSBcIm10cmxcIjsgLy8gVE9ETzogTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSBmcm9tIG1haW4gbXRybCBjb25maWdcbmNvbnN0IFBSRUZJWF9XSVRIX0RBU0ggPSBgJHtQUkVGSVh9LWA7XG5cbi8qKlxuICogU2ltcGxlIERPTSB1dGlsaXRpZXNcbiAqL1xuZnVuY3Rpb24gYWRkQ2xhc3MoZWxlbWVudDogYW55LCBjbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZWxlbWVudCAmJiBjbGFzc05hbWUgJiYgZWxlbWVudC5jbGFzc0xpc3QpIHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBoYXNDbGFzcyhlbGVtZW50OiBhbnksIGNsYXNzTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBlbGVtZW50ICYmIGVsZW1lbnQuY2xhc3NMaXN0ICYmIGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGNsYXNzTmFtZSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFuIHVwIHByZXZpb3VzIGxheW91dCBjbGFzc2VzIGZyb20gYW4gZWxlbWVudFxuICogVXNlZnVsIGZvciBkeW5hbWljIGNsYXNzIG1hbmFnZW1lbnRcbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2xlYW4gbGF5b3V0IGNsYXNzZXMgZnJvbVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xlYW51cExheW91dENsYXNzZXMoZWxlbWVudDogYW55KTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhZWxlbWVudC5jbGFzc0xpc3QpIHJldHVybjtcblxuICAvLyBHZXQgYWxsIGNsYXNzZXMgZnJvbSB0aGUgZWxlbWVudFxuICBjb25zdCBjbGFzc0xpc3QgPSBBcnJheS5mcm9tKGVsZW1lbnQuY2xhc3NMaXN0KSBhcyBzdHJpbmdbXTtcblxuICAvLyBGaW5kIGFuZCByZW1vdmUgbGF5b3V0LXJlbGF0ZWQgY2xhc3Nlc1xuICBjb25zdCBsYXlvdXRDbGFzc2VzID0gY2xhc3NMaXN0LmZpbHRlcihcbiAgICAoY2xzOiBzdHJpbmcpID0+XG4gICAgICBjbHMuc3RhcnRzV2l0aChgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tYCkgfHxcbiAgICAgIGNscy5pbmNsdWRlcyhgLSR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLWApXG4gICk7XG5cbiAgLy8gUmVtb3ZlIGVhY2ggbGF5b3V0IGNsYXNzXG4gIGxheW91dENsYXNzZXMuZm9yRWFjaCgoY2xzOiBzdHJpbmcpID0+IHtcbiAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xzKTtcbiAgfSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgbGF5b3V0IHR5cGUgZnJvbSBlbGVtZW50IGNsYXNzZXNcbiAqXG4gKiBAcGFyYW0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2hlY2tcbiAqIEByZXR1cm5zIExheW91dCB0eXBlIGlmIGZvdW5kLCBlbXB0eSBzdHJpbmcgb3RoZXJ3aXNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXlvdXRUeXBlKGVsZW1lbnQ6IGFueSk6IHN0cmluZyB7XG4gIHJldHVybiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tc3RhY2tgKVxuICAgID8gXCJzdGFja1wiXG4gICAgOiBoYXNDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfWxheW91dC0tcm93YClcbiAgICA/IFwicm93XCJcbiAgICA6IGhhc0NsYXNzKGVsZW1lbnQsIGAke1BSRUZJWF9XSVRIX0RBU0h9bGF5b3V0LS1ncmlkYClcbiAgICA/IFwiZ3JpZFwiXG4gICAgOiBcIlwiO1xufVxuXG4vKipcbiAqIEdldHMgdGhlIGNvbmZpZ3VyZWQgcHJlZml4IGZvciB0aGUgbGF5b3V0IHN5c3RlbVxuICogQHJldHVybnMgQ3VycmVudCBwcmVmaXggd2l0aCBkYXNoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMYXlvdXRQcmVmaXgoKTogc3RyaW5nIHtcbiAgcmV0dXJuIFBSRUZJWF9XSVRIX0RBU0g7XG59XG5cbi8qKlxuICogU2V0cyBsYXlvdXQgY2xhc3NlcyBvbiBhbiBlbGVtZW50IGR5bmFtaWNhbGx5XG4gKiBVc2VmdWwgZm9yIHByb2dyYW1tYXRpYyBsYXlvdXQgdXBkYXRlc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50IC0gVGFyZ2V0IGVsZW1lbnRcbiAqIEBwYXJhbSBsYXlvdXRUeXBlIC0gTGF5b3V0IHR5cGUgdG8gYXBwbHlcbiAqIEBwYXJhbSBjbGFzc2VzIC0gQWRkaXRpb25hbCBjbGFzc2VzIHRvIGFwcGx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRMYXlvdXRDbGFzc2VzKFxuICBlbGVtZW50OiBhbnksXG4gIGxheW91dFR5cGU6IHN0cmluZyxcbiAgY2xhc3Nlczogc3RyaW5nW10gPSBbXVxuKTogdm9pZCB7XG4gIGlmICghZWxlbWVudCB8fCAhbGF5b3V0VHlwZSkgcmV0dXJuO1xuXG4gIC8vIENsZWFuIHVwIGV4aXN0aW5nIGxheW91dCBjbGFzc2VzIGZpcnN0XG4gIGNsZWFudXBMYXlvdXRDbGFzc2VzKGVsZW1lbnQpO1xuXG4gIC8vIEFwcGx5IGJhc2UgbGF5b3V0IHR5cGVcbiAgYWRkQ2xhc3MoZWxlbWVudCwgYCR7UFJFRklYX1dJVEhfREFTSH1sYXlvdXQtLSR7bGF5b3V0VHlwZX1gKTtcblxuICAvLyBBcHBseSBhZGRpdGlvbmFsIGNsYXNzZXNcbiAgY2xhc3Nlcy5mb3JFYWNoKChjbHMpID0+IHtcbiAgICBpZiAoY2xzLnN0YXJ0c1dpdGgoXCJsYXlvdXQtLVwiKSB8fCBjbHMuc3RhcnRzV2l0aChcImxheW91dF9fXCIpKSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBgJHtQUkVGSVhfV0lUSF9EQVNIfSR7Y2xzfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZGRDbGFzcyhlbGVtZW50LCBjbHMpO1xuICAgIH1cbiAgfSk7XG59XG4iLAogICAgIi8qKlxuICogQG1vZHVsZSBjb3JlL2xheW91dC9qc3hcbiAqIEBkZXNjcmlwdGlvbiBKU1gtbGlrZSBzeW50YXggc3VwcG9ydCBmb3IgbGF5b3V0IGNyZWF0aW9uXG4gKiBQcm92aWRlcyBhIHNpbXBsZSBoKCkgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGVsZW1lbnRzIHdpdGhvdXQgUmVhY3QgZGVwZW5kZW5jeVxuICovXG5cbmltcG9ydCB0eXBlIHsgTGF5b3V0UmVzdWx0IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGNyZWF0ZUxheW91dCB9IGZyb20gXCIuL3NjaGVtYVwiO1xuXG4vKipcbiAqIEZyYWdtZW50IHN5bWJvbCBmb3IgSlNYIGZyYWdtZW50c1xuICovXG5leHBvcnQgY29uc3QgRnJhZ21lbnQgPSBTeW1ib2woXCJGcmFnbWVudFwiKTtcblxuLyoqXG4gKiBKU1gtbGlrZSBoeXBlcnNjcmlwdCBmdW5jdGlvblxuICogQ3JlYXRlcyBlbGVtZW50cyBpbiBhIFJlYWN0LWxpa2Ugc3ludGF4IHdpdGhvdXQgUmVhY3QgZGVwZW5kZW5jeVxuICpcbiAqIEBwYXJhbSB0YWcgLSBIVE1MIHRhZyBuYW1lLCBjb21wb25lbnQgZnVuY3Rpb24sIG9yIEZyYWdtZW50XG4gKiBAcGFyYW0gcHJvcHMgLSBFbGVtZW50IHByb3BlcnRpZXMgYW5kIGF0dHJpYnV0ZXNcbiAqIEBwYXJhbSBjaGlsZHJlbiAtIENoaWxkIGVsZW1lbnRzXG4gKiBAcmV0dXJucyBET00gZWxlbWVudCBvciBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGgoXG4gIHRhZzogc3RyaW5nIHwgRnVuY3Rpb24gfCB0eXBlb2YgRnJhZ21lbnQsXG4gIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwsXG4gIC4uLmNoaWxkcmVuOiBhbnlbXVxuKTogYW55IHtcbiAgLy8gSGFuZGxlIEZyYWdtZW50XG4gIGlmICh0YWcgPT09IEZyYWdtZW50KSB7XG4gICAgY29uc3QgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gICAgY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIGlmIChjaGlsZCAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPVxuICAgICAgICAgIHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIiA/IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNoaWxkKSA6IGNoaWxkO1xuICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZnJhZ21lbnQ7XG4gIH1cblxuICAvLyBIYW5kbGUgc3RyaW5nIHRhZ3MgKEhUTUwgZWxlbWVudHMpXG4gIGlmICh0eXBlb2YgdGFnID09PSBcInN0cmluZ1wiKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnKTtcblxuICAgIC8vIEFwcGx5IHByb3BzXG4gICAgaWYgKHByb3BzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhwcm9wcykpIHtcbiAgICAgICAgaWYgKGtleSA9PT0gXCJjbGFzc05hbWVcIiB8fCBrZXkgPT09IFwiY2xhc3NcIikge1xuICAgICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJvblwiKSAmJiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIEV2ZW50IGhhbmRsZXJcbiAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSBrZXkuc2xpY2UoMikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0eWxlXCIgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgLy8gU3R5bGUgb2JqZWN0XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MXCIpIHtcbiAgICAgICAgICAvLyBIVE1MIGNvbnRlbnRcbiAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IHZhbHVlLl9faHRtbCB8fCBcIlwiO1xuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBSZWd1bGFyIGF0dHJpYnV0ZVxuICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGtleSwgdmFsdWUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBcHBlbmQgY2hpbGRyZW5cbiAgICBjaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xuICAgICAgaWYgKGNoaWxkICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY2hpbGQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChjaGlsZCBpbnN0YW5jZW9mIE5vZGUpIHtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhjaGlsZCkpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICAvLyBIYW5kbGUgY29tcG9uZW50IGZ1bmN0aW9uc1xuICBpZiAodHlwZW9mIHRhZyA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc3QgYWxsUHJvcHMgPSBwcm9wcyB8fCB7fTtcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgYWxsUHJvcHMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICB9XG4gICAgcmV0dXJuIHRhZyhhbGxQcm9wcyk7XG4gIH1cblxuICAvLyBGYWxsYmFjayB0byBkaXZcbiAgcmV0dXJuIGgoXCJkaXZcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbGF5b3V0IHVzaW5nIEpTWC1saWtlIHN5bnRheFxuICogUHJvdmlkZXMgYSBicmlkZ2UgYmV0d2VlbiBKU1ggYW5kIHRoZSBsYXlvdXQgc3lzdGVtXG4gKlxuICogQHBhcmFtIGpzeEVsZW1lbnQgLSBKU1ggZWxlbWVudCBjcmVhdGVkIHdpdGggaCgpXG4gKiBAcGFyYW0gcGFyZW50RWxlbWVudCAtIFBhcmVudCBlbGVtZW50IHRvIGF0dGFjaCB0b1xuICogQHJldHVybnMgTGF5b3V0IHJlc3VsdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlSnN4TGF5b3V0KFxuICBqc3hFbGVtZW50OiBhbnksXG4gIHBhcmVudEVsZW1lbnQ/OiBhbnlcbik6IExheW91dFJlc3VsdCB7XG4gIC8vIENvbnZlcnQgSlNYIGVsZW1lbnQgdG8gbGF5b3V0IHNjaGVtYVxuICBjb25zdCBzY2hlbWEgPSBqc3hFbGVtZW50O1xuXG4gIC8vIENyZWF0ZSBsYXlvdXQgdXNpbmcgdGhlIHN0YW5kYXJkIGNyZWF0ZUxheW91dCBmdW5jdGlvblxuICByZXR1cm4gY3JlYXRlTGF5b3V0KHNjaGVtYSwgcGFyZW50RWxlbWVudCk7XG59XG5cbi8qKlxuICogVXRpbGl0eSB0byBjcmVhdGUgYSBzaW1wbGUgY29tcG9uZW50IGZyb20gYSBmdW5jdGlvblxuICogVXNlZnVsIGZvciBjcmVhdGluZyByZXVzYWJsZSBKU1ggY29tcG9uZW50c1xuICpcbiAqIEBwYXJhbSBmbiAtIENvbXBvbmVudCBmdW5jdGlvblxuICogQHJldHVybnMgQ29tcG9uZW50IHRoYXQgY2FuIGJlIHVzZWQgaW4gSlNYXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wb25lbnQoZm46IChwcm9wczogUmVjb3JkPHN0cmluZywgYW55PikgPT4gYW55KTogRnVuY3Rpb24ge1xuICByZXR1cm4gZnVuY3Rpb24gKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogYW55IHtcbiAgICByZXR1cm4gZm4ocHJvcHMgfHwge30pO1xuICB9O1xufVxuXG4vKipcbiAqIFV0aWxpdHkgdG8gcmVuZGVyIG11bHRpcGxlIEpTWCBlbGVtZW50c1xuICogVXNlZnVsIGZvciBjcmVhdGluZyBsaXN0cyBvciBjb2xsZWN0aW9uc1xuICpcbiAqIEBwYXJhbSBlbGVtZW50cyAtIEFycmF5IG9mIEpTWCBlbGVtZW50c1xuICogQHBhcmFtIHBhcmVudEVsZW1lbnQgLSBQYXJlbnQgZWxlbWVudCB0byBhdHRhY2ggdG9cbiAqIEByZXR1cm5zIEFycmF5IG9mIGxheW91dCByZXN1bHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJFbGVtZW50cyhcbiAgZWxlbWVudHM6IGFueVtdLFxuICBwYXJlbnRFbGVtZW50PzogYW55XG4pOiBMYXlvdXRSZXN1bHRbXSB7XG4gIHJldHVybiBlbGVtZW50cy5tYXAoKGVsZW1lbnQpID0+IGNyZWF0ZUpzeExheW91dChlbGVtZW50LCBwYXJlbnRFbGVtZW50KSk7XG59XG5cbi8qKlxuICogQ29tbW9uIEpTWCBlbGVtZW50IGNyZWF0b3JzIGZvciBjb252ZW5pZW5jZVxuICovXG5leHBvcnQgY29uc3QganN4ID0ge1xuICBkaXY6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiZGl2XCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHNwYW46IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwic3BhblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBwOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcInBcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgYnV0dG9uOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImJ1dHRvblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBpbnB1dDogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PikgPT4gaChcImlucHV0XCIsIHByb3BzKSxcbiAgaW1nOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiBoKFwiaW1nXCIsIHByb3BzKSxcbiAgYTogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJhXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHVsOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcInVsXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGxpOiAocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LCAuLi5jaGlsZHJlbjogYW55W10pID0+XG4gICAgaChcImxpXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIHNlY3Rpb246IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwic2VjdGlvblwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxuICBoZWFkZXI6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiaGVhZGVyXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGZvb3RlcjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJmb290ZXJcIiwgcHJvcHMsIC4uLmNoaWxkcmVuKSxcbiAgbWFpbjogKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PiwgLi4uY2hpbGRyZW46IGFueVtdKSA9PlxuICAgIGgoXCJtYWluXCIsIHByb3BzLCAuLi5jaGlsZHJlbiksXG4gIGFydGljbGU6IChwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sIC4uLmNoaWxkcmVuOiBhbnlbXSkgPT5cbiAgICBoKFwiYXJ0aWNsZVwiLCBwcm9wcywgLi4uY2hpbGRyZW4pLFxufTtcbiIsCiAgICAiLyoqXG4gKiBWaWV3cG9ydCAtIENvcmUgdmlydHVhbCBzY3JvbGxpbmcgZW5naW5lXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBWaWV3cG9ydENvbmZpZyxcbiAgVmlld3BvcnRDb250ZXh0LFxuICBWaWV3cG9ydENvbXBvbmVudCxcbiAgSXRlbVJhbmdlLFxuICBWaWV3cG9ydEluZm8sXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBwaXBlIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IHdpdGhCYXNlIH0gZnJvbSBcIi4vZmVhdHVyZXMvYmFzZVwiO1xuaW1wb3J0IHsgd2l0aFZpcnR1YWwgfSBmcm9tIFwiLi9mZWF0dXJlcy92aXJ0dWFsXCI7XG5pbXBvcnQgeyB3aXRoU2Nyb2xsaW5nIH0gZnJvbSBcIi4vZmVhdHVyZXMvc2Nyb2xsaW5nXCI7XG5pbXBvcnQgeyB3aXRoTW9tZW50dW0gfSBmcm9tIFwiLi9mZWF0dXJlcy9tb21lbnR1bVwiO1xuaW1wb3J0IHsgd2l0aFNjcm9sbGJhciB9IGZyb20gXCIuL2ZlYXR1cmVzL3Njcm9sbGJhclwiO1xuaW1wb3J0IHsgd2l0aENvbGxlY3Rpb24gfSBmcm9tIFwiLi9mZWF0dXJlcy9jb2xsZWN0aW9uXCI7XG5pbXBvcnQgeyB3aXRoUGxhY2Vob2xkZXJzIH0gZnJvbSBcIi4vZmVhdHVyZXMvcGxhY2Vob2xkZXJzXCI7XG5pbXBvcnQgeyB3aXRoUmVuZGVyaW5nIH0gZnJvbSBcIi4vZmVhdHVyZXMvcmVuZGVyaW5nXCI7XG5pbXBvcnQgeyB3aXRoRXZlbnRzIH0gZnJvbSBcIi4vZmVhdHVyZXMvZXZlbnRzXCI7XG5cbi8vIEludGVybmFsIHZpZXdwb3J0IHN0YXRlXG5pbnRlcmZhY2UgVmlld3BvcnRTdGF0ZSB7XG4gIHNjcm9sbFBvc2l0aW9uOiBudW1iZXI7XG4gIHRvdGFsSXRlbXM6IG51bWJlcjtcbiAgaXRlbVNpemU6IG51bWJlcjtcbiAgY29udGFpbmVyU2l6ZTogbnVtYmVyO1xuICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXI7XG4gIHZpc2libGVSYW5nZTogSXRlbVJhbmdlO1xuICBpdGVtc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsO1xuICB2ZWxvY2l0eTogbnVtYmVyO1xuICBzY3JvbGxEaXJlY3Rpb246IFwiZm9yd2FyZFwiIHwgXCJiYWNrd2FyZFwiO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB2aWV3cG9ydC1lbmhhbmNlZCBjb21wb25lbnQgdXNpbmcgY29tcG9zaXRpb25cbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gVmlld3BvcnQgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgRnVuY3Rpb24gdGhhdCBlbmhhbmNlcyBhIGNvbXBvbmVudCB3aXRoIHZpZXdwb3J0IGNhcGFiaWxpdGllc1xuICovXG5leHBvcnQgY29uc3QgY3JlYXRlVmlld3BvcnQgPSAoY29uZmlnOiBWaWV3cG9ydENvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dD4oY29tcG9uZW50OiBUKTogVCAmIFZpZXdwb3J0Q29tcG9uZW50ID0+IHtcbiAgICAvLyBUcmFjayBpZiB2aWV3cG9ydCBoYXMgYmVlbiBpbml0aWFsaXplZCB0byBwcmV2ZW50IG11bHRpcGxlIGluaXRpYWxpemF0aW9uc1xuICAgIGxldCBpc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICAvLyBObyBub3JtYWxpemF0aW9uIG5lZWRlZCAtIHdlJ2xsIHVzZSB0aGUgbmVzdGVkIHN0cnVjdHVyZSBkaXJlY3RseVxuXG4gICAgLy8gQ3JlYXRlIHNoYXJlZCB2aWV3cG9ydCBzdGF0ZVxuICAgIGNvbnN0IHN0YXRlOiBWaWV3cG9ydFN0YXRlID0ge1xuICAgICAgc2Nyb2xsUG9zaXRpb246IDAsXG4gICAgICB0b3RhbEl0ZW1zOiBjb21wb25lbnQudG90YWxJdGVtcyB8fCAwLFxuICAgICAgaXRlbVNpemU6IGNvbmZpZy52aXJ0dWFsPy5pdGVtU2l6ZSB8fCA1MCxcbiAgICAgIGNvbnRhaW5lclNpemU6IDAsXG4gICAgICB2aXJ0dWFsVG90YWxTaXplOiAwLFxuICAgICAgdmlzaWJsZVJhbmdlOiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfSxcbiAgICAgIGl0ZW1zQ29udGFpbmVyOiBudWxsLFxuICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICBzY3JvbGxEaXJlY3Rpb246IFwiZm9yd2FyZFwiLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYmFzZSB2aWV3cG9ydCBBUElcbiAgICBjb25zdCB2aWV3cG9ydEFQSSA9IHtcbiAgICAgIC8vIENvcmUgQVBJXG4gICAgICBpbml0aWFsaXplOiAoKSA9PiB7XG4gICAgICAgIC8vIFByZXZlbnQgbXVsdGlwbGUgaW5pdGlhbGl6YXRpb25zXG4gICAgICAgIGlmIChpc0luaXRpYWxpemVkKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1ZpZXdwb3J0XSBJbml0aWFsaXppbmcgd2l0aCBzdGF0ZTpcIiwge1xuICAgICAgICAvLyAgIGVsZW1lbnQ6ICEhY29tcG9uZW50LmVsZW1lbnQsXG4gICAgICAgIC8vICAgdG90YWxJdGVtczogY29tcG9uZW50LnRvdGFsSXRlbXMsXG4gICAgICAgIC8vICAgaXRlbVNpemU6IGNvbmZpZy52aXJ0dWFsPy5pdGVtU2l6ZSxcbiAgICAgICAgLy8gfSk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBjb250YWluZXIgc2l6ZVxuICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICBzdGF0ZS5jb250YWluZXJTaXplID1cbiAgICAgICAgICAgIGNvbmZpZy5zY3JvbGxpbmc/Lm9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIlxuICAgICAgICAgICAgICA/IGNvbXBvbmVudC5lbGVtZW50Lm9mZnNldFdpZHRoXG4gICAgICAgICAgICAgIDogY29tcG9uZW50LmVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXCJbVmlld3BvcnRdIENvbnRhaW5lciBzaXplOlwiLCBzdGF0ZS5jb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBpbml0aWFsIHZpcnR1YWwgc2l6ZVxuICAgICAgICBzdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gc3RhdGUudG90YWxJdGVtcyAqIHN0YXRlLml0ZW1TaXplO1xuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBpbml0aWFsIHZpc2libGUgcmFuZ2VcbiAgICAgICAgc3RhdGUudmlzaWJsZVJhbmdlID0gY2FsY3VsYXRlVmlzaWJsZVJhbmdlKHN0YXRlLnNjcm9sbFBvc2l0aW9uKTtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydF0gSW5pdGlhbCBzdGF0ZTpcIiwge1xuICAgICAgICAvLyAgIGNvbnRhaW5lclNpemU6IHN0YXRlLmNvbnRhaW5lclNpemUsXG4gICAgICAgIC8vICAgdmlydHVhbFRvdGFsU2l6ZTogc3RhdGUudmlydHVhbFRvdGFsU2l6ZSxcbiAgICAgICAgLy8gICB2aXNpYmxlUmFuZ2U6IHN0YXRlLnZpc2libGVSYW5nZSxcbiAgICAgICAgLy8gfSk7XG4gICAgICB9LFxuXG4gICAgICBkZXN0cm95OiAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFudXAgd2lsbCBiZSBoYW5kbGVkIGJ5IGZlYXR1cmVzXG4gICAgICB9LFxuXG4gICAgICB1cGRhdGVWaWV3cG9ydDogKCkgPT4ge1xuICAgICAgICAvLyBXaWxsIGJlIGltcGxlbWVudGVkIGJ5IHJlbmRlcmluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICAvLyBDaGVjayBpZiBhbHJlYWR5IGluaXRpYWxpemVkXG4gICAgICBpc0luaXRpYWxpemVkOiAoKSA9PiBpc0luaXRpYWxpemVkLFxuXG4gICAgICAvLyBSZXNldCBpbml0aWFsaXphdGlvbiBzdGF0ZSAoZm9yIHJlbG9hZCBmdW5jdGlvbmFsaXR5KVxuICAgICAgcmVzZXRJbml0aWFsaXphdGlvbjogKCkgPT4ge1xuICAgICAgICBpc0luaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvLyBBbGxvdyBmZWF0dXJlcyB0byBjaGVjayBpZiBpbml0IHNob3VsZCBwcm9jZWVkXG4gICAgICBfc2hvdWxkSW5pdDogKCkgPT4gIWlzSW5pdGlhbGl6ZWQsXG5cbiAgICAgIC8vIFNjcm9sbGluZyBBUEkgKHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBzY3JvbGxpbmcgZmVhdHVyZSlcbiAgICAgIHNjcm9sbFRvSW5kZXg6IChcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50PzogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIsXG4gICAgICApID0+IHtcbiAgICAgICAgLy8gUGxhY2Vob2xkZXIgLSB3aWxsIGJlIGltcGxlbWVudGVkIGJ5IHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uOiAocG9zaXRpb246IG51bWJlcikgPT4ge1xuICAgICAgICAvLyBXaWxsIGJlIGltcGxlbWVudGVkIGJ5IHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICB9LFxuXG4gICAgICBnZXRTY3JvbGxQb3NpdGlvbjogKCkgPT4gc3RhdGUuc2Nyb2xsUG9zaXRpb24sXG5cbiAgICAgIC8vIEluZm8gQVBJXG4gICAgICBnZXRWaXNpYmxlUmFuZ2U6ICgpID0+IHN0YXRlLnZpc2libGVSYW5nZSxcblxuICAgICAgZ2V0Vmlld3BvcnRJbmZvOiAoKTogVmlld3BvcnRJbmZvID0+ICh7XG4gICAgICAgIGNvbnRhaW5lclNpemU6IHN0YXRlLmNvbnRhaW5lclNpemUsXG4gICAgICAgIHRvdGFsVmlydHVhbFNpemU6IHN0YXRlLnZpcnR1YWxUb3RhbFNpemUsXG4gICAgICAgIHZpc2libGVSYW5nZTogc3RhdGUudmlzaWJsZVJhbmdlLFxuICAgICAgICB2aXJ0dWFsU2Nyb2xsUG9zaXRpb246IHN0YXRlLnNjcm9sbFBvc2l0aW9uLFxuICAgICAgfSksXG5cbiAgICAgIC8vIFJlbmRlcmluZyBBUElcbiAgICAgIHJlbmRlckl0ZW1zOiAoKSA9PiB7XG4gICAgICAgIC8vIFdpbGwgYmUgaW1wbGVtZW50ZWQgYnkgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICAgIH0sXG5cbiAgICAgIC8vIEludGVybmFsIHN0YXRlIChmb3IgZmVhdHVyZXMgdG8gYWNjZXNzKVxuICAgICAgc3RhdGUsXG4gICAgfTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdmlzaWJsZSByYW5nZVxuICAgIGNvbnN0IGNhbGN1bGF0ZVZpc2libGVSYW5nZSA9IChzY3JvbGxQb3M6IG51bWJlcik6IEl0ZW1SYW5nZSA9PiB7XG4gICAgICBjb25zdCBpdGVtU2l6ZSA9IHN0YXRlLml0ZW1TaXplO1xuICAgICAgY29uc3Qgc3RhcnQgPSBNYXRoLmZsb29yKHNjcm9sbFBvcyAvIGl0ZW1TaXplKTtcbiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChzdGF0ZS5jb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oc3RhcnQgKyB2aXNpYmxlQ291bnQsIHN0YXRlLnRvdGFsSXRlbXMgLSAxKTtcblxuICAgICAgcmV0dXJuIHsgc3RhcnQ6IE1hdGgubWF4KDAsIHN0YXJ0KSwgZW5kOiBNYXRoLm1heCgwLCBlbmQpIH07XG4gICAgfTtcblxuICAgIC8vIEFkZCB2aWV3cG9ydCBBUEkgdG8gY29tcG9uZW50XG4gICAgY29uc3QgYmFzZUNvbXBvbmVudCA9IHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHZpZXdwb3J0OiB2aWV3cG9ydEFQSSxcbiAgICB9O1xuXG4gICAgLy8gQnVpbGQgdGhlIGVuaGFuY2VtZW50IHBpcGVsaW5lXG4gICAgY29uc3QgZW5oYW5jZXJzOiBBcnJheTwoYzogYW55KSA9PiBhbnk+ID0gW107XG5cbiAgICAvLyBFdmVudHMgc3lzdGVtIChhbHdheXMgZmlyc3QgLSBwcm92aWRlcyBjb21tdW5pY2F0aW9uIGZvciBvdGhlciBmZWF0dXJlcylcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhFdmVudHMoe1xuICAgICAgICBkZWJ1ZzogY29uZmlnLmRlYnVnLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIEJhc2Ugc2V0dXAgKGNyZWF0ZXMgRE9NIHN0cnVjdHVyZSlcbiAgICBlbmhhbmNlcnMucHVzaChcbiAgICAgIHdpdGhCYXNlKHtcbiAgICAgICAgY2xhc3NOYW1lOiBjb25maWcuY2xhc3NOYW1lLFxuICAgICAgICBvcmllbnRhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24sXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy8gVmlydHVhbCBzY3JvbGxpbmcgKHJlcXVpcmVkIGZvciBtb3N0IGZlYXR1cmVzKVxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aFZpcnR1YWwoe1xuICAgICAgICBpdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/Lml0ZW1TaXplLFxuICAgICAgICBvdmVyc2NhbjogY29uZmlnLnZpcnR1YWw/Lm92ZXJzY2FuLFxuICAgICAgICBvcmllbnRhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ub3JpZW50YXRpb24sXG4gICAgICAgIGF1dG9EZXRlY3RJdGVtU2l6ZTogY29uZmlnLnZpcnR1YWw/LmF1dG9EZXRlY3RJdGVtU2l6ZSxcbiAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4OiAoY29uZmlnIGFzIGFueSkuaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIFNjcm9sbGluZyBiZWhhdmlvclxuICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgd2l0aFNjcm9sbGluZyh7XG4gICAgICAgIG9yaWVudGF0aW9uOiBjb25maWcuc2Nyb2xsaW5nPy5vcmllbnRhdGlvbixcbiAgICAgICAgc2Vuc2l0aXZpdHk6IGNvbmZpZy5zY3JvbGxpbmc/LnNlbnNpdGl2aXR5LFxuICAgICAgICBzbW9vdGhpbmc6IGNvbmZpZy5zY3JvbGxpbmc/LmFuaW1hdGlvbixcbiAgICAgICAgc3RvcE9uQ2xpY2s6IGNvbmZpZy5zY3JvbGxpbmc/LnN0b3BPbkNsaWNrLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIC8vIE1vbWVudHVtIHNjcm9sbGluZyAodG91Y2gvZHJhZyBzdXBwb3J0IGZvciBtb2JpbGUpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoTW9tZW50dW0oe1xuICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICBzdG9wT25DbGljazogY29uZmlnLnNjcm9sbGluZz8uc3RvcE9uQ2xpY2ssXG4gICAgICAgIGRlY2VsZXJhdGlvbjogY29uZmlnLnNjcm9sbGluZz8ubW9tZW50dW0/LmRlY2VsZXJhdGlvbixcbiAgICAgICAgbWluVmVsb2NpdHk6IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy5taW5WZWxvY2l0eSxcbiAgICAgICAgbWluRHVyYXRpb246IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy5tYXhEdXJhdGlvbixcbiAgICAgICAgbWluVmVsb2NpdHlUaHJlc2hvbGQ6IGNvbmZpZy5zY3JvbGxpbmc/Lm1vbWVudHVtPy52ZWxvY2l0eVRocmVzaG9sZCxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBTY3JvbGxiYXIgKG9wdGlvbmFsKVxuICAgIGlmIChjb25maWcuc2Nyb2xsYmFyPy5lbmFibGVkICE9PSBmYWxzZSkge1xuICAgICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICAgIHdpdGhTY3JvbGxiYXIoe1xuICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgYXV0b0hpZGU6IGNvbmZpZy5zY3JvbGxiYXI/LmF1dG9IaWRlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGNvbGxlY3Rpb24gaWYgY29uZmlndXJlZFxuICAgIGlmIChjb25maWcuY29sbGVjdGlvbj8uYWRhcHRlcikge1xuICAgICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICAgIHdpdGhDb2xsZWN0aW9uKHtcbiAgICAgICAgICBjb2xsZWN0aW9uOiBjb25maWcuY29sbGVjdGlvbi5hZGFwdGVyLFxuICAgICAgICAgIHJhbmdlU2l6ZTogY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0LFxuICAgICAgICAgIHN0cmF0ZWd5OiBjb25maWcucGFnaW5hdGlvbj8uc3RyYXRlZ3kgYXNcbiAgICAgICAgICAgIHwgXCJvZmZzZXRcIlxuICAgICAgICAgICAgfCBcInBhZ2VcIlxuICAgICAgICAgICAgfCBcImN1cnNvclwiXG4gICAgICAgICAgICB8IHVuZGVmaW5lZCxcbiAgICAgICAgICB0cmFuc2Zvcm06IGNvbmZpZy5jb2xsZWN0aW9uPy50cmFuc2Zvcm0sXG4gICAgICAgICAgY2FuY2VsTG9hZFRocmVzaG9sZDogY29uZmlnLnBlcmZvcm1hbmNlPy5jYW5jZWxMb2FkVGhyZXNob2xkLFxuICAgICAgICAgIG1heENvbmN1cnJlbnRSZXF1ZXN0czogY29uZmlnLnBlcmZvcm1hbmNlPy5tYXhDb25jdXJyZW50UmVxdWVzdHMsXG4gICAgICAgICAgZW5hYmxlUmVxdWVzdFF1ZXVlOiBjb25maWcucGVyZm9ybWFuY2U/LmVuYWJsZVJlcXVlc3RRdWV1ZSAhPT0gZmFsc2UsXG4gICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4OiAoY29uZmlnIGFzIGFueSkuaW5pdGlhbFNjcm9sbEluZGV4LFxuICAgICAgICAgIHNlbGVjdElkOiAoY29uZmlnIGFzIGFueSkuc2VsZWN0SWQsXG4gICAgICAgICAgYXV0b0xvYWQ6IChjb25maWcgYXMgYW55KS5hdXRvTG9hZCAhPT0gZmFsc2UsXG4gICAgICAgICAgYXV0b1NlbGVjdEZpcnN0OiAoY29uZmlnIGFzIGFueSkuYXV0b1NlbGVjdEZpcnN0LFxuICAgICAgICAgIG1heENhY2hlZEl0ZW1zOiBjb25maWcuY2FjaGU/Lm1heEl0ZW1zLFxuICAgICAgICAgIGV2aWN0aW9uQnVmZmVyOiBjb25maWcuY2FjaGU/LmV2aWN0aW9uQnVmZmVyLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUGxhY2Vob2xkZXJzIChvcHRpb25hbCwgcmVxdWlyZXMgY29sbGVjdGlvbilcbiAgICBpZiAoY29uZmlnLmNvbGxlY3Rpb24/LmFkYXB0ZXIgJiYgY29uZmlnLnBsYWNlaG9sZGVycz8uZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKFxuICAgICAgICB3aXRoUGxhY2Vob2xkZXJzKHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGFuYWx5emVGaXJzdExvYWQ6IGNvbmZpZy5wbGFjZWhvbGRlcnM/LmFuYWx5emVGaXJzdExvYWQgPz8gdHJ1ZSxcbiAgICAgICAgICBtYXNrQ2hhcmFjdGVyOiBjb25maWcucGxhY2Vob2xkZXJzPy5tYXNrQ2hhcmFjdGVyLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyaW5nIChhbHdheXMgbGFzdCB0byBoYXZlIGFjY2VzcyB0byBhbGwgZmVhdHVyZXMpXG4gICAgZW5oYW5jZXJzLnB1c2goXG4gICAgICB3aXRoUmVuZGVyaW5nKHtcbiAgICAgICAgdGVtcGxhdGU6IGNvbmZpZy50ZW1wbGF0ZSxcbiAgICAgICAgb3ZlcnNjYW46IGNvbmZpZy52aXJ0dWFsPy5vdmVyc2NhbixcbiAgICAgICAgbWFpbnRhaW5Eb21PcmRlcjogY29uZmlnLnJlbmRlcmluZz8ubWFpbnRhaW5Eb21PcmRlcixcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvLyBDb21wb3NlIGFsbCBlbmhhbmNlcnNcbiAgICBjb25zdCBlbmhhbmNlID0gcGlwZSguLi5lbmhhbmNlcnMpO1xuXG4gICAgLy8gQXBwbHkgZW5oYW5jZW1lbnRzXG4gICAgY29uc3QgZW5oYW5jZWQgPSBlbmhhbmNlKGJhc2VDb21wb25lbnQpO1xuXG4gICAgLy8gQXV0by1pbml0aWFsaXplIGlmIGVsZW1lbnQgaXMgcHJvdmlkZWRcbiAgICBpZiAoZW5oYW5jZWQuZWxlbWVudCkge1xuICAgICAgZW5oYW5jZWQudmlld3BvcnQuaW5pdGlhbGl6ZSgpO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlZCBhcyBUICYgVmlld3BvcnRDb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy91dGlscy50c1xuXG4vKipcbiAqIFNoYXJlZCB1dGlsaXRpZXMgZm9yIHZpZXdwb3J0IGZlYXR1cmVzXG4gKiBFbGltaW5hdGVzIGNvZGUgZHVwbGljYXRpb24gYWNyb3NzIGZlYXR1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8qKlxuICogV3JhcHMgdmlld3BvcnQgaW5pdGlhbGl6YXRpb24gd2l0aCBmZWF0dXJlLXNwZWNpZmljIGxvZ2ljXG4gKiBFbGltaW5hdGVzIHRoZSByZXBlYXRlZCBpbml0aWFsaXphdGlvbiBob29rIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBJbml0aWFsaXplPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBWaWV3cG9ydENvbXBvbmVudD4oXG4gIGNvbXBvbmVudDogVCxcbiAgZmVhdHVyZUluaXQ6ICgpID0+IHZvaWQsXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplID0gKCkgPT4ge1xuICAgIC8vIENoZWNrIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWQgKHJldHVybnMgZmFsc2UgaWYgYWxyZWFkeSBkb25lKVxuICAgIGNvbnN0IHJlc3VsdCA9IG9yaWdpbmFsSW5pdGlhbGl6ZSgpO1xuICAgIC8vIE9ubHkgcnVuIGZlYXR1cmUgaW5pdCBpZiBiYXNlIGluaXQgYWN0dWFsbHkgcmFuIChkaWRuJ3QgcmV0dXJuIGZhbHNlKVxuICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSB7XG4gICAgICBmZWF0dXJlSW5pdCgpO1xuICAgIH1cbiAgICAvLyBQcm9wYWdhdGUgdGhlIHJlc3VsdCB0aHJvdWdoIHRoZSBjaGFpbiBzbyBvdXRlciB3cmFwcGVycyBrbm93IHRvIHNraXBcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufVxuXG4vKipcbiAqIFdyYXBzIGNvbXBvbmVudCBkZXN0cm95IHdpdGggY2xlYW51cCBsb2dpY1xuICogRWxpbWluYXRlcyB0aGUgcmVwZWF0ZWQgZGVzdHJveSBob29rIHBhdHRlcm5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdyYXBEZXN0cm95PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgY29tcG9uZW50OiBULFxuICBjbGVhbnVwOiAoKSA9PiB2b2lkLFxuKTogdm9pZCB7XG4gIGlmIChcImRlc3Ryb3lcIiBpbiBjb21wb25lbnQgJiYgdHlwZW9mIGNvbXBvbmVudC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAoY29tcG9uZW50IGFzIGFueSkuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGNsZWFudXAoKTtcbiAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEdldHMgdmlld3BvcnQgc3RhdGUgd2l0aCBwcm9wZXIgdHlwaW5nXG4gKiBFbGltaW5hdGVzIHJlcGVhdGVkIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Vmlld3BvcnRTdGF0ZShjb21wb25lbnQ6IFZpZXdwb3J0Q29tcG9uZW50KTogYW55IHtcbiAgcmV0dXJuIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zdGF0ZTtcbn1cblxuLyoqXG4gKiBDaGVja3MgaWYgYW4gaXRlbSBpcyBhIHBsYWNlaG9sZGVyXG4gKiBFbGltaW5hdGVzIGR1cGxpY2F0ZWQgcGxhY2Vob2xkZXIgZGV0ZWN0aW9uIGxvZ2ljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1BsYWNlaG9sZGVyKGl0ZW06IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGl0ZW0gJiZcbiAgICB0eXBlb2YgaXRlbSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIChpdGVtLl9wbGFjZWhvbGRlciA9PT0gdHJ1ZSB8fCBpdGVtW1wiX3BsYWNlaG9sZGVyXCJdID09PSB0cnVlKSAvLyBTdXBwb3J0IGJvdGggYWNjZXNzIHBhdHRlcm5zXG4gICk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIHJhbmdlIGtleSBmb3IgZGVkdXBsaWNhdGlvblxuICogVXNlZCBieSBtdWx0aXBsZSBmZWF0dXJlcyBmb3IgdHJhY2tpbmcgcmFuZ2VzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYW5nZUtleShyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3JhbmdlLnN0YXJ0fS0ke3JhbmdlLmVuZH1gO1xufVxuXG4vKipcbiAqIENsYW1wcyBhIHZhbHVlIGJldHdlZW4gbWluIGFuZCBtYXhcbiAqIFVzZWQgYnkgbXVsdGlwbGUgZmVhdHVyZXMgZm9yIGJvdW5kYXJ5IGNoZWNraW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcCh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbihtYXgsIHZhbHVlKSk7XG59XG5cbi8qKlxuICogU3RvcmVzIGEgZnVuY3Rpb24gcmVmZXJlbmNlIG9uIHRoZSBjb21wb25lbnQgZm9yIGxhdGVyIGFjY2Vzc1xuICogRWxpbWluYXRlcyBwYXR0ZXJuIGxpa2UgKGNvbXBvbmVudCBhcyBhbnkpLl9mZWF0dXJlRnVuY3Rpb24gPSBmblxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RvcmVGZWF0dXJlRnVuY3Rpb248VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBjb21wb25lbnQ6IFQsXG4gIG5hbWU6IHN0cmluZyxcbiAgZm46IEZ1bmN0aW9uLFxuKTogdm9pZCB7XG4gIChjb21wb25lbnQgYXMgYW55KVtuYW1lXSA9IGZuO1xufVxuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9iYXNlLnRzXG5cbi8qKlxuICogQmFzZSBWaWV3cG9ydCBGZWF0dXJlIC0gU2V0cyB1cCBjb3JlIHZpZXdwb3J0IHN0cnVjdHVyZVxuICogUHJvdmlkZXMgdGhlIGZvdW5kYXRpb24gZm9yIG90aGVyIHZpZXdwb3J0IGZlYXR1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbnRleHQsIFZpZXdwb3J0Q29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyB3cmFwSW5pdGlhbGl6ZSwgZ2V0Vmlld3BvcnRTdGF0ZSB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQmFzZUNvbmZpZyB7XG4gIGNsYXNzTmFtZT86IHN0cmluZztcbiAgb3JpZW50YXRpb24/OiBcInZlcnRpY2FsXCIgfCBcImhvcml6b250YWxcIjtcbn1cblxuLyoqXG4gKiBCYXNlIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBTZXRzIHVwIHRoZSBET00gc3RydWN0dXJlIGFuZCBjb3JlIHN0eWxlc1xuICovXG5leHBvcnQgY29uc3Qgd2l0aEJhc2UgPSAoY29uZmlnOiBCYXNlQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHsgY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0XCIsIG9yaWVudGF0aW9uID0gXCJ2ZXJ0aWNhbFwiIH0gPSBjb25maWc7XG5cbiAgICAvLyBVc2UgdGhlIHNoYXJlZCB3cmFwcGVyIHV0aWxpdHlcbiAgICB3cmFwSW5pdGlhbGl6ZShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICAvLyBDcmVhdGUgdmlld3BvcnQgc3RydWN0dXJlXG4gICAgICBsZXQgdmlld3BvcnRFbGVtZW50ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBcIi5tdHJsLXZpZXdwb3J0XCJcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5jbGFzc05hbWUgPSBjbGFzc05hbWU7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgYDtcblxuICAgICAgICAvLyBTZXQgb3JpZW50YXRpb25cbiAgICAgICAgdmlld3BvcnRFbGVtZW50LnNldEF0dHJpYnV0ZShcImRhdGEtb3JpZW50YXRpb25cIiwgb3JpZW50YXRpb24pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBpdGVtcyBjb250YWluZXJcbiAgICAgICAgY29uc3QgaXRlbXNDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICBpdGVtc0NvbnRhaW5lci5jbGFzc05hbWUgPSBcIm10cmwtdmlld3BvcnQtaXRlbXNcIjtcbiAgICAgICAgaXRlbXNDb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGA7XG5cbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFwcGVuZENoaWxkKGl0ZW1zQ29udGFpbmVyKTtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh2aWV3cG9ydEVsZW1lbnQpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZSB3aXRoIGNvbnRhaW5lcnMgdXNpbmcgdXRpbGl0eVxuICAgICAgICBjb25zdCBzdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcbiAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgc3RhdGUudmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAgIHN0YXRlLml0ZW1zQ29udGFpbmVyID0gaXRlbXNDb250YWluZXI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2VzIG9uIGNvbXBvbmVudFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50ID0gdmlld3BvcnRFbGVtZW50O1xuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuaXRlbXNDb250YWluZXIgPSBpdGVtc0NvbnRhaW5lcjtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9jb25zdGFudHMudHNcblxuLyoqXG4gKiBWaWV3cG9ydCBDb25zdGFudHNcbiAqIENlbnRyYWxpemVkIGNvbnN0YW50cyBmb3IgYWxsIHZpZXdwb3J0IGZ1bmN0aW9uYWxpdHlcbiAqIENvbnNvbGlkYXRlZCBmcm9tIHZpZXdwb3J0LCB2aWV3cG9ydC9mZWF0dXJlcywgYW5kIGxpc3QtbWFuYWdlciBjb25zdGFudHNcbiAqL1xuXG5leHBvcnQgY29uc3QgVklFV1BPUlRfQ09OU1RBTlRTID0ge1xuICAvLyBWaXJ0dWFsIHNjcm9sbGluZyBkZWZhdWx0c1xuICBWSVJUVUFMX1NDUk9MTDoge1xuICAgIERFRkFVTFRfSVRFTV9TSVpFOiA0OCxcbiAgICBPVkVSU0NBTl9CVUZGRVI6IDIsXG4gICAgU0NST0xMX1NFTlNJVElWSVRZOiAwLjcsXG4gICAgTUFYX1ZJUlRVQUxfU0laRTogMTAwICogMTAwMCAqIDEwMDAsIC8vIDEwME0gcGl4ZWxzIC0gbW9kZXJuIGJyb3dzZXJzIGNhbiBoYW5kbGUgdGhpc1xuICAgIEFVVE9fREVURUNUX0lURU1fU0laRTogdHJ1ZSwgLy8gRW5hYmxlIGF1dG9tYXRpYyBpdGVtIHNpemUgZGV0ZWN0aW9uXG4gIH0sXG5cbiAgLy8gU2Nyb2xsaW5nIHNldHRpbmdzXG4gIFNDUk9MTElORzoge1xuICAgIE9WRVJTQ0FOOiAxLCAvLyBGcm9tIGZlYXR1cmVzL2NvbnN0YW50c1xuICB9LFxuXG4gIC8vIFJlbmRlcmluZyBzZXR0aW5nc1xuICBSRU5ERVJJTkc6IHtcbiAgICAvLyBFbGVtZW50IHJlY3ljbGluZ1xuICAgIERFRkFVTFRfTUFYX1BPT0xfU0laRTogMTAwLFxuICAgIENMQVNTRVM6IHtcbiAgICAgIElURU06IFwidmlld3BvcnQtaXRlbVwiLFxuICAgIH0sXG4gIH0sXG5cbiAgLy8gTG9hZGluZyBzZXR0aW5nc1xuICBMT0FESU5HOiB7XG4gICAgQ0FOQ0VMX1RIUkVTSE9MRDogMjUsIC8vIHB4L21zIC0gdmVsb2NpdHkgYWJvdmUgd2hpY2ggbG9hZHMgY2FuY2VsXG4gICAgTUFYX0NPTkNVUlJFTlRfUkVRVUVTVFM6IDEsIC8vIFBhcmFsbGVsIHJlcXVlc3RzIGFsbG93ZWRcbiAgICBERUZBVUxUX1JBTkdFX1NJWkU6IDIwLCAvLyBJdGVtcyBwZXIgcmVxdWVzdFxuICAgIERFQk9VTkNFX0xPQURJTkc6IDE1MCwgLy8gRGVib3VuY2UgZGVsYXkgKG1zKVxuICAgIE1JTl9SQU5HRV9TSVpFOiAxMCwgLy8gTWluaW11bSBpdGVtcyBwZXIgbG9hZFxuICAgIE1BWF9SQU5HRV9TSVpFOiAxMDAsIC8vIE1heGltdW0gaXRlbXMgcGVyIGxvYWRcbiAgICBSRVFVRVNUX1RJTUVPVVQ6IDUwMDAsIC8vIFJlcXVlc3QgdGltZW91dCAobXMpXG4gICAgUkVUUllfQVRURU1QVFM6IDIsIC8vIEZhaWxlZCByZXF1ZXN0IHJldHJpZXNcbiAgICBSRVRSWV9ERUxBWTogMTAwMCwgLy8gRGVsYXkgYmV0d2VlbiByZXRyaWVzIChtcylcbiAgfSxcblxuICAvLyBSZXF1ZXN0IHF1ZXVlIGNvbmZpZ3VyYXRpb24gKGZyb20gZmVhdHVyZXMvY29uc3RhbnRzKVxuICBSRVFVRVNUX1FVRVVFOiB7XG4gICAgRU5BQkxFRDogdHJ1ZSwgLy8gRW5hYmxlIHJlcXVlc3QgcXVldWluZ1xuICAgIE1BWF9RVUVVRV9TSVpFOiAxLCAvLyBNYXggcXVldWVkIHJlcXVlc3RzXG4gICAgTUFYX0FDVElWRV9SRVFVRVNUUzogMiwgLy8gTWF4IGNvbmN1cnJlbnQgYWN0aXZlIHJlcXVlc3RzXG4gIH0sXG5cbiAgLy8gUGxhY2Vob2xkZXIgc2V0dGluZ3NcbiAgUExBQ0VIT0xERVI6IHtcbiAgICBNQVNLX0NIQVJBQ1RFUjogXCJYXCIsIC8vIFVwZGF0ZWQgZnJvbSBsaXN0LW1hbmFnZXJcbiAgICBDTEFTUzogXCJ2aWV3cG9ydC1pdGVtLS1wbGFjZWhvbGRlclwiLFxuICAgIE1BWF9TQU1QTEVfU0laRTogMjAsXG4gICAgUExBQ0VIT0xERVJfRkxBRzogXCJfcGxhY2Vob2xkZXJcIixcbiAgICBSQU5ET01fTEVOR1RIX1ZBUklBTkNFOiB0cnVlLFxuICB9LFxuXG4gIC8vIFNwZWVkIHRyYWNraW5nIChmcm9tIGxpc3QtbWFuYWdlcilcbiAgU1BFRURfVFJBQ0tJTkc6IHtcbiAgICAvLyBWZWxvY2l0eSBjYWxjdWxhdGlvblxuICAgIERFQ0VMRVJBVElPTl9GQUNUT1I6IDAuODUsIC8vIHZlbG9jaXR5IGRlY2F5IHBlciBmcmFtZVxuICB9LFxuXG4gIC8vIE1vbWVudHVtIHNldHRpbmdzXG4gIE1PTUVOVFVNOiB7XG4gICAgRU5BQkxFRDogZmFsc2UsIC8vIEVuYWJsZSBtb21lbnR1bSBieSBkZWZhdWx0XG4gICAgREVDRUxFUkFUSU9OX0ZBQ1RPUjogMC45NSwgLy8gSG93IHF1aWNrbHkgdmVsb2NpdHkgZGVjcmVhc2VzIHBlciBmcmFtZSAoaGlnaGVyID0gbG9uZ2VyIGNvYXN0KVxuICAgIE1JTl9WRUxPQ0lUWTogMC4xLCAvLyBNaW5pbXVtIHZlbG9jaXR5IGJlZm9yZSBzdG9wcGluZyAocHgvbXMpXG4gICAgTUlOX0RVUkFUSU9OOiA3NTAsIC8vIE1heGltdW0gZ2VzdHVyZSBkdXJhdGlvbiB0byB0cmlnZ2VyIG1vbWVudHVtIChtcylcbiAgICBNSU5fVkVMT0NJVFlfVEhSRVNIT0xEOiAwLjQsIC8vIE1pbmltdW0gdmVsb2NpdHkgdG8gdHJpZ2dlciBtb21lbnR1bSAocHgvbXMpXG4gICAgRlJBTUVfVElNRTogMTYsIC8vIEFzc3VtZWQgZnJhbWUgdGltZSBmb3IgY2FsY3VsYXRpb25zIChtcylcbiAgfSxcblxuICAvLyBJbml0aWFsIGxvYWQgY29uZmlndXJhdGlvbiAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIElOSVRJQUxfTE9BRDoge1xuICAgIFNUUkFURUdZOiBcInBsYWNlaG9sZGVyc1wiLCAvLyBcInBsYWNlaG9sZGVyc1wiIHwgXCJkaXJlY3RcIiB8IFwicHJvZ3Jlc3NpdmVcIlxuICAgIFZJRVdQT1JUX01VTFRJUExJRVI6IDEuNSwgLy8gbG9hZCAxLjV4IHZpZXdwb3J0IGNhcGFjaXR5XG4gICAgTUlOX0lURU1TOiAxMCxcbiAgICBNQVhfSVRFTVM6IDEwMCxcbiAgICBQTEFDRUhPTERFUl9DT1VOVDogMjAsIC8vIGRlZmF1bHQgcGxhY2Vob2xkZXIgY291bnRcbiAgICBTSE9XX0xPQURJTkdfU1RBVEU6IHRydWUsXG4gICAgTE9BRElOR19ERUxBWTogMTAwLCAvLyBtcyAtIGRlbGF5IGJlZm9yZSBzaG93aW5nIGxvYWRpbmcgc3RhdGVcbiAgfSxcblxuICAvLyBTZWxlY3Rpb24gc2V0dGluZ3NcbiAgU0VMRUNUSU9OOiB7XG4gICAgU0VMRUNURURfQ0xBU1M6IFwidmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIixcbiAgfSxcblxuICAvLyBTY3JvbGxiYXIgc2V0dGluZ3MgKGZyb20gbGlzdC1tYW5hZ2VyKVxuICBTQ1JPTExCQVI6IHtcbiAgICAvLyBDU1MgY2xhc3Nlc1xuICAgIENMQVNTRVM6IHtcbiAgICAgIFNDUk9MTEJBUjogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyXCIsXG4gICAgICBTQ1JPTExCQVJfVFJBQ0s6IFwidmlld3BvcnRfX3Njcm9sbGJhci10cmFja1wiLFxuICAgICAgU0NST0xMQkFSX1RIVU1COiBcInZpZXdwb3J0X19zY3JvbGxiYXItdGh1bWJcIixcbiAgICAgIFNDUk9MTEJBUl9WSVNJQkxFOiBcInZpZXdwb3J0X19zY3JvbGxiYXItLXZpc2libGVcIixcbiAgICAgIFNDUk9MTEJBUl9EUkFHR0lORzogXCJ2aWV3cG9ydF9fc2Nyb2xsYmFyLS1kcmFnZ2luZ1wiLFxuICAgICAgU0NST0xMQkFSX1RIVU1CX0RSQUdHSU5HOiBcInZpZXdwb3J0X19zY3JvbGxiYXItdGh1bWItLWRyYWdnaW5nXCIsXG4gICAgfSxcbiAgfSxcblxuICAvLyBPcmllbnRhdGlvbiAoZnJvbSBsaXN0LW1hbmFnZXIpXG4gIE9SSUVOVEFUSU9OOiB7XG4gICAgREVGQVVMVF9PUklFTlRBVElPTjogXCJ2ZXJ0aWNhbFwiLFxuICAgIERFRkFVTFRfQ1JPU1NfQVhJU19BTElHTk1FTlQ6IFwic3RyZXRjaFwiLFxuICAgIFJFVkVSU0VfRElSRUNUSU9OOiBmYWxzZSxcbiAgfSxcblxuICBQQUdJTkFUSU9OOiB7XG4gICAgREVGQVVMVF9TVFJBVEVHWTogXCJvZmZzZXRcIiBhcyBcIm9mZnNldFwiIHwgXCJwYWdlXCIgfCBcImN1cnNvclwiLFxuICAgIERFRkFVTFRfTElNSVQ6IDIwLFxuICAgIFNUUkFURUdJRVM6IHtcbiAgICAgIFBBR0U6IFwicGFnZVwiIGFzIGNvbnN0LFxuICAgICAgT0ZGU0VUOiBcIm9mZnNldFwiIGFzIGNvbnN0LFxuICAgICAgQ1VSU09SOiBcImN1cnNvclwiIGFzIGNvbnN0LFxuICAgIH0sXG4gICAgQ1VSU09SX0NMRUFOVVBfSU5URVJWQUw6IDYwMDAwLCAvLyBDbGVhbiB1cCBvbGQgY3Vyc29ycyBldmVyeSBtaW51dGVcbiAgICBNQVhfQ1VSU09SX01BUF9TSVpFOiAxMDAwLCAvLyBNYXhpbXVtIG51bWJlciBvZiBjdXJzb3JzIHRvIGtlZXAgaW4gbWVtb3J5XG4gICAgLy8gQ3Vyc29yLXNwZWNpZmljIHZpcnR1YWwgc2l6aW5nXG4gICAgQ1VSU09SX1NDUk9MTF9NQVJHSU5fTVVMVElQTElFUjogMywgLy8gTXVsdGlwbHkgcmFuZ2VTaXplIGJ5IHRoaXMgZm9yIHNjcm9sbCBtYXJnaW5cbiAgICBDVVJTT1JfTUlOX1ZJUlRVQUxfU0laRV9NVUxUSVBMSUVSOiAzLCAvLyBNaW5pbXVtIHZpcnR1YWwgc2l6ZSBhcyBtdWx0aXBsaWVyIG9mIHJhbmdlU2l6ZVxuICB9LFxufTtcblxuLyoqXG4gKiBUeXBlIGZvciBvdmVycmlkaW5nIGNvbnN0YW50cyBhdCBydW50aW1lXG4gKi9cbmV4cG9ydCB0eXBlIFZpZXdwb3J0Q29uc3RhbnRzID0gdHlwZW9mIFZJRVdQT1JUX0NPTlNUQU5UUztcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdG8gbWVyZ2UgdXNlciBjb25zdGFudHMgd2l0aCBkZWZhdWx0c1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VDb25zdGFudHMoXG4gIHVzZXJDb25zdGFudHM6IFBhcnRpYWw8Vmlld3BvcnRDb25zdGFudHM+ID0ge30sXG4pOiBWaWV3cG9ydENvbnN0YW50cyB7XG4gIHJldHVybiB7XG4gICAgLi4uVklFV1BPUlRfQ09OU1RBTlRTLFxuICAgIC4uLnVzZXJDb25zdGFudHMsXG4gIH07XG59XG4iLAogICAgIi8qKlxuICogVmlydHVhbCBGZWF0dXJlIC0gQ29yZSB2aXJ0dWFsIHNjcm9sbGluZyBjYWxjdWxhdGlvbnNcbiAqIEhhbmRsZXMgdmlzaWJsZSByYW5nZSBjYWxjdWxhdGlvbiBhbmQgdG90YWwgdmlydHVhbCBzaXplIG1hbmFnZW1lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHdyYXBJbml0aWFsaXplLCBnZXRWaWV3cG9ydFN0YXRlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBWaXJ0dWFsQ29uZmlnIHtcbiAgaXRlbVNpemU/OiBudW1iZXI7XG4gIG92ZXJzY2FuPzogbnVtYmVyO1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xuICBhdXRvRGV0ZWN0SXRlbVNpemU/OiBib29sZWFuO1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIGluaXRpYWxTY3JvbGxJbmRleD86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBWaXJ0dWFsIHNjcm9sbGluZyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICogSGFuZGxlcyB2aXNpYmxlIHJhbmdlIGNhbGN1bGF0aW9ucyB3aXRoIGNvbXByZXNzaW9uIGZvciBsYXJnZSBkYXRhc2V0c1xuICovXG5leHBvcnQgY29uc3Qgd2l0aFZpcnR1YWwgPSAoY29uZmlnOiBWaXJ0dWFsQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGl0ZW1TaXplLFxuICAgICAgb3ZlcnNjYW4gPSBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuT1ZFUlNDQU5fQlVGRkVSLFxuICAgICAgb3JpZW50YXRpb24gPSBcInZlcnRpY2FsXCIsXG4gICAgICBhdXRvRGV0ZWN0SXRlbVNpemUgPSBpdGVtU2l6ZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLkFVVE9fREVURUNUX0lURU1fU0laRVxuICAgICAgICA6IGZhbHNlLFxuICAgICAgZGVidWcgPSBmYWxzZSxcbiAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA9IDAsXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFVzZSBwcm92aWRlZCBpdGVtU2l6ZSBvciBkZWZhdWx0LCBidXQgbWFyayBpZiB3ZSBzaG91bGQgYXV0by1kZXRlY3RcbiAgICBjb25zdCBpbml0aWFsSXRlbVNpemUgPVxuICAgICAgaXRlbVNpemUgfHwgVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLkRFRkFVTFRfSVRFTV9TSVpFO1xuXG4gICAgY29uc3QgTUFYX1ZJUlRVQUxfU0laRSA9IFZJRVdQT1JUX0NPTlNUQU5UUy5WSVJUVUFMX1NDUk9MTC5NQVhfVklSVFVBTF9TSVpFO1xuICAgIGxldCB2aWV3cG9ydFN0YXRlOiBhbnk7XG4gICAgbGV0IGhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSA9IGZhbHNlO1xuICAgIGxldCBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiA9IGZhbHNlOyAvLyBUcmFjayBpZiB3ZSd2ZSByZWNhbGN1bGF0ZWQgc2Nyb2xsIHBvc2l0aW9uIGZvciBjb21wcmVzc2lvblxuXG4gICAgLy8gSW5pdGlhbGl6ZSB1c2luZyBzaGFyZWQgd3JhcHBlclxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkgcmV0dXJuO1xuXG4gICAgICBPYmplY3QuYXNzaWduKHZpZXdwb3J0U3RhdGUsIHtcbiAgICAgICAgaXRlbVNpemU6IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgICAgb3ZlcnNjYW4sXG4gICAgICAgIGNvbnRhaW5lclNpemU6XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52aWV3cG9ydEVsZW1lbnQ/LltcbiAgICAgICAgICAgIG9yaWVudGF0aW9uID09PSBcImhvcml6b250YWxcIiA/IFwib2Zmc2V0V2lkdGhcIiA6IFwib2Zmc2V0SGVpZ2h0XCJcbiAgICAgICAgICBdIHx8IDYwMCxcbiAgICAgIH0pO1xuXG4gICAgICB1cGRhdGVUb3RhbFZpcnR1YWxTaXplKHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyk7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbCBzY3JvbGwgaW5kZXgsIGNhbGN1bGF0ZSBpbml0aWFsIHNjcm9sbCBwb3NpdGlvblxuICAgICAgLy8gTm90ZTogV2Ugc3RvcmUgdGhlIGluaXRpYWxTY3JvbGxJbmRleCB0byB1c2UgZGlyZWN0bHkgaW4gcmFuZ2UgY2FsY3VsYXRpb25zXG4gICAgICAvLyBiZWNhdXNlIHNjcm9sbCBwb3NpdGlvbiBtYXkgYmUgY29tcHJlc3NlZCBmb3IgbGFyZ2UgbGlzdHNcbiAgICAgIGxldCBpbml0aWFsU2Nyb2xsUG9zaXRpb24gPSB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDA7XG5cbiAgICAgIGlmIChpbml0aWFsU2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgIC8vIFN0b3JlIHRoZSB0YXJnZXQgaW5kZXggZm9yIHVzZSBpbiByYW5nZSBjYWxjdWxhdGlvbnNcbiAgICAgICAgKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleCA9IGluaXRpYWxTY3JvbGxJbmRleDtcblxuICAgICAgICAvLyBDYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIChtYXkgYmUgY29tcHJlc3NlZCBmb3IgbGFyZ2UgbGlzdHMpXG4gICAgICAgIGluaXRpYWxTY3JvbGxQb3NpdGlvbiA9XG4gICAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ICogKHZpZXdwb3J0U3RhdGUuaXRlbVNpemUgfHwgaW5pdGlhbEl0ZW1TaXplKTtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IGluaXRpYWxTY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgIC8vIFVzZSBzZXRUaW1lb3V0IHRvIGVuc3VyZSBzY3JvbGxpbmcgZmVhdHVyZSBoYXMgaW5pdGlhbGl6ZWRcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBpbml0aWFsU2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICBzb3VyY2U6IFwiaW5pdGlhbC1zY3JvbGwtaW5kZXhcIixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVZpc2libGVSYW5nZShpbml0aWFsU2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAvLyBFbnN1cmUgY29udGFpbmVyIHNpemUgaXMgbWVhc3VyZWQgYWZ0ZXIgRE9NIGlzIHJlYWR5XG4gICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICB1cGRhdGVDb250YWluZXJTaXplKCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEhlbHBlciBmdW5jdGlvbnNcbiAgICBjb25zdCBnZXRDb21wcmVzc2lvblJhdGlvID0gKCk6IG51bWJlciA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGU/LnZpcnR1YWxUb3RhbFNpemUpIHJldHVybiAxO1xuICAgICAgY29uc3QgYWN0dWFsU2l6ZSA9IHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICByZXR1cm4gYWN0dWFsU2l6ZSA8PSBNQVhfVklSVFVBTF9TSVpFID8gMSA6IE1BWF9WSVJUVUFMX1NJWkUgLyBhY3R1YWxTaXplO1xuICAgIH07XG5cbiAgICBjb25zdCBsb2cgPSAobWVzc2FnZTogc3RyaW5nLCBkYXRhPzogYW55KSA9PiB7XG4gICAgICBpZiAoZGVidWcpIGNvbnNvbGUubG9nKGBbVmlydHVhbF0gJHttZXNzYWdlfWAsIGRhdGEpO1xuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgdmlzaWJsZSByYW5nZVxuICAgIGNvbnN0IGNhbGN1bGF0ZVZpc2libGVSYW5nZSA9IChcbiAgICAgIHNjcm9sbFBvc2l0aW9uOiBudW1iZXIsXG4gICAgKTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9ID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbVmlydHVhbF0gTm8gdmlld3BvcnQgc3RhdGUsIHJldHVybmluZyBlbXB0eSByYW5nZVwiKTtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IDAsIGVuZDogMCB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7IGNvbnRhaW5lclNpemUsIHRvdGFsSXRlbXMgfSA9IHZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIEVhcmx5IHJldHVybnMgZm9yIGludmFsaWQgc3RhdGVzXG4gICAgICBpZiAoXG4gICAgICAgICFjb250YWluZXJTaXplIHx8XG4gICAgICAgIGNvbnRhaW5lclNpemUgPD0gMCB8fFxuICAgICAgICAhdG90YWxJdGVtcyB8fFxuICAgICAgICB0b3RhbEl0ZW1zIDw9IDBcbiAgICAgICkge1xuICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGluaXRpYWxTY3JvbGxJbmRleCwgdXNlIGl0IHRvIGNhbGN1bGF0ZSB0aGUgcmFuZ2VcbiAgICAgICAgLy8gZXZlbiB3aGVuIHRvdGFsSXRlbXMgaXMgMCAobm90IHlldCBsb2FkZWQgZnJvbSBBUEkpXG4gICAgICAgIGlmIChpbml0aWFsU2Nyb2xsSW5kZXggPiAwKSB7XG4gICAgICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKFxuICAgICAgICAgICAgKGNvbnRhaW5lclNpemUgfHwgNjAwKSAvXG4gICAgICAgICAgICAgICh2aWV3cG9ydFN0YXRlLml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWF4KDAsIGluaXRpYWxTY3JvbGxJbmRleCAtIG92ZXJzY2FuKTtcbiAgICAgICAgICBjb25zdCBlbmQgPSBpbml0aWFsU2Nyb2xsSW5kZXggKyB2aXNpYmxlQ291bnQgKyBvdmVyc2NhbjtcbiAgICAgICAgICByZXR1cm4geyBzdGFydCwgZW5kIH07XG4gICAgICAgIH1cbiAgICAgICAgbG9nKGBJbnZhbGlkIHN0YXRlOiBjb250YWluZXI9JHtjb250YWluZXJTaXplfSwgaXRlbXM9JHt0b3RhbEl0ZW1zfWApO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZpcnR1YWxTaXplID1cbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplIHx8IHRvdGFsSXRlbXMgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplO1xuICAgICAgY29uc3QgdmlzaWJsZUNvdW50ID0gTWF0aC5jZWlsKGNvbnRhaW5lclNpemUgLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplKTtcbiAgICAgIGNvbnN0IGNvbXByZXNzaW9uUmF0aW8gPSBnZXRDb21wcmVzc2lvblJhdGlvKCk7XG5cbiAgICAgIGxldCBzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlcjtcblxuICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBhIHRhcmdldCBzY3JvbGwgaW5kZXggKGZvciBpbml0aWFsU2Nyb2xsSW5kZXggd2l0aCBjb21wcmVzc2lvbilcbiAgICAgIGNvbnN0IHRhcmdldFNjcm9sbEluZGV4ID0gKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleDtcblxuICAgICAgaWYgKGNvbXByZXNzaW9uUmF0aW8gPCAxKSB7XG4gICAgICAgIC8vIENvbXByZXNzZWQgc3BhY2UgY2FsY3VsYXRpb25cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRhcmdldFNjcm9sbEluZGV4LCB1c2UgaXQgZGlyZWN0bHkgaW5zdGVhZCBvZiBjYWxjdWxhdGluZyBmcm9tIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAvLyBUaGlzIGVuc3VyZXMgd2Ugc2hvdyB0aGUgY29ycmVjdCBpdGVtcyBldmVuIHdoZW4gdmlydHVhbCBzcGFjZSBpcyBjb21wcmVzc2VkXG4gICAgICAgIGlmICh0YXJnZXRTY3JvbGxJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5tYXgoMCwgdGFyZ2V0U2Nyb2xsSW5kZXggLSBvdmVyc2Nhbik7XG4gICAgICAgICAgZW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICB0b3RhbEl0ZW1zIC0gMSxcbiAgICAgICAgICAgIHRhcmdldFNjcm9sbEluZGV4ICsgdmlzaWJsZUNvdW50ICsgb3ZlcnNjYW4sXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvLyBDbGVhciB0YXJnZXRTY3JvbGxJbmRleCBhZnRlciBmaXJzdCB1c2Ugc28gbm9ybWFsIHNjcm9sbGluZyB3b3Jrc1xuICAgICAgICAgIGRlbGV0ZSAodmlld3BvcnRTdGF0ZSBhcyBhbnkpLnRhcmdldFNjcm9sbEluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsU2l6ZTtcbiAgICAgICAgICBjb25zdCBleGFjdEluZGV4ID0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zO1xuICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihleGFjdEluZGV4KTtcbiAgICAgICAgICBlbmQgPSBNYXRoLmNlaWwoZXhhY3RJbmRleCkgKyB2aXNpYmxlQ291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOZWFyLWJvdHRvbSBoYW5kbGluZ1xuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB2aXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemU7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbCAtIHNjcm9sbFBvc2l0aW9uO1xuXG4gICAgICAgIGlmIChkaXN0YW5jZUZyb21Cb3R0b20gPD0gY29udGFpbmVyU2l6ZSAmJiBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTEpIHtcbiAgICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUgLyB2aWV3cG9ydFN0YXRlLml0ZW1TaXplLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlQXRCb3R0b20gPSBNYXRoLm1heCgwLCB0b3RhbEl0ZW1zIC0gaXRlbXNBdEJvdHRvbSk7XG4gICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIE1hdGgubWluKDEsIDEgLSBkaXN0YW5jZUZyb21Cb3R0b20gLyBjb250YWluZXJTaXplKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgc3RhcnQgKyAoZmlyc3RWaXNpYmxlQXRCb3R0b20gLSBzdGFydCkgKiBpbnRlcnBvbGF0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZW5kID1cbiAgICAgICAgICAgIGRpc3RhbmNlRnJvbUJvdHRvbSA8PSAxXG4gICAgICAgICAgICAgID8gdG90YWxJdGVtcyAtIDFcbiAgICAgICAgICAgICAgOiBNYXRoLm1pbih0b3RhbEl0ZW1zIC0gMSwgc3RhcnQgKyB2aXNpYmxlQ291bnQgKyBvdmVyc2Nhbik7XG5cbiAgICAgICAgICBsb2coXCJOZWFyIGJvdHRvbSBjYWxjdWxhdGlvbjpcIiwge1xuICAgICAgICAgICAgZGlzdGFuY2VGcm9tQm90dG9tLFxuICAgICAgICAgICAgaW50ZXJwb2xhdGlvbixcbiAgICAgICAgICAgIHN0YXJ0LFxuICAgICAgICAgICAgZW5kLFxuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXBwbHkgb3ZlcnNjYW5cbiAgICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCBzdGFydCAtIG92ZXJzY2FuKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIGVuZCArIG92ZXJzY2FuKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvblxuICAgICAgICBzdGFydCA9IE1hdGgubWF4KFxuICAgICAgICAgIDAsXG4gICAgICAgICAgTWF0aC5mbG9vcihzY3JvbGxQb3NpdGlvbiAvIHZpZXdwb3J0U3RhdGUuaXRlbVNpemUpIC0gb3ZlcnNjYW4sXG4gICAgICAgICk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCArIG92ZXJzY2FuICogMik7XG4gICAgICB9XG5cbiAgICAgIC8vIFZhbGlkYXRlIG91dHB1dFxuICAgICAgaWYgKGlzTmFOKHN0YXJ0KSB8fCBpc05hTihlbmQpKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJbVmlydHVhbF0gTmFOIGluIHJhbmdlIGNhbGN1bGF0aW9uOlwiLCB7XG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgIGl0ZW1TaXplOiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplLFxuICAgICAgICAgIGNvbXByZXNzaW9uUmF0aW8sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgICB9XG5cbiAgICAgIC8vIGxvZyhgUmFuZ2U6ICR7c3RhcnR9LSR7ZW5kfSAoc2Nyb2xsOiAke3Njcm9sbFBvc2l0aW9ufSlgKTtcblxuICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgbGFzdCByYW5nZVxuICAgICAgLy8gaWYgKGVuZCA+PSB0b3RhbEl0ZW1zIC0gMTApIHtcbiAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAvLyAgICAgYFtWaXJ0dWFsXSBOZWFyIGVuZCByYW5nZTogJHtzdGFydH0tJHtlbmR9LCB0b3RhbEl0ZW1zPSR7dG90YWxJdGVtc30sIGxhc3RJdGVtUG9zPSR7XG4gICAgICAvLyAgICAgICBlbmQgKiB2aWV3cG9ydFN0YXRlLml0ZW1TaXplXG4gICAgICAvLyAgICAgfXB4LCB2aXJ0dWFsU2l6ZT0ke3ZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZX1weGBcbiAgICAgIC8vICAgKTtcbiAgICAgIC8vIH1cblxuICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgIH07XG5cbiAgICAvLyBDYWxjdWxhdGUgYWN0dWFsIHZpc2libGUgcmFuZ2UgKHdpdGhvdXQgb3ZlcnNjYW4gYnVmZmVyKVxuICAgIGNvbnN0IGNhbGN1bGF0ZUFjdHVhbFZpc2libGVSYW5nZSA9IChzY3JvbGxQb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybiB7IHN0YXJ0OiAwLCBlbmQ6IDAgfTtcblxuICAgICAgY29uc3QgeyBjb250YWluZXJTaXplLCB0b3RhbEl0ZW1zIH0gPSB2aWV3cG9ydFN0YXRlO1xuICAgICAgaWYgKCFjb250YWluZXJTaXplIHx8ICF0b3RhbEl0ZW1zKSByZXR1cm4geyBzdGFydDogMCwgZW5kOiAwIH07XG5cbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgIGNvbnN0IHZpc2libGVDb3VudCA9IE1hdGguY2VpbChjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgY29uc3QgY29tcHJlc3Npb25SYXRpbyA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZVxuICAgICAgICA/ICh0b3RhbEl0ZW1zICogaXRlbVNpemUpIC8gdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplXG4gICAgICAgIDogMTtcblxuICAgICAgbGV0IHN0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyO1xuXG4gICAgICBpZiAoY29tcHJlc3Npb25SYXRpbyA8IDEpIHtcbiAgICAgICAgLy8gQ29tcHJlc3NlZCBzcGFjZSAtIGNhbGN1bGF0ZSBiYXNlZCBvbiBzY3JvbGwgcmF0aW9cbiAgICAgICAgY29uc3QgdmlydHVhbFNpemUgPVxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSB8fCB0b3RhbEl0ZW1zICogaXRlbVNpemU7XG4gICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsU2l6ZTtcbiAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHNjcm9sbFJhdGlvICogdG90YWxJdGVtcyk7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRvdGFsSXRlbXMgLSAxLCBzdGFydCArIHZpc2libGVDb3VudCAtIDEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGlyZWN0IGNhbGN1bGF0aW9uXG4gICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzY3JvbGxQb3NpdGlvbiAvIGl0ZW1TaXplKTtcbiAgICAgICAgZW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHN0YXJ0ICsgdmlzaWJsZUNvdW50IC0gMSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVuc3VyZSB2YWxpZCByYW5nZVxuICAgICAgc3RhcnQgPSBNYXRoLm1heCgwLCBzdGFydCk7XG4gICAgICBlbmQgPSBNYXRoLm1heChzdGFydCwgZW5kKTtcblxuICAgICAgcmV0dXJuIHsgc3RhcnQsIGVuZCB9O1xuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgZnVuY3Rpb25zXG4gICAgY29uc3QgdXBkYXRlVmlzaWJsZVJhbmdlID0gKHNjcm9sbFBvc2l0aW9uOiBudW1iZXIpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSkgcmV0dXJuO1xuICAgICAgdmlld3BvcnRTdGF0ZS52aXNpYmxlUmFuZ2UgPSBjYWxjdWxhdGVWaXNpYmxlUmFuZ2Uoc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAvLyBERUJVRzogTG9nIHdobyBjYWxscyB1cGRhdGVWaXNpYmxlUmFuZ2Ugd2l0aCAwIHdoZW4gaXQgc2hvdWxkIGJlIG5vbi16ZXJvXG5cbiAgICAgIC8vIENhbGN1bGF0ZSBhY3R1YWwgdmlzaWJsZSByYW5nZSAod2l0aG91dCBvdmVyc2NhbikgZm9yIFVJIGRpc3BsYXlcbiAgICAgIGNvbnN0IGFjdHVhbFZpc2libGVSYW5nZSA9IGNhbGN1bGF0ZUFjdHVhbFZpc2libGVSYW5nZShzY3JvbGxQb3NpdGlvbik7XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgcmFuZ2U6IHZpZXdwb3J0U3RhdGUudmlzaWJsZVJhbmdlLFxuICAgICAgICB2aXNpYmxlUmFuZ2U6IGFjdHVhbFZpc2libGVSYW5nZSxcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHRvdGFsIHZpcnR1YWwgc2l6ZVxuICAgIGNvbnN0IHVwZGF0ZVRvdGFsVmlydHVhbFNpemUgPSAodG90YWxJdGVtczogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHJldHVybjtcblxuICAgICAgY29uc3Qgb2xkU2l6ZSA9IHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA9IHRvdGFsSXRlbXM7XG4gICAgICBjb25zdCBhY3R1YWxTaXplID0gdG90YWxJdGVtcyAqIHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG5cbiAgICAgIC8vIEdldCBwYWRkaW5nIGZyb20gdGhlIGl0ZW1zIGNvbnRhaW5lciBpZiBhdmFpbGFibGVcbiAgICAgIGxldCB0b3RhbFBhZGRpbmcgPSAwO1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIpIHtcbiAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKFxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuaXRlbXNDb250YWluZXIsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHBhZGRpbmdUb3AgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUucGFkZGluZ1RvcCkgfHwgMDtcbiAgICAgICAgY29uc3QgcGFkZGluZ0JvdHRvbSA9IHBhcnNlRmxvYXQoY29tcHV0ZWRTdHlsZS5wYWRkaW5nQm90dG9tKSB8fCAwO1xuICAgICAgICB0b3RhbFBhZGRpbmcgPSBwYWRkaW5nVG9wICsgcGFkZGluZ0JvdHRvbTtcbiAgICAgIH1cblxuICAgICAgLy8gSW5jbHVkZSBwYWRkaW5nIGluIHRoZSB2aXJ0dWFsIHNpemVcbiAgICAgIHZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZSA9IE1hdGgubWluKFxuICAgICAgICBhY3R1YWxTaXplICsgdG90YWxQYWRkaW5nLFxuICAgICAgICBNQVhfVklSVFVBTF9TSVpFLFxuICAgICAgKTtcblxuICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgZGVidWdnaW5nIGdhcCBpc3N1ZVxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbVmlydHVhbF0gVG90YWwgc2l6ZSB1cGRhdGU6IGl0ZW1zPSR7dG90YWxJdGVtc30sIGl0ZW1TaXplPSR7dmlld3BvcnRTdGF0ZS5pdGVtU2l6ZX1weCwgcGFkZGluZz0ke3RvdGFsUGFkZGluZ31weCwgdmlydHVhbFNpemU9JHt2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemV9cHggKHdhcyAke29sZFNpemV9cHgpYFxuICAgICAgLy8gKTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZTogdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICB0b3RhbEl0ZW1zOiB0b3RhbEl0ZW1zLFxuICAgICAgICBjb21wcmVzc2lvblJhdGlvOiBnZXRDb21wcmVzc2lvblJhdGlvKCksXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBzaXplXG4gICAgY29uc3QgdXBkYXRlQ29udGFpbmVyU2l6ZSA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSB8fCAhdmlld3BvcnRTdGF0ZS52aWV3cG9ydEVsZW1lbnQpIHJldHVybjtcblxuICAgICAgY29uc3Qgc2l6ZSA9XG4gICAgICAgIHZpZXdwb3J0U3RhdGUudmlld3BvcnRFbGVtZW50W1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUub3JpZW50YXRpb24gPT09IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgICA/IFwib2Zmc2V0V2lkdGhcIlxuICAgICAgICAgICAgOiBcIm9mZnNldEhlaWdodFwiXG4gICAgICAgIF07XG5cbiAgICAgIC8vIExvZyB0aGUgYWN0dWFsIG1lYXN1cmVtZW50XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtWaXJ0dWFsXSBDb250YWluZXIgc2l6ZSBtZWFzdXJlZDogJHtzaXplfXB4IGZyb20gdmlld3BvcnQgZWxlbWVudGBcbiAgICAgIC8vICk7XG5cbiAgICAgIGlmIChzaXplICE9PSB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplID0gc2l6ZTtcbiAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUodmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zKTsgLy8gQWxzbyB1cGRhdGUgdmlydHVhbCBzaXplXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpjb250YWluZXItc2l6ZS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICBjb250YWluZXJTaXplOiBzaXplLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gT3ZlcnJpZGUgdmlld3BvcnQgbWV0aG9kc1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5nZXRWaXNpYmxlUmFuZ2UgPSAoKSA9PlxuICAgICAgdmlld3BvcnRTdGF0ZT8udmlzaWJsZVJhbmdlIHx8XG4gICAgICBjYWxjdWxhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnNjcm9sbFwiLCAoZGF0YTogYW55KSA9PlxuICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKGRhdGEucG9zaXRpb24pLFxuICAgICk7XG5cbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0Oml0ZW1zLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKGRhdGEudG90YWxJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbEl0ZW1zKTtcbiAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGU/LnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTGlzdGVuIGZvciB0b3RhbCBpdGVtcyBjaGFuZ2VzIChpbXBvcnRhbnQgZm9yIGN1cnNvciBwYWdpbmF0aW9uKVxuICAgIC8vIE5vdGU6IHNldFRvdGFsSXRlbXMoKSB1cGRhdGVzIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyBCRUZPUkUgZW1pdHRpbmcgdGhpcyBldmVudCxcbiAgICAvLyBzbyB3ZSBjYW4ndCByZWx5IG9uIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyB0byBkZXRlY3QgdGhlIGZpcnN0IHRvdGFsLlxuICAgIC8vIEluc3RlYWQgd2UgdXNlIHRoZSBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiBmbGFnLlxuICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICBpZiAoZGF0YS50b3RhbCA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG5cbiAgICAgIC8vIEZJWDogV2hlbiB3ZSBmaXJzdCByZWNlaXZlIHRvdGFsSXRlbXMgd2l0aCBpbml0aWFsU2Nyb2xsSW5kZXggYW5kIGNvbXByZXNzaW9uLFxuICAgICAgLy8gcmVjYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIHRvIGFjY291bnQgZm9yIGNvbXByZXNzaW9uLlxuICAgICAgLy8gV2l0aG91dCB0aGlzLCBpbml0aWFsU2Nyb2xsSW5kZXggY2FsY3VsYXRlcyBwb3NpdGlvbiBhcyBpbmRleCAqIGl0ZW1TaXplLFxuICAgICAgLy8gYnV0IHJlbmRlcmluZyB1c2VzIGNvbXByZXNzZWQgc3BhY2UsIGNhdXNpbmcgaXRlbXMgdG8gYXBwZWFyIG9mZi1zY3JlZW4uXG4gICAgICAvL1xuICAgICAgLy8gV2UgY2hlY2sgdGhpcyBCRUZPUkUgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSBiZWNhdXNlIHdlIG5lZWQgdG8gcmVjYWxjdWxhdGVcbiAgICAgIC8vIHNjcm9sbCBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgbmV3IHRvdGFsLCBhbmQgdGhlIGZsYWcgZW5zdXJlcyB3ZSBvbmx5IGRvIHRoaXMgb25jZS5cbiAgICAgIGlmIChcbiAgICAgICAgaW5pdGlhbFNjcm9sbEluZGV4ID4gMCAmJlxuICAgICAgICAhaGFzUmVjYWxjdWxhdGVkU2Nyb2xsRm9yQ29tcHJlc3Npb24gJiZcbiAgICAgICAgZGF0YS50b3RhbCA+IDBcbiAgICAgICkge1xuICAgICAgICBjb25zdCBhY3R1YWxUb3RhbFNpemUgPSBkYXRhLnRvdGFsICogdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZTtcbiAgICAgICAgY29uc3QgaXNDb21wcmVzc2VkID0gYWN0dWFsVG90YWxTaXplID4gTUFYX1ZJUlRVQUxfU0laRTtcblxuICAgICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgICAgLy8gUmVjYWxjdWxhdGUgc2Nyb2xsIHBvc2l0aW9uIHVzaW5nIGNvbXByZXNzaW9uLWF3YXJlIGZvcm11bGFcbiAgICAgICAgICAvLyBTYW1lIGZvcm11bGEgdXNlZCBpbiBzY3JvbGxUb0luZGV4XG4gICAgICAgICAgY29uc3QgcmF0aW8gPSBpbml0aWFsU2Nyb2xsSW5kZXggLyBkYXRhLnRvdGFsO1xuICAgICAgICAgIGNvbnN0IGNvbXByZXNzZWRQb3NpdGlvbiA9IHJhdGlvICogTUFYX1ZJUlRVQUxfU0laRTtcblxuICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBjb21wcmVzc2VkUG9zaXRpb247XG5cbiAgICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbC1wb3NpdGlvbi1zeW5jXCIsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBjb21wcmVzc2VkUG9zaXRpb24sXG4gICAgICAgICAgICBzb3VyY2U6IFwiY29tcHJlc3Npb24tcmVjYWxjdWxhdGlvblwiLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgdGFyZ2V0U2Nyb2xsSW5kZXggc2luY2Ugd2UndmUgbm93IGNvcnJlY3RseSBjYWxjdWxhdGVkIHRoZSBzY3JvbGwgcG9zaXRpb25cbiAgICAgICAgICAvLyBUaGUgbm9ybWFsIGNvbXByZXNzZWQgc2Nyb2xsaW5nIGZvcm11bGEgd2lsbCBub3cgd29yayBjb3JyZWN0bHlcbiAgICAgICAgICBkZWxldGUgKHZpZXdwb3J0U3RhdGUgYXMgYW55KS50YXJnZXRTY3JvbGxJbmRleDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgYXMgZG9uZSBldmVuIGlmIG5vdCBjb21wcmVzc2VkIC0gd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgY2hlY2sgb25jZVxuICAgICAgICBoYXNSZWNhbGN1bGF0ZWRTY3JvbGxGb3JDb21wcmVzc2lvbiA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbCk7XG4gICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAgIC8vIFRyaWdnZXIgYSByZW5kZXIgdG8gdXBkYXRlIHRoZSB2aWV3XG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgY29udGFpbmVyIHNpemUgY2hhbmdlcyB0byByZWNhbGN1bGF0ZSB2aXJ0dWFsIHNpemVcbiAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OmNvbnRhaW5lci1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUgJiYgZGF0YS5jb250YWluZXJTaXplICE9PSB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS5jb250YWluZXJTaXplID0gZGF0YS5jb250YWluZXJTaXplO1xuICAgICAgICAvLyBSZWNhbGN1bGF0ZSB2aXJ0dWFsIHNpemUgd2l0aCBuZXcgY29udGFpbmVyIHNpemVcbiAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMpO1xuICAgICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiB8fCAwKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBkYXRhLnRvdGFsICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgZGF0YS50b3RhbCAhPT0gdmlld3BvcnRTdGF0ZT8udG90YWxJdGVtc1xuICAgICAgKSB7XG4gICAgICAgIHVwZGF0ZVRvdGFsVmlydHVhbFNpemUoZGF0YS50b3RhbCk7XG4gICAgICB9XG4gICAgICB1cGRhdGVWaXNpYmxlUmFuZ2Uodmlld3BvcnRTdGF0ZT8uc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcbiAgICB9KTtcblxuICAgIC8vIExpc3RlbiBmb3IgZmlyc3QgaXRlbXMgcmVuZGVyZWQgdG8gY2FsY3VsYXRlIGl0ZW0gc2l6ZSAoaWYgYXV0by1kZXRlY3Rpb24gaXMgZW5hYmxlZClcbiAgICBpZiAoYXV0b0RldGVjdEl0ZW1TaXplKSB7XG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFoYXNDYWxjdWxhdGVkSXRlbVNpemUgJiZcbiAgICAgICAgICBkYXRhLmVsZW1lbnRzPy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBDYWxjdWxhdGUgYXZlcmFnZSBpdGVtIHNpemUgZnJvbSBmaXJzdCByZW5kZXJlZCBiYXRjaFxuICAgICAgICAgIGNvbnN0IHNpemVzOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IHNpemVQcm9wZXJ0eSA9XG4gICAgICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJob3Jpem9udGFsXCIgPyBcIm9mZnNldFdpZHRoXCIgOiBcIm9mZnNldEhlaWdodFwiO1xuXG4gICAgICAgICAgZGF0YS5lbGVtZW50cy5mb3JFYWNoKChlbGVtZW50OiBIVE1MRWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2l6ZSA9IGVsZW1lbnRbc2l6ZVByb3BlcnR5XTtcbiAgICAgICAgICAgIGlmIChzaXplID4gMCkge1xuICAgICAgICAgICAgICBzaXplcy5wdXNoKHNpemUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKHNpemVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGF2Z1NpemUgPSBNYXRoLnJvdW5kKFxuICAgICAgICAgICAgICBzaXplcy5yZWR1Y2UoKHN1bSwgc2l6ZSkgPT4gc3VtICsgc2l6ZSwgMCkgLyBzaXplcy5sZW5ndGgsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtU2l6ZSA9IHZpZXdwb3J0U3RhdGUuaXRlbVNpemU7XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1TaXplID0gYXZnU2l6ZTtcblxuICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbml0aWFsU2Nyb2xsSW5kZXgsIHJlY2FsY3VsYXRlIHNjcm9sbCBwb3NpdGlvblxuICAgICAgICAgICAgLy8gYmFzZWQgb24gdGhlIG5ld2x5IGRldGVjdGVkIGl0ZW0gc2l6ZVxuICAgICAgICAgICAgaWYgKGluaXRpYWxTY3JvbGxJbmRleCA+IDAgJiYgYXZnU2l6ZSAhPT0gcHJldmlvdXNJdGVtU2l6ZSkge1xuICAgICAgICAgICAgICBjb25zdCBuZXdTY3JvbGxQb3NpdGlvbiA9IGluaXRpYWxTY3JvbGxJbmRleCAqIGF2Z1NpemU7XG4gICAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBuZXdTY3JvbGxQb3NpdGlvbjtcblxuICAgICAgICAgICAgICAvLyBOb3RpZnkgc2Nyb2xsaW5nIGZlYXR1cmUgdG8gc3luYyBpdHMgbG9jYWwgc2Nyb2xsIHBvc2l0aW9uXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IG5ld1Njcm9sbFBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogXCJpdGVtLXNpemUtZGV0ZWN0ZWRcIixcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlY2FsY3VsYXRlIGV2ZXJ5dGhpbmcgd2l0aCBuZXcgc2l6ZVxuICAgICAgICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMpO1xuICAgICAgICAgICAgdXBkYXRlVmlzaWJsZVJhbmdlKHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gfHwgMCk7XG5cbiAgICAgICAgICAgIC8vIFJlLXJlbmRlciB0byBhZGp1c3QgcG9zaXRpb25zXG4gICAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LnJlbmRlckl0ZW1zPy4oKTtcblxuICAgICAgICAgICAgLy8gRW1pdCBldmVudCBmb3Igc2l6ZSBjaGFuZ2VcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtLXNpemUtZGV0ZWN0ZWRcIiwge1xuICAgICAgICAgICAgICBwcmV2aW91c1NpemU6IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgICAgICAgICAgZGV0ZWN0ZWRTaXplOiBhdmdTaXplLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGhhc0NhbGN1bGF0ZWRJdGVtU2l6ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgdmlydHVhbCBBUElcbiAgICBjb25zdCBjb21wcmVzc2lvblJhdGlvID0gZ2V0Q29tcHJlc3Npb25SYXRpbygpO1xuICAgIChjb21wb25lbnQgYXMgYW55KS52aXJ0dWFsID0ge1xuICAgICAgY2FsY3VsYXRlVmlzaWJsZVJhbmdlLFxuICAgICAgdXBkYXRlVG90YWxWaXJ0dWFsU2l6ZSxcbiAgICAgIGdldFRvdGFsVmlydHVhbFNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/LnZpcnR1YWxUb3RhbFNpemUgfHwgMCxcbiAgICAgIGdldENvbnRhaW5lclNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/LmNvbnRhaW5lclNpemUgfHwgMCxcbiAgICAgIHVwZGF0ZUNvbnRhaW5lclNpemU6IChzaXplOiBudW1iZXIpID0+IHtcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBzaXplO1xuICAgICAgICAgIHVwZGF0ZVZpc2libGVSYW5nZSh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uIHx8IDApO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZ2V0SXRlbVNpemU6ICgpID0+IHZpZXdwb3J0U3RhdGU/Lml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSxcbiAgICAgIGNhbGN1bGF0ZUluZGV4RnJvbVBvc2l0aW9uOiAocG9zaXRpb246IG51bWJlcikgPT5cbiAgICAgICAgTWF0aC5mbG9vcihcbiAgICAgICAgICBwb3NpdGlvbiAvXG4gICAgICAgICAgICAoKHZpZXdwb3J0U3RhdGU/Lml0ZW1TaXplIHx8IGluaXRpYWxJdGVtU2l6ZSkgKiBjb21wcmVzc2lvblJhdGlvKSxcbiAgICAgICAgKSxcbiAgICAgIGNhbGN1bGF0ZVBvc2l0aW9uRm9ySW5kZXg6IChpbmRleDogbnVtYmVyKSA9PlxuICAgICAgICBpbmRleCAqICh2aWV3cG9ydFN0YXRlPy5pdGVtU2l6ZSB8fCBpbml0aWFsSXRlbVNpemUpICogY29tcHJlc3Npb25SYXRpbyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogU2Nyb2xsaW5nIEZlYXR1cmUgLSBWaXJ0dWFsIHNjcm9sbGluZyB3aXRoIGludGVncmF0ZWQgdmVsb2NpdHkgdHJhY2tpbmdcbiAqIEhhbmRsZXMgd2hlZWwgZXZlbnRzLCB0b3VjaC9tb3VzZSBldmVudHMsIHNjcm9sbCBwb3NpdGlvbiBtYW5hZ2VtZW50LCB2ZWxvY2l0eSBtZWFzdXJlbWVudCwgYW5kIG1vbWVudHVtIHNjcm9sbGluZ1xuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIGdldFZpZXdwb3J0U3RhdGUsIGNsYW1wIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY3JvbGxpbmdDb25maWcge1xuICBvcmllbnRhdGlvbj86IFwidmVydGljYWxcIiB8IFwiaG9yaXpvbnRhbFwiO1xuICBzZW5zaXRpdml0eT86IG51bWJlcjtcbiAgc21vb3RoaW5nPzogYm9vbGVhbjtcbiAgaWRsZVRpbWVvdXQ/OiBudW1iZXI7XG4gIC8qKiBTdG9wIHNjcm9sbGluZyB3aGVuIGNsaWNraW5nIG9uIHRoZSB2aWV3cG9ydCAoZGVmYXVsdDogdHJ1ZSkgKi9cbiAgc3RvcE9uQ2xpY2s/OiBib29sZWFuO1xufVxuXG4vLyBTcGVlZCB0cmFja2VyIGludGVyZmFjZVxuaW50ZXJmYWNlIFNwZWVkVHJhY2tlciB7XG4gIHZlbG9jaXR5OiBudW1iZXI7XG4gIGxhc3RQb3NpdGlvbjogbnVtYmVyO1xuICBsYXN0VGltZTogbnVtYmVyO1xuICBkaXJlY3Rpb246IFwiZm9yd2FyZFwiIHwgXCJiYWNrd2FyZFwiO1xuICBzYW1wbGVzOiBBcnJheTx7IHBvc2l0aW9uOiBudW1iZXI7IHRpbWU6IG51bWJlciB9Pjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHNwZWVkIHRyYWNrZXJcbiAqL1xuY29uc3QgY3JlYXRlU3BlZWRUcmFja2VyID0gKCk6IFNwZWVkVHJhY2tlciA9PiAoe1xuICB2ZWxvY2l0eTogMCxcbiAgbGFzdFBvc2l0aW9uOiAwLFxuICBsYXN0VGltZTogRGF0ZS5ub3coKSxcbiAgZGlyZWN0aW9uOiBcImZvcndhcmRcIixcbiAgc2FtcGxlczogW10sXG59KTtcblxuLyoqXG4gKiBVcGRhdGVzIHNwZWVkIHRyYWNrZXIgd2l0aCBuZXcgcG9zaXRpb25cbiAqL1xuY29uc3QgdXBkYXRlU3BlZWRUcmFja2VyID0gKFxuICB0cmFja2VyOiBTcGVlZFRyYWNrZXIsXG4gIG5ld1Bvc2l0aW9uOiBudW1iZXIsXG4gIHByZXZpb3VzUG9zaXRpb246IG51bWJlcixcbik6IFNwZWVkVHJhY2tlciA9PiB7XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIGNvbnN0IHRpbWVEZWx0YSA9IG5vdyAtIHRyYWNrZXIubGFzdFRpbWU7XG5cbiAgaWYgKHRpbWVEZWx0YSA9PT0gMCkgcmV0dXJuIHRyYWNrZXI7XG5cbiAgY29uc3QgcG9zaXRpb25EZWx0YSA9IG5ld1Bvc2l0aW9uIC0gcHJldmlvdXNQb3NpdGlvbjtcbiAgLy8gS2VlcCB2ZWxvY2l0eSBzaWduZWQgKHBvc2l0aXZlID0gZm9yd2FyZC9kb3duLCBuZWdhdGl2ZSA9IGJhY2t3YXJkL3VwKVxuICBjb25zdCBpbnN0YW50VmVsb2NpdHkgPSBwb3NpdGlvbkRlbHRhIC8gdGltZURlbHRhO1xuXG4gIC8vIEFkZCBuZXcgc2FtcGxlXG4gIGNvbnN0IHNhbXBsZXMgPSBbLi4udHJhY2tlci5zYW1wbGVzLCB7IHBvc2l0aW9uOiBuZXdQb3NpdGlvbiwgdGltZTogbm93IH1dO1xuXG4gIC8vIEtlZXAgb25seSByZWNlbnQgc2FtcGxlcyAobGFzdCAxMDBtcylcbiAgY29uc3QgcmVjZW50U2FtcGxlcyA9IHNhbXBsZXMuZmlsdGVyKChzKSA9PiBub3cgLSBzLnRpbWUgPCAxMDApO1xuXG4gIC8vIENhbGN1bGF0ZSBhdmVyYWdlIHZlbG9jaXR5IGZyb20gcmVjZW50IHNhbXBsZXMgKHByZXNlcnZpbmcgc2lnbi9kaXJlY3Rpb24pXG4gIGxldCBhdmdWZWxvY2l0eSA9IGluc3RhbnRWZWxvY2l0eTtcbiAgaWYgKHJlY2VudFNhbXBsZXMubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IG9sZGVzdFNhbXBsZSA9IHJlY2VudFNhbXBsZXNbMF07XG4gICAgY29uc3QgdG90YWxEaXN0YW5jZSA9IG5ld1Bvc2l0aW9uIC0gb2xkZXN0U2FtcGxlLnBvc2l0aW9uOyAvLyBTaWduZWQgZGlzdGFuY2VcbiAgICBjb25zdCB0b3RhbFRpbWUgPSBub3cgLSBvbGRlc3RTYW1wbGUudGltZTtcbiAgICBhdmdWZWxvY2l0eSA9IHRvdGFsVGltZSA+IDAgPyB0b3RhbERpc3RhbmNlIC8gdG90YWxUaW1lIDogaW5zdGFudFZlbG9jaXR5O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB2ZWxvY2l0eTogYXZnVmVsb2NpdHksXG4gICAgbGFzdFBvc2l0aW9uOiBuZXdQb3NpdGlvbixcbiAgICBsYXN0VGltZTogbm93LFxuICAgIGRpcmVjdGlvbjogcG9zaXRpb25EZWx0YSA+PSAwID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCIsXG4gICAgc2FtcGxlczogcmVjZW50U2FtcGxlcyxcbiAgfTtcbn07XG5cbi8qKlxuICogU2Nyb2xsaW5nIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBIYW5kbGVzIHdoZWVsIGV2ZW50cywgdmVsb2NpdHkgdHJhY2tpbmcsIGFuZCBpZGxlIGRldGVjdGlvblxuICovXG5leHBvcnQgY29uc3Qgd2l0aFNjcm9sbGluZyA9IChjb25maWc6IFNjcm9sbGluZ0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBvcmllbnRhdGlvbiA9IFwidmVydGljYWxcIixcbiAgICAgIHNlbnNpdGl2aXR5ID0gVklFV1BPUlRfQ09OU1RBTlRTLlZJUlRVQUxfU0NST0xMLlNDUk9MTF9TRU5TSVRJVklUWSxcbiAgICAgIHNtb290aGluZyA9IGZhbHNlLFxuICAgICAgaWRsZVRpbWVvdXQgPSAxMDAsIC8vIERlZmF1bHQgaWRsZSB0aW1lb3V0IGluIG1zXG4gICAgICBzdG9wT25DbGljayA9IHRydWUsIC8vIFN0b3Agc2Nyb2xsaW5nIG9uIGNsaWNrIGJ5IGRlZmF1bHRcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gU3RhdGVcbiAgICBsZXQgc2Nyb2xsUG9zaXRpb24gPSAwO1xuICAgIGxldCB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICBsZXQgY29udGFpbmVyU2l6ZSA9IDA7XG4gICAgbGV0IGlzU2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgbGV0IGlzU2Nyb2xsZWRGcm9tVG9wID0gZmFsc2U7IC8vIFRyYWNrIGlmIHNjcm9sbGVkIGF3YXkgZnJvbSB0b3BcbiAgICBsZXQgbGFzdFNjcm9sbFRpbWUgPSAwO1xuICAgIGxldCBzcGVlZFRyYWNrZXIgPSBjcmVhdGVTcGVlZFRyYWNrZXIoKTtcbiAgICBsZXQgaWRsZVRpbWVvdXRJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlkbGVDaGVja0ZyYW1lOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgbGFzdElkbGVDaGVja1Bvc2l0aW9uID0gMDtcbiAgICBsZXQgaGFzRW1pdHRlZElkbGUgPSBmYWxzZTsgLy8gVHJhY2sgaWYgd2UndmUgYWxyZWFkeSBlbWl0dGVkIGlkbGVcbiAgICBsZXQgYW5jaG9yUG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsOyAvLyBBbmNob3IgcG9zaXRpb24gdG8gbWFpbnRhaW4gb24gY2xpY2sgKGZvciBzdG9wT25DbGljaylcbiAgICBsZXQgYW5jaG9yVGltZSA9IDA7IC8vIFRpbWVzdGFtcCB3aGVuIGFuY2hvciB3YXMgc2V0XG4gICAgbGV0IGxhc3RXaGVlbFRpbWUgPSAwOyAvLyBUaW1lc3RhbXAgb2YgbGFzdCB3aGVlbCBldmVudCAoZm9yIGRldGVjdGluZyBnYXBzKVxuICAgIGxldCBhbmNob3JJbml0aWFsRGVsdGEgPSAwOyAvLyBJbml0aWFsIHdoZWVsIGRlbHRhIHdoZW4gYW5jaG9yIHdhcyBzZXQgKHRvIGRldGVjdCBkZWNheSlcbiAgICBsZXQgYW5jaG9yTGFzdERlbHRhID0gMDsgLy8gUHJldmlvdXMgd2hlZWwgZGVsdGEgKHRvIGRldGVjdCBpbmNyZWFzaW5nIGRlbHRhID0gbmV3IHNjcm9sbClcbiAgICBsZXQgYW5jaG9yTWluRGVsdGEgPSBJbmZpbml0eTsgLy8gTWluaW11bSBkZWx0YSBzZWVuIHNpbmNlIGFuY2hvciAodG8gZGV0ZWN0IHJlYWNjZWxlcmF0aW9uKVxuICAgIGxldCBjb25zZWN1dGl2ZUluY3JlYXNlcyA9IDA7IC8vIENvdW50IG9mIGNvbnNlY3V0aXZlIGRlbHRhIGluY3JlYXNlcyAodG8gZGV0ZWN0IHN1c3RhaW5lZCBuZXcgc2Nyb2xsaW5nKVxuICAgIGxldCBzdXN0YWluZWRIaWdoQ291bnQgPSAwOyAvLyBDb3VudCBvZiBldmVudHMgd2hlcmUgZGVsdGEgaXMgc2lnbmlmaWNhbnRseSBhYm92ZSBtaW5pbXVtIChzdXN0YWluZWQgbmV3IHNjcm9sbGluZylcblxuICAgIC8vIGNvbnNvbGUubG9nKGBbU2Nyb2xsaW5nXSBJbml0aWFsIHN0YXRlIC0gcG9zaXRpb246ICR7c2Nyb2xsUG9zaXRpb259YCk7XG5cbiAgICAvLyBUaHJlc2hvbGQgZm9yIGNvbnNpZGVyaW5nIHRoZSBsaXN0IFwic2Nyb2xsZWRcIiAoaW4gcGl4ZWxzKVxuICAgIGNvbnN0IFNDUk9MTEVEX1RIUkVTSE9MRCA9IDE7XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSBzY3JvbGxlZCBzdGF0ZSBjbGFzcyBvbiB0aGUgdmxpc3QgY29udGFpbmVyXG4gICAgICogQWRkcyAtLXNjcm9sbGVkIG1vZGlmaWVyIHdoZW4gbGlzdCBpcyBub3QgYXQgdGhlIHRvcFxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZVNjcm9sbGVkU3RhdGUgPSAoXG4gICAgICB2aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgICAgcG9zaXRpb246IG51bWJlcixcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEJlU2Nyb2xsZWQgPSBwb3NpdGlvbiA+IFNDUk9MTEVEX1RIUkVTSE9MRDtcbiAgICAgIGlmIChzaG91bGRCZVNjcm9sbGVkICE9PSBpc1Njcm9sbGVkRnJvbVRvcCkge1xuICAgICAgICBpc1Njcm9sbGVkRnJvbVRvcCA9IHNob3VsZEJlU2Nyb2xsZWQ7XG4gICAgICAgIC8vIEZpbmQgdGhlIHZsaXN0IGNvbnRhaW5lciAocGFyZW50IG9mIHZpZXdwb3J0KVxuICAgICAgICBjb25zdCB2bGlzdENvbnRhaW5lciA9IHZpZXdwb3J0RWxlbWVudC5jbG9zZXN0KFwiLm10cmwtdmxpc3RcIik7XG4gICAgICAgIGlmICh2bGlzdENvbnRhaW5lcikge1xuICAgICAgICAgIHZsaXN0Q29udGFpbmVyLmNsYXNzTGlzdC50b2dnbGUoXG4gICAgICAgICAgICBcIm10cmwtdmxpc3QtLXNjcm9sbGVkXCIsXG4gICAgICAgICAgICBzaG91bGRCZVNjcm9sbGVkLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gR2V0IHZpZXdwb3J0IHN0YXRlXG4gICAgbGV0IHZpZXdwb3J0U3RhdGU6IGFueTtcblxuICAgIC8vIFVzZSBzaGFyZWQgaW5pdGlhbGl6YXRpb24gd3JhcHBlclxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgdmlld3BvcnRTdGF0ZSA9IGdldFZpZXdwb3J0U3RhdGUoY29tcG9uZW50KTtcblxuICAgICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSB2YWx1ZXNcbiAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgIHRvdGFsVmlydHVhbFNpemUgPSB2aWV3cG9ydFN0YXRlLnZpcnR1YWxUb3RhbFNpemUgfHwgMDtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IHZpZXdwb3J0U3RhdGUuY29udGFpbmVyU2l6ZSB8fCAwO1xuICAgICAgICAvLyBTeW5jIHNjcm9sbFBvc2l0aW9uIGZyb20gdmlld3BvcnRTdGF0ZSAoaW1wb3J0YW50IGZvciBpbml0aWFsU2Nyb2xsSW5kZXgpXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID4gMCkge1xuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uID0gdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHZpcnR1YWwgc2l6ZSBjaGFuZ2VzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnZpcnR1YWwtc2l6ZS1jaGFuZ2VkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJbU2Nyb2xsaW5nXSBWaXJ0dWFsIHNpemUgY2hhbmdlZDpcIiwgZGF0YSk7XG4gICAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyhkYXRhLnRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3Igc2Nyb2xsIHBvc2l0aW9uIGNoYW5nZXMgZnJvbSBvdGhlciBmZWF0dXJlcyAoZS5nLiwgdmlydHVhbC50cyBhZnRlciBpdGVtIHNpemUgZGV0ZWN0aW9uKVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGwtcG9zaXRpb24tc3luY1wiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhLnBvc2l0aW9uICE9PSB1bmRlZmluZWQgJiYgZGF0YS5wb3NpdGlvbiAhPT0gc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgICBzY3JvbGxQb3NpdGlvbiA9IGRhdGEucG9zaXRpb247XG4gICAgICAgICAgLy8gQWxzbyB1cGRhdGUgbG9jYWwgdHJhY2tpbmcgdmFyc1xuICAgICAgICAgIHRvdGFsVmlydHVhbFNpemUgPVxuICAgICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlydHVhbFRvdGFsU2l6ZSB8fCB0b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICAgIGNvbnRhaW5lclNpemUgPSB2aWV3cG9ydFN0YXRlPy5jb250YWluZXJTaXplIHx8IGNvbnRhaW5lclNpemU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGNvbnRhaW5lciBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhLmNvbnRhaW5lclNpemUpIHtcbiAgICAgICAgICBjb250YWluZXJTaXplID0gZGF0YS5jb250YWluZXJTaXplO1xuICAgICAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEF0dGFjaCB3aGVlbCBldmVudCBsaXN0ZW5lciB0byB2aWV3cG9ydCBlbGVtZW50XG4gICAgICBjb25zdCB2aWV3cG9ydEVsZW1lbnQgPVxuICAgICAgICB2aWV3cG9ydFN0YXRlPy52aWV3cG9ydEVsZW1lbnQgfHwgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudDtcbiAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtTY3JvbGxpbmddIEF0dGFjaGluZyB3aGVlbCBldmVudCB0byB2aWV3cG9ydCBlbGVtZW50YCk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgaGFuZGxlV2hlZWwsIHtcbiAgICAgICAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gSW5pdGlhbGl6ZSBzY3JvbGxlZCBzdGF0ZSBiYXNlZCBvbiBjdXJyZW50IHNjcm9sbCBwb3NpdGlvblxuICAgICAgICB1cGRhdGVTY3JvbGxlZFN0YXRlKHZpZXdwb3J0RWxlbWVudCwgc2Nyb2xsUG9zaXRpb24pO1xuXG4gICAgICAgIC8vIEFkZCBtb3VzZWRvd24gbGlzdGVuZXIgdG8gc3RvcCBzY3JvbGxpbmcgb24gY2xpY2tcbiAgICAgICAgaWYgKHN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgaGFuZGxlTW91c2VEb3duKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0b3JlIHJlZmVyZW5jZSBmb3IgY2xlYW51cFxuICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuX3Njcm9sbGluZ1ZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9zY3JvbGxpbmdTdG9wT25DbGljayA9IHN0b3BPbkNsaWNrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbU2Nyb2xsaW5nXSBObyB2aWV3cG9ydCBlbGVtZW50IGZvdW5kIGZvciB3aGVlbCBldmVudHNgKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVzZSBjbGFtcCBmcm9tIHV0aWxzXG5cbiAgICAvLyBTdGFydCBpZGxlIGRldGVjdGlvblxuICAgIGNvbnN0IHN0YXJ0SWRsZURldGVjdGlvbiA9ICgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1Njcm9sbGluZ10gU3RhcnRpbmcgaWRsZSBkZXRlY3Rpb25cIik7XG5cbiAgICAgIC8vIFN0b3AgYW55IGV4aXN0aW5nIGlkbGUgZGV0ZWN0aW9uIGZpcnN0XG4gICAgICBpZiAoaWRsZUNoZWNrRnJhbWUgIT09IG51bGwpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWRsZUNoZWNrRnJhbWUpO1xuICAgICAgICBpZGxlQ2hlY2tGcmFtZSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGhhc0VtaXR0ZWRJZGxlID0gZmFsc2U7IC8vIFJlc2V0IGlkbGUgZW1pc3Npb24gZmxhZ1xuICAgICAgY29uc3QgY2hlY2tJZGxlID0gKCkgPT4ge1xuICAgICAgICBpZiAoc2Nyb2xsUG9zaXRpb24gPT09IGxhc3RJZGxlQ2hlY2tQb3NpdGlvbikge1xuICAgICAgICAgIC8vIFBvc2l0aW9uIGhhc24ndCBjaGFuZ2VkIC0gd2UncmUgaWRsZVxuICAgICAgICAgIGlmICghaGFzRW1pdHRlZElkbGUgJiYgKHNwZWVkVHJhY2tlci52ZWxvY2l0eSA+IDAgfHwgaXNTY3JvbGxpbmcpKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgXCJbU2Nyb2xsaW5nXSBJZGxlIGRldGVjdGVkIC0gcG9zaXRpb24gc3RhYmxlLCBzZXR0aW5nIHZlbG9jaXR5IHRvIHplcm9cIlxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIGhhc0VtaXR0ZWRJZGxlID0gdHJ1ZTsgLy8gTWFyayB0aGF0IHdlJ3ZlIGVtaXR0ZWQgaWRsZVxuICAgICAgICAgICAgc2V0VmVsb2NpdHlUb1plcm8oKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUG9zaXRpb24gY2hhbmdlZCwgcmVzZXQgdGhlIGZsYWdcbiAgICAgICAgICBoYXNFbWl0dGVkSWRsZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RJZGxlQ2hlY2tQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICBpZGxlQ2hlY2tGcmFtZSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShjaGVja0lkbGUpO1xuICAgICAgfTtcbiAgICAgIGlkbGVDaGVja0ZyYW1lID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGNoZWNrSWRsZSk7XG4gICAgfTtcblxuICAgIC8vIFN0b3AgaWRsZSBkZXRlY3Rpb25cbiAgICBjb25zdCBzdG9wSWRsZURldGVjdGlvbiA9ICgpID0+IHtcbiAgICAgIGlmIChpZGxlQ2hlY2tGcmFtZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIltTY3JvbGxpbmddIFN0b3BwaW5nIGlkbGUgZGV0ZWN0aW9uXCIpO1xuICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShpZGxlQ2hlY2tGcmFtZSk7XG4gICAgICAgIGlkbGVDaGVja0ZyYW1lID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU2V0IHZlbG9jaXR5IHRvIHplcm8gYW5kIGVtaXQgaWRsZSBldmVudFxuICAgIGNvbnN0IHNldFZlbG9jaXR5VG9aZXJvID0gKCkgPT4ge1xuICAgICAgLy8gU3RvcCBpZGxlIGRldGVjdGlvbiBzaW5jZSB3ZSdyZSBub3cgaWRsZVxuICAgICAgc3RvcElkbGVEZXRlY3Rpb24oKTtcblxuICAgICAgc3BlZWRUcmFja2VyID0gY3JlYXRlU3BlZWRUcmFja2VyKCk7XG4gICAgICBpc1Njcm9sbGluZyA9IGZhbHNlOyAvLyBSZXNldCBzY3JvbGxpbmcgc3RhdGVcblxuICAgICAgLy8gRW1pdCB2ZWxvY2l0eSBjaGFuZ2VcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgdmVsb2NpdHk6IDAsXG4gICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICAvLyBFbWl0IGlkbGUgc3RhdGVcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppZGxlXCIsIHtcbiAgICAgICAgcG9zaXRpb246IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBsYXN0U2Nyb2xsVGltZSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgLy8gVXBkYXRlIGNvbnRhaW5lciBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZUNvbnRhaW5lclBvc2l0aW9uID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlIHx8ICF2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyKSByZXR1cm47XG5cbiAgICAgIC8vIEl0ZW1zIGNvbnRhaW5lciBkb2Vzbid0IG1vdmUgLSBpdGVtcyBpbnNpZGUgaXQgYXJlIHBvc2l0aW9uZWRcbiAgICAgIC8vIFRoaXMgaXMgaGFuZGxlZCBieSB0aGUgcmVuZGVyaW5nIGZlYXR1cmVcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIG1vdXNlZG93biB0byBzdG9wIHNjcm9sbGluZyBvbiBjbGlja1xuICAgIGNvbnN0IGhhbmRsZU1vdXNlRG93biA9IChfZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgLy8gQW5jaG9yIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbiAtIGFueSB3aGVlbCBldmVudHMgd2lsbCBiZSBmb3JjZWQgYmFjayB0byB0aGlzIHBvc2l0aW9uXG4gICAgICAvLyBUaGlzIGVsZWdhbnRseSBoYW5kbGVzIG1vdXNlIHdoZWVscyB3aXRoIHBoeXNpY2FsIGluZXJ0aWEgKGxpa2UgTG9naXRlY2ggZnJlZS1zcGluKVxuICAgICAgYW5jaG9yUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIGFuY2hvclRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgYW5jaG9ySW5pdGlhbERlbHRhID0gMDsgLy8gV2lsbCBiZSBzZXQgYnkgZmlyc3Qgd2hlZWwgZXZlbnRcbiAgICAgIGFuY2hvckxhc3REZWx0YSA9IDA7XG4gICAgICBhbmNob3JNaW5EZWx0YSA9IEluZmluaXR5O1xuICAgICAgY29uc2VjdXRpdmVJbmNyZWFzZXMgPSAwO1xuICAgICAgc3VzdGFpbmVkSGlnaENvdW50ID0gMDtcblxuICAgICAgLy8gT25seSBzdG9wIGlmIHdlJ3JlIGN1cnJlbnRseSBzY3JvbGxpbmdcbiAgICAgIGlmIChpc1Njcm9sbGluZyB8fCBzcGVlZFRyYWNrZXIudmVsb2NpdHkgPiAwKSB7XG4gICAgICAgIHNldFZlbG9jaXR5VG9aZXJvKCk7XG4gICAgICB9XG4gICAgICAvLyBBbHNvIHN0b3AgbW9tZW50dW0gYW5pbWF0aW9uIGlmIGFjdGl2ZVxuICAgICAgY29uc3QgbW9tZW50dW1TdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5tb21lbnR1bVN0YXRlO1xuICAgICAgaWYgKG1vbWVudHVtU3RhdGU/LnN0b3BNb21lbnR1bSkge1xuICAgICAgICBtb21lbnR1bVN0YXRlLnN0b3BNb21lbnR1bSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgd2hlZWwgZXZlbnRcbiAgICBjb25zdCBoYW5kbGVXaGVlbCA9IChldmVudDogV2hlZWxFdmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgY29uc3QgZGVsdGEgPSBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZXZlbnQuZGVsdGFZIDogZXZlbnQuZGVsdGFYO1xuICAgICAgY29uc3Qgc2Nyb2xsRGVsdGEgPSBkZWx0YSAqIHNlbnNpdGl2aXR5O1xuXG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgY29uc3QgdGltZVNpbmNlTGFzdFdoZWVsID0gbm93IC0gbGFzdFdoZWVsVGltZTtcbiAgICAgIGxhc3RXaGVlbFRpbWUgPSBub3c7XG5cbiAgICAgIC8vIElmIHdlIGhhdmUgYW4gYW5jaG9yIHBvc2l0aW9uICh1c2VyIGNsaWNrZWQgdG8gc3RvcCBzY3JvbGxpbmcpLFxuICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyBpbnRlbnRpb25hbCBuZXcgc2Nyb2xsaW5nIG9yIHJlc2lkdWFsIHdoZWVsIGluZXJ0aWFcbiAgICAgIGlmIChhbmNob3JQb3NpdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0aW1lU2luY2VBbmNob3IgPSBub3cgLSBhbmNob3JUaW1lO1xuICAgICAgICBjb25zdCB3aGVlbERlbHRhTWFnbml0dWRlID0gTWF0aC5hYnMoc2Nyb2xsRGVsdGEpO1xuXG4gICAgICAgIC8vIFRyYWNrIGluaXRpYWwgZGVsdGEgdG8gZGV0ZWN0IHdoZW4gaW5lcnRpYSBoYXMgZGVjYXllZFxuICAgICAgICBpZiAoYW5jaG9ySW5pdGlhbERlbHRhID09PSAwKSB7XG4gICAgICAgICAgYW5jaG9ySW5pdGlhbERlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgICBhbmNob3JMYXN0RGVsdGEgPSB3aGVlbERlbHRhTWFnbml0dWRlO1xuICAgICAgICAgIGFuY2hvck1pbkRlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYWNrIG1pbmltdW0gZGVsdGEgdG8gZGV0ZWN0IHJlYWNjZWxlcmF0aW9uICh1c2VyIHN0YXJ0ZWQgc2Nyb2xsaW5nIGFnYWluKVxuICAgICAgICBhbmNob3JNaW5EZWx0YSA9IE1hdGgubWluKGFuY2hvck1pbkRlbHRhLCB3aGVlbERlbHRhTWFnbml0dWRlKTtcblxuICAgICAgICAvLyBEZXRlY3QgaWYgZGVsdGEgaXMgaW5jcmVhc2luZyAodXNlciBzdGFydGVkIG5ldyBzY3JvbGwpXG4gICAgICAgIC8vIEluZXJ0aWEgb25seSBkZWNheXMsIHNvIGluY3JlYXNpbmcgZGVsdGEgPSBpbnRlbnRpb25hbCBuZXcgc2Nyb2xsaW5nXG4gICAgICAgIC8vIEJVVDogZmlsdGVyIG91dCBiYXRjaGVkIGV2ZW50cyB3aGVyZSBkZWx0YSBpcyB+MnggdGhlIGxhc3QgKGJyb3dzZXIgYmF0Y2hpbmcsIG5vdCByZWFsIGluY3JlYXNlKVxuICAgICAgICBjb25zdCBpc0JhdGNoZWRFdmVudCA9XG4gICAgICAgICAgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvckxhc3REZWx0YSAqIDEuOCAmJlxuICAgICAgICAgIHdoZWVsRGVsdGFNYWduaXR1ZGUgPCBhbmNob3JMYXN0RGVsdGEgKiAyLjI7XG5cbiAgICAgICAgLy8gVHJhY2sgY29uc2VjdXRpdmUgaW5jcmVhc2VzIC0gc3VzdGFpbmVkIGluY3JlYXNlcyBpbmRpY2F0ZSBuZXcgc2Nyb2xsaW5nXG4gICAgICAgIC8vIFVzZSAxJSB0aHJlc2hvbGQgdG8gY2F0Y2ggZ3JhZHVhbCBhY2NlbGVyYXRpb25cbiAgICAgICAgaWYgKCFpc0JhdGNoZWRFdmVudCAmJiB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTGFzdERlbHRhICogMS4wMSkge1xuICAgICAgICAgIGNvbnNlY3V0aXZlSW5jcmVhc2VzKys7XG4gICAgICAgIH0gZWxzZSBpZiAod2hlZWxEZWx0YU1hZ25pdHVkZSA8IGFuY2hvckxhc3REZWx0YSAqIDAuOTkpIHtcbiAgICAgICAgICAvLyBEZWx0YSBkZWNyZWFzaW5nIC0gcmVzZXQgY291bnRlclxuICAgICAgICAgIGNvbnNlY3V0aXZlSW5jcmVhc2VzID0gMDtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiBkZWx0YSBpcyByb3VnaGx5IHRoZSBzYW1lICh3aXRoaW4gMSUpLCBkb24ndCBjaGFuZ2UgdGhlIGNvdW50ZXJcblxuICAgICAgICAvLyBUcmFjayBzdXN0YWluZWQgaGlnaCBkZWx0YSAoZGVsdGEgc2lnbmlmaWNhbnRseSBhYm92ZSBtaW5pbXVtIGZvciBtdWx0aXBsZSBldmVudHMpXG4gICAgICAgIC8vIFRoaXMgY2F0Y2hlcyB3aGVuIHVzZXIgc3RhcnRzIHNjcm9sbGluZyBidXQgZGVsdGEgcGxhdGVhdXMgaW5zdGVhZCBvZiBzdHJpY3RseSBpbmNyZWFzaW5nXG4gICAgICAgIGlmICghaXNCYXRjaGVkRXZlbnQgJiYgd2hlZWxEZWx0YU1hZ25pdHVkZSA+IGFuY2hvck1pbkRlbHRhICogMS4wNSkge1xuICAgICAgICAgIHN1c3RhaW5lZEhpZ2hDb3VudCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1c3RhaW5lZEhpZ2hDb3VudCA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZWxlYXNlIGlmOiAzKyBjb25zZWN1dGl2ZSBpbmNyZWFzZXMsIE9SIHN1c3RhaW5lZCBoaWdoIGRlbHRhLCBPUiBzaWduaWZpY2FudCBzaW5nbGUgaW5jcmVhc2VcbiAgICAgICAgY29uc3Qgc3VzdGFpbmVkSW5jcmVhc2UgPSBjb25zZWN1dGl2ZUluY3JlYXNlcyA+PSAzO1xuICAgICAgICBjb25zdCBzdXN0YWluZWRIaWdoID0gc3VzdGFpbmVkSGlnaENvdW50ID49IDU7IC8vIDUrIGV2ZW50cyBhdCA1JSsgYWJvdmUgbWluaW11bVxuICAgICAgICBjb25zdCBzaWduaWZpY2FudEluY3JlYXNlID1cbiAgICAgICAgICAhaXNCYXRjaGVkRXZlbnQgJiZcbiAgICAgICAgICB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTWluRGVsdGEgKiAxLjE1ICYmIC8vIDE1JSBpbmNyZWFzZSBmcm9tIG1pbmltdW1cbiAgICAgICAgICB3aGVlbERlbHRhTWFnbml0dWRlID4gYW5jaG9yTGFzdERlbHRhICogMS4wODsgLy8gYW5kIDglIGluY3JlYXNpbmcgZnJvbSBsYXN0XG4gICAgICAgIGNvbnN0IGRlbHRhSW5jcmVhc2luZyA9XG4gICAgICAgICAgc3VzdGFpbmVkSW5jcmVhc2UgfHwgc3VzdGFpbmVkSGlnaCB8fCBzaWduaWZpY2FudEluY3JlYXNlO1xuXG4gICAgICAgIC8vIFJlbGVhc2UgYW5jaG9yIGlmOlxuICAgICAgICAvLyAxLiBUaGVyZSB3YXMgYSBnYXAgaW4gd2hlZWwgZXZlbnRzICg+IDIwMG1zKSAtIHVzZXIgc3RvcHBlZCBhbmQgc3RhcnRlZCBuZXcgc2Nyb2xsXG4gICAgICAgIC8vIDIuIERlbHRhIGlzIGluY3JlYXNpbmcgZnJvbSBtaW5pbXVtIC0gdXNlciBzdGFydGVkIHNjcm9sbGluZyBhZ2FpbiBkdXJpbmcgaW5lcnRpYVxuICAgICAgICAvLyAzLiBEZWx0YSBoYXMgZGVjYXllZCBzaWduaWZpY2FudGx5ICg8IDMwJSBvZiBpbml0aWFsKSAtIGluZXJ0aWEgaXMgd2luZGluZyBkb3duXG4gICAgICAgIC8vIDQuIExvdyBhYnNvbHV0ZSBkZWx0YSAoPCAzMCkgLSBnZW50bGUgaW50ZW50aW9uYWwgc2Nyb2xsXG4gICAgICAgIGNvbnN0IGhhc1doZWVsR2FwID0gdGltZVNpbmNlTGFzdFdoZWVsID4gMjAwO1xuICAgICAgICBjb25zdCBkZWx0YURlY2F5ZWQgPSB3aGVlbERlbHRhTWFnbml0dWRlIDwgYW5jaG9ySW5pdGlhbERlbHRhICogMC4zO1xuICAgICAgICBjb25zdCBpc0xvd0RlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZSA8IDMwO1xuXG4gICAgICAgIGlmIChoYXNXaGVlbEdhcCkge1xuICAgICAgICAgIC8vIFRpbWUgZ2FwIC0gdXNlciBzdG9wcGVkIGFuZCBzdGFydGVkIG5ldyBzY3JvbGxcbiAgICAgICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsdGFJbmNyZWFzaW5nICYmIHRpbWVTaW5jZUFuY2hvciA+IDEwMCkge1xuICAgICAgICAgIC8vIERlbHRhIGluY3JlYXNpbmcgLSB1c2VyIHN0YXJ0ZWQgc2Nyb2xsaW5nIGFnYWluXG4gICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKGlzTG93RGVsdGEpIHtcbiAgICAgICAgICAvLyBWZXJ5IGxvdyBkZWx0YSAtIGdlbnRsZSBpbnRlbnRpb25hbCBzY3JvbGxcbiAgICAgICAgICBhbmNob3JQb3NpdGlvbiA9IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVsdGFEZWNheWVkICYmIHRpbWVTaW5jZUFuY2hvciA+IDMwMCkge1xuICAgICAgICAgIC8vIERlbHRhIGhhcyBkZWNheWVkIGFuZCBzb21lIHRpbWUgcGFzc2VkIC0gaW5lcnRpYSBpcyBkb25lXG4gICAgICAgICAgYW5jaG9yUG9zaXRpb24gPSBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFN0aWxsIGluIGluZXJ0aWEgcGhhc2UgLSBzdGF5IGFuY2hvcmVkXG4gICAgICAgICAgaWYgKHNjcm9sbFBvc2l0aW9uICE9PSBhbmNob3JQb3NpdGlvbikge1xuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBhbmNob3JQb3NpdGlvbjtcbiAgICAgICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgICAgIHZpZXdwb3J0U3RhdGUuc2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVcGRhdGUgbGFzdCBkZWx0YSBmb3IgbmV4dCBjb21wYXJpc29uXG4gICAgICAgICAgYW5jaG9yTGFzdERlbHRhID0gd2hlZWxEZWx0YU1hZ25pdHVkZTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgbGFzdCBkZWx0YSBmb3IgbmV4dCBjb21wYXJpc29uXG4gICAgICAgIGFuY2hvckxhc3REZWx0YSA9IHdoZWVsRGVsdGFNYWduaXR1ZGU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHByZXZpb3VzUG9zaXRpb24gPSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IE1hdGgubWF4KDAsIHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcblxuICAgICAgbGV0IG5ld1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb24gKyBzY3JvbGxEZWx0YTtcblxuICAgICAgLy8gQXBwbHkgc21vb3RoaW5nIGlmIGVuYWJsZWRcbiAgICAgIGlmIChzbW9vdGhpbmcpIHtcbiAgICAgICAgY29uc3Qgc21vb3RoaW5nRmFjdG9yID0gMC4zO1xuICAgICAgICBuZXdQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uICsgc2Nyb2xsRGVsdGEgKiBzbW9vdGhpbmdGYWN0b3I7XG4gICAgICB9XG5cbiAgICAgIG5ld1Bvc2l0aW9uID0gY2xhbXAobmV3UG9zaXRpb24sIDAsIG1heFNjcm9sbCk7XG5cbiAgICAgIGlmIChuZXdQb3NpdGlvbiAhPT0gc2Nyb2xsUG9zaXRpb24pIHtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsIHN0YXRlXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgLy8gU3RvcCBhbnkgZXhpc3RpbmcgaWRsZSBkZXRlY3Rpb24gYmVmb3JlIHN0YXJ0aW5nIG5ldyBvbmVcbiAgICAgICAgICBzdG9wSWRsZURldGVjdGlvbigpO1xuICAgICAgICAgIHN0YXJ0SWRsZURldGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RTY3JvbGxUaW1lID0gbm93O1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyXG4gICAgICAgIHNwZWVkVHJhY2tlciA9IHVwZGF0ZVNwZWVkVHJhY2tlcihcbiAgICAgICAgICBzcGVlZFRyYWNrZXIsXG4gICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNQb3NpdGlvbixcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBVcGRhdGUgdmlld3BvcnQgc3RhdGVcbiAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbFBvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS52ZWxvY2l0eSA9IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnNjcm9sbERpcmVjdGlvbiA9IHNwZWVkVHJhY2tlci5kaXJlY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsZWQgc3RhdGUgY2xhc3NcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlld3BvcnRFbGVtZW50IHx8IChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsKSB7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsZWRTdGF0ZSh2aWV3cG9ydEVsLCBzY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGV2ZW50c1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgZGlyZWN0aW9uOiBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDp2ZWxvY2l0eS1jaGFuZ2VkXCIsIHtcbiAgICAgICAgICB2ZWxvY2l0eTogc3BlZWRUcmFja2VyLnZlbG9jaXR5LFxuICAgICAgICAgIGRpcmVjdGlvbjogc3BlZWRUcmFja2VyLmRpcmVjdGlvbixcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBwb3NpdGlvblxuICAgIGNvbnN0IHNjcm9sbFRvUG9zaXRpb24gPSAocG9zaXRpb246IG51bWJlciwgc291cmNlPzogc3RyaW5nKSA9PiB7XG4gICAgICBjb25zdCBtYXhTY3JvbGwgPSBNYXRoLm1heCgwLCB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZSk7XG4gICAgICBjb25zdCBjbGFtcGVkUG9zaXRpb24gPSBjbGFtcChwb3NpdGlvbiwgMCwgbWF4U2Nyb2xsKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBzY3JvbGxUb1Bvc2l0aW9uOiBwb3M9JHtwb3NpdGlvbn0gLT4gJHtjbGFtcGVkUG9zaXRpb259LCBzb3VyY2U9JHtzb3VyY2V9LCBjdXJyZW50UG9zPSR7c2Nyb2xsUG9zaXRpb259LCB2ZWxvY2l0eT0ke3NwZWVkVHJhY2tlci52ZWxvY2l0eS50b0ZpeGVkKFxuICAgICAgLy8gICAgIDNcbiAgICAgIC8vICAgKX1gXG4gICAgICAvLyApO1xuXG4gICAgICBpZiAoY2xhbXBlZFBvc2l0aW9uICE9PSBzY3JvbGxQb3NpdGlvbikge1xuICAgICAgICBjb25zdCBwcmV2aW91c1Bvc2l0aW9uID0gc2Nyb2xsUG9zaXRpb247XG4gICAgICAgIHNjcm9sbFBvc2l0aW9uID0gY2xhbXBlZFBvc2l0aW9uO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzcGVlZCB0cmFja2VyIHRvIGNhbGN1bGF0ZSB2ZWxvY2l0eVxuICAgICAgICBzcGVlZFRyYWNrZXIgPSB1cGRhdGVTcGVlZFRyYWNrZXIoXG4gICAgICAgICAgc3BlZWRUcmFja2VyLFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmVsb2NpdHkgPSBzcGVlZFRyYWNrZXIudmVsb2NpdHk7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxEaXJlY3Rpb24gPSBzcGVlZFRyYWNrZXIuZGlyZWN0aW9uO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGlyZWN0aW9uID1cbiAgICAgICAgICBjbGFtcGVkUG9zaXRpb24gPiBwcmV2aW91c1Bvc2l0aW9uID8gXCJmb3J3YXJkXCIgOiBcImJhY2t3YXJkXCI7XG5cbiAgICAgICAgLy8gVXBkYXRlIHNjcm9sbGVkIHN0YXRlIGNsYXNzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWwgPVxuICAgICAgICAgIHZpZXdwb3J0U3RhdGU/LnZpZXdwb3J0RWxlbWVudCB8fCAoY29tcG9uZW50IGFzIGFueSkudmlld3BvcnRFbGVtZW50O1xuICAgICAgICBpZiAodmlld3BvcnRFbCkge1xuICAgICAgICAgIHVwZGF0ZVNjcm9sbGVkU3RhdGUodmlld3BvcnRFbCwgc2Nyb2xsUG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBzY3JvbGwgZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnNjcm9sbFwiLCB7XG4gICAgICAgICAgcG9zaXRpb246IHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIGRpcmVjdGlvbixcbiAgICAgICAgICBwcmV2aW91c1Bvc2l0aW9uLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFbWl0IHZlbG9jaXR5IGNoYW5nZSBldmVudCBzbyBjb2xsZWN0aW9uIGNhbiB0cmFjayBpdFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCB7XG4gICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzY3JvbGwgc3RhdGUgYW5kIGlkbGUgZGV0ZWN0aW9uXG4gICAgICAgIGlmICghaXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICBpc1Njcm9sbGluZyA9IHRydWU7XG4gICAgICAgICAgc3RhcnRJZGxlRGV0ZWN0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgbGFzdFNjcm9sbFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coYFtTY3JvbGxpbmddIFBvc2l0aW9uIHVuY2hhbmdlZDogJHtzY3JvbGxQb3NpdGlvbn1gKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtTY3JvbGxpbmddIFBvc2l0aW9uIHVuY2hhbmdlZDogJHtzY3JvbGxQb3NpdGlvbn0sIG5vdCByZXNldHRpbmcgaWRsZSB0aW1lb3V0YFxuICAgICAgICAvLyApO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBTY3JvbGwgdG8gaW5kZXhcbiAgICBjb25zdCBzY3JvbGxUb0luZGV4ID0gKFxuICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgKSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIHNjcm9sbFRvSW5kZXggY2FsbGVkOiBpbmRleD0ke2luZGV4fSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG4gICAgICBpZiAoIXZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgLy9jb25zb2xlLmxvZyhgW1Njcm9sbGluZ10gc2Nyb2xsVG9JbmRleCBhYm9ydGVkOiBubyB2aWV3cG9ydCBzdGF0ZWApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGl0ZW1TaXplID0gdmlld3BvcnRTdGF0ZS5pdGVtU2l6ZSB8fCA1MDtcbiAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgfHwgMDtcbiAgICAgIGNvbnN0IGFjdHVhbFRvdGFsU2l6ZSA9IHRvdGFsSXRlbXMgKiBpdGVtU2l6ZTtcbiAgICAgIGNvbnN0IE1BWF9WSVJUVUFMX1NJWkUgPVxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuVklSVFVBTF9TQ1JPTEwuTUFYX1ZJUlRVQUxfU0laRTtcbiAgICAgIGNvbnN0IGlzQ29tcHJlc3NlZCA9IGFjdHVhbFRvdGFsU2l6ZSA+IE1BWF9WSVJUVUFMX1NJWkU7XG5cbiAgICAgIGxldCB0YXJnZXRQb3NpdGlvbjogbnVtYmVyO1xuXG4gICAgICBpZiAoaXNDb21wcmVzc2VkKSB7XG4gICAgICAgIC8vIEluIGNvbXByZXNzZWQgc3BhY2UsIG1hcCBpbmRleCB0byB2aXJ0dWFsIHBvc2l0aW9uXG4gICAgICAgIGNvbnN0IHJhdGlvID0gaW5kZXggLyB0b3RhbEl0ZW1zO1xuICAgICAgICB0YXJnZXRQb3NpdGlvbiA9IHJhdGlvICogTWF0aC5taW4oYWN0dWFsVG90YWxTaXplLCBNQVhfVklSVFVBTF9TSVpFKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpcmVjdCBjYWxjdWxhdGlvbiB3aGVuIG5vdCBjb21wcmVzc2VkXG4gICAgICAgIHRhcmdldFBvc2l0aW9uID0gaW5kZXggKiBpdGVtU2l6ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQWRqdXN0IHBvc2l0aW9uIGJhc2VkIG9uIGFsaWdubWVudFxuICAgICAgc3dpdGNoIChhbGlnbm1lbnQpIHtcbiAgICAgICAgY2FzZSBcImNlbnRlclwiOlxuICAgICAgICAgIHRhcmdldFBvc2l0aW9uIC09IGNvbnRhaW5lclNpemUgLyAyIC0gaXRlbVNpemUgLyAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiZW5kXCI6XG4gICAgICAgICAgdGFyZ2V0UG9zaXRpb24gLT0gY29udGFpbmVyU2l6ZSAtIGl0ZW1TaXplO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtTY3JvbGxpbmddIFRhcmdldCBwb3NpdGlvbjogJHt0YXJnZXRQb3NpdGlvbn0sIGlzQ29tcHJlc3NlZDogJHtpc0NvbXByZXNzZWR9YFxuICAgICAgLy8gKTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBTY3JvbGxUb0luZGV4OiBpbmRleD0ke2luZGV4fSwgcG9zaXRpb249JHt0YXJnZXRQb3NpdGlvbn0sIGFsaWdubWVudD0ke2FsaWdubWVudH1gXG4gICAgICAvLyApO1xuXG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uKHRhcmdldFBvc2l0aW9uLCBcInNjcm9sbFRvSW5kZXhcIik7XG4gICAgfTtcblxuICAgIC8vIFNjcm9sbCB0byBhIHNwZWNpZmljIHBhZ2VcbiAgICBjb25zdCBzY3JvbGxUb1BhZ2UgPSAoXG4gICAgICBwYWdlOiBudW1iZXIsXG4gICAgICBsaW1pdDogbnVtYmVyID0gMjAsXG4gICAgICBhbGlnbm1lbnQ6IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiID0gXCJzdGFydFwiLFxuICAgICkgPT4ge1xuICAgICAgLy8gVmFsaWRhdGUgYWxpZ25tZW50IHBhcmFtZXRlclxuICAgICAgaWYgKFxuICAgICAgICB0eXBlb2YgYWxpZ25tZW50ICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICFbXCJzdGFydFwiLCBcImNlbnRlclwiLCBcImVuZFwiXS5pbmNsdWRlcyhhbGlnbm1lbnQpXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbU2Nyb2xsaW5nXSBJbnZhbGlkIGFsaWdubWVudCBcIiR7YWxpZ25tZW50fVwiLCB1c2luZyBcInN0YXJ0XCJgLFxuICAgICAgICApO1xuICAgICAgICBhbGlnbm1lbnQgPSBcInN0YXJ0XCI7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICBjb25zdCB2aWV3cG9ydENvbmZpZyA9IChjb21wb25lbnQgYXMgYW55KS5jb25maWc7XG4gICAgICBjb25zdCBpc0N1cnNvck1vZGUgPSB2aWV3cG9ydENvbmZpZz8ucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCI7XG5cbiAgICAgIGlmIChpc0N1cnNvck1vZGUpIHtcbiAgICAgICAgLy8gSW4gY3Vyc29yIG1vZGUsIGNoZWNrIGlmIHdlIGNhbiBzY3JvbGwgdG8gdGhpcyBwYWdlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCBoaWdoZXN0TG9hZGVkUGFnZSA9IE1hdGguZmxvb3IoXG4gICAgICAgICAgICBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpLnNpemUsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChwYWdlID4gaGlnaGVzdExvYWRlZFBhZ2UgKyAxKSB7XG4gICAgICAgICAgICAvLyBMaW1pdCBob3cgbWFueSBwYWdlcyB3ZSdsbCBsb2FkIGF0IG9uY2UgdG8gcHJldmVudCBleGNlc3NpdmUgQVBJIGNhbGxzXG4gICAgICAgICAgICBjb25zdCBtYXhQYWdlc1RvTG9hZCA9IDEwOyAvLyBSZWFzb25hYmxlIGxpbWl0XG4gICAgICAgICAgICBjb25zdCB0YXJnZXRQYWdlID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgIHBhZ2UsXG4gICAgICAgICAgICAgIGhpZ2hlc3RMb2FkZWRQYWdlICsgbWF4UGFnZXNUb0xvYWQsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBbU2Nyb2xsaW5nXSBDYW5ub3QganVtcCBkaXJlY3RseSB0byBwYWdlICR7cGFnZX0gaW4gY3Vyc29yIG1vZGUuIGAgK1xuICAgICAgICAgICAgICAgIGBQYWdlcyBtdXN0IGJlIGxvYWRlZCBzZXF1ZW50aWFsbHkuIEN1cnJlbnQgaGlnaGVzdCBwYWdlOiAke2hpZ2hlc3RMb2FkZWRQYWdlfS4gYCArXG4gICAgICAgICAgICAgICAgYFdpbGwgbG9hZCB1cCB0byBwYWdlICR7dGFyZ2V0UGFnZX1gLFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gVHJpZ2dlciBzZXF1ZW50aWFsIGxvYWRpbmcgdG8gdGhlIHRhcmdldCBwYWdlIChsaW1pdGVkKVxuICAgICAgICAgICAgY29uc3QgdGFyZ2V0T2Zmc2V0ID0gKHRhcmdldFBhZ2UgLSAxKSAqIGxpbWl0O1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE9mZnNldCA9IGhpZ2hlc3RMb2FkZWRQYWdlICogbGltaXQ7XG5cbiAgICAgICAgICAgIC8vIExvYWQgcGFnZXMgc2VxdWVudGlhbGx5IHVwIHRvIHRoZSBsaW1pdGVkIHRhcmdldFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgICAvLyAgIGBbU2Nyb2xsaW5nXSBJbml0aWF0aW5nIHNlcXVlbnRpYWwgbG9hZCBmcm9tIHBhZ2UgJHtcbiAgICAgICAgICAgIC8vICAgICBoaWdoZXN0TG9hZGVkUGFnZSArIDFcbiAgICAgICAgICAgIC8vICAgfSB0byAke3RhcmdldFBhZ2V9YCxcbiAgICAgICAgICAgIC8vICk7XG5cbiAgICAgICAgICAgIC8vIFNjcm9sbCB0byB0aGUgbGFzdCBsb2FkZWQgcG9zaXRpb24gZmlyc3RcbiAgICAgICAgICAgIGNvbnN0IGxhc3RMb2FkZWRJbmRleCA9IGhpZ2hlc3RMb2FkZWRQYWdlICogbGltaXQ7XG4gICAgICAgICAgICBzY3JvbGxUb0luZGV4KGxhc3RMb2FkZWRJbmRleCwgYWxpZ25tZW50KTtcblxuICAgICAgICAgICAgLy8gVGhlIGNvbGxlY3Rpb24gZmVhdHVyZSB3aWxsIGhhbmRsZSBzZXF1ZW50aWFsIGxvYWRpbmdcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQ29udmVydCBwYWdlIHRvIGluZGV4IChwYWdlIDEgPSBpbmRleCAwKVxuICAgICAgY29uc3QgaW5kZXggPSAocGFnZSAtIDEpICogbGltaXQ7XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGluZ10gU2Nyb2xsVG9QYWdlOiBwYWdlPSR7cGFnZX0sIGxpbWl0PSR7bGltaXR9LCB0YXJnZXRJbmRleD0ke2luZGV4fSwgYWxpZ25tZW50PSR7YWxpZ25tZW50fWBcbiAgICAgIC8vICk7XG5cbiAgICAgIC8vIEp1c3Qgc2Nyb2xsIHRvIHRoZSBpbmRleCAtIGxldCB0aGUgbm9ybWFsIHJlbmRlcmluZyBmbG93IGhhbmRsZSBkYXRhIGxvYWRpbmcgYW5kIHBsYWNlaG9sZGVyc1xuICAgICAgc2Nyb2xsVG9JbmRleChpbmRleCwgYWxpZ25tZW50KTtcbiAgICB9O1xuXG4gICAgLy8gVXBkYXRlIHNjcm9sbCBib3VuZHNcbiAgICBjb25zdCB1cGRhdGVTY3JvbGxCb3VuZHMgPSAoXG4gICAgICBuZXdUb3RhbFNpemU6IG51bWJlcixcbiAgICAgIG5ld0NvbnRhaW5lclNpemU6IG51bWJlcixcbiAgICApID0+IHtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICBjb250YWluZXJTaXplID0gbmV3Q29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID0gbmV3VG90YWxTaXplO1xuICAgICAgICB2aWV3cG9ydFN0YXRlLmNvbnRhaW5lclNpemUgPSBuZXdDb250YWluZXJTaXplO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBjbGFtcCBzY3JvbGwgcG9zaXRpb24gdW50aWwgd2UgaGF2ZSByZWFsIGRhdGEgbG9hZGVkXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIHJlc2V0dGluZyBpbml0aWFsU2Nyb2xsSW5kZXggcG9zaXRpb24gYmVmb3JlIGRhdGEgYXJyaXZlc1xuICAgICAgLy8gQ2hlY2sgdG90YWxJdGVtcyBpbnN0ZWFkIG9mIHRvdGFsVmlydHVhbFNpemUgc2luY2UgdmlydHVhbFNpemUgY2FuIGJlIG5vbi16ZXJvIGZyb20gcGFkZGluZ1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHZpZXdwb3J0U3RhdGU/LnRvdGFsSXRlbXMgfHwgMDtcbiAgICAgIGlmICh0b3RhbEl0ZW1zIDw9IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDbGFtcCBjdXJyZW50IHBvc2l0aW9uIHRvIG5ldyBib3VuZHNcbiAgICAgIGNvbnN0IG1heFNjcm9sbCA9IE1hdGgubWF4KDAsIHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGlmIChzY3JvbGxQb3NpdGlvbiA+IG1heFNjcm9sbCkge1xuICAgICAgICBzY3JvbGxUb1Bvc2l0aW9uKG1heFNjcm9sbCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCB2aWV3cG9ydCBBUElcbiAgICBjb25zdCBvcmlnaW5hbFNjcm9sbFRvSW5kZXggPSBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleDtcbiAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9JbmRleCA9IChcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICBhbGlnbm1lbnQ/OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIixcbiAgICApID0+IHtcbiAgICAgIHNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICBvcmlnaW5hbFNjcm9sbFRvSW5kZXg/LihpbmRleCwgYWxpZ25tZW50KTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNjcm9sbFRvUGFnZSB0byB2aWV3cG9ydCBBUEkgKG5ldyBtZXRob2QsIG5vIG9yaWdpbmFsIHRvIHByZXNlcnZlKVxuICAgIChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxUb1BhZ2UgPSAoXG4gICAgICBwYWdlOiBudW1iZXIsXG4gICAgICBsaW1pdD86IG51bWJlcixcbiAgICAgIGFsaWdubWVudD86IFwic3RhcnRcIiB8IFwiY2VudGVyXCIgfCBcImVuZFwiLFxuICAgICkgPT4ge1xuICAgICAgc2Nyb2xsVG9QYWdlKHBhZ2UsIGxpbWl0LCBhbGlnbm1lbnQpO1xuICAgIH07XG5cbiAgICBjb25zdCBvcmlnaW5hbFNjcm9sbFRvUG9zaXRpb24gPSBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbjtcbiAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbiA9IChwb3NpdGlvbjogbnVtYmVyKSA9PiB7XG4gICAgICBzY3JvbGxUb1Bvc2l0aW9uKHBvc2l0aW9uLCBcImFwaVwiKTtcbiAgICAgIG9yaWdpbmFsU2Nyb2xsVG9Qb3NpdGlvbj8uKHBvc2l0aW9uKTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb3JpZ2luYWxHZXRTY3JvbGxQb3NpdGlvbiA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRTY3JvbGxQb3NpdGlvbjtcbiAgICBjb21wb25lbnQudmlld3BvcnQuZ2V0U2Nyb2xsUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICByZXR1cm4gc2Nyb2xsUG9zaXRpb247XG4gICAgfTtcblxuICAgIC8vIEFkZCB3aGVlbCBldmVudCBsaXN0ZW5lciBvbiBpbml0aWFsaXphdGlvblxuICAgIC8vIFRoaXMgYmxvY2sgaXMgcmVtb3ZlZCBhcyBwZXIgdGhlIGVkaXQgaGludC5cblxuICAgIC8vIENsZWFuIHVwIG9uIGRlc3Ryb3lcbiAgICBpZiAoXCJkZXN0cm95XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAgIGNvbXBvbmVudC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9IChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nVmlld3BvcnRFbGVtZW50O1xuICAgICAgICBpZiAodmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBoYW5kbGVXaGVlbCk7XG4gICAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5fc2Nyb2xsaW5nU3RvcE9uQ2xpY2spIHtcbiAgICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgdGltZW91dHNcbiAgICAgICAgaWYgKGlkbGVUaW1lb3V0SWQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQoaWRsZVRpbWVvdXRJZCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdG9wSWRsZURldGVjdGlvbigpO1xuICAgICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBZGQgc2Nyb2xsQnkgbWV0aG9kXG4gICAgY29uc3Qgc2Nyb2xsQnkgPSAoZGVsdGE6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgcHJldmlvdXNQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgY29uc3QgbWF4U2Nyb2xsID0gTWF0aC5tYXgoMCwgdG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgY29uc3QgbmV3UG9zaXRpb24gPSBjbGFtcChzY3JvbGxQb3NpdGlvbiArIGRlbHRhLCAwLCBtYXhTY3JvbGwpO1xuXG4gICAgICBpZiAobmV3UG9zaXRpb24gIT09IHByZXZpb3VzUG9zaXRpb24pIHtcbiAgICAgICAgc2Nyb2xsUG9zaXRpb24gPSBuZXdQb3NpdGlvbjtcblxuICAgICAgICAvLyBVcGRhdGUgc3BlZWQgdHJhY2tlclxuICAgICAgICBzcGVlZFRyYWNrZXIgPSB1cGRhdGVTcGVlZFRyYWNrZXIoXG4gICAgICAgICAgc3BlZWRUcmFja2VyLFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICAgIHByZXZpb3VzUG9zaXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS5zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFBvc2l0aW9uO1xuICAgICAgICAgIHZpZXdwb3J0U3RhdGUudmVsb2NpdHkgPSBzcGVlZFRyYWNrZXIudmVsb2NpdHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgc2Nyb2xsZWQgc3RhdGUgY2xhc3NcbiAgICAgICAgY29uc3Qgdmlld3BvcnRFbCA9XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8udmlld3BvcnRFbGVtZW50IHx8IChjb21wb25lbnQgYXMgYW55KS52aWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsKSB7XG4gICAgICAgICAgdXBkYXRlU2Nyb2xsZWRTdGF0ZSh2aWV3cG9ydEVsLCBzY3JvbGxQb3NpdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IHNjcm9sbCBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIHtcbiAgICAgICAgICBwb3NpdGlvbjogc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgdmVsb2NpdHk6IHNwZWVkVHJhY2tlci52ZWxvY2l0eSxcbiAgICAgICAgICBkaXJlY3Rpb246IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFRyaWdnZXIgcmVuZGVyXG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcz8uKCk7XG5cbiAgICAgICAgLy8gU3RhcnQgaWRsZSBkZXRlY3Rpb24gaWYgbm90IHNjcm9sbGluZ1xuICAgICAgICBpZiAoIWlzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgaXNTY3JvbGxpbmcgPSB0cnVlO1xuICAgICAgICAgIHN0YXJ0SWRsZURldGVjdGlvbigpO1xuICAgICAgICB9XG4gICAgICAgIGxhc3RTY3JvbGxUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gRXhwb3NlIHNjcm9sbGluZyBzdGF0ZSBmb3Igb3RoZXIgZmVhdHVyZXNcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc2Nyb2xsaW5nU3RhdGUgPSB7XG4gICAgICBzZXRWZWxvY2l0eVRvWmVybyxcbiAgICB9O1xuXG4gICAgLy8gQWRkIHNjcm9sbEJ5IHRvIHZpZXdwb3J0IEFQSVxuICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeSA9IHNjcm9sbEJ5O1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5nZXRWZWxvY2l0eSA9ICgpID0+IHNwZWVkVHJhY2tlci52ZWxvY2l0eTtcblxuICAgIC8vIEV4cG9zZSBzY3JvbGxpbmcgQVBJXG4gICAgKGNvbXBvbmVudCBhcyBhbnkpLnNjcm9sbGluZyA9IHtcbiAgICAgIGhhbmRsZVdoZWVsLFxuICAgICAgc2Nyb2xsVG9Qb3NpdGlvbixcbiAgICAgIHNjcm9sbFRvSW5kZXgsXG4gICAgICBzY3JvbGxUb1BhZ2UsXG4gICAgICBzY3JvbGxCeSxcbiAgICAgIGdldFNjcm9sbFBvc2l0aW9uOiAoKSA9PiBzY3JvbGxQb3NpdGlvbixcbiAgICAgIHVwZGF0ZVNjcm9sbEJvdW5kcyxcbiAgICAgIGdldFZlbG9jaXR5OiAoKSA9PiBzcGVlZFRyYWNrZXIudmVsb2NpdHksXG4gICAgICBnZXREaXJlY3Rpb246ICgpID0+IHNwZWVkVHJhY2tlci5kaXJlY3Rpb24sXG4gICAgICBpc1Njcm9sbGluZzogKCkgPT4gaXNTY3JvbGxpbmcsXG4gICAgfTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9tb21lbnR1bS50c1xuXG4vKipcbiAqIE1vbWVudHVtIEZlYXR1cmUgLSBBZGRzIGluZXJ0aWFsIHNjcm9sbGluZyB0byB2aWV3cG9ydFxuICogUHJvdmlkZXMgc21vb3RoIGRlY2VsZXJhdGlvbiBhZnRlciB0b3VjaC9tb3VzZSBkcmFnIGdlc3R1cmVzXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWaWV3cG9ydENvbXBvbmVudCwgVmlld3BvcnRDb250ZXh0IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWSUVXUE9SVF9DT05TVEFOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmludGVyZmFjZSBNb21lbnR1bUNvbmZpZyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBkZWNlbGVyYXRpb24/OiBudW1iZXI7XG4gIG1pblZlbG9jaXR5PzogbnVtYmVyO1xuICBtaW5EdXJhdGlvbj86IG51bWJlcjtcbiAgbWluVmVsb2NpdHlUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKiBTdG9wIG1vbWVudHVtIHdoZW4gY2xpY2tpbmcgb24gdGhlIHZpZXdwb3J0IChkZWZhdWx0OiB0cnVlKSAqL1xuICBzdG9wT25DbGljaz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQWRkcyBtb21lbnR1bSBzY3JvbGxpbmcgdG8gdmlld3BvcnRcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhNb21lbnR1bSA9IChjb25maWc6IE1vbWVudHVtQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGVuYWJsZWQgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uRU5BQkxFRCxcbiAgICAgIGRlY2VsZXJhdGlvbiA9IFZJRVdQT1JUX0NPTlNUQU5UUy5NT01FTlRVTS5ERUNFTEVSQVRJT05fRkFDVE9SLFxuICAgICAgbWluVmVsb2NpdHkgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX1ZFTE9DSVRZLFxuICAgICAgbWluRHVyYXRpb24gPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX0RVUkFUSU9OLFxuICAgICAgbWluVmVsb2NpdHlUaHJlc2hvbGQgPSBWSUVXUE9SVF9DT05TVEFOVFMuTU9NRU5UVU0uTUlOX1ZFTE9DSVRZX1RIUkVTSE9MRCxcbiAgICAgIHN0b3BPbkNsaWNrID0gdHJ1ZSwgLy8gU3RvcCBtb21lbnR1bSBvbiBjbGljayBieSBkZWZhdWx0XG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIEFsd2F5cyBhcHBseSB0aGUgZmVhdHVyZSwgYnV0IGNoZWNrIGlzRW5hYmxlZCBhdCBydW50aW1lXG5cbiAgICAvLyBNb21lbnR1bSBzdGF0ZVxuICAgIGxldCBtb21lbnR1bUFuaW1hdGlvbklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNUb3VjaGluZyA9IGZhbHNlO1xuICAgIGxldCBpc01vdXNlRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBsZXQgbGFzdFRvdWNoUG9zaXRpb24gPSAwO1xuICAgIGxldCBsYXN0TW91c2VQb3NpdGlvbiA9IDA7XG4gICAgbGV0IHRvdWNoU3RhcnRUaW1lID0gMDtcbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogYW55O1xuICAgIGxldCBzY3JvbGxpbmdTdGF0ZTogYW55O1xuICAgIGxldCBpc0VuYWJsZWQgPSBlbmFibGVkOyAvLyBUcmFjayBjdXJyZW50IGVuYWJsZWQgc3RhdGVcblxuICAgIC8vIEdldCByZWZlcmVuY2VzIGFmdGVyIGluaXRpYWxpemF0aW9uXG4gICAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXRpYWxpemUoKTtcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBHZXQgdmlld3BvcnQgYW5kIHNjcm9sbGluZyBzdGF0ZXNcbiAgICAgIHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICBzY3JvbGxpbmdTdGF0ZSA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KS5zY3JvbGxpbmdTdGF0ZTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfTtcblxuICAgIC8vIFN0b3AgbW9tZW50dW0gYW5pbWF0aW9uIChjYW4gYmUgY2FsbGVkIGV4dGVybmFsbHkpXG4gICAgY29uc3Qgc3RvcE1vbWVudHVtID0gKCkgPT4ge1xuICAgICAgaWYgKG1vbWVudHVtQW5pbWF0aW9uSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobW9tZW50dW1BbmltYXRpb25JZCk7XG4gICAgICAgIG1vbWVudHVtQW5pbWF0aW9uSWQgPSBudWxsO1xuICAgICAgICAvLyBSZXNldCB2ZWxvY2l0eSBpbiBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgICBpZiAoc2Nyb2xsaW5nU3RhdGUpIHtcbiAgICAgICAgICBzY3JvbGxpbmdTdGF0ZS5zZXRWZWxvY2l0eVRvWmVybz8uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU3RhcnQgbW9tZW50dW0gYW5pbWF0aW9uXG4gICAgY29uc3Qgc3RhcnRNb21lbnR1bSA9IChpbml0aWFsVmVsb2NpdHk6IG51bWJlcikgPT4ge1xuICAgICAgLy8gQ2FuY2VsIGFueSBleGlzdGluZyBtb21lbnR1bVxuICAgICAgaWYgKG1vbWVudHVtQW5pbWF0aW9uSWQpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUobW9tZW50dW1BbmltYXRpb25JZCk7XG4gICAgICB9XG5cbiAgICAgIGxldCB2ZWxvY2l0eSA9IGluaXRpYWxWZWxvY2l0eTtcblxuICAgICAgY29uc3QgYW5pbWF0ZSA9ICgpID0+IHtcbiAgICAgICAgLy8gQXBwbHkgZGVjZWxlcmF0aW9uXG4gICAgICAgIHZlbG9jaXR5ICo9IGRlY2VsZXJhdGlvbjtcblxuICAgICAgICAvLyBTdG9wIGlmIHZlbG9jaXR5IGlzIHRvbyBzbWFsbFxuICAgICAgICBpZiAoTWF0aC5hYnModmVsb2NpdHkpIDwgbWluVmVsb2NpdHkpIHtcbiAgICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgICAgICAvLyBSZXNldCB2ZWxvY2l0eSBpbiBzY3JvbGxpbmcgZmVhdHVyZVxuICAgICAgICAgIGlmIChzY3JvbGxpbmdTdGF0ZSkge1xuICAgICAgICAgICAgc2Nyb2xsaW5nU3RhdGUuc2V0VmVsb2NpdHlUb1plcm8/LigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxjdWxhdGUgc2Nyb2xsIGRlbHRhICh2ZWxvY2l0eSBpcyBpbiBweC9tcywgc28gbXVsdGlwbHkgYnkgZnJhbWUgdGltZSlcbiAgICAgICAgY29uc3QgZnJhbWVEZWx0YSA9IHZlbG9jaXR5ICogVklFV1BPUlRfQ09OU1RBTlRTLk1PTUVOVFVNLkZSQU1FX1RJTUU7XG5cbiAgICAgICAgLy8gVXNlIHNjcm9sbGluZyBmZWF0dXJlJ3MgQVBJIHRvIHVwZGF0ZSBwb3NpdGlvblxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KGZyYW1lRGVsdGEpO1xuXG4gICAgICAgICAgLy8gQ29udGludWUgYW5pbWF0aW9uXG4gICAgICAgICAgbW9tZW50dW1BbmltYXRpb25JZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBObyBzY3JvbGxCeSBtZXRob2QsIHN0b3AgbW9tZW50dW1cbiAgICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgbW9tZW50dW1BbmltYXRpb25JZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTtcbiAgICB9O1xuXG4gICAgLy8gVG91Y2ggZXZlbnQgaGFuZGxlcnNcbiAgICBjb25zdCBoYW5kbGVUb3VjaFN0YXJ0ID0gKGU6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGlzVG91Y2hpbmcgPSB0cnVlO1xuICAgICAgY29uc3QgdG91Y2ggPSBlLnRvdWNoZXNbMF07XG4gICAgICBjb25zdCBvcmllbnRhdGlvbiA9IHZpZXdwb3J0U3RhdGU/Lm9yaWVudGF0aW9uIHx8IFwidmVydGljYWxcIjtcbiAgICAgIGxhc3RUb3VjaFBvc2l0aW9uID1cbiAgICAgICAgb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IHRvdWNoLmNsaWVudFkgOiB0b3VjaC5jbGllbnRYO1xuICAgICAgdG91Y2hTdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuXG4gICAgICAvLyBDYW5jZWwgYW55IG9uZ29pbmcgbW9tZW50dW1cbiAgICAgIGlmIChtb21lbnR1bUFuaW1hdGlvbklkKSB7XG4gICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKG1vbWVudHVtQW5pbWF0aW9uSWQpO1xuICAgICAgICBtb21lbnR1bUFuaW1hdGlvbklkID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gKGU6IFRvdWNoRXZlbnQpID0+IHtcbiAgICAgIGlmICghaXNUb3VjaGluZykgcmV0dXJuO1xuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7IC8vIFByZXZlbnQgbmF0aXZlIHNjcm9sbGluZ1xuXG4gICAgICBjb25zdCB0b3VjaCA9IGUudG91Y2hlc1swXTtcbiAgICAgIGNvbnN0IG9yaWVudGF0aW9uID0gdmlld3BvcnRTdGF0ZT8ub3JpZW50YXRpb24gfHwgXCJ2ZXJ0aWNhbFwiO1xuICAgICAgY29uc3QgY3VycmVudFBvc2l0aW9uID1cbiAgICAgICAgb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IHRvdWNoLmNsaWVudFkgOiB0b3VjaC5jbGllbnRYO1xuICAgICAgY29uc3QgZGVsdGEgPSBsYXN0VG91Y2hQb3NpdGlvbiAtIGN1cnJlbnRQb3NpdGlvbjsgLy8gSW52ZXJ0ZWQgZm9yIG5hdHVyYWwgc2Nyb2xsaW5nXG4gICAgICBsYXN0VG91Y2hQb3NpdGlvbiA9IGN1cnJlbnRQb3NpdGlvbjtcblxuICAgICAgLy8gVXNlIHNjcm9sbGluZyBmZWF0dXJlJ3MgQVBJICgxOjEgdG91Y2gtdG8tc2Nyb2xsIGZvciBuYXR1cmFsIGZlZWwpXG4gICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbEJ5KSB7XG4gICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeShkZWx0YSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGhhbmRsZVRvdWNoRW5kID0gKCkgPT4ge1xuICAgICAgaWYgKCFpc1RvdWNoaW5nKSByZXR1cm47XG4gICAgICBpc1RvdWNoaW5nID0gZmFsc2U7XG5cbiAgICAgIGNvbnN0IHRvdWNoRW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCB0b3VjaER1cmF0aW9uID0gdG91Y2hFbmRUaW1lIC0gdG91Y2hTdGFydFRpbWU7XG5cbiAgICAgIC8vIEdldCBjdXJyZW50IHZlbG9jaXR5IGZyb20gc2Nyb2xsaW5nIGZlYXR1cmVcbiAgICAgIGNvbnN0IHZlbG9jaXR5ID0gY29tcG9uZW50LnZpZXdwb3J0LmdldFZlbG9jaXR5Py4oKSB8fCAwO1xuXG4gICAgICAvLyBPbmx5IHN0YXJ0IG1vbWVudHVtIGlmIHRoZSB0b3VjaCB3YXMgcXVpY2sgZW5vdWdoIGFuZCB3ZSBoYXZlIHZlbG9jaXR5XG4gICAgICBpZiAoXG4gICAgICAgIHRvdWNoRHVyYXRpb24gPCBtaW5EdXJhdGlvbiAmJlxuICAgICAgICBNYXRoLmFicyh2ZWxvY2l0eSkgPiBtaW5WZWxvY2l0eVRocmVzaG9sZFxuICAgICAgKSB7XG4gICAgICAgIHN0YXJ0TW9tZW50dW0odmVsb2NpdHkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgY2xpY2sgdG8gc3RvcCBtb21lbnR1bSAod2l0aG91dCBwcmV2ZW50aW5nIHNlbGVjdGlvbilcbiAgICBjb25zdCBoYW5kbGVDbGljayA9IChfZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgc3RvcE1vbWVudHVtKCk7XG4gICAgfTtcblxuICAgIC8vIE1vdXNlIGV2ZW50IGhhbmRsZXJzIGZvciBkZXNrdG9wXG4gICAgY29uc3QgaGFuZGxlTW91c2VEb3duID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlzTW91c2VEcmFnZ2luZyA9IHRydWU7XG4gICAgICBjb25zdCBvcmllbnRhdGlvbiA9IHZpZXdwb3J0U3RhdGU/Lm9yaWVudGF0aW9uIHx8IFwidmVydGljYWxcIjtcbiAgICAgIGxhc3RNb3VzZVBvc2l0aW9uID0gb3JpZW50YXRpb24gPT09IFwidmVydGljYWxcIiA/IGUuY2xpZW50WSA6IGUuY2xpZW50WDtcbiAgICAgIHRvdWNoU3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcblxuICAgICAgLy8gQ2FuY2VsIGFueSBvbmdvaW5nIG1vbWVudHVtXG4gICAgICBzdG9wTW9tZW50dW0oKTtcblxuICAgICAgLy8gUHJldmVudCB0ZXh0IHNlbGVjdGlvblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZU1vdmUgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgaWYgKCFpc01vdXNlRHJhZ2dpbmcpIHJldHVybjtcblxuICAgICAgY29uc3Qgb3JpZW50YXRpb24gPSB2aWV3cG9ydFN0YXRlPy5vcmllbnRhdGlvbiB8fCBcInZlcnRpY2FsXCI7XG4gICAgICBjb25zdCBjdXJyZW50UG9zaXRpb24gPVxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gXCJ2ZXJ0aWNhbFwiID8gZS5jbGllbnRZIDogZS5jbGllbnRYO1xuICAgICAgY29uc3QgZGVsdGEgPSBsYXN0TW91c2VQb3NpdGlvbiAtIGN1cnJlbnRQb3NpdGlvbjtcbiAgICAgIGxhc3RNb3VzZVBvc2l0aW9uID0gY3VycmVudFBvc2l0aW9uO1xuXG4gICAgICAvLyBVc2Ugc2Nyb2xsaW5nIGZlYXR1cmUncyBBUEkgKDE6MSBkcmFnLXRvLXNjcm9sbCBmb3IgbmF0dXJhbCBmZWVsKVxuICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxCeSkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsQnkoZGVsdGEpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVNb3VzZVVwID0gKCkgPT4ge1xuICAgICAgaWYgKCFpc01vdXNlRHJhZ2dpbmcpIHJldHVybjtcbiAgICAgIGlzTW91c2VEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgICBjb25zdCBtb3VzZVVwVGltZSA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBkcmFnRHVyYXRpb24gPSBtb3VzZVVwVGltZSAtIHRvdWNoU3RhcnRUaW1lO1xuXG4gICAgICAvLyBHZXQgY3VycmVudCB2ZWxvY2l0eSBmcm9tIHNjcm9sbGluZyBmZWF0dXJlXG4gICAgICBjb25zdCB2ZWxvY2l0eSA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRWZWxvY2l0eT8uKCkgfHwgMDtcblxuICAgICAgLy8gU3RhcnQgbW9tZW50dW0gZm9yIHF1aWNrIGRyYWdzXG4gICAgICBpZiAoXG4gICAgICAgIGRyYWdEdXJhdGlvbiA8IG1pbkR1cmF0aW9uICYmXG4gICAgICAgIE1hdGguYWJzKHZlbG9jaXR5KSA+IG1pblZlbG9jaXR5VGhyZXNob2xkXG4gICAgICApIHtcbiAgICAgICAgc3RhcnRNb21lbnR1bSh2ZWxvY2l0eSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIE92ZXJyaWRlIGluaXRpYWxpemUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyc1xuICAgIGNvbnN0IG9yaWdpbmFsSW5pdCA9IGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gb3JpZ2luYWxJbml0KCk7XG4gICAgICAvLyBTa2lwIGlmIGFscmVhZHkgaW5pdGlhbGl6ZWRcbiAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgdmlld3BvcnRFbGVtZW50ID1cbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLnZpZXdwb3J0RWxlbWVudCB8fFxuICAgICAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU/LnZpZXdwb3J0RWxlbWVudDtcblxuICAgICAgaWYgKHZpZXdwb3J0RWxlbWVudCkge1xuICAgICAgICAvLyBUb3VjaCBldmVudHNcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIGhhbmRsZVRvdWNoU3RhcnQsIHtcbiAgICAgICAgICBwYXNzaXZlOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlLCB7XG4gICAgICAgICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICB2aWV3cG9ydEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIGhhbmRsZVRvdWNoRW5kLCB7XG4gICAgICAgICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gTW91c2UgZXZlbnRzIGZvciBkZXNrdG9wIGRyYWdnaW5nXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZU1vdXNlRG93bik7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZWxlYXZlXCIsIGhhbmRsZU1vdXNlVXApO1xuXG4gICAgICAgIC8vIEFkZCBjbGljayBsaXN0ZW5lciB0byBzdG9wIG1vbWVudHVtIG9uIGNsaWNrICh3aXRob3V0IGJsb2NraW5nIHNlbGVjdGlvbilcbiAgICAgICAgaWYgKHN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVDbGljayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdG9yZSByZWZlcmVuY2UgZm9yIGNsZWFudXBcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVZpZXdwb3J0RWxlbWVudCA9IHZpZXdwb3J0RWxlbWVudDtcbiAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVN0b3BPbkNsaWNrID0gc3RvcE9uQ2xpY2s7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIENsZWFuIHVwIG9uIGRlc3Ryb3lcbiAgICBpZiAoXCJkZXN0cm95XCIgaW4gY29tcG9uZW50ICYmIHR5cGVvZiBjb21wb25lbnQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnQuZGVzdHJveTtcbiAgICAgIGNvbXBvbmVudC5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBSZW1vdmUgZXZlbnQgbGlzdGVuZXJzXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0RWxlbWVudCA9IChjb21wb25lbnQgYXMgYW55KS5fbW9tZW50dW1WaWV3cG9ydEVsZW1lbnQ7XG4gICAgICAgIGlmICh2aWV3cG9ydEVsZW1lbnQpIHtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgaGFuZGxlVG91Y2hTdGFydCk7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIGhhbmRsZVRvdWNoRW5kKTtcbiAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBoYW5kbGVNb3VzZURvd24pO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgICAgdmlld3BvcnRFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgICAgICAgIHZpZXdwb3J0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2VsZWF2ZVwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLl9tb21lbnR1bVN0b3BPbkNsaWNrKSB7XG4gICAgICAgICAgICB2aWV3cG9ydEVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUNsaWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYW5jZWwgbW9tZW50dW0gYW5pbWF0aW9uXG4gICAgICAgIHN0b3BNb21lbnR1bSgpO1xuXG4gICAgICAgIG9yaWdpbmFsRGVzdHJveSgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBFeHBvc2UgbW9tZW50dW0gc3RhdGUgZm9yIG90aGVyIGZlYXR1cmVzXG4gICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLm1vbWVudHVtU3RhdGUgPSB7XG4gICAgICBzdG9wTW9tZW50dW0sXG4gICAgfTtcblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9zY3JvbGxiYXIudHNcblxuLyoqXG4gKiBTY3JvbGxiYXIgRmVhdHVyZSAtIEN1c3RvbSBzY3JvbGxiYXIgaW1wbGVtZW50YXRpb25cbiAqIFByb3ZpZGVzIHZpc3VhbCBzY3JvbGwgaW5kaWNhdGlvbiBhbmQgZHJhZy10by1zY3JvbGwgZnVuY3Rpb25hbGl0eVxuICovXG5cbmltcG9ydCB0eXBlIHsgVmlld3BvcnRDb250ZXh0LCBWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgd3JhcEluaXRpYWxpemUsIHdyYXBEZXN0cm95LCBzdG9yZUZlYXR1cmVGdW5jdGlvbiB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBQUkVGSVgsIGFkZENsYXNzLCByZW1vdmVDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsYmFyQ29uZmlnIHtcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIGF1dG9IaWRlPzogYm9vbGVhbjtcbiAgdGh1bWJNaW5IZWlnaHQ/OiBudW1iZXI7XG4gIHRodW1iQ29sb3I/OiBzdHJpbmc7XG4gIHRyYWNrQ29sb3I/OiBzdHJpbmc7XG4gIGJvcmRlclJhZGl1cz86IG51bWJlcjtcbiAgZmFkZVRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2Nyb2xsYmFyQ29tcG9uZW50IHtcbiAgc2Nyb2xsYmFyOiB7XG4gICAgc2hvdzogKCkgPT4gdm9pZDtcbiAgICBoaWRlOiAoKSA9PiB2b2lkO1xuICAgIHVwZGF0ZUJvdW5kczogKHRvdGFsVmlydHVhbFNpemU6IG51bWJlciwgY29udGFpbmVyU2l6ZTogbnVtYmVyKSA9PiB2b2lkO1xuICAgIHVwZGF0ZVBvc2l0aW9uOiAoc2Nyb2xsUG9zaXRpb246IG51bWJlcikgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIHNjcm9sbGJhciBmdW5jdGlvbmFsaXR5IHRvIHZpZXdwb3J0IGNvbXBvbmVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNjcm9sbGJhcihjb25maWc6IFNjcm9sbGJhckNvbmZpZyA9IHt9KSB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFRcbiAgKTogVCAmIFNjcm9sbGJhckNvbXBvbmVudCA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgZW5hYmxlZCA9IHRydWUsXG4gICAgICBhdXRvSGlkZSA9IHRydWUsXG4gICAgICB0aHVtYk1pbkhlaWdodCA9IDI1LFxuICAgICAgYm9yZGVyUmFkaXVzID0gNCxcbiAgICAgIGZhZGVUaW1lb3V0ID0gMTAwMCxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gUmV0dXJuIG5vLW9wIGlmIGRpc2FibGVkXG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb21wb25lbnQsXG4gICAgICAgIHNjcm9sbGJhcjoge1xuICAgICAgICAgIHNob3c6ICgpID0+IHt9LFxuICAgICAgICAgIGhpZGU6ICgpID0+IHt9LFxuICAgICAgICAgIHVwZGF0ZUJvdW5kczogKCkgPT4ge30sXG4gICAgICAgICAgdXBkYXRlUG9zaXRpb246ICgpID0+IHt9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCB2aWV3cG9ydEVsZW1lbnQ6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IHNjcm9sbGJhclRyYWNrOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICAgIGxldCBzY3JvbGxiYXJUaHVtYjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgbGV0IGRyYWdTdGFydFkgPSAwO1xuICAgIGxldCBkcmFnU3RhcnRTY3JvbGxQb3NpdGlvbiA9IDA7XG4gICAgbGV0IGhpZGVUaW1lb3V0OiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuICAgIGxldCB0b3RhbFZpcnR1YWxTaXplID0gMDtcbiAgICBsZXQgY29udGFpbmVyU2l6ZSA9IDA7XG4gICAgbGV0IHRodW1iSGVpZ2h0ID0gMDtcbiAgICBsZXQgYW5pbWF0aW9uRnJhbWVJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbjogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlzQ3Vyc29yTW9kZSA9IGZhbHNlO1xuICAgIGxldCBsb2FkZWRJdGVtc0NvdW50ID0gMDtcblxuICAgIC8vIENyZWF0ZSBzY3JvbGxiYXIgZWxlbWVudHNcbiAgICBjb25zdCBjcmVhdGVTY3JvbGxiYXJFbGVtZW50cyA9ICgpID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSByZXR1cm47XG5cbiAgICAgIHNjcm9sbGJhclRyYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGFkZENsYXNzKHNjcm9sbGJhclRyYWNrLCBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSKTtcbiAgICAgIHNjcm9sbGJhclRyYWNrLnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB6LWluZGV4OiAxMDtcbiAgICAgIGA7XG5cbiAgICAgIHNjcm9sbGJhclRodW1iID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcblxuICAgICAgYWRkQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRodW1iLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1RIVU1CXG4gICAgICApO1xuXG4gICAgICBzY3JvbGxiYXJUcmFjay5hcHBlbmRDaGlsZChzY3JvbGxiYXJUaHVtYik7XG4gICAgICB2aWV3cG9ydEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2Nyb2xsYmFyVHJhY2spO1xuICAgIH07XG5cbiAgICAvLyBTaG93L2hpZGUgZnVuY3Rpb25zXG4gICAgY29uc3Qgc2hvdyA9ICgpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgdG90YWxWaXJ0dWFsU2l6ZSA8PSBjb250YWluZXJTaXplKSByZXR1cm47XG5cbiAgICAgIGlmIChoaWRlVGltZW91dCkge1xuICAgICAgICBjbGVhclRpbWVvdXQoaGlkZVRpbWVvdXQpO1xuICAgICAgICBoaWRlVGltZW91dCA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGFkZENsYXNzKFxuICAgICAgICBzY3JvbGxiYXJUcmFjayxcbiAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNDUk9MTEJBUi5DTEFTU0VTLlNDUk9MTEJBUl9WSVNJQkxFXG4gICAgICApO1xuXG4gICAgICBpZiAoYXV0b0hpZGUgJiYgIWlzRHJhZ2dpbmcpIHtcbiAgICAgICAgaGlkZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGhpZGUsIGZhZGVUaW1lb3V0KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGlkZSA9ICgpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgaXNEcmFnZ2luZykgcmV0dXJuO1xuICAgICAgcmVtb3ZlQ2xhc3MoXG4gICAgICAgIHNjcm9sbGJhclRyYWNrLFxuICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX1ZJU0lCTEVcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSBzY3JvbGxiYXIgYm91bmRzXG4gICAgY29uc3QgdXBkYXRlQm91bmRzID0gKG5ld1RvdGFsU2l6ZTogbnVtYmVyLCBuZXdDb250YWluZXJTaXplOiBudW1iZXIpID0+IHtcbiAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBuZXdUb3RhbFNpemU7XG4gICAgICBjb250YWluZXJTaXplID0gbmV3Q29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKCFzY3JvbGxiYXJUcmFjayB8fCAhc2Nyb2xsYmFyVGh1bWIpIHJldHVybjtcblxuICAgICAgY29uc3QgbmVlZHNTY3JvbGxiYXIgPSB0b3RhbFZpcnR1YWxTaXplID4gY29udGFpbmVyU2l6ZTtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGJhcl0gdXBkYXRlQm91bmRzOiB0b3RhbFNpemU9JHt0b3RhbFZpcnR1YWxTaXplfSwgY29udGFpbmVyU2l6ZT0ke2NvbnRhaW5lclNpemV9LCBuZWVkc1Njcm9sbGJhcj0ke25lZWRzU2Nyb2xsYmFyfWBcbiAgICAgIC8vICk7XG4gICAgICBzY3JvbGxiYXJUcmFjay5zdHlsZS5kaXNwbGF5ID0gbmVlZHNTY3JvbGxiYXIgPyBcImJsb2NrXCIgOiBcIm5vbmVcIjtcblxuICAgICAgaWYgKG5lZWRzU2Nyb2xsYmFyKSB7XG4gICAgICAgIGxldCBzY3JvbGxSYXRpbzogbnVtYmVyO1xuXG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUgJiYgbG9hZGVkSXRlbXNDb3VudCA+IDApIHtcbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIG1vZGUsIHRodW1iIHNpemUgcmVwcmVzZW50cyBsb2FkZWQgY29udGVudCB2cyBlc3RpbWF0ZWQgdG90YWxcbiAgICAgICAgICAvLyBJZiB3ZSBkb24ndCBrbm93IHRvdGFsLCB1c2UgbG9hZGVkIGl0ZW1zICogMiBhcyBlc3RpbWF0ZVxuICAgICAgICAgIGNvbnN0IGVzdGltYXRlZFRvdGFsID1cbiAgICAgICAgICAgIHRvdGFsVmlydHVhbFNpemUgPiAwID8gdG90YWxWaXJ0dWFsU2l6ZSA6IGxvYWRlZEl0ZW1zQ291bnQgKiAyO1xuICAgICAgICAgIHNjcm9sbFJhdGlvID1cbiAgICAgICAgICAgIGNvbnRhaW5lclNpemUgL1xuICAgICAgICAgICAgTWF0aC5tYXgoZXN0aW1hdGVkVG90YWwsIGxvYWRlZEl0ZW1zQ291bnQgKyBjb250YWluZXJTaXplKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBOb3JtYWwgY2FsY3VsYXRpb24gZm9yIG9mZnNldC9wYWdlIHN0cmF0ZWdpZXNcbiAgICAgICAgICBzY3JvbGxSYXRpbyA9IGNvbnRhaW5lclNpemUgLyB0b3RhbFZpcnR1YWxTaXplO1xuICAgICAgICB9XG5cbiAgICAgICAgdGh1bWJIZWlnaHQgPSBNYXRoLm1heCh0aHVtYk1pbkhlaWdodCwgc2Nyb2xsUmF0aW8gKiBjb250YWluZXJTaXplKTtcbiAgICAgICAgc2Nyb2xsYmFyVGh1bWIuc3R5bGUuaGVpZ2h0ID0gYCR7dGh1bWJIZWlnaHR9cHhgO1xuICAgICAgICB1cGRhdGVQb3NpdGlvbihjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFVwZGF0ZSB0aHVtYiBwb3NpdGlvblxuICAgIGNvbnN0IHVwZGF0ZVBvc2l0aW9uID0gKHNjcm9sbFBvczogbnVtYmVyKSA9PiB7XG4gICAgICBpZiAoIXNjcm9sbGJhclRodW1iIHx8ICFzY3JvbGxiYXJUcmFjaykgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzY3JvbGxhYmxlRGlzdGFuY2UgPSB0b3RhbFZpcnR1YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgIGlmIChzY3JvbGxhYmxlRGlzdGFuY2UgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IE1hdGgubWluKFxuICAgICAgICAxLFxuICAgICAgICBNYXRoLm1heCgwLCBzY3JvbGxQb3MgLyBzY3JvbGxhYmxlRGlzdGFuY2UpXG4gICAgICApO1xuICAgICAgY29uc3QgbWF4VGh1bWJQb3NpdGlvbiA9XG4gICAgICAgIHNjcm9sbGJhclRyYWNrLmNsaWVudEhlaWdodCAtIHNjcm9sbGJhclRodW1iLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHRodW1iUG9zaXRpb24gPSBzY3JvbGxSYXRpbyAqIG1heFRodW1iUG9zaXRpb247XG5cbiAgICAgIHNjcm9sbGJhclRodW1iLnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVZKCR7dGh1bWJQb3NpdGlvbn1weClgO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdHJhY2sgY2xpY2tcbiAgICBjb25zdCBoYW5kbGVUcmFja0NsaWNrID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghc2Nyb2xsYmFyVHJhY2sgfHwgIXNjcm9sbGJhclRodW1iIHx8IGUudGFyZ2V0ID09PSBzY3JvbGxiYXJUaHVtYilcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjb25zdCB0cmFja1JlY3QgPSBzY3JvbGxiYXJUcmFjay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IGNsaWNrWSA9IGUuY2xpZW50WSAtIHRyYWNrUmVjdC50b3A7XG4gICAgICBjb25zdCB0aHVtYkNlbnRlclkgPSBjbGlja1kgLSB0aHVtYkhlaWdodCAvIDI7XG4gICAgICBjb25zdCBtYXhUaHVtYlBvc2l0aW9uID0gY29udGFpbmVyU2l6ZSAtIHRodW1iSGVpZ2h0O1xuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICBNYXRoLm1pbih0aHVtYkNlbnRlclksIG1heFRodW1iUG9zaXRpb24pXG4gICAgICApO1xuICAgICAgY29uc3Qgc2Nyb2xsUmF0aW8gPSB0aHVtYlBvc2l0aW9uIC8gbWF4VGh1bWJQb3NpdGlvbjtcbiAgICAgIGNvbnN0IHRhcmdldFNjcm9sbFBvc2l0aW9uID1cbiAgICAgICAgc2Nyb2xsUmF0aW8gKiAodG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuXG4gICAgICBjb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvUG9zaXRpb24odGFyZ2V0U2Nyb2xsUG9zaXRpb24pO1xuICAgIH07XG5cbiAgICAvLyBNb3VzZSBldmVudCBoYW5kbGVyc1xuICAgIGNvbnN0IGhhbmRsZVRodW1iTW91c2VEb3duID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgZHJhZ1N0YXJ0WSA9IGUuY2xpZW50WTtcbiAgICAgIGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRTY3JvbGxQb3NpdGlvbigpIHx8IDA7XG5cbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICBhZGRDbGFzcyhcbiAgICAgICAgICBzY3JvbGxiYXJUcmFjayxcbiAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuU0NST0xMQkFSLkNMQVNTRVMuU0NST0xMQkFSX0RSQUdHSU5HXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQgZHJhZyBzdGFydCBldmVudCB0byBub3RpZnkgdmlld3BvcnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpkcmFnLXN0YXJ0XCIsIHtcbiAgICAgICAgc291cmNlOiBcInNjcm9sbGJhclwiLFxuICAgICAgICBzdGFydFBvc2l0aW9uOiBkcmFnU3RhcnRTY3JvbGxQb3NpdGlvbixcbiAgICAgIH0pO1xuXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VNb3ZlID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmICghaXNEcmFnZ2luZyB8fCAhc2Nyb2xsYmFyVHJhY2sgfHwgIXNjcm9sbGJhclRodW1iKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGRlbHRhWSA9IGUuY2xpZW50WSAtIGRyYWdTdGFydFk7XG4gICAgICBjb25zdCB0cmFja0hlaWdodCA9IHNjcm9sbGJhclRyYWNrLmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHRodW1iSGVpZ2h0ID0gc2Nyb2xsYmFyVGh1bWIuY2xpZW50SGVpZ2h0O1xuICAgICAgY29uc3QgbWF4VGh1bWJUcmF2ZWwgPSB0cmFja0hlaWdodCAtIHRodW1iSGVpZ2h0O1xuXG4gICAgICBpZiAobWF4VGh1bWJUcmF2ZWwgPD0gMCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBkZWx0YVJhdGlvID0gZGVsdGFZIC8gbWF4VGh1bWJUcmF2ZWw7XG4gICAgICBjb25zdCBkcmFnU3RhcnRTY3JvbGxSYXRpbyA9XG4gICAgICAgIGRyYWdTdGFydFNjcm9sbFBvc2l0aW9uIC8gKHRvdGFsVmlydHVhbFNpemUgLSBjb250YWluZXJTaXplKTtcbiAgICAgIGNvbnN0IG5ld1Njcm9sbFJhdGlvID0gTWF0aC5tYXgoXG4gICAgICAgIDAsXG4gICAgICAgIE1hdGgubWluKDEsIGRyYWdTdGFydFNjcm9sbFJhdGlvICsgZGVsdGFSYXRpbylcbiAgICAgICk7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aHVtYiBwb3NpdGlvbiBpbW1lZGlhdGVseVxuICAgICAgY29uc3QgdGh1bWJQb3NpdGlvbiA9IG5ld1Njcm9sbFJhdGlvICogbWF4VGh1bWJUcmF2ZWw7XG4gICAgICBzY3JvbGxiYXJUaHVtYi5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke3RodW1iUG9zaXRpb259cHgpYDtcblxuICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBzY3JvbGwgcG9zaXRpb25cbiAgICAgIGNvbnN0IG5ld1Bvc2l0aW9uID0gbmV3U2Nyb2xsUmF0aW8gKiAodG90YWxWaXJ0dWFsU2l6ZSAtIGNvbnRhaW5lclNpemUpO1xuICAgICAgbGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uID0gbmV3UG9zaXRpb247XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW1Njcm9sbGJhcl0gTW91c2UgbW92ZTogbmV3UG9zPSR7bmV3UG9zaXRpb24udG9GaXhlZChcbiAgICAgIC8vICAgICAwXG4gICAgICAvLyAgICl9LCBhbmltYXRpb25GcmFtZUlkPSR7YW5pbWF0aW9uRnJhbWVJZH1gXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBUaHJvdHRsZSB2aWV3cG9ydCB1cGRhdGVzXG4gICAgICBpZiAoYW5pbWF0aW9uRnJhbWVJZCA9PT0gbnVsbCAmJiBjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgYW5pbWF0aW9uRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW1Njcm9sbGJhcl0gUkFGIGNhbGxiYWNrOiBzY3JvbGxpbmcgdG8gJHtsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb259YFxuICAgICAgICAgIC8vICk7XG4gICAgICAgICAgaWYgKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbiAhPT0gbnVsbCAmJiBjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb1Bvc2l0aW9uKGxhc3RSZXF1ZXN0ZWRTY3JvbGxQb3NpdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlTW91c2VVcCA9ICgpID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFwiW1Njcm9sbGJhcl0gTW91c2UgdXAgLSBlbmRpbmcgZHJhZ1wiKTtcbiAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcblxuICAgICAgaWYgKGFuaW1hdGlvbkZyYW1lSWQgIT09IG51bGwpIHtcbiAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoYW5pbWF0aW9uRnJhbWVJZCk7XG4gICAgICAgIGFuaW1hdGlvbkZyYW1lSWQgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAobGFzdFJlcXVlc3RlZFNjcm9sbFBvc2l0aW9uICE9PSBudWxsICYmIGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG9Qb3NpdGlvbihsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24pO1xuICAgICAgICBsYXN0UmVxdWVzdGVkU2Nyb2xsUG9zaXRpb24gPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2Nyb2xsYmFyVHJhY2spIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgc2Nyb2xsYmFyVHJhY2ssXG4gICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNDUk9MTEJBUi5DTEFTU0VTLlNDUk9MTEJBUl9EUkFHR0lOR1xuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IGRyYWcgZW5kIGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6ZHJhZy1lbmRcIiwge1xuICAgICAgICBzb3VyY2U6IFwic2Nyb2xsYmFyXCIsXG4gICAgICAgIGVuZFBvc2l0aW9uOiBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCxcbiAgICAgIH0pO1xuXG4gICAgICBoaWRlKCk7XG5cbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIGZ1bmN0aW9uXG4gICAgY29uc3QgaW5pdGlhbGl6ZSA9ICgpID0+IHtcbiAgICAgIGlmIChpc0luaXRpYWxpemVkKSByZXR1cm47XG5cbiAgICAgIHZpZXdwb3J0RWxlbWVudCA9IGNvbXBvbmVudC5lbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydGBcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgIGlmICghdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltTY3JvbGxiYXJdIE5vIHZpZXdwb3J0IGVsZW1lbnQgZm91bmRcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICB2aWV3cG9ydEVsZW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBgLiR7UFJFRklYfS0ke1ZJRVdQT1JUX0NPTlNUQU5UUy5TQ1JPTExCQVIuQ0xBU1NFUy5TQ1JPTExCQVJ9YFxuICAgICAgICApXG4gICAgICApXG4gICAgICAgIHJldHVybjtcblxuICAgICAgY3JlYXRlU2Nyb2xsYmFyRWxlbWVudHMoKTtcbiAgICAgIGlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuXG4gICAgICBpZiAoc2Nyb2xsYmFyVHJhY2sgJiYgdmlld3BvcnRFbGVtZW50KSB7XG4gICAgICAgIHNjcm9sbGJhclRyYWNrLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVUcmFja0NsaWNrKTtcblxuICAgICAgICBpZiAoc2Nyb2xsYmFyVGh1bWIpIHtcbiAgICAgICAgICBzY3JvbGxiYXJUaHVtYi5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZVRodW1iTW91c2VEb3duKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2VlbnRlclwiLCBzaG93LCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gICAgICAgIHZpZXdwb3J0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIFwibW91c2VsZWF2ZVwiLFxuICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgIGlmICghaXNEcmFnZ2luZykgaGlkZSgpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBwYXNzaXZlOiB0cnVlIH1cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGN1cnJlbnQgdmlld3BvcnQgc3RhdGVcbiAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQpIHtcbiAgICAgICAgY29uc3QgaW5mbyA9IGNvbXBvbmVudC52aWV3cG9ydC5nZXRWaWV3cG9ydEluZm8oKTtcbiAgICAgICAgdG90YWxWaXJ0dWFsU2l6ZSA9IGluZm8udG90YWxWaXJ0dWFsU2l6ZTtcbiAgICAgICAgY29udGFpbmVyU2l6ZSA9IGluZm8uY29udGFpbmVyU2l6ZTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBpbiBjdXJzb3IgbW9kZVxuICAgICAgICBjb25zdCBjb2xsZWN0aW9uID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb247XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0Q29uZmlnID0gKGNvbXBvbmVudCBhcyBhbnkpLmNvbmZpZztcbiAgICAgICAgaXNDdXJzb3JNb2RlID0gdmlld3BvcnRDb25maWc/LnBhZ2luYXRpb24/LnN0cmF0ZWd5ID09PSBcImN1cnNvclwiO1xuXG4gICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgdXBkYXRlUG9zaXRpb24oY29tcG9uZW50LnZpZXdwb3J0LmdldFNjcm9sbFBvc2l0aW9uKCkpO1xuICAgICAgfVxuXG4gICAgICAvLyBFdmVudCBsaXN0ZW5lcnNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6c2Nyb2xsXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFpc0RyYWdnaW5nKSB7XG4gICAgICAgICAgdXBkYXRlUG9zaXRpb24oZGF0YS5wb3NpdGlvbik7XG4gICAgICAgICAgc2hvdygpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDp2aXJ0dWFsLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRvdGFsVmlydHVhbFNpemUgPSBkYXRhLnRvdGFsVmlydHVhbFNpemU7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyhkYXRhLnRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6Y29udGFpbmVyLXNpemUtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnRhaW5lclNpemUgPSBkYXRhLmNvbnRhaW5lclNpemU7XG4gICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBkYXRhLmNvbnRhaW5lclNpemUpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbXMgbG9hZGVkIHRvIHVwZGF0ZSBzY3JvbGxiYXIgaW4gY3Vyc29yIG1vZGVcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6aXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUpIHtcbiAgICAgICAgICBsb2FkZWRJdGVtc0NvdW50ID0gZGF0YS5sb2FkZWRDb3VudCB8fCAwO1xuICAgICAgICAgIHVwZGF0ZUJvdW5kcyh0b3RhbFZpcnR1YWxTaXplLCBjb250YWluZXJTaXplKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgdG90YWwgaXRlbXMgY2hhbmdlcyAoaW1wb3J0YW50IGZvciBjdXJzb3IgbW9kZSlcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChpc0N1cnNvck1vZGUgJiYgZGF0YS50b3RhbCkge1xuICAgICAgICAgIC8vIEluIGN1cnNvciBtb2RlLCB0aGUgdG90YWwgaXMgZHluYW1pY1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgYFtTY3JvbGxiYXJdIEN1cnNvciBtb2RlOiB1cGRhdGluZyBib3VuZHMgZm9yIG5ldyB0b3RhbCAke2RhdGEudG90YWx9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQm91bmRzKHRvdGFsVmlydHVhbFNpemUsIGNvbnRhaW5lclNpemUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLy8gU3RvcmUgaW5pdGlhbGl6ZSBmdW5jdGlvblxuICAgIHN0b3JlRmVhdHVyZUZ1bmN0aW9uKGNvbXBvbmVudCwgXCJfc2Nyb2xsYmFySW5pdGlhbGl6ZVwiLCBpbml0aWFsaXplKTtcblxuICAgIC8vIEhvb2sgaW50byB2aWV3cG9ydCBpbml0aWFsaXphdGlvblxuICAgIHdyYXBJbml0aWFsaXplKGNvbXBvbmVudCwgaW5pdGlhbGl6ZSk7XG5cbiAgICAvLyBDbGVhbnVwXG4gICAgY29uc3QgZGVzdHJveSA9ICgpID0+IHtcbiAgICAgIGlmIChzY3JvbGxiYXJUcmFjaykge1xuICAgICAgICBzY3JvbGxiYXJUcmFjay5yZW1vdmUoKTtcbiAgICAgICAgc2Nyb2xsYmFyVHJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgICAgc2Nyb2xsYmFyVGh1bWIgPSBudWxsO1xuICAgICAgdmlld3BvcnRFbGVtZW50ID0gbnVsbDtcbiAgICAgIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKGhpZGVUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7XG4gICAgICAgIGhpZGVUaW1lb3V0ID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLCBoYW5kbGVNb3VzZU1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgaGFuZGxlTW91c2VVcCk7XG4gICAgfTtcblxuICAgIHN0b3JlRmVhdHVyZUZ1bmN0aW9uKGNvbXBvbmVudCwgXCJfc2Nyb2xsYmFyRGVzdHJveVwiLCBkZXN0cm95KTtcbiAgICB3cmFwRGVzdHJveShjb21wb25lbnQsIGRlc3Ryb3kpO1xuXG4gICAgLy8gUmV0dXJuIGVuaGFuY2VkIGNvbXBvbmVudFxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBzY3JvbGxiYXI6IHsgc2hvdywgaGlkZSwgdXBkYXRlQm91bmRzLCB1cGRhdGVQb3NpdGlvbiB9LFxuICAgIH07XG4gIH07XG59XG4iLAogICAgIi8vIHNyYy9jb3JlL3ZpZXdwb3J0L2ZlYXR1cmVzL2NvbGxlY3Rpb24udHNcblxuLyoqXG4gKiBDb2xsZWN0aW9uIEZlYXR1cmUgLSBEYXRhIG1hbmFnZW1lbnQgYW5kIHJhbmdlIGxvYWRpbmdcbiAqIEhhbmRsZXMgY29sbGVjdGlvbiBpbnRlZ3JhdGlvbiwgcGFnaW5hdGlvbiwgYW5kIGRhdGEgZmV0Y2hpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHdyYXBEZXN0cm95IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uQ29uZmlnIHtcbiAgY29sbGVjdGlvbj86IGFueTsgLy8gQ29sbGVjdGlvbiBhZGFwdGVyXG4gIHJhbmdlU2l6ZT86IG51bWJlcjsgLy8gRGVmYXVsdCByYW5nZSBzaXplIGZvciBsb2FkaW5nXG4gIHN0cmF0ZWd5PzogXCJvZmZzZXRcIiB8IFwicGFnZVwiIHwgXCJjdXJzb3JcIjsgLy8gTG9hZGluZyBzdHJhdGVneVxuICB0cmFuc2Zvcm0/OiAoaXRlbTogYW55KSA9PiBhbnk7IC8vIEl0ZW0gdHJhbnNmb3JtYXRpb24gZnVuY3Rpb25cbiAgY2FuY2VsTG9hZFRocmVzaG9sZD86IG51bWJlcjsgLy8gVmVsb2NpdHkgdGhyZXNob2xkIGZvciBjYW5jZWxsaW5nIGxvYWRzXG4gIG1heENvbmN1cnJlbnRSZXF1ZXN0cz86IG51bWJlcjtcbiAgZW5hYmxlUmVxdWVzdFF1ZXVlPzogYm9vbGVhbjtcbiAgbWF4UXVldWVTaXplPzogbnVtYmVyO1xuICBsb2FkT25EcmFnRW5kPzogYm9vbGVhbjsgLy8gRW5hYmxlIGxvYWRpbmcgd2hlbiBkcmFnIGVuZHMgKHNhZmV0eSBtZWFzdXJlKVxuICBpbml0aWFsU2Nyb2xsSW5kZXg/OiBudW1iZXI7IC8vIEluaXRpYWwgc2Nyb2xsIHBvc2l0aW9uICgwLWJhc2VkIGluZGV4KVxuICBzZWxlY3RJZD86IHN0cmluZyB8IG51bWJlcjsgLy8gSUQgb2YgaXRlbSB0byBzZWxlY3QgYWZ0ZXIgaW5pdGlhbCBsb2FkIGNvbXBsZXRlc1xuICBhdXRvTG9hZD86IGJvb2xlYW47IC8vIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBsb2FkIGRhdGEgb24gaW5pdGlhbGl6YXRpb24gKGRlZmF1bHQ6IHRydWUpXG4gIGF1dG9TZWxlY3RGaXJzdD86IGJvb2xlYW47IC8vIEF1dG9tYXRpY2FsbHkgc2VsZWN0IGZpcnN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkIChkZWZhdWx0OiBmYWxzZSlcbiAgLyoqIE1heGltdW0gaXRlbXMgdG8ga2VlcCBpbiBtZW1vcnkgKGRlZmF1bHQ6IDEwMDApICovXG4gIG1heENhY2hlZEl0ZW1zPzogbnVtYmVyO1xuICAvKiogRXh0cmEgaXRlbXMgdG8ga2VlcCBhcm91bmQgdmlzaWJsZSByYW5nZSBkdXJpbmcgZXZpY3Rpb24gKGRlZmF1bHQ6IDE1MCkgKi9cbiAgZXZpY3Rpb25CdWZmZXI/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGlvbkNvbXBvbmVudCB7XG4gIGNvbGxlY3Rpb246IHtcbiAgICBsb2FkUmFuZ2U6IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcikgPT4gUHJvbWlzZTxhbnlbXT47XG4gICAgbG9hZE1pc3NpbmdSYW5nZXM6IChcbiAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIGdldExvYWRlZFJhbmdlczogKCkgPT4gU2V0PG51bWJlcj47XG4gICAgZ2V0UGVuZGluZ1JhbmdlczogKCkgPT4gU2V0PG51bWJlcj47XG4gICAgY2xlYXJGYWlsZWRSYW5nZXM6ICgpID0+IHZvaWQ7XG4gICAgcmV0cnlGYWlsZWRSYW5nZTogKHJhbmdlSWQ6IG51bWJlcikgPT4gUHJvbWlzZTxhbnlbXT47XG4gICAgc2V0VG90YWxJdGVtczogKHRvdGFsOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgZ2V0VG90YWxJdGVtczogKCkgPT4gbnVtYmVyO1xuICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gc3RyaW5nIHwgbnVsbDtcbiAgICBnZXRDdXJzb3JGb3JQYWdlOiAocGFnZTogbnVtYmVyKSA9PiBzdHJpbmcgfCBudWxsO1xuICAgIC8vIFJlc2V0IG1ldGhvZCBmb3IgcmVsb2FkIGZ1bmN0aW9uYWxpdHlcbiAgICByZXNldDogKCkgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIGNvbGxlY3Rpb24gZnVuY3Rpb25hbGl0eSB0byB2aWV3cG9ydCBjb21wb25lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdpdGhDb2xsZWN0aW9uKGNvbmZpZzogQ29sbGVjdGlvbkNvbmZpZyA9IHt9KSB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiBDb2xsZWN0aW9uQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBjb2xsZWN0aW9uLFxuICAgICAgcmFuZ2VTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLkxPQURJTkcuREVGQVVMVF9SQU5HRV9TSVpFLFxuICAgICAgc3RyYXRlZ3kgPSBcIm9mZnNldFwiLFxuICAgICAgdHJhbnNmb3JtLFxuICAgICAgY2FuY2VsTG9hZFRocmVzaG9sZCA9IFZJRVdQT1JUX0NPTlNUQU5UUy5MT0FESU5HLkNBTkNFTF9USFJFU0hPTEQsXG4gICAgICBtYXhDb25jdXJyZW50UmVxdWVzdHMgPSBWSUVXUE9SVF9DT05TVEFOVFMuTE9BRElOR1xuICAgICAgICAuTUFYX0NPTkNVUlJFTlRfUkVRVUVTVFMsXG4gICAgICBlbmFibGVSZXF1ZXN0UXVldWUgPSBWSUVXUE9SVF9DT05TVEFOVFMuUkVRVUVTVF9RVUVVRS5FTkFCTEVELFxuICAgICAgbWF4UXVldWVTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLlJFUVVFU1RfUVVFVUUuTUFYX1FVRVVFX1NJWkUsXG4gICAgICBsb2FkT25EcmFnRW5kID0gdHJ1ZSwgLy8gRGVmYXVsdCB0byB0cnVlIGFzIHNhZmV0eSBtZWFzdXJlXG4gICAgICBpbml0aWFsU2Nyb2xsSW5kZXggPSAwLCAvLyBTdGFydCBmcm9tIGJlZ2lubmluZyBieSBkZWZhdWx0XG4gICAgICBzZWxlY3RJZCwgLy8gSUQgb2YgaXRlbSB0byBzZWxlY3QgYWZ0ZXIgaW5pdGlhbCBsb2FkXG4gICAgICBhdXRvTG9hZCA9IHRydWUsIC8vIEF1dG8tbG9hZCBpbml0aWFsIGRhdGEgYnkgZGVmYXVsdFxuICAgICAgYXV0b1NlbGVjdEZpcnN0ID0gZmFsc2UsIC8vIEF1dG9tYXRpY2FsbHkgc2VsZWN0IGZpcnN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkXG4gICAgICBtYXhDYWNoZWRJdGVtcyA9IDEwMDAsIC8vIE1heGltdW0gaXRlbXMgdG8ga2VlcCBpbiBtZW1vcnlcbiAgICAgIGV2aWN0aW9uQnVmZmVyID0gMTUwLCAvLyBFeHRyYSBpdGVtcyB0byBrZWVwIGFyb3VuZCB2aXNpYmxlIHJhbmdlXG4gICAgfSA9IGNvbmZpZztcblxuICAgIC8vIFRyYWNrIGlmIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgaW5pdGlhbCBsb2FkIGZvciBpbml0aWFsU2Nyb2xsSW5kZXhcbiAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSB2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkIGxpc3RlbmVyIGZyb20gbG9hZGluZyBwYWdlIDFcbiAgICBsZXQgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IGZhbHNlO1xuICAgIGNvbnN0IGhhc0luaXRpYWxTY3JvbGxJbmRleCA9IGluaXRpYWxTY3JvbGxJbmRleCA+IDA7XG5cbiAgICAvLyBjb25zb2xlLmxvZyhcIltWaWV3cG9ydCBDb2xsZWN0aW9uXSBJbml0aWFsaXplZCB3aXRoIGNvbmZpZzpcIiwge1xuICAgIC8vICAgc3RyYXRlZ3ksXG4gICAgLy8gICByYW5nZVNpemUsXG4gICAgLy8gICBpbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgLy8gfSk7XG5cbiAgICAvLyBMb2FkaW5nIG1hbmFnZXIgc3RhdGVcbiAgICBpbnRlcmZhY2UgUXVldWVkUmVxdWVzdCB7XG4gICAgICByYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9O1xuICAgICAgcHJpb3JpdHk6IFwiaGlnaFwiIHwgXCJub3JtYWxcIiB8IFwibG93XCI7XG4gICAgICB0aW1lc3RhbXA6IG51bWJlcjtcbiAgICAgIHJlc29sdmU6ICgpID0+IHZvaWQ7XG4gICAgICByZWplY3Q6IChlcnJvcjogYW55KSA9PiB2b2lkO1xuICAgICAgY2FsbGVyPzogc3RyaW5nO1xuICAgIH1cblxuICAgIC8vIFN0YXRlIHRyYWNraW5nXG4gICAgbGV0IGN1cnJlbnRWZWxvY2l0eSA9IDA7XG4gICAgbGV0IGFjdGl2ZUxvYWRDb3VudCA9IDA7XG4gICAgbGV0IGNvbXBsZXRlZExvYWRzID0gMDtcbiAgICBsZXQgZmFpbGVkTG9hZHMgPSAwO1xuICAgIGxldCBjYW5jZWxsZWRMb2FkcyA9IDA7XG4gICAgbGV0IGlzRHJhZ2dpbmcgPSBmYWxzZTsgLy8gVHJhY2sgZHJhZyBzdGF0ZVxuXG4gICAgLy8gQ2FjaGUgZXZpY3Rpb24gY29uZmlndXJhdGlvbiAoZnJvbSBjb25maWcpXG4gICAgY29uc3QgTUFYX0NBQ0hFRF9JVEVNUyA9IG1heENhY2hlZEl0ZW1zO1xuICAgIGNvbnN0IEVWSUNUSU9OX0JVRkZFUiA9IGV2aWN0aW9uQnVmZmVyO1xuXG4gICAgLy8gTWVtb3J5IGRpYWdub3N0aWNzXG4gICAgY29uc3QgbG9nTWVtb3J5U3RhdHMgPSAoY2FsbGVyOiBzdHJpbmcpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1Db3VudCA9IGl0ZW1zLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG4gICAgICBjb25zdCBsb2FkZWRSYW5nZUNvdW50ID0gbG9hZGVkUmFuZ2VzLnNpemU7XG4gICAgICBjb25zdCBwZW5kaW5nUmFuZ2VDb3VudCA9IHBlbmRpbmdSYW5nZXMuc2l6ZTtcbiAgICAgIGNvbnN0IGFib3J0Q29udHJvbGxlckNvdW50ID0gYWJvcnRDb250cm9sbGVycy5zaXplO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFdmljdCBpdGVtcyBmYXIgZnJvbSB0aGUgY3VycmVudCB2aXNpYmxlIHJhbmdlIHRvIHByZXZlbnQgbWVtb3J5IGJsb2F0XG4gICAgICogS2VlcHMgaXRlbXMgd2l0aGluIEVWSUNUSU9OX0JVRkZFUiBvZiB0aGUgdmlzaWJsZSByYW5nZVxuICAgICAqL1xuICAgIGNvbnN0IGV2aWN0RGlzdGFudEl0ZW1zID0gKHZpc2libGVTdGFydDogbnVtYmVyLCB2aXNpYmxlRW5kOiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1Db3VudCA9IGl0ZW1zLmZpbHRlcihCb29sZWFuKS5sZW5ndGg7XG5cbiAgICAgIC8vIE9ubHkgZXZpY3QgaWYgd2UgaGF2ZSBtb3JlIHRoYW4gTUFYX0NBQ0hFRF9JVEVNU1xuICAgICAgaWYgKGl0ZW1Db3VudCA8PSBNQVhfQ0FDSEVEX0lURU1TKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3Qga2VlcFN0YXJ0ID0gTWF0aC5tYXgoMCwgdmlzaWJsZVN0YXJ0IC0gRVZJQ1RJT05fQlVGRkVSKTtcbiAgICAgIGNvbnN0IGtlZXBFbmQgPSB2aXNpYmxlRW5kICsgRVZJQ1RJT05fQlVGRkVSO1xuXG4gICAgICBsZXQgZXZpY3RlZENvdW50ID0gMDtcbiAgICAgIGNvbnN0IHJhbmdlc1RvUmVtb3ZlID0gbmV3IFNldDxudW1iZXI+KCk7XG5cbiAgICAgIC8vIEZpbmQgaXRlbXMgdG8gZXZpY3QgYW5kIHRyYWNrIHdoaWNoIHJhbmdlcyBhcmUgYWZmZWN0ZWRcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKGl0ZW1zW2ldICE9PSB1bmRlZmluZWQgJiYgKGkgPCBrZWVwU3RhcnQgfHwgaSA+IGtlZXBFbmQpKSB7XG4gICAgICAgICAgZGVsZXRlIGl0ZW1zW2ldO1xuICAgICAgICAgIGV2aWN0ZWRDb3VudCsrO1xuICAgICAgICAgIC8vIE1hcmsgdGhlIHJhbmdlIGNvbnRhaW5pbmcgdGhpcyBpdGVtIGZvciByZW1vdmFsIGZyb20gbG9hZGVkUmFuZ2VzXG4gICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoZSByYW5nZSB3aWxsIGJlIHJlbG9hZGVkIHdoZW4gc2Nyb2xsaW5nIGJhY2tcbiAgICAgICAgICBjb25zdCBhZmZlY3RlZFJhbmdlSWQgPSBNYXRoLmZsb29yKGkgLyByYW5nZVNpemUpO1xuICAgICAgICAgIHJhbmdlc1RvUmVtb3ZlLmFkZChhZmZlY3RlZFJhbmdlSWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlbW92ZSBhbGwgcmFuZ2VzIHRoYXQgaGFkIGFueSBpdGVtcyBldmljdGVkXG4gICAgICAvLyBUaGlzIGlzIGNyaXRpY2FsOiBldmVuIGlmIG9ubHkgcGFydCBvZiBhIHJhbmdlIHdhcyBldmljdGVkLFxuICAgICAgLy8gd2UgbXVzdCByZW1vdmUgaXQgZnJvbSBsb2FkZWRSYW5nZXMgc28gaXQgZ2V0cyByZWxvYWRlZFxuICAgICAgLy8gQWxzbyByZW1vdmUgZnJvbSBwZW5kaW5nUmFuZ2VzIC0gaWYgYSBzbG93IHJlcXVlc3QgY29tcGxldGVzIGZvciBhbiBldmljdGVkIHJhbmdlLFxuICAgICAgLy8gd2UgZG9uJ3Qgd2FudCBpdCB0byBibG9jayBmdXR1cmUgbG9hZHMgd2hlbiB1c2VyIHNjcm9sbHMgYmFja1xuICAgICAgcmFuZ2VzVG9SZW1vdmUuZm9yRWFjaCgocmFuZ2VJZCkgPT4ge1xuICAgICAgICBsb2FkZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgLy8gQ2xlYW4gdXAgYWN0aXZlIHJlcXVlc3RzIHRyYWNraW5nXG4gICAgICAgIGFjdGl2ZVJlcXVlc3RzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgLy8gQWxzbyBhYm9ydCBhbnkgaW4tZmxpZ2h0IHJlcXVlc3QgZm9yIHRoaXMgcmFuZ2UgdG8gZnJlZSB1cCBuZXR3b3JrIHJlc291cmNlc1xuICAgICAgICBjb25zdCBjb250cm9sbGVyID0gYWJvcnRDb250cm9sbGVycy5nZXQocmFuZ2VJZCk7XG4gICAgICAgIGlmIChjb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICAgIGFib3J0Q29udHJvbGxlcnMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGV2aWN0ZWRDb3VudCA+IDApIHtcbiAgICAgICAgLy8gRW1pdCBldmVudCBmb3IgcmVuZGVyaW5nIHRvIGFsc28gY2xlYW4gdXBcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aXRlbXMtZXZpY3RlZFwiLCB7XG4gICAgICAgICAga2VlcFN0YXJ0LFxuICAgICAgICAgIGtlZXBFbmQsXG4gICAgICAgICAgZXZpY3RlZENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgYWN0aXZlTG9hZFJhbmdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGxldCBsb2FkUmVxdWVzdFF1ZXVlOiBRdWV1ZWRSZXF1ZXN0W10gPSBbXTtcblxuICAgIC8vIEFib3J0Q29udHJvbGxlciBtYXAgZm9yIGNhbmNlbGxpbmcgaW4tZmxpZ2h0IHJlcXVlc3RzXG4gICAgY29uc3QgYWJvcnRDb250cm9sbGVycyA9IG5ldyBNYXA8bnVtYmVyLCBBYm9ydENvbnRyb2xsZXI+KCk7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCBpdGVtczogYW55W10gPSBbXTtcbiAgICBsZXQgdG90YWxJdGVtcyA9IDA7XG4gICAgbGV0IGxvYWRlZFJhbmdlcyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICAgIGxldCBwZW5kaW5nUmFuZ2VzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgbGV0IGZhaWxlZFJhbmdlcyA9IG5ldyBNYXA8XG4gICAgICBudW1iZXIsXG4gICAgICB7XG4gICAgICAgIGF0dGVtcHRzOiBudW1iZXI7XG4gICAgICAgIGxhc3RFcnJvcjogRXJyb3I7XG4gICAgICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICAgICAgfVxuICAgID4oKTtcbiAgICBsZXQgYWN0aXZlUmVxdWVzdHMgPSBuZXcgTWFwPG51bWJlciwgUHJvbWlzZTxhbnlbXT4+KCk7XG5cbiAgICAvLyBDdXJzb3IgcGFnaW5hdGlvbiBzdGF0ZVxuICAgIGxldCBjdXJyZW50Q3Vyc29yOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgY3Vyc29yTWFwID0gbmV3IE1hcDxudW1iZXIsIHN0cmluZz4oKTsgLy8gTWFwIHBhZ2UgbnVtYmVyIHRvIGN1cnNvclxuICAgIGxldCBwYWdlVG9PZmZzZXRNYXAgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpOyAvLyBNYXAgcGFnZSB0byBhY3R1YWwgb2Zmc2V0XG4gICAgbGV0IGhpZ2hlc3RMb2FkZWRQYWdlID0gMDtcbiAgICBsZXQgZGlzY292ZXJlZFRvdGFsOiBudW1iZXIgfCBudWxsID0gbnVsbDsgLy8gVHJhY2sgZGlzY292ZXJlZCB0b3RhbCBmcm9tIEFQSVxuICAgIGxldCBoYXNSZWFjaGVkRW5kID0gZmFsc2U7IC8vIFRyYWNrIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiBkYXRhXG5cbiAgICAvLyBTaGFyZSBpdGVtcyBhcnJheSB3aXRoIGNvbXBvbmVudFxuICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgLyoqXG4gICAgICogR2V0IGEgdW5pcXVlIElEIGZvciBhIHJhbmdlIGJhc2VkIG9uIG9mZnNldCBhbmQgdGhlIGJhc2UgcmFuZ2Ugc2l6ZVxuICAgICAqL1xuICAgIGNvbnN0IGdldFJhbmdlSWQgPSAob2Zmc2V0OiBudW1iZXIsIGxpbWl0OiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgLy8gQWx3YXlzIHVzZSB0aGUgYmFzZSByYW5nZVNpemUgZm9yIGNvbnNpc3RlbnQgSURzXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgbWVyZ2VkIHJhbmdlcyBjYW4gYmUgdHJhY2tlZCBwcm9wZXJseVxuICAgICAgcmV0dXJuIE1hdGguZmxvb3Iob2Zmc2V0IC8gcmFuZ2VTaXplKTtcbiAgICB9O1xuXG4gICAgLy8gTG9hZGluZyBtYW5hZ2VyIGhlbHBlcnNcbiAgICBjb25zdCBnZXRSYW5nZUtleSA9IChyYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9KTogc3RyaW5nID0+IHtcbiAgICAgIHJldHVybiBgJHtyYW5nZS5zdGFydH0tJHtyYW5nZS5lbmR9YDtcbiAgICB9O1xuXG4gICAgY29uc3QgY2FuTG9hZCA9ICgpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiBjdXJyZW50VmVsb2NpdHkgPD0gY2FuY2VsTG9hZFRocmVzaG9sZDtcbiAgICB9O1xuXG4gICAgY29uc3QgcHJvY2Vzc1F1ZXVlID0gKCkgPT4ge1xuICAgICAgaWYgKCFlbmFibGVSZXF1ZXN0UXVldWUgfHwgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgLy8gU29ydCBxdWV1ZSBieSBwcmlvcml0eSBhbmQgdGltZXN0YW1wXG4gICAgICBsb2FkUmVxdWVzdFF1ZXVlLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgcHJpb3JpdHlPcmRlciA9IHsgaGlnaDogMCwgbm9ybWFsOiAxLCBsb3c6IDIgfTtcbiAgICAgICAgY29uc3QgcHJpb3JpdHlEaWZmID1cbiAgICAgICAgICBwcmlvcml0eU9yZGVyW2EucHJpb3JpdHldIC0gcHJpb3JpdHlPcmRlcltiLnByaW9yaXR5XTtcbiAgICAgICAgcmV0dXJuIHByaW9yaXR5RGlmZiAhPT0gMCA/IHByaW9yaXR5RGlmZiA6IGEudGltZXN0YW1wIC0gYi50aW1lc3RhbXA7XG4gICAgICB9KTtcblxuICAgICAgLy8gUHJvY2VzcyByZXF1ZXN0cyB1cCB0byBjYXBhY2l0eVxuICAgICAgd2hpbGUgKFxuICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IGxvYWRSZXF1ZXN0UXVldWUuc2hpZnQoKTtcbiAgICAgICAgaWYgKHJlcXVlc3QpIHtcbiAgICAgICAgICBleGVjdXRlUXVldWVkTG9hZChyZXF1ZXN0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBleGVjdXRlUXVldWVkTG9hZCA9IChyZXF1ZXN0OiBRdWV1ZWRSZXF1ZXN0KSA9PiB7XG4gICAgICBhY3RpdmVMb2FkQ291bnQrKztcbiAgICAgIGFjdGl2ZUxvYWRSYW5nZXMuYWRkKGdldFJhbmdlS2V5KHJlcXVlc3QucmFuZ2UpKTtcblxuICAgICAgLy8gQ2FsbCB0aGUgYWN0dWFsIGxvYWRNaXNzaW5nUmFuZ2VzIGZ1bmN0aW9uXG4gICAgICBsb2FkTWlzc2luZ1Jhbmdlc0ludGVybmFsKHJlcXVlc3QucmFuZ2UsIHJlcXVlc3QuY2FsbGVyKVxuICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgcmVxdWVzdC5yZXNvbHZlKCk7XG4gICAgICAgICAgY29tcGxldGVkTG9hZHMrKztcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICByZXF1ZXN0LnJlamVjdChlcnJvcik7XG4gICAgICAgICAgZmFpbGVkTG9hZHMrKztcbiAgICAgICAgfSlcbiAgICAgICAgLmZpbmFsbHkoKCkgPT4ge1xuICAgICAgICAgIGFjdGl2ZUxvYWRDb3VudC0tO1xuICAgICAgICAgIGFjdGl2ZUxvYWRSYW5nZXMuZGVsZXRlKGdldFJhbmdlS2V5KHJlcXVlc3QucmFuZ2UpKTtcbiAgICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSBpdGVtcyBpZiB0cmFuc2Zvcm0gZnVuY3Rpb24gcHJvdmlkZWRcbiAgICAgKi9cbiAgICBjb25zdCB0cmFuc2Zvcm1JdGVtcyA9IChyYXdJdGVtczogYW55W10pOiBhbnlbXSA9PiB7XG4gICAgICBpZiAoIXRyYW5zZm9ybSkgcmV0dXJuIHJhd0l0ZW1zO1xuICAgICAgcmV0dXJuIHJhd0l0ZW1zLm1hcCh0cmFuc2Zvcm0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGEgcmFuZ2Ugb2YgZGF0YVxuICAgICAqL1xuICAgIGNvbnN0IGxvYWRSYW5nZSA9IGFzeW5jIChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcik6IFByb21pc2U8YW55W10+ID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIGxvYWRSYW5nZSBjYWxsZWQ6IG9mZnNldD0ke29mZnNldH0sIGxpbWl0PSR7bGltaXR9YCxcbiAgICAgIC8vICk7XG5cbiAgICAgIGlmICghY29sbGVjdGlvbikge1xuICAgICAgICBjb25zb2xlLndhcm4oXCJbQ29sbGVjdGlvbl0gTm8gY29sbGVjdGlvbiBhZGFwdGVyIGNvbmZpZ3VyZWRcIik7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmFuZ2VJZCA9IGdldFJhbmdlSWQob2Zmc2V0LCBsaW1pdCk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIFJhbmdlIElEOiAke3JhbmdlSWR9YCk7XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgbG9hZGVkXG4gICAgICBpZiAobG9hZGVkUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICByZXR1cm4gaXRlbXMuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBsaW1pdCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGFscmVhZHkgcGVuZGluZ1xuICAgICAgaWYgKHBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nUmVxdWVzdCA9IGFjdGl2ZVJlcXVlc3RzLmdldChyYW5nZUlkKTtcbiAgICAgICAgaWYgKGV4aXN0aW5nUmVxdWVzdCkge1xuICAgICAgICAgIHJldHVybiBleGlzdGluZ1JlcXVlc3Q7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWFyayBhcyBwZW5kaW5nXG4gICAgICBwZW5kaW5nUmFuZ2VzLmFkZChyYW5nZUlkKTtcblxuICAgICAgLy8gQ3JlYXRlIEFib3J0Q29udHJvbGxlciBmb3IgdGhpcyByZXF1ZXN0XG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBhYm9ydENvbnRyb2xsZXJzLnNldChyYW5nZUlkLCBhYm9ydENvbnRyb2xsZXIpO1xuXG4gICAgICAvLyBDcmVhdGUgcmVxdWVzdCBwcm9taXNlXG4gICAgICBjb25zdCByZXF1ZXN0UHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2FsbCBjb2xsZWN0aW9uIGFkYXB0ZXIgd2l0aCBhcHByb3ByaWF0ZSBwYXJhbWV0ZXJzXG4gICAgICAgICAgY29uc3QgcGFnZSA9IE1hdGguZmxvb3Iob2Zmc2V0IC8gbGltaXQpICsgMTtcbiAgICAgICAgICBsZXQgcGFyYW1zOiBhbnk7XG5cbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgICAgIC8vIEZvciBjdXJzb3IgcGFnaW5hdGlvblxuICAgICAgICAgICAgaWYgKHBhZ2UgPT09IDEpIHtcbiAgICAgICAgICAgICAgLy8gRmlyc3QgcGFnZSAtIG5vIGN1cnNvclxuICAgICAgICAgICAgICBwYXJhbXMgPSB7IGxpbWl0IH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGN1cnNvciBmb3IgcHJldmlvdXMgcGFnZVxuICAgICAgICAgICAgICBjb25zdCBwcmV2UGFnZUN1cnNvciA9IGN1cnNvck1hcC5nZXQocGFnZSAtIDEpO1xuICAgICAgICAgICAgICBpZiAoIXByZXZQYWdlQ3Vyc29yKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FuJ3QgbG9hZCB0aGlzIHBhZ2Ugd2l0aG91dCBwcmV2aW91cyBjdXJzb3JcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgICBgW0NvbGxlY3Rpb25dIENhbm5vdCBsb2FkIHBhZ2UgJHtwYWdlfSB3aXRob3V0IGN1cnNvciBmb3IgcGFnZSAke1xuICAgICAgICAgICAgICAgICAgICBwYWdlIC0gMVxuICAgICAgICAgICAgICAgICAgfWAsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgU2VxdWVudGlhbCBsb2FkaW5nIHJlcXVpcmVkIC0gbWlzc2luZyBjdXJzb3IgZm9yIHBhZ2UgJHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZSAtIDFcbiAgICAgICAgICAgICAgICAgIH1gLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcGFyYW1zID0geyBjdXJzb3I6IHByZXZQYWdlQ3Vyc29yLCBsaW1pdCB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RyYXRlZ3kgPT09IFwicGFnZVwiKSB7XG4gICAgICAgICAgICBwYXJhbXMgPSB7IHBhZ2UsIGxpbWl0IH07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIG9mZnNldCBzdHJhdGVneVxuICAgICAgICAgICAgcGFyYW1zID0geyBvZmZzZXQsIGxpbWl0IH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW1ZpZXdwb3J0IENvbGxlY3Rpb25dIExvYWRpbmcgcmFuZ2Ugb2Zmc2V0PSR7b2Zmc2V0fSwgbGltaXQ9JHtsaW1pdH0sIHN0cmF0ZWd5PSR7c3RyYXRlZ3l9LCBjYWxjdWxhdGVkIHBhZ2U9JHtwYWdlfSwgcGFyYW1zOmAsXG4gICAgICAgICAgLy8gICBKU09OLnN0cmluZ2lmeShwYXJhbXMpXG4gICAgICAgICAgLy8gKTtcblxuICAgICAgICAgIC8vIFBhc3MgYWJvcnQgc2lnbmFsIHRvIHRoZSBhZGFwdGVyIGlmIGl0IHN1cHBvcnRzIGl0XG4gICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjb2xsZWN0aW9uLnJlYWQoe1xuICAgICAgICAgICAgLi4ucGFyYW1zLFxuICAgICAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gRXh0cmFjdCBpdGVtcyBhbmQgdG90YWxcbiAgICAgICAgICBjb25zdCByYXdJdGVtcyA9IHJlc3BvbnNlLmRhdGEgfHwgcmVzcG9uc2UuaXRlbXMgfHwgcmVzcG9uc2U7XG4gICAgICAgICAgY29uc3QgbWV0YSA9IHJlc3BvbnNlLm1ldGEgfHwge307XG5cbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb24sIHRyYWNrIHRoZSBjdXJzb3IgKGNoZWNrIGJvdGggY3Vyc29yIGFuZCBuZXh0Q3Vyc29yKVxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlQ3Vyc29yID0gbWV0YS5jdXJzb3IgfHwgbWV0YS5uZXh0Q3Vyc29yO1xuICAgICAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIiAmJiByZXNwb25zZUN1cnNvcikge1xuICAgICAgICAgICAgY3VycmVudEN1cnNvciA9IHJlc3BvbnNlQ3Vyc29yO1xuICAgICAgICAgICAgY3Vyc29yTWFwLnNldChwYWdlLCByZXNwb25zZUN1cnNvcik7XG4gICAgICAgICAgICBwYWdlVG9PZmZzZXRNYXAuc2V0KHBhZ2UsIG9mZnNldCk7XG4gICAgICAgICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IE1hdGgubWF4KGhpZ2hlc3RMb2FkZWRQYWdlLCBwYWdlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFN0b3JlZCBjdXJzb3IgZm9yIHBhZ2UgJHtwYWdlfTogJHtyZXNwb25zZUN1cnNvcn1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDaGVjayBpZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmRcbiAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIgJiYgbWV0YS5oYXNOZXh0ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaGFzUmVhY2hlZEVuZCA9IHRydWU7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBSZWFjaGVkIGVuZCBvZiBjdXJzb3IgcGFnaW5hdGlvbiBhdCBwYWdlICR7cGFnZX1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgZGlzY292ZXJlZCB0b3RhbCBpZiBwcm92aWRlZFxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBtZXRhLnRvdGFsOiAke21ldGEudG90YWx9LCBkaXNjb3ZlcmVkVG90YWwgYmVmb3JlOiAke2Rpc2NvdmVyZWRUb3RhbH1gLFxuICAgICAgICAgIC8vICk7XG4gICAgICAgICAgaWYgKG1ldGEudG90YWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZGlzY292ZXJlZFRvdGFsID0gbWV0YS50b3RhbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBkaXNjb3ZlcmVkVG90YWwgYWZ0ZXI6ICR7ZGlzY292ZXJlZFRvdGFsfWApO1xuXG4gICAgICAgICAgLy8gVHJhbnNmb3JtIGl0ZW1zXG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWRJdGVtcyA9IHRyYW5zZm9ybUl0ZW1zKHJhd0l0ZW1zKTtcblxuICAgICAgICAgIC8vIEFkZCBpdGVtcyB0byBhcnJheVxuICAgICAgICAgIHRyYW5zZm9ybWVkSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW1zW29mZnNldCArIGluZGV4XSA9IGl0ZW07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBGb3IgY3Vyc29yIHN0cmF0ZWd5LCBjYWxjdWxhdGUgZHluYW1pYyB0b3RhbCBiYXNlZCBvbiBsb2FkZWQgZGF0YVxuICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBkaXNjb3ZlcmVkVG90YWwgPSAwIGNvcnJlY3RseVxuICAgICAgICAgIGxldCBuZXdUb3RhbCA9IGRpc2NvdmVyZWRUb3RhbCA/PyB0b3RhbEl0ZW1zO1xuXG4gICAgICAgICAgLy8gQ1JJVElDQUwgRklYOiBXaGVuIEFQSSByZXR1cm5zIDAgaXRlbXMgb24gcGFnZSAxIChvZmZzZXQgMCksIHRoZSBsaXN0IGlzIGVtcHR5LlxuICAgICAgICAgIC8vIFdlIG11c3Qgc2V0IHRvdGFsSXRlbXMgdG8gMCByZWdhcmRsZXNzIG9mIG1ldGEudG90YWwgYmVpbmcgdW5kZWZpbmVkLlxuICAgICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBjb3VudD1mYWxzZSBpcyBzZW50IGJ1dCB0aGUgbGlzdCBpcyBhY3R1YWxseSBlbXB0eS5cbiAgICAgICAgICBpZiAob2Zmc2V0ID09PSAwICYmIHRyYW5zZm9ybWVkSXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBFbXB0eSByZXN1bHQgb24gcGFnZSAxIC0gZm9yY2luZyB0b3RhbEl0ZW1zIHRvIDBgLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIG5ld1RvdGFsID0gMDtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRUb3RhbCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBuZXdUb3RhbCBpbml0aWFsOiAke25ld1RvdGFsfSwgdG90YWxJdGVtczogJHt0b3RhbEl0ZW1zfSwgc3RyYXRlZ3k6ICR7c3RyYXRlZ3l9YCxcbiAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdG90YWwgYmFzZWQgb24gbG9hZGVkIGl0ZW1zICsgbWFyZ2luXG4gICAgICAgICAgICBjb25zdCBsb2FkZWRJdGVtc0NvdW50ID0gaXRlbXMuZmlsdGVyKFxuICAgICAgICAgICAgICAoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBtYXJnaW5JdGVtcyA9IGhhc1JlYWNoZWRFbmRcbiAgICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICAgIDogcmFuZ2VTaXplICpcbiAgICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUEFHSU5BVElPTi5DVVJTT1JfU0NST0xMX01BUkdJTl9NVUxUSVBMSUVSO1xuICAgICAgICAgICAgY29uc3QgbWluVmlydHVhbEl0ZW1zID1cbiAgICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBBR0lOQVRJT04uQ1VSU09SX01JTl9WSVJUVUFMX1NJWkVfTVVMVElQTElFUjtcblxuICAgICAgICAgICAgLy8gRHluYW1pYyB0b3RhbDogbG9hZGVkIGl0ZW1zICsgbWFyZ2luICh1bmxlc3Mgd2UndmUgcmVhY2hlZCB0aGUgZW5kKVxuICAgICAgICAgICAgbmV3VG90YWwgPSBNYXRoLm1heChcbiAgICAgICAgICAgICAgbG9hZGVkSXRlbXNDb3VudCArIG1hcmdpbkl0ZW1zLFxuICAgICAgICAgICAgICBtaW5WaXJ0dWFsSXRlbXMsXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDdXJzb3IgbW9kZSB2aXJ0dWFsIHNpemU6IGxvYWRlZD0ke2xvYWRlZEl0ZW1zQ291bnR9LCBtYXJnaW49JHttYXJnaW5JdGVtc30sIHRvdGFsPSR7bmV3VG90YWx9LCBoYXNSZWFjaGVkRW5kPSR7aGFzUmVhY2hlZEVuZH1gLFxuICAgICAgICAgICAgLy8gKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRvdGFsIGlmIGl0IGhhcyBncm93blxuICAgICAgICAgICAgaWYgKG5ld1RvdGFsID4gdG90YWxJdGVtcykge1xuICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIFVwZGF0aW5nIGN1cnNvciB2aXJ0dWFsIHNpemUgZnJvbSAke3RvdGFsSXRlbXN9IHRvICR7bmV3VG90YWx9YCxcbiAgICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgICAgdG90YWxJdGVtcyA9IG5ld1RvdGFsO1xuICAgICAgICAgICAgICBzZXRUb3RhbEl0ZW1zKG5ld1RvdGFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRm9yIG90aGVyIHN0cmF0ZWdpZXMsIHVzZSBkaXNjb3ZlcmVkIHRvdGFsIG9yIGN1cnJlbnQgdG90YWxcbiAgICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBkaXNjb3ZlcmVkVG90YWwgPSAwIGNvcnJlY3RseVxuICAgICAgICAgICAgbmV3VG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgPz8gdG90YWxJdGVtcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgc3RhdGVcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gQmVmb3JlIHN0YXRlIHVwZGF0ZTogbmV3VG90YWw9JHtuZXdUb3RhbH0sIHRvdGFsSXRlbXM9JHt0b3RhbEl0ZW1zfSwgd2lsbCB1cGRhdGU6ICR7bmV3VG90YWwgIT09IHRvdGFsSXRlbXN9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICAgIGlmIChuZXdUb3RhbCAhPT0gdG90YWxJdGVtcykge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYFtDb2xsZWN0aW9uXSBDYWxsaW5nIHNldFRvdGFsSXRlbXMoJHtuZXdUb3RhbH0pYCk7XG4gICAgICAgICAgICB0b3RhbEl0ZW1zID0gbmV3VG90YWw7XG4gICAgICAgICAgICBzZXRUb3RhbEl0ZW1zKG5ld1RvdGFsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50IGl0ZW1zIHJlZmVyZW5jZVxuICAgICAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgICAgICAgLy8gRW1pdCBpdGVtcyBjaGFuZ2VkIGV2ZW50XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0Oml0ZW1zLWNoYW5nZWRcIiwge1xuICAgICAgICAgICAgdG90YWxJdGVtczogbmV3VG90YWwsXG4gICAgICAgICAgICBsb2FkZWRDb3VudDogaXRlbXMuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQpLmxlbmd0aCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSB2aWV3cG9ydCBzdGF0ZVxuICAgICAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICAgICAgaWYgKHZpZXdwb3J0U3RhdGUpIHtcbiAgICAgICAgICAgIC8vIFVzZSBudWxsaXNoIGNvYWxlc2NpbmcgKD8/KSBpbnN0ZWFkIG9mIHx8IHRvIGhhbmRsZSBuZXdUb3RhbCA9IDAgY29ycmVjdGx5XG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPSBuZXdUb3RhbCA/PyBpdGVtcy5sZW5ndGg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVmVyaWZ5IGl0ZW1zIGFyZSBhY3R1YWxseSBzdGlsbCBpbiB0aGUgYXJyYXkgYmVmb3JlIG1hcmtpbmcgYXMgbG9hZGVkXG4gICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIGV2aWN0aW9uIGhhcHBlbnMgZHVyaW5nIGFzeW5jIGxvYWQ6XG4gICAgICAgICAgLy8gMS4gTG9hZCBzdGFydHMgZm9yIHJhbmdlIEFcbiAgICAgICAgICAvLyAyLiBVc2VyIHNjcm9sbHMgdG8gcmFuZ2UgQlxuICAgICAgICAgIC8vIDMuIEV2aWN0aW9uIHJlbW92ZXMgaXRlbXMgZnJvbSByYW5nZSBBIGFuZCByZW1vdmVzIGZyb20gbG9hZGVkUmFuZ2VzXG4gICAgICAgICAgLy8gNC4gTG9hZCBmb3IgcmFuZ2UgQSBjb21wbGV0ZXMsIHdvdWxkIHJlLWFkZCB0byBsb2FkZWRSYW5nZXNcbiAgICAgICAgICAvLyA1LiBVc2VyIHNjcm9sbHMgYmFjayB0byBBLCBsb2FkZWRSYW5nZXMgc2F5cyBsb2FkZWQgYnV0IGl0ZW1zIGFyZSBnb25lXG4gICAgICAgICAgY29uc3QgaXRlbXNBY3R1YWxseVN0b3JlZCA9XG4gICAgICAgICAgICB0cmFuc2Zvcm1lZEl0ZW1zLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIHRyYW5zZm9ybWVkSXRlbXMuZXZlcnkoXG4gICAgICAgICAgICAgIChfLCBpZHgpID0+IGl0ZW1zW29mZnNldCArIGlkeF0gIT09IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoaXRlbXNBY3R1YWxseVN0b3JlZCkge1xuICAgICAgICAgICAgLy8gTWFyayBhcyBsb2FkZWQgb25seSBpZiBpdGVtcyBhcmUgYWN0dWFsbHkgcHJlc2VudFxuICAgICAgICAgICAgbG9hZGVkUmFuZ2VzLmFkZChyYW5nZUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gQWx3YXlzIGNsZWFuIHVwIHBlbmRpbmcvZmFpbGVkIHN0YXRlXG4gICAgICAgICAgcGVuZGluZ1Jhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgZmFpbGVkUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcblxuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBSYW5nZSAke3JhbmdlSWR9IGxvYWRlZCBzdWNjZXNzZnVsbHkgd2l0aCAke3RyYW5zZm9ybWVkSXRlbXMubGVuZ3RofSBpdGVtc2BcbiAgICAgICAgICAvLyApO1xuXG4gICAgICAgICAgLy8gTG9nIG1lbW9yeSBzdGF0cyBwZXJpb2RpY2FsbHkgKGV2ZXJ5IDUgbG9hZHMpXG4gICAgICAgICAgaWYgKGNvbXBsZXRlZExvYWRzICUgNSA9PT0gMCkge1xuICAgICAgICAgICAgbG9nTWVtb3J5U3RhdHMoYGxvYWQ6JHtjb21wbGV0ZWRMb2Fkc31gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFbWl0IGV2ZW50c1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwge1xuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBpdGVtczogdHJhbnNmb3JtZWRJdGVtcyxcbiAgICAgICAgICAgIHRvdGFsOiBuZXdUb3RhbCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEVtaXQgY29sbGVjdGlvbiBsb2FkZWQgZXZlbnQgd2l0aCBtb3JlIGRldGFpbHNcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwge1xuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBpdGVtczogdHJhbnNmb3JtZWRJdGVtcyxcbiAgICAgICAgICAgIHRvdGFsOiBuZXdUb3RhbCxcbiAgICAgICAgICAgIHJhbmdlSWQsXG4gICAgICAgICAgICBpdGVtc0luTWVtb3J5OiBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gIT09IHVuZGVmaW5lZCkubGVuZ3RoLFxuICAgICAgICAgICAgY3Vyc29yOiBzdHJhdGVneSA9PT0gXCJjdXJzb3JcIiA/IGN1cnJlbnRDdXJzb3IgOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBUcmlnZ2VyIHZpZXdwb3J0IHVwZGF0ZVxuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydD8udXBkYXRlVmlld3BvcnQ/LigpO1xuXG4gICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkSXRlbXM7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgLy8gSGFuZGxlIEFib3J0RXJyb3IgYW5kIFwiRmFpbGVkIHRvIGZldGNoXCIgKHdoaWNoIGNhbiBvY2N1ciBvbiBhYm9ydCkgZ3JhY2VmdWxseVxuICAgICAgICAgIGNvbnN0IGlzQWJvcnRFcnJvciA9XG4gICAgICAgICAgICAoZXJyb3IgYXMgRXJyb3IpLm5hbWUgPT09IFwiQWJvcnRFcnJvclwiIHx8XG4gICAgICAgICAgICAoKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlID09PSBcIkZhaWxlZCB0byBmZXRjaFwiICYmXG4gICAgICAgICAgICAgIGFib3J0Q29udHJvbGxlci5zaWduYWwuYWJvcnRlZCk7XG5cbiAgICAgICAgICBpZiAoaXNBYm9ydEVycm9yKSB7XG4gICAgICAgICAgICBwZW5kaW5nUmFuZ2VzLmRlbGV0ZShyYW5nZUlkKTtcbiAgICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgICAvLyBEb24ndCB0aHJvdywganVzdCByZXR1cm4gZW1wdHkgYXJyYXlcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBIYW5kbGUgb3RoZXIgZXJyb3JzXG4gICAgICAgICAgcGVuZGluZ1Jhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgZmFpbGVkTG9hZHMrKztcblxuICAgICAgICAgIGNvbnN0IGF0dGVtcHRzID0gKGZhaWxlZFJhbmdlcy5nZXQocmFuZ2VJZCk/LmF0dGVtcHRzIHx8IDApICsgMTtcbiAgICAgICAgICBmYWlsZWRSYW5nZXMuc2V0KHJhbmdlSWQsIHtcbiAgICAgICAgICAgIGF0dGVtcHRzLFxuICAgICAgICAgICAgbGFzdEVycm9yOiBlcnJvciBhcyBFcnJvcixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIEVtaXQgZXJyb3IgZXZlbnRcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwidmlld3BvcnQ6cmFuZ2UtZXJyb3JcIiwge1xuICAgICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgICAgbGltaXQsXG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIGF0dGVtcHRzLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgYWN0aXZlUmVxdWVzdHMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICAgIGFib3J0Q29udHJvbGxlcnMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgICB9XG4gICAgICB9KSgpO1xuXG4gICAgICBhY3RpdmVSZXF1ZXN0cy5zZXQocmFuZ2VJZCwgcmVxdWVzdFByb21pc2UpO1xuICAgICAgcmV0dXJuIHJlcXVlc3RQcm9taXNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIG1pc3NpbmcgcmFuZ2VzIGZyb20gY29sbGVjdGlvblxuICAgICAqL1xuICAgIGNvbnN0IGxvYWRNaXNzaW5nUmFuZ2VzSW50ZXJuYWwgPSBhc3luYyAoXG4gICAgICByYW5nZToge1xuICAgICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgICBlbmQ6IG51bWJlcjtcbiAgICAgIH0sXG4gICAgICBjYWxsZXI/OiBzdHJpbmcsXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICBpZiAoIWNvbGxlY3Rpb24pIHJldHVybjtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGBbQ29sbGVjdGlvbl0gbG9hZE1pc3NpbmdSYW5nZXNJbnRlcm5hbCAtIHJhbmdlOiAke3N0YXJ0fS0ke2VuZH0sIHN0cmF0ZWd5OiAke3N0cmF0ZWd5fWAsXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb24sIHdlIG5lZWQgdG8gbG9hZCBzZXF1ZW50aWFsbHlcbiAgICAgIGlmIChzdHJhdGVneSA9PT0gXCJjdXJzb3JcIikge1xuICAgICAgICBjb25zdCBzdGFydFBhZ2UgPSBNYXRoLmZsb29yKHJhbmdlLnN0YXJ0IC8gcmFuZ2VTaXplKSArIDE7XG4gICAgICAgIGNvbnN0IGVuZFBhZ2UgPSBNYXRoLmZsb29yKHJhbmdlLmVuZCAvIHJhbmdlU2l6ZSkgKyAxO1xuXG4gICAgICAgIC8vIExpbWl0IGhvdyBtYW55IHBhZ2VzIHdlJ2xsIGxvYWQgYXQgb25jZVxuICAgICAgICBjb25zdCBtYXhQYWdlc1RvTG9hZCA9IDEwO1xuICAgICAgICBjb25zdCBjdXJyZW50SGlnaGVzdFBhZ2UgPSBoaWdoZXN0TG9hZGVkUGFnZSB8fCAwO1xuICAgICAgICBjb25zdCBsaW1pdGVkRW5kUGFnZSA9IE1hdGgubWluKFxuICAgICAgICAgIGVuZFBhZ2UsXG4gICAgICAgICAgY3VycmVudEhpZ2hlc3RQYWdlICsgbWF4UGFnZXNUb0xvYWQsXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDdXJzb3IgbW9kZTogbmVlZCB0byBsb2FkIHBhZ2VzICR7c3RhcnRQYWdlfSB0byAke2VuZFBhZ2V9LCBsaW1pdGVkIHRvICR7bGltaXRlZEVuZFBhZ2V9YCxcbiAgICAgICAgLy8gKTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGxvYWQgcGFnZXMgc2VxdWVudGlhbGx5XG4gICAgICAgIGZvciAobGV0IHBhZ2UgPSBzdGFydFBhZ2U7IHBhZ2UgPD0gbGltaXRlZEVuZFBhZ2U7IHBhZ2UrKykge1xuICAgICAgICAgIGNvbnN0IHJhbmdlSWQgPSBwYWdlIC0gMTsgLy8gQ29udmVydCB0byAwLWJhc2VkIHJhbmdlSWRcbiAgICAgICAgICBjb25zdCBvZmZzZXQgPSByYW5nZUlkICogcmFuZ2VTaXplO1xuXG4gICAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IGJlaW5nIGxvYWRlZFxuICAgICAgICAgIGlmIChwZW5kaW5nUmFuZ2VzLmhhcyhyYW5nZUlkKSkge1xuICAgICAgICAgICAgLy8gUmFuZ2UgYWxyZWFkeSBiZWluZyBsb2FkZWRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIWxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkgJiYgIXBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgICAgICAvLyBGb3IgY3Vyc29yIHBhZ2luYXRpb24sIHdlIG11c3QgbG9hZCBzZXF1ZW50aWFsbHlcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYWxsIHByZXZpb3VzIHBhZ2VzIGxvYWRlZFxuICAgICAgICAgICAgaWYgKHBhZ2UgPiAxKSB7XG4gICAgICAgICAgICAgIGxldCBjYW5Mb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgcHJldlBhZ2UgPSAxOyBwcmV2UGFnZSA8IHBhZ2U7IHByZXZQYWdlKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2UmFuZ2VJZCA9IHByZXZQYWdlIC0gMTtcbiAgICAgICAgICAgICAgICBpZiAoIWxvYWRlZFJhbmdlcy5oYXMocHJldlJhbmdlSWQpKSB7XG4gICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBDYW5ub3QgbG9hZCBwYWdlICR7cGFnZX0gLSBuZWVkIHRvIGxvYWQgcGFnZSAke3ByZXZQYWdlfSBmaXJzdGAsXG4gICAgICAgICAgICAgICAgICAvLyApO1xuICAgICAgICAgICAgICAgICAgY2FuTG9hZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAvLyBUcnkgdG8gbG9hZCB0aGUgbWlzc2luZyBwYWdlXG4gICAgICAgICAgICAgICAgICBpZiAoIXBlbmRpbmdSYW5nZXMuaGFzKHByZXZSYW5nZUlkKSkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgIGF3YWl0IGxvYWRSYW5nZShwcmV2UmFuZ2VJZCAqIHJhbmdlU2l6ZSwgcmFuZ2VTaXplKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgYFtDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBwcmVyZXF1aXNpdGUgcGFnZSAke3ByZXZQYWdlfTpgLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIFN0b3AgdHJ5aW5nIHRvIGxvYWQgZnVydGhlciBwYWdlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoIWNhbkxvYWQpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCB0aGlzIHBhZ2UgZm9yIG5vd1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IGxvYWRSYW5nZShvZmZzZXQsIHJhbmdlU2l6ZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgcGFnZSAke3BhZ2V9OmAsIGVycm9yKTtcbiAgICAgICAgICAgICAgYnJlYWs7IC8vIFN0b3Agc2VxdWVudGlhbCBsb2FkaW5nIG9uIGVycm9yXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVuZFBhZ2UgPiBsaW1pdGVkRW5kUGFnZSkge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBTdG9wcGVkIGF0IHBhZ2UgJHtsaW1pdGVkRW5kUGFnZX0gdG8gcHJldmVudCBleGNlc3NpdmUgbG9hZGluZyAocmVxdWVzdGVkIHVwIHRvICR7ZW5kUGFnZX0pYCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBPcmlnaW5hbCBsb2dpYyBmb3Igb2Zmc2V0L3BhZ2Ugc3RyYXRlZ2llc1xuICAgICAgLy8gQ2FsY3VsYXRlIHJhbmdlIGJvdW5kYXJpZXNcbiAgICAgIGNvbnN0IHN0YXJ0UmFuZ2UgPSBNYXRoLmZsb29yKHJhbmdlLnN0YXJ0IC8gcmFuZ2VTaXplKTtcbiAgICAgIGNvbnN0IGVuZFJhbmdlID0gTWF0aC5mbG9vcihyYW5nZS5lbmQgLyByYW5nZVNpemUpO1xuXG4gICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBwYWdlIHN0cmF0ZWd5IC0gc3RhcnRSYW5nZTogJHtzdGFydFJhbmdlfSwgZW5kUmFuZ2U6ICR7ZW5kUmFuZ2V9LCBsb2FkZWRSYW5nZXM6IFske0FycmF5LmZyb20obG9hZGVkUmFuZ2VzKS5qb2luKFwiLCBcIil9XWAsXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBDb2xsZWN0IHJhbmdlcyB0aGF0IG5lZWQgbG9hZGluZ1xuICAgICAgY29uc3QgcmFuZ2VzVG9Mb2FkOiBudW1iZXJbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgcmFuZ2VJZCA9IHN0YXJ0UmFuZ2U7IHJhbmdlSWQgPD0gZW5kUmFuZ2U7IHJhbmdlSWQrKykge1xuICAgICAgICBpZiAoIWxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkgJiYgIXBlbmRpbmdSYW5nZXMuaGFzKHJhbmdlSWQpKSB7XG4gICAgICAgICAgcmFuZ2VzVG9Mb2FkLnB1c2gocmFuZ2VJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHJhbmdlc1RvTG9hZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gQWxsIHJhbmdlcyBhcmUgYWxyZWFkeSBsb2FkZWQgb3IgcGVuZGluZ1xuICAgICAgICAvLyBCdXQgdmVyaWZ5IHRoZSBkYXRhIGFjdHVhbGx5IGV4aXN0cyBpbiBpdGVtcyBhcnJheSAoZGVmZW5zaXZlIGNoZWNrKVxuICAgICAgICBmb3IgKGxldCByYW5nZUlkID0gc3RhcnRSYW5nZTsgcmFuZ2VJZCA8PSBlbmRSYW5nZTsgcmFuZ2VJZCsrKSB7XG4gICAgICAgICAgaWYgKGxvYWRlZFJhbmdlcy5oYXMocmFuZ2VJZCkpIHtcbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgcmFuZ2UgYWN0dWFsbHkgaGFzIGRhdGFcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlU3RhcnQgPSByYW5nZUlkICogcmFuZ2VTaXplO1xuICAgICAgICAgICAgY29uc3QgaGFzRGF0YSA9IGl0ZW1zXG4gICAgICAgICAgICAgIC5zbGljZShyYW5nZVN0YXJ0LCByYW5nZVN0YXJ0ICsgcmFuZ2VTaXplKVxuICAgICAgICAgICAgICAuc29tZSgoaXRlbSkgPT4gaXRlbSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICghaGFzRGF0YSkge1xuICAgICAgICAgICAgICAvLyBSYW5nZSBtYXJrZWQgbG9hZGVkIGJ1dCBubyBkYXRhIC0gZm9yY2UgcmVsb2FkXG4gICAgICAgICAgICAgIGxvYWRlZFJhbmdlcy5kZWxldGUocmFuZ2VJZCk7XG4gICAgICAgICAgICAgIHJhbmdlc1RvTG9hZC5wdXNoKHJhbmdlSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSBhcmUgcXVldWVkIHJlcXVlc3RzIHdlIHNob3VsZCBwcm9jZXNzXG4gICAgICAgIGlmIChcbiAgICAgICAgICByYW5nZXNUb0xvYWQubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgYWN0aXZlTG9hZENvdW50IDwgbWF4Q29uY3VycmVudFJlcXVlc3RzXG4gICAgICAgICkge1xuICAgICAgICAgIHByb2Nlc3NRdWV1ZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyYW5nZXNUb0xvYWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBgW0NvbGxlY3Rpb25dIExvYWRpbmcgJHtyYW5nZXNUb0xvYWQubGVuZ3RofSByYW5nZXM6IFske3Jhbmdlc1RvTG9hZC5qb2luKFwiLCBcIil9XWAsXG4gICAgICAvLyApO1xuXG4gICAgICAvLyBMb2FkIHJhbmdlcyBpbmRpdmlkdWFsbHkgLSBubyBtZXJnaW5nIHRvIGF2b2lkIGxvYWRpbmcgb2xkIHJhbmdlc1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSByYW5nZXNUb0xvYWQubWFwKChyYW5nZUlkKSA9PlxuICAgICAgICBsb2FkUmFuZ2UocmFuZ2VJZCAqIHJhbmdlU2l6ZSwgcmFuZ2VTaXplKSxcbiAgICAgICk7XG4gICAgICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBWZWxvY2l0eS1hd2FyZSB3cmFwcGVyIGZvciBsb2FkTWlzc2luZ1Jhbmdlc1xuICAgICAqL1xuICAgIGNvbnN0IGxvYWRNaXNzaW5nUmFuZ2VzID0gKFxuICAgICAgcmFuZ2U6IHtcbiAgICAgICAgc3RhcnQ6IG51bWJlcjtcbiAgICAgICAgZW5kOiBudW1iZXI7XG4gICAgICB9LFxuICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgY29uc3QgcmFuZ2VLZXkgPSBnZXRSYW5nZUtleShyYW5nZSk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgYWxyZWFkeSBsb2FkaW5nXG4gICAgICAgIGlmIChhY3RpdmVMb2FkUmFuZ2VzLmhhcyhyYW5nZUtleSkpIHtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBpZiBkcmFnZ2luZyB3aXRoIGxvdyB2ZWxvY2l0eSAoYnV0IG5vdCBpZiB3ZSdyZSBpZGxlKVxuICAgICAgICBpZiAoaXNEcmFnZ2luZyAmJiBjdXJyZW50VmVsb2NpdHkgPCAwLjUgJiYgY3VycmVudFZlbG9jaXR5ID4gMCkge1xuICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHZlbG9jaXR5IC0gaWYgdG9vIGhpZ2gsIGNhbmNlbCB0aGUgcmVxdWVzdCBlbnRpcmVseVxuICAgICAgICBpZiAoIWNhbkxvYWQoKSkge1xuICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGNhcGFjaXR5XG4gICAgICAgIGlmIChhY3RpdmVMb2FkQ291bnQgPCBtYXhDb25jdXJyZW50UmVxdWVzdHMpIHtcbiAgICAgICAgICAvLyBFeGVjdXRlIGltbWVkaWF0ZWx5XG4gICAgICAgICAgZXhlY3V0ZVF1ZXVlZExvYWQoe1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBwcmlvcml0eTogXCJub3JtYWxcIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICBjYWxsZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZW5hYmxlUmVxdWVzdFF1ZXVlICYmXG4gICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPCBtYXhRdWV1ZVNpemVcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gUXVldWUgdGhlIHJlcXVlc3RcbiAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBwcmlvcml0eTogXCJub3JtYWxcIixcbiAgICAgICAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICByZWplY3QsXG4gICAgICAgICAgICBjYWxsZXIsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICBgW0xvYWRpbmdNYW5hZ2VyXSBRdWV1ZWQgcmVxdWVzdCAoYXQgY2FwYWNpdHkpLCBxdWV1ZSBzaXplOiAke2xvYWRSZXF1ZXN0UXVldWUubGVuZ3RofWBcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFF1ZXVlIGlzIGZ1bGwgLSBidXQgZG9uJ3QgZHJvcCBpZGxlL3JhbmdlLWNoYW5nZWQgcmVxdWVzdHMsIHRoZXkncmUgY3JpdGljYWwhXG4gICAgICAgICAgLy8gSW5zdGVhZCwgY2xlYXIgb2xkIHF1ZXVlZCByZXF1ZXN0cyBhbmQgYWRkIHRoZSBuZXcgb25lXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2FsbGVyID09PSBcInZpZXdwb3J0OmlkbGVcIiB8fFxuICAgICAgICAgICAgY2FsbGVyID09PSBcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIlxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gQ2xlYXIgb2xkIHF1ZXVlZCByZXF1ZXN0cyAtIHRoZXkncmUgZm9yIHJhbmdlcyB1c2VyIHNjcm9sbGVkIHBhc3RcbiAgICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUuZm9yRWFjaCgocikgPT4ge1xuICAgICAgICAgICAgICBjYW5jZWxsZWRMb2FkcysrO1xuICAgICAgICAgICAgICByLnJlc29sdmUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggPSAwO1xuICAgICAgICAgICAgLy8gUXVldWUgdGhpcyBwcmlvcml0eSByZXF1ZXN0XG4gICAgICAgICAgICBsb2FkUmVxdWVzdFF1ZXVlLnB1c2goe1xuICAgICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgICAgcHJpb3JpdHk6IFwiaGlnaFwiLFxuICAgICAgICAgICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICAgIHJlamVjdCxcbiAgICAgICAgICAgICAgY2FsbGVyLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFF1ZXVlIG92ZXJmbG93IC0gcmVzb2x2ZSB0byBhdm9pZCBlcnJvcnNcbiAgICAgICAgICAgIGlmIChsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCA+PSBtYXhRdWV1ZVNpemUpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGxvYWRSZXF1ZXN0UXVldWUuc3BsaWNlKFxuICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgbG9hZFJlcXVlc3RRdWV1ZS5sZW5ndGggLSBtYXhRdWV1ZVNpemUsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHJlbW92ZWQuZm9yRWFjaCgocikgPT4ge1xuICAgICAgICAgICAgICAgIGNhbmNlbGxlZExvYWRzKys7XG4gICAgICAgICAgICAgICAgci5yZXNvbHZlKCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJldHJ5IGEgZmFpbGVkIHJhbmdlXG4gICAgICovXG4gICAgY29uc3QgcmV0cnlGYWlsZWRSYW5nZSA9IGFzeW5jIChyYW5nZUlkOiBudW1iZXIpOiBQcm9taXNlPGFueVtdPiA9PiB7XG4gICAgICBmYWlsZWRSYW5nZXMuZGVsZXRlKHJhbmdlSWQpO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gcmFuZ2VJZCAqIHJhbmdlU2l6ZTtcbiAgICAgIHJldHVybiBsb2FkUmFuZ2Uob2Zmc2V0LCByYW5nZVNpemUpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdG90YWwgaXRlbXMgY291bnRcbiAgICAgKi9cbiAgICBjb25zdCBzZXRUb3RhbEl0ZW1zID0gKHRvdGFsOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIHRvdGFsSXRlbXMgPSB0b3RhbDtcblxuICAgICAgLy8gVXBkYXRlIHZpZXdwb3J0IHN0YXRlJ3MgdG90YWwgaXRlbXNcbiAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICBpZiAodmlld3BvcnRTdGF0ZSkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgPSB0b3RhbDtcbiAgICAgIH1cblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWRcIiwgeyB0b3RhbCB9KTtcbiAgICB9O1xuXG4gICAgLy8gSG9vayBpbnRvIHZpZXdwb3J0IGluaXRpYWxpemF0aW9uXG4gICAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemU7XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBvcmlnaW5hbEluaXRpYWxpemUoKTtcbiAgICAgIC8vIFNraXAgaWYgYWxyZWFkeSBpbml0aWFsaXplZFxuICAgICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICAvLyBTZXQgaW5pdGlhbCB0b3RhbCBpZiBwcm92aWRlZFxuICAgICAgaWYgKGNvbXBvbmVudC50b3RhbEl0ZW1zKSB7XG4gICAgICAgIHRvdGFsSXRlbXMgPSBjb21wb25lbnQudG90YWxJdGVtcztcbiAgICAgIH1cblxuICAgICAgLy8gTGlzdGVuIGZvciBkcmFnIGV2ZW50c1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpkcmFnLXN0YXJ0XCIsICgpID0+IHtcbiAgICAgICAgaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpkcmFnLWVuZFwiLCAoKSA9PiB7XG4gICAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgLy8gUHJvY2VzcyBhbnkgcXVldWVkIHJlcXVlc3RzIGFmdGVyIGRyYWcgZW5kcyAoc2FmZXR5IG1lYXN1cmUpXG4gICAgICAgIC8vIFRoaXMgZW5zdXJlcyBwbGFjZWhvbGRlcnMgYXJlIHJlcGxhY2VkIGV2ZW4gaWYgaWRsZSBkZXRlY3Rpb24gZmFpbHNcbiAgICAgICAgaWYgKGxvYWRPbkRyYWdFbmQpIHtcbiAgICAgICAgICBwcm9jZXNzUXVldWUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgcmFuZ2UgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIsIGFzeW5jIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgLy8gRG9uJ3QgbG9hZCBkdXJpbmcgZmFzdCBzY3JvbGxpbmcgLSBsb2FkTWlzc2luZ1JhbmdlcyB3aWxsIGhhbmRsZSB2ZWxvY2l0eSBjaGVja1xuXG4gICAgICAgIC8vIEV4dHJhY3QgcmFuZ2UgZnJvbSBldmVudCBkYXRhIC0gdmlydHVhbCBmZWF0dXJlIGVtaXRzIHsgcmFuZ2U6IHsgc3RhcnQsIGVuZCB9LCBzY3JvbGxQb3NpdGlvbiB9XG4gICAgICAgIGNvbnN0IHJhbmdlID0gZGF0YS5yYW5nZSB8fCBkYXRhO1xuICAgICAgICBjb25zdCB7IHN0YXJ0LCBlbmQgfSA9IHJhbmdlO1xuXG4gICAgICAgIC8vIFZhbGlkYXRlIHJhbmdlIGJlZm9yZSBsb2FkaW5nXG4gICAgICAgIGlmICh0eXBlb2Ygc3RhcnQgIT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIGVuZCAhPT0gXCJudW1iZXJcIikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIFwiW0NvbGxlY3Rpb25dIEludmFsaWQgcmFuZ2UgaW4gdmlld3BvcnQ6cmFuZ2UtY2hhbmdlZCBldmVudDpcIixcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTa2lwIGxvYWRpbmcgcGFnZSAxIGlmIHdlIGhhdmUgYW4gaW5pdGlhbFNjcm9sbEluZGV4IGFuZCBoYXZlbid0IGNvbXBsZXRlZCBpbml0aWFsIGxvYWQgeWV0XG4gICAgICAgIC8vIFRoaXMgcHJldmVudHMgdGhlIHJlcXVlc3RBbmltYXRpb25GcmFtZSBpbiB2aXJ0dWFsLnRzIGZyb20gdHJpZ2dlcmluZyBhIHBhZ2UgMSBsb2FkXG4gICAgICAgIC8vIGFmdGVyIHdlJ3ZlIGFscmVhZHkgc3RhcnRlZCBsb2FkaW5nIHRoZSBjb3JyZWN0IGluaXRpYWwgcGFnZVxuICAgICAgICBpZiAoaGFzSW5pdGlhbFNjcm9sbEluZGV4ICYmICFoYXNDb21wbGV0ZWRJbml0aWFsUG9zaXRpb25Mb2FkKSB7XG4gICAgICAgICAgY29uc3QgcGFnZTFFbmRJbmRleCA9IHJhbmdlU2l6ZSAtIDE7IC8vIGUuZy4sIDI5IGZvciByYW5nZVNpemU9MzBcbiAgICAgICAgICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kIDw9IHBhZ2UxRW5kSW5kZXgpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSByZXF1ZXN0IGZvciBwYWdlIDEsIHNraXAgaXRcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIG1pc3NpbmcgcmFuZ2VzIGlmIG5lZWRlZFxuICAgICAgICBhd2FpdCBsb2FkTWlzc2luZ1Jhbmdlcyh7IHN0YXJ0LCBlbmQgfSwgXCJ2aWV3cG9ydDpyYW5nZS1jaGFuZ2VkXCIpO1xuXG4gICAgICAgIC8vIEV2aWN0IGRpc3RhbnQgaXRlbXMgdG8gcHJldmVudCBtZW1vcnkgYmxvYXRcbiAgICAgICAgZXZpY3REaXN0YW50SXRlbXMoc3RhcnQsIGVuZCk7XG5cbiAgICAgICAgLy8gRm9yIGN1cnNvciBtb2RlLCBjaGVjayBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSB2aXJ0dWFsIHNpemVcbiAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSBcImN1cnNvclwiICYmICFoYXNSZWFjaGVkRW5kKSB7XG4gICAgICAgICAgY29uc3QgbG9hZGVkSXRlbXNDb3VudCA9IGl0ZW1zLmZpbHRlcihcbiAgICAgICAgICAgIChpdGVtKSA9PiBpdGVtICE9PSB1bmRlZmluZWQsXG4gICAgICAgICAgKS5sZW5ndGg7XG4gICAgICAgICAgY29uc3QgbWFyZ2luSXRlbXMgPVxuICAgICAgICAgICAgcmFuZ2VTaXplICpcbiAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QQUdJTkFUSU9OLkNVUlNPUl9TQ1JPTExfTUFSR0lOX01VTFRJUExJRVI7XG4gICAgICAgICAgY29uc3QgbWluVmlydHVhbEl0ZW1zID1cbiAgICAgICAgICAgIHJhbmdlU2l6ZSAqXG4gICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUEFHSU5BVElPTi5DVVJTT1JfTUlOX1ZJUlRVQUxfU0laRV9NVUxUSVBMSUVSO1xuICAgICAgICAgIGNvbnN0IGR5bmFtaWNUb3RhbCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgbG9hZGVkSXRlbXNDb3VudCArIG1hcmdpbkl0ZW1zLFxuICAgICAgICAgICAgbWluVmlydHVhbEl0ZW1zLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoZHluYW1pY1RvdGFsICE9PSB0b3RhbEl0ZW1zKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGluZyBjdXJzb3IgdmlydHVhbCBzaXplIGZyb20gJHt0b3RhbEl0ZW1zfSB0byAke2R5bmFtaWNUb3RhbH1gLFxuICAgICAgICAgICAgLy8gKTtcbiAgICAgICAgICAgIHNldFRvdGFsSXRlbXMoZHluYW1pY1RvdGFsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIHZlbG9jaXR5IGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmVsb2NpdHktY2hhbmdlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXZpb3VzVmVsb2NpdHkgPSBjdXJyZW50VmVsb2NpdHk7XG4gICAgICAgIGN1cnJlbnRWZWxvY2l0eSA9IE1hdGguYWJzKGRhdGEudmVsb2NpdHkgfHwgMCk7XG5cbiAgICAgICAgLy8gV2hlbiB2ZWxvY2l0eSBkcm9wcyBiZWxvdyB0aHJlc2hvbGQsIHByb2Nlc3MgcXVldWVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHByZXZpb3VzVmVsb2NpdHkgPiBjYW5jZWxMb2FkVGhyZXNob2xkICYmXG4gICAgICAgICAgY3VycmVudFZlbG9jaXR5IDw9IGNhbmNlbExvYWRUaHJlc2hvbGRcbiAgICAgICAgKSB7XG4gICAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBMaXN0ZW4gZm9yIGlkbGUgc3RhdGUgdG8gcHJvY2VzcyBxdWV1ZVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDppZGxlXCIsIGFzeW5jIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY3VycmVudFZlbG9jaXR5ID0gMDtcblxuICAgICAgICAvLyBSZXNldCBkcmFnZ2luZyBzdGF0ZSBvbiBpZGxlIHNpbmNlIHVzZXIgaGFzIHN0b3BwZWQgbW92aW5nXG4gICAgICAgIGlmIChpc0RyYWdnaW5nKSB7XG4gICAgICAgICAgaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IGN1cnJlbnQgdmlzaWJsZSByYW5nZSBmcm9tIHZpZXdwb3J0XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0U3RhdGUgPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuc3RhdGU7XG4gICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IHZpZXdwb3J0U3RhdGU/LnZpc2libGVSYW5nZTtcblxuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgLy8gQ2xlYXIgc3RhbGUgcmVxdWVzdHMgZnJvbSBxdWV1ZSB0aGF0IGFyZSBmYXIgZnJvbSBjdXJyZW50IHZpc2libGUgcmFuZ2VcbiAgICAgICAgICBjb25zdCBidWZmZXIgPSByYW5nZVNpemUgKiAyOyAvLyBBbGxvdyBzb21lIGJ1ZmZlclxuICAgICAgICAgIGxvYWRSZXF1ZXN0UXVldWUgPSBsb2FkUmVxdWVzdFF1ZXVlLmZpbHRlcigocmVxdWVzdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdEVuZCA9IHJlcXVlc3QucmFuZ2UuZW5kO1xuICAgICAgICAgICAgY29uc3QgcmVxdWVzdFN0YXJ0ID0gcmVxdWVzdC5yYW5nZS5zdGFydDtcbiAgICAgICAgICAgIGNvbnN0IGlzUmVsZXZhbnQgPVxuICAgICAgICAgICAgICByZXF1ZXN0RW5kID49IHZpc2libGVSYW5nZS5zdGFydCAtIGJ1ZmZlciAmJlxuICAgICAgICAgICAgICByZXF1ZXN0U3RhcnQgPD0gdmlzaWJsZVJhbmdlLmVuZCArIGJ1ZmZlcjtcblxuICAgICAgICAgICAgaWYgKCFpc1JlbGV2YW50KSB7XG4gICAgICAgICAgICAgIHJlcXVlc3QucmVzb2x2ZSgpOyAvLyBSZXNvbHZlIHRvIGF2b2lkIGhhbmdpbmcgcHJvbWlzZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpc1JlbGV2YW50O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgLy8gTG9hZCB0aGUgY3VycmVudCB2aXNpYmxlIHJhbmdlIGlmIG5lZWRlZFxuICAgICAgICAgIGF3YWl0IGxvYWRNaXNzaW5nUmFuZ2VzKHZpc2libGVSYW5nZSwgXCJ2aWV3cG9ydDppZGxlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxzbyBwcm9jZXNzIGFueSBxdWV1ZWQgcmVxdWVzdHNcbiAgICAgICAgcHJvY2Vzc1F1ZXVlKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtIHJlbW92YWwgLSBET04nVCBjbGVhciBsb2FkZWRSYW5nZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZWxvYWRcbiAgICAgIC8vIFRoZSBkYXRhIGlzIGFscmVhZHkgc2hpZnRlZCBsb2NhbGx5IGluIGFwaS50cyBhbmQgcmVuZGVyaW5nLnRzXG4gICAgICAvLyBSZWxvYWRpbmcgd291bGQgY2F1c2UgcmFjZSBjb25kaXRpb25zIGFuZCBvdmVyd3JpdGUgdGhlIGNvcnJlY3QgdG90YWxJdGVtc1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtOnJlbW92ZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhgW0NvbGxlY3Rpb25dIGl0ZW06cmVtb3ZlZCBldmVudCAtIGluZGV4OiAke2RhdGEuaW5kZXh9YCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbQ29sbGVjdGlvbl0gaXRlbXMubGVuZ3RoOiAke2l0ZW1zLmxlbmd0aH1gKTtcblxuICAgICAgICAvLyBVcGRhdGUgZGlzY292ZXJlZFRvdGFsIHRvIG1hdGNoIHRoZSBuZXcgY291bnRcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyBzdGFsZSBkaXNjb3ZlcmVkVG90YWwgZnJvbSBiZWluZyB1c2VkIG9uIG5leHQgbG9hZFxuICAgICAgICBpZiAoZGlzY292ZXJlZFRvdGFsICE9PSBudWxsICYmIGRpc2NvdmVyZWRUb3RhbCA+IDApIHtcbiAgICAgICAgICBkaXNjb3ZlcmVkVG90YWwgPSBkaXNjb3ZlcmVkVG90YWwgLSAxO1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBVcGRhdGVkIGRpc2NvdmVyZWRUb3RhbCB0bzogJHtkaXNjb3ZlcmVkVG90YWx9YCxcbiAgICAgICAgICAvLyApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTk9URTogRG8gTk9UIGRlY3JlbWVudCB0b3RhbEl0ZW1zIGhlcmUhXG4gICAgICAgIC8vIGFwaS50cyBhbHJlYWR5IGNhbGxzIHNldFRvdGFsSXRlbXMoKSBhZnRlciBlbWl0dGluZyBpdGVtOnJlbW92ZS1yZXF1ZXN0LFxuICAgICAgICAvLyB3aGljaCBwcm9wZXJseSB1cGRhdGVzIHRvdGFsSXRlbXMuIERlY3JlbWVudGluZyBoZXJlIHdvdWxkIGNhdXNlIGEgZG91YmxlLWRlY3JlbWVudC5cblxuICAgICAgICAvLyBET04nVCBjbGVhciBsb2FkZWRSYW5nZXMgLSB3ZSB3YW50IHRvIGtlZXAgdXNpbmcgdGhlIGxvY2FsIGRhdGFcbiAgICAgICAgLy8gVGhlIGRhdGEgaGFzIGJlZW4gc2hpZnRlZCBsb2NhbGx5IGFuZCBpcyBzdGlsbCB2YWxpZFxuICAgICAgICAvLyBDbGVhcmluZyB3b3VsZCB0cmlnZ2VyIGEgcmVsb2FkIHdoaWNoIGNhdXNlcyByYWNlIGNvbmRpdGlvbnNcbiAgICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAgIC8vICAgYFtDb2xsZWN0aW9uXSBLZWVwaW5nIGxvYWRlZFJhbmdlcyBpbnRhY3Q6YCxcbiAgICAgICAgLy8gICBBcnJheS5mcm9tKGxvYWRlZFJhbmdlcyksXG4gICAgICAgIC8vICk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTG9hZCBpbml0aWFsIGRhdGEgaWYgY29sbGVjdGlvbiBpcyBhdmFpbGFibGUgYW5kIGF1dG9Mb2FkIGlzIGVuYWJsZWRcbiAgICAgIGlmIChjb2xsZWN0aW9uICYmIGF1dG9Mb2FkKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgYW4gaW5pdGlhbCBzY3JvbGwgaW5kZXggT1IgYSBzZWxlY3RJZCwgbG9hZCBkYXRhIGZvciB0aGF0IHBvc2l0aW9uIGRpcmVjdGx5XG4gICAgICAgIC8vIERvbid0IHVzZSBzY3JvbGxUb0luZGV4KCkgYXMgaXQgdHJpZ2dlcnMgYW5pbWF0aW9uL3ZlbG9jaXR5IHRyYWNraW5nXG4gICAgICAgIC8vIHZpcnR1YWwudHMgaGFzIGFscmVhZHkgc2V0IHRoZSBzY3JvbGwgcG9zaXRpb24gYW5kIGNhbGN1bGF0ZWQgdGhlIHZpc2libGUgcmFuZ2VcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCA+IDAgfHxcbiAgICAgICAgICAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCAmJiBzZWxlY3RJZCAhPT0gbnVsbClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gR2V0IHRoZSB2aXNpYmxlIHJhbmdlIHRoYXQgd2FzIGFscmVhZHkgY2FsY3VsYXRlZCBieSB2aXJ0dWFsLnRzXG4gICAgICAgICAgLy8gV2UgbWlzc2VkIHRoZSBpbml0aWFsIHZpZXdwb3J0OnJhbmdlLWNoYW5nZWQgZXZlbnQgYmVjYXVzZSBvdXIgbGlzdGVuZXIgd2Fzbid0IHJlYWR5IHlldFxuICAgICAgICAgIGNvbnN0IHZpc2libGVSYW5nZSA9IGNvbXBvbmVudC52aWV3cG9ydD8uZ2V0VmlzaWJsZVJhbmdlPy4oKTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHZpc2libGVSYW5nZSAmJlxuICAgICAgICAgICAgKHZpc2libGVSYW5nZS5zdGFydCA+IDAgfHwgdmlzaWJsZVJhbmdlLmVuZCA+IDApXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBVc2UgdGhlIHByZS1jYWxjdWxhdGVkIHZpc2libGUgcmFuZ2UgZnJvbSB2aXJ0dWFsLnRzXG4gICAgICAgICAgICBsb2FkTWlzc2luZ1Jhbmdlcyh2aXNpYmxlUmFuZ2UsIFwiaW5pdGlhbC1wb3NpdGlvblwiKVxuICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgLy8gRW1pdCBldmVudCB0byBzZWxlY3QgaXRlbSBhZnRlciBpbml0aWFsIGxvYWQgaWYgc2VsZWN0SWQgaXMgcHJvdmlkZWRcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImNvbGxlY3Rpb246aW5pdGlhbC1sb2FkLWNvbXBsZXRlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0SWQsXG4gICAgICAgICAgICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgICAgICBcIltDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBpbml0aWFsIHBvc2l0aW9uIGRhdGE6XCIsXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlOyAvLyBBbGxvdyBub3JtYWwgbG9hZGluZyBldmVuIG9uIGVycm9yXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjazogY2FsY3VsYXRlIHJhbmdlIGZyb20gaW5pdGlhbFNjcm9sbEluZGV4XG4gICAgICAgICAgICAvLyBUaGlzIGhhbmRsZXMgZWRnZSBjYXNlcyB3aGVyZSB2aXNpYmxlUmFuZ2Ugd2Fzbid0IHJlYWR5XG4gICAgICAgICAgICBjb25zdCBvdmVyc2NhbiA9IDI7XG4gICAgICAgICAgICBjb25zdCBlc3RpbWF0ZWRWaXNpYmxlQ291bnQgPSBNYXRoLmNlaWwoNjAwIC8gNTApOyAvLyB+MTIgaXRlbXNcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5tYXgoMCwgaW5pdGlhbFNjcm9sbEluZGV4IC0gb3ZlcnNjYW4pO1xuICAgICAgICAgICAgY29uc3QgZW5kID0gaW5pdGlhbFNjcm9sbEluZGV4ICsgZXN0aW1hdGVkVmlzaWJsZUNvdW50ICsgb3ZlcnNjYW47XG5cbiAgICAgICAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzKHsgc3RhcnQsIGVuZCB9LCBcImluaXRpYWwtcG9zaXRpb24tZmFsbGJhY2tcIilcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIC8vIEVtaXQgZXZlbnQgdG8gc2VsZWN0IGl0ZW0gYWZ0ZXIgaW5pdGlhbCBsb2FkIGlmIHNlbGVjdElkIGlzIHByb3ZpZGVkXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdElkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdElkLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsU2Nyb2xsSW5kZXgsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgICAgICAgXCJbQ29sbGVjdGlvbl0gRmFpbGVkIHRvIGxvYWQgaW5pdGlhbCBwb3NpdGlvbiBkYXRhIChmYWxsYmFjayk6XCIsXG4gICAgICAgICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGhhc0NvbXBsZXRlZEluaXRpYWxQb3NpdGlvbkxvYWQgPSB0cnVlOyAvLyBBbGxvdyBub3JtYWwgbG9hZGluZyBldmVuIG9uIGVycm9yXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBpbml0aWFsIHNjcm9sbCBpbmRleCAtIGxvYWQgZnJvbSBiZWdpbm5pbmcgYXMgbm9ybWFsXG4gICAgICAgIGxvYWRSYW5nZSgwLCByYW5nZVNpemUpXG4gICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGF1dG9TZWxlY3RGaXJzdCAtIGdldCBmaXJzdCBpdGVtIElEIGFuZCBlbWl0IHNlbGVjdGlvbiBldmVudFxuICAgICAgICAgICAgaWYgKGF1dG9TZWxlY3RGaXJzdCAmJiBpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZpcnN0SXRlbSA9IGl0ZW1zWzBdO1xuICAgICAgICAgICAgICBjb25zdCBmaXJzdElkID0gZmlyc3RJdGVtPy5faWQgfHwgZmlyc3RJdGVtPy5pZDtcbiAgICAgICAgICAgICAgaWYgKGZpcnN0SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RJZDogZmlyc3RJZCxcbiAgICAgICAgICAgICAgICAgIGluaXRpYWxTY3JvbGxJbmRleDogMCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIltDb2xsZWN0aW9uXSBGYWlsZWQgdG8gbG9hZCBpbml0aWFsIGRhdGE6XCIsIGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVzZXQgY29sbGVjdGlvbiBzdGF0ZSB3aXRob3V0IGRlc3Ryb3lpbmcgdGhlIGNvbXBvbmVudFxuICAgICAqIENsZWFycyBhbGwgbG9hZGVkIGRhdGEgYW5kIHByZXBhcmVzIGZvciBmcmVzaCBsb2FkXG4gICAgICovXG4gICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICBsb2dNZW1vcnlTdGF0cyhcInJlc2V0OmJlZm9yZVwiKTtcblxuICAgICAgLy8gQWJvcnQgYWxsIGluLWZsaWdodCByZXF1ZXN0c1xuICAgICAgYWJvcnRDb250cm9sbGVycy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gSWdub3JlIGFib3J0IGVycm9yc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgc3RydWN0dXJlc1xuICAgICAgaXRlbXMubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgcGVuZGluZ1Jhbmdlcy5jbGVhcigpO1xuICAgICAgZmFpbGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVMb2FkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVSZXF1ZXN0cy5jbGVhcigpO1xuICAgICAgY3Vyc29yTWFwLmNsZWFyKCk7XG4gICAgICBwYWdlVG9PZmZzZXRNYXAuY2xlYXIoKTtcblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIHRvdGFsSXRlbXMgPSAwO1xuICAgICAgY3VycmVudEN1cnNvciA9IG51bGw7XG4gICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IDA7XG4gICAgICBkaXNjb3ZlcmVkVG90YWwgPSBudWxsO1xuICAgICAgaGFzUmVhY2hlZEVuZCA9IGZhbHNlO1xuICAgICAgaGFzQ29tcGxldGVkSW5pdGlhbFBvc2l0aW9uTG9hZCA9IGZhbHNlO1xuXG4gICAgICAvLyBSZXNldCBjb3VudGVyc1xuICAgICAgYWN0aXZlTG9hZENvdW50ID0gMDtcbiAgICAgIGNvbXBsZXRlZExvYWRzID0gMDtcbiAgICAgIGZhaWxlZExvYWRzID0gMDtcbiAgICAgIGNhbmNlbGxlZExvYWRzID0gMDtcblxuICAgICAgLy8gVXBkYXRlIGNvbXBvbmVudCByZWZlcmVuY2VcbiAgICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSAwO1xuXG4gICAgICBsb2dNZW1vcnlTdGF0cyhcInJlc2V0OmFmdGVyXCIpO1xuXG4gICAgICAvLyBFbWl0IHJlc2V0IGV2ZW50XG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwiY29sbGVjdGlvbjpyZXNldFwiKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGNvbGxlY3Rpb24gQVBJIHRvIHZpZXdwb3J0XG4gICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24gPSB7XG4gICAgICBsb2FkUmFuZ2U6IChvZmZzZXQ6IG51bWJlciwgbGltaXQ6IG51bWJlcikgPT4gbG9hZFJhbmdlKG9mZnNldCwgbGltaXQpLFxuICAgICAgbG9hZE1pc3NpbmdSYW5nZXM6IChcbiAgICAgICAgcmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSxcbiAgICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICAgKSA9PiBsb2FkTWlzc2luZ1JhbmdlcyhyYW5nZSwgY2FsbGVyIHx8IFwidmlld3BvcnQuY29sbGVjdGlvblwiKSxcbiAgICAgIGdldExvYWRlZFJhbmdlczogKCkgPT4gbG9hZGVkUmFuZ2VzLFxuICAgICAgZ2V0UGVuZGluZ1JhbmdlczogKCkgPT4gcGVuZGluZ1JhbmdlcyxcbiAgICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiBmYWlsZWRSYW5nZXMuY2xlYXIoKSxcbiAgICAgIHJldHJ5RmFpbGVkUmFuZ2UsXG4gICAgICBzZXRUb3RhbEl0ZW1zLFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIC8vIEN1cnNvci1zcGVjaWZpYyBtZXRob2RzXG4gICAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiBjdXJyZW50Q3Vyc29yLFxuICAgICAgZ2V0Q3Vyc29yRm9yUGFnZTogKHBhZ2U6IG51bWJlcikgPT4gY3Vyc29yTWFwLmdldChwYWdlKSB8fCBudWxsLFxuICAgICAgLy8gUmVzZXQgbWV0aG9kIGZvciByZWxvYWQgZnVuY3Rpb25hbGl0eVxuICAgICAgcmVzZXQsXG4gICAgfTtcblxuICAgIC8vIEFkZCBjb2xsZWN0aW9uIGRhdGEgYWNjZXNzIHdpdGggZGlyZWN0IGFzc2lnbm1lbnRcbiAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbiA9IHtcbiAgICAgIGl0ZW1zLFxuICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgZ2V0SXRlbTogKGluZGV4OiBudW1iZXIpID0+IGl0ZW1zW2luZGV4XSxcbiAgICAgIGxvYWRSYW5nZSxcbiAgICAgIGxvYWRNaXNzaW5nUmFuZ2VzOiAoXG4gICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgIGNhbGxlcj86IHN0cmluZyxcbiAgICAgICkgPT4gbG9hZE1pc3NpbmdSYW5nZXMocmFuZ2UsIGNhbGxlciB8fCBcImNvbXBvbmVudC5jb2xsZWN0aW9uXCIpLFxuICAgICAgZ2V0TG9hZGluZ1N0YXRzOiAoKSA9PiAoe1xuICAgICAgICBwZW5kaW5nUmVxdWVzdHM6IGFjdGl2ZUxvYWRDb3VudCxcbiAgICAgICAgY29tcGxldGVkUmVxdWVzdHM6IGNvbXBsZXRlZExvYWRzLFxuICAgICAgICBmYWlsZWRSZXF1ZXN0czogZmFpbGVkTG9hZHMsXG4gICAgICAgIGNhbmNlbGxlZFJlcXVlc3RzOiBjYW5jZWxsZWRMb2FkcyxcbiAgICAgICAgY3VycmVudFZlbG9jaXR5LFxuICAgICAgICBjYW5Mb2FkOiBjYW5Mb2FkKCksXG4gICAgICAgIHF1ZXVlZFJlcXVlc3RzOiBsb2FkUmVxdWVzdFF1ZXVlLmxlbmd0aCxcbiAgICAgIH0pLFxuICAgICAgLy8gVG90YWwgaXRlbXMgbWFuYWdlbWVudFxuICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgIHNldFRvdGFsSXRlbXMsXG4gICAgICAvLyBDdXJzb3IgbWV0aG9kc1xuICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgIGdldEN1cnNvckZvclBhZ2U6IChwYWdlOiBudW1iZXIpID0+IGN1cnNvck1hcC5nZXQocGFnZSkgfHwgbnVsbCxcbiAgICAgIC8vIFJlc2V0IG1ldGhvZCBmb3IgcmVsb2FkIGZ1bmN0aW9uYWxpdHlcbiAgICAgIHJlc2V0LFxuICAgIH07XG5cbiAgICAvLyBBbHNvIGVuc3VyZSBjb21wb25lbnQuaXRlbXMgaXMgdXBkYXRlZFxuICAgIGNvbXBvbmVudC5pdGVtcyA9IGl0ZW1zO1xuXG4gICAgLy8gQ2xlYW51cCBmdW5jdGlvbiAtIGNvbXByZWhlbnNpdmUgbWVtb3J5IGNsZWFudXBcbiAgICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJkZXN0cm95OmJlZm9yZVwiKTtcblxuICAgICAgLy8gQWJvcnQgYWxsIGluLWZsaWdodCByZXF1ZXN0c1xuICAgICAgYWJvcnRDb250cm9sbGVycy5mb3JFYWNoKChjb250cm9sbGVyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gSWdub3JlIGFib3J0IGVycm9yc1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGFib3J0Q29udHJvbGxlcnMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgYWxsIGRhdGEgc3RydWN0dXJlc1xuICAgICAgaXRlbXMubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRSZXF1ZXN0UXVldWUubGVuZ3RoID0gMDtcbiAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgcGVuZGluZ1Jhbmdlcy5jbGVhcigpO1xuICAgICAgZmFpbGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVMb2FkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICBhY3RpdmVSZXF1ZXN0cy5jbGVhcigpO1xuICAgICAgY3Vyc29yTWFwLmNsZWFyKCk7XG4gICAgICBwYWdlVG9PZmZzZXRNYXAuY2xlYXIoKTtcblxuICAgICAgLy8gUmVzZXQgc3RhdGVcbiAgICAgIHRvdGFsSXRlbXMgPSAwO1xuICAgICAgY3VycmVudEN1cnNvciA9IG51bGw7XG4gICAgICBoaWdoZXN0TG9hZGVkUGFnZSA9IDA7XG4gICAgICBkaXNjb3ZlcmVkVG90YWwgPSBudWxsO1xuICAgICAgaGFzUmVhY2hlZEVuZCA9IGZhbHNlO1xuXG4gICAgICAvLyBDbGVhciBjb21wb25lbnQgcmVmZXJlbmNlXG4gICAgICBpZiAoY29tcG9uZW50Lml0ZW1zID09PSBpdGVtcykge1xuICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBbXTtcbiAgICAgIH1cblxuICAgICAgbG9nTWVtb3J5U3RhdHMoXCJkZXN0cm95OmFmdGVyXCIpO1xuICAgIH07XG5cbiAgICAvLyBXaXJlIGRlc3Ryb3kgaW50byB0aGUgY29tcG9uZW50J3MgZGVzdHJveSBjaGFpblxuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgZGVzdHJveSk7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIGNvbGxlY3Rpb246IHtcbiAgICAgICAgLy8gRGF0YSBhY2Nlc3MgbWV0aG9kc1xuICAgICAgICBpdGVtcyxcbiAgICAgICAgZ2V0SXRlbXM6ICgpID0+IGl0ZW1zLFxuICAgICAgICBnZXRJdGVtOiAoaW5kZXg6IG51bWJlcikgPT4gaXRlbXNbaW5kZXhdLFxuICAgICAgICAvLyBMb2FkaW5nIG1ldGhvZHNcbiAgICAgICAgbG9hZFJhbmdlLFxuICAgICAgICBsb2FkTWlzc2luZ1JhbmdlczogKFxuICAgICAgICAgIHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0sXG4gICAgICAgICAgY2FsbGVyPzogc3RyaW5nLFxuICAgICAgICApID0+IGxvYWRNaXNzaW5nUmFuZ2VzKHJhbmdlLCBjYWxsZXIgfHwgXCJyZXR1cm4uY29sbGVjdGlvblwiKSxcbiAgICAgICAgZ2V0TG9hZGVkUmFuZ2VzOiAoKSA9PiBsb2FkZWRSYW5nZXMsXG4gICAgICAgIGdldFBlbmRpbmdSYW5nZXM6ICgpID0+IHBlbmRpbmdSYW5nZXMsXG4gICAgICAgIGNsZWFyRmFpbGVkUmFuZ2VzOiAoKSA9PiBmYWlsZWRSYW5nZXMuY2xlYXIoKSxcbiAgICAgICAgcmV0cnlGYWlsZWRSYW5nZSxcbiAgICAgICAgc2V0VG90YWxJdGVtcyxcbiAgICAgICAgZ2V0VG90YWxJdGVtczogKCkgPT4gdG90YWxJdGVtcyxcbiAgICAgICAgLy8gQ3Vyc29yLXNwZWNpZmljIG1ldGhvZHNcbiAgICAgICAgZ2V0Q3VycmVudEN1cnNvcjogKCkgPT4gY3VycmVudEN1cnNvcixcbiAgICAgICAgZ2V0Q3Vyc29yRm9yUGFnZTogKHBhZ2U6IG51bWJlcikgPT4gY3Vyc29yTWFwLmdldChwYWdlKSB8fCBudWxsLFxuICAgICAgICAvLyBSZXNldCBtZXRob2QgZm9yIHJlbG9hZCBmdW5jdGlvbmFsaXR5XG4gICAgICAgIHJlc2V0LFxuICAgICAgfSxcbiAgICB9O1xuICB9O1xufVxuIiwKICAgICIvLyBzcmMvY29yZS92aWV3cG9ydC9mZWF0dXJlcy9wbGFjZWhvbGRlcnMudHNcblxuLyoqXG4gKiBQbGFjZWhvbGRlciBGZWF0dXJlIC0gU21hcnQgcGxhY2Vob2xkZXIgZ2VuZXJhdGlvblxuICogQW5hbHl6ZXMgZmlyc3QgbG9hZGVkIGRhdGEgdG8gZ2VuZXJhdGUgcmVhbGlzdGljIG1hc2tlZCBwbGFjZWhvbGRlcnNcbiAqIFNob3dzIHBsYWNlaG9sZGVycyB3aGlsZSBkYXRhIGlzIGxvYWRpbmdcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHR5cGUgeyBDb2xsZWN0aW9uQ29tcG9uZW50IH0gZnJvbSBcIi4vY29sbGVjdGlvblwiO1xuaW1wb3J0IHsgVklFV1BPUlRfQ09OU1RBTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHBsYWNlaG9sZGVyIGZlYXR1cmVcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQbGFjZWhvbGRlckNvbmZpZyB7XG4gIGVuYWJsZWQ/OiBib29sZWFuO1xuICBhbmFseXplRmlyc3RMb2FkPzogYm9vbGVhbjtcbiAgbWFza0NoYXJhY3Rlcj86IHN0cmluZztcbiAgcmFuZG9tTGVuZ3RoVmFyaWFuY2U/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEZpZWxkIHN0cnVjdHVyZSBmb3IgcGxhY2Vob2xkZXIgZ2VuZXJhdGlvblxuICovXG5pbnRlcmZhY2UgRmllbGRTdHJ1Y3R1cmUge1xuICBtaW5MZW5ndGg6IG51bWJlcjtcbiAgbWF4TGVuZ3RoOiBudW1iZXI7XG4gIGF2Z0xlbmd0aDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBsYWNlaG9sZGVyQ29tcG9uZW50IHtcbiAgcGxhY2Vob2xkZXJzOiB7XG4gICAgYW5hbHl6ZURhdGFTdHJ1Y3R1cmU6IChpdGVtczogYW55W10pID0+IHZvaWQ7XG4gICAgaGFzQW5hbHl6ZWRTdHJ1Y3R1cmU6ICgpID0+IGJvb2xlYW47XG4gICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW06IChpbmRleDogbnVtYmVyKSA9PiBhbnk7XG4gICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zOiAocmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSkgPT4gYW55W107XG4gICAgc2hvd1BsYWNlaG9sZGVyczogKHJhbmdlOiB7IHN0YXJ0OiBudW1iZXI7IGVuZDogbnVtYmVyIH0pID0+IHZvaWQ7XG4gICAgaXNQbGFjZWhvbGRlcjogKGl0ZW06IGFueSkgPT4gYm9vbGVhbjtcbiAgICByZXBsYWNlUGxhY2Vob2xkZXJzOiAoaXRlbXM6IGFueVtdLCBvZmZzZXQ6IG51bWJlcikgPT4gdm9pZDtcbiAgICBjbGVhcjogKCkgPT4gdm9pZDtcbiAgfTtcbn1cblxuLyoqXG4gKiBBZGRzIHBsYWNlaG9sZGVyIGZ1bmN0aW9uYWxpdHkgdG8gdmlld3BvcnQgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUGxhY2Vob2xkZXJzKGNvbmZpZzogUGxhY2Vob2xkZXJDb25maWcgPSB7fSkge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBWaWV3cG9ydENvbnRleHQgJiBDb2xsZWN0aW9uQ29tcG9uZW50PihcbiAgICBjb21wb25lbnQ6IFRcbiAgKTogVCAmIFBsYWNlaG9sZGVyQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBlbmFibGVkID0gdHJ1ZSxcbiAgICAgIGFuYWx5emVGaXJzdExvYWQgPSB0cnVlLFxuICAgICAgbWFza0NoYXJhY3RlciA9IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUixcbiAgICAgIHJhbmRvbUxlbmd0aFZhcmlhbmNlID0gVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSXG4gICAgICAgIC5SQU5ET01fTEVOR1RIX1ZBUklBTkNFLFxuICAgIH0gPSBjb25maWc7XG5cbiAgICAvLyBTdGF0ZVxuICAgIGxldCBmaWVsZFN0cnVjdHVyZXM6IE1hcDxzdHJpbmcsIEZpZWxkU3RydWN0dXJlPiB8IG51bGwgPSBudWxsO1xuICAgIGxldCBoYXNBbmFseXplZCA9IGZhbHNlO1xuICAgIGxldCBwbGFjZWhvbGRlcklkQ291bnRlciA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBBbmFseXplIGRhdGEgc3RydWN0dXJlIGZyb20gZmlyc3QgbG9hZGVkIGl0ZW1zXG4gICAgICovXG4gICAgY29uc3QgYW5hbHl6ZURhdGFTdHJ1Y3R1cmUgPSAoaXRlbXM6IGFueVtdKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWVuYWJsZWQgfHwgaGFzQW5hbHl6ZWQgfHwgIWl0ZW1zLmxlbmd0aCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIGNvbnNvbGUubG9nKFxuICAgICAgLy8gICBg8J+UjSBbUExBQ0VIT0xERVJTXSBBbmFseXppbmcgZGF0YSBzdHJ1Y3R1cmUgZnJvbSAke2l0ZW1zLmxlbmd0aH0gaXRlbXNgXG4gICAgICAvLyApO1xuXG4gICAgICBjb25zdCBzdHJ1Y3R1cmVzID0gbmV3IE1hcDxzdHJpbmcsIEZpZWxkU3RydWN0dXJlPigpO1xuICAgICAgY29uc3Qgc2FtcGxlU2l6ZSA9IE1hdGgubWluKFxuICAgICAgICBpdGVtcy5sZW5ndGgsXG4gICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVhfU0FNUExFX1NJWkVcbiAgICAgICk7XG5cbiAgICAgIC8vIEFuYWx5emUgZWFjaCBmaWVsZCBhY3Jvc3MgYWxsIHNhbXBsZSBpdGVtc1xuICAgICAgY29uc3QgZmllbGRTdGF0cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXJbXT4oKTtcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzYW1wbGVTaXplOyBpKyspIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICBpZiAoIWl0ZW0gfHwgdHlwZW9mIGl0ZW0gIT09IFwib2JqZWN0XCIpIGNvbnRpbnVlO1xuXG4gICAgICAgIE9iamVjdC5rZXlzKGl0ZW0pLmZvckVhY2goKGZpZWxkKSA9PiB7XG4gICAgICAgICAgLy8gU2tpcCBpbnRlcm5hbCBmaWVsZHNcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBmaWVsZC5zdGFydHNXaXRoKFwiX1wiKSB8fFxuICAgICAgICAgICAgZmllbGQgPT09IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5QTEFDRUhPTERFUl9GTEFHXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBTdHJpbmcoaXRlbVtmaWVsZF0gfHwgXCJcIik7XG4gICAgICAgICAgY29uc3QgbGVuZ3RoID0gdmFsdWUubGVuZ3RoO1xuXG4gICAgICAgICAgaWYgKCFmaWVsZFN0YXRzLmhhcyhmaWVsZCkpIHtcbiAgICAgICAgICAgIGZpZWxkU3RhdHMuc2V0KGZpZWxkLCBbXSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZpZWxkU3RhdHMuZ2V0KGZpZWxkKSEucHVzaChsZW5ndGgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2FsY3VsYXRlIHN0YXRpc3RpY3MgZm9yIGVhY2ggZmllbGRcbiAgICAgIGZpZWxkU3RhdHMuZm9yRWFjaCgobGVuZ3RocywgZmllbGQpID0+IHtcbiAgICAgICAgaWYgKGxlbmd0aHMubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgbWluTGVuZ3RoID0gTWF0aC5taW4oLi4ubGVuZ3Rocyk7XG4gICAgICAgIGNvbnN0IG1heExlbmd0aCA9IE1hdGgubWF4KC4uLmxlbmd0aHMpO1xuICAgICAgICBjb25zdCBhdmdMZW5ndGggPSBNYXRoLnJvdW5kKFxuICAgICAgICAgIGxlbmd0aHMucmVkdWNlKChzdW0sIGxlbikgPT4gc3VtICsgbGVuLCAwKSAvIGxlbmd0aHMubGVuZ3RoXG4gICAgICAgICk7XG5cbiAgICAgICAgc3RydWN0dXJlcy5zZXQoZmllbGQsIHtcbiAgICAgICAgICBtaW5MZW5ndGgsXG4gICAgICAgICAgbWF4TGVuZ3RoLFxuICAgICAgICAgIGF2Z0xlbmd0aCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgZmllbGRTdHJ1Y3R1cmVzID0gc3RydWN0dXJlcztcbiAgICAgIGhhc0FuYWx5emVkID0gdHJ1ZTtcblxuICAgICAgLy8gY29uc29sZS5sb2coXG4gICAgICAvLyAgIGDinIUgW1BMQUNFSE9MREVSU10gU3RydWN0dXJlIGFuYWx5emVkOmAsXG4gICAgICAvLyAgIE9iamVjdC5mcm9tRW50cmllcyhzdHJ1Y3R1cmVzKVxuICAgICAgLy8gKTtcblxuICAgICAgLy8gRW1pdCBldmVudFxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnBsYWNlaG9sZGVycy1zdHJ1Y3R1cmUtYW5hbHl6ZWRcIiwge1xuICAgICAgICBzdHJ1Y3R1cmU6IE9iamVjdC5mcm9tRW50cmllcyhzdHJ1Y3R1cmVzKSxcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSBhIHNpbmdsZSBwbGFjZWhvbGRlciBpdGVtXG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0gPSAoaW5kZXg6IG51bWJlcik6IGFueSA9PiB7XG4gICAgICBjb25zdCBwbGFjZWhvbGRlcjogUmVjb3JkPHN0cmluZywgYW55PiA9IHtcbiAgICAgICAgaWQ6IGBwbGFjZWhvbGRlci0ke3BsYWNlaG9sZGVySWRDb3VudGVyKyt9YCxcbiAgICAgICAgW1ZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5QTEFDRUhPTERFUl9GTEFHXTogdHJ1ZSxcbiAgICAgICAgX2luZGV4OiBpbmRleCxcbiAgICAgIH07XG5cbiAgICAgIGlmICghZmllbGRTdHJ1Y3R1cmVzIHx8IGZpZWxkU3RydWN0dXJlcy5zaXplID09PSAwKSB7XG4gICAgICAgIC8vIE5vIHN0cnVjdHVyZSBhbmFseXplZCB5ZXQgLSByZXR1cm4gYmFzaWMgcGxhY2Vob2xkZXJcbiAgICAgICAgcGxhY2Vob2xkZXIubGFiZWwgPSBtYXNrQ2hhcmFjdGVyLnJlcGVhdCgxMCk7XG4gICAgICAgIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICAgIH1cblxuICAgICAgLy8gR2VuZXJhdGUgZmllbGRzIGJhc2VkIG9uIGFuYWx5emVkIHN0cnVjdHVyZVxuICAgICAgZmllbGRTdHJ1Y3R1cmVzLmZvckVhY2goKHN0cnVjdHVyZSwgZmllbGQpID0+IHtcbiAgICAgICAgbGV0IGxlbmd0aDogbnVtYmVyO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICByYW5kb21MZW5ndGhWYXJpYW5jZSAmJlxuICAgICAgICAgIHN0cnVjdHVyZS5taW5MZW5ndGggIT09IHN0cnVjdHVyZS5tYXhMZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gUmFuZG9tIGxlbmd0aCB3aXRoaW4gcmFuZ2VcbiAgICAgICAgICBsZW5ndGggPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgTWF0aC5yYW5kb20oKSAqIChzdHJ1Y3R1cmUubWF4TGVuZ3RoIC0gc3RydWN0dXJlLm1pbkxlbmd0aCArIDEpICtcbiAgICAgICAgICAgICAgc3RydWN0dXJlLm1pbkxlbmd0aFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gVXNlIGF2ZXJhZ2UgbGVuZ3RoXG4gICAgICAgICAgbGVuZ3RoID0gc3RydWN0dXJlLmF2Z0xlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFwcGx5IHNvbWUgdmFyaWF0aW9uIHRvIG1ha2UgaXQgbG9vayBtb3JlIG5hdHVyYWxcbiAgICAgICAgaWYgKHJhbmRvbUxlbmd0aFZhcmlhbmNlICYmIE1hdGgucmFuZG9tKCkgPCAwLjMpIHtcbiAgICAgICAgICBsZW5ndGggPSBNYXRoLm1heCgxLCBsZW5ndGggKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAzKSAtIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcGxhY2Vob2xkZXJbZmllbGRdID0gbWFza0NoYXJhY3Rlci5yZXBlYXQobGVuZ3RoKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcGxhY2Vob2xkZXI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlIG11bHRpcGxlIHBsYWNlaG9sZGVyIGl0ZW1zXG4gICAgICovXG4gICAgY29uc3QgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zID0gKHJhbmdlOiB7XG4gICAgICBzdGFydDogbnVtYmVyO1xuICAgICAgZW5kOiBudW1iZXI7XG4gICAgfSk6IGFueVtdID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1zOiBhbnlbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IHJhbmdlLnN0YXJ0OyBpIDw9IHJhbmdlLmVuZDsgaSsrKSB7XG4gICAgICAgIGl0ZW1zLnB1c2goZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW0oaSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGl0ZW1zO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTaG93IHBsYWNlaG9sZGVycyBmb3IgYSByYW5nZVxuICAgICAqL1xuICAgIGNvbnN0IHNob3dQbGFjZWhvbGRlcnMgPSAocmFuZ2U6IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfSk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFlbmFibGVkKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IGdlbmVyYXRlUGxhY2Vob2xkZXJJdGVtcyhyYW5nZSk7XG5cbiAgICAgIC8vIFVwZGF0ZSBpdGVtcyBhcnJheVxuICAgICAgaWYgKGNvbXBvbmVudC5pdGVtcykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsYWNlaG9sZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gcmFuZ2Uuc3RhcnQgKyBpO1xuICAgICAgICAgIGlmICghY29tcG9uZW50Lml0ZW1zW2luZGV4XSkge1xuICAgICAgICAgICAgY29tcG9uZW50Lml0ZW1zW2luZGV4XSA9IHBsYWNlaG9sZGVyc1tpXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGDwn5SEIFtQTEFDRUhPTERFUlNdIFNob3dpbmcgJHtwbGFjZWhvbGRlcnMubGVuZ3RofSBwbGFjZWhvbGRlcnMgZm9yIHJhbmdlICR7cmFuZ2Uuc3RhcnR9LSR7cmFuZ2UuZW5kfWBcbiAgICAgICk7XG5cbiAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDpwbGFjZWhvbGRlcnMtc2hvd25cIiwge1xuICAgICAgICByYW5nZSxcbiAgICAgICAgY291bnQ6IHBsYWNlaG9sZGVycy5sZW5ndGgsXG4gICAgICB9KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgYW4gaXRlbSBpcyBhIHBsYWNlaG9sZGVyXG4gICAgICovXG4gICAgY29uc3QgaXNQbGFjZWhvbGRlciA9IChpdGVtOiBhbnkpOiBib29sZWFuID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGl0ZW0gJiZcbiAgICAgICAgdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgaXRlbVtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuUExBQ0VIT0xERVJfRkxBR10gPT09IHRydWVcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlcGxhY2UgcGxhY2Vob2xkZXJzIHdpdGggcmVhbCBkYXRhXG4gICAgICovXG4gICAgY29uc3QgcmVwbGFjZVBsYWNlaG9sZGVycyA9IChpdGVtczogYW55W10sIG9mZnNldDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWNvbXBvbmVudC5pdGVtcykgcmV0dXJuO1xuXG4gICAgICBsZXQgcmVwbGFjZWRDb3VudCA9IDA7XG5cbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBvZmZzZXQgKyBpO1xuICAgICAgICBjb25zdCBjdXJyZW50SXRlbSA9IGNvbXBvbmVudC5pdGVtc1tpbmRleF07XG5cbiAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXIoY3VycmVudEl0ZW0pKSB7XG4gICAgICAgICAgY29tcG9uZW50Lml0ZW1zW2luZGV4XSA9IGl0ZW1zW2ldO1xuICAgICAgICAgIHJlcGxhY2VkQ291bnQrKztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmVwbGFjZWRDb3VudCA+IDApIHtcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgYOKcqCBbUExBQ0VIT0xERVJTXSBSZXBsYWNlZCAke3JlcGxhY2VkQ291bnR9IHBsYWNlaG9sZGVycyBhdCBvZmZzZXQgJHtvZmZzZXR9YFxuICAgICAgICApO1xuXG4gICAgICAgIC8vIEVtaXQgZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnBsYWNlaG9sZGVycy1yZXBsYWNlZFwiLCB7XG4gICAgICAgICAgb2Zmc2V0LFxuICAgICAgICAgIGNvdW50OiByZXBsYWNlZENvdW50LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ2xlYXIgYWxsIHBsYWNlaG9sZGVyIHN0YXRlXG4gICAgICovXG4gICAgY29uc3QgY2xlYXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBmaWVsZFN0cnVjdHVyZXMgPSBudWxsO1xuICAgICAgaGFzQW5hbHl6ZWQgPSBmYWxzZTtcbiAgICAgIHBsYWNlaG9sZGVySWRDb3VudGVyID0gMDtcbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBmdW5jdGlvblxuICAgIGNvbnN0IGluaXRpYWxpemUgPSAoKSA9PiB7XG4gICAgICBpZiAoIWVuYWJsZWQpIHJldHVybjtcblxuICAgICAgLy8gTGlzdGVuIGZvciBmaXJzdCBkYXRhIGxvYWQgdG8gYW5hbHl6ZSBzdHJ1Y3R1cmVcbiAgICAgIGlmIChhbmFseXplRmlyc3RMb2FkKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZVJhbmdlTG9hZGVkID0gKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghaGFzQW5hbHl6ZWQgJiYgZGF0YS5pdGVtcyAmJiBkYXRhLml0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFuYWx5emVEYXRhU3RydWN0dXJlKGRhdGEuaXRlbXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFJlcGxhY2UgYW55IHBsYWNlaG9sZGVycyB3aXRoIHJlYWwgZGF0YVxuICAgICAgICAgIHJlcGxhY2VQbGFjZWhvbGRlcnMoZGF0YS5pdGVtcywgZGF0YS5vZmZzZXQpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIGhhbmRsZVJhbmdlTG9hZGVkKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2hvdyBpbml0aWFsIHBsYWNlaG9sZGVycyBpZiBjb25maWd1cmVkXG4gICAgICBjb25zdCB0b3RhbEl0ZW1zID0gY29tcG9uZW50LmNvbGxlY3Rpb24/LmdldFRvdGFsSXRlbXMoKSB8fCAwO1xuICAgICAgaWYgKHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgIGNvbnN0IGluaXRpYWxSYW5nZSA9IHtcbiAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICBlbmQ6IE1hdGgubWluKFxuICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLk1BWF9TQU1QTEVfU0laRSAtIDEsXG4gICAgICAgICAgICB0b3RhbEl0ZW1zIC0gMVxuICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICAgIHNob3dQbGFjZWhvbGRlcnMoaW5pdGlhbFJhbmdlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQ2xlYW51cCBmdW5jdGlvblxuICAgIGNvbnN0IGRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBjbGVhcigpO1xuICAgIH07XG5cbiAgICAvLyBTdG9yZSBmdW5jdGlvbnMgZm9yIHZpZXdwb3J0IHRvIGNhbGxcbiAgICAoY29tcG9uZW50IGFzIGFueSkuX3BsYWNlaG9sZGVyc0luaXRpYWxpemUgPSBpbml0aWFsaXplO1xuICAgIChjb21wb25lbnQgYXMgYW55KS5fcGxhY2Vob2xkZXJzRGVzdHJveSA9IGRlc3Ryb3k7XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHBsYWNlaG9sZGVyczoge1xuICAgICAgICBhbmFseXplRGF0YVN0cnVjdHVyZSxcbiAgICAgICAgaGFzQW5hbHl6ZWRTdHJ1Y3R1cmU6ICgpID0+IGhhc0FuYWx5emVkLFxuICAgICAgICBnZW5lcmF0ZVBsYWNlaG9sZGVySXRlbSxcbiAgICAgICAgZ2VuZXJhdGVQbGFjZWhvbGRlckl0ZW1zLFxuICAgICAgICBzaG93UGxhY2Vob2xkZXJzLFxuICAgICAgICBpc1BsYWNlaG9sZGVyLFxuICAgICAgICByZXBsYWNlUGxhY2Vob2xkZXJzLFxuICAgICAgICBjbGVhcixcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn1cbiIsCiAgICAiLyoqXG4gKiBSZW5kZXJpbmcgRmVhdHVyZSAtIEl0ZW0gcmVuZGVyaW5nIGFuZCBwb3NpdGlvbmluZyBmb3Igdmlld3BvcnRcbiAqIEhhbmRsZXMgRE9NIGVsZW1lbnQgY3JlYXRpb24sIHBvc2l0aW9uaW5nLCByZWN5Y2xpbmcsIGFuZCB1cGRhdGVzXG4gKi9cblxuaW1wb3J0IHsgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzLCBoYXNDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZJRVdQT1JUX0NPTlNUQU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIGlzUGxhY2Vob2xkZXIsXG4gIGdldFZpZXdwb3J0U3RhdGUsXG4gIHdyYXBJbml0aWFsaXplLFxuICB3cmFwRGVzdHJveSxcbn0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUxheW91dCB9IGZyb20gXCIuLi8uLi9sYXlvdXRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSZW5kZXJpbmdDb25maWcge1xuICB0ZW1wbGF0ZT86IChcbiAgICBpdGVtOiBhbnksXG4gICAgaW5kZXg6IG51bWJlcixcbiAgKSA9PiBzdHJpbmcgfCBIVE1MRWxlbWVudCB8IGFueVtdIHwgUmVjb3JkPHN0cmluZywgYW55PjtcbiAgb3ZlcnNjYW4/OiBudW1iZXI7XG4gIG1lYXN1cmVJdGVtcz86IGJvb2xlYW47XG4gIGVuYWJsZVJlY3ljbGluZz86IGJvb2xlYW47XG4gIG1heFBvb2xTaXplPzogbnVtYmVyO1xuICAvKipcbiAgICogTWFpbnRhaW4gRE9NIG9yZGVyIHRvIG1hdGNoIHZpc3VhbCBpbmRleCBvcmRlci5cbiAgICogRW5hYmxlcyBDU1Mgc2VsZWN0b3JzIGxpa2UgOmZpcnN0LWNoaWxkLCA6bnRoLWNoaWxkKCkgdG8gd29yayBjb3JyZWN0bHkuXG4gICAqIERlZmF1bHQ6IHRydWVcbiAgICovXG4gIG1haW50YWluRG9tT3JkZXI/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgVmlld3BvcnRTdGF0ZSB7XG4gIHNjcm9sbFBvc2l0aW9uOiBudW1iZXI7XG4gIHRvdGFsSXRlbXM6IG51bWJlcjtcbiAgaXRlbVNpemU6IG51bWJlcjtcbiAgY29udGFpbmVyU2l6ZTogbnVtYmVyO1xuICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXI7XG4gIHZpc2libGVSYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9O1xuICBpdGVtc0NvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsO1xufVxuXG4vKipcbiAqIFJlbmRlcmluZyBmZWF0dXJlIGZvciB2aWV3cG9ydFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFJlbmRlcmluZyA9IChjb25maWc6IFJlbmRlcmluZ0NvbmZpZyA9IHt9KSA9PiB7XG4gIHJldHVybiA8VCBleHRlbmRzIFZpZXdwb3J0Q29udGV4dCAmIFZpZXdwb3J0Q29tcG9uZW50Pihjb21wb25lbnQ6IFQpOiBUID0+IHtcbiAgICBjb25zdCB7XG4gICAgICB0ZW1wbGF0ZSxcbiAgICAgIG92ZXJzY2FuID0gNSxcbiAgICAgIG1lYXN1cmVJdGVtcyA9IGZhbHNlLFxuICAgICAgZW5hYmxlUmVjeWNsaW5nID0gdHJ1ZSxcbiAgICAgIG1heFBvb2xTaXplID0gVklFV1BPUlRfQ09OU1RBTlRTLlJFTkRFUklORy5ERUZBVUxUX01BWF9QT09MX1NJWkUsXG4gICAgICBtYWludGFpbkRvbU9yZGVyID0gdHJ1ZSxcbiAgICB9ID0gY29uZmlnO1xuXG4gICAgLy8gSGVscGVyIHRvIGdldCBpdGVtcyBmcm9tIGNvbGxlY3Rpb24gKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgpXG4gICAgY29uc3QgZ2V0Q29sbGVjdGlvbkl0ZW1zID0gKCk6IGFueVtdID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5pdGVtcyB8fCAoY29tcG9uZW50IGFzIGFueSkuaXRlbXMgfHwgW11cbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIFN0YXRlXG4gICAgY29uc3QgcmVuZGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBIVE1MRWxlbWVudD4oKTtcbiAgICBjb25zdCBlbGVtZW50UG9vbDogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgIGNvbnN0IHBvb2xTdGF0cyA9IHsgY3JlYXRlZDogMCwgcmVjeWNsZWQ6IDAsIHBvb2xTaXplOiAwLCByZWxlYXNlZDogMCB9O1xuXG4gICAgLy8gU3RvcmUgbGF5b3V0IHJlc3VsdHMgZm9yIHByb3BlciBjbGVhbnVwIChwcmV2ZW50cyBtZW1vcnkgbGVhaylcbiAgICBjb25zdCBsYXlvdXRSZXN1bHRzID0gbmV3IFdlYWtNYXA8SFRNTEVsZW1lbnQsIHsgZGVzdHJveTogKCkgPT4gdm9pZCB9PigpO1xuXG4gICAgLy8gUmV1c2FibGUgdGVtcGxhdGUgZWxlbWVudCBmb3IgSFRNTCBzdHJpbmcgcGFyc2luZyAobW9yZSBlZmZpY2llbnQgdGhhbiBkaXYpXG4gICAgY29uc3QgdGVtcGxhdGVQYXJzZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGVtcGxhdGVcIik7XG5cbiAgICBsZXQgdmlld3BvcnRTdGF0ZTogVmlld3BvcnRTdGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIGxldCBjdXJyZW50VmlzaWJsZVJhbmdlID0geyBzdGFydDogMCwgZW5kOiAwIH07XG4gICAgbGV0IGxhc3RSZW5kZXJUaW1lID0gMDtcbiAgICBsZXQgaXNSZW1vdmluZ0l0ZW0gPSBmYWxzZTtcblxuICAgIC8vIEVsZW1lbnQgcG9vbCBtYW5hZ2VtZW50XG4gICAgY29uc3QgZ2V0UG9vbGVkRWxlbWVudCA9ICgpOiBIVE1MRWxlbWVudCA9PiB7XG4gICAgICBpZiAoZW5hYmxlUmVjeWNsaW5nICYmIGVsZW1lbnRQb29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcG9vbFN0YXRzLnJlY3ljbGVkKys7XG4gICAgICAgIHJldHVybiBlbGVtZW50UG9vbC5wb3AoKSE7XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIjtcbiAgICAgIHBvb2xTdGF0cy5jcmVhdGVkKys7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVsZWFzZUVsZW1lbnQgPSAoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkID0+IHtcbiAgICAgIHBvb2xTdGF0cy5yZWxlYXNlZCsrO1xuXG4gICAgICAvLyBDUklUSUNBTDogQ2FsbCBkZXN0cm95IG9uIGxheW91dFJlc3VsdCB0byBjbGVhbiB1cCBjb21wb25lbnRzIGFuZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgIC8vIFRoaXMgZml4ZXMgdGhlIG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgbGF5b3V0IHRlbXBsYXRlc1xuICAgICAgY29uc3QgbGF5b3V0UmVzdWx0ID0gbGF5b3V0UmVzdWx0cy5nZXQoZWxlbWVudCk7XG4gICAgICBpZiAobGF5b3V0UmVzdWx0ICYmIHR5cGVvZiBsYXlvdXRSZXN1bHQuZGVzdHJveSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGF5b3V0UmVzdWx0LmRlc3Ryb3koKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIElnbm9yZSBkZXN0cm95IGVycm9ycyAtIGVsZW1lbnQgbWF5IGFscmVhZHkgYmUgY2xlYW5lZCB1cFxuICAgICAgICB9XG4gICAgICAgIGxheW91dFJlc3VsdHMuZGVsZXRlKGVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWVuYWJsZVJlY3ljbGluZykge1xuICAgICAgICBlbGVtZW50LnJlbW92ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBDbGVhbiBlbGVtZW50IGZvciByZXVzZSAobm8gY2xvbmluZyAtIHJldXNlIHRoZSBhY3R1YWwgZWxlbWVudClcbiAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gXCJtdHJsLXZpZXdwb3J0LWl0ZW1cIjtcbiAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1pbmRleFwiKTtcbiAgICAgIGVsZW1lbnQuc3R5bGUuY3NzVGV4dCA9IFwiXCI7XG4gICAgICBlbGVtZW50LmlubmVySFRNTCA9IFwiXCI7XG5cbiAgICAgIC8vIFJlbW92ZSBmcm9tIERPTSBmaXJzdFxuICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICBlbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkZCB0byBwb29sIGlmIG5vdCBmdWxsXG4gICAgICBpZiAoZWxlbWVudFBvb2wubGVuZ3RoIDwgbWF4UG9vbFNpemUpIHtcbiAgICAgICAgZWxlbWVudFBvb2wucHVzaChlbGVtZW50KTtcbiAgICAgICAgcG9vbFN0YXRzLnBvb2xTaXplID0gZWxlbWVudFBvb2wubGVuZ3RoO1xuICAgICAgfVxuICAgICAgLy8gSWYgcG9vbCBpcyBmdWxsLCBlbGVtZW50IGlzIGp1c3QgZGVyZWZlcmVuY2VkIGFuZCBHQydkXG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemVcbiAgICB3cmFwSW5pdGlhbGl6ZShjb21wb25lbnQsICgpID0+IHtcbiAgICAgIHZpZXdwb3J0U3RhdGUgPSBnZXRWaWV3cG9ydFN0YXRlKGNvbXBvbmVudCkgYXMgVmlld3BvcnRTdGF0ZTtcblxuICAgICAgLy8gU2V0IGluaXRpYWwgaXRlbXMgY29udGFpbmVyIGhlaWdodCBmcm9tIGN1cnJlbnQgdmlydHVhbCBzaXplXG4gICAgICBpZiAodmlld3BvcnRTdGF0ZT8uaXRlbXNDb250YWluZXIgJiYgdmlld3BvcnRTdGF0ZS52aXJ0dWFsVG90YWxTaXplID4gMCkge1xuICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke3ZpZXdwb3J0U3RhdGUudmlydHVhbFRvdGFsU2l6ZX1weGA7XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgaXRlbSB1cGRhdGUgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbTp1cGRhdGUtcmVxdWVzdFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIGl0ZW0sIHByZXZpb3VzSXRlbSB9ID0gZGF0YTtcblxuICAgICAgICAvLyBJdGVtIGlzIGFscmVhZHkgdXBkYXRlZCBpbiBjb2xsZWN0aW9uLml0ZW1zIGJ5IGFwaS50c1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgaXRlbSBpcyBjdXJyZW50bHkgcmVuZGVyZWRcbiAgICAgICAgY29uc3QgZXhpc3RpbmdFbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoaW5kZXgpO1xuICAgICAgICBjb25zdCB3YXNWaXNpYmxlID0gISFleGlzdGluZ0VsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaXRlbSB3YXMgc2VsZWN0ZWQgYmVmb3JlIHVwZGF0ZVxuICAgICAgICBjb25zdCB3YXNTZWxlY3RlZCA9IGV4aXN0aW5nRWxlbWVudFxuICAgICAgICAgID8gaGFzQ2xhc3MoXG4gICAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudCxcbiAgICAgICAgICAgICAgVklFV1BPUlRfQ09OU1RBTlRTLlNFTEVDVElPTi5TRUxFQ1RFRF9DTEFTUyxcbiAgICAgICAgICAgICkgfHwgaGFzQ2xhc3MoZXhpc3RpbmdFbGVtZW50LCBcIm10cmwtdmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIilcbiAgICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAgIGlmIChleGlzdGluZ0VsZW1lbnQgJiYgZXhpc3RpbmdFbGVtZW50LnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAvLyBSZS1yZW5kZXIgdGhlIGl0ZW1cbiAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpbmRleCk7XG5cbiAgICAgICAgICBpZiAobmV3RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gQ29weSBwb3NpdGlvbiBzdHlsZXMgZnJvbSBleGlzdGluZyBlbGVtZW50XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG5ld0VsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgICAgcG9zaXRpb246IGV4aXN0aW5nRWxlbWVudC5zdHlsZS5wb3NpdGlvbixcbiAgICAgICAgICAgICAgdHJhbnNmb3JtOiBleGlzdGluZ0VsZW1lbnQuc3R5bGUudHJhbnNmb3JtLFxuICAgICAgICAgICAgICB3aWR0aDogZXhpc3RpbmdFbGVtZW50LnN0eWxlLndpZHRoLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFByZXNlcnZlIHNlbGVjdGVkIHN0YXRlXG4gICAgICAgICAgICBpZiAod2FzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlNFTEVDVElPTi5TRUxFQ1RFRF9DTEFTUyk7XG4gICAgICAgICAgICAgIGFkZENsYXNzKG5ld0VsZW1lbnQsIFwibXRybC12aWV3cG9ydC1pdGVtLS1zZWxlY3RlZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRkIHVwZGF0ZSBhbmltYXRpb24gY2xhc3MgdG8gaW5uZXIgY29udGVudCBmb3IgdmlzaWJpbGl0eVxuICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS11cGRhdGVkXCIpO1xuICAgICAgICAgICAgLy8gQWxzbyB0cnkgdG8gYWRkIHRvIGZpcnN0IGNoaWxkIGlmIGl0IGV4aXN0cyAodGhlIGFjdHVhbCBpdGVtIGNvbnRlbnQpXG4gICAgICAgICAgICBjb25zdCBpbm5lckl0ZW0gPSBuZXdFbGVtZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgaWYgKGlubmVySXRlbSkge1xuICAgICAgICAgICAgICBhZGRDbGFzcyhpbm5lckl0ZW0sIFwiaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVwbGFjZSBpbiBET01cbiAgICAgICAgICAgIGV4aXN0aW5nRWxlbWVudC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChcbiAgICAgICAgICAgICAgbmV3RWxlbWVudCxcbiAgICAgICAgICAgICAgZXhpc3RpbmdFbGVtZW50LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGluZGV4LCBuZXdFbGVtZW50KTtcbiAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGV4aXN0aW5nRWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYW5pbWF0aW9uIGNsYXNzIGFmdGVyIHRyYW5zaXRpb25cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICByZW1vdmVDbGFzcyhuZXdFbGVtZW50LCBcInZpZXdwb3J0LWl0ZW0tLXVwZGF0ZWRcIik7XG4gICAgICAgICAgICAgIGlmIChpbm5lckl0ZW0pIHtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhpbm5lckl0ZW0sIFwiaXRlbS0tdXBkYXRlZFwiKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW06dXBkYXRlZFwiLCB7XG4gICAgICAgICAgaXRlbSxcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBwcmV2aW91c0l0ZW0sXG4gICAgICAgICAgd2FzVmlzaWJsZSxcbiAgICAgICAgICB3YXNTZWxlY3RlZCxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtIHJlbW92ZSByZXF1ZXN0cyBmcm9tIEFQSVxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJpdGVtOnJlbW92ZS1yZXF1ZXN0XCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgaXRlbSB9ID0gZGF0YTtcbiAgICAgICAgaXNSZW1vdmluZ0l0ZW0gPSB0cnVlO1xuXG4gICAgICAgIC8vIEl0ZW0gaXMgYWxyZWFkeSByZW1vdmVkIGZyb20gY29sbGVjdGlvbi5pdGVtcyBieSBhcGkudHNcbiAgICAgICAgLy8gV2UganVzdCBuZWVkIHRvIHVwZGF0ZSByZW5kZXJlZCBlbGVtZW50c1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgcmVuZGVyZWQgZWxlbWVudCBhdCB0aGlzIGluZGV4XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcbiAgICAgICAgaWYgKGV4aXN0aW5nRWxlbWVudCAmJiBleGlzdGluZ0VsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGV4aXN0aW5nRWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5kZWxldGUoaW5kZXgpO1xuXG4gICAgICAgIC8vIFNoaWZ0IHJlbmRlcmVkIGVsZW1lbnRzIGluZGljZXMgZG93blxuICAgICAgICBjb25zdCByZW5kZXJlZEtleXMgPSBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMua2V5cygpKS5zb3J0KFxuICAgICAgICAgIChhLCBiKSA9PiBhIC0gYixcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgbmV3UmVuZGVyZWRFbGVtZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBIVE1MRWxlbWVudD4oKTtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgcmVuZGVyZWRLZXlzKSB7XG4gICAgICAgICAgaWYgKGtleSA+IGluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVyZWRFbGVtZW50cy5nZXQoa2V5KTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgIC8vIFVwZGF0ZSBkYXRhLWluZGV4IGF0dHJpYnV0ZVxuICAgICAgICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5kZXggPSBTdHJpbmcoa2V5IC0gMSk7XG4gICAgICAgICAgICAgIG5ld1JlbmRlcmVkRWxlbWVudHMuc2V0KGtleSAtIDEsIGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoa2V5IDwgaW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChrZXkpO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5zZXQoa2V5LCBlbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGVsZW1lbnRdIG9mIG5ld1JlbmRlcmVkRWxlbWVudHMpIHtcbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNldChrZXksIGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGVjcmVtZW50IHRvdGFsSXRlbXMgTk9XIHNvIHJlbmRlckl0ZW1zKCkgdXNlcyB0aGUgY29ycmVjdCBjb3VudFxuICAgICAgICAvLyBzZXRUb3RhbEl0ZW1zKCkgd2lsbCBiZSBjYWxsZWQgbGF0ZXIgYnkgdGhlIEFQSSwgd2hpY2ggd2lsbCBlbWl0XG4gICAgICAgIC8vIHZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWQgZm9yIHZpcnR1YWwgc2l6ZSByZWNhbGN1bGF0aW9uXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlICYmIHZpZXdwb3J0U3RhdGUudG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMtLTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHZpc2libGUgcmFuZ2UgdG8gZm9yY2UgcmUtcmVuZGVyXG4gICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuXG4gICAgICAgIC8vIEVtaXQgY29tcGxldGlvbiBldmVudFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTpyZW1vdmVkXCIsIHtcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIGluZGV4LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZnRlciBpdGVtIHJlbW92YWwsIGNsZWFyIEFMTCBsb2FkZWRSYW5nZXNcbiAgICAgICAgLy8gVGhpcyBmb3JjZXMgYSBjb21wbGV0ZSByZWxvYWQgd2hpY2ggaXMgbW9yZSByZWxpYWJsZSB0aGFuIHRyeWluZyB0b1xuICAgICAgICAvLyB0cmFjayBzaGlmdGVkIGluZGljZXMuIFRoZSBpdGVtcyBhcnJheSBoYXMgYmVlbiBzcGxpY2VkIGFuZCBhbGwgaW5kaWNlc1xuICAgICAgICAvLyBhcmUgbm93IGRpZmZlcmVudCBmcm9tIHdoYXQgbG9hZGVkUmFuZ2VzIHRoaW5rcyB0aGV5IGFyZS5cbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldExvYWRlZFJhbmdlcykge1xuICAgICAgICAgIGNvbnN0IGxvYWRlZFJhbmdlcyA9IGNvbGxlY3Rpb24uZ2V0TG9hZGVkUmFuZ2VzKCk7XG4gICAgICAgICAgbG9hZGVkUmFuZ2VzLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcmlnZ2VyIHJlbG9hZCBvZiB2aXNpYmxlIHJhbmdlXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb25JdGVtc0FyciA9IGdldENvbGxlY3Rpb25JdGVtcygpO1xuICAgICAgICBjb25zdCBsb2FkZWRJdGVtc0NvdW50ID0gY29sbGVjdGlvbkl0ZW1zQXJyLmxlbmd0aDtcbiAgICAgICAgY29uc3QgdmlzaWJsZVJhbmdlID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2U/LigpO1xuICAgICAgICBpZiAodmlzaWJsZVJhbmdlICYmIGNvbGxlY3Rpb24/LmxvYWRNaXNzaW5nUmFuZ2VzKSB7XG4gICAgICAgICAgY29sbGVjdGlvbi5sb2FkTWlzc2luZ1JhbmdlcyhcbiAgICAgICAgICAgIHsgc3RhcnQ6IDAsIGVuZDogTWF0aC5tYXgodmlzaWJsZVJhbmdlLmVuZCwgbG9hZGVkSXRlbXNDb3VudCkgfSxcbiAgICAgICAgICAgIFwiaXRlbS1yZW1vdmFsXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgcmUtcmVuZGVyXG4gICAgICAgIHJlbmRlckl0ZW1zKCk7XG4gICAgICAgIGlzUmVtb3ZpbmdJdGVtID0gZmFsc2U7XG4gICAgICB9KTtcblxuICAgICAgLy8gTGlzdGVuIGZvciBpdGVtcyBhZGQgcmVxdWVzdHMgZnJvbSBBUElcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiaXRlbXM6YWRkLXJlcXVlc3RcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCB7IGl0ZW1zOiBuZXdJdGVtcywgcG9zaXRpb24sIHByZXZpb3VzQ291bnQgfSA9IGRhdGE7XG5cbiAgICAgICAgaWYgKCFuZXdJdGVtcyB8fCBuZXdJdGVtcy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgICAvLyBJdGVtcyBhcmUgYWxyZWFkeSBhZGRlZCB0byBjb2xsZWN0aW9uLml0ZW1zIGJ5IGFwaS50c1xuICAgICAgICAvLyBXZSBqdXN0IG5lZWQgdG8gdXBkYXRlIHJlbmRlcmVkIGVsZW1lbnRzIGluZGljZXMgaWYgcHJlcGVuZGluZ1xuXG4gICAgICAgIGNvbnN0IGl0ZW1zQWRkZWQgPSBuZXdJdGVtcy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHBvc2l0aW9uID09PSBcInN0YXJ0XCIpIHtcbiAgICAgICAgICAvLyBJdGVtcyB3ZXJlIHByZXBlbmRlZCAtIHNoaWZ0IHJlbmRlcmVkIGVsZW1lbnQgaW5kaWNlc1xuICAgICAgICAgIGNvbnN0IHJlbmRlcmVkS2V5cyA9IEFycmF5LmZyb20ocmVuZGVyZWRFbGVtZW50cy5rZXlzKCkpLnNvcnQoXG4gICAgICAgICAgICAoYSwgYikgPT4gYiAtIGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCBuZXdSZW5kZXJlZEVsZW1lbnRzID0gbmV3IE1hcDxudW1iZXIsIEhUTUxFbGVtZW50PigpO1xuICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHJlbmRlcmVkS2V5cykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGtleSkhO1xuICAgICAgICAgICAgY29uc3QgbmV3SW5kZXggPSBrZXkgKyBpdGVtc0FkZGVkO1xuICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoXCJkYXRhLWluZGV4XCIsIFN0cmluZyhuZXdJbmRleCkpO1xuICAgICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5zZXQobmV3SW5kZXgsIGVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmNsZWFyKCk7XG4gICAgICAgICAgbmV3UmVuZGVyZWRFbGVtZW50cy5mb3JFYWNoKChlbCwgaWR4KSA9PlxuICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoaWR4LCBlbCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3IgYXBwZW5kLCBubyBpbmRleCBzaGlmdGluZyBuZWVkZWRcblxuICAgICAgICAvLyBVcGRhdGUgdG90YWxJdGVtcyBpbiB2aWV3cG9ydFN0YXRlXG4gICAgICAgIGlmICh2aWV3cG9ydFN0YXRlKSB7XG4gICAgICAgICAgdmlld3BvcnRTdGF0ZS50b3RhbEl0ZW1zID1cbiAgICAgICAgICAgICh2aWV3cG9ydFN0YXRlLnRvdGFsSXRlbXMgfHwgMCkgKyBpdGVtc0FkZGVkO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzZXQgdmlzaWJsZSByYW5nZSB0byBmb3JjZSByZS1yZW5kZXJcbiAgICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG5cbiAgICAgICAgLy8gQ2xlYXIgbG9hZGVkUmFuZ2VzIHRvIGVuc3VyZSBwcm9wZXIgcmVsb2FkIHRyYWNraW5nXG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSk/LmNvbGxlY3Rpb247XG4gICAgICAgIGlmIChjb2xsZWN0aW9uPy5nZXRMb2FkZWRSYW5nZXMpIHtcbiAgICAgICAgICBjb25zdCBsb2FkZWRSYW5nZXMgPSBjb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpO1xuICAgICAgICAgIGxvYWRlZFJhbmdlcy5jbGVhcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpZ2dlciByZS1yZW5kZXJcbiAgICAgICAgcmVuZGVySXRlbXMoKTtcblxuICAgICAgICAvLyBFbWl0IGNvbXBsZXRpb24gZXZlbnRcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW1zOnJlbmRlci1jb21wbGV0ZVwiLCB7XG4gICAgICAgICAgaXRlbXM6IG5ld0l0ZW1zLFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIHRvdGFsOiB2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zIHx8IDAsXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBpdGVtcyBldmljdGVkIC0gY2xlYW4gdXAgcmVuZGVyZWQgZWxlbWVudHNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjppdGVtcy1ldmljdGVkXCIsIChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgeyBrZWVwU3RhcnQsIGtlZXBFbmQgfSA9IGRhdGE7XG5cbiAgICAgICAgLy8gUmVsZWFzZSByZW5kZXJlZCBlbGVtZW50cyBvdXRzaWRlIHRoZSBrZWVwIHJhbmdlXG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoaW5kZXggPCBrZWVwU3RhcnQgfHwgaW5kZXggPiBrZWVwRW5kKSB7XG4gICAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiByZXNldCB0byBjbGVhciByZW5kZXJpbmcgc3RhdGVcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyZXNldFwiLCAoKSA9PiB7XG4gICAgICAgIC8vIFJlbGVhc2UgYW5kIGNsZWFyIGFsbCByZW5kZXJlZCBlbGVtZW50c1xuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcblxuICAgICAgICAvLyBSZXNldCB2aXNpYmxlIHJhbmdlIHRyYWNraW5nXG4gICAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB7IHN0YXJ0OiAtMSwgZW5kOiAtMSB9O1xuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgY29sbGVjdGlvbiBkYXRhIGxvYWRlZFxuICAgICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWxvYWRlZFwiLCAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmICghZGF0YS5pdGVtcz8ubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgLy8gQW5hbHl6ZSBkYXRhIHN0cnVjdHVyZSBvbiBmaXJzdCBsb2FkXG4gICAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IChjb21wb25lbnQgYXMgYW55KS5wbGFjZWhvbGRlcnM7XG4gICAgICAgIGlmIChwbGFjZWhvbGRlcnMgJiYgIXBsYWNlaG9sZGVycy5oYXNBbmFseXplZFN0cnVjdHVyZSgpKSB7XG4gICAgICAgICAgcGxhY2Vob2xkZXJzLmFuYWx5emVEYXRhU3RydWN0dXJlKGRhdGEuaXRlbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSXRlbXMgYXJlIGFscmVhZHkgaW4gY29sbGVjdGlvbi5pdGVtcyAtIHJlcGxhY2UgYW55IHBsYWNlaG9sZGVyIERPTSBlbGVtZW50c1xuICAgICAgICBkYXRhLml0ZW1zLmZvckVhY2goKGl0ZW06IGFueSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBkYXRhLm9mZnNldCArIGk7XG4gICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlbmRlcmVkRWxlbWVudHMuZ2V0KGluZGV4KTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGN1cnJlbnQgcmVuZGVyZWQgZWxlbWVudCBpcyBhIHBsYWNlaG9sZGVyIHRoYXQgbmVlZHMgcmVwbGFjaW5nXG4gICAgICAgICAgLy8gTm90ZTogVGhlIGFjdHVhbCBjbGFzcyBoYXMgJ210cmwtJyBwcmVmaXgsIHNvIGNoZWNrIGZvciBib3RoXG4gICAgICAgICAgY29uc3QgaXNQbGFjZWhvbGRlckVsZW1lbnQgPVxuICAgICAgICAgICAgZWxlbWVudD8uY2xhc3NMaXN0LmNvbnRhaW5zKFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUykgfHxcbiAgICAgICAgICAgIGVsZW1lbnQ/LmNsYXNzTGlzdC5jb250YWlucyhcbiAgICAgICAgICAgICAgYG10cmwtJHtWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1N9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXJFbGVtZW50KSB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpbmRleCk7XG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudCkge1xuICAgICAgICAgICAgICAvLyBSZW1vdmUgcGxhY2Vob2xkZXIgY2xhc3NlcyBmcm9tIHdyYXBwZXJcbiAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgICAgICAgLy8gQWxzbyByZW1vdmUgZnJvbSBpbm5lciBlbGVtZW50IChmb3Igc3RyaW5nIHRlbXBsYXRlcylcbiAgICAgICAgICAgICAgaWYgKG5ld0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhcbiAgICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuZmlyc3RFbGVtZW50Q2hpbGQgYXMgSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuQ0xBU1MsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIEFkZCByZXBsYWNlZCBjbGFzcyBmb3IgZmFkZS1pbiBhbmltYXRpb25cbiAgICAgICAgICAgICAgYWRkQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS1yZXBsYWNlZFwiKTtcblxuICAgICAgICAgICAgICAvLyBDb3B5IHBvc2l0aW9uIGFuZCByZXBsYWNlXG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24obmV3RWxlbWVudC5zdHlsZSwge1xuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBlbGVtZW50LnN0eWxlLnBvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0sXG4gICAgICAgICAgICAgICAgd2lkdGg6IGVsZW1lbnQuc3R5bGUud2lkdGgsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBlbGVtZW50LnBhcmVudE5vZGU/LnJlcGxhY2VDaGlsZChuZXdFbGVtZW50LCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgcmVuZGVyZWRFbGVtZW50cy5zZXQoaW5kZXgsIG5ld0VsZW1lbnQpO1xuICAgICAgICAgICAgICByZWxlYXNlRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHJlcGxhY2VkIGNsYXNzIGFmdGVyIGFuaW1hdGlvbiBjb21wbGV0ZXNcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MobmV3RWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtLS1yZXBsYWNlZFwiKTtcbiAgICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIHJlbmRlckl0ZW0gcmV0dXJuZWQgbnVsbCAtIHN0aWxsIHJlbGVhc2UgdGhlIG9sZCBlbGVtZW50XG4gICAgICAgICAgICAgIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmRlbGV0ZShpbmRleCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIHJlbmRlciBuZXcgaXRlbXMgKGl0ZW1zIHRoYXQgd2VyZW4ndCByZW5kZXJlZCBhdCBhbGwpXG4gICAgICAgIGNvbnN0IHsgdmlzaWJsZVJhbmdlIH0gPSB2aWV3cG9ydFN0YXRlIHx8IHt9O1xuICAgICAgICBpZiAodmlzaWJsZVJhbmdlKSB7XG4gICAgICAgICAgY29uc3QgcmVuZGVyU3RhcnQgPSBNYXRoLm1heCgwLCB2aXNpYmxlUmFuZ2Uuc3RhcnQgLSBvdmVyc2Nhbik7XG4gICAgICAgICAgY29uc3QgcmVuZGVyRW5kID0gTWF0aC5taW4oXG4gICAgICAgICAgICB2aWV3cG9ydFN0YXRlPy50b3RhbEl0ZW1zID8/IDAgLSAxLFxuICAgICAgICAgICAgdmlzaWJsZVJhbmdlLmVuZCArIG92ZXJzY2FuLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgbG9hZGVkU3RhcnQgPSBkYXRhLm9mZnNldDtcbiAgICAgICAgICBjb25zdCBsb2FkZWRFbmQgPSBkYXRhLm9mZnNldCArIGRhdGEuaXRlbXMubGVuZ3RoIC0gMTtcblxuICAgICAgICAgIC8vIENoZWNrIGlmIGxvYWRlZCBkYXRhIG92ZXJsYXBzIHdpdGggcmVuZGVyIHJhbmdlIGFuZCB3ZSdyZSBtaXNzaW5nIHJlbmRlcmVkIGVsZW1lbnRzXG4gICAgICAgICAgY29uc3QgbmVlZHNSZW5kZXIgPVxuICAgICAgICAgICAgbG9hZGVkU3RhcnQgPD0gcmVuZGVyRW5kICYmXG4gICAgICAgICAgICBsb2FkZWRFbmQgPj0gcmVuZGVyU3RhcnQgJiZcbiAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2l6ZSA8IHJlbmRlckVuZCAtIHJlbmRlclN0YXJ0ICsgMTtcblxuICAgICAgICAgIGlmIChuZWVkc1JlbmRlcikgcmVuZGVySXRlbXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIExpc3RlbiBmb3IgZXZlbnRzXG4gICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWNoYW5nZWRcIiwgcmVuZGVySXRlbXMpO1xuICAgICAgY29tcG9uZW50Lm9uPy4oXCJ2aWV3cG9ydDpzY3JvbGxcIiwgdXBkYXRlSXRlbVBvc2l0aW9ucyk7XG5cbiAgICAgIC8vIFVwZGF0ZSBpdGVtcyBjb250YWluZXIgaGVpZ2h0IHdoZW4gdmlydHVhbCBzaXplIGNoYW5nZXNcbiAgICAgIGNvbXBvbmVudC5vbj8uKFwidmlld3BvcnQ6dmlydHVhbC1zaXplLWNoYW5nZWRcIiwgKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdmlld3BvcnRTdGF0ZT8uaXRlbXNDb250YWluZXIgJiZcbiAgICAgICAgICBkYXRhLnRvdGFsVmlydHVhbFNpemUgIT09IHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICB2aWV3cG9ydFN0YXRlLml0ZW1zQ29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGAke2RhdGEudG90YWxWaXJ0dWFsU2l6ZX1weGA7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gVGVtcGxhdGUgaGVscGVyc1xuICAgIGNvbnN0IGdldERlZmF1bHRUZW1wbGF0ZSA9ICgpID0+IChpdGVtOiBhbnksIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIC8vIFVzZSBsYXlvdXQgc3lzdGVtIGZvciBkZWZhdWx0IHRlbXBsYXRlXG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICAgIGNsYXNzOiBcInZpZXdwb3J0LWl0ZW1cIixcbiAgICAgICAgICB0ZXh0OlxuICAgICAgICAgICAgdHlwZW9mIGl0ZW0gPT09IFwib2JqZWN0XCJcbiAgICAgICAgICAgICAgPyBpdGVtLm5hbWUgfHwgaXRlbS5sYWJlbCB8fCBpdGVtLnRleHQgfHwgYEl0ZW0gJHtpbmRleH1gXG4gICAgICAgICAgICAgIDogU3RyaW5nKGl0ZW0pLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9O1xuXG4gICAgLy8gUHJvY2VzcyBsYXlvdXQgc2NoZW1hIHdpdGggaXRlbSBkYXRhIHN1YnN0aXR1dGlvblxuICAgIGNvbnN0IHByb2Nlc3NMYXlvdXRTY2hlbWEgPSAoXG4gICAgICBzY2hlbWE6IGFueSxcbiAgICAgIGl0ZW06IGFueSxcbiAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgKTogYW55ID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIC8vIEhhbmRsZSB2YXJpYWJsZSBzdWJzdGl0dXRpb24gbGlrZSB7e25hbWV9fSwge3tpbmRleH19XG4gICAgICAgIHJldHVybiBzY2hlbWEucmVwbGFjZSgvXFx7XFx7KFtefV0rKVxcfVxcfS9nLCAobWF0Y2gsIGtleSkgPT4ge1xuICAgICAgICAgIGlmIChrZXkgPT09IFwiaW5kZXhcIikgcmV0dXJuIFN0cmluZyhpbmRleCk7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJpdGVtXCIpIHJldHVybiBTdHJpbmcoaXRlbSk7XG5cbiAgICAgICAgICAvLyBIYW5kbGUgbmVzdGVkIHByb3BlcnRpZXMgbGlrZSB7e3VzZXIubmFtZX19XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBrZXkuc3BsaXQoXCIuXCIpLnJlZHVjZSgob2JqOiBhbnksIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG9iaj8uW3Byb3AudHJpbSgpXTtcbiAgICAgICAgICB9LCBpdGVtKTtcblxuICAgICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gU3RyaW5nKHZhbHVlKSA6IG1hdGNoO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc2NoZW1hKSkge1xuICAgICAgICByZXR1cm4gc2NoZW1hLm1hcCgoY2hpbGQpID0+IHByb2Nlc3NMYXlvdXRTY2hlbWEoY2hpbGQsIGl0ZW0sIGluZGV4KSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiICYmIHNjaGVtYSAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBwcm9jZXNzZWQ6IGFueSA9IHt9O1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWEpKSB7XG4gICAgICAgICAgcHJvY2Vzc2VkW2tleV0gPSBwcm9jZXNzTGF5b3V0U2NoZW1hKHZhbHVlLCBpdGVtLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb2Nlc3NlZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHNjaGVtYTtcbiAgICB9O1xuXG4gICAgLy8gUG9zaXRpb24gY2FsY3VsYXRpb25cbiAgICBjb25zdCBjYWxjdWxhdGVJdGVtUG9zaXRpb24gPSAoXG4gICAgICBpbmRleDogbnVtYmVyLFxuICAgICAgc2Nyb2xsUG9zaXRpb246IG51bWJlcixcbiAgICAgIHRvdGFsSXRlbXM6IG51bWJlcixcbiAgICAgIGl0ZW1TaXplOiBudW1iZXIsXG4gICAgICB2aXJ0dWFsVG90YWxTaXplOiBudW1iZXIsXG4gICAgICBjb250YWluZXJTaXplOiBudW1iZXIsXG4gICAgICB0YXJnZXRTY3JvbGxJbmRleD86IG51bWJlcixcbiAgICApOiBudW1iZXIgPT4ge1xuICAgICAgY29uc3QgYWN0dWFsVG90YWxTaXplID0gdG90YWxJdGVtcyAqIGl0ZW1TaXplO1xuICAgICAgY29uc3QgaXNDb21wcmVzc2VkID1cbiAgICAgICAgYWN0dWFsVG90YWxTaXplID4gdmlydHVhbFRvdGFsU2l6ZSAmJiB2aXJ0dWFsVG90YWxTaXplID4gMDtcblxuICAgICAgLy8gSWYgd2UgaGF2ZSBhIHRhcmdldFNjcm9sbEluZGV4IChmcm9tIGluaXRpYWxTY3JvbGxJbmRleCksIHVzZSBpdCBkaXJlY3RseVxuICAgICAgLy8gVGhpcyBlbnN1cmVzIGl0ZW1zIGFyZSBwb3NpdGlvbmVkIGNvcnJlY3RseSBldmVuIHdpdGggY29tcHJlc3Npb25cbiAgICAgIGlmICh0YXJnZXRTY3JvbGxJbmRleCAhPT0gdW5kZWZpbmVkICYmIHRhcmdldFNjcm9sbEluZGV4ID4gMCkge1xuICAgICAgICAvLyBQb3NpdGlvbiBpdGVtcyByZWxhdGl2ZSB0byB0aGUgdGFyZ2V0IGluZGV4XG4gICAgICAgIC8vIFRoZSB0YXJnZXQgaW5kZXggc2hvdWxkIGFwcGVhciBhdCB0aGUgdG9wIG9mIHRoZSB2aWV3cG9ydFxuICAgICAgICByZXR1cm4gKGluZGV4IC0gdGFyZ2V0U2Nyb2xsSW5kZXgpICogaXRlbVNpemU7XG4gICAgICB9XG5cbiAgICAgIGlmICghaXNDb21wcmVzc2VkIHx8IHRvdGFsSXRlbXMgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGluZGV4ICogaXRlbVNpemUgLSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gQ29tcHJlc3NlZCBzcGFjZSBoYW5kbGluZ1xuICAgICAgY29uc3QgbWF4U2Nyb2xsUG9zaXRpb24gPSB2aXJ0dWFsVG90YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgIGNvbnN0IGRpc3RhbmNlRnJvbUJvdHRvbSA9IG1heFNjcm9sbFBvc2l0aW9uIC0gc2Nyb2xsUG9zaXRpb247XG4gICAgICBjb25zdCBuZWFyQm90dG9tVGhyZXNob2xkID0gY29udGFpbmVyU2l6ZTtcblxuICAgICAgaWYgKFxuICAgICAgICBkaXN0YW5jZUZyb21Cb3R0b20gPD0gbmVhckJvdHRvbVRocmVzaG9sZCAmJlxuICAgICAgICBkaXN0YW5jZUZyb21Cb3R0b20gPj0gLTFcbiAgICAgICkge1xuICAgICAgICAvLyBOZWFyIGJvdHRvbSBpbnRlcnBvbGF0aW9uXG4gICAgICAgIGNvbnN0IGl0ZW1zQXRCb3R0b20gPSBNYXRoLmZsb29yKGNvbnRhaW5lclNpemUgLyBpdGVtU2l6ZSk7XG4gICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUF0Qm90dG9tID0gTWF0aC5tYXgoMCwgdG90YWxJdGVtcyAtIGl0ZW1zQXRCb3R0b20pO1xuICAgICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgICAgY29uc3QgZXhhY3RTY3JvbGxJbmRleCA9IHNjcm9sbFJhdGlvICogdG90YWxJdGVtcztcbiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgIDAsXG4gICAgICAgICAgTWF0aC5taW4oMSwgMSAtIGRpc3RhbmNlRnJvbUJvdHRvbSAvIG5lYXJCb3R0b21UaHJlc2hvbGQpLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGJvdHRvbVBvc2l0aW9uID0gKGluZGV4IC0gZmlyc3RWaXNpYmxlQXRCb3R0b20pICogaXRlbVNpemU7XG4gICAgICAgIGNvbnN0IG5vcm1hbFBvc2l0aW9uID0gKGluZGV4IC0gZXhhY3RTY3JvbGxJbmRleCkgKiBpdGVtU2l6ZTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBub3JtYWxQb3NpdGlvbiArIChib3R0b21Qb3NpdGlvbiAtIG5vcm1hbFBvc2l0aW9uKSAqIGludGVycG9sYXRpb25cbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gTm9ybWFsIGNvbXByZXNzZWQgc2Nyb2xsaW5nXG4gICAgICBjb25zdCBzY3JvbGxSYXRpbyA9IHNjcm9sbFBvc2l0aW9uIC8gdmlydHVhbFRvdGFsU2l6ZTtcbiAgICAgIHJldHVybiAoaW5kZXggLSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXMpICogaXRlbVNpemU7XG4gICAgfTtcblxuICAgIC8vIFJlbmRlciBzaW5nbGUgaXRlbVxuICAgIGNvbnN0IHJlbmRlckl0ZW0gPSAoaXRlbTogYW55LCBpbmRleDogbnVtYmVyKTogSFRNTEVsZW1lbnQgfCBudWxsID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1UZW1wbGF0ZSA9IHRlbXBsYXRlIHx8IGdldERlZmF1bHRUZW1wbGF0ZSgpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBpdGVtVGVtcGxhdGUoaXRlbSwgaW5kZXgpO1xuICAgICAgICBsZXQgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgcmVzdWx0IGlzIGEgbGF5b3V0IHNjaGVtYSAoYXJyYXkgb3Igb2JqZWN0KVxuICAgICAgICBpZiAoXG4gICAgICAgICAgQXJyYXkuaXNBcnJheShyZXN1bHQpIHx8XG4gICAgICAgICAgKHR5cGVvZiByZXN1bHQgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIHJlc3VsdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgIShyZXN1bHQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIFByb2Nlc3Mgc2NoZW1hIHRvIHN1YnN0aXR1dGUgdmFyaWFibGVzXG4gICAgICAgICAgY29uc3QgcHJvY2Vzc2VkU2NoZW1hID0gcHJvY2Vzc0xheW91dFNjaGVtYShyZXN1bHQsIGl0ZW0sIGluZGV4KTtcblxuICAgICAgICAgIC8vIFVzZSBsYXlvdXQgc3lzdGVtIHRvIGNyZWF0ZSBlbGVtZW50XG4gICAgICAgICAgY29uc3QgbGF5b3V0UmVzdWx0ID0gY3JlYXRlTGF5b3V0KHByb2Nlc3NlZFNjaGVtYSk7XG4gICAgICAgICAgZWxlbWVudCA9IGxheW91dFJlc3VsdC5lbGVtZW50O1xuXG4gICAgICAgICAgLy8gSWYgdGhlIGxheW91dCBjcmVhdGVkIGEgd3JhcHBlciwgdXNlIGl0IGRpcmVjdGx5XG4gICAgICAgICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gRWxlbWVudCBpcyBhbHJlYWR5IGNyZWF0ZWQgYnkgbGF5b3V0IHN5c3RlbVxuICAgICAgICAgICAgLy8gU3RvcmUgbGF5b3V0UmVzdWx0IGZvciBjbGVhbnVwIHdoZW4gZWxlbWVudCBpcyByZWxlYXNlZCAocHJldmVudHMgbWVtb3J5IGxlYWspXG4gICAgICAgICAgICBsYXlvdXRSZXN1bHRzLnNldChlbGVtZW50LCBsYXlvdXRSZXN1bHQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFjayBpZiBsYXlvdXQgZGlkbid0IGNyZWF0ZSBhIHByb3BlciBlbGVtZW50XG4gICAgICAgICAgICBlbGVtZW50ID0gZ2V0UG9vbGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgaWYgKGxheW91dFJlc3VsdC5lbGVtZW50KSB7XG4gICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQobGF5b3V0UmVzdWx0LmVsZW1lbnQpO1xuICAgICAgICAgICAgICAvLyBTdG9yZSBsYXlvdXRSZXN1bHQgb24gd3JhcHBlciBlbGVtZW50IGZvciBjbGVhbnVwXG4gICAgICAgICAgICAgIGxheW91dFJlc3VsdHMuc2V0KGVsZW1lbnQsIGxheW91dFJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAvLyBQYXJzZSBIVE1MIHVzaW5nIHRlbXBsYXRlIGVsZW1lbnQgLSBvcHRpbWl6ZWQgcGF0aFxuICAgICAgICAgIC8vIE1vdmUgbm9kZXMgZGlyZWN0bHkgaW5zdGVhZCBvZiBjbG9uaW5nIC0gbXVjaCBmYXN0ZXIsIG5vIG1lbW9yeSBvdmVyaGVhZFxuICAgICAgICAgIHRlbXBsYXRlUGFyc2VyLmlubmVySFRNTCA9IHJlc3VsdDtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gdGVtcGxhdGVQYXJzZXIuY29udGVudDtcblxuICAgICAgICAgIGlmIChjb250ZW50LmNoaWxkcmVuLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgLy8gU2luZ2xlIHJvb3QgZWxlbWVudCAtIG1vdmUgZGlyZWN0bHkgKGZhc3RlciB0aGFuIGNsb25lTm9kZSlcbiAgICAgICAgICAgIGVsZW1lbnQgPSBjb250ZW50LmZpcnN0RWxlbWVudENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgY29udGVudC5yZW1vdmVDaGlsZChlbGVtZW50KTtcbiAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFwibXRybC12aWV3cG9ydC1pdGVtXCIpO1xuICAgICAgICAgICAgaWYgKGlzUGxhY2Vob2xkZXIoaXRlbSkpIHtcbiAgICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgVklFV1BPUlRfQ09OU1RBTlRTLlBMQUNFSE9MREVSLkNMQVNTKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTXVsdGlwbGUgY2hpbGRyZW4gLSBtb3ZlIGFsbCBpbnRvIHBvb2xlZCBlbGVtZW50XG4gICAgICAgICAgICBlbGVtZW50ID0gZ2V0UG9vbGVkRWxlbWVudCgpO1xuICAgICAgICAgICAgd2hpbGUgKGNvbnRlbnQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKGNvbnRlbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgZWxlbWVudCA9IGdldFBvb2xlZEVsZW1lbnQoKTtcbiAgICAgICAgICBlbGVtZW50LmFwcGVuZENoaWxkKHJlc3VsdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbUmVuZGVyaW5nXSBJbnZhbGlkIHRlbXBsYXRlIHJlc3VsdCBmb3IgaXRlbSAke2luZGV4fWApO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGNsYXNzZXNcbiAgICAgICAgaWYgKCFoYXNDbGFzcyhlbGVtZW50LCBcInZpZXdwb3J0LWl0ZW1cIikpXG4gICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgXCJ2aWV3cG9ydC1pdGVtXCIpO1xuICAgICAgICBpZiAoaXNQbGFjZWhvbGRlcihpdGVtKSkge1xuICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5DTEFTUyk7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50LmRhdGFzZXQuaW5kZXggPSBTdHJpbmcoaW5kZXgpO1xuXG4gICAgICAgIC8vIENvcHkgZGF0YS1pZCBmcm9tIGl0ZW0gdG8gdmlld3BvcnQgZWxlbWVudCBmb3Igc2VsZWN0aW9uIHN1cHBvcnRcbiAgICAgICAgY29uc3QgaXRlbUlkID0gaXRlbT8uX2lkIHx8IGl0ZW0/LmlkO1xuICAgICAgICBpZiAoaXRlbUlkICE9PSB1bmRlZmluZWQgJiYgaXRlbUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgZWxlbWVudC5kYXRhc2V0LmlkID0gU3RyaW5nKGl0ZW1JZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBbUmVuZGVyaW5nXSBFcnJvciByZW5kZXJpbmcgaXRlbSAke2luZGV4fTpgLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBVcGRhdGUgcG9zaXRpb25zXG4gICAgY29uc3QgdXBkYXRlSXRlbVBvc2l0aW9ucyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmICghdmlld3BvcnRTdGF0ZSB8fCByZW5kZXJlZEVsZW1lbnRzLnNpemUgPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3Qge1xuICAgICAgICBzY3JvbGxQb3NpdGlvbixcbiAgICAgICAgaXRlbVNpemU6IGl0ZW1TaXplLFxuICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICBjb250YWluZXJTaXplLFxuICAgICAgfSA9IHZpZXdwb3J0U3RhdGU7XG4gICAgICBjb25zdCBhY3R1YWxUb3RhbFNpemUgPSB0b3RhbEl0ZW1zICogaXRlbVNpemU7XG4gICAgICBjb25zdCBpc0NvbXByZXNzZWQgPVxuICAgICAgICBhY3R1YWxUb3RhbFNpemUgPiB2aXJ0dWFsVG90YWxTaXplICYmIHZpcnR1YWxUb3RhbFNpemUgPiAwO1xuXG4gICAgICBjb25zdCBzb3J0ZWRJbmRpY2VzID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmtleXMoKSkuc29ydChcbiAgICAgICAgKGEsIGIpID0+IGEgLSBiLFxuICAgICAgKTtcbiAgICAgIGlmICghc29ydGVkSW5kaWNlcy5sZW5ndGgpIHJldHVybjtcblxuICAgICAgY29uc3QgZmlyc3RJbmRleCA9IHNvcnRlZEluZGljZXNbMF07XG4gICAgICBsZXQgY3VycmVudFBvc2l0aW9uID0gMDtcblxuICAgICAgaWYgKGlzQ29tcHJlc3NlZCkge1xuICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSB2aXJ0dWFsVG90YWxTaXplIC0gY29udGFpbmVyU2l6ZTtcbiAgICAgICAgY29uc3QgZGlzdGFuY2VGcm9tQm90dG9tID0gbWF4U2Nyb2xsIC0gc2Nyb2xsUG9zaXRpb247XG5cbiAgICAgICAgaWYgKGRpc3RhbmNlRnJvbUJvdHRvbSA8PSBjb250YWluZXJTaXplICYmIGRpc3RhbmNlRnJvbUJvdHRvbSA+PSAtMSkge1xuICAgICAgICAgIC8vIE5lYXIgYm90dG9tIGludGVycG9sYXRpb25cbiAgICAgICAgICBjb25zdCBpdGVtc0F0Qm90dG9tID0gTWF0aC5mbG9vcihjb250YWluZXJTaXplIC8gaXRlbVNpemUpO1xuICAgICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUF0Qm90dG9tID0gTWF0aC5tYXgoMCwgdG90YWxJdGVtcyAtIGl0ZW1zQXRCb3R0b20pO1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgICAgIGNvbnN0IGV4YWN0U2Nyb2xsSW5kZXggPSBzY3JvbGxSYXRpbyAqIHRvdGFsSXRlbXM7XG4gICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbiA9IE1hdGgubWF4KFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIE1hdGgubWluKDEsIDEgLSBkaXN0YW5jZUZyb21Cb3R0b20gLyBjb250YWluZXJTaXplKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgYm90dG9tUG9zID0gKGZpcnN0SW5kZXggLSBmaXJzdFZpc2libGVBdEJvdHRvbSkgKiBpdGVtU2l6ZTtcbiAgICAgICAgICBjb25zdCBub3JtYWxQb3MgPSAoZmlyc3RJbmRleCAtIGV4YWN0U2Nyb2xsSW5kZXgpICogaXRlbVNpemU7XG4gICAgICAgICAgY3VycmVudFBvc2l0aW9uID0gbm9ybWFsUG9zICsgKGJvdHRvbVBvcyAtIG5vcm1hbFBvcykgKiBpbnRlcnBvbGF0aW9uO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHNjcm9sbFJhdGlvID0gc2Nyb2xsUG9zaXRpb24gLyB2aXJ0dWFsVG90YWxTaXplO1xuICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IChmaXJzdEluZGV4IC0gc2Nyb2xsUmF0aW8gKiB0b3RhbEl0ZW1zKSAqIGl0ZW1TaXplO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50UG9zaXRpb24gPSBmaXJzdEluZGV4ICogaXRlbVNpemUgLSBzY3JvbGxQb3NpdGlvbjtcbiAgICAgIH1cblxuICAgICAgLy8gUG9zaXRpb24gZWFjaCBpdGVtXG4gICAgICBzb3J0ZWRJbmRpY2VzLmZvckVhY2goKGluZGV4KSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSByZW5kZXJlZEVsZW1lbnRzLmdldChpbmRleCk7XG4gICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWSgke01hdGgucm91bmQoXG4gICAgICAgICAgICBjdXJyZW50UG9zaXRpb24sXG4gICAgICAgICAgKX1weClgO1xuXG4gICAgICAgICAgLy8gU3RyYXRlZ2ljIGxvZyBmb3IgbGFzdCBpdGVtc1xuICAgICAgICAgIC8vIGlmIChpbmRleCA+PSB0b3RhbEl0ZW1zIC0gNSkge1xuICAgICAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAgICAgLy8gICAgIGBbUmVuZGVyaW5nXSBMYXN0IGl0ZW0gcG9zaXRpb25lZDogaW5kZXg9JHtpbmRleH0sIHBvc2l0aW9uPSR7TWF0aC5yb3VuZChcbiAgICAgICAgICAvLyAgICAgICBjdXJyZW50UG9zaXRpb25cbiAgICAgICAgICAvLyAgICAgKX1weCwgaXRlbVNpemU9JHtpdGVtU2l6ZX1weCwgdG90YWxJdGVtcz0ke3RvdGFsSXRlbXN9YFxuICAgICAgICAgIC8vICAgKTtcbiAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICBjdXJyZW50UG9zaXRpb24gKz0gaXRlbVNpemU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBNYWluIHJlbmRlciBmdW5jdGlvblxuICAgIGNvbnN0IHJlbmRlckl0ZW1zID0gKCkgPT4ge1xuICAgICAgaWYgKCF2aWV3cG9ydFN0YXRlPy5pdGVtc0NvbnRhaW5lcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdmlzaWJsZVJhbmdlLFxuICAgICAgICBpdGVtc0NvbnRhaW5lcixcbiAgICAgICAgdG90YWxJdGVtcyxcbiAgICAgICAgaXRlbVNpemUsXG4gICAgICAgIHNjcm9sbFBvc2l0aW9uLFxuICAgICAgICBjb250YWluZXJTaXplLFxuICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgfSA9IHZpZXdwb3J0U3RhdGU7XG5cbiAgICAgIC8vIFZhbGlkYXRlIHJhbmdlIC0gc2tpcCByZW5kZXJpbmcgaWYgbm8gaXRlbXMgb3IgcmFuZ2UgaXMgaW52YWxpZFxuICAgICAgaWYgKFxuICAgICAgICAhdmlzaWJsZVJhbmdlIHx8XG4gICAgICAgIHRvdGFsSXRlbXMgPD0gMCB8fFxuICAgICAgICB2aXNpYmxlUmFuZ2Uuc3RhcnQgPCAwIHx8XG4gICAgICAgIHZpc2libGVSYW5nZS5zdGFydCA+PSB0b3RhbEl0ZW1zIHx8XG4gICAgICAgIHZpc2libGVSYW5nZS5lbmQgPCB2aXNpYmxlUmFuZ2Uuc3RhcnQgfHxcbiAgICAgICAgaXNOYU4odmlzaWJsZVJhbmdlLnN0YXJ0KSB8fFxuICAgICAgICBpc05hTih2aXNpYmxlUmFuZ2UuZW5kKVxuICAgICAgKSB7XG4gICAgICAgIC8vIElmIHRvdGFsSXRlbXMgaXMgMCwgY2xlYXIgYWxsIHJlbmRlcmVkIGVsZW1lbnRzIHRvIHJlbW92ZSBzdGFsZSBwbGFjZWhvbGRlcnNcbiAgICAgICAgaWYgKHRvdGFsSXRlbXMgPD0gMCAmJiByZW5kZXJlZEVsZW1lbnRzLnNpemUgPiAwKSB7XG4gICAgICAgICAgQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLmVudHJpZXMoKSkuZm9yRWFjaCgoW2luZGV4LCBlbGVtZW50XSkgPT4ge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSkgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgICByZW5kZXJlZEVsZW1lbnRzLmRlbGV0ZShpbmRleCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiByYW5nZSBjaGFuZ2VkXG4gICAgICBpZiAoXG4gICAgICAgIHZpc2libGVSYW5nZS5zdGFydCA9PT0gY3VycmVudFZpc2libGVSYW5nZS5zdGFydCAmJlxuICAgICAgICB2aXNpYmxlUmFuZ2UuZW5kID09PSBjdXJyZW50VmlzaWJsZVJhbmdlLmVuZCAmJlxuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNpemUgPiAwXG4gICAgICApIHtcbiAgICAgICAgdXBkYXRlSXRlbVBvc2l0aW9ucygpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxhc3RSZW5kZXJUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IHJlbmRlclN0YXJ0ID0gTWF0aC5tYXgoMCwgdmlzaWJsZVJhbmdlLnN0YXJ0IC0gb3ZlcnNjYW4pO1xuICAgICAgY29uc3QgcmVuZGVyRW5kID0gTWF0aC5taW4odG90YWxJdGVtcyAtIDEsIHZpc2libGVSYW5nZS5lbmQgKyBvdmVyc2Nhbik7XG5cbiAgICAgIC8vIGlmIChpc1JlbW92aW5nSXRlbSkge1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhcbiAgICAgIC8vICAgICBgW1JFTkRFUi1GSVhdIHJlbmRlckl0ZW1zIGNhbGM6IHZpc2libGVSYW5nZT0ke0pTT04uc3RyaW5naWZ5KHZpc2libGVSYW5nZSl9LCBvdmVyc2Nhbj0ke292ZXJzY2FufSwgdG90YWxJdGVtcz0ke3RvdGFsSXRlbXN9YCxcbiAgICAgIC8vICAgKTtcbiAgICAgIC8vICAgY29uc29sZS5sb2coXG4gICAgICAvLyAgICAgYFtSRU5ERVItRklYXSByZW5kZXJJdGVtcyBjYWxjOiByZW5kZXJTdGFydD0ke3JlbmRlclN0YXJ0fSwgcmVuZGVyRW5kPSR7cmVuZGVyRW5kfWAsXG4gICAgICAvLyAgICk7XG4gICAgICAvLyB9XG5cbiAgICAgIC8vIFJlbW92ZSBpdGVtcyBvdXRzaWRlIHJhbmdlXG4gICAgICBBcnJheS5mcm9tKHJlbmRlcmVkRWxlbWVudHMuZW50cmllcygpKVxuICAgICAgICAuZmlsdGVyKChbaW5kZXhdKSA9PiBpbmRleCA8IHJlbmRlclN0YXJ0IHx8IGluZGV4ID4gcmVuZGVyRW5kKVxuICAgICAgICAuZm9yRWFjaCgoW2luZGV4LCBlbGVtZW50XSkgPT4ge1xuICAgICAgICAgIGlmIChlbGVtZW50LnBhcmVudE5vZGUpIHJlbGVhc2VFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuZGVsZXRlKGluZGV4KTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIEdldCBpdGVtcyBmcm9tIGNvbGxlY3Rpb24gKHNpbmdsZSBzb3VyY2Ugb2YgdHJ1dGgpXG4gICAgICBjb25zdCBpdGVtcyA9IGdldENvbGxlY3Rpb25JdGVtcygpO1xuICAgICAgY29uc3QgbWlzc2luZ0l0ZW1zOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgICAvLyBDb2xsZWN0IG5ldyBlbGVtZW50cyB0byBpbnNlcnQgKGluZGV4IC0+IGVsZW1lbnQpXG4gICAgICBjb25zdCBuZXdFbGVtZW50czogQXJyYXk8W251bWJlciwgSFRNTEVsZW1lbnRdPiA9IFtdO1xuXG4gICAgICAvLyBSZW5kZXIgaXRlbXMgaW4gcmFuZ2VcbiAgICAgIGZvciAobGV0IGkgPSByZW5kZXJTdGFydDsgaSA8PSByZW5kZXJFbmQ7IGkrKykge1xuICAgICAgICBpZiAoaSA8IDAgfHwgaSA+PSB0b3RhbEl0ZW1zIHx8IHJlbmRlcmVkRWxlbWVudHMuaGFzKGkpKSBjb250aW51ZTtcblxuICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zW2ldO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICBtaXNzaW5nSXRlbXMucHVzaChpKTtcbiAgICAgICAgICAvLyBHZW5lcmF0ZSBwbGFjZWhvbGRlciAocmVuZGVyZWQgZHluYW1pY2FsbHksIG5vdCBzdG9yZWQpXG4gICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gKGNvbXBvbmVudCBhcyBhbnkpLnBsYWNlaG9sZGVycztcbiAgICAgICAgICBpdGVtID0gcGxhY2Vob2xkZXJzPy5nZW5lcmF0ZVBsYWNlaG9sZGVySXRlbShpKSB8fCB7XG4gICAgICAgICAgICBfcGxhY2Vob2xkZXI6IHRydWUsXG4gICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgIGlkOiBgcGxhY2Vob2xkZXItJHtpfWAsXG4gICAgICAgICAgICBuYW1lOiBWSUVXUE9SVF9DT05TVEFOVFMuUExBQ0VIT0xERVIuTUFTS19DSEFSQUNURVIucmVwZWF0KDE1KSxcbiAgICAgICAgICAgIHRleHQ6IFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUi5yZXBlYXQoMjUpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgIFZJRVdQT1JUX0NPTlNUQU5UUy5QTEFDRUhPTERFUi5NQVNLX0NIQVJBQ1RFUi5yZXBlYXQoNDApLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVuZGVySXRlbShpdGVtLCBpKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAvLyBHZXQgdGFyZ2V0U2Nyb2xsSW5kZXggZnJvbSB2aWV3cG9ydFN0YXRlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IHRhcmdldFNjcm9sbEluZGV4ID0gKHZpZXdwb3J0U3RhdGUgYXMgYW55KT8udGFyZ2V0U2Nyb2xsSW5kZXg7XG4gICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBjYWxjdWxhdGVJdGVtUG9zaXRpb24oXG4gICAgICAgICAgICBpLFxuICAgICAgICAgICAgc2Nyb2xsUG9zaXRpb24sXG4gICAgICAgICAgICB0b3RhbEl0ZW1zLFxuICAgICAgICAgICAgaXRlbVNpemUsXG4gICAgICAgICAgICB2aXJ0dWFsVG90YWxTaXplLFxuICAgICAgICAgICAgY29udGFpbmVyU2l6ZSxcbiAgICAgICAgICAgIHRhcmdldFNjcm9sbEluZGV4LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBPYmplY3QuYXNzaWduKGVsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGVZKCR7cG9zaXRpb259cHgpYCxcbiAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8vIENvbGxlY3QgZm9yIGJhdGNoIGluc2VydGlvbiAoaWYgbWFpbnRhaW5pbmcgb3JkZXIpIG9yIGp1c3QgYXBwZW5kXG4gICAgICAgICAgaWYgKG1haW50YWluRG9tT3JkZXIpIHtcbiAgICAgICAgICAgIG5ld0VsZW1lbnRzLnB1c2goW2ksIGVsZW1lbnRdKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlbXNDb250YWluZXIuYXBwZW5kQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlbmRlcmVkRWxlbWVudHMuc2V0KGksIGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJhdGNoIGluc2VydCBuZXcgZWxlbWVudHMgaW4gY29ycmVjdCBET00gb3JkZXIgKG9ubHkgd2hlbiBtYWludGFpbkRvbU9yZGVyIGlzIGVuYWJsZWQpXG4gICAgICAvLyBUaGlzIGVuc3VyZXMgQ1NTIHNlbGVjdG9ycyBsaWtlIDpmaXJzdC1jaGlsZCwgOm50aC1jaGlsZCgpIHdvcmsgY29ycmVjdGx5XG4gICAgICBpZiAobWFpbnRhaW5Eb21PcmRlciAmJiBuZXdFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFNvcnQgbmV3IGVsZW1lbnRzIGJ5IGluZGV4XG4gICAgICAgIG5ld0VsZW1lbnRzLnNvcnQoKFthXSwgW2JdKSA9PiBhIC0gYik7XG5cbiAgICAgICAgLy8gR2V0IGV4aXN0aW5nIERPTSBjaGlsZHJlbiBzb3J0ZWQgYnkgdGhlaXIgZGF0YS1pbmRleFxuICAgICAgICBjb25zdCBleGlzdGluZ0NoaWxkcmVuID0gQXJyYXkuZnJvbShcbiAgICAgICAgICBpdGVtc0NvbnRhaW5lci5jaGlsZHJlbixcbiAgICAgICAgKSBhcyBIVE1MRWxlbWVudFtdO1xuXG4gICAgICAgIC8vIE1lcmdlIG5ldyBlbGVtZW50cyBpbnRvIGNvcnJlY3QgcG9zaXRpb25zXG4gICAgICAgIGxldCBuZXdJZHggPSAwO1xuICAgICAgICBsZXQgZXhpc3RpbmdJZHggPSAwO1xuXG4gICAgICAgIHdoaWxlIChuZXdJZHggPCBuZXdFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBbbmV3SW5kZXgsIG5ld0VsZW1lbnRdID0gbmV3RWxlbWVudHNbbmV3SWR4XTtcblxuICAgICAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IGV4aXN0aW5nIGNoaWxkIHdpdGggaW5kZXggPiBuZXdJbmRleFxuICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgIGV4aXN0aW5nSWR4IDwgZXhpc3RpbmdDaGlsZHJlbi5sZW5ndGggJiZcbiAgICAgICAgICAgIHBhcnNlSW50KGV4aXN0aW5nQ2hpbGRyZW5bZXhpc3RpbmdJZHhdLmRhdGFzZXQuaW5kZXggfHwgXCItMVwiLCAxMCkgPFxuICAgICAgICAgICAgICBuZXdJbmRleFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZXhpc3RpbmdJZHgrKztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXhpc3RpbmdJZHggPCBleGlzdGluZ0NoaWxkcmVuLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gSW5zZXJ0IGJlZm9yZSB0aGUgZXhpc3RpbmcgY2hpbGRcbiAgICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmluc2VydEJlZm9yZShcbiAgICAgICAgICAgICAgbmV3RWxlbWVudCxcbiAgICAgICAgICAgICAgZXhpc3RpbmdDaGlsZHJlbltleGlzdGluZ0lkeF0sXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBcHBlbmQgYXQgdGhlIGVuZFxuICAgICAgICAgICAgaXRlbXNDb250YWluZXIuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG5ld0lkeCsrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFJlcXVlc3QgbWlzc2luZyBpdGVtc1xuICAgICAgaWYgKFxuICAgICAgICBtaXNzaW5nSXRlbXMubGVuZ3RoID4gMCAmJlxuICAgICAgICBjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LmxvYWRNaXNzaW5nUmFuZ2VzXG4gICAgICApIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZE1pc3NpbmdSYW5nZXMoXG4gICAgICAgICAge1xuICAgICAgICAgICAgc3RhcnQ6IE1hdGgubWluKC4uLm1pc3NpbmdJdGVtcyksXG4gICAgICAgICAgICBlbmQ6IE1hdGgubWF4KC4uLm1pc3NpbmdJdGVtcyksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBcInJlbmRlcmluZzptaXNzaW5nLWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGN1cnJlbnRWaXNpYmxlUmFuZ2UgPSB2aXNpYmxlUmFuZ2U7XG5cbiAgICAgIC8vIEVtaXQgaXRlbXMgcmVuZGVyZWQgZXZlbnQgd2l0aCBlbGVtZW50cyBmb3Igc2l6ZSBjYWxjdWxhdGlvblxuICAgICAgY29uc3QgcmVuZGVyZWRFbGVtZW50c0FycmF5ID0gQXJyYXkuZnJvbShyZW5kZXJlZEVsZW1lbnRzLnZhbHVlcygpKTtcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJ2aWV3cG9ydDppdGVtcy1yZW5kZXJlZFwiLCB7XG4gICAgICAgIGVsZW1lbnRzOiByZW5kZXJlZEVsZW1lbnRzQXJyYXksXG4gICAgICAgIHJhbmdlOiB2aXNpYmxlUmFuZ2UsXG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcInZpZXdwb3J0OnJlbmRlcmVkXCIsIHtcbiAgICAgICAgcmFuZ2U6IHZpc2libGVSYW5nZSxcbiAgICAgICAgcmVuZGVyZWRDb3VudDogcmVuZGVyZWRFbGVtZW50cy5zaXplLFxuICAgICAgfSk7XG4gICAgICB1cGRhdGVJdGVtUG9zaXRpb25zKCk7XG5cbiAgICAgIC8vIExvYWQgZGF0YSBpZiBubyBpdGVtcyByZW5kZXJlZFxuICAgICAgaWYgKFxuICAgICAgICByZW5kZXJlZEVsZW1lbnRzLnNpemUgPT09IDAgJiZcbiAgICAgICAgdG90YWxJdGVtcyA+IDAgJiZcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uXG4gICAgICApIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZE1pc3NpbmdSYW5nZXMoXG4gICAgICAgICAgdmlzaWJsZVJhbmdlLFxuICAgICAgICAgIFwicmVuZGVyaW5nOm5vLWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCB2aWV3cG9ydCBBUElcbiAgICBjb25zdCBvcmlnaW5hbFJlbmRlckl0ZW1zID0gY29tcG9uZW50LnZpZXdwb3J0LnJlbmRlckl0ZW1zO1xuICAgIGNvbXBvbmVudC52aWV3cG9ydC5yZW5kZXJJdGVtcyA9ICgpID0+IHtcbiAgICAgIHJlbmRlckl0ZW1zKCk7XG4gICAgICBvcmlnaW5hbFJlbmRlckl0ZW1zPy4oKTtcbiAgICB9O1xuXG4gICAgLy8gQ2xlYW51cFxuICAgIHdyYXBEZXN0cm95KGNvbXBvbmVudCwgKCkgPT4ge1xuICAgICAgLy8gUmVsZWFzZSBhbGwgcmVuZGVyZWQgZWxlbWVudHMgLSB1c2UgcmVsZWFzZUVsZW1lbnQgdG8gcHJvcGVybHkgZGVzdHJveSBsYXlvdXRSZXN1bHRzXG4gICAgICByZW5kZXJlZEVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgcmVsZWFzZUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICB9KTtcbiAgICAgIHJlbmRlcmVkRWxlbWVudHMuY2xlYXIoKTtcblxuICAgICAgLy8gQ2xlYXIgZWxlbWVudCBwb29sXG4gICAgICBlbGVtZW50UG9vbC5sZW5ndGggPSAwO1xuXG4gICAgICAvLyBSZXNldCBzdGF0ZVxuICAgICAgY3VycmVudFZpc2libGVSYW5nZSA9IHsgc3RhcnQ6IC0xLCBlbmQ6IC0xIH07XG4gICAgICB2aWV3cG9ydFN0YXRlID0gbnVsbDtcbiAgICAgIGxhc3RSZW5kZXJUaW1lID0gMDtcblxuICAgICAgLy8gUmVzZXQgcG9vbCBzdGF0c1xuICAgICAgcG9vbFN0YXRzLmNyZWF0ZWQgPSAwO1xuICAgICAgcG9vbFN0YXRzLnJlY3ljbGVkID0gMDtcbiAgICAgIHBvb2xTdGF0cy5wb29sU2l6ZSA9IDA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY29tcG9uZW50O1xuICB9O1xufTtcbiIsCiAgICAiLy8gc3JjL2NvcmUvdmlld3BvcnQvZmVhdHVyZXMvZXZlbnRzLnRzXG5cbi8qKlxuICogRXZlbnRzIEZlYXR1cmUgLSBDZW50cmFsaXplZCBldmVudCBzeXN0ZW0gZm9yIHZpZXdwb3J0XG4gKiBQcm92aWRlcyBldmVudCBlbWlzc2lvbiBhbmQgc3Vic2NyaXB0aW9uIGZvciBpbnRlci1mZWF0dXJlIGNvbW11bmljYXRpb25cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZpZXdwb3J0Q29udGV4dCwgVmlld3BvcnRDb21wb25lbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBFdmVudHNDb25maWcge1xuICBkZWJ1Zz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRXZlbnRzIGZlYXR1cmUgZm9yIHZpZXdwb3J0XG4gKiBDZW50cmFsaXplcyBhbGwgZXZlbnQgaGFuZGxpbmcgZm9yIHZpZXdwb3J0IGZlYXR1cmVzXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRXZlbnRzID0gKGNvbmZpZzogRXZlbnRzQ29uZmlnID0ge30pID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgVmlld3BvcnRDb250ZXh0ICYgVmlld3BvcnRDb21wb25lbnQ+KGNvbXBvbmVudDogVCk6IFQgPT4ge1xuICAgIGNvbnN0IHsgZGVidWcgPSBmYWxzZSB9ID0gY29uZmlnO1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIG1hcFxuICAgIGNvbnN0IGxpc3RlbmVycyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8RnVuY3Rpb24+PigpO1xuXG4gICAgLy8gRW1pdCBhbiBldmVudFxuICAgIGNvbnN0IGVtaXQgPSAoZXZlbnQ6IHN0cmluZywgZGF0YT86IGFueSkgPT4ge1xuICAgICAgLy8gaWYgKGRlYnVnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBbRXZlbnRzXSBFbWl0OiAke2V2ZW50fWAsIGRhdGEpO1xuICAgICAgLy8gfVxuXG4gICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxpc3RlbmVyKGRhdGEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBbRXZlbnRzXSBFcnJvciBpbiBsaXN0ZW5lciBmb3IgJHtldmVudH06YCwgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIFN1YnNjcmliZSB0byBhbiBldmVudFxuICAgIGNvbnN0IG9uID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogKCgpID0+IHZvaWQpID0+IHtcbiAgICAgIGlmICghbGlzdGVuZXJzLmhhcyhldmVudCkpIHtcbiAgICAgICAgbGlzdGVuZXJzLnNldChldmVudCwgbmV3IFNldCgpKTtcbiAgICAgIH1cblxuICAgICAgbGlzdGVuZXJzLmdldChldmVudCkhLmFkZChoYW5kbGVyKTtcblxuICAgICAgLy8gaWYgKGRlYnVnKSB7XG4gICAgICAvLyAgIGNvbnNvbGUubG9nKGBbRXZlbnRzXSBTdWJzY3JpYmVkIHRvOiAke2V2ZW50fWApO1xuICAgICAgLy8gfVxuXG4gICAgICAvLyBSZXR1cm4gdW5zdWJzY3JpYmUgZnVuY3Rpb25cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50TGlzdGVuZXJzID0gbGlzdGVuZXJzLmdldChldmVudCk7XG4gICAgICAgIGlmIChldmVudExpc3RlbmVycykge1xuICAgICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgICBpZiAoZXZlbnRMaXN0ZW5lcnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG5cbiAgICAvLyBTdWJzY3JpYmUgdG8gYW4gZXZlbnQgb25jZVxuICAgIGNvbnN0IG9uY2UgPSAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pOiAoKCkgPT4gdm9pZCkgPT4ge1xuICAgICAgY29uc3Qgd3JhcHBlZEhhbmRsZXIgPSAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGhhbmRsZXIoZGF0YSk7XG4gICAgICAgIG9mZihldmVudCwgd3JhcHBlZEhhbmRsZXIpO1xuICAgICAgfTtcbiAgICAgIHJldHVybiBvbihldmVudCwgd3JhcHBlZEhhbmRsZXIpO1xuICAgIH07XG5cbiAgICAvLyBVbnN1YnNjcmliZSBmcm9tIGFuIGV2ZW50XG4gICAgY29uc3Qgb2ZmID0gKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSA9PiB7XG4gICAgICBjb25zdCBldmVudExpc3RlbmVycyA9IGxpc3RlbmVycy5nZXQoZXZlbnQpO1xuICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzKSB7XG4gICAgICAgIGV2ZW50TGlzdGVuZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgICAgaWYgKGV2ZW50TGlzdGVuZXJzLnNpemUgPT09IDApIHtcbiAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGV2ZW50KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBDbGVhciBhbGwgbGlzdGVuZXJzIGZvciBhbiBldmVudFxuICAgIGNvbnN0IGNsZWFyID0gKGV2ZW50Pzogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgbGlzdGVuZXJzLmRlbGV0ZShldmVudCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsaXN0ZW5lcnMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQWRkIGV2ZW50IG1ldGhvZHMgdG8gY29tcG9uZW50XG4gICAgY29tcG9uZW50LmVtaXQgPSBlbWl0O1xuICAgIGNvbXBvbmVudC5vbiA9IG9uO1xuICAgIGNvbXBvbmVudC5vbmNlID0gb25jZTtcbiAgICBjb21wb25lbnQub2ZmID0gb2ZmO1xuXG4gICAgLy8gQWRkIGV2ZW50cyBBUEkgdG8gdmlld3BvcnRcbiAgICAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSkuZXZlbnRzID0ge1xuICAgICAgZW1pdCxcbiAgICAgIG9uLFxuICAgICAgb25jZSxcbiAgICAgIG9mZixcbiAgICAgIGNsZWFyLFxuICAgICAgZ2V0TGlzdGVuZXJDb3VudDogKGV2ZW50Pzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgIHJldHVybiBsaXN0ZW5lcnMuZ2V0KGV2ZW50KT8uc2l6ZSB8fCAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKChzZXQpID0+ICh0b3RhbCArPSBzZXQuc2l6ZSkpO1xuICAgICAgICByZXR1cm4gdG90YWw7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBDbGVhbiB1cCBvbiBkZXN0cm95XG4gICAgaWYgKFwiZGVzdHJveVwiIGluIGNvbXBvbmVudCAmJiB0eXBlb2YgY29tcG9uZW50LmRlc3Ryb3kgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgICBjb21wb25lbnQuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgY2xlYXIoKTtcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95Py4oKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudDtcbiAgfTtcbn07XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L3ZsaXN0LnRzXG5cbi8qKlxuICogVkxpc3QgQ29tcG9uZW50IC0gVmlydHVhbCBMaXN0IHdpdGggZGlyZWN0IHZpZXdwb3J0IGludGVncmF0aW9uXG4gKlxuICogQSBzaW1wbGlmaWVkIHZpcnR1YWwgbGlzdCB0aGF0IHVzZXMgdGhlIHZpZXdwb3J0IGZlYXR1cmUgZGlyZWN0bHlcbiAqIHdpdGhvdXQgdGhlIGxpc3QtbWFuYWdlciBhYnN0cmFjdGlvbiBsYXllci5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdENvbXBvbmVudCwgVkxpc3RJdGVtIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLy8gSW1wb3J0IG10cmwgY29tcG9zZSBzeXN0ZW1cbmltcG9ydCB7IHBpcGUgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgY3JlYXRlQmFzZSwgd2l0aEVsZW1lbnQgfSBmcm9tIFwibXRybFwiO1xuaW1wb3J0IHsgd2l0aEV2ZW50cywgd2l0aExpZmVjeWNsZSB9IGZyb20gXCJtdHJsXCI7XG5cbi8vIEltcG9ydCB2aWV3cG9ydCBmZWF0dXJlXG5pbXBvcnQgeyB3aXRoVmlld3BvcnQgfSBmcm9tIFwiLi9mZWF0dXJlcy92aWV3cG9ydFwiO1xuaW1wb3J0IHsgd2l0aEFQSSB9IGZyb20gXCIuL2ZlYXR1cmVzL2FwaVwiO1xuaW1wb3J0IHsgd2l0aFNlbGVjdGlvbiB9IGZyb20gXCIuL2ZlYXR1cmVzL3NlbGVjdGlvblwiO1xuaW1wb3J0IHsgd2l0aEtleWJvYXJkIH0gZnJvbSBcIi4vZmVhdHVyZXMva2V5Ym9hcmRcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IFZMaXN0IGNvbXBvbmVudCB1c2luZyBkaXJlY3Qgdmlld3BvcnQgaW50ZWdyYXRpb25cbiAqXG4gKiBAcGFyYW0ge1ZMaXN0Q29uZmlnfSBjb25maWcgLSBMaXN0IGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMge1ZMaXN0Q29tcG9uZW50fSBBIGZ1bGx5IGNvbmZpZ3VyZWQgdmlydHVhbCBsaXN0IGNvbXBvbmVudFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB2bGlzdCA9IGNyZWF0ZVZMaXN0KHtcbiAqICAgY29udGFpbmVyOiAnI215LWxpc3QnLFxuICogICBjb2xsZWN0aW9uOiBteUFkYXB0ZXIsXG4gKiAgIHJhbmdlU2l6ZTogMjAsXG4gKiAgIHBhZ2luYXRpb25TdHJhdGVneTogJ3BhZ2UnLFxuICogICB0ZW1wbGF0ZTogKGl0ZW0sIGluZGV4KSA9PiBbXG4gKiAgICAgeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW0nLCBhdHRyaWJ1dGVzOiB7ICdkYXRhLWlkJzogaXRlbS5pZCB9fSxcbiAqICAgICBbeyBjbGFzczogJ3ZpZXdwb3J0LWl0ZW1fX25hbWUnLCB0ZXh0OiBpdGVtLm5hbWUgfV0sXG4gKiAgICAgW3sgY2xhc3M6ICd2aWV3cG9ydC1pdGVtX192YWx1ZScsIHRleHQ6IGl0ZW0udmFsdWUgfV1cbiAqICAgXVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZVZMaXN0ID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+ID0ge30sXG4pOiBWTGlzdENvbXBvbmVudDxUPiA9PiB7XG4gIHRyeSB7XG4gICAgLy8gY29uc29sZS5sb2coYPCfk4sgQ3JlYXRpbmcgVkxpc3QgY29tcG9uZW50IHdpdGggZGlyZWN0IHZpZXdwb3J0IGludGVncmF0aW9uYCk7XG5cbiAgICAvLyBOb3RlOiBUcmFuc2Zvcm0gc2hvdWxkIGJlIGFwcGxpZWQgYnkgdGhlIGNvbGxlY3Rpb24gZmVhdHVyZSBpbiB2aWV3cG9ydFxuICAgIC8vIFZMaXN0IHNob3VsZCBub3QgaW50ZXJjZXB0IGNvbGxlY3Rpb24gcmVhZHMgYXMgaXQgYnlwYXNzZXMgdGhlIGxvYWRpbmcgbWFuYWdlclxuXG4gICAgLy8gQ3JlYXRlIHRoZSBjb21wb25lbnQgdGhyb3VnaCBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gICAgY29uc3QgZW5oYW5jZXJzID0gW1xuICAgICAgLy8gMS4gRm91bmRhdGlvbiBsYXllclxuICAgICAgY3JlYXRlQmFzZSxcbiAgICAgIHdpdGhFdmVudHMoKSxcbiAgICAgIHdpdGhFbGVtZW50KHtcbiAgICAgICAgdGFnOiBcImRpdlwiLFxuICAgICAgICBjbGFzc05hbWU6IGNvbmZpZy5jbGFzc05hbWUgfHwgXCJtdHJsLXZsaXN0XCIsXG4gICAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgICByb2xlOiBcImxpc3RcIixcbiAgICAgICAgICBcImFyaWEtbGFiZWxcIjogY29uZmlnLmFyaWFMYWJlbCB8fCBcIlZpcnR1YWwgTGlzdFwiLFxuICAgICAgICB9LFxuICAgICAgfSksXG5cbiAgICAgIC8vIDIuIFZpZXdwb3J0IGludGVncmF0aW9uXG4gICAgICAvLyBQYXNzIGF1dG9TZWxlY3RGaXJzdCBmcm9tIHNlbGVjdGlvbiBjb25maWcgdG8gdmlld3BvcnQgbGV2ZWxcbiAgICAgIHdpdGhWaWV3cG9ydCh7XG4gICAgICAgIC4uLmNvbmZpZyxcbiAgICAgICAgYXV0b1NlbGVjdEZpcnN0OiBjb25maWcuc2VsZWN0aW9uPy5hdXRvU2VsZWN0Rmlyc3QsXG4gICAgICB9KSxcblxuICAgICAgLy8gMy4gQ29tcG9uZW50IGxpZmVjeWNsZVxuICAgICAgd2l0aExpZmVjeWNsZSgpLFxuXG4gICAgICAvLyA0LiBQdWJsaWMgQVBJIGxheWVyXG4gICAgICB3aXRoQVBJKGNvbmZpZyksXG4gICAgXTtcblxuICAgIC8vIDQuNS4gU2VsZWN0aW9uIGNhcGFiaWxpdGllcyAoaWYgZW5hYmxlZCkgLSBtdXN0IGJlIGFmdGVyIEFQSVxuICAgIGlmIChjb25maWcuc2VsZWN0aW9uPy5lbmFibGVkKSB7XG4gICAgICBlbmhhbmNlcnMucHVzaCh3aXRoU2VsZWN0aW9uKGNvbmZpZykpO1xuICAgIH1cblxuICAgIC8vIDUuIEtleWJvYXJkIG5hdmlnYXRpb24gKGlmIHNlbGVjdGlvbiBlbmFibGVkIG9yIGV4cGxpY2l0bHkgY29uZmlndXJlZClcbiAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8uZW5hYmxlZCB8fCBjb25maWcua2V5Ym9hcmQ/LmVuYWJsZWQpIHtcbiAgICAgIGVuaGFuY2Vycy5wdXNoKHdpdGhLZXlib2FyZChjb25maWcpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wb25lbnQgPSBwaXBlKC4uLmVuaGFuY2Vycykoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgY29tcG9uZW50TmFtZTogXCJ2bGlzdFwiLFxuICAgICAgcHJlZml4OiBjb25maWcucHJlZml4IHx8IFwibXRybFwiLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyBWTGlzdENvbXBvbmVudDxUPjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwi4p2MIFtWTElTVF0gRmFpbGVkIHRvIGNyZWF0ZSBWTGlzdCBjb21wb25lbnQ6XCIsIGVycm9yKTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfVxufTtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvdmlld3BvcnQudHNcblxuLyoqXG4gKiBWaWV3cG9ydCBmZWF0dXJlIGZvciBWTGlzdFxuICogSW50ZWdyYXRlcyB0aGUgY29yZSB2aWV3cG9ydCBmdW5jdGlvbmFsaXR5IHdpdGggVkxpc3QgY29tcG9uZW50XG4gKi9cblxuaW1wb3J0IHR5cGUgeyBWTGlzdENvbmZpZywgVkxpc3RJdGVtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVWaWV3cG9ydCB9IGZyb20gXCIuLi8uLi8uLi9jb3JlL3ZpZXdwb3J0XCI7XG5cbi8qKlxuICogQWRkcyB2aWV3cG9ydCBmdW5jdGlvbmFsaXR5IHRvIFZMaXN0XG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoVmlld3BvcnQgPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4sXG4pID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgIC8vIFNldCBpbml0aWFsIGl0ZW1zIGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZy5pdGVtcykge1xuICAgICAgY29tcG9uZW50Lml0ZW1zID0gY29uZmlnLml0ZW1zO1xuICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSBjb25maWcuaXRlbXMubGVuZ3RoO1xuICAgIH1cblxuICAgIC8vIFNldCB0ZW1wbGF0ZSBpZiBwcm92aWRlZFxuICAgIGlmIChjb25maWcudGVtcGxhdGUpIHtcbiAgICAgIGNvbXBvbmVudC50ZW1wbGF0ZSA9IGNvbmZpZy50ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvLyBFbnN1cmUgdGhlIGVsZW1lbnQgaGFzIGJvdGggdmxpc3QgYW5kIHZpZXdwb3J0IGNsYXNzZXNcbiAgICBjb25zdCB2aWV3cG9ydENvbmZpZyA9IHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNsYXNzTmFtZTogXCJtdHJsLXZpZXdwb3J0XCIsIC8vIFRoaXMgd2lsbCBiZSBhZGRlZCBieSB2aWV3cG9ydCBiYXNlIGZlYXR1cmVcbiAgICB9O1xuXG4gICAgLy8gUGFzcyBWTGlzdCBjb25maWcgZGlyZWN0bHkgdG8gdmlld3BvcnRcbiAgICBjb25zdCB2aWV3cG9ydEVuaGFuY2VkID0gY3JlYXRlVmlld3BvcnQodmlld3BvcnRDb25maWcgYXMgYW55KShjb21wb25lbnQpO1xuXG4gICAgLy8gSGFuZGxlIHBhcmVudCBlbGVtZW50IGlmIHByb3ZpZGVkXG4gICAgaWYgKGNvbmZpZy5wYXJlbnQgfHwgY29uZmlnLmNvbnRhaW5lcikge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gY29uZmlnLnBhcmVudCB8fCBjb25maWcuY29udGFpbmVyO1xuICAgICAgY29uc3QgZWxlbWVudCA9XG4gICAgICAgIHR5cGVvZiBjb250YWluZXIgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoY29udGFpbmVyKVxuICAgICAgICAgIDogY29udGFpbmVyO1xuXG4gICAgICBpZiAoZWxlbWVudCAmJiB2aWV3cG9ydEVuaGFuY2VkLmVsZW1lbnQpIHtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZCh2aWV3cG9ydEVuaGFuY2VkLmVsZW1lbnQpO1xuXG4gICAgICAgIC8vIEVuc3VyZSB2aWV3cG9ydCBpcyBpbml0aWFsaXplZCBhZnRlciBET00gYXR0YWNobWVudFxuICAgICAgICBpZiAodmlld3BvcnRFbmhhbmNlZC52aWV3cG9ydCAmJiB2aWV3cG9ydEVuaGFuY2VkLnZpZXdwb3J0LmluaXRpYWxpemUpIHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIvCfk4sgW1ZMaXN0XSBJbml0aWFsaXppbmcgdmlld3BvcnQgYWZ0ZXIgRE9NIGF0dGFjaG1lbnRcIik7XG4gICAgICAgICAgdmlld3BvcnRFbmhhbmNlZC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdmlld3BvcnRFbmhhbmNlZDtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogQVBJIGZlYXR1cmUgZm9yIFZMaXN0XG4gKiBQcm92aWRlcyBhIGNsZWFuIHB1YmxpYyBBUEkgZm9yIHRoZSBWTGlzdCBjb21wb25lbnRcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFZMaXN0Q29uZmlnLCBWTGlzdEl0ZW0sIFJlbW92ZUl0ZW1PcHRpb25zIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5cbi8vIFJlLWV4cG9ydCBmb3IgY29udmVuaWVuY2VcbmV4cG9ydCB0eXBlIHsgUmVtb3ZlSXRlbU9wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IHdpdGhBUEkgPSA8VCBleHRlbmRzIFZMaXN0SXRlbSA9IFZMaXN0SXRlbT4oXG4gIGNvbmZpZzogVkxpc3RDb25maWc8VD4sXG4pID0+IHtcbiAgcmV0dXJuIChjb21wb25lbnQ6IGFueSkgPT4ge1xuICAgIC8vIEluaXRpYWxpemUgdmlld3BvcnQgb24gY3JlYXRpb25cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQgJiYgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUpIHtcbiAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmluaXRpYWxpemUoKTtcbiAgICAgIH1cbiAgICB9LCAwKTtcblxuICAgIC8vIFRyYWNrIGxvYWRpbmcgc3RhdGVcbiAgICBsZXQgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgbGV0IHNlbGVjdGVkSWRzID0gbmV3IFNldDxzdHJpbmcgfCBudW1iZXI+KCk7XG5cbiAgICAvLyBUcmFjayBwZW5kaW5nIHJlbW92YWxzIHRvIGZpbHRlciBvdXQgaXRlbXMgZnJvbSBzdGFsZSBzZXJ2ZXIgcmVzcG9uc2VzXG4gICAgLy8gVGhpcyBwcmV2ZW50cyByYWNlIGNvbmRpdGlvbnMgd2hlcmUgc2VydmVyIHJldHVybnMgb2xkIGRhdGEgYmVmb3JlIHVwZGF0ZXMgYXJlIGNvbW1pdHRlZFxuICAgIGNvbnN0IHBlbmRpbmdSZW1vdmFscyA9IG5ldyBTZXQ8c3RyaW5nIHwgbnVtYmVyPigpO1xuXG4gICAgLy8gTGlzdGVuIGZvciBjb2xsZWN0aW9uIGV2ZW50c1xuICAgIGNvbXBvbmVudC5vbj8uKFwiY29sbGVjdGlvbjpyYW5nZS1sb2FkZWRcIiwgKCkgPT4ge1xuICAgICAgaXNMb2FkaW5nID0gZmFsc2U7XG4gICAgfSk7XG4gICAgY29tcG9uZW50Lm9uPy4oXCJjb2xsZWN0aW9uOnJhbmdlLWZhaWxlZFwiLCAoKSA9PiB7XG4gICAgICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8vIERhdGEgb3BlcmF0aW9uc1xuXG4gICAgICAvKipcbiAgICAgICAqIFJlbG9hZCB0aGUgbGlzdCAtIGNsZWFycyBhbGwgZGF0YSBhbmQgZmV0Y2hlcyBmcmVzaCBmcm9tIHRoZSBhZGFwdGVyXG4gICAgICAgKiBUaGlzIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbiBkZXN0cm95aW5nIGFuZCByZWNyZWF0aW5nIHRoZSBWTGlzdFxuICAgICAgICovXG4gICAgICBhc3luYyByZWxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIFJlc2V0IHRoZSBjb2xsZWN0aW9uIHN0YXRlXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LnJlc2V0KSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ucmVzZXQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IHNjcm9sbCBwb3NpdGlvbiB0byB0b3BcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uc2Nyb2xsVG8pIHtcbiAgICAgICAgICBjb21wb25lbnQudmlld3BvcnQuc2Nyb2xsVG8oMCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciByZW5kZXJlZCBET00gY29udGVudCAoaXRlbXMgY29udGFpbmVyKVxuICAgICAgICBjb25zdCBpdGVtc0NvbnRhaW5lciA9IGNvbXBvbmVudC5lbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgIFwiLm10cmwtdmlld3BvcnQtaXRlbXNcIixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGl0ZW1zQ29udGFpbmVyKSB7XG4gICAgICAgICAgaXRlbXNDb250YWluZXIuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlc2V0IGluaXRpYWxpemF0aW9uIHN0YXRlIHNvIGluaXRpYWxpemUoKSB3aWxsIHJ1biBhZ2FpblxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5yZXNldEluaXRpYWxpemF0aW9uKSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnJlc2V0SW5pdGlhbGl6YXRpb24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlLWluaXRpYWxpemUgdG8gdHJpZ2dlciBmcmVzaCBkYXRhIGxvYWRcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uaW5pdGlhbGl6ZSkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5pbml0aWFsaXplKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwicmVsb2FkZWRcIik7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCBkYXRhIHdpdGhvdXQgcmVsb2FkaW5nXG4gICAgICAgKi9cbiAgICAgIGNsZWFyKCk6IHZvaWQge1xuICAgICAgICAvLyBSZXNldCB0aGUgY29sbGVjdGlvbiBzdGF0ZVxuICAgICAgICBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uPy5yZXNldCkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLnJlc2V0KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNldCBzY3JvbGwgcG9zaXRpb24gdG8gdG9wXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvKSB7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvKDApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgcmVuZGVyZWQgRE9NIGNvbnRlbnQgKGl0ZW1zIGNvbnRhaW5lcilcbiAgICAgICAgY29uc3QgaXRlbXNDb250YWluZXIgPSBjb21wb25lbnQuZWxlbWVudD8ucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBcIi5tdHJsLXZpZXdwb3J0LWl0ZW1zXCIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChpdGVtc0NvbnRhaW5lcikge1xuICAgICAgICAgIGl0ZW1zQ29udGFpbmVyLmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY2xlYXJlZFwiKTtcbiAgICAgIH0sXG5cbiAgICAgIHNldEl0ZW1zKGl0ZW1zOiBUW10pIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uY29sbGVjdGlvbikge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLnNldEl0ZW1zKGl0ZW1zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21wb25lbnQuaXRlbXMgPSBpdGVtcztcbiAgICAgICAgICBjb21wb25lbnQudG90YWxJdGVtcyA9IGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbXM6c2V0XCIsIHsgaXRlbXMsIHRvdGFsOiBpdGVtcy5sZW5ndGggfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEFkZCBpdGVtcyB0byB0aGUgY29sbGVjdGlvbiBhdCB0aGUgc3RhcnQgb3IgZW5kXG4gICAgICAgKiBVcGRhdGVzIHRvdGFsSXRlbXMgYW5kIHRyaWdnZXJzIHJlLXJlbmRlciBvZiB2aXNpYmxlIGl0ZW1zXG4gICAgICAgKiBAcGFyYW0gbmV3SXRlbXMgLSBBcnJheSBvZiBpdGVtcyB0byBhZGRcbiAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiAtIFdoZXJlIHRvIGFkZCBpdGVtczogXCJzdGFydFwiIChkZWZhdWx0KSBvciBcImVuZFwiXG4gICAgICAgKi9cbiAgICAgIGFkZEl0ZW1zKG5ld0l0ZW1zOiBUW10sIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiID0gXCJzdGFydFwiKTogdm9pZCB7XG4gICAgICAgIGlmICghbmV3SXRlbXMgfHwgbmV3SXRlbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW1ZMaXN0XSBhZGRJdGVtczogbm8gaXRlbXMgcHJvdmlkZWRcIik7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uO1xuICAgICAgICBjb25zdCBjdXJyZW50SXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG5cbiAgICAgICAgLy8gQWRkIGl0ZW1zIHRvIHRoZSBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5XG4gICAgICAgIGlmIChjb2xsZWN0aW9uPy5pdGVtcykge1xuICAgICAgICAgIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XG4gICAgICAgICAgICAvLyBQcmVwZW5kIGl0ZW1zIChuZXdlc3QgZmlyc3QpXG4gICAgICAgICAgICBjb2xsZWN0aW9uLml0ZW1zLnVuc2hpZnQoLi4ubmV3SXRlbXMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBBcHBlbmQgaXRlbXNcbiAgICAgICAgICAgIGNvbGxlY3Rpb24uaXRlbXMucHVzaCguLi5uZXdJdGVtcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBldmVudCBGSVJTVCBzbyByZW5kZXJpbmcgZmVhdHVyZSBjYW4gcmVidWlsZCBjb2xsZWN0aW9uSXRlbXNcbiAgICAgICAgLy8gQkVGT1JFIHNldFRvdGFsSXRlbXMgdHJpZ2dlcnMgYSByZW5kZXJcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcIml0ZW1zOmFkZC1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpdGVtczogbmV3SXRlbXMsXG4gICAgICAgICAgcG9zaXRpb24sXG4gICAgICAgICAgcHJldmlvdXNDb3VudDogY3VycmVudEl0ZW1zLmxlbmd0aCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVXBkYXRlIHRvdGFsSXRlbXMgLSB0aGlzIHRyaWdnZXJzIHZpZXdwb3J0OnRvdGFsLWl0ZW1zLWNoYW5nZWQgd2hpY2ggY2FsbHMgcmVuZGVySXRlbXNcbiAgICAgICAgY29uc3QgaXRlbXNBZGRlZCA9IG5ld0l0ZW1zLmxlbmd0aDtcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldFRvdGFsSXRlbXMgJiYgY29sbGVjdGlvbj8uc2V0VG90YWxJdGVtcykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb3RhbCA9IGNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhjdXJyZW50VG90YWwgKyBpdGVtc0FkZGVkKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24/LnNldFRvdGFsSXRlbXMpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50VG90YWwgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhcbiAgICAgICAgICAgIGN1cnJlbnRUb3RhbCArIGl0ZW1zQWRkZWQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoY29tcG9uZW50LnRvdGFsSXRlbXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29tcG9uZW50LnRvdGFsSXRlbXMgPSBjb21wb25lbnQudG90YWxJdGVtcyArIGl0ZW1zQWRkZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBjb21wbGV0aW9uIGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtczphZGRlZFwiLCB7XG4gICAgICAgICAgaXRlbXM6IG5ld0l0ZW1zLFxuICAgICAgICAgIHBvc2l0aW9uLFxuICAgICAgICAgIHRvdGFsOiB0aGlzLmdldEl0ZW1Db3VudCgpLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQWRkIGEgc2luZ2xlIGl0ZW0gdG8gdGhlIGNvbGxlY3Rpb24gYXQgdGhlIHN0YXJ0IG9yIGVuZFxuICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgd3JhcHMgYWRkSXRlbXMgZm9yIHNpbmdsZSBpdGVtIHVzZSBjYXNlXG4gICAgICAgKiBAcGFyYW0gaXRlbSAtIEl0ZW0gdG8gYWRkXG4gICAgICAgKiBAcGFyYW0gcG9zaXRpb24gLSBXaGVyZSB0byBhZGQgaXRlbTogXCJzdGFydFwiIChkZWZhdWx0KSBvciBcImVuZFwiXG4gICAgICAgKi9cbiAgICAgIGFkZEl0ZW0oaXRlbTogVCwgcG9zaXRpb246IFwic3RhcnRcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiW1ZMaXN0XSBhZGRJdGVtOiBubyBpdGVtIHByb3ZpZGVkXCIpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZEl0ZW1zKFtpdGVtXSwgcG9zaXRpb24pO1xuICAgICAgfSxcblxuICAgICAgZ2V0SXRlbXMoKTogVFtdIHtcbiAgICAgICAgLy8gQ29sbGVjdGlvbiBpcyBhZGRlZCBkaXJlY3RseSB0byBjb21wb25lbnQsIG5vdCB0byB2aWV3cG9ydC5jb2xsZWN0aW9uXG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uZ2V0SXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uZ2V0SXRlbXMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcG9uZW50Lml0ZW1zIHx8IFtdO1xuICAgICAgfSxcblxuICAgICAgZ2V0VmlzaWJsZUl0ZW1zKCk6IFRbXSB7XG4gICAgICAgIGNvbnN0IHJhbmdlID0gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2UoKSB8fCB7XG4gICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgZW5kOiAwLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgcmV0dXJuIGl0ZW1zLnNsaWNlKHJhbmdlLnN0YXJ0LCByYW5nZS5lbmQpO1xuICAgICAgfSxcblxuICAgICAgZ2V0SXRlbUNvdW50KCk6IG51bWJlciB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICByZXR1cm4gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudG90YWxJdGVtcyB8fCBjb21wb25lbnQuaXRlbXM/Lmxlbmd0aCB8fCAwO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgaXRlbSBhdCBhIHNwZWNpZmljIGluZGV4XG4gICAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gcmV0cmlldmVcbiAgICAgICAqIEByZXR1cm5zIFRoZSBpdGVtIGF0IHRoZSBpbmRleCwgb3IgdW5kZWZpbmVkIGlmIG5vdCBmb3VuZFxuICAgICAgICovXG4gICAgICBnZXRJdGVtKGluZGV4OiBudW1iZXIpOiBUIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uPy5nZXRJdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uLmdldEl0ZW0oaW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5nZXRJdGVtcygpO1xuICAgICAgICByZXR1cm4gaXRlbXNbaW5kZXhdO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBVcGRhdGUgaXRlbSBhdCBhIHNwZWNpZmljIGluZGV4XG4gICAgICAgKiBAcGFyYW0gaW5kZXggLSBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gdG8gdXBkYXRlXG4gICAgICAgKiBAcGFyYW0gaXRlbSAtIFRoZSBuZXcgaXRlbSBkYXRhIChmdWxsIHJlcGxhY2VtZW50KVxuICAgICAgICovXG4gICAgICB1cGRhdGVJdGVtKGluZGV4OiBudW1iZXIsIGl0ZW06IFQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG5cbiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFtWTGlzdF0gdXBkYXRlSXRlbTogaW5kZXggJHtpbmRleH0gb3V0IG9mIGJvdW5kc2ApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXZpb3VzSXRlbSA9IGl0ZW1zW2luZGV4XTtcblxuICAgICAgICAvLyBVcGRhdGUgaW4gY29sbGVjdGlvbiBpdGVtcyBhcnJheVxuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/Lml0ZW1zKSB7XG4gICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uaXRlbXNbaW5kZXhdID0gaXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZXZlbnQgZm9yIHJlbmRlcmluZyBmZWF0dXJlIHRvIGhhbmRsZSBET00gdXBkYXRlXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnVwZGF0ZS1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpdGVtLFxuICAgICAgICAgIHByZXZpb3VzSXRlbSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFVwZGF0ZSBpdGVtIGJ5IElEXG4gICAgICAgKiBGaW5kcyB0aGUgaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBieSBpdHMgSUQgYW5kIHVwZGF0ZXMgaXQgd2l0aCBuZXcgZGF0YVxuICAgICAgICogUmUtcmVuZGVycyB0aGUgaXRlbSBpZiBjdXJyZW50bHkgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcbiAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpdGVtIElEIHRvIGZpbmRcbiAgICAgICAqIEBwYXJhbSBkYXRhIC0gUGFydGlhbCBkYXRhIHRvIG1lcmdlIHdpdGggZXhpc3RpbmcgaXRlbSwgb3IgZnVsbCBpdGVtIHJlcGxhY2VtZW50XG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFVwZGF0ZSBvcHRpb25zXG4gICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGl0ZW0gd2FzIGZvdW5kIGFuZCB1cGRhdGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgICAqL1xuICAgICAgdXBkYXRlSXRlbUJ5SWQoXG4gICAgICAgIGlkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgIGRhdGE6IFBhcnRpYWw8VD4sXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAvKiogSWYgdHJ1ZSwgcmVwbGFjZSB0aGUgZW50aXJlIGl0ZW0gaW5zdGVhZCBvZiBtZXJnaW5nIChkZWZhdWx0OiBmYWxzZSkgKi9cbiAgICAgICAgICByZXBsYWNlPzogYm9vbGVhbjtcbiAgICAgICAgICAvKiogSWYgdHJ1ZSwgcmUtcmVuZGVyIGV2ZW4gaWYgbm90IHZpc2libGUgKGRlZmF1bHQ6IGZhbHNlKSAqL1xuICAgICAgICAgIGZvcmNlUmVuZGVyPzogYm9vbGVhbjtcbiAgICAgICAgfSA9IHt9LFxuICAgICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHsgcmVwbGFjZSA9IGZhbHNlIH0gPSBvcHRpb25zO1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBpdGVtIGJ5IElEIChoYW5kbGUgc3BhcnNlIGFycmF5cyBmcm9tIHBhZ2luYXRpb24pXG4gICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHMgc2luY2UgaXRlbXMgbWF5IGhhdmUgZGlmZmVyZW50IElEIHN0cnVjdHVyZXNcbiAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHMgLSB1c2VyX2lkIGlzIGltcG9ydGFudCBmb3IgcHJvZmlsZS9jb250YWN0IGl0ZW1zXG4gICAgICAgICAgY29uc3QgaWRzVG9DaGVjayA9IFtpdGVtLmlkLCBpdGVtLl9pZCwgaXRlbS51c2VyX2lkXS5maWx0ZXIoXG4gICAgICAgICAgICAodikgPT4gdiAhPT0gdW5kZWZpbmVkICYmIHYgIT09IG51bGwsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gaWRzVG9DaGVjay5zb21lKFxuICAgICAgICAgICAgKGl0ZW1JZCkgPT4gaXRlbUlkID09PSBpZCB8fCBTdHJpbmcoaXRlbUlkKSA9PT0gU3RyaW5nKGlkKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHVwZGF0ZUl0ZW1CeUlkOiBpdGVtIHdpdGggaWQgJHtpZH0gbm90IGZvdW5kYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcHJldmlvdXNJdGVtID0gaXRlbXNbaW5kZXhdO1xuXG4gICAgICAgIC8vIENyZWF0ZSB1cGRhdGVkIGl0ZW0gLSBlaXRoZXIgcmVwbGFjZSBlbnRpcmVseSBvciBtZXJnZVxuICAgICAgICBsZXQgdXBkYXRlZEl0ZW06IFQ7XG4gICAgICAgIGlmIChyZXBsYWNlKSB7XG4gICAgICAgICAgdXBkYXRlZEl0ZW0gPSB7IC4uLmRhdGEsIGlkOiBwcmV2aW91c0l0ZW0uaWQgPz8gaWQgfSBhcyBUO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIE9ubHkgbWVyZ2UgcHJvcGVydGllcyB0aGF0IGhhdmUgYWN0dWFsIHZhbHVlcyAobm90IHVuZGVmaW5lZClcbiAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHBhcnRpYWwgdXBkYXRlcyBmcm9tIG92ZXJ3cml0aW5nIGV4aXN0aW5nIGRhdGFcbiAgICAgICAgICB1cGRhdGVkSXRlbSA9IHsgLi4ucHJldmlvdXNJdGVtIH0gYXMgVDtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkYXRhKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgKHVwZGF0ZWRJdGVtIGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBpbiBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5XG4gICAgICAgIGlmICgoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbj8uaXRlbXMpIHtcbiAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuY29sbGVjdGlvbi5pdGVtc1tpbmRleF0gPSB1cGRhdGVkSXRlbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVtaXQgZXZlbnQgZm9yIHJlbmRlcmluZyBmZWF0dXJlIHRvIGhhbmRsZSBET00gdXBkYXRlXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOnVwZGF0ZS1yZXF1ZXN0XCIsIHtcbiAgICAgICAgICBpbmRleCxcbiAgICAgICAgICBpdGVtOiB1cGRhdGVkSXRlbSxcbiAgICAgICAgICBwcmV2aW91c0l0ZW0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBSZW1vdmUgaXRlbSBhdCBhIHNwZWNpZmljIGluZGV4XG4gICAgICAgKiBSZW1vdmVzIHRoZSBpdGVtIGZyb20gdGhlIGNvbGxlY3Rpb24sIHVwZGF0ZXMgdG90YWxJdGVtcywgYW5kIHRyaWdnZXJzIHJlLXJlbmRlclxuICAgICAgICogQHBhcmFtIGluZGV4IC0gVGhlIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJlbW92ZVxuICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgKi9cbiAgICAgIHJlbW92ZUl0ZW0oaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQgYXMgYW55KS5jb2xsZWN0aW9uO1xuXG4gICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHJlbW92ZUl0ZW06IGluZGV4ICR7aW5kZXh9IG91dCBvZiBib3VuZHNgKTtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZW1vdmVkSXRlbSA9IGl0ZW1zW2luZGV4XTtcblxuICAgICAgICAvLyBSZW1vdmUgZnJvbSBjb2xsZWN0aW9uIGl0ZW1zIGFycmF5IChjb21wb25lbnQuY29sbGVjdGlvbi5pdGVtcyBpcyB0aGUgYWN0dWFsIGFycmF5KVxuICAgICAgICBpZiAoKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24/Lml0ZW1zKSB7XG4gICAgICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmNvbGxlY3Rpb24uaXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElNUE9SVEFOVDogRW1pdCBpdGVtOnJlbW92ZS1yZXF1ZXN0IEZJUlNUIHNvIHJlbmRlcmluZyBmZWF0dXJlIHJlYnVpbGRzIGNvbGxlY3Rpb25JdGVtc1xuICAgICAgICAvLyBCRUZPUkUgc2V0VG90YWxJdGVtcyB0cmlnZ2VycyBhIHJlbmRlciB2aWEgdmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiaXRlbTpyZW1vdmUtcmVxdWVzdFwiLCB7XG4gICAgICAgICAgaW5kZXgsXG4gICAgICAgICAgaXRlbTogcmVtb3ZlZEl0ZW0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFVwZGF0ZSB0b3RhbEl0ZW1zIC0gdGhpcyB3aWxsIHRyaWdnZXIgdmlld3BvcnQ6dG90YWwtaXRlbXMtY2hhbmdlZCB3aGljaCBjYWxscyByZW5kZXJJdGVtc1xuICAgICAgICAvLyBCeSBub3csIGNvbGxlY3Rpb25JdGVtcyBoYXMgYmVlbiByZWJ1aWx0IGJ5IHRoZSBpdGVtOnJlbW92ZS1yZXF1ZXN0IGhhbmRsZXJcbiAgICAgICAgaWYgKGNvbGxlY3Rpb24/LmdldFRvdGFsSXRlbXMgJiYgY29sbGVjdGlvbj8uc2V0VG90YWxJdGVtcykge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRUb3RhbCA9IGNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhNYXRoLm1heCgwLCBjdXJyZW50VG90YWwgLSAxKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uPy5zZXRUb3RhbEl0ZW1zKSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gdmlld3BvcnQuY29sbGVjdGlvbiBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBjdXJyZW50VG90YWwgPSBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5nZXRUb3RhbEl0ZW1zKCk7XG4gICAgICAgICAgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uc2V0VG90YWxJdGVtcyhcbiAgICAgICAgICAgIE1hdGgubWF4KDAsIGN1cnJlbnRUb3RhbCAtIDEpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTGFzdCByZXNvcnQ6IHVwZGF0ZSBjb21wb25lbnQudG90YWxJdGVtcyBkaXJlY3RseVxuICAgICAgICAgIGlmIChjb21wb25lbnQudG90YWxJdGVtcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb21wb25lbnQudG90YWxJdGVtcyA9IE1hdGgubWF4KDAsIGNvbXBvbmVudC50b3RhbEl0ZW1zIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlbW92ZSBpdGVtIGJ5IElEXG4gICAgICAgKiBGaW5kcyB0aGUgaXRlbSBpbiB0aGUgY29sbGVjdGlvbiBieSBpdHMgSUQgYW5kIHJlbW92ZXMgaXRcbiAgICAgICAqIFVwZGF0ZXMgdG90YWxJdGVtcyBhbmQgdHJpZ2dlcnMgcmUtcmVuZGVyIG9mIHZpc2libGUgaXRlbXNcbiAgICAgICAqIE9wdGlvbmFsbHkgdHJhY2tzIGFzIHBlbmRpbmcgcmVtb3ZhbCB0byBmaWx0ZXIgZnJvbSBmdXR1cmUgZmV0Y2hlc1xuICAgICAgICogQHBhcmFtIGlkIC0gVGhlIGl0ZW0gSUQgdG8gZmluZCBhbmQgcmVtb3ZlXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIFJlbW92ZSBvcHRpb25zICh0cmFja1BlbmRpbmcsIHBlbmRpbmdUaW1lb3V0KVxuICAgICAgICogQHJldHVybnMgdHJ1ZSBpZiBpdGVtIHdhcyBmb3VuZCBhbmQgcmVtb3ZlZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICAgKi9cbiAgICAgIHJlbW92ZUl0ZW1CeUlkKFxuICAgICAgICBpZDogc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICBvcHRpb25zOiBSZW1vdmVJdGVtT3B0aW9ucyA9IHt9LFxuICAgICAgKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHsgdHJhY2tQZW5kaW5nID0gdHJ1ZSwgcGVuZGluZ1RpbWVvdXQgPSA1MDAwIH0gPSBvcHRpb25zO1xuXG4gICAgICAgIGlmIChpZCA9PT0gdW5kZWZpbmVkIHx8IGlkID09PSBudWxsKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbVkxpc3RdIHJlbW92ZUl0ZW1CeUlkOiBpbnZhbGlkIGlkYCk7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIHRvIHBlbmRpbmcgcmVtb3ZhbHMgdG8gZmlsdGVyIGZyb20gZnV0dXJlIHNlcnZlciByZXNwb25zZXNcbiAgICAgICAgaWYgKHRyYWNrUGVuZGluZykge1xuICAgICAgICAgIHBlbmRpbmdSZW1vdmFscy5hZGQoaWQpO1xuXG4gICAgICAgICAgLy8gQ2xlYXIgZnJvbSBwZW5kaW5nIHJlbW92YWxzIGFmdGVyIHRpbWVvdXQgKHNlcnZlciBzaG91bGQgaGF2ZSB1cGRhdGVkIGJ5IHRoZW4pXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBwZW5kaW5nUmVtb3ZhbHMuZGVsZXRlKGlkKTtcbiAgICAgICAgICB9LCBwZW5kaW5nVGltZW91dCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBpdGVtIGJ5IElEIChoYW5kbGUgc3BhcnNlIGFycmF5cyBmcm9tIHBhZ2luYXRpb24pXG4gICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHMgc2luY2UgaXRlbXMgbWF5IGhhdmUgZGlmZmVyZW50IElEIHN0cnVjdHVyZXNcbiAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghaXRlbSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIC8vIENoZWNrIGFsbCBwb3NzaWJsZSBJRCBmaWVsZHNcbiAgICAgICAgICBjb25zdCBpZHNUb0NoZWNrID0gW2l0ZW0uaWQsIGl0ZW0uX2lkLCBpdGVtLnVzZXJfaWRdLmZpbHRlcihcbiAgICAgICAgICAgICh2KSA9PiB2ICE9PSB1bmRlZmluZWQgJiYgdiAhPT0gbnVsbCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybiBpZHNUb0NoZWNrLnNvbWUoXG4gICAgICAgICAgICAoaXRlbUlkKSA9PiBpdGVtSWQgPT09IGlkIHx8IFN0cmluZyhpdGVtSWQpID09PSBTdHJpbmcoaWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVJdGVtKGluZGV4KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgYW4gaXRlbSBJRCBpcyBwZW5kaW5nIHJlbW92YWxcbiAgICAgICAqIEBwYXJhbSBpZCAtIFRoZSBpdGVtIElEIHRvIGNoZWNrXG4gICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpdGVtIGlzIHBlbmRpbmcgcmVtb3ZhbFxuICAgICAgICovXG4gICAgICBpc1BlbmRpbmdSZW1vdmFsKGlkOiBzdHJpbmcgfCBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHBlbmRpbmdSZW1vdmFscy5oYXMoaWQpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYWxsIHBlbmRpbmcgcmVtb3ZhbCBJRHNcbiAgICAgICAqIEByZXR1cm5zIFNldCBvZiBwZW5kaW5nIHJlbW92YWwgSURzXG4gICAgICAgKi9cbiAgICAgIGdldFBlbmRpbmdSZW1vdmFscygpOiBTZXQ8c3RyaW5nIHwgbnVtYmVyPiB7XG4gICAgICAgIHJldHVybiBuZXcgU2V0KHBlbmRpbmdSZW1vdmFscyk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGEgc3BlY2lmaWMgcGVuZGluZyByZW1vdmFsXG4gICAgICAgKiBAcGFyYW0gaWQgLSBUaGUgaXRlbSBJRCB0byBjbGVhciBmcm9tIHBlbmRpbmcgcmVtb3ZhbHNcbiAgICAgICAqL1xuICAgICAgY2xlYXJQZW5kaW5nUmVtb3ZhbChpZDogc3RyaW5nIHwgbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHBlbmRpbmdSZW1vdmFscy5kZWxldGUoaWQpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhbGwgcGVuZGluZyByZW1vdmFsc1xuICAgICAgICovXG4gICAgICBjbGVhckFsbFBlbmRpbmdSZW1vdmFscygpOiB2b2lkIHtcbiAgICAgICAgcGVuZGluZ1JlbW92YWxzLmNsZWFyKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEZpbHRlciBpdGVtcyBhcnJheSB0byBleGNsdWRlIHBlbmRpbmcgcmVtb3ZhbHNcbiAgICAgICAqIFV0aWxpdHkgbWV0aG9kIGZvciB1c2UgaW4gY29sbGVjdGlvbiBhZGFwdGVyc1xuICAgICAgICogQHBhcmFtIGl0ZW1zIC0gQXJyYXkgb2YgaXRlbXMgdG8gZmlsdGVyXG4gICAgICAgKiBAcmV0dXJucyBGaWx0ZXJlZCBhcnJheSB3aXRob3V0IHBlbmRpbmcgcmVtb3ZhbCBpdGVtc1xuICAgICAgICovXG4gICAgICBmaWx0ZXJQZW5kaW5nUmVtb3ZhbHM8SSBleHRlbmRzIHsgaWQ/OiBhbnk7IF9pZD86IGFueSB9PihcbiAgICAgICAgaXRlbXM6IElbXSxcbiAgICAgICk6IElbXSB7XG4gICAgICAgIGlmIChwZW5kaW5nUmVtb3ZhbHMuc2l6ZSA9PT0gMCkgcmV0dXJuIGl0ZW1zO1xuXG4gICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGl0ZW0uX2lkIHx8IGl0ZW0uaWQ7XG4gICAgICAgICAgcmV0dXJuICFwZW5kaW5nUmVtb3ZhbHMuaGFzKGlkKTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvLyBMb2FkaW5nIG9wZXJhdGlvbnNcbiAgICAgIGFzeW5jIGxvYWRSYW5nZShcbiAgICAgICAgcGFnZTogbnVtYmVyLFxuICAgICAgICBsaW1pdDogbnVtYmVyLFxuICAgICAgICBzdHJhdGVneTogc3RyaW5nID0gXCJwYWdlXCIsXG4gICAgICAgIGFsaWdubWVudD86IHN0cmluZyxcbiAgICAgICkge1xuICAgICAgICBpc0xvYWRpbmcgPSB0cnVlO1xuXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCBvZmZzZXQgPSBzdHJhdGVneSA9PT0gXCJwYWdlXCIgPyAocGFnZSAtIDEpICogbGltaXQgOiBwYWdlO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBjb21wb25lbnQudmlld3BvcnQuY29sbGVjdGlvbi5sb2FkUmFuZ2Uob2Zmc2V0LCBsaW1pdCk7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwibG9hZFwiLCB7IHBhZ2UsIGxpbWl0LCBzdHJhdGVneSB9KTtcblxuICAgICAgICAgICAgLy8gU2Nyb2xsIHRvIHRoZSBsb2FkZWQgcmFuZ2UgaWYgYWxpZ25tZW50IGlzIHNwZWNpZmllZFxuICAgICAgICAgICAgaWYgKGFsaWdubWVudCkge1xuICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IG9mZnNldDtcbiAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiZXJyb3JcIiwgeyBlcnJvciB9KTtcbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8vIERhdGEgbG9hZGluZ1xuICAgICAgbG9hZE5leHQ6IGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFtWTGlzdF0gbG9hZE5leHQoKWApO1xuXG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24uZ2V0VG90YWxJdGVtcygpO1xuICAgICAgICAgIGNvbnN0IGxvYWRlZFJhbmdlcyA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldExvYWRlZFJhbmdlcygpO1xuXG4gICAgICAgICAgLy8gRmluZCB0aGUgbmV4dCB1bmxvYWRlZCByYW5nZVxuICAgICAgICAgIGxldCBuZXh0T2Zmc2V0ID0gMDtcbiAgICAgICAgICBmb3IgKGNvbnN0IHJhbmdlSWQgb2YgbG9hZGVkUmFuZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCByYW5nZUVuZCA9IChyYW5nZUlkICsgMSkgKiAoY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0IHx8IDIwKTtcbiAgICAgICAgICAgIGlmIChyYW5nZUVuZCA+IG5leHRPZmZzZXQpIHtcbiAgICAgICAgICAgICAgbmV4dE9mZnNldCA9IHJhbmdlRW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChuZXh0T2Zmc2V0IDwgdG90YWxJdGVtcykge1xuICAgICAgICAgICAgYXdhaXQgY29tcG9uZW50LnZpZXdwb3J0LmNvbGxlY3Rpb24ubG9hZFJhbmdlKFxuICAgICAgICAgICAgICBuZXh0T2Zmc2V0LFxuICAgICAgICAgICAgICBjb25maWcucGFnaW5hdGlvbj8ubGltaXQgfHwgMjAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIGlzTG9hZGluZygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGlzTG9hZGluZztcbiAgICAgIH0sXG5cbiAgICAgIGhhc05leHQoKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChjb21wb25lbnQudmlld3BvcnQ/LmNvbGxlY3Rpb24pIHtcbiAgICAgICAgICBjb25zdCB0b3RhbCA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldEl0ZW1zKCk7XG4gICAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aCA8IHRvdGFsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIE5vdGU6IFNlbGVjdGlvbiBvcGVyYXRpb25zIGFyZSBoYW5kbGVkIGJ5IHRoZSB3aXRoU2VsZWN0aW9uIGZlYXR1cmVcbiAgICAgIC8vIFRoZXNlIGFyZSBrZXB0IGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGJ1dCBkZWxlZ2F0ZSB0byBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgIGdldFNlbGVjdGVkSWRzKCk6IChzdHJpbmcgfCBudW1iZXIpW10ge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIC8vIFVzZSBzZWxlY3Rpb24gZmVhdHVyZSBpZiBhdmFpbGFibGVcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuZ2V0SXRlbXMoKTtcbiAgICAgICAgICBjb25zdCBpbmRpY2VzID0gY29tcG9uZW50LmdldFNlbGVjdGVkSW5kaWNlcygpO1xuICAgICAgICAgIHJldHVybiBpbmRpY2VzLm1hcCgoaWR4OiBudW1iZXIpID0+IChpdGVtc1tpZHhdIGFzIGFueSk/LmlkIHx8IGlkeCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRmFsbGJhY2sgdG8gbG9jYWwgdHJhY2tpbmdcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oc2VsZWN0ZWRJZHMpO1xuICAgICAgfSxcblxuICAgICAgc2VsZWN0SXRlbShpZDogc3RyaW5nIHwgbnVtYmVyKSB7XG4gICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnNlbGVjdEl0ZW1zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBVc2Ugc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGxvY2FsIHRyYWNraW5nXG4gICAgICAgICAgc2VsZWN0ZWRJZHMuYWRkKGlkKTtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7XG4gICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5nZXRTZWxlY3RlZElkcygpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBkZXNlbGVjdEl0ZW0oaWQ6IHN0cmluZyB8IG51bWJlcikge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5kZXNlbGVjdEl0ZW1zID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAvLyBVc2Ugc2VsZWN0aW9uIGZlYXR1cmUgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBpdGVtcy5maW5kSW5kZXgoKGl0ZW06IGFueSkgPT4gaXRlbS5pZCA9PT0gaWQpO1xuICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuZGVzZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gbG9jYWwgdHJhY2tpbmdcbiAgICAgICAgICBzZWxlY3RlZElkcy5kZWxldGUoaWQpO1xuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJzZWxlY3Rpb246Y2hhbmdlXCIsIHtcbiAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLmdldFNlbGVjdGVkSWRzKCksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIGNsZWFyU2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5jbGVhclNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgLy8gVXNlIHNlbGVjdGlvbiBmZWF0dXJlIGlmIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbXBvbmVudC5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEZhbGxiYWNrIHRvIGxvY2FsIHRyYWNraW5nXG4gICAgICAgICAgc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7IHNlbGVjdGVkOiBbXSB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcblxuICAgICAgLy8gU2Nyb2xsaW5nIG1ldGhvZHNcbiAgICAgIHNjcm9sbFRvSW5kZXg6IChcbiAgICAgICAgaW5kZXg6IG51bWJlcixcbiAgICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICAgICAgYW5pbWF0ZT86IGJvb2xlYW4sXG4gICAgICApID0+IHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2Nyb2xsIHRvIGluZGV4IGFuZCBzZWxlY3QgaXRlbSBhZnRlciBkYXRhIGxvYWRzXG4gICAgICAgKiBVc2VmdWwgZm9yIHJ1bnRpbWUgc2Nyb2xsK3NlbGVjdCB3aGVuIFZMaXN0IGlzIGFscmVhZHkgY3JlYXRlZFxuICAgICAgICovXG4gICAgICBzY3JvbGxUb0luZGV4QW5kU2VsZWN0OiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICAgIGluZGV4OiBudW1iZXIsXG4gICAgICAgIHNlbGVjdElkOiBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgICApIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydCkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTGlzdGVuIGZvciByYW5nZSBsb2FkIHRvIGNvbXBsZXRlLCB0aGVuIHNlbGVjdFxuICAgICAgICBjb25zdCBvblJhbmdlTG9hZGVkID0gKCkgPT4ge1xuICAgICAgICAgIGNvbXBvbmVudC5vZmY/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcbiAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5zZWxlY3RCeUlkKSB7XG4gICAgICAgICAgICAgIGNvbXBvbmVudC5zZWxlY3RCeUlkKHNlbGVjdElkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcblxuICAgICAgICAvLyBGYWxsYmFjayB0aW1lb3V0IGluIGNhc2UgZXZlbnQgZG9lc24ndCBmaXJlIChkYXRhIGFscmVhZHkgbG9hZGVkKVxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb21wb25lbnQub2ZmPy4oXCJ2aWV3cG9ydDpyYW5nZS1sb2FkZWRcIiwgb25SYW5nZUxvYWRlZCk7XG4gICAgICAgICAgaWYgKGNvbXBvbmVudC5zZWxlY3RCeUlkKSB7XG4gICAgICAgICAgICBjb21wb25lbnQuc2VsZWN0QnlJZChzZWxlY3RJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAzMDApO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvSXRlbTogYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgICBpdGVtSWQ6IHN0cmluZyxcbiAgICAgICAgYWxpZ25tZW50OiBcInN0YXJ0XCIgfCBcImNlbnRlclwiIHwgXCJlbmRcIiA9IFwic3RhcnRcIixcbiAgICAgICAgYW5pbWF0ZT86IGJvb2xlYW4sXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gaXRlbXMuZmluZEluZGV4KFxuICAgICAgICAgIChpdGVtOiBhbnkpID0+IFN0cmluZyhpdGVtLmlkKSA9PT0gU3RyaW5nKGl0ZW1JZCksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxUb0luZGV4KGluZGV4LCBhbGlnbm1lbnQsIGFuaW1hdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS53YXJuKGBJdGVtICR7aXRlbUlkfSBub3QgZm91bmRgKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9Ub3A6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsVG9JbmRleCgwLCBcInN0YXJ0XCIpO1xuICAgICAgfSxcblxuICAgICAgc2Nyb2xsVG9Cb3R0b206IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IHRoaXMuZ2V0SXRlbUNvdW50KCk7XG4gICAgICAgIGlmICh0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgodG90YWxJdGVtcyAtIDEsIFwiZW5kXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgIH0sXG5cbiAgICAgIHNjcm9sbFRvUGFnZTogYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgICBwYWdlTnVtOiBudW1iZXIsXG4gICAgICAgIGFsaWdubWVudDogXCJzdGFydFwiIHwgXCJjZW50ZXJcIiB8IFwiZW5kXCIgPSBcInN0YXJ0XCIsXG4gICAgICAgIGFuaW1hdGU/OiBib29sZWFuLFxuICAgICAgKSB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBbVkxpc3RdIHNjcm9sbFRvUGFnZSgke3BhZ2VOdW19KWApO1xuXG4gICAgICAgIC8vIEdldCBsaW1pdCBmcm9tIGNvbmZpZyAocmFuZ2VTaXplKSBvciBkZWZhdWx0XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gY29uZmlnLnBhZ2luYXRpb24/LmxpbWl0IHx8IDIwO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlJ3JlIGluIGN1cnNvciBtb2RlXG4gICAgICAgIGlmIChjb25maWcucGFnaW5hdGlvbj8uc3RyYXRlZ3kgPT09IFwiY3Vyc29yXCIpIHtcbiAgICAgICAgICAvLyBJbiBjdXJzb3IgbW9kZSwgd2UgbmVlZCB0byBoYW5kbGUgc2VxdWVudGlhbCBsb2FkaW5nXG4gICAgICAgICAgY29uc3QgY29sbGVjdGlvbiA9IChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uY29sbGVjdGlvbjtcbiAgICAgICAgICBpZiAoY29sbGVjdGlvbikge1xuICAgICAgICAgICAgY29uc3QgbG9hZGVkUmFuZ2VzID0gY29sbGVjdGlvbi5nZXRMb2FkZWRSYW5nZXMoKTtcbiAgICAgICAgICAgIGNvbnN0IGhpZ2hlc3RMb2FkZWRQYWdlID0gbG9hZGVkUmFuZ2VzLnNpemU7XG5cbiAgICAgICAgICAgIGlmIChwYWdlTnVtID4gaGlnaGVzdExvYWRlZFBhZ2UgKyAxKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICBgW1ZMaXN0XSBDYW5ub3QganVtcCB0byBwYWdlICR7cGFnZU51bX0gaW4gY3Vyc29yIG1vZGUuIGAgK1xuICAgICAgICAgICAgICAgICAgYExvYWRpbmcgcGFnZXMgc2VxdWVudGlhbGx5IGZyb20gJHtcbiAgICAgICAgICAgICAgICAgICAgaGlnaGVzdExvYWRlZFBhZ2UgKyAxXG4gICAgICAgICAgICAgICAgICB9IHRvICR7cGFnZU51bX1gLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSB2aWV3cG9ydCdzIHNjcm9sbFRvUGFnZSBpZiBhdmFpbGFibGVcbiAgICAgICAgaWYgKChjb21wb25lbnQudmlld3BvcnQgYXMgYW55KT8uc2Nyb2xsVG9QYWdlKSB7XG4gICAgICAgICAgKGNvbXBvbmVudC52aWV3cG9ydCBhcyBhbnkpLnNjcm9sbFRvUGFnZShwYWdlTnVtLCBsaW1pdCwgYWxpZ25tZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGYWxsYmFjayB0byBzY3JvbGxUb0luZGV4XG4gICAgICAgICAgY29uc3QgdGFyZ2V0SW5kZXggPSAocGFnZU51bSAtIDEpICogbGltaXQ7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zY3JvbGxUb0luZGV4KHRhcmdldEluZGV4LCBhbGlnbm1lbnQpO1xuICAgICAgICB9XG4gICAgICB9LFxuXG4gICAgICBnZXRTY3JvbGxQb3NpdGlvbjogKCkgPT4ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnZpZXdwb3J0Py5nZXRTY3JvbGxQb3NpdGlvbigpIHx8IDA7XG4gICAgICB9LFxuXG4gICAgICBnZXRDdXJyZW50Q3Vyc29yOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbGxlY3Rpb24gPSAoY29tcG9uZW50LnZpZXdwb3J0IGFzIGFueSk/LmNvbGxlY3Rpb247XG4gICAgICAgIHJldHVybiBjb2xsZWN0aW9uPy5nZXRDdXJyZW50Q3Vyc29yPy4oKSB8fCBudWxsO1xuICAgICAgfSxcblxuICAgICAgc2V0U2Nyb2xsQW5pbWF0aW9uKGVuYWJsZWQ6IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gU3RvcmUgYW5pbWF0aW9uIHByZWZlcmVuY2UgKHdvdWxkIGJlIHVzZWQgYnkgdmlld3BvcnQgc2Nyb2xsaW5nIGZlYXR1cmUpXG4gICAgICAgIGNvbXBvbmVudC5zY3JvbGxBbmltYXRpb24gPSBlbmFibGVkO1xuICAgICAgfSxcblxuICAgICAgLy8gU3RhdGVcbiAgICAgIGdldFN0YXRlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGl0ZW1zOiB0aGlzLmdldEl0ZW1zKCksXG4gICAgICAgICAgdG90YWxJdGVtczogY29tcG9uZW50LnZpZXdwb3J0Py5jb2xsZWN0aW9uXG4gICAgICAgICAgICA/IGNvbXBvbmVudC52aWV3cG9ydC5jb2xsZWN0aW9uLmdldFRvdGFsSXRlbXMoKVxuICAgICAgICAgICAgOiBjb21wb25lbnQudG90YWxJdGVtcyB8fCAwLFxuICAgICAgICAgIHZpc2libGVSYW5nZTogY29tcG9uZW50LnZpZXdwb3J0Py5nZXRWaXNpYmxlUmFuZ2UoKSB8fCB7XG4gICAgICAgICAgICBzdGFydDogMCxcbiAgICAgICAgICAgIGVuZDogMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHNjcm9sbFBvc2l0aW9uOiBjb21wb25lbnQudmlld3BvcnQ/LmdldFNjcm9sbFBvc2l0aW9uKCkgfHwgMCxcbiAgICAgICAgICBzZWxlY3RlZElkczogdGhpcy5nZXRTZWxlY3RlZElkcygpLFxuICAgICAgICAgIGlzTG9hZGluZzogdGhpcy5pc0xvYWRpbmcoKSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG5cbiAgICAgIC8vIExpZmVjeWNsZVxuICAgICAgZGVzdHJveSgpIHtcbiAgICAgICAgaWYgKGNvbXBvbmVudC52aWV3cG9ydD8uZGVzdHJveSkge1xuICAgICAgICAgIGNvbXBvbmVudC52aWV3cG9ydC5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImRlc3Ryb3llZFwiKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn07XG4iLAogICAgIi8qKlxuICogbXRybC1hZGRvbnMgTGlzdCBDb21wb25lbnQgQ29uc3RhbnRzXG4gKlxuICogQ29uc3RhbnRzIGZvciB0aGUgYWRkb25zIGxpc3QgY29tcG9uZW50LlxuICogTm90ZTogQmFzZSBtdHJsIGxpc3QgZnVuY3Rpb25hbGl0eSBpcyBoYW5kbGVkIGJ5IG10cmwgY29yZS5cbiAqIFRoZXNlIGNvbnN0YW50cyBhcmUgZm9yIGFkZG9ucy1zcGVjaWZpYyBmZWF0dXJlcyBvbmx5LlxuICovXG5cbi8qKlxuICogQ1NTIGNsYXNzIG5hbWVzIGZvciBWTGlzdCBjb21wb25lbnRcbiAqIEZvbGxvd2luZyBCRU0gY29udmVudGlvbjogY29tcG9uZW50X19lbGVtZW50LS1tb2RpZmllclxuICogTm90ZTogbXRybCBwcmVmaXggaXMgYWRkZWQgYXV0b21hdGljYWxseSBieSBjb3JlIERPTSBjbGFzc2VzIHN5c3RlbVxuICovXG5leHBvcnQgY29uc3QgVkxJU1RfQ0xBU1NFUyA9IHtcbiAgLyoqIExpc3QgZWxlbWVudCAqL1xuICBMSVNUOiBcInZsaXN0XCIsXG4gIC8qKiBMaXN0IGl0ZW0gKi9cbiAgSVRFTTogXCJ2aWV3cG9ydC1pdGVtXCIsXG4gIC8qKiBTZWxlY3RlZCBsaXN0IGl0ZW0gKi9cbiAgU0VMRUNURUQ6IFwidmlld3BvcnQtaXRlbS0tc2VsZWN0ZWRcIixcbiAgLyoqIEVtcHR5IHN0YXRlICovXG4gIEVNUFRZOiBcInZsaXN0LS1lbXB0eVwiLFxuICAvKiogU2Nyb2xsZWQgc3RhdGUgLSBsaXN0IGlzIG5vdCBhdCB0aGUgdG9wICovXG4gIFNDUk9MTEVEOiBcInZsaXN0LS1zY3JvbGxlZFwiLFxufSBhcyBjb25zdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvdmxpc3QvZmVhdHVyZXMvc2VsZWN0aW9uLnRzXG5cbmltcG9ydCB0eXBlIHsgVkxpc3RDb25maWcsIFZMaXN0Q29tcG9uZW50LCBWTGlzdEl0ZW0gfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFZMSVNUX0NMQVNTRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBQUkVGSVgsIGFkZENsYXNzLCByZW1vdmVDbGFzcyB9IGZyb20gXCJtdHJsXCI7XG5cbi8qKlxuICogU2VsZWN0aW9uIHN0YXRlIGludGVyZmFjZVxuICovXG5pbnRlcmZhY2UgU2VsZWN0aW9uU3RhdGUge1xuICBzZWxlY3RlZElkczogU2V0PHN0cmluZyB8IG51bWJlcj47XG4gIG1vZGU6IFwibm9uZVwiIHwgXCJzaW5nbGVcIiB8IFwibXVsdGlwbGVcIjtcbiAgbGFzdFNlbGVjdGVkSW5kZXg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogR2V0IGl0ZW0gSUQgZnJvbSBlbGVtZW50IG9yIGl0ZW0gZGF0YVxuICovXG5jb25zdCBnZXRJdGVtSWQgPSAoaXRlbTogYW55KTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKGl0ZW0/LmlkICE9PSB1bmRlZmluZWQpIHJldHVybiBpdGVtLmlkO1xuICBpZiAoaXRlbT8uX2lkICE9PSB1bmRlZmluZWQpIHJldHVybiBpdGVtLl9pZDtcbiAgaWYgKHR5cGVvZiBpdGVtID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBpdGVtID09PSBcIm51bWJlclwiKSByZXR1cm4gaXRlbTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07XG5cbi8qKlxuICogQWRkcyBzZWxlY3Rpb24gbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMgdG8gVkxpc3QgY29tcG9uZW50XG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoU2VsZWN0aW9uID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+LFxuKSA9PiB7XG4gIHJldHVybiAoY29tcG9uZW50OiBWTGlzdENvbXBvbmVudDxUPik6IFZMaXN0Q29tcG9uZW50PFQ+ID0+IHtcbiAgICBpZiAoIWNvbmZpZy5zZWxlY3Rpb24/LmVuYWJsZWQgfHwgY29uZmlnLnNlbGVjdGlvbj8ubW9kZSA9PT0gXCJub25lXCIpIHtcbiAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhdGU6IFNlbGVjdGlvblN0YXRlID0ge1xuICAgICAgc2VsZWN0ZWRJZHM6IG5ldyBTZXQoKSxcbiAgICAgIG1vZGU6IGNvbmZpZy5zZWxlY3Rpb24/Lm1vZGUgfHwgXCJzaW5nbGVcIixcbiAgICAgIGxhc3RTZWxlY3RlZEluZGV4OiB1bmRlZmluZWQsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlcXVpcmVNb2RpZmllcnMgPSBjb25maWcuc2VsZWN0aW9uPy5yZXF1aXJlTW9kaWZpZXJzID8/IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogQXBwbHkgc2VsZWN0aW9uIGNsYXNzIHRvIHJlbmRlcmVkIGVsZW1lbnRzIG1hdGNoaW5nIHNlbGVjdGVkIElEc1xuICAgICAqL1xuICAgIGNvbnN0IGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cyA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbXBvbmVudC5lbGVtZW50Py5xdWVyeVNlbGVjdG9yKFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtc2AsXG4gICAgICApO1xuICAgICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcblxuICAgICAgY29uc3QgaXRlbXMgPSBjb250YWluZXIucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnQtaXRlbVtkYXRhLWlkXWAsXG4gICAgICApO1xuXG4gICAgICBpdGVtcy5mb3JFYWNoKChlbCkgPT4ge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZWwgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGlkID0gZWxlbWVudC5kYXRhc2V0LmlkO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8vIENoZWNrIGJvdGggc3RyaW5nIGFuZCBudW1iZXIgdmVyc2lvbnMgb2YgdGhlIElEXG4gICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpIHx8IHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhOdW1iZXIoaWQpKTtcbiAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgVkxJU1RfQ0xBU1NFUy5TRUxFQ1RFRCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIFZMSVNUX0NMQVNTRVMuU0VMRUNURUQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBpdGVtIGNsaWNrIGZvciBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVJdGVtQ2xpY2sgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgY29uc3Qgdmlld3BvcnRJdGVtID0gKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5jbG9zZXN0KFxuICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtW2RhdGEtaW5kZXhdYCxcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBpZiAoIXZpZXdwb3J0SXRlbSkgcmV0dXJuO1xuXG4gICAgICBjb25zdCBpbmRleCA9IHBhcnNlSW50KHZpZXdwb3J0SXRlbS5kYXRhc2V0LmluZGV4IHx8IFwiLTFcIik7XG4gICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgIGNvbnN0IGl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbXM/LigpO1xuICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zPy5baW5kZXhdO1xuICAgICAgaWYgKCFpdGVtKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgIGlmIChpdGVtSWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuO1xuXG4gICAgICBjb25zdCB3YXNTZWxlY3RlZCA9IHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpdGVtSWQpO1xuXG4gICAgICBpZiAoc3RhdGUubW9kZSA9PT0gXCJzaW5nbGVcIikge1xuICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICBpZiAoIXdhc1NlbGVjdGVkKSB7XG4gICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZS5tb2RlID09PSBcIm11bHRpcGxlXCIpIHtcbiAgICAgICAgaWYgKGUuc2hpZnRLZXkgJiYgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gTWF0aC5taW4oc3RhdGUubGFzdFNlbGVjdGVkSW5kZXgsIGluZGV4KTtcbiAgICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1heChzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCwgaW5kZXgpO1xuXG4gICAgICAgICAgaWYgKCFlLmN0cmxLZXkgJiYgIWUubWV0YUtleSkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuY2xlYXIoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPD0gZW5kOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlSXRlbSA9IGl0ZW1zPy5baV07XG4gICAgICAgICAgICBjb25zdCByYW5nZUl0ZW1JZCA9IGdldEl0ZW1JZChyYW5nZUl0ZW0pO1xuICAgICAgICAgICAgaWYgKHJhbmdlSXRlbUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKHJhbmdlSXRlbUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZS5jdHJsS2V5IHx8IGUubWV0YUtleSkge1xuICAgICAgICAgIGlmICh3YXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpdGVtSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChyZXF1aXJlTW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh3YXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5kZWxldGUoaXRlbUlkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmFkZChpdGVtSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGFwcGx5U2VsZWN0aW9uVG9FbGVtZW50cygpO1xuICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBFbWl0IHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnRcbiAgICAgKi9cbiAgICBjb25zdCBlbWl0U2VsZWN0aW9uQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgaXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtcz8uKCkgfHwgW107XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbXMgPSBpdGVtcy5maWx0ZXIoKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBjb25zdCBpZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgICAgcmV0dXJuIGlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKTtcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBpdGVtcy5yZWR1Y2UoXG4gICAgICAgIChhY2M6IG51bWJlcltdLCBpdGVtOiBhbnksIGlkeDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgY29uc3QgaWQgPSBnZXRJdGVtSWQoaXRlbSk7XG4gICAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQgJiYgc3RhdGUuc2VsZWN0ZWRJZHMuaGFzKGlkKSkge1xuICAgICAgICAgICAgYWNjLnB1c2goaWR4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAgW10gYXMgbnVtYmVyW10sXG4gICAgICApO1xuXG4gICAgICBjb21wb25lbnQuZW1pdD8uKFwic2VsZWN0aW9uOmNoYW5nZVwiLCB7IHNlbGVjdGVkSXRlbXMsIHNlbGVjdGVkSW5kaWNlcyB9KTtcblxuICAgICAgaWYgKGNvbmZpZy5zZWxlY3Rpb24/Lm9uU2VsZWN0aW9uQ2hhbmdlKSB7XG4gICAgICAgIGNvbmZpZy5zZWxlY3Rpb24ub25TZWxlY3Rpb25DaGFuZ2Uoc2VsZWN0ZWRJdGVtcywgc2VsZWN0ZWRJbmRpY2VzKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gU2V0dXA6IGxpc3RlbiBmb3IgcmVuZGVycyBhbmQgY2xpY2tzXG4gICAgY29uc3Qgc2V0dXAgPSAoKSA9PiB7XG4gICAgICAvLyBBZGQgbW9kZSBjbGFzcyB0byBjb250YWluZXJcbiAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICBhZGRDbGFzcyhjb21wb25lbnQuZWxlbWVudCwgXCJ2bGlzdC0tc2VsZWN0aW9uXCIpO1xuICAgICAgICBhZGRDbGFzcyhjb21wb25lbnQuZWxlbWVudCwgYHZsaXN0LS1zZWxlY3Rpb24tJHtzdGF0ZS5tb2RlfWApO1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlSXRlbUNsaWNrLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXBwbHkgc2VsZWN0aW9uIGFmdGVyIGVhY2ggcmVuZGVyXG4gICAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcbiAgICAgICAgXCJ2aWV3cG9ydDppdGVtcy1yZW5kZXJlZFwiLFxuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMsXG4gICAgICApO1xuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLm9uPy4oXCJ2aWV3cG9ydDpyZW5kZXJlZFwiLCBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMpO1xuXG4gICAgICAvLyBDbGVhbiB1cCBzZWxlY3Rpb24gd2hlbiBpdGVtIGlzIHJlbW92ZWRcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgICBcIml0ZW06cmVtb3ZlZFwiLFxuICAgICAgICAoZGF0YTogeyBpdGVtOiBhbnk7IGluZGV4OiBudW1iZXIgfSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChkYXRhLml0ZW0pO1xuICAgICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaXRlbUlkKSkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgICAvLyBJZiB0aGUgcmVtb3ZlZCBpdGVtIHdhcyB0aGUgbGFzdCBzZWxlY3RlZCBpbmRleCwgY2xlYXIgaXRcbiAgICAgICAgICAgIGlmIChzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9PT0gZGF0YS5pbmRleCkge1xuICAgICAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPiBkYXRhLmluZGV4XG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgLy8gQWRqdXN0IGxhc3RTZWxlY3RlZEluZGV4IHNpbmNlIGl0ZW1zIHNoaWZ0ZWQgZG93blxuICAgICAgICAgICAgICBzdGF0ZS5sYXN0U2VsZWN0ZWRJbmRleC0tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWxpemUgYWZ0ZXIgY29tcG9uZW50IGlzIHJlYWR5XG4gICAgc2V0VGltZW91dChzZXR1cCwgMCk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGluaXRpYWwgbG9hZCBjb21wbGV0ZSB0byBhdXRvLXNlbGVjdCBpdGVtXG4gICAgLy8gVGhpcyBtdXN0IGJlIGluIHdpdGhTZWxlY3Rpb24gYmVjYXVzZSBzZWxlY3RCeUlkIGlzIGRlZmluZWQgaGVyZVxuICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgXCJjb2xsZWN0aW9uOmluaXRpYWwtbG9hZC1jb21wbGV0ZVwiLFxuICAgICAgKGRhdGE6IHsgc2VsZWN0SWQ6IHN0cmluZyB8IG51bWJlciB9KSA9PiB7XG4gICAgICAgIGlmIChkYXRhPy5zZWxlY3RJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy8gVXNlIHJlcXVlc3RBbmltYXRpb25GcmFtZSB0byBlbnN1cmUgcmVuZGVyaW5nIGlzIGNvbXBsZXRlXG4gICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoZGF0YS5zZWxlY3RJZCk7XG4gICAgICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgICAgIGVtaXRTZWxlY3Rpb25DaGFuZ2UoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy8gQ2xlYW51cCBvbiBkZXN0cm95XG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBjb21wb25lbnQuZWxlbWVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUl0ZW1DbGljaywgdHJ1ZSk7XG4gICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgIH07XG5cbiAgICAvLyBFbmhhbmNlZCBjb21wb25lbnQgd2l0aCBzZWxlY3Rpb24gQVBJXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgc2VsZWN0SXRlbXMoaW5kaWNlczogbnVtYmVyW10pIHtcbiAgICAgICAgY29uc3QgaXRlbXMgPSAodGhpcyBhcyBhbnkpLmdldEl0ZW1zPy4oKTtcbiAgICAgICAgaWYgKCFpdGVtcykgcmV0dXJuO1xuXG4gICAgICAgIGlmIChzdGF0ZS5tb2RlID09PSBcInNpbmdsZVwiKSB7XG4gICAgICAgICAgLy8gSW4gc2luZ2xlIG1vZGUsIGNsZWFyIHByZXZpb3VzIHNlbGVjdGlvbiBiZWZvcmUgYWRkaW5nIG5ldyBvbmVcbiAgICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5jbGVhcigpO1xuICAgICAgICAgIGlmIChpbmRpY2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIGluZGljZXMgPSBbaW5kaWNlc1swXV07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaW5kaWNlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtc1tpbmRleF0pO1xuICAgICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuYWRkKGl0ZW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaW5kaWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgc3RhdGUubGFzdFNlbGVjdGVkSW5kZXggPSBpbmRpY2VzW2luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIH1cblxuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgfSxcblxuICAgICAgZGVzZWxlY3RJdGVtcyhpbmRpY2VzOiBudW1iZXJbXSkge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpO1xuICAgICAgICBpZiAoIWl0ZW1zKSByZXR1cm47XG5cbiAgICAgICAgaW5kaWNlcy5mb3JFYWNoKChpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtc1tpbmRleF0pO1xuICAgICAgICAgIGlmIChpdGVtSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc3RhdGUuc2VsZWN0ZWRJZHMuZGVsZXRlKGl0ZW1JZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgfSxcblxuICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7XG4gICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgIHN0YXRlLmxhc3RTZWxlY3RlZEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgZW1pdFNlbGVjdGlvbkNoYW5nZSgpO1xuICAgICAgfSxcblxuICAgICAgZ2V0U2VsZWN0ZWRJdGVtcygpOiBUW10ge1xuICAgICAgICBjb25zdCBpdGVtcyA9ICh0aGlzIGFzIGFueSkuZ2V0SXRlbXM/LigpIHx8IFtdO1xuICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBpZCA9IGdldEl0ZW1JZChpdGVtKTtcbiAgICAgICAgICByZXR1cm4gaWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaWQpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG5cbiAgICAgIGdldFNlbGVjdGVkSW5kaWNlcygpOiBudW1iZXJbXSB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCkgfHwgW107XG4gICAgICAgIHJldHVybiBpdGVtcy5yZWR1Y2UoKGFjYzogbnVtYmVyW10sIGl0ZW06IGFueSwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgIGNvbnN0IGlkID0gZ2V0SXRlbUlkKGl0ZW0pO1xuICAgICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkICYmIHN0YXRlLnNlbGVjdGVkSWRzLmhhcyhpZCkpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKGluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSwgW10gYXMgbnVtYmVyW10pO1xuICAgICAgfSxcblxuICAgICAgaXNTZWxlY3RlZChpbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gKHRoaXMgYXMgYW55KS5nZXRJdGVtcz8uKCk7XG4gICAgICAgIGNvbnN0IGl0ZW1JZCA9IGdldEl0ZW1JZChpdGVtcz8uW2luZGV4XSk7XG4gICAgICAgIHJldHVybiBpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5zZWxlY3RlZElkcy5oYXMoaXRlbUlkKTtcbiAgICAgIH0sXG5cbiAgICAgIHNlbGVjdEJ5SWQoaWQ6IHN0cmluZyB8IG51bWJlciwgc2lsZW50OiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gXCJzaW5nbGVcIikge1xuICAgICAgICAgIHN0YXRlLnNlbGVjdGVkSWRzLmNsZWFyKCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGF0ZS5zZWxlY3RlZElkcy5hZGQoaWQpO1xuICAgICAgICBhcHBseVNlbGVjdGlvblRvRWxlbWVudHMoKTtcbiAgICAgICAgaWYgKCFzaWxlbnQpIHtcbiAgICAgICAgICBlbWl0U2VsZWN0aW9uQ2hhbmdlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENoZWNrIGlmIGFuIGl0ZW0gYXQgaW5kZXggaXMgZnVsbHkgdmlzaWJsZSBpbiB0aGUgdmlld3BvcnRcbiAgICAgICAqIFVzZXMgRE9NIGVsZW1lbnQgcG9zaXRpb24gZm9yIHByZWNpc2UgY2hlY2tpbmdcbiAgICAgICAqL1xuICAgICAgaXNJdGVtRnVsbHlWaXNpYmxlKGluZGV4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnQtaXRlbXNgLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gY29tcG9uZW50LmVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgYC4ke1BSRUZJWH0tdmlld3BvcnRgLFxuICAgICAgICApO1xuICAgICAgICBpZiAoIXZpZXdwb3J0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgaXRlbUVsZW1lbnQgPSBjb250YWluZXIucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICBgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtW2RhdGEtaW5kZXg9XCIke2luZGV4fVwiXWAsXG4gICAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghaXRlbUVsZW1lbnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCB2aWV3cG9ydFJlY3QgPSB2aWV3cG9ydC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgY29uc3QgaXRlbVJlY3QgPSBpdGVtRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBpdGVtIGlzIGZ1bGx5IHdpdGhpbiB2aWV3cG9ydCBib3VuZHNcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBpdGVtUmVjdC50b3AgPj0gdmlld3BvcnRSZWN0LnRvcCAmJlxuICAgICAgICAgIGl0ZW1SZWN0LmJvdHRvbSA8PSB2aWV3cG9ydFJlY3QuYm90dG9tXG4gICAgICAgICk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBpdGVtIGF0IGluZGV4LCBzY3JvbGxpbmcgYW5kIHdhaXRpbmcgZm9yIGRhdGEgaWYgbmVlZGVkXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKiBVc2VzIHByZWNpc2UgRE9NLWJhc2VkIHZpc2liaWxpdHkgY2hlY2tcbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0QXRJbmRleChpbmRleDogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgY3VycmVudCBzZWxlY3Rpb24gdG8gZGV0ZXJtaW5lIG5hdmlnYXRpb24gZGlyZWN0aW9uXG4gICAgICAgIGNvbnN0IGN1cnJlbnRJbmRpY2VzID0gdGhpcy5nZXRTZWxlY3RlZEluZGljZXMoKTtcbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gY3VycmVudEluZGljZXMubGVuZ3RoID4gMCA/IGN1cnJlbnRJbmRpY2VzWzBdIDogLTE7XG4gICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IGluZGV4ID4gY3VycmVudEluZGV4ID8gXCJkb3duXCIgOiBcInVwXCI7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgaXRlbSBpcyBmdWxseSB2aXNpYmxlIHVzaW5nIHByZWNpc2UgRE9NIGNoZWNrXG4gICAgICAgIGNvbnN0IGlzRnVsbHlWaXNpYmxlID0gdGhpcy5pc0l0ZW1GdWxseVZpc2libGUoaW5kZXgpO1xuXG4gICAgICAgIGlmICghaXNGdWxseVZpc2libGUgJiYgZW5oYW5jZWRDb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgpIHtcbiAgICAgICAgICAvLyBTY3JvbGwgd2l0aCBhbGlnbm1lbnQgYmFzZWQgb24gbmF2aWdhdGlvbiBkaXJlY3Rpb25cbiAgICAgICAgICAvLyBEb3duIG5hdmlnYXRpb246IGFsaWduIHRvIGVuZCAoaXRlbSBhdCBib3R0b20pXG4gICAgICAgICAgLy8gVXAgbmF2aWdhdGlvbjogYWxpZ24gdG8gc3RhcnQgKGl0ZW0gYXQgdG9wKVxuICAgICAgICAgIGNvbnN0IGFsaWdubWVudCA9IGRpcmVjdGlvbiA9PT0gXCJkb3duXCIgPyBcImVuZFwiIDogXCJzdGFydFwiO1xuICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LnZpZXdwb3J0LnNjcm9sbFRvSW5kZXgoaW5kZXgsIGFsaWdubWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUcnkgdG8gc2VsZWN0IGltbWVkaWF0ZWx5IC0gd29ya3MgaWYgaXRlbSBpcyBhbHJlYWR5IGxvYWRlZFxuICAgICAgICBjb25zdCBpdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1zPy4oKSB8fCBbXTtcbiAgICAgICAgaWYgKGl0ZW1zW2luZGV4XSkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJdGVtIG5vdCBsb2FkZWQgeWV0IC0gd2FpdCBmb3IgZGF0YSB0byBsb2FkIHRoZW4gc2VsZWN0XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgIGxldCByZXNvbHZlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgY29uc3Qgb25SYW5nZUxvYWRlZCA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29tcG9uZW50Lm9mZj8uKFwidmlld3BvcnQ6cmFuZ2UtbG9hZGVkXCIsIG9uUmFuZ2VMb2FkZWQpO1xuICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtcyhbaW5kZXhdKTtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb21wb25lbnQub24/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcblxuICAgICAgICAgIC8vIEZhbGxiYWNrIHRpbWVvdXQgaW4gY2FzZSBldmVudCBkb2Vzbid0IGZpcmUgKGRhdGEgYWxyZWFkeSBsb2FkZWQpXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzb2x2ZWQpIHJldHVybjtcbiAgICAgICAgICAgIHJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbXBvbmVudC5vZmY/LihcInZpZXdwb3J0OnJhbmdlLWxvYWRlZFwiLCBvblJhbmdlTG9hZGVkKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbXMoW2luZGV4XSk7XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZWxlY3QgbmV4dCBpdGVtIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKiBSZXNwZWN0cyBrZXlib2FyZC53cmFwIG9wdGlvbiBmb3Igd3JhcHBpbmcgYXQgbGlzdCBib3VuZGFyaWVzXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHNlbGVjdE5leHQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzID0gdGhpcy5nZXRTZWxlY3RlZEluZGljZXMoKTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcbiAgICAgICAgY29uc3Qgd3JhcCA9IGNvbmZpZy5rZXlib2FyZD8ud3JhcCA/PyB0cnVlOyAvLyBNRDMgZGVmYXVsdCBpcyB0cnVlXG5cbiAgICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAvLyBTZWxlY3QgZmlyc3QgaXRlbVxuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgoMCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBzZWxlY3RlZEluZGljZXNbMF07XG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9IGN1cnJlbnRJbmRleCArIDE7XG5cbiAgICAgICAgaWYgKG5leHRJbmRleCA8IHRvdGFsSXRlbXMpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KG5leHRJbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdCB0aGUgZW5kIC0gd3JhcCB0byBiZWdpbm5pbmcgaWYgZW5hYmxlZFxuICAgICAgICBpZiAod3JhcCAmJiB0b3RhbEl0ZW1zID4gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgoMCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBwcmV2aW91cyBpdGVtIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2VsZWN0aW9uXG4gICAgICAgKiBIYW5kbGVzIHZpcnR1YWwgc2Nyb2xsaW5nIGJ5IGxvYWRpbmcgZGF0YSBiZWZvcmUgc2VsZWN0aW5nXG4gICAgICAgKiBSZXNwZWN0cyBrZXlib2FyZC53cmFwIG9wdGlvbiBmb3Igd3JhcHBpbmcgYXQgbGlzdCBib3VuZGFyaWVzXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHNlbGVjdFByZXZpb3VzKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSW5kaWNlcyA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRpY2VzKCk7XG4gICAgICAgIGNvbnN0IHRvdGFsSXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtQ291bnQ/LigpIHx8IDA7XG4gICAgICAgIGNvbnN0IHdyYXAgPSBjb25maWcua2V5Ym9hcmQ/LndyYXAgPz8gdHJ1ZTsgLy8gTUQzIGRlZmF1bHQgaXMgdHJ1ZVxuXG4gICAgICAgIGlmIChzZWxlY3RlZEluZGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgLy8gSWYgd3JhcCBlbmFibGVkLCBzZWxlY3QgbGFzdCBpdGVtOyBvdGhlcndpc2UgZG8gbm90aGluZ1xuICAgICAgICAgIGlmICh3cmFwICYmIHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KHRvdGFsSXRlbXMgLSAxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzWzBdO1xuICAgICAgICBjb25zdCBwcmV2SW5kZXggPSBjdXJyZW50SW5kZXggLSAxO1xuXG4gICAgICAgIGlmIChwcmV2SW5kZXggPj0gMCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdEF0SW5kZXgocHJldkluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEF0IHRoZSBzdGFydCAtIHdyYXAgdG8gZW5kIGlmIGVuYWJsZWRcbiAgICAgICAgaWYgKHdyYXAgJiYgdG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBdEluZGV4KHRvdGFsSXRlbXMgLSAxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhTZWxlY3Rpb247XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL3ZsaXN0L2ZlYXR1cmVzL2tleWJvYXJkLnRzXG5cbi8qKlxuICogS2V5Ym9hcmQgTmF2aWdhdGlvbiBGZWF0dXJlIGZvciBWTGlzdFxuICpcbiAqIEltcGxlbWVudHMgTWF0ZXJpYWwgRGVzaWduIDMgYWNjZXNzaWJpbGl0eSBndWlkZWxpbmVzIGZvciBsaXN0czpcbiAqIC0gQXJyb3cga2V5cyAoVXAvRG93bi9MZWZ0L1JpZ2h0KSBuYXZpZ2F0ZSBiZXR3ZWVuIGl0ZW1zIHdpdGggd3JhcHBpbmdcbiAqIC0gU3BhY2UvRW50ZXIgYWN0aXZhdGVzL3NlbGVjdHMgdGhlIGZvY3VzZWQgaXRlbVxuICogLSBUYWIgbW92ZXMgZm9jdXMgdG8vZnJvbSB0aGUgbGlzdFxuICogLSBIb21lL0VuZCBqdW1wIHRvIGZpcnN0L2xhc3QgaXRlbVxuICogLSBQYWdlIFVwL0Rvd24gc2tpcCBtdWx0aXBsZSBpdGVtc1xuICpcbiAqIEBzZWUgaHR0cHM6Ly9tMy5tYXRlcmlhbC5pby9jb21wb25lbnRzL2xpc3RzL2FjY2Vzc2liaWxpdHlcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIFZMaXN0Q29uZmlnLFxuICBWTGlzdENvbXBvbmVudCxcbiAgVkxpc3RJdGVtLFxuICBMaXN0S2V5Ym9hcmRDb25maWcsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgUFJFRklYLCBhZGRDbGFzcywgcmVtb3ZlQ2xhc3MgfSBmcm9tIFwibXRybFwiO1xuXG4vKipcbiAqIENsYXNzIG5hbWUgZm9yIGtleWJvYXJkIGZvY3VzIHN0eWxpbmdcbiAqL1xuY29uc3QgS0VZQk9BUkRfRk9DVVNfQ0xBU1MgPSBcIm10cmwtdmxpc3QtLWtleWJvYXJkLWZvY3VzXCI7XG5cbi8qKlxuICogQVJJQSByb2xlcyBhbmQgYXR0cmlidXRlcyBmb3IgYWNjZXNzaWJpbGl0eVxuICogRm9sbG93aW5nIE1EMyBXZWIgaW1wbGVtZW50YXRpb246XG4gKiAtIENvbnRhaW5lciByb2xlOiBsaXN0Ym94XG4gKiAtIExpc3QgaXRlbSByb2xlOiBvcHRpb25cbiAqIC0gU3RhdGU6IGFyaWEtc2VsZWN0ZWRcbiAqL1xuY29uc3QgQVJJQSA9IHtcbiAgUk9MRV9MSVNUQk9YOiBcImxpc3Rib3hcIixcbiAgUk9MRV9PUFRJT046IFwib3B0aW9uXCIsXG4gIEFSSUFfQUNUSVZFREVTQ0VOREFOVDogXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIixcbiAgQVJJQV9TRUxFQ1RFRDogXCJhcmlhLXNlbGVjdGVkXCIsXG4gIEFSSUFfTEFCRUw6IFwiYXJpYS1sYWJlbFwiLFxuICBBUklBX01VTFRJU0VMRUNUQUJMRTogXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLFxufTtcblxuLyoqXG4gKiBHZXQgdGhlIHZpZXdwb3J0IGl0ZW1zIGNvbnRhaW5lclxuICovXG5jb25zdCBnZXRJdGVtc0NvbnRhaW5lciA9IChcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQgfCB1bmRlZmluZWQsXG4pOiBIVE1MRWxlbWVudCB8IG51bGwgPT4ge1xuICByZXR1cm4gZWxlbWVudD8ucXVlcnlTZWxlY3RvcihgLiR7UFJFRklYfS12aWV3cG9ydC1pdGVtc2ApIHx8IG51bGw7XG59O1xuXG4vKipcbiAqIEdldCBhbGwgcmVuZGVyZWQgaXRlbSBlbGVtZW50c1xuICovXG5jb25zdCBnZXRSZW5kZXJlZEl0ZW1zID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsKTogSFRNTEVsZW1lbnRbXSA9PiB7XG4gIGlmICghY29udGFpbmVyKSByZXR1cm4gW107XG4gIHJldHVybiBBcnJheS5mcm9tKFxuICAgIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsKGAuJHtQUkVGSVh9LXZpZXdwb3J0LWl0ZW1bZGF0YS1pbmRleF1gKSxcbiAgKTtcbn07XG5cbi8qKlxuICogQWRkcyBrZXlib2FyZCBuYXZpZ2F0aW9uIGFuZCBhY2Nlc3NpYmlsaXR5IHRvIFZMaXN0IGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3Qgd2l0aEtleWJvYXJkID0gPFQgZXh0ZW5kcyBWTGlzdEl0ZW0gPSBWTGlzdEl0ZW0+KFxuICBjb25maWc6IFZMaXN0Q29uZmlnPFQ+LFxuKSA9PiB7XG4gIHJldHVybiAoY29tcG9uZW50OiBWTGlzdENvbXBvbmVudDxUPik6IFZMaXN0Q29tcG9uZW50PFQ+ID0+IHtcbiAgICAvLyBPbmx5IGVuYWJsZSBrZXlib2FyZCBpZiBzZWxlY3Rpb24gaXMgZW5hYmxlZFxuICAgIGNvbnN0IHNlbGVjdGlvbkVuYWJsZWQgPVxuICAgICAgY29uZmlnLnNlbGVjdGlvbj8uZW5hYmxlZCAmJiBjb25maWcuc2VsZWN0aW9uPy5tb2RlICE9PSBcIm5vbmVcIjtcbiAgICBjb25zdCBrZXlib2FyZENvbmZpZyA9IGNvbmZpZy5rZXlib2FyZCB8fCB7fTtcbiAgICBjb25zdCBlbmFibGVkID0ga2V5Ym9hcmRDb25maWcuZW5hYmxlZCA/PyBzZWxlY3Rpb25FbmFibGVkO1xuXG4gICAgaWYgKCFlbmFibGVkKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIE1EMyBzcGVjaWZpZXMgdGhhdCBhcnJvdyBrZXlzIHNob3VsZCB3cmFwIGJ5IGRlZmF1bHRcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgaG9tZUVuZDoga2V5Ym9hcmRDb25maWcuaG9tZUVuZCA/PyB0cnVlLFxuICAgICAgcGFnZVVwRG93bjoga2V5Ym9hcmRDb25maWcucGFnZVVwRG93biA/PyB0cnVlLFxuICAgICAgcGFnZVNpemU6IGtleWJvYXJkQ29uZmlnLnBhZ2VTaXplID8/IDEwLFxuICAgICAgdHlwZUFoZWFkOiBrZXlib2FyZENvbmZpZy50eXBlQWhlYWQgPz8gZmFsc2UsXG4gICAgICB0eXBlQWhlYWRUaW1lb3V0OiBrZXlib2FyZENvbmZpZy50eXBlQWhlYWRUaW1lb3V0ID8/IDUwMCxcbiAgICAgIHdyYXA6IGtleWJvYXJkQ29uZmlnLndyYXAgPz8gdHJ1ZSwgLy8gTUQzOiB3cmFwcyB0byB0b3AvYm90dG9tXG4gICAgICBvbk5hdmlnYXRlOiBrZXlib2FyZENvbmZpZy5vbk5hdmlnYXRlLFxuICAgIH07XG5cbiAgICAvLyBUeXBlLWFoZWFkIHN0YXRlXG4gICAgbGV0IHR5cGVBaGVhZEJ1ZmZlciA9IFwiXCI7XG4gICAgbGV0IHR5cGVBaGVhZFRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGwgPSBudWxsO1xuXG4gICAgLy8gVHJhY2sgaWYgbGFzdCBpbnRlcmFjdGlvbiB3YXMgbW91c2UgKGZvciBmb2N1cyBzdHlsaW5nKVxuICAgIGxldCBsYXN0TW91c2VEb3duVGltZSA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBTZXR1cCBBUklBIGF0dHJpYnV0ZXMgZm9yIGFjY2Vzc2liaWxpdHlcbiAgICAgKi9cbiAgICBjb25zdCBzZXR1cEFjY2Vzc2liaWxpdHkgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gY29tcG9uZW50LmVsZW1lbnQ7XG4gICAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcblxuICAgICAgLy8gU2V0IGxpc3Rib3ggcm9sZSBvbiB0aGUgY29tcG9uZW50XG4gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInJvbGVcIiwgQVJJQS5ST0xFX0xJU1RCT1gpO1xuXG4gICAgICAvLyBTZXQgbXVsdGlzZWxlY3RhYmxlIGlmIGluIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlXG4gICAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8ubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKEFSSUEuQVJJQV9NVUxUSVNFTEVDVEFCTEUsIFwidHJ1ZVwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBmb2N1c2FibGVcbiAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiMFwiKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2V0IGFyaWEtbGFiZWwgaWYgbm90IHByZXNlbnRcbiAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoQVJJQS5BUklBX0xBQkVMKSkge1xuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShBUklBLkFSSUFfTEFCRUwsIFwiTGlzdFwiKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIEFSSUEgYXR0cmlidXRlcyBvbiByZW5kZXJlZCBpdGVtc1xuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUl0ZW1BY2Nlc3NpYmlsaXR5ID0gKCkgPT4ge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0SXRlbXNDb250YWluZXIoY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgY29uc3QgaXRlbXMgPSBnZXRSZW5kZXJlZEl0ZW1zKGNvbnRhaW5lcik7XG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXM/LigpIHx8IFtdO1xuXG4gICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gcGFyc2VJbnQoaXRlbS5kYXRhc2V0LmluZGV4IHx8IFwiLTFcIiwgMTApO1xuICAgICAgICBpZiAoaW5kZXggPCAwKSByZXR1cm47XG5cbiAgICAgICAgLy8gU2V0IG9wdGlvbiByb2xlXG4gICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKFwicm9sZVwiLCBBUklBLlJPTEVfT1BUSU9OKTtcblxuICAgICAgICAvLyBTZXQgdW5pcXVlIElEIGZvciBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcbiAgICAgICAgY29uc3QgaXRlbUlkID0gYCR7UFJFRklYfS12bGlzdC1pdGVtLSR7aW5kZXh9YDtcbiAgICAgICAgaXRlbS5pZCA9IGl0ZW1JZDtcblxuICAgICAgICAvLyBTZXQgc2VsZWN0ZWQgc3RhdGVcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGVkSW5kaWNlcy5pbmNsdWRlcyhpbmRleCk7XG4gICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKEFSSUEuQVJJQV9TRUxFQ1RFRCwgU3RyaW5nKGlzU2VsZWN0ZWQpKTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBVcGRhdGUgYXJpYS1hY3RpdmVkZXNjZW5kYW50IG9uIGNvbnRhaW5lclxuICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPiAwICYmIGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUlkID0gYCR7UFJFRklYfS12bGlzdC1pdGVtLSR7c2VsZWN0ZWRJbmRpY2VzWzBdfWA7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnNldEF0dHJpYnV0ZShBUklBLkFSSUFfQUNUSVZFREVTQ0VOREFOVCwgYWN0aXZlSWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LnJlbW92ZUF0dHJpYnV0ZShBUklBLkFSSUFfQUNUSVZFREVTQ0VOREFOVCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSB0eXBlLWFoZWFkIHNlYXJjaFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVR5cGVBaGVhZCA9IChjaGFyOiBzdHJpbmcpID0+IHtcbiAgICAgIGlmICghb3B0aW9ucy50eXBlQWhlYWQpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gQ2xlYXIgcHJldmlvdXMgdGltZXJcbiAgICAgIGlmICh0eXBlQWhlYWRUaW1lcikge1xuICAgICAgICBjbGVhclRpbWVvdXQodHlwZUFoZWFkVGltZXIpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgY2hhcmFjdGVyIHRvIGJ1ZmZlclxuICAgICAgdHlwZUFoZWFkQnVmZmVyICs9IGNoYXIudG9Mb3dlckNhc2UoKTtcblxuICAgICAgLy8gU2V0IHRpbWVyIHRvIGNsZWFyIGJ1ZmZlclxuICAgICAgdHlwZUFoZWFkVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdHlwZUFoZWFkQnVmZmVyID0gXCJcIjtcbiAgICAgIH0sIG9wdGlvbnMudHlwZUFoZWFkVGltZW91dCk7XG5cbiAgICAgIC8vIFNlYXJjaCBmb3IgbWF0Y2hpbmcgaXRlbVxuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgaXRlbXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRJdGVtcz8uKCkgfHwgW107XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXM/LigpIHx8IFtdO1xuICAgICAgY29uc3Qgc3RhcnRJbmRleCA9XG4gICAgICAgIHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRJbmRpY2VzWzBdICsgMSA6IDA7XG5cbiAgICAgIC8vIFNlYXJjaCBmcm9tIGN1cnJlbnQgcG9zaXRpb24gdG8gZW5kLCB0aGVuIHdyYXAgdG8gYmVnaW5uaW5nXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gKHN0YXJ0SW5kZXggKyBpKSAlIGl0ZW1zLmxlbmd0aDtcbiAgICAgICAgY29uc3QgaXRlbSA9IGl0ZW1zW2luZGV4XTtcbiAgICAgICAgaWYgKCFpdGVtKSBjb250aW51ZTtcblxuICAgICAgICAvLyBHZXQgc2VhcmNoYWJsZSB0ZXh0IGZyb20gaXRlbVxuICAgICAgICBjb25zdCB0ZXh0ID0gZ2V0SXRlbVRleHQoaXRlbSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHRleHQuc3RhcnRzV2l0aCh0eXBlQWhlYWRCdWZmZXIpKSB7XG4gICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0QXRJbmRleD8uKGluZGV4KTtcbiAgICAgICAgICBvcHRpb25zLm9uTmF2aWdhdGU/LihpbmRleCwgXCJ0eXBlYWhlYWRcIik7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2VhcmNoYWJsZSB0ZXh0IGZyb20gYW4gaXRlbVxuICAgICAqL1xuICAgIGNvbnN0IGdldEl0ZW1UZXh0ID0gKGl0ZW06IGFueSk6IHN0cmluZyA9PiB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpIHJldHVybiBpdGVtO1xuICAgICAgcmV0dXJuIGl0ZW0udGl0bGUgfHwgaXRlbS5uYW1lIHx8IGl0ZW0ubGFiZWwgfHwgaXRlbS50ZXh0IHx8IFwiXCI7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBrZXlib2FyZCBldmVudHNcbiAgICAgKlxuICAgICAqIE1EMyBLZXlib2FyZCBOYXZpZ2F0aW9uOlxuICAgICAqIC0gVGFiOiBNb3ZlIGZvY3VzIHRvIGZpcnN0L2xhc3QgbGlzdCBpdGVtIG9yIG91dHNpZGVcbiAgICAgKiAtIERvd24vUmlnaHQ6IE1vdmUgdG8gbmV4dCBlbGVtZW50OyB3cmFwcyB0byB0b3AgaWYgYXQgZW5kXG4gICAgICogLSBVcC9MZWZ0OiBNb3ZlIHRvIHByZXZpb3VzIGVsZW1lbnQ7IHdyYXBzIHRvIGJvdHRvbSBpZiBhdCBzdGFydFxuICAgICAqIC0gU3BhY2UvRW50ZXI6IFNlbGVjdCBhIGxpc3QgaXRlbVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUtleURvd24gPSBhc3luYyAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgaWYgKHRvdGFsSXRlbXMgPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3Qgc2VsZWN0ZWRJbmRpY2VzID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0U2VsZWN0ZWRJbmRpY2VzPy4oKSB8fCBbXTtcbiAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPiAwID8gc2VsZWN0ZWRJbmRpY2VzWzBdIDogLTE7XG5cbiAgICAgIGxldCB0YXJnZXRJbmRleDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gICAgICBsZXQgaGFuZGxlZCA9IGZhbHNlO1xuXG4gICAgICAvLyBIZWxwZXIgdG8gbWFyayBldmVudCBhcyBoYW5kbGVkIGFuZCBzdG9wIHByb3BhZ2F0aW9uXG4gICAgICBjb25zdCBtYXJrSGFuZGxlZCA9ICgpID0+IHtcbiAgICAgICAgaGFuZGxlZCA9IHRydWU7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgIH07XG5cbiAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgLy8gTUQzOiBEb3duL1JpZ2h0IG1vdmUgdG8gbmV4dCBlbGVtZW50XG4gICAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjpcbiAgICAgICAgY2FzZSBcIkFycm93UmlnaHRcIjpcbiAgICAgICAgICBtYXJrSGFuZGxlZCgpO1xuICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPCAwKSB7XG4gICAgICAgICAgICB0YXJnZXRJbmRleCA9IDA7XG4gICAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50SW5kZXggPCB0b3RhbEl0ZW1zIC0gMSkge1xuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBjdXJyZW50SW5kZXggKyAxO1xuICAgICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy53cmFwKSB7XG4gICAgICAgICAgICAvLyBNRDM6IHdyYXBzIHRvIHRvcCBpZiBhdCBlbmRcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgLy8gTUQzOiBVcC9MZWZ0IG1vdmUgdG8gcHJldmlvdXMgZWxlbWVudFxuICAgICAgICBjYXNlIFwiQXJyb3dVcFwiOlxuICAgICAgICBjYXNlIFwiQXJyb3dMZWZ0XCI6XG4gICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICBpZiAoY3VycmVudEluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSB0b3RhbEl0ZW1zIC0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRJbmRleCA+IDApIHtcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gY3VycmVudEluZGV4IC0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMud3JhcCkge1xuICAgICAgICAgICAgLy8gTUQzOiB3cmFwcyB0byBib3R0b20gaWYgYXQgc3RhcnRcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gdG90YWxJdGVtcyAtIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgXCJIb21lXCI6XG4gICAgICAgICAgaWYgKG9wdGlvbnMuaG9tZUVuZCkge1xuICAgICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcIkVuZFwiOlxuICAgICAgICAgIGlmIChvcHRpb25zLmhvbWVFbmQpIHtcbiAgICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgICB0YXJnZXRJbmRleCA9IHRvdGFsSXRlbXMgLSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiUGFnZURvd25cIjpcbiAgICAgICAgICBpZiAob3B0aW9ucy5wYWdlVXBEb3duKSB7XG4gICAgICAgICAgICBtYXJrSGFuZGxlZCgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihvcHRpb25zLnBhZ2VTaXplIC0gMSwgdG90YWxJdGVtcyAtIDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGFyZ2V0SW5kZXggPSBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICBjdXJyZW50SW5kZXggKyBvcHRpb25zLnBhZ2VTaXplLFxuICAgICAgICAgICAgICAgIHRvdGFsSXRlbXMgLSAxLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiUGFnZVVwXCI6XG4gICAgICAgICAgaWYgKG9wdGlvbnMucGFnZVVwRG93bikge1xuICAgICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRhcmdldEluZGV4ID0gTWF0aC5tYXgoY3VycmVudEluZGV4IC0gb3B0aW9ucy5wYWdlU2l6ZSwgMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIC8vIE1EMzogU3BhY2UvRW50ZXIgc2VsZWN0IGEgbGlzdCBpdGVtXG4gICAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICBpZiAoY29uZmlnLnNlbGVjdGlvbj8ubW9kZSA9PT0gXCJtdWx0aXBsZVwiKSB7XG4gICAgICAgICAgICAgIC8vIEluIG11bHRpcGxlIG1vZGUsIHRvZ2dsZSBzZWxlY3Rpb25cbiAgICAgICAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IGVuaGFuY2VkQ29tcG9uZW50LmlzU2VsZWN0ZWQ/LihjdXJyZW50SW5kZXgpO1xuICAgICAgICAgICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LmRlc2VsZWN0SXRlbXM/LihbY3VycmVudEluZGV4XSk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0SXRlbXM/LihbY3VycmVudEluZGV4XSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIEluIHNpbmdsZSBtb2RlLCBlbnN1cmUgaXRlbSBpcyBzZWxlY3RlZCBhbmQgZW1pdCBhY3RpdmF0aW9uIGV2ZW50XG4gICAgICAgICAgICAgIGVuaGFuY2VkQ29tcG9uZW50LnNlbGVjdEl0ZW1zPy4oW2N1cnJlbnRJbmRleF0pO1xuICAgICAgICAgICAgICAvLyBFbWl0IGFjdGl2YXRlIGV2ZW50IGZvciBzaW5nbGUtYWN0aW9uIGxpc3RzXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJpdGVtOmFjdGl2YXRlXCIsIHtcbiAgICAgICAgICAgICAgICBpbmRleDogY3VycmVudEluZGV4LFxuICAgICAgICAgICAgICAgIGl0ZW06IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1zPy4oKT8uW2N1cnJlbnRJbmRleF0sXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiYVwiOlxuICAgICAgICBjYXNlIFwiQVwiOlxuICAgICAgICAgIC8vIEN0cmwrQSAvIENtZCtBIC0gc2VsZWN0IGFsbCBpbiBtdWx0aXBsZSBtb2RlXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGUuY3RybEtleSB8fCBlLm1ldGFLZXkpICYmXG4gICAgICAgICAgICBjb25maWcuc2VsZWN0aW9uPy5tb2RlID09PSBcIm11bHRpcGxlXCJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIG1hcmtIYW5kbGVkKCk7XG4gICAgICAgICAgICBjb25zdCBhbGxJbmRpY2VzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogdG90YWxJdGVtcyB9LCAoXywgaSkgPT4gaSk7XG4gICAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC5zZWxlY3RJdGVtcz8uKGFsbEluZGljZXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlIFwiRXNjYXBlXCI6XG4gICAgICAgICAgLy8gQ2xlYXIgc2VsZWN0aW9uXG4gICAgICAgICAgbWFya0hhbmRsZWQoKTtcbiAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC5jbGVhclNlbGVjdGlvbj8uKCk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBUeXBlLWFoZWFkIGZvciBwcmludGFibGUgY2hhcmFjdGVyc1xuICAgICAgICAgIGlmIChlLmtleS5sZW5ndGggPT09IDEgJiYgIWUuY3RybEtleSAmJiAhZS5tZXRhS2V5ICYmICFlLmFsdEtleSkge1xuICAgICAgICAgICAgaGFuZGxlZCA9IGhhbmRsZVR5cGVBaGVhZChlLmtleSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBOYXZpZ2F0ZSB0byB0YXJnZXQgaW5kZXhcbiAgICAgIGlmICh0YXJnZXRJbmRleCAhPT0gbnVsbCAmJiB0YXJnZXRJbmRleCAhPT0gY3VycmVudEluZGV4KSB7XG4gICAgICAgIC8vIEhhbmRsZSBzaGlmdCthcnJvdyBmb3IgcmFuZ2Ugc2VsZWN0aW9uIGluIG11bHRpcGxlIG1vZGVcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGUuc2hpZnRLZXkgJiZcbiAgICAgICAgICBjb25maWcuc2VsZWN0aW9uPy5tb2RlID09PSBcIm11bHRpcGxlXCIgJiZcbiAgICAgICAgICBjdXJyZW50SW5kZXggPj0gMFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBzdGFydCA9IE1hdGgubWluKGN1cnJlbnRJbmRleCwgdGFyZ2V0SW5kZXgpO1xuICAgICAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWF4KGN1cnJlbnRJbmRleCwgdGFyZ2V0SW5kZXgpO1xuICAgICAgICAgIGNvbnN0IHJhbmdlSW5kaWNlcyA9IEFycmF5LmZyb20oXG4gICAgICAgICAgICB7IGxlbmd0aDogZW5kIC0gc3RhcnQgKyAxIH0sXG4gICAgICAgICAgICAoXywgaSkgPT4gc3RhcnQgKyBpLFxuICAgICAgICAgICk7XG4gICAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0SXRlbXM/LihyYW5nZUluZGljZXMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIEF3YWl0IHNlbGVjdEF0SW5kZXggZm9yIHByb3BlciBzY3JvbGxpbmcgYW5kIGRhdGEgbG9hZGluZ1xuICAgICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBIb21lL0VuZC9QYWdlVXAvUGFnZURvd24gd2hpY2ggbWF5IGp1bXAgdG8gdW5sb2FkZWQgaXRlbXNcbiAgICAgICAgICBhd2FpdCBlbmhhbmNlZENvbXBvbmVudC5zZWxlY3RBdEluZGV4Py4odGFyZ2V0SW5kZXgpO1xuICAgICAgICB9XG4gICAgICAgIG9wdGlvbnMub25OYXZpZ2F0ZT8uKHRhcmdldEluZGV4LCBlLmtleSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtaXQga2V5Ym9hcmQgZXZlbnQgZm9yIGV4dGVybmFsIGhhbmRsaW5nXG4gICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwia2V5Ym9hcmQ6bmF2aWdhdGVcIiwge1xuICAgICAgICAgIGtleTogZS5rZXksXG4gICAgICAgICAgaW5kZXg6IHRhcmdldEluZGV4ID8/IGN1cnJlbnRJbmRleCxcbiAgICAgICAgICBzaGlmdEtleTogZS5zaGlmdEtleSxcbiAgICAgICAgICBjdHJsS2V5OiBlLmN0cmxLZXksXG4gICAgICAgICAgbWV0YUtleTogZS5tZXRhS2V5LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGZvY3VzIGV2ZW50XG4gICAgICpcbiAgICAgKiBNRDMgRm9jdXMgQmVoYXZpb3IgZm9yIFNpbmdsZS1BY3Rpb24gTGlzdHM6XG4gICAgICogLSBUaGUgZmlyc3QgZWxlbWVudCBpbiBhIGxpc3Qgc2hvdWxkIHJlY2VpdmUgZm9jdXMgYnkgZGVmYXVsdFxuICAgICAqIC0gSWYgdGhlIGxpc3QgaGFzIGEgc2VsZWN0ZWQgZWxlbWVudCwgZm9jdXMgZ29lcyB0byB0aGUgc2VsZWN0ZWQgaXRlbSBpbnN0ZWFkXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlRm9jdXMgPSAoKSA9PiB7XG4gICAgICBjb25zdCBlbmhhbmNlZENvbXBvbmVudCA9IGNvbXBvbmVudCBhcyBhbnk7XG4gICAgICBjb25zdCBzZWxlY3RlZEluZGljZXMgPSBlbmhhbmNlZENvbXBvbmVudC5nZXRTZWxlY3RlZEluZGljZXM/LigpIHx8IFtdO1xuICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcblxuICAgICAgLy8gQWRkIGtleWJvYXJkIGZvY3VzIGNsYXNzIG9ubHkgaWYgZm9jdXMgd2FzIE5PVCBmcm9tIGEgcmVjZW50IG1vdXNlIGNsaWNrXG4gICAgICAvLyAxMDBtcyB0aHJlc2hvbGQgYWNjb3VudHMgZm9yIHRoZSBkZWxheSBiZXR3ZWVuIG1vdXNlZG93biBhbmQgZm9jdXNcbiAgICAgIGNvbnN0IHdhc01vdXNlQ2xpY2sgPSBEYXRlLm5vdygpIC0gbGFzdE1vdXNlRG93blRpbWUgPCAxMDA7XG4gICAgICBpZiAoIXdhc01vdXNlQ2xpY2sgJiYgY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgYWRkQ2xhc3MoY29tcG9uZW50LmVsZW1lbnQsIEtFWUJPQVJEX0ZPQ1VTX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRvdGFsSXRlbXMgPT09IDApIHJldHVybjtcblxuICAgICAgLy8gTUQzOiBJZiBsaXN0IGhhcyBzZWxlY3RlZCBlbGVtZW50LCBmb2N1cyBnb2VzIHRvIHNlbGVjdGVkIGl0ZW1cbiAgICAgIC8vIE90aGVyd2lzZSwgZmlyc3QgZWxlbWVudCByZWNlaXZlcyBmb2N1c1xuICAgICAgaWYgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0QXRJbmRleD8uKDApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gT25seSBzY3JvbGwgdG8gc2VsZWN0ZWQgaXRlbSBpZiBpdCdzIG5vdCBhbHJlYWR5IGZ1bGx5IHZpc2libGVcbiAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB1bndhbnRlZCBzY3JvbGxpbmcgd2hlbiBjbGlja2luZyBvbiBhIHZpc2libGUgaXRlbVxuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gc2VsZWN0ZWRJbmRpY2VzWzBdO1xuICAgICAgICBjb25zdCBpc1Zpc2libGUgPSBlbmhhbmNlZENvbXBvbmVudC5pc0l0ZW1GdWxseVZpc2libGU/LihzZWxlY3RlZEluZGV4KTtcbiAgICAgICAgaWYgKCFpc1Zpc2libGUgJiYgZW5oYW5jZWRDb21wb25lbnQudmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgpIHtcbiAgICAgICAgICBlbmhhbmNlZENvbXBvbmVudC52aWV3cG9ydC5zY3JvbGxUb0luZGV4KHNlbGVjdGVkSW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJrZXlib2FyZDpmb2N1c1wiKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGJsdXIgZXZlbnRcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVCbHVyID0gKCkgPT4ge1xuICAgICAgLy8gUmVtb3ZlIGtleWJvYXJkIGZvY3VzIGNsYXNzXG4gICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoY29tcG9uZW50LmVsZW1lbnQsIEtFWUJPQVJEX0ZPQ1VTX0NMQVNTKTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2xlYXIgdHlwZS1haGVhZCBvbiBibHVyXG4gICAgICB0eXBlQWhlYWRCdWZmZXIgPSBcIlwiO1xuICAgICAgaWYgKHR5cGVBaGVhZFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0eXBlQWhlYWRUaW1lcik7XG4gICAgICAgIHR5cGVBaGVhZFRpbWVyID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29tcG9uZW50LmVtaXQ/LihcImtleWJvYXJkOmJsdXJcIik7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldHVwIGV2ZW50IGxpc3RlbmVyc1xuICAgICAqL1xuICAgIGNvbnN0IHNldHVwID0gKCkgPT4ge1xuICAgICAgc2V0dXBBY2Nlc3NpYmlsaXR5KCk7XG5cbiAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICBjb21wb25lbnQuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzXCIsIGhhbmRsZUZvY3VzKTtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlQmx1cik7XG5cbiAgICAgICAgLy8gVHJhY2sgbW91c2UgY2xpY2tzIHRvIGRpc3Rpbmd1aXNoIGZyb20ga2V5Ym9hcmQgZm9jdXNcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCAoKSA9PiB7XG4gICAgICAgICAgbGFzdE1vdXNlRG93blRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBBZGQgY2xpY2sgaGFuZGxlciB0byBmb2N1cyB0aGUgbGlzdCB3aGVuIGNsaWNrZWRcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICBjb21wb25lbnQuZWxlbWVudD8uZm9jdXMoKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBBUklBIGF0dHJpYnV0ZXMgd2hlbiBpdGVtcyBhcmUgcmVuZGVyZWRcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFxuICAgICAgICBcInZpZXdwb3J0Oml0ZW1zLXJlbmRlcmVkXCIsXG4gICAgICAgIHVwZGF0ZUl0ZW1BY2Nlc3NpYmlsaXR5LFxuICAgICAgKTtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5vbj8uKFwidmlld3BvcnQ6cmVuZGVyZWRcIiwgdXBkYXRlSXRlbUFjY2Vzc2liaWxpdHkpO1xuXG4gICAgICAvLyBVcGRhdGUgQVJJQSB3aGVuIHNlbGVjdGlvbiBjaGFuZ2VzXG4gICAgICAoY29tcG9uZW50IGFzIGFueSkub24/LihcInNlbGVjdGlvbjpjaGFuZ2VcIiwgdXBkYXRlSXRlbUFjY2Vzc2liaWxpdHkpO1xuICAgIH07XG5cbiAgICAvLyBJbml0aWFsaXplIGFmdGVyIGNvbXBvbmVudCBpcyByZWFkeVxuICAgIHNldFRpbWVvdXQoc2V0dXAsIDApO1xuXG4gICAgLy8gQ2xlYW51cCBvbiBkZXN0cm95XG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gY29tcG9uZW50LmRlc3Ryb3k7XG4gICAgY29tcG9uZW50LmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93bik7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJmb2N1c1wiLCBoYW5kbGVGb2N1cyk7XG4gICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZUJsdXIpO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVBaGVhZFRpbWVyKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0eXBlQWhlYWRUaW1lcik7XG4gICAgICB9XG4gICAgICBvcmlnaW5hbERlc3Ryb3k/LigpO1xuICAgIH07XG5cbiAgICAvLyBSZXR1cm4gZW5oYW5jZWQgY29tcG9uZW50IHdpdGgga2V5Ym9hcmQgQVBJXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcblxuICAgICAgLyoqXG4gICAgICAgKiBGb2N1cyB0aGUgbGlzdCBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvblxuICAgICAgICovXG4gICAgICBmb2N1cygpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LmZvY3VzKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEJsdXIgdGhlIGxpc3RcbiAgICAgICAqL1xuICAgICAgYmx1cigpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LmVsZW1lbnQ/LmJsdXIoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgbGlzdCBoYXMgZm9jdXNcbiAgICAgICAqL1xuICAgICAgaGFzRm9jdXMoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2VsZWN0IGZpcnN0IGl0ZW1cbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0Rmlyc3QoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgICAgIGNvbnN0IGVuaGFuY2VkQ29tcG9uZW50ID0gY29tcG9uZW50IGFzIGFueTtcbiAgICAgICAgY29uc3QgdG90YWxJdGVtcyA9IGVuaGFuY2VkQ29tcG9uZW50LmdldEl0ZW1Db3VudD8uKCkgfHwgMDtcbiAgICAgICAgaWYgKHRvdGFsSXRlbXMgPiAwKSB7XG4gICAgICAgICAgcmV0dXJuIGVuaGFuY2VkQ29tcG9uZW50LnNlbGVjdEF0SW5kZXg/LigwKSA/PyBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNlbGVjdCBsYXN0IGl0ZW1cbiAgICAgICAqL1xuICAgICAgYXN5bmMgc2VsZWN0TGFzdCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgZW5oYW5jZWRDb21wb25lbnQgPSBjb21wb25lbnQgYXMgYW55O1xuICAgICAgICBjb25zdCB0b3RhbEl0ZW1zID0gZW5oYW5jZWRDb21wb25lbnQuZ2V0SXRlbUNvdW50Py4oKSB8fCAwO1xuICAgICAgICBpZiAodG90YWxJdGVtcyA+IDApIHtcbiAgICAgICAgICByZXR1cm4gZW5oYW5jZWRDb21wb25lbnQuc2VsZWN0QXRJbmRleD8uKHRvdGFsSXRlbXMgLSAxKSA/PyBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoS2V5Ym9hcmQ7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vZm9ybS50c1xuXG4vKipcbiAqIEZvcm0gQ29tcG9uZW50IC0gRnVuY3Rpb25hbCBmb3JtIGJ1aWxkZXIgd2l0aCBtdHJsIGNvbXBvc2l0aW9uXG4gKlxuICogQSBmb3JtIGNvbXBvbmVudCB0aGF0IHVzZXMgdGhlIG10cmwtYWRkb25zIGxheW91dCBzeXN0ZW0gdG8gYnVpbGRcbiAqIGZvcm1zIGZyb20gc2NoZW1hIGRlZmluaXRpb25zLCB3aXRoIGJ1aWx0LWluIGRhdGEgbWFuYWdlbWVudCxcbiAqIHZhbGlkYXRpb24sIGFuZCBzdWJtaXNzaW9uIGhhbmRsaW5nLlxuICovXG5cbmltcG9ydCB0eXBlIHsgRm9ybUNvbmZpZywgRm9ybUNvbXBvbmVudCB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8vIEltcG9ydCBtdHJsIGNvbXBvc2Ugc3lzdGVtXG5pbXBvcnQgeyBwaXBlIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IGNyZWF0ZUJhc2UsIHdpdGhFbGVtZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IHdpdGhFdmVudHMsIHdpdGhMaWZlY3ljbGUgfSBmcm9tIFwibXRybFwiO1xuXG4vLyBJbXBvcnQgZm9ybSBmZWF0dXJlc1xuaW1wb3J0IHtcbiAgd2l0aExheW91dCxcbiAgd2l0aEZpZWxkcyxcbiAgd2l0aERhdGEsXG4gIHdpdGhDb250cm9sbGVyLFxuICB3aXRoU3VibWl0LFxuICB3aXRoUHJvdGVjdGlvbixcbiAgd2l0aEFQSSxcbn0gZnJvbSBcIi4vZmVhdHVyZXNcIjtcblxuLy8gSW1wb3J0IGNvbmZpZ3VyYXRpb25cbmltcG9ydCB7IGNyZWF0ZUJhc2VDb25maWcsIGdldEVsZW1lbnRDb25maWcgfSBmcm9tIFwiLi9jb25maWdcIjtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEZvcm0gY29tcG9uZW50IHVzaW5nIGZ1bmN0aW9uYWwgY29tcG9zaXRpb25cbiAqXG4gKiBAcGFyYW0ge0Zvcm1Db25maWd9IGNvbmZpZyAtIEZvcm0gY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKiBAcmV0dXJucyB7Rm9ybUNvbXBvbmVudH0gQSBmdWxseSBjb25maWd1cmVkIGZvcm0gY29tcG9uZW50XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7IGNyZWF0ZUZvcm0gfSBmcm9tICdtdHJsLWFkZG9ucydcbiAqIGltcG9ydCB7IGNyZWF0ZVRleHRmaWVsZCwgY3JlYXRlU3dpdGNoLCBjcmVhdGVDaGlwcyB9IGZyb20gJ210cmwnXG4gKlxuICogY29uc3QgZm9ybSA9IGNyZWF0ZUZvcm0oe1xuICogICBjbGFzczogJ2FjY291bnQtZm9ybScsXG4gKiAgIGFjdGlvbjogJy9hcGkvdXNlcnMvJyxcbiAqICAgbGF5b3V0OiBbXG4gKiAgICAgWydzZWN0aW9uJywgeyBjbGFzczogJ3VzZXItc2VjdGlvbicgfSxcbiAqICAgICAgIFsnZGl2JywgeyBjbGFzczogJ3NlY3Rpb24tdGl0bGUnLCB0ZXh0OiAnVXNlcicgfV0sXG4gKiAgICAgICBbY3JlYXRlVGV4dGZpZWxkLCAnaW5mby51c2VybmFtZScsIHsgbGFiZWw6ICdVc2VybmFtZScgfV0sXG4gKiAgICAgICBbY3JlYXRlQ2hpcHMsICdpbmZvLnJvbGUnLCB7XG4gKiAgICAgICAgIGxhYmVsOiAnUm9sZScsXG4gKiAgICAgICAgIGNoaXBzOiBbXG4gKiAgICAgICAgICAgeyB0ZXh0OiAncmVnaXN0ZXJlZCcsIHZhbHVlOiAncmVnaXN0ZXJlZCcgfSxcbiAqICAgICAgICAgICB7IHRleHQ6ICdhZG1pbicsIHZhbHVlOiAnYWRtaW4nIH0sXG4gKiAgICAgICAgICAgeyB0ZXh0OiAncHJlbWl1bScsIHZhbHVlOiAncHJlbWl1bScgfVxuICogICAgICAgICBdXG4gKiAgICAgICB9XSxcbiAqICAgICAgIFtjcmVhdGVTd2l0Y2gsICdpbmZvLmVuYWJsZWQnLCB7IGxhYmVsOiAnRW5hYmxlZCcgfV1cbiAqICAgICBdXG4gKiAgIF0sXG4gKiAgIG9uOiB7XG4gKiAgICAgY2hhbmdlOiAoZGF0YSkgPT4gY29uc29sZS5sb2coJ0Zvcm0gY2hhbmdlZDonLCBkYXRhKSxcbiAqICAgICBzdWJtaXQ6IChkYXRhKSA9PiBjb25zb2xlLmxvZygnRm9ybSBzdWJtaXR0ZWQ6JywgZGF0YSlcbiAqICAgfVxuICogfSlcbiAqXG4gKiAvLyBBcHBlbmQgdG8gRE9NXG4gKiBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGZvcm0uZWxlbWVudClcbiAqXG4gKiAvLyBTZXQgZGF0YVxuICogZm9ybS5zZXREYXRhKHtcbiAqICAgdXNlcm5hbWU6ICdqb2huX2RvZScsXG4gKiAgIHJvbGU6ICdhZG1pbicsXG4gKiAgIGVuYWJsZWQ6IHRydWVcbiAqIH0pXG4gKlxuICogLy8gR2V0IGRhdGFcbiAqIGNvbnN0IGRhdGEgPSBmb3JtLmdldERhdGEoKVxuICpcbiAqIC8vIENoZWNrIGlmIG1vZGlmaWVkXG4gKiBpZiAoZm9ybS5pc01vZGlmaWVkKCkpIHtcbiAqICAgYXdhaXQgZm9ybS5zdWJtaXQoKVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVGb3JtID0gKGNvbmZpZzogRm9ybUNvbmZpZyA9IHt9KTogRm9ybUNvbXBvbmVudCA9PiB7XG4gIHRyeSB7XG4gICAgLy8gUHJvY2VzcyBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHNcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gY3JlYXRlQmFzZUNvbmZpZyhjb25maWcpO1xuXG4gICAgLy8gQnVpbGQgdGhlIGZvcm0gdGhyb3VnaCBmdW5jdGlvbmFsIGNvbXBvc2l0aW9uXG4gICAgLy8gRWFjaCBmdW5jdGlvbiBpbiB0aGUgcGlwZSBhZGRzIHNwZWNpZmljIGNhcGFiaWxpdGllc1xuICAgIGNvbnN0IGNvbXBvbmVudCA9IHBpcGUoXG4gICAgICAvLyAxLiBGb3VuZGF0aW9uIGxheWVyIC0gQmFzZSBjb21wb25lbnQgd2l0aCBjb25maWdcbiAgICAgIGNyZWF0ZUJhc2UsXG5cbiAgICAgIC8vIDIuIEV2ZW50IHN5c3RlbSAtIEFkZHMgb24vb2ZmL2VtaXQgbWV0aG9kc1xuICAgICAgd2l0aEV2ZW50cygpLFxuXG4gICAgICAvLyAzLiBET00gZWxlbWVudCAtIENyZWF0ZXMgdGhlIHJvb3QgY29udGFpbmVyIGVsZW1lbnRcbiAgICAgIHdpdGhFbGVtZW50KGdldEVsZW1lbnRDb25maWcoYmFzZUNvbmZpZykpLFxuXG4gICAgICAvLyA0LiBMYXlvdXQgLSBDcmVhdGVzIGZvcm0gZWxlbWVudCBhbmQgcHJvY2Vzc2VzIGxheW91dCBzY2hlbWFcbiAgICAgIHdpdGhMYXlvdXQoYmFzZUNvbmZpZyksXG5cbiAgICAgIC8vIDUuIEZpZWxkcyAtIEV4dHJhY3RzIGZpZWxkcyBmcm9tIGxheW91dCBhbmQgY3JlYXRlcyByZWdpc3RyeVxuICAgICAgd2l0aEZpZWxkcyhiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gNi4gRGF0YSAtIEFkZHMgZGF0YSBtYW5hZ2VtZW50IChnZXQvc2V0LCBjaGFuZ2UgdHJhY2tpbmcpXG4gICAgICB3aXRoRGF0YShiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gNy4gQ29udHJvbGxlciAtIEFkZHMgbW9kZSBtYW5hZ2VtZW50IChyZWFkL2NyZWF0ZS91cGRhdGUpXG4gICAgICB3aXRoQ29udHJvbGxlcihiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gOC4gU3VibWl0IC0gQWRkcyB2YWxpZGF0aW9uIGFuZCBzdWJtaXNzaW9uIGhhbmRsaW5nXG4gICAgICB3aXRoU3VibWl0KGJhc2VDb25maWcpLFxuXG4gICAgICAvLyA5LiBQcm90ZWN0aW9uIC0gQWRkcyBibG9ja2luZyBvdmVybGF5IHdoZW4gZm9ybSBoYXMgdW5zYXZlZCBjaGFuZ2VzXG4gICAgICB3aXRoUHJvdGVjdGlvbihiYXNlQ29uZmlnKSxcblxuICAgICAgLy8gMTAuIExpZmVjeWNsZSAtIEFkZHMgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgKGRlc3Ryb3kpXG4gICAgICB3aXRoTGlmZWN5Y2xlKCksXG5cbiAgICAgIC8vIDExLiBBUEkgLSBDcmVhdGVzIGNsZWFuIHB1YmxpYyBBUElcbiAgICAgIHdpdGhBUEkoYmFzZUNvbmZpZyksXG4gICAgKShiYXNlQ29uZmlnKTtcblxuICAgIC8vIEFwcGVuZCB0byBjb250YWluZXIgaWYgcHJvdmlkZWRcbiAgICBpZiAoY29uZmlnLmNvbnRhaW5lciAmJiBjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgY29uZmlnLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjb21wb25lbnQuZWxlbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbXBvbmVudCBhcyBGb3JtQ29tcG9uZW50O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJGb3JtIGNyZWF0aW9uIGVycm9yOlwiLCBlcnJvcik7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gY3JlYXRlIGZvcm06ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVGb3JtO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2xheW91dC50c1xuXG4vKipcbiAqIExheW91dCBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogQnVpbGRzIHRoZSBmb3JtIHN0cnVjdHVyZSBmcm9tIGEgbGF5b3V0IHNjaGVtYSB1c2luZyBtdHJsLWFkZG9ucyBsYXlvdXQgc3lzdGVtXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTGF5b3V0IH0gZnJvbSBcIi4uLy4uLy4uL2NvcmUvbGF5b3V0XCI7XG5pbXBvcnQgdHlwZSB7IEZvcm1Db25maWcsIEJhc2VGb3JtQ29tcG9uZW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0RFRkFVTFRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG4vLyBTY3JvbGwgdGhyZXNob2xkIGluIHBpeGVsc1xuY29uc3QgU0NST0xMRURfVEhSRVNIT0xEID0gMTtcblxuLy8gQ1NTIGNsYXNzIG5hbWVzXG5jb25zdCBTQ1JPTExFRF9DTEFTUyA9IFwibXRybC1mb3JtLS1zY3JvbGxlZFwiO1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGZvcm0gZWxlbWVudFxuICovXG5jb25zdCBjcmVhdGVGb3JtRWxlbWVudCA9IChjb25maWc6IEZvcm1Db25maWcpOiBIVE1MRm9ybUVsZW1lbnQgPT4ge1xuICBjb25zdCBmb3JtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZvcm1cIik7XG5cbiAgaWYgKGNvbmZpZy5tZXRob2QpIHtcbiAgICBmb3JtLnNldEF0dHJpYnV0ZShcIm1ldGhvZFwiLCBjb25maWcubWV0aG9kKTtcbiAgfVxuXG4gIGlmIChjb25maWcuYWN0aW9uKSB7XG4gICAgZm9ybS5zZXRBdHRyaWJ1dGUoXCJhY3Rpb25cIiwgY29uZmlnLmFjdGlvbik7XG4gIH1cblxuICBpZiAoY29uZmlnLmF1dG9jb21wbGV0ZSkge1xuICAgIGZvcm0uc2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIsIGNvbmZpZy5hdXRvY29tcGxldGUpO1xuICB9XG5cbiAgLy8gUHJldmVudCBkZWZhdWx0IGZvcm0gc3VibWlzc2lvbiAtIHdlIGhhbmRsZSBpdCBwcm9ncmFtbWF0aWNhbGx5XG4gIGZvcm0uYWRkRXZlbnRMaXN0ZW5lcihcInN1Ym1pdFwiLCAoZSkgPT4ge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG5cbiAgcmV0dXJuIGZvcm07XG59O1xuXG4vKipcbiAqIFByb2Nlc3NlcyBsYXlvdXQgc2NoZW1hIGFuZCBleHRyYWN0cyBuYW1lZCBjb21wb25lbnRzXG4gKi9cbmNvbnN0IHByb2Nlc3NMYXlvdXRTY2hlbWEgPSAoXG4gIHNjaGVtYTogdW5rbm93bltdLFxuICBmb3JtOiBIVE1MRm9ybUVsZW1lbnQsXG4gIGNvbmZpZzogRm9ybUNvbmZpZyxcbik6IHsgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyBsYXlvdXRSZXN1bHQ6IHVua25vd24gfSA9PiB7XG4gIGlmICghc2NoZW1hIHx8ICFBcnJheS5pc0FycmF5KHNjaGVtYSkgfHwgc2NoZW1hLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB7IHVpOiB7fSwgbGF5b3V0UmVzdWx0OiBudWxsIH07XG4gIH1cblxuICAvLyBVc2UgbXRybC1hZGRvbnMgY3JlYXRlTGF5b3V0IHRvIHByb2Nlc3MgdGhlIHNjaGVtYVxuICBjb25zdCBsYXlvdXRSZXN1bHQgPSBjcmVhdGVMYXlvdXQoc2NoZW1hLCBmb3JtLCB7fSk7XG5cbiAgLy8gRXh0cmFjdCBuYW1lZCBjb21wb25lbnRzIGZyb20gbGF5b3V0IHJlc3VsdFxuICBjb25zdCB1aTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICBpZiAobGF5b3V0UmVzdWx0ICYmIHR5cGVvZiBsYXlvdXRSZXN1bHQgPT09IFwib2JqZWN0XCIpIHtcbiAgICAvLyBUaGUgbGF5b3V0IHJlc3VsdCBjb250YWlucyBjb21wb25lbnQgcmVmZXJlbmNlc1xuICAgIGNvbnN0IHJlc3VsdCA9IGxheW91dFJlc3VsdCBhcyB7IGNvbXBvbmVudD86IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG4gICAgaWYgKHJlc3VsdC5jb21wb25lbnQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odWksIHJlc3VsdC5jb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHVpLCBsYXlvdXRSZXN1bHQgfTtcbn07XG5cbi8qKlxuICogU2V0cyB1cCBzY3JvbGwgZGV0ZWN0aW9uIG9uIGJvZHkgZWxlbWVudHMgdG8gdG9nZ2xlIC0tc2Nyb2xsZWQgY2xhc3Mgb24gZm9ybSBjb250YWluZXJcbiAqL1xuY29uc3Qgc2V0dXBTY3JvbGxJbmRpY2F0b3IgPSAoXG4gIGZvcm06IEhUTUxGb3JtRWxlbWVudCxcbiAgZm9ybUNvbnRhaW5lcjogSFRNTEVsZW1lbnQsXG4pOiAoKCkgPT4gdm9pZCkgPT4ge1xuICBjb25zdCBjbGVhbnVwRm5zOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXG4gIC8vIEZpbmQgYm9keSBlbGVtZW50IHRvIGNhbGN1bGF0ZSBzaGFkb3cgcG9zaXRpb25cbiAgY29uc3QgYm9keUVsZW1lbnQgPSBmb3JtLnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiLm10cmwtYm9keVwiKTtcbiAgaWYgKGJvZHlFbGVtZW50KSB7XG4gICAgLy8gU2V0IENTUyB2YXJpYWJsZSBmb3Igc2hhZG93IHBvc2l0aW9uaW5nIGF0IHRvcCBvZiBib2R5XG4gICAgY29uc3QgdXBkYXRlQm9keVRvcCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGJvZHlUb3AgPSBib2R5RWxlbWVudC5vZmZzZXRUb3A7XG4gICAgICBmb3JtQ29udGFpbmVyLnN0eWxlLnNldFByb3BlcnR5KFwiLS1tdHJsLWZvcm0tYm9keS10b3BcIiwgYCR7Ym9keVRvcH1weGApO1xuICAgIH07XG4gICAgdXBkYXRlQm9keVRvcCgpO1xuXG4gICAgLy8gVXBkYXRlIG9uIHJlc2l6ZVxuICAgIGNvbnN0IHJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKHVwZGF0ZUJvZHlUb3ApO1xuICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZm9ybSk7XG5cbiAgICBjbGVhbnVwRm5zLnB1c2goKCkgPT4ge1xuICAgICAgcmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgZm9ybUNvbnRhaW5lci5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcIi0tbXRybC1mb3JtLWJvZHktdG9wXCIpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gRmluZCBib2R5IGVsZW1lbnRzIChtdHJsLWJvZHkgY2xhc3MgYWRkZWQgYnkgbGF5b3V0IHN5c3RlbSlcbiAgY29uc3QgYm9keUVsZW1lbnRzID0gZm9ybS5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcIi5tdHJsLWJvZHlcIik7XG5cbiAgYm9keUVsZW1lbnRzLmZvckVhY2goKGJvZHlFbGVtZW50KSA9PiB7XG4gICAgbGV0IGlzU2Nyb2xsZWQgPSBmYWxzZTtcblxuICAgIGNvbnN0IGhhbmRsZVNjcm9sbCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHNob3VsZEJlU2Nyb2xsZWQgPSBib2R5RWxlbWVudC5zY3JvbGxUb3AgPiBTQ1JPTExFRF9USFJFU0hPTEQ7XG4gICAgICBpZiAoc2hvdWxkQmVTY3JvbGxlZCAhPT0gaXNTY3JvbGxlZCkge1xuICAgICAgICBpc1Njcm9sbGVkID0gc2hvdWxkQmVTY3JvbGxlZDtcbiAgICAgICAgZm9ybUNvbnRhaW5lci5jbGFzc0xpc3QudG9nZ2xlKFNDUk9MTEVEX0NMQVNTLCBzaG91bGRCZVNjcm9sbGVkKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gSW5pdGlhbCBjaGVja1xuICAgIGhhbmRsZVNjcm9sbCgpO1xuXG4gICAgLy8gTGlzdGVuIGZvciBzY3JvbGwgZXZlbnRzXG4gICAgYm9keUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBoYW5kbGVTY3JvbGwsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcblxuICAgIGNsZWFudXBGbnMucHVzaCgoKSA9PiB7XG4gICAgICBib2R5RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGhhbmRsZVNjcm9sbCk7XG4gICAgICBmb3JtQ29udGFpbmVyLmNsYXNzTGlzdC5yZW1vdmUoU0NST0xMRURfQ0xBU1MpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBSZXR1cm4gY2xlYW51cCBmdW5jdGlvblxuICByZXR1cm4gKCkgPT4ge1xuICAgIGNsZWFudXBGbnMuZm9yRWFjaCgoZm4pID0+IGZuKCkpO1xuICB9O1xufTtcblxuLyoqXG4gKiB3aXRoTGF5b3V0IGZlYXR1cmVcbiAqIEFkZHMgZm9ybSBlbGVtZW50IGNyZWF0aW9uIGFuZCBsYXlvdXQgcHJvY2Vzc2luZ1xuICovXG5leHBvcnQgY29uc3Qgd2l0aExheW91dCA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIDxUIGV4dGVuZHMgQmFzZUZvcm1Db21wb25lbnQ+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHtcbiAgICBmb3JtOiBIVE1MRm9ybUVsZW1lbnQ7XG4gICAgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGxheW91dFJlc3VsdDogdW5rbm93bjtcbiAgICBfY2xlYW51cFNjcm9sbEluZGljYXRvcj86ICgpID0+IHZvaWQ7XG4gIH0gPT4ge1xuICAgIC8vIENyZWF0ZSB0aGUgZm9ybSBlbGVtZW50XG4gICAgY29uc3QgZm9ybSA9IGNyZWF0ZUZvcm1FbGVtZW50KGNvbmZpZyk7XG5cbiAgICAvLyBBcHBlbmQgZm9ybSB0byBjb21wb25lbnQncyByb290IGVsZW1lbnRcbiAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LmFwcGVuZENoaWxkKGZvcm0pO1xuICAgIH1cblxuICAgIC8vIFByb2Nlc3MgbGF5b3V0IHNjaGVtYSBpZiBwcm92aWRlZFxuICAgIGNvbnN0IHsgdWksIGxheW91dFJlc3VsdCB9ID0gY29uZmlnLmxheW91dFxuICAgICAgPyBwcm9jZXNzTGF5b3V0U2NoZW1hKGNvbmZpZy5sYXlvdXQsIGZvcm0sIGNvbmZpZylcbiAgICAgIDogeyB1aToge30sIGxheW91dFJlc3VsdDogbnVsbCB9O1xuXG4gICAgLy8gU2V0dXAgc2Nyb2xsIGluZGljYXRvciBvbiBib2R5IGVsZW1lbnRzXG4gICAgY29uc3QgY2xlYW51cFNjcm9sbEluZGljYXRvciA9IHNldHVwU2Nyb2xsSW5kaWNhdG9yKFxuICAgICAgZm9ybSxcbiAgICAgIGNvbXBvbmVudC5lbGVtZW50LFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgZm9ybSxcbiAgICAgIHVpLFxuICAgICAgbGF5b3V0UmVzdWx0LFxuICAgICAgX2NsZWFudXBTY3JvbGxJbmRpY2F0b3I6IGNsZWFudXBTY3JvbGxJbmRpY2F0b3IsXG4gICAgfTtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhMYXlvdXQ7XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2Zvcm0vY29uc3RhbnRzLnRzXG5cbi8qKlxuICogRGF0YSBzdGF0ZSBjb25zdGFudHNcbiAqIFRyYWNrcyB3aGV0aGVyIGZvcm0gZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IERBVEFfU1RBVEUgPSB7XG4gIC8qKiBEYXRhIG1hdGNoZXMgaW5pdGlhbCBzdGF0ZSAtIG5vIGNoYW5nZXMgbWFkZSAqL1xuICBQUklTVElORTogXCJwcmlzdGluZVwiLFxuICAvKiogRGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGUgKi9cbiAgRElSVFk6IFwiZGlydHlcIixcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogRm9ybSBldmVudCBjb25zdGFudHNcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fRVZFTlRTID0ge1xuICAvKiogRmlyZWQgd2hlbiBhbnkgZmllbGQgdmFsdWUgY2hhbmdlcyAqL1xuICBDSEFOR0U6IFwiY2hhbmdlXCIsXG4gIC8qKiBGaXJlZCB3aGVuIGZvcm0gaXMgc3VibWl0dGVkICovXG4gIFNVQk1JVDogXCJzdWJtaXRcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBzdGF0ZSBjaGFuZ2VzIChwcmlzdGluZSA8LT4gZGlydHkpICovXG4gIFNUQVRFX0NIQU5HRTogXCJzdGF0ZTpjaGFuZ2VcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBpcyBzZXQgb24gdGhlIGZvcm0gKi9cbiAgREFUQV9TRVQ6IFwiZGF0YTpzZXRcIixcbiAgLyoqIEZpcmVkIHdoZW4gZGF0YSBpcyByZXRyaWV2ZWQgZnJvbSB0aGUgZm9ybSAqL1xuICBEQVRBX0dFVDogXCJkYXRhOmdldFwiLFxuICAvKiogRmlyZWQgd2hlbiBhIHNwZWNpZmljIGZpZWxkIGNoYW5nZXMgKi9cbiAgRklFTERfQ0hBTkdFOiBcImZpZWxkOmNoYW5nZVwiLFxuICAvKiogRmlyZWQgd2hlbiB2YWxpZGF0aW9uIGZhaWxzICovXG4gIFZBTElEQVRJT05fRVJST1I6IFwidmFsaWRhdGlvbjplcnJvclwiLFxuICAvKiogRmlyZWQgd2hlbiBzdWJtaXQgc3VjY2VlZHMgKi9cbiAgU1VCTUlUX1NVQ0NFU1M6IFwic3VibWl0OnN1Y2Nlc3NcIixcbiAgLyoqIEZpcmVkIHdoZW4gc3VibWl0IGZhaWxzICovXG4gIFNVQk1JVF9FUlJPUjogXCJzdWJtaXQ6ZXJyb3JcIixcbiAgLyoqIEZpcmVkIHdoZW4gZm9ybSBpcyByZXNldCB0byBpbml0aWFsIHN0YXRlICovXG4gIFJFU0VUOiBcInJlc2V0XCIsXG4gIC8qKiBGaXJlZCB3aGVuIHNldERhdGEgaXMgY2FsbGVkIHdpdGggdW5zYXZlZCBjaGFuZ2VzIChwcm90ZWN0aW9uIGVuYWJsZWQpICovXG4gIERBVEFfQ09ORkxJQ1Q6IFwiZGF0YTpjb25mbGljdFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBGb3JtIENTUyBjbGFzcyBtb2RpZmllcnNcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fQ0xBU1NFUyA9IHtcbiAgLyoqIEFwcGxpZWQgd2hlbiBkYXRhIGhhcyBiZWVuIG1vZGlmaWVkICovXG4gIE1PRElGSUVEOiBcIm1vZGlmaWVkXCIsXG4gIC8qKiBBcHBsaWVkIHdoZW4gZm9ybSBpcyBzdWJtaXR0aW5nICovXG4gIFNVQk1JVFRJTkc6IFwic3VibWl0dGluZ1wiLFxuICAvKiogQXBwbGllZCB3aGVuIGZvcm0gaXMgZGlzYWJsZWQgKi9cbiAgRElTQUJMRUQ6IFwiZGlzYWJsZWRcIixcbiAgLyoqIEFwcGxpZWQgd2hlbiBmb3JtIGJvZHkgaXMgc2Nyb2xsZWQgYXdheSBmcm9tIHRvcCAqL1xuICBTQ1JPTExFRDogXCJtdHJsLWZvcm0tLXNjcm9sbGVkXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIERlZmF1bHQgZm9ybSBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBGT1JNX0RFRkFVTFRTID0ge1xuICBwcmVmaXg6IFwibXRybFwiLFxuICBjb21wb25lbnROYW1lOiBcImZvcm1cIixcbiAgdGFnOiBcImRpdlwiLFxuICBmb3JtVGFnOiBcImZvcm1cIixcbiAgbWV0aG9kOiBcIlBPU1RcIixcbiAgYXV0b2NvbXBsZXRlOiBcIm9mZlwiLFxuICB1c2VDaGFuZ2VzOiB0cnVlLFxuICBjb250cm9sczogW1wic3VibWl0XCIsIFwiY2FuY2VsXCJdLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBGaWVsZCBuYW1lIHByZWZpeGVzIHVzZWQgZm9yIGV4dHJhY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IEZJRUxEX1BSRUZJWEVTID0ge1xuICBJTkZPOiBcImluZm8uXCIsXG4gIEZJTEU6IFwiZmlsZS5cIixcbiAgREFUQTogXCJkYXRhLlwiLFxufSBhcyBjb25zdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9jb25maWcudHNcblxuaW1wb3J0IHR5cGUgeyBGb3JtQ29uZmlnLCBGb3JtU3RhdGUsIEZvcm1EYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEZPUk1fREVGQVVMVFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcblxuLy8gUmUtZXhwb3J0IEZPUk1fREVGQVVMVFMgZm9yIHVzZSBpbiBvdGhlciBtb2R1bGVzXG5leHBvcnQgeyBGT1JNX0RFRkFVTFRTIH07XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgYmFzZSBjb25maWd1cmF0aW9uIHdpdGggZGVmYXVsdHMgYXBwbGllZFxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlQmFzZUNvbmZpZyA9IChjb25maWc6IEZvcm1Db25maWcgPSB7fSk6IEZvcm1Db25maWcgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLkZPUk1fREVGQVVMVFMsXG4gICAgLi4uY29uZmlnLFxuICAgIHByZWZpeDogY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeCxcbiAgICBjb21wb25lbnROYW1lOiBjb25maWcuY29tcG9uZW50TmFtZSB8fCBGT1JNX0RFRkFVTFRTLmNvbXBvbmVudE5hbWUsXG4gICAgY29udHJvbHM6XG4gICAgICBjb25maWcuY29udHJvbHMgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IGNvbmZpZy5jb250cm9sc1xuICAgICAgICA6IFsuLi5GT1JNX0RFRkFVTFRTLmNvbnRyb2xzXSxcbiAgICBzeXNpbmZvOiBjb25maWcuc3lzaW5mbyB8fCBbXSxcbiAgICB2YWxpZGF0aW9uOiBjb25maWcudmFsaWRhdGlvbiB8fCBbXSxcbiAgICBvbjogY29uZmlnLm9uIHx8IHt9LFxuICB9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBpbml0aWFsIGZvcm0gc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUluaXRpYWxTdGF0ZSA9IChjb25maWc6IEZvcm1Db25maWcpOiBGb3JtU3RhdGUgPT4ge1xuICBjb25zdCBpbml0aWFsRGF0YSA9IGNvbmZpZy5kYXRhID8geyAuLi5jb25maWcuZGF0YSB9IDoge307XG5cbiAgcmV0dXJuIHtcbiAgICBtb2RpZmllZDogZmFsc2UsXG4gICAgc3VibWl0dGluZzogZmFsc2UsXG4gICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgIGluaXRpYWxEYXRhLFxuICAgIGN1cnJlbnREYXRhOiB7IC4uLmluaXRpYWxEYXRhIH0sXG4gICAgZXJyb3JzOiB7fSxcbiAgfTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgZWxlbWVudCBjb25maWd1cmF0aW9uIGZvciB3aXRoRWxlbWVudFxuICovXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudENvbmZpZyA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBGT1JNX0RFRkFVTFRTLnByZWZpeDtcbiAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IEZPUk1fREVGQVVMVFMuY29tcG9uZW50TmFtZTtcblxuICBjb25zdCBjbGFzc05hbWVzID0gW2Ake3ByZWZpeH0tJHtjb21wb25lbnROYW1lfWBdO1xuXG4gIGlmIChjb25maWcuY2xhc3MpIHtcbiAgICBjbGFzc05hbWVzLnB1c2goY29uZmlnLmNsYXNzKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdGFnOiBcImRpdlwiLFxuICAgIGNsYXNzTmFtZTogY2xhc3NOYW1lcy5qb2luKFwiIFwiKSxcbiAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICBcImRhdGEtY29tcG9uZW50XCI6IGNvbXBvbmVudE5hbWUsXG4gICAgfSxcbiAgfTtcbn07XG5cbi8qKlxuICogRXh0cmFjdHMgZmllbGQgbmFtZSBmcm9tIGEgcHJlZml4ZWQgbmFtZSAoZS5nLiwgJ2luZm8udXNlcm5hbWUnIC0+ICd1c2VybmFtZScpXG4gKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0RmllbGROYW1lID0gKHByZWZpeGVkTmFtZTogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcGFydHMgPSBwcmVmaXhlZE5hbWUuc3BsaXQoXCIuXCIpO1xuICByZXR1cm4gcGFydHMubGVuZ3RoID4gMSA/IHBhcnRzLnNsaWNlKDEpLmpvaW4oXCIuXCIpIDogcHJlZml4ZWROYW1lO1xufTtcblxuLyoqXG4gKiBHZXRzIHRoZSBmdWxsIGZpZWxkIHBhdGggaW5jbHVkaW5nIHByZWZpeFxuICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGRQYXRoID0gKG5hbWU6IHN0cmluZywgcHJlZml4OiBzdHJpbmcgPSBcImluZm9cIik6IHN0cmluZyA9PiB7XG4gIGlmIChuYW1lLmluY2x1ZGVzKFwiLlwiKSkge1xuICAgIHJldHVybiBuYW1lO1xuICB9XG4gIHJldHVybiBgJHtwcmVmaXh9LiR7bmFtZX1gO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBuYW1lIGlzIGEgZmllbGQgbmFtZSAoc3RhcnRzIHdpdGggaW5mby4gb3IgZGF0YS4pXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpZWxkTmFtZSA9IChuYW1lOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIG5hbWUuc3RhcnRzV2l0aChcImluZm8uXCIpIHx8IG5hbWUuc3RhcnRzV2l0aChcImRhdGEuXCIpO1xufTtcblxuLyoqXG4gKiBDaGVja3MgaWYgYSBuYW1lIGlzIGEgZmlsZSBmaWVsZCBuYW1lXG4gKi9cbmV4cG9ydCBjb25zdCBpc0ZpbGVOYW1lID0gKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gbmFtZS5zdGFydHNXaXRoKFwiZmlsZS5cIik7XG59O1xuXG4vKipcbiAqIERlZXAgY29tcGFyaXNvbiBvZiB0d28gdmFsdWVzIGZvciBjaGFuZ2UgZGV0ZWN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBpc1ZhbHVlRXF1YWwgPSAoYTogdW5rbm93biwgYjogdW5rbm93bik6IGJvb2xlYW4gPT4ge1xuICAvLyBIYW5kbGUgbnVsbC91bmRlZmluZWRcbiAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xuICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgcmV0dXJuIGEgPT0gYjtcblxuICAvLyBIYW5kbGUgYXJyYXlzXG4gIGlmIChBcnJheS5pc0FycmF5KGEpICYmIEFycmF5LmlzQXJyYXkoYikpIHtcbiAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgcmV0dXJuIGEuZXZlcnkoKHZhbCwgaWR4KSA9PiBpc1ZhbHVlRXF1YWwodmFsLCBiW2lkeF0pKTtcbiAgfVxuXG4gIC8vIEhhbmRsZSBvYmplY3RzXG4gIGlmICh0eXBlb2YgYSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgYiA9PT0gXCJvYmplY3RcIikge1xuICAgIGNvbnN0IGtleXNBID0gT2JqZWN0LmtleXMoYSBhcyBvYmplY3QpO1xuICAgIGNvbnN0IGtleXNCID0gT2JqZWN0LmtleXMoYiBhcyBvYmplY3QpO1xuICAgIGlmIChrZXlzQS5sZW5ndGggIT09IGtleXNCLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBrZXlzQS5ldmVyeSgoa2V5KSA9PlxuICAgICAgaXNWYWx1ZUVxdWFsKFxuICAgICAgICAoYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSxcbiAgICAgICAgKGIgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2tleV0sXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICAvLyBIYW5kbGUgcHJpbWl0aXZlcyAod2l0aCB0eXBlIGNvZXJjaW9uIGZvciBzdHJpbmcvbnVtYmVyIGNvbXBhcmlzb24pXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBlcWVxZXFcbiAgcmV0dXJuIGEgPT0gYjtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGZvcm0gZGF0YSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAqL1xuZXhwb3J0IGNvbnN0IGhhc0RhdGFDaGFuZ2VkID0gKFxuICBpbml0aWFsOiBGb3JtRGF0YSxcbiAgY3VycmVudDogRm9ybURhdGEsXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgYWxsS2V5cyA9IG5ldyBTZXQoWy4uLk9iamVjdC5rZXlzKGluaXRpYWwpLCAuLi5PYmplY3Qua2V5cyhjdXJyZW50KV0pO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIGFsbEtleXMpIHtcbiAgICBpZiAoIWlzVmFsdWVFcXVhbChpbml0aWFsW2tleV0sIGN1cnJlbnRba2V5XSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogR2V0cyBvbmx5IHRoZSBtb2RpZmllZCBmaWVsZHMgYmV0d2VlbiBpbml0aWFsIGFuZCBjdXJyZW50IGRhdGFcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1vZGlmaWVkRmllbGRzID0gKFxuICBpbml0aWFsOiBGb3JtRGF0YSxcbiAgY3VycmVudDogRm9ybURhdGEsXG4pOiBGb3JtRGF0YSA9PiB7XG4gIGNvbnN0IG1vZGlmaWVkOiBGb3JtRGF0YSA9IHt9O1xuICBjb25zdCBhbGxLZXlzID0gbmV3IFNldChbLi4uT2JqZWN0LmtleXMoaW5pdGlhbCksIC4uLk9iamVjdC5rZXlzKGN1cnJlbnQpXSk7XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgYWxsS2V5cykge1xuICAgIGlmICghaXNWYWx1ZUVxdWFsKGluaXRpYWxba2V5XSwgY3VycmVudFtrZXldKSkge1xuICAgICAgbW9kaWZpZWRba2V5XSA9IGN1cnJlbnRba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbW9kaWZpZWQ7XG59O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2ZpZWxkcy50c1xuXG4vKipcbiAqIEZpZWxkcyBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogRXh0cmFjdHMgZmllbGRzIGZyb20gbGF5b3V0IGFuZCBtYW5hZ2VzIHRoZSBmaWVsZCByZWdpc3RyeVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1GaWVsZCxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIEZpZWxkVmFsdWUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNGaWVsZE5hbWUsIGlzRmlsZU5hbWUsIGV4dHJhY3RGaWVsZE5hbWUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIG9iamVjdCBpcyBhIHZhbGlkIGZvcm0gZmllbGQgY29tcG9uZW50XG4gKiBBIGZvcm0gZmllbGQgbXVzdCBoYXZlIGF0IGxlYXN0IGdldFZhbHVlIG9yIHNldFZhbHVlIG1ldGhvZFxuICovXG5jb25zdCBpc0Zvcm1GaWVsZCA9IChvYmo6IHVua25vd24pOiBvYmogaXMgRm9ybUZpZWxkID0+IHtcbiAgaWYgKCFvYmogfHwgdHlwZW9mIG9iaiAhPT0gXCJvYmplY3RcIikgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGNhbmRpZGF0ZSA9IG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBNdXN0IGhhdmUgZWxlbWVudCBwcm9wZXJ0eVxuICBpZiAoIWNhbmRpZGF0ZS5lbGVtZW50IHx8ICEoY2FuZGlkYXRlLmVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBNdXN0IGhhdmUgZ2V0VmFsdWUgb3Igc2V0VmFsdWVcbiAgcmV0dXJuIChcbiAgICB0eXBlb2YgY2FuZGlkYXRlLmdldFZhbHVlID09PSBcImZ1bmN0aW9uXCIgfHxcbiAgICB0eXBlb2YgY2FuZGlkYXRlLnNldFZhbHVlID09PSBcImZ1bmN0aW9uXCJcbiAgKTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgdmFsdWUgZnJvbSBhIGZpZWxkIGNvbXBvbmVudFxuICogQWxsIG10cmwgY29tcG9uZW50cyBub3cgaGF2ZSB1bmlmaWVkIGdldFZhbHVlKCkgQVBJOlxuICogLSBUZXh0ZmllbGQ6IHJldHVybnMgc3RyaW5nXG4gKiAtIFNlbGVjdDogcmV0dXJucyBzdHJpbmcgb3Igc3RyaW5nW11cbiAqIC0gQ2hpcHM6IHJldHVybnMgc3RyaW5nW11cbiAqIC0gU3dpdGNoL0NoZWNrYm94OiByZXR1cm5zIGJvb2xlYW4gKHVwZGF0ZWQgaW4gbXRybCBjb3JlKVxuICovXG5leHBvcnQgY29uc3QgZ2V0RmllbGRWYWx1ZSA9IChmaWVsZDogRm9ybUZpZWxkKTogRmllbGRWYWx1ZSA9PiB7XG4gIGlmICh0eXBlb2YgZmllbGQuZ2V0VmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiBmaWVsZC5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgLy8gRmFsbGJhY2s6IGNoZWNrIGZvciB2YWx1ZSBwcm9wZXJ0eVxuICBjb25zdCBmaWVsZEFueSA9IGZpZWxkIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGlmIChcInZhbHVlXCIgaW4gZmllbGRBbnkpIHtcbiAgICByZXR1cm4gZmllbGRBbnkudmFsdWUgYXMgRmllbGRWYWx1ZTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFNldHMgdGhlIHZhbHVlIG9uIGEgZmllbGQgY29tcG9uZW50XG4gKiBBbGwgbXRybCBjb21wb25lbnRzIG5vdyBoYXZlIHVuaWZpZWQgc2V0VmFsdWUoKSBBUEk6XG4gKiAtIFRleHRmaWVsZDogYWNjZXB0cyBzdHJpbmdcbiAqIC0gU2VsZWN0OiBhY2NlcHRzIHN0cmluZyBvciBzdHJpbmdbXVxuICogLSBDaGlwczogYWNjZXB0cyBzdHJpbmdbXVxuICogLSBTd2l0Y2gvQ2hlY2tib3g6IGFjY2VwdHMgYm9vbGVhbiBvciBzdHJpbmcgKFwidHJ1ZVwiL1wiZmFsc2VcIikgKHVwZGF0ZWQgaW4gbXRybCBjb3JlKVxuICpcbiAqIEZvciBzaWxlbnQgdXBkYXRlcyAobm8gY2hhbmdlIGV2ZW50cyksIHdlIHNldCBkaXJlY3RseSBvbiB0aGUgaW5wdXQgZWxlbWVudFxuICovXG5leHBvcnQgY29uc3Qgc2V0RmllbGRWYWx1ZSA9IChcbiAgZmllbGQ6IEZvcm1GaWVsZCxcbiAgdmFsdWU6IEZpZWxkVmFsdWUsXG4gIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlLFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGZpZWxkQW55ID0gZmllbGQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgc2VsZWN0IGNvbXBvbmVudCAoaGFzIHRleHRmaWVsZCBwcm9wZXJ0eSlcbiAgLy8gU2VsZWN0IGNvbXBvbmVudHMgbXVzdCBhbHdheXMgdXNlIHNldFZhbHVlIHRvIHVwZGF0ZSBpbnRlcm5hbCBzdGF0ZVxuICBjb25zdCBpc1NlbGVjdENvbXBvbmVudCA9IFwidGV4dGZpZWxkXCIgaW4gZmllbGRBbnkgJiYgXCJtZW51XCIgaW4gZmllbGRBbnk7XG5cbiAgaWYgKHNpbGVudCAmJiAhaXNTZWxlY3RDb21wb25lbnQpIHtcbiAgICAvLyBTaWxlbnQgdXBkYXRlOiBzZXQgZGlyZWN0bHkgb24gaW5wdXQgdG8gYXZvaWQgdHJpZ2dlcmluZyBjaGFuZ2UgZXZlbnRzXG4gICAgLy8gU2tpcCB0aGlzIGZvciBzZWxlY3QgY29tcG9uZW50cyAtIHRoZXkgbmVlZCBzZXRWYWx1ZSB0byB1cGRhdGUgaW50ZXJuYWwgc3RhdGVcbiAgICBjb25zdCBpbnB1dCA9IGZpZWxkQW55LmlucHV0IGFzXG4gICAgICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgICAgIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgaWYgKGlucHV0KSB7XG4gICAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgY2hlY2tib3gvc3dpdGNoIChoYXMgY2hlY2tlZCBwcm9wZXJ0eSlcbiAgICAgIC8vIE5lZWQgdG8gbmFycm93IHR5cGUgdG8gSFRNTElucHV0RWxlbWVudCBiZWZvcmUgYWNjZXNzaW5nIGNoZWNrZWRcbiAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiYgaW5wdXQudHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgIGNvbnN0IHNob3VsZEJlQ2hlY2tlZCA9XG4gICAgICAgICAgdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IFwidHJ1ZVwiIHx8IHZhbHVlID09PSAxO1xuICAgICAgICBpbnB1dC5jaGVja2VkID0gc2hvdWxkQmVDaGVja2VkO1xuICAgICAgICAvLyBVcGRhdGUgdmlzdWFsIHN0YXRlIGJ5IHRvZ2dsaW5nIHRoZSBjaGVja2VkIGNsYXNzXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaWVsZEFueS5lbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpO1xuICAgICAgICAgIGNvbnN0IGJhc2VDbGFzcyA9IGNsYXNzTGlzdC5maW5kKFxuICAgICAgICAgICAgKGMpID0+IGMuc3RhcnRzV2l0aChcIm10cmwtXCIpICYmICFjLmluY2x1ZGVzKFwiLS1cIiksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoYmFzZUNsYXNzKSB7XG4gICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUoYCR7YmFzZUNsYXNzfS0tY2hlY2tlZGAsIHNob3VsZEJlQ2hlY2tlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBUZXh0IGlucHV0IC0gc2V0IHZhbHVlIGRpcmVjdGx5XG4gICAgICAgIGlucHV0LnZhbHVlID0gKHZhbHVlIGFzIHN0cmluZykgPz8gXCJcIjtcbiAgICAgICAgLy8gVXBkYXRlIHZpc3VhbCBzdGF0ZSAtIHRvZ2dsZSAtLWVtcHR5IGNsYXNzIGJhc2VkIG9uIHZhbHVlXG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSBmaWVsZEFueS5lbGVtZW50IGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IEFycmF5LmZyb20oZWxlbWVudC5jbGFzc0xpc3QpO1xuICAgICAgICAgIGNvbnN0IGJhc2VDbGFzcyA9IGNsYXNzTGlzdC5maW5kKFxuICAgICAgICAgICAgKGMpID0+IGMuc3RhcnRzV2l0aChcIm10cmwtXCIpICYmICFjLmluY2x1ZGVzKFwiLS1cIiksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoYmFzZUNsYXNzKSB7XG4gICAgICAgICAgICBjb25zdCBpc0VtcHR5ID0gIWlucHV0LnZhbHVlO1xuICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlKGAke2Jhc2VDbGFzc30tLWVtcHR5YCwgaXNFbXB0eSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZvciBjb21wb25lbnRzIHdpdGhvdXQgaW5wdXQgKGxpa2UgY2hpcHMsIHNlbGVjdCksIGZhbGwgdGhyb3VnaCB0byBzZXRWYWx1ZVxuICAgIC8vIGJ1dCBzdGlsbCB1c2Ugc2lsZW50IG1vZGUgYmVoYXZpb3IgKG5vIGV2ZW50cyB0cmlnZ2VyZWQpXG4gIH1cblxuICAvLyBOb3JtYWwgdXBkYXRlOiB1c2UgY29tcG9uZW50J3Mgc2V0VmFsdWUgbWV0aG9kXG4gIGlmICh0eXBlb2YgZmllbGQuc2V0VmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGZpZWxkLnNldFZhbHVlKHZhbHVlKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBGYWxsYmFjazogc2V0IHZhbHVlIHByb3BlcnR5IGRpcmVjdGx5XG4gIGlmIChcInZhbHVlXCIgaW4gZmllbGRBbnkpIHtcbiAgICBmaWVsZEFueS52YWx1ZSA9IHZhbHVlO1xuICB9XG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIGZpZWxkcyBmcm9tIHRoZSBVSSBjb21wb25lbnQgcmVnaXN0cnlcbiAqIExvb2tzIGZvciBjb21wb25lbnRzIHdpdGggbmFtZXMgc3RhcnRpbmcgd2l0aCAnaW5mby4nIG9yICdkYXRhLidcbiAqL1xuY29uc3QgZXh0cmFjdEZpZWxkcyA9IChcbiAgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb25maWc6IEZvcm1Db25maWcsXG4pOiB7IGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7IGZpbGVzOiBGb3JtRmllbGRSZWdpc3RyeSB9ID0+IHtcbiAgY29uc3QgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeSA9IG5ldyBNYXAoKTtcbiAgY29uc3QgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5ID0gbmV3IE1hcCgpO1xuXG4gIGlmICghdWkpIHJldHVybiB7IGZpZWxkcywgZmlsZXMgfTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBjb21wb25lbnRdIG9mIE9iamVjdC5lbnRyaWVzKHVpKSkge1xuICAgIC8vIFNraXAgbm9uLWZpZWxkIGNvbXBvbmVudHNcbiAgICBpZiAoIWlzRm9ybUZpZWxkKGNvbXBvbmVudCkpIGNvbnRpbnVlO1xuXG4gICAgaWYgKGlzRmllbGROYW1lKG5hbWUpKSB7XG4gICAgICAvLyBFeHRyYWN0IGZpZWxkIG5hbWUgd2l0aG91dCBwcmVmaXggKGluZm8udXNlcm5hbWUgLT4gdXNlcm5hbWUpXG4gICAgICBjb25zdCBmaWVsZE5hbWUgPSBleHRyYWN0RmllbGROYW1lKG5hbWUpO1xuICAgICAgZmllbGRzLnNldChmaWVsZE5hbWUsIGNvbXBvbmVudCk7XG4gICAgfSBlbHNlIGlmIChpc0ZpbGVOYW1lKG5hbWUpKSB7XG4gICAgICAvLyBFeHRyYWN0IGZpbGUgbmFtZSB3aXRob3V0IHByZWZpeCAoZmlsZS5hdmF0YXIgLT4gYXZhdGFyKVxuICAgICAgY29uc3QgZmlsZU5hbWUgPSBleHRyYWN0RmllbGROYW1lKG5hbWUpO1xuICAgICAgZmlsZXMuc2V0KGZpbGVOYW1lLCBjb21wb25lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGZpZWxkcywgZmlsZXMgfTtcbn07XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIGZpZWxkIHZhbHVlcyBmb3IgZXF1YWxpdHlcbiAqIEhhbmRsZXMgYXJyYXlzIChmb3IgY2hpcHMvbXVsdGktc2VsZWN0KSBhbmQgcHJpbWl0aXZlIHZhbHVlc1xuICovXG5jb25zdCB2YWx1ZXNFcXVhbCA9IChhOiBGaWVsZFZhbHVlLCBiOiBGaWVsZFZhbHVlKTogYm9vbGVhbiA9PiB7XG4gIC8vIEhhbmRsZSBudWxsL3VuZGVmaW5lZFxuICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7XG4gIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgLy8gSGFuZGxlIGFycmF5cyAoY2hpcHMsIG11bHRpLXNlbGVjdClcbiAgaWYgKEFycmF5LmlzQXJyYXkoYSkgJiYgQXJyYXkuaXNBcnJheShiKSkge1xuICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gYS5ldmVyeSgodmFsLCBpKSA9PiB2YWwgPT09IGJbaV0pO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLyoqXG4gKiBCaW5kcyBjaGFuZ2UgYW5kIGlucHV0IGV2ZW50cyB0byBmaWVsZHNcbiAqIENhbGxzIHRoZSBwcm92aWRlZCBjYWxsYmFjayB3aGVuIGFueSBmaWVsZCBjaGFuZ2VzXG4gKlxuICogTGlzdGVucyB0byBib3RoICdpbnB1dCcgKGZvciBpbW1lZGlhdGUgZmVlZGJhY2sgd2hpbGUgdHlwaW5nKVxuICogYW5kICdjaGFuZ2UnIChmb3IgY29tcG9uZW50cyB0aGF0IG9ubHkgZW1pdCBvbiBibHVyL3NlbGVjdGlvbilcbiAqXG4gKiBEZWR1cGxpY2F0ZXMgZXZlbnRzIHRvIHByZXZlbnQgZG91YmxlLWZpcmluZyB3aGVuIGJvdGggaW5wdXQgYW5kIGNoYW5nZVxuICogZW1pdCBmb3IgdGhlIHNhbWUgdmFsdWUgKGUuZy4sIHRleHRmaWVsZCBpbnB1dCBmb2xsb3dlZCBieSBibHVyKVxuICovXG4vKipcbiAqIFRyYWNrcyBsYXN0IGVtaXR0ZWQgdmFsdWVzIHBlciBmaWVsZCBmb3IgZGVkdXBsaWNhdGlvblxuICogRXhwb3NlZCBzbyB0aGF0IHNldERhdGEgY2FuIHVwZGF0ZSBpdCB3aGVuIHNldHRpbmcgdmFsdWVzIHNpbGVudGx5XG4gKi9cbmxldCBmaWVsZFZhbHVlVHJhY2tlcjogTWFwPHN0cmluZywgRmllbGRWYWx1ZT4gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBVcGRhdGVzIHRoZSB0cmFja2VkIHZhbHVlIGZvciBhIGZpZWxkXG4gKiBDYWxsZWQgd2hlbiBzZXREYXRhIGlzIHVzZWQgd2l0aCBzaWxlbnQ9dHJ1ZSB0byBrZWVwIGRlZHVwbGljYXRpb24gaW4gc3luY1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlVHJhY2tlZEZpZWxkVmFsdWUgPSAoXG4gIG5hbWU6IHN0cmluZyxcbiAgdmFsdWU6IEZpZWxkVmFsdWUsXG4pOiB2b2lkID0+IHtcbiAgaWYgKGZpZWxkVmFsdWVUcmFja2VyKSB7XG4gICAgZmllbGRWYWx1ZVRyYWNrZXIuc2V0KG5hbWUsIHZhbHVlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBVcGRhdGVzIGFsbCB0cmFja2VkIGZpZWxkIHZhbHVlcyBmcm9tIGEgZmllbGRzIHJlZ2lzdHJ5XG4gKiBDYWxsZWQgYWZ0ZXIgc2lsZW50IHNldERhdGEgdG8gc3luYyBkZWR1cGxpY2F0aW9uIHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCBzeW5jVHJhY2tlZEZpZWxkVmFsdWVzID0gKGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnkpOiB2b2lkID0+IHtcbiAgaWYgKGZpZWxkVmFsdWVUcmFja2VyKSB7XG4gICAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgICAgZmllbGRWYWx1ZVRyYWNrZXIuc2V0KG5hbWUsIGdldEZpZWxkVmFsdWUoZmllbGQpKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmVzZXRzIHRoZSBmaWVsZCB2YWx1ZSB0cmFja2VyIGZvciBhIG5ldyBmb3JtXG4gKiBTaG91bGQgYmUgY2FsbGVkIGF0IHRoZSBzdGFydCBvZiB3aXRoRmllbGRzIGJlZm9yZSBiaW5kRmllbGRFdmVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0RmllbGRWYWx1ZVRyYWNrZXIgPSAoKTogdm9pZCA9PiB7XG4gIGZpZWxkVmFsdWVUcmFja2VyID0gbmV3IE1hcDxzdHJpbmcsIEZpZWxkVmFsdWU+KCk7XG59O1xuXG5jb25zdCBiaW5kRmllbGRFdmVudHMgPSAoXG4gIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnksXG4gIG9uRmllbGRDaGFuZ2U6IChuYW1lOiBzdHJpbmcsIHZhbHVlOiBGaWVsZFZhbHVlKSA9PiB2b2lkLFxuKTogdm9pZCA9PiB7XG4gIC8vIFVzZSB0aGUgc2hhcmVkIHRyYWNrZXIgKHNob3VsZCBiZSBpbml0aWFsaXplZCBieSByZXNldEZpZWxkVmFsdWVUcmFja2VyIGJlZm9yZSB0aGlzKVxuICBpZiAoIWZpZWxkVmFsdWVUcmFja2VyKSB7XG4gICAgZmllbGRWYWx1ZVRyYWNrZXIgPSBuZXcgTWFwPHN0cmluZywgRmllbGRWYWx1ZT4oKTtcbiAgfVxuXG4gIGNvbnN0IGxhc3RFbWl0dGVkVmFsdWVzID0gZmllbGRWYWx1ZVRyYWNrZXI7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIGlmICh0eXBlb2YgZmllbGQub24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgLy8gSW5pdGlhbGl6ZSB3aXRoIGN1cnJlbnQgdmFsdWVcbiAgICAgIGxhc3RFbWl0dGVkVmFsdWVzLnNldChuYW1lLCBnZXRGaWVsZFZhbHVlKGZpZWxkKSk7XG5cbiAgICAgIC8vIEhhbmRsZXIgdGhhdCBkZWR1cGVzIGJhc2VkIG9uIHZhbHVlXG4gICAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0RmllbGRWYWx1ZShmaWVsZCk7XG4gICAgICAgIGNvbnN0IGxhc3RWYWx1ZSA9IGxhc3RFbWl0dGVkVmFsdWVzLmdldChuYW1lKTtcblxuICAgICAgICAvLyBPbmx5IGVtaXQgaWYgdmFsdWUgYWN0dWFsbHkgY2hhbmdlZFxuICAgICAgICBpZiAoIXZhbHVlc0VxdWFsKHZhbHVlLCBsYXN0VmFsdWUpKSB7XG4gICAgICAgICAgbGFzdEVtaXR0ZWRWYWx1ZXMuc2V0KG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICBvbkZpZWxkQ2hhbmdlKG5hbWUsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gTGlzdGVuIHRvICdpbnB1dCcgZm9yIGltbWVkaWF0ZSBmZWVkYmFjayAodGV4dGZpZWxkcyBlbWl0IHRoaXMgb24gZXZlcnkga2V5c3Ryb2tlKVxuICAgICAgZmllbGQub24oXCJpbnB1dFwiLCBoYW5kbGVDaGFuZ2UpO1xuXG4gICAgICAvLyBBbHNvIGxpc3RlbiB0byAnY2hhbmdlJyBmb3IgY29tcG9uZW50cyB0aGF0IG9ubHkgZW1pdCBvbiBibHVyL3NlbGVjdGlvblxuICAgICAgLy8gKGUuZy4sIHNlbGVjdCwgY2hpcHMsIHN3aXRjaClcbiAgICAgIGZpZWxkLm9uKFwiY2hhbmdlXCIsIGhhbmRsZUNoYW5nZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIHdpdGhGaWVsZHMgZmVhdHVyZVxuICogQWRkcyBmaWVsZCBleHRyYWN0aW9uIGFuZCByZWdpc3RyeSBtYW5hZ2VtZW50IHRvIHRoZSBmb3JtXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoRmllbGRzID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudD4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICAgIGdldEZpZWxkOiAobmFtZTogc3RyaW5nKSA9PiBGb3JtRmllbGQgfCB1bmRlZmluZWQ7XG4gICAgZ2V0RmllbGROYW1lczogKCkgPT4gc3RyaW5nW107XG4gICAgaGFzRmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XG4gIH0gPT4ge1xuICAgIC8vIEV4dHJhY3QgZmllbGRzIGZyb20gVUkgcmVnaXN0cnlcbiAgICBjb25zdCB7IGZpZWxkcywgZmlsZXMgfSA9IGV4dHJhY3RGaWVsZHMoY29tcG9uZW50LnVpIHx8IHt9LCBjb25maWcpO1xuXG4gICAgLy8gUmVzZXQgdHJhY2tlciBmb3IgdGhpcyBuZXcgZm9ybSBpbnN0YW5jZVxuICAgIC8vIFRoaXMgZW5zdXJlcyBlYWNoIGZvcm0gaGFzIGl0cyBvd24gdHJhY2tlciBhbmQgcHJldmVudHMgY3Jvc3MtZm9ybSBpbnRlcmZlcmVuY2VcbiAgICByZXNldEZpZWxkVmFsdWVUcmFja2VyKCk7XG5cbiAgICAvLyBCaW5kIGNoYW5nZSBldmVudHMgaWYgY29tcG9uZW50IGhhcyBlbWl0XG4gICAgaWYgKGNvbXBvbmVudC5lbWl0KSB7XG4gICAgICBiaW5kRmllbGRFdmVudHMoZmllbGRzLCAobmFtZSwgdmFsdWUpID0+IHtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihcImZpZWxkOmNoYW5nZVwiLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY2hhbmdlXCIsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxzbyBiaW5kIGNoYW5nZSBldmVudHMgdG8gZmlsZSBmaWVsZHNcbiAgICAgIGJpbmRGaWVsZEV2ZW50cyhmaWxlcywgKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oXCJmaWxlOmNoYW5nZVwiLCB7IG5hbWUsIHZhbHVlIH0pO1xuICAgICAgICBjb21wb25lbnQuZW1pdD8uKFwiY2hhbmdlXCIsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgZmllbGRzLFxuICAgICAgZmlsZXMsXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGEgZmllbGQgY29tcG9uZW50IGJ5IG5hbWVcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGQobmFtZTogc3RyaW5nKTogRm9ybUZpZWxkIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkcy5nZXQobmFtZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgZmllbGQgbmFtZXNcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGROYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGZpZWxkcy5rZXlzKCkpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBhIGZpZWxkIGV4aXN0c1xuICAgICAgICovXG4gICAgICBoYXNGaWVsZChuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGZpZWxkcy5oYXMobmFtZSk7XG4gICAgICB9LFxuICAgIH07XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoRmllbGRzO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL2RhdGEudHNcblxuLyoqXG4gKiBEYXRhIGZlYXR1cmUgZm9yIEZvcm0gY29tcG9uZW50XG4gKiBIYW5kbGVzIGZvcm0gZGF0YSBvcGVyYXRpb25zOiBnZXQvc2V0IGRhdGEsIGNoYW5nZSB0cmFja2luZywgc25hcHNob3RzLFxuICogYW5kIGNoYW5nZSBwcm90ZWN0aW9uIChiZWZvcmV1bmxvYWQgd2FybmluZywgZGF0YSBjb25mbGljdCBkZXRlY3Rpb24pXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIEZvcm1TdGF0ZSxcbiAgRmllbGRWYWx1ZSxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIFByb3RlY3RDaGFuZ2VzQ29uZmlnLFxuICBEYXRhQ29uZmxpY3RFdmVudCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBjcmVhdGVJbml0aWFsU3RhdGUsXG4gIGhhc0RhdGFDaGFuZ2VkLFxuICBnZXRNb2RpZmllZEZpZWxkcyxcbn0gZnJvbSBcIi4uL2NvbmZpZ1wiO1xuaW1wb3J0IHsgZ2V0RmllbGRWYWx1ZSwgc2V0RmllbGRWYWx1ZSwgc3luY1RyYWNrZWRGaWVsZFZhbHVlcyB9IGZyb20gXCIuL2ZpZWxkc1wiO1xuaW1wb3J0IHsgRk9STV9FVkVOVFMsIERBVEFfU1RBVEUgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQ29sbGVjdHMgY3VycmVudCB2YWx1ZXMgZnJvbSBhbGwgZmllbGRzXG4gKi9cbmNvbnN0IGNvbGxlY3RGaWVsZERhdGEgPSAoZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeSk6IEZvcm1EYXRhID0+IHtcbiAgY29uc3QgZGF0YTogRm9ybURhdGEgPSB7fTtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBmaWVsZF0gb2YgZmllbGRzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKGZpZWxkKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBkYXRhO1xufTtcblxuLyoqXG4gKiBTZXRzIHZhbHVlcyBvbiBmaWVsZHMgZnJvbSBhIGRhdGEgb2JqZWN0XG4gKiBTdXBwb3J0cyBkb3Qgbm90YXRpb24gZm9yIG5lc3RlZCB2YWx1ZXMgKGUuZy4sIHsgJ3VzZXIubmFtZSc6ICdKb2huJyB9KVxuICovXG5jb25zdCBzZXRGaWVsZHNEYXRhID0gKFxuICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBkYXRhOiBGb3JtRGF0YSxcbiAgc2lsZW50OiBib29sZWFuID0gZmFsc2UsXG4pOiB2b2lkID0+IHtcbiAgZm9yIChjb25zdCBbbmFtZSwgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIC8vIENoZWNrIGZvciBleGFjdCBtYXRjaCBmaXJzdFxuICAgIGlmIChuYW1lIGluIGRhdGEpIHtcbiAgICAgIHNldEZpZWxkVmFsdWUoZmllbGQsIGRhdGFbbmFtZV0sIHNpbGVudCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgbmVzdGVkIHZhbHVlIHVzaW5nIGRvdCBub3RhdGlvblxuICAgIC8vIGUuZy4sIGZpZWxkIG5hbWUgJ3VzZXJuYW1lJyBtaWdodCBiZSBpbiBkYXRhIGFzIG5lc3RlZCB7IGluZm86IHsgdXNlcm5hbWU6ICd2YWx1ZScgfSB9XG4gICAgY29uc3QgdmFsdWUgPSBnZXROZXN0ZWRWYWx1ZShkYXRhLCBuYW1lKTtcbiAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgc2V0RmllbGRWYWx1ZShmaWVsZCwgdmFsdWUgYXMgRmllbGRWYWx1ZSwgc2lsZW50KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2V0cyBhIG5lc3RlZCB2YWx1ZSBmcm9tIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb25cbiAqL1xuY29uc3QgZ2V0TmVzdGVkVmFsdWUgPSAoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBhdGg6IHN0cmluZyxcbik6IHVua25vd24gPT4ge1xuICBjb25zdCBwYXJ0cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICBsZXQgY3VycmVudDogdW5rbm93biA9IG9iajtcblxuICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICBpZiAoY3VycmVudCA9PT0gbnVsbCB8fCBjdXJyZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY3VycmVudCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY3VycmVudCA9IChjdXJyZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtwYXJ0XTtcbiAgfVxuXG4gIHJldHVybiBjdXJyZW50O1xufTtcblxuLyoqXG4gKiBTZXRzIGEgbmVzdGVkIHZhbHVlIGluIGFuIG9iamVjdCB1c2luZyBkb3Qgbm90YXRpb25cbiAqL1xuY29uc3Qgc2V0TmVzdGVkVmFsdWUgPSAoXG4gIG9iajogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHBhdGg6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4pOiB2b2lkID0+IHtcbiAgY29uc3QgcGFydHMgPSBwYXRoLnNwbGl0KFwiLlwiKTtcbiAgbGV0IGN1cnJlbnQgPSBvYmo7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHtcbiAgICBjb25zdCBwYXJ0ID0gcGFydHNbaV07XG4gICAgaWYgKCEocGFydCBpbiBjdXJyZW50KSB8fCB0eXBlb2YgY3VycmVudFtwYXJ0XSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgY3VycmVudFtwYXJ0XSA9IHt9O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudFtwYXJ0XSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIGN1cnJlbnRbcGFydHNbcGFydHMubGVuZ3RoIC0gMV1dID0gdmFsdWU7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGZsYXQgZmllbGQgZGF0YSB0byBuZXN0ZWQgb2JqZWN0IHN0cnVjdHVyZVxuICogZS5nLiwgeyAndXNlci5uYW1lJzogJ0pvaG4nIH0gLT4geyB1c2VyOiB7IG5hbWU6ICdKb2huJyB9IH1cbiAqL1xuY29uc3QgZmxhdFRvTmVzdGVkID0gKGRhdGE6IEZvcm1EYXRhKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGF0YSkpIHtcbiAgICBpZiAoa2V5LmluY2x1ZGVzKFwiLlwiKSkge1xuICAgICAgc2V0TmVzdGVkVmFsdWUocmVzdWx0LCBrZXksIHZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0W2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBOb3JtYWxpemVzIHByb3RlY3Rpb24gY29uZmlnIHRvIGEgY29uc2lzdGVudCBvYmplY3QgZm9ybWF0XG4gKi9cbmNvbnN0IG5vcm1hbGl6ZVByb3RlY3RDb25maWcgPSAoXG4gIGNvbmZpZzogYm9vbGVhbiB8IFByb3RlY3RDaGFuZ2VzQ29uZmlnIHwgdW5kZWZpbmVkLFxuKTogUHJvdGVjdENoYW5nZXNDb25maWcgPT4ge1xuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiB7IGJlZm9yZVVubG9hZDogZmFsc2UsIG9uRGF0YU92ZXJ3cml0ZTogZmFsc2UgfTtcbiAgfVxuICBpZiAoY29uZmlnID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHsgYmVmb3JlVW5sb2FkOiB0cnVlLCBvbkRhdGFPdmVyd3JpdGU6IHRydWUgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGJlZm9yZVVubG9hZDogY29uZmlnLmJlZm9yZVVubG9hZCA/PyBmYWxzZSxcbiAgICBvbkRhdGFPdmVyd3JpdGU6IGNvbmZpZy5vbkRhdGFPdmVyd3JpdGUgPz8gZmFsc2UsXG4gIH07XG59O1xuXG4vKipcbiAqIHdpdGhEYXRhIGZlYXR1cmVcbiAqIEFkZHMgZGF0YSBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcyB0byB0aGUgZm9ybVxuICovXG5leHBvcnQgY29uc3Qgd2l0aERhdGEgPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8XG4gICAgVCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50ICYge1xuICAgICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgfSxcbiAgPihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7XG4gICAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgICBnZXREYXRhOiAoKSA9PiBGb3JtRGF0YTtcbiAgICBzZXREYXRhOiAoZGF0YTogRm9ybURhdGEsIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gICAgZ2V0RmllbGRWYWx1ZTogKG5hbWU6IHN0cmluZykgPT4gRmllbGRWYWx1ZTtcbiAgICBzZXRGaWVsZFZhbHVlOiAobmFtZTogc3RyaW5nLCB2YWx1ZTogRmllbGRWYWx1ZSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcbiAgICBpc01vZGlmaWVkOiAoKSA9PiBib29sZWFuO1xuICAgIGdldE1vZGlmaWVkRGF0YTogKCkgPT4gRm9ybURhdGE7XG4gICAgc25hcHNob3Q6ICgpID0+IHZvaWQ7XG4gICAgcmVzZXQ6IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gICAgY2xlYXI6IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gIH0gPT4ge1xuICAgIC8vIEluaXRpYWxpemUgc3RhdGVcbiAgICBjb25zdCBzdGF0ZSA9IGNyZWF0ZUluaXRpYWxTdGF0ZShjb25maWcpO1xuXG4gICAgLy8gTm9ybWFsaXplIHByb3RlY3Rpb24gY29uZmlndXJhdGlvblxuICAgIGNvbnN0IHByb3RlY3RDb25maWcgPSBub3JtYWxpemVQcm90ZWN0Q29uZmlnKGNvbmZpZy5wcm90ZWN0Q2hhbmdlcyk7XG5cbiAgICAvLyBUcmFjayB0aGUgYmVmb3JldW5sb2FkIGhhbmRsZXIgc28gd2UgY2FuIHJlbW92ZSBpdFxuICAgIGxldCBiZWZvcmVVbmxvYWRIYW5kbGVyOiAoKGU6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB2b2lkKSB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQmVmb3JldW5sb2FkIGhhbmRsZXIgLSB3YXJucyB1c2VyIHdoZW4gbGVhdmluZyB3aXRoIHVuc2F2ZWQgY2hhbmdlc1xuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZUJlZm9yZVVubG9hZCA9IChlOiBCZWZvcmVVbmxvYWRFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHN0YXRlLm1vZGlmaWVkKSB7XG4gICAgICAgIC8vIFN0YW5kYXJkIHdheSB0byB0cmlnZ2VyIHRoZSBicm93c2VyJ3MgXCJ1bnNhdmVkIGNoYW5nZXNcIiBkaWFsb2dcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAvLyBGb3Igb2xkZXIgYnJvd3NlcnMgLSByZXR1cm5WYWx1ZSBtdXN0IGJlIHNldFxuICAgICAgICBlLnJldHVyblZhbHVlID0gXCJcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVnaXN0ZXJzIHRoZSBiZWZvcmV1bmxvYWQgaGFuZGxlciBpZiBwcm90ZWN0aW9uIGlzIGVuYWJsZWRcbiAgICAgKi9cbiAgICBjb25zdCByZWdpc3RlckJlZm9yZVVubG9hZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChwcm90ZWN0Q29uZmlnLmJlZm9yZVVubG9hZCAmJiAhYmVmb3JlVW5sb2FkSGFuZGxlcikge1xuICAgICAgICBiZWZvcmVVbmxvYWRIYW5kbGVyID0gaGFuZGxlQmVmb3JlVW5sb2FkO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJlZm9yZXVubG9hZFwiLCBiZWZvcmVVbmxvYWRIYW5kbGVyKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVW5yZWdpc3RlcnMgdGhlIGJlZm9yZXVubG9hZCBoYW5kbGVyXG4gICAgICovXG4gICAgY29uc3QgdW5yZWdpc3RlckJlZm9yZVVubG9hZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChiZWZvcmVVbmxvYWRIYW5kbGVyKSB7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmVmb3JldW5sb2FkXCIsIGJlZm9yZVVubG9hZEhhbmRsZXIpO1xuICAgICAgICBiZWZvcmVVbmxvYWRIYW5kbGVyID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlcyBiZWZvcmV1bmxvYWQgcmVnaXN0cmF0aW9uIGJhc2VkIG9uIG1vZGlmaWVkIHN0YXRlXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUgPSAobW9kaWZpZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgIGlmIChwcm90ZWN0Q29uZmlnLmJlZm9yZVVubG9hZCkge1xuICAgICAgICBpZiAobW9kaWZpZWQpIHtcbiAgICAgICAgICByZWdpc3RlckJlZm9yZVVubG9hZCgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGtlZXAgdGhlIGhhbmRsZXIgcmVnaXN0ZXJlZCBidXQgaXQgb25seSBwcmV2ZW50cyB1bmxvYWQgd2hlbiBtb2RpZmllZFxuICAgICAgICAvLyBUaGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gY29uc3RhbnRseSBhZGRpbmcvcmVtb3ZpbmcgdGhlIGxpc3RlbmVyXG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIElmIGluaXRpYWwgZGF0YSB3YXMgcHJvdmlkZWQsIHNldCBpdCBvbiBmaWVsZHNcbiAgICBpZiAoY29uZmlnLmRhdGEgJiYgY29tcG9uZW50LmZpZWxkcykge1xuICAgICAgc2V0RmllbGRzRGF0YShjb21wb25lbnQuZmllbGRzLCBjb25maWcuZGF0YSwgdHJ1ZSk7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICBzdGF0ZS5pbml0aWFsRGF0YSA9IHsgLi4uc3RhdGUuY3VycmVudERhdGEgfTtcbiAgICAgIC8vIFN5bmMgdGhlIGZpZWxkIHZhbHVlIHRyYWNrZXIgZm9yIGV2ZW50IGRlZHVwbGljYXRpb25cbiAgICAgIC8vIFRoaXMgZW5zdXJlcyBjaGFuZ2UgZGV0ZWN0aW9uIHdvcmtzIGNvcnJlY3RseSB3aGVuIGZpZWxkcyBhcmUgbW9kaWZpZWRcbiAgICAgIHN5bmNUcmFja2VkRmllbGRWYWx1ZXMoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBiZWZvcmV1bmxvYWQgcHJvdGVjdGlvbiBpZiBlbmFibGVkXG4gICAgaWYgKHByb3RlY3RDb25maWcuYmVmb3JlVW5sb2FkKSB7XG4gICAgICByZWdpc3RlckJlZm9yZVVubG9hZCgpO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZXIgZm9yIGZpZWxkL2ZpbGUgY2hhbmdlcyB0byB1cGRhdGUgc3RhdGVcbiAgICBjb25zdCBoYW5kbGVDaGFuZ2UgPSAoZXZlbnQ6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogRmllbGRWYWx1ZSB9KSA9PiB7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YVtldmVudC5uYW1lXSA9IGV2ZW50LnZhbHVlO1xuICAgICAgY29uc3Qgd2FzTW9kaWZpZWQgPSBzdGF0ZS5tb2RpZmllZDtcbiAgICAgIHN0YXRlLm1vZGlmaWVkID0gaGFzRGF0YUNoYW5nZWQoc3RhdGUuaW5pdGlhbERhdGEsIHN0YXRlLmN1cnJlbnREYXRhKTtcblxuICAgICAgLy8gVXBkYXRlIGJlZm9yZXVubG9hZCBzdGF0ZSB3aGVuIG1vZGlmaWVkIGNoYW5nZXNcbiAgICAgIGlmICh3YXNNb2RpZmllZCAhPT0gc3RhdGUubW9kaWZpZWQpIHtcbiAgICAgICAgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUoc3RhdGUubW9kaWZpZWQpO1xuICAgICAgfVxuXG4gICAgICAvLyBFbWl0IHN0YXRlOmNoYW5nZSBldmVudCB3aGVuIG1vZGlmaWVkIHN0YXRlIGNoYW5nZXNcbiAgICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBjb250cm9sbGVyIHRvIGVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzIGFjY29yZGluZ2x5XG4gICAgICBpZiAod2FzTW9kaWZpZWQgIT09IHN0YXRlLm1vZGlmaWVkKSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLCB7XG4gICAgICAgICAgbW9kaWZpZWQ6IHN0YXRlLm1vZGlmaWVkLFxuICAgICAgICAgIHN0YXRlOiBzdGF0ZS5tb2RpZmllZCA/IERBVEFfU1RBVEUuRElSVFkgOiBEQVRBX1NUQVRFLlBSSVNUSU5FLFxuICAgICAgICAgIG5hbWU6IGV2ZW50Lm5hbWUsXG4gICAgICAgICAgdmFsdWU6IGV2ZW50LnZhbHVlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIGZvciBmaWVsZCBjaGFuZ2VzIHRvIHVwZGF0ZSBzdGF0ZVxuICAgIGlmIChjb21wb25lbnQub24pIHtcbiAgICAgIGNvbXBvbmVudC5vbihcImZpZWxkOmNoYW5nZVwiLCBoYW5kbGVDaGFuZ2UpO1xuICAgICAgLy8gQWxzbyBsaXN0ZW4gZm9yIGZpbGUgY2hhbmdlc1xuICAgICAgY29tcG9uZW50Lm9uKFwiZmlsZTpjaGFuZ2VcIiwgaGFuZGxlQ2hhbmdlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBJbnRlcm5hbCBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBhY3R1YWwgc2V0RGF0YSBvcGVyYXRpb25cbiAgICAgKi9cbiAgICBjb25zdCBwZXJmb3JtU2V0RGF0YSA9IChkYXRhOiBGb3JtRGF0YSwgc2lsZW50OiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICBzZXRGaWVsZHNEYXRhKGNvbXBvbmVudC5maWVsZHMsIGRhdGEsIHNpbGVudCk7XG4gICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG5cbiAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgLy8gV2hlbiBzZXR0aW5nIGRhdGEgc2lsZW50bHksIGFsc28gdXBkYXRlIGluaXRpYWwgZGF0YSBzbmFwc2hvdFxuICAgICAgICAvLyBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHdoZW4gbG9hZGluZyBkYXRhIGZyb20gc2VydmVyXG4gICAgICAgIHN0YXRlLmluaXRpYWxEYXRhID0geyAuLi5zdGF0ZS5jdXJyZW50RGF0YSB9O1xuICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICAvLyBTeW5jIHRoZSBmaWVsZCB2YWx1ZSB0cmFja2VyIGZvciBldmVudCBkZWR1cGxpY2F0aW9uXG4gICAgICAgIHN5bmNUcmFja2VkRmllbGRWYWx1ZXMoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGUgc2luY2Ugd2UncmUgbm8gbG9uZ2VyIG1vZGlmaWVkXG4gICAgICAgIHVwZGF0ZUJlZm9yZVVubG9hZFN0YXRlKGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9TRVQsIHN0YXRlLmN1cnJlbnREYXRhKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgZnVuY3Rpb24gdG8gcGVyZm9ybSB0aGUgYWN0dWFsIHJlc2V0IG9wZXJhdGlvblxuICAgICAqL1xuICAgIGNvbnN0IHBlcmZvcm1SZXNldCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHNldEZpZWxkc0RhdGEoY29tcG9uZW50LmZpZWxkcywgc3RhdGUuaW5pdGlhbERhdGEsIHRydWUpO1xuICAgICAgc3RhdGUuY3VycmVudERhdGEgPSB7IC4uLnN0YXRlLmluaXRpYWxEYXRhIH07XG4gICAgICBzdGF0ZS5tb2RpZmllZCA9IGZhbHNlO1xuICAgICAgc3RhdGUuZXJyb3JzID0ge307XG4gICAgICAvLyBVcGRhdGUgYmVmb3JldW5sb2FkIHN0YXRlIHNpbmNlIHdlJ3JlIG5vIGxvbmdlciBtb2RpZmllZFxuICAgICAgdXBkYXRlQmVmb3JlVW5sb2FkU3RhdGUoZmFsc2UpO1xuICAgICAgLy8gRW1pdCBzdGF0ZTpjaGFuZ2Ugc28gcHJvdGVjdGlvbiBvdmVybGF5IGdldHMgcmVtb3ZlZFxuICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5TVEFURV9DSEFOR0UsIHtcbiAgICAgICAgbW9kaWZpZWQ6IGZhbHNlLFxuICAgICAgICBzdGF0ZTogREFUQV9TVEFURS5QUklTVElORSxcbiAgICAgIH0pO1xuICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5SRVNFVCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIGFjdHVhbCBjbGVhciBvcGVyYXRpb25cbiAgICAgKi9cbiAgICBjb25zdCBwZXJmb3JtQ2xlYXIgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBlbXB0eURhdGE6IEZvcm1EYXRhID0ge307XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgY29tcG9uZW50LmZpZWxkcy5rZXlzKCkpIHtcbiAgICAgICAgZW1wdHlEYXRhW25hbWVdID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHNldEZpZWxkc0RhdGEoY29tcG9uZW50LmZpZWxkcywgZW1wdHlEYXRhLCB0cnVlKTtcbiAgICAgIHN0YXRlLmN1cnJlbnREYXRhID0ge307XG4gICAgICBzdGF0ZS5pbml0aWFsRGF0YSA9IHt9O1xuICAgICAgc3RhdGUubW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGVcbiAgICAgIHVwZGF0ZUJlZm9yZVVubG9hZFN0YXRlKGZhbHNlKTtcbiAgICAgIC8vIEVtaXQgc3RhdGU6Y2hhbmdlIHNvIHByb3RlY3Rpb24gb3ZlcmxheSBnZXRzIHJlbW92ZWRcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLCB7XG4gICAgICAgIG1vZGlmaWVkOiBmYWxzZSxcbiAgICAgICAgc3RhdGU6IERBVEFfU1RBVEUuUFJJU1RJTkUsXG4gICAgICB9KTtcbiAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuUkVTRVQpO1xuICAgIH07XG5cbiAgICBjb25zdCBlbmhhbmNlZCA9IHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHN0YXRlLFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgZm9ybSBkYXRhXG4gICAgICAgKi9cbiAgICAgIGdldERhdGEoKTogRm9ybURhdGEge1xuICAgICAgICAvLyBBbHdheXMgY29sbGVjdCBmcmVzaCBkYXRhIGZyb20gZmllbGRzXG4gICAgICAgIGNvbnN0IGRhdGEgPSBjb2xsZWN0RmllbGREYXRhKGNvbXBvbmVudC5maWVsZHMpO1xuICAgICAgICBzdGF0ZS5jdXJyZW50RGF0YSA9IGRhdGE7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9HRVQsIGRhdGEpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGZvcm0gZGF0YVxuICAgICAgICogQHBhcmFtIGRhdGEgLSBEYXRhIG9iamVjdCB0byBzZXRcbiAgICAgICAqIEBwYXJhbSBzaWxlbnQgLSBJZiB0cnVlLCBkb24ndCBlbWl0IGNoYW5nZSBldmVudHMgYW5kIHVwZGF0ZSBpbml0aWFsIHN0YXRlXG4gICAgICAgKlxuICAgICAgICogV2hlbiBwcm90ZWN0Q2hhbmdlcy5vbkRhdGFPdmVyd3JpdGUgaXMgZW5hYmxlZCBhbmQgdGhlIGZvcm0gaGFzIHVuc2F2ZWQgY2hhbmdlcyxcbiAgICAgICAqIHRoaXMgd2lsbCBlbWl0IGEgJ2RhdGE6Y29uZmxpY3QnIGV2ZW50LiBUaGUgZXZlbnQgaGFuZGxlciBjYW4gY2FsbCBjYW5jZWwoKVxuICAgICAgICogdG8gcHJldmVudCB0aGUgZGF0YSBmcm9tIGJlaW5nIHNldCwgb3IgbGV0IGl0IHByb2NlZWQgYnkgZGVmYXVsdC5cbiAgICAgICAqL1xuICAgICAgc2V0RGF0YShkYXRhOiBGb3JtRGF0YSwgc2lsZW50OiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGRhdGEgY29uZmxpY3QgcHJvdGVjdGlvblxuICAgICAgICAvLyBPbmx5IGFwcGxpZXMgd2hlbjpcbiAgICAgICAgLy8gLSBQcm90ZWN0aW9uIGlzIGVuYWJsZWRcbiAgICAgICAgLy8gLSBGb3JtIGhhcyBiZWVuIG1vZGlmaWVkXG4gICAgICAgIC8vIC0gTm90IGEgc2lsZW50IG9wZXJhdGlvbiAoc2lsZW50IGlzIGZvciBsb2FkaW5nIGRhdGEpXG4gICAgICAgIGlmIChwcm90ZWN0Q29uZmlnLm9uRGF0YU92ZXJ3cml0ZSAmJiBzdGF0ZS5tb2RpZmllZCAmJiAhc2lsZW50KSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGNvbmZsaWN0IGV2ZW50XG4gICAgICAgICAgbGV0IGNhbmNlbGxlZCA9IGZhbHNlO1xuICAgICAgICAgIGxldCBwcm9jZWVkZWQgPSBmYWxzZTtcblxuICAgICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQ6IERhdGFDb25mbGljdEV2ZW50ID0ge1xuICAgICAgICAgICAgY3VycmVudERhdGE6IHsgLi4uc3RhdGUuY3VycmVudERhdGEgfSxcbiAgICAgICAgICAgIG5ld0RhdGE6IGRhdGEsXG4gICAgICAgICAgICBjYW5jZWxsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNhbmNlbGxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIGNvbmZsaWN0RXZlbnQuY2FuY2VsbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcm9jZWVkOiAoKSA9PiB7XG4gICAgICAgICAgICAgIHByb2NlZWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgIHBlcmZvcm1TZXREYXRhKGRhdGEsIHNpbGVudCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICAvLyBFbWl0IHRoZSBjb25mbGljdCBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9DT05GTElDVCwgY29uZmxpY3RFdmVudCk7XG5cbiAgICAgICAgICAvLyBJZiBjYW5jZWxsZWQsIGRvbid0IHNldCB0aGUgZGF0YVxuICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBwcm9jZWVkKCkgd2FzIGNhbGxlZCBpbiB0aGUgaGFuZGxlciwgZGF0YSBpcyBhbHJlYWR5IHNldFxuICAgICAgICAgIGlmIChwcm9jZWVkZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBJZiBuZWl0aGVyIGNhbmNlbCgpIG5vciBwcm9jZWVkKCkgd2FzIGNhbGxlZCwgcHJvY2VlZCBieSBkZWZhdWx0XG4gICAgICAgICAgLy8gVGhpcyBtYWludGFpbnMgYmFja3dhcmQgY29tcGF0aWJpbGl0eVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUGVyZm9ybSB0aGUgYWN0dWFsIHNldERhdGEgb3BlcmF0aW9uXG4gICAgICAgIHBlcmZvcm1TZXREYXRhKGRhdGEsIHNpbGVudCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhIHNwZWNpZmljIGZpZWxkJ3MgdmFsdWVcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRWYWx1ZShuYW1lOiBzdHJpbmcpOiBGaWVsZFZhbHVlIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb21wb25lbnQuZmllbGRzLmdldChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgcmV0dXJuIGdldEZpZWxkVmFsdWUoZmllbGQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdGF0ZS5jdXJyZW50RGF0YVtuYW1lXTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGEgc3BlY2lmaWMgZmllbGQncyB2YWx1ZVxuICAgICAgICovXG4gICAgICBzZXRGaWVsZFZhbHVlKFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHZhbHVlOiBGaWVsZFZhbHVlLFxuICAgICAgICBzaWxlbnQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgICAgICk6IHZvaWQge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGNvbXBvbmVudC5maWVsZHMuZ2V0KG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICBzZXRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgc2lsZW50KTtcbiAgICAgICAgICBzdGF0ZS5jdXJyZW50RGF0YVtuYW1lXSA9IHZhbHVlO1xuICAgICAgICAgIHN0YXRlLm1vZGlmaWVkID0gaGFzRGF0YUNoYW5nZWQoc3RhdGUuaW5pdGlhbERhdGEsIHN0YXRlLmN1cnJlbnREYXRhKTtcblxuICAgICAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGVcbiAgICAgICAgICB1cGRhdGVCZWZvcmVVbmxvYWRTdGF0ZShzdGF0ZS5tb2RpZmllZCk7XG5cbiAgICAgICAgICBpZiAoIXNpbGVudCkge1xuICAgICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5GSUVMRF9DSEFOR0UsIHsgbmFtZSwgdmFsdWUgfSk7XG4gICAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLkNIQU5HRSwgeyBuYW1lLCB2YWx1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2hlY2sgaWYgZm9ybSBoYXMgYmVlbiBtb2RpZmllZCBmcm9tIGluaXRpYWwgc3RhdGVcbiAgICAgICAqL1xuICAgICAgaXNNb2RpZmllZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgY3VycmVudERhdGEgPSBjb2xsZWN0RmllbGREYXRhKGNvbXBvbmVudC5maWVsZHMpO1xuICAgICAgICBzdGF0ZS5tb2RpZmllZCA9IGhhc0RhdGFDaGFuZ2VkKHN0YXRlLmluaXRpYWxEYXRhLCBjdXJyZW50RGF0YSk7XG4gICAgICAgIHJldHVybiBzdGF0ZS5tb2RpZmllZDtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IG9ubHkgdGhlIGZpZWxkcyB0aGF0IGhhdmUgYmVlbiBtb2RpZmllZFxuICAgICAgICovXG4gICAgICBnZXRNb2RpZmllZERhdGEoKTogRm9ybURhdGEge1xuICAgICAgICBjb25zdCBjdXJyZW50RGF0YSA9IGNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcyk7XG4gICAgICAgIHJldHVybiBnZXRNb2RpZmllZEZpZWxkcyhzdGF0ZS5pbml0aWFsRGF0YSwgY3VycmVudERhdGEpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBUYWtlIGEgc25hcHNob3Qgb2YgY3VycmVudCBkYXRhIGFzIHRoZSBuZXcgYmFzZWxpbmVcbiAgICAgICAqIEZ1dHVyZSBpc01vZGlmaWVkKCkgY2FsbHMgd2lsbCBjb21wYXJlIGFnYWluc3QgdGhpcyBzbmFwc2hvdFxuICAgICAgICovXG4gICAgICBzbmFwc2hvdCgpOiB2b2lkIHtcbiAgICAgICAgc3RhdGUuaW5pdGlhbERhdGEgPSB7IC4uLmNvbGxlY3RGaWVsZERhdGEoY29tcG9uZW50LmZpZWxkcykgfTtcbiAgICAgICAgc3RhdGUuY3VycmVudERhdGEgPSB7IC4uLnN0YXRlLmluaXRpYWxEYXRhIH07XG4gICAgICAgIHN0YXRlLm1vZGlmaWVkID0gZmFsc2U7XG4gICAgICAgIC8vIFVwZGF0ZSBiZWZvcmV1bmxvYWQgc3RhdGUgc2luY2Ugd2UncmUgbm8gbG9uZ2VyIG1vZGlmaWVkXG4gICAgICAgIHVwZGF0ZUJlZm9yZVVubG9hZFN0YXRlKGZhbHNlKTtcbiAgICAgICAgLy8gRW1pdCBzdGF0ZTpjaGFuZ2Ugc28gcHJvdGVjdGlvbiBvdmVybGF5IGdldHMgcmVtb3ZlZFxuICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlNUQVRFX0NIQU5HRSwge1xuICAgICAgICAgIG1vZGlmaWVkOiBmYWxzZSxcbiAgICAgICAgICBzdGF0ZTogREFUQV9TVEFURS5QUklTVElORSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFJlc2V0IGZvcm0gdG8gaW5pdGlhbCBkYXRhIHN0YXRlXG4gICAgICAgKlxuICAgICAgICogTm90ZTogUHJvdGVjdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBibG9ja2luZyBvdmVybGF5IGluIHRoZSBwcm90ZWN0aW9uIGZlYXR1cmUuXG4gICAgICAgKiByZXNldCgpIG5vIGxvbmdlciBlbWl0cyBkYXRhOmNvbmZsaWN0IGV2ZW50cyAtIGl0IGp1c3QgcmVzZXRzIHRoZSBmb3JtLlxuICAgICAgICogVXNlIGZvcmNlIHBhcmFtZXRlciBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKGlnbm9yZWQpLlxuICAgICAgICpcbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgLSBJZ25vcmVkIChrZXB0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSlcbiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBBbHdheXMgcmV0dXJucyB0cnVlXG4gICAgICAgKi9cbiAgICAgIHJlc2V0KGZvcmNlOiBib29sZWFuID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICAgICAgcGVyZm9ybVJlc2V0KCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqXG4gICAgICAgKiBOb3RlOiBQcm90ZWN0aW9uIGlzIGhhbmRsZWQgYnkgdGhlIGJsb2NraW5nIG92ZXJsYXkgaW4gdGhlIHByb3RlY3Rpb24gZmVhdHVyZS5cbiAgICAgICAqIGNsZWFyKCkgbm8gbG9uZ2VyIGVtaXRzIGRhdGE6Y29uZmxpY3QgZXZlbnRzIC0gaXQganVzdCBjbGVhcnMgdGhlIGZvcm0uXG4gICAgICAgKiBVc2UgZm9yY2UgcGFyYW1ldGVyIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAoaWdub3JlZCkuXG4gICAgICAgKlxuICAgICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZSAtIElnbm9yZWQgKGtlcHQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KVxuICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IEFsd2F5cyByZXR1cm5zIHRydWVcbiAgICAgICAqL1xuICAgICAgY2xlYXIoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgICAgICBwZXJmb3JtQ2xlYXIoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBSZWdpc3RlciBjbGVhbnVwIGZvciBiZWZvcmV1bmxvYWQgaGFuZGxlciB3aGVuIGNvbXBvbmVudCBpcyBkZXN0cm95ZWRcbiAgICAvLyBXZSBuZWVkIHRvIGhvb2sgaW50byB0aGUgbGlmZWN5Y2xlIGRlc3Ryb3kgbWVjaGFuaXNtXG4gICAgY29uc3Qgb3JpZ2luYWxMaWZlY3ljbGUgPSBjb21wb25lbnQubGlmZWN5Y2xlO1xuICAgIGlmIChvcmlnaW5hbExpZmVjeWNsZSkge1xuICAgICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gb3JpZ2luYWxMaWZlY3ljbGUuZGVzdHJveTtcbiAgICAgIG9yaWdpbmFsTGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIC8vIENsZWFuIHVwIGJlZm9yZXVubG9hZCBoYW5kbGVyXG4gICAgICAgIHVucmVnaXN0ZXJCZWZvcmVVbmxvYWQoKTtcbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlZDtcbiAgfTtcbn07XG5cbmV4cG9ydCB7IGZsYXRUb05lc3RlZCwgZ2V0TmVzdGVkVmFsdWUsIHNldE5lc3RlZFZhbHVlIH07XG5leHBvcnQgZGVmYXVsdCB3aXRoRGF0YTtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9jb250cm9sbGVyLnRzXG5cbi8qKlxuICogQ29udHJvbGxlciBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogTWFuYWdlcyBjb250cm9sIGJ1dHRvbnMgKHN1Ym1pdC9jYW5jZWwpIGJhc2VkIG9uIGRhdGEgc3RhdGUgKHByaXN0aW5lL2RpcnR5KVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1TdGF0ZSxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIEZvcm1GaWVsZCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBEQVRBX1NUQVRFLCBGT1JNX0VWRU5UUywgRk9STV9DTEFTU0VTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRk9STV9ERUZBVUxUUyB9IGZyb20gXCIuLi9jb25maWdcIjtcblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBmb3JtJ3Mgc3RhdGUgQ1NTIGNsYXNzXG4gKi9cbmNvbnN0IHVwZGF0ZVN0YXRlQ2xhc3MgPSAoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICBtb2RpZmllZDogYm9vbGVhbixcbiAgcHJlZml4OiBzdHJpbmcsXG4gIGNvbXBvbmVudE5hbWU6IHN0cmluZyxcbik6IHZvaWQgPT4ge1xuICBjb25zdCBtb2RpZmllZENsYXNzID0gYCR7cHJlZml4fS0ke2NvbXBvbmVudE5hbWV9LS0ke0ZPUk1fQ0xBU1NFUy5NT0RJRklFRH1gO1xuICBlbGVtZW50LmNsYXNzTGlzdC50b2dnbGUobW9kaWZpZWRDbGFzcywgbW9kaWZpZWQpO1xufTtcblxuLyoqXG4gKiBFbmFibGVzIG9yIGRpc2FibGVzIGFsbCBmb3JtIGZpZWxkc1xuICovXG5jb25zdCBzZXRGaWVsZHNFbmFibGVkID0gKFxuICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBlbmFibGVkOiBib29sZWFuLFxuKTogdm9pZCA9PiB7XG4gIGZvciAoY29uc3QgWywgZmllbGRdIG9mIGZpZWxkcykge1xuICAgIGlmIChlbmFibGVkICYmIHR5cGVvZiBmaWVsZC5lbmFibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgZmllbGQuZW5hYmxlKCk7XG4gICAgfSBlbHNlIGlmICghZW5hYmxlZCAmJiB0eXBlb2YgZmllbGQuZGlzYWJsZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBmaWVsZC5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdldHMgY29udHJvbCBidXR0b24gY29tcG9uZW50cyBmcm9tIHRoZSBVSSByZWdpc3RyeVxuICovXG5jb25zdCBnZXRDb250cm9sQnV0dG9ucyA9IChcbiAgdWk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb250cm9sTmFtZXM6IHN0cmluZ1tdLFxuKTogTWFwPHN0cmluZywgRm9ybUZpZWxkPiA9PiB7XG4gIGNvbnN0IGNvbnRyb2xzID0gbmV3IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4oKTtcblxuICBmb3IgKGNvbnN0IG5hbWUgb2YgY29udHJvbE5hbWVzKSB7XG4gICAgY29uc3QgY29udHJvbCA9IHVpW25hbWVdO1xuICAgIGlmIChjb250cm9sICYmIHR5cGVvZiBjb250cm9sID09PSBcIm9iamVjdFwiICYmIFwiZWxlbWVudFwiIGluIGNvbnRyb2wpIHtcbiAgICAgIGNvbnRyb2xzLnNldChuYW1lLCBjb250cm9sIGFzIEZvcm1GaWVsZCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbnRyb2xzO1xufTtcblxuLyoqXG4gKiBFbmFibGVzIG9yIGRpc2FibGVzIGNvbnRyb2wgYnV0dG9uc1xuICovXG5jb25zdCBzZXRDb250cm9sc0VuYWJsZWQgPSAoXG4gIGNvbnRyb2xzOiBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+LFxuICBlbmFibGVkOiBib29sZWFuLFxuKTogdm9pZCA9PiB7XG4gIGZvciAoY29uc3QgWywgY29udHJvbF0gb2YgY29udHJvbHMpIHtcbiAgICBpZiAoZW5hYmxlZCAmJiB0eXBlb2YgY29udHJvbC5lbmFibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29udHJvbC5lbmFibGUoKTtcbiAgICB9IGVsc2UgaWYgKCFlbmFibGVkICYmIHR5cGVvZiBjb250cm9sLmRpc2FibGUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgY29udHJvbC5kaXNhYmxlKCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIHdpdGhDb250cm9sbGVyIGZlYXR1cmVcbiAqIEFkZHMgY29udHJvbCBidXR0b24gaGFuZGxpbmcgYmFzZWQgb24gZGF0YSBzdGF0ZSAocHJpc3RpbmUvZGlydHkpXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQ29udHJvbGxlciA9IChjb25maWc6IEZvcm1Db25maWcpID0+IHtcbiAgcmV0dXJuIDxcbiAgICBUIGV4dGVuZHMgQmFzZUZvcm1Db21wb25lbnQgJiB7XG4gICAgICBmaWVsZHM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICAgICAgc3RhdGU6IEZvcm1TdGF0ZTtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBvbj86IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgICB9LFxuICA+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHtcbiAgICBjb250cm9sczogTWFwPHN0cmluZywgRm9ybUZpZWxkPjtcbiAgICBnZXREYXRhU3RhdGU6ICgpID0+IHN0cmluZztcbiAgICBlbmFibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgICBkaXNhYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gICAgZW5hYmxlRmllbGRzOiAoKSA9PiB2b2lkO1xuICAgIGRpc2FibGVGaWVsZHM6ICgpID0+IHZvaWQ7XG4gIH0gPT4ge1xuICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZy5wcmVmaXggfHwgRk9STV9ERUZBVUxUUy5wcmVmaXg7XG4gICAgY29uc3QgY29tcG9uZW50TmFtZSA9IGNvbmZpZy5jb21wb25lbnROYW1lIHx8IEZPUk1fREVGQVVMVFMuY29tcG9uZW50TmFtZTtcbiAgICBjb25zdCBjb250cm9sTmFtZXMgPSBjb25maWcuY29udHJvbHNcbiAgICAgID8gWy4uLmNvbmZpZy5jb250cm9sc11cbiAgICAgIDogWy4uLkZPUk1fREVGQVVMVFMuY29udHJvbHNdO1xuXG4gICAgLy8gR2V0IGNvbnRyb2wgYnV0dG9ucyBmcm9tIFVJXG4gICAgY29uc3QgY29udHJvbHMgPSBjb250cm9sTmFtZXNcbiAgICAgID8gZ2V0Q29udHJvbEJ1dHRvbnMoY29tcG9uZW50LnVpIHx8IHt9LCBjb250cm9sTmFtZXMpXG4gICAgICA6IG5ldyBNYXA8c3RyaW5nLCBGb3JtRmllbGQ+KCk7XG5cbiAgICAvLyBJbml0aWFsaXplIGNvbnRyb2xzIGFzIGRpc2FibGVkIChwcmlzdGluZSBzdGF0ZSlcbiAgICBpZiAoY29udHJvbHMuc2l6ZSA+IDApIHtcbiAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgZmFsc2UpO1xuICAgIH1cblxuICAgIGNvbnN0IGVuaGFuY2VkID0ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgY29udHJvbHMsXG5cbiAgICAgIC8qKlxuICAgICAgICogR2V0IGN1cnJlbnQgZGF0YSBzdGF0ZSAocHJpc3RpbmUgb3IgZGlydHkpXG4gICAgICAgKi9cbiAgICAgIGdldERhdGFTdGF0ZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnN0YXRlLm1vZGlmaWVkXG4gICAgICAgICAgPyBEQVRBX1NUQVRFLkRJUlRZXG4gICAgICAgICAgOiBEQVRBX1NUQVRFLlBSSVNUSU5FO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgY29udHJvbCBidXR0b25zXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUNvbnRyb2xzKCk6IHZvaWQge1xuICAgICAgICBzZXRDb250cm9sc0VuYWJsZWQoY29udHJvbHMsIHRydWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBEaXNhYmxlIGNvbnRyb2wgYnV0dG9uc1xuICAgICAgICovXG4gICAgICBkaXNhYmxlQ29udHJvbHMoKTogdm9pZCB7XG4gICAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgZmFsc2UpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBFbmFibGUgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGVuYWJsZUZpZWxkcygpOiB2b2lkIHtcbiAgICAgICAgc2V0RmllbGRzRW5hYmxlZChjb21wb25lbnQuZmllbGRzLCB0cnVlKTtcbiAgICAgICAgY29tcG9uZW50LnN0YXRlLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVGaWVsZHMoKTogdm9pZCB7XG4gICAgICAgIHNldEZpZWxkc0VuYWJsZWQoY29tcG9uZW50LmZpZWxkcywgZmFsc2UpO1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuZGlzYWJsZWQgPSB0cnVlO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIGZvciBzdGF0ZSBjaGFuZ2VzIHRvIGVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzXG4gICAgaWYgKGNvbmZpZy51c2VDaGFuZ2VzICE9PSBmYWxzZSAmJiBjb21wb25lbnQub24pIHtcbiAgICAgIGNvbXBvbmVudC5vbihcbiAgICAgICAgRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLFxuICAgICAgICAoZXZlbnQ6IHsgbW9kaWZpZWQ6IGJvb2xlYW47IHN0YXRlOiBzdHJpbmcgfSkgPT4ge1xuICAgICAgICAgIGlmIChldmVudC5tb2RpZmllZCkge1xuICAgICAgICAgICAgLy8gRGF0YSBpcyBkaXJ0eSAtIGVuYWJsZSBjb250cm9sc1xuICAgICAgICAgICAgc2V0Q29udHJvbHNFbmFibGVkKGNvbnRyb2xzLCB0cnVlKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gRGF0YSBpcyBwcmlzdGluZSAtIGRpc2FibGUgY29udHJvbHNcbiAgICAgICAgICAgIHNldENvbnRyb2xzRW5hYmxlZChjb250cm9scywgZmFsc2UpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFVwZGF0ZSBDU1MgY2xhc3NcbiAgICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIHVwZGF0ZVN0YXRlQ2xhc3MoXG4gICAgICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LFxuICAgICAgICAgICAgICBldmVudC5tb2RpZmllZCxcbiAgICAgICAgICAgICAgcHJlZml4LFxuICAgICAgICAgICAgICBjb21wb25lbnROYW1lLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBlbmhhbmNlZDtcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhDb250cm9sbGVyO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9mb3JtL2ZlYXR1cmVzL3N1Ym1pdC50c1xuXG4vKipcbiAqIFN1Ym1pdCBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogSGFuZGxlcyBmb3JtIHZhbGlkYXRpb24gYW5kIHN1Ym1pc3Npb24gd2l0aCBhdXRvbWF0aWMgZmllbGQgZXJyb3IgZGlzcGxheVxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgRm9ybUNvbmZpZyxcbiAgQmFzZUZvcm1Db21wb25lbnQsXG4gIEZvcm1EYXRhLFxuICBGb3JtU3RhdGUsXG4gIEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBGb3JtRmllbGQsXG4gIEZvcm1WYWxpZGF0aW9uUnVsZSxcbiAgRm9ybVZhbGlkYXRpb25SZXN1bHQsXG4gIEZvcm1TdWJtaXRPcHRpb25zLFxufSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IEZPUk1fRVZFTlRTLCBGT1JNX0NMQVNTRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogRGVmYXVsdCBoZWFkZXJzIGZvciBKU09OIHJlcXVlc3RzXG4gKi9cbmNvbnN0IERFRkFVTFRfSEVBREVSUzogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG59O1xuXG4vKipcbiAqIFZhbGlkYXRlcyBmb3JtIGRhdGEgYWdhaW5zdCB2YWxpZGF0aW9uIHJ1bGVzXG4gKi9cbmNvbnN0IHZhbGlkYXRlRGF0YSA9IChcbiAgZGF0YTogRm9ybURhdGEsXG4gIHJ1bGVzOiBGb3JtVmFsaWRhdGlvblJ1bGVbXSxcbik6IEZvcm1WYWxpZGF0aW9uUmVzdWx0ID0+IHtcbiAgY29uc3QgZXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGxldCB2YWxpZCA9IHRydWU7XG5cbiAgZm9yIChjb25zdCBydWxlIG9mIHJ1bGVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBkYXRhW3J1bGUuZmllbGRdO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJ1bGUudmFsaWRhdGUodmFsdWUsIGRhdGEpO1xuXG4gICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgIHZhbGlkID0gZmFsc2U7XG4gICAgICBlcnJvcnNbcnVsZS5maWVsZF0gPSBydWxlLm1lc3NhZ2UgfHwgYCR7cnVsZS5maWVsZH0gaXMgaW52YWxpZGA7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB2YWxpZCA9IGZhbHNlO1xuICAgICAgZXJyb3JzW3J1bGUuZmllbGRdID0gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IHZhbGlkLCBlcnJvcnMgfTtcbn07XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgc2luZ2xlIGZpZWxkIGFnYWluc3QgaXRzIHZhbGlkYXRpb24gcnVsZXNcbiAqL1xuY29uc3QgdmFsaWRhdGVGaWVsZCA9IChcbiAgZmllbGROYW1lOiBzdHJpbmcsXG4gIGRhdGE6IEZvcm1EYXRhLFxuICBydWxlczogRm9ybVZhbGlkYXRpb25SdWxlW10sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4ge1xuICBjb25zdCBmaWVsZFJ1bGVzID0gcnVsZXMuZmlsdGVyKChydWxlKSA9PiBydWxlLmZpZWxkID09PSBmaWVsZE5hbWUpO1xuXG4gIGZvciAoY29uc3QgcnVsZSBvZiBmaWVsZFJ1bGVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSBkYXRhW3J1bGUuZmllbGRdO1xuICAgIGNvbnN0IHJlc3VsdCA9IHJ1bGUudmFsaWRhdGUodmFsdWUsIGRhdGEpO1xuXG4gICAgaWYgKHJlc3VsdCA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBydWxlLm1lc3NhZ2UgfHwgYCR7cnVsZS5maWVsZH0gaXMgaW52YWxpZGA7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKipcbiAqIFBlcmZvcm1zIHRoZSBhY3R1YWwgSFRUUCByZXF1ZXN0XG4gKi9cbmNvbnN0IHBlcmZvcm1SZXF1ZXN0ID0gYXN5bmMgKFxuICB1cmw6IHN0cmluZyxcbiAgZGF0YTogRm9ybURhdGEsXG4gIG9wdGlvbnM6IEZvcm1TdWJtaXRPcHRpb25zLFxuKTogUHJvbWlzZTx1bmtub3duPiA9PiB7XG4gIGNvbnN0IG1ldGhvZCA9IG9wdGlvbnMubWV0aG9kIHx8IFwiUE9TVFwiO1xuICBjb25zdCBoZWFkZXJzID0geyAuLi5ERUZBVUxUX0hFQURFUlMsIC4uLm9wdGlvbnMuaGVhZGVycyB9O1xuXG4gIGNvbnN0IGZldGNoT3B0aW9uczogUmVxdWVzdEluaXQgPSB7XG4gICAgbWV0aG9kLFxuICAgIGhlYWRlcnMsXG4gIH07XG5cbiAgLy8gQWRkIGJvZHkgZm9yIG5vbi1HRVQgcmVxdWVzdHNcbiAgaWYgKG1ldGhvZCAhPT0gXCJHRVRcIikge1xuICAgIGZldGNoT3B0aW9ucy5ib2R5ID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gIH1cblxuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwgZmV0Y2hPcHRpb25zKTtcblxuICAvLyBQYXJzZSByZXNwb25zZVxuICBjb25zdCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KFwiY29udGVudC10eXBlXCIpO1xuICBsZXQgcmVzdWx0OiB1bmtub3duO1xuXG4gIGlmIChjb250ZW50VHlwZSAmJiBjb250ZW50VHlwZS5pbmNsdWRlcyhcImFwcGxpY2F0aW9uL2pzb25cIikpIHtcbiAgICByZXN1bHQgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UudGV4dCgpO1xuICB9XG5cbiAgLy8gQ2hlY2sgZm9yIEhUVFAgZXJyb3JzXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAvLyBUcnkgdG8gZXh0cmFjdCBlcnJvciBtZXNzYWdlIGZyb20gc2VydmVyIHJlc3BvbnNlXG4gICAgbGV0IGVycm9yTWVzc2FnZSA9IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWA7XG4gICAgaWYgKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCBzZXJ2ZXJFcnJvciA9IChyZXN1bHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmVycm9yO1xuICAgICAgaWYgKHR5cGVvZiBzZXJ2ZXJFcnJvciA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBlcnJvck1lc3NhZ2UgPSBzZXJ2ZXJFcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAoZXJyb3IgYXMgRXJyb3IgJiB7IHJlc3BvbnNlOiB1bmtub3duIH0pLnJlc3BvbnNlID0gcmVzdWx0O1xuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogd2l0aFN1Ym1pdCBmZWF0dXJlXG4gKiBBZGRzIHZhbGlkYXRpb24gYW5kIHN1Ym1pc3Npb24gY2FwYWJpbGl0aWVzIHRvIHRoZSBmb3JtXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoU3VibWl0ID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gPFxuICAgIFQgZXh0ZW5kcyBCYXNlRm9ybUNvbXBvbmVudCAmIHtcbiAgICAgIGZpZWxkczogRm9ybUZpZWxkUmVnaXN0cnk7XG4gICAgICBzdGF0ZTogRm9ybVN0YXRlO1xuICAgICAgZ2V0RGF0YTogKCkgPT4gRm9ybURhdGE7XG4gICAgICBnZXRNb2RpZmllZERhdGE6ICgpID0+IEZvcm1EYXRhO1xuICAgICAgZW5hYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gICAgICBkaXNhYmxlQ29udHJvbHM6ICgpID0+IHZvaWQ7XG4gICAgICBzbmFwc2hvdDogKCkgPT4gdm9pZDtcbiAgICAgIGVtaXQ/OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBvbj86IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiAoZGF0YTogdW5rbm93bikgPT4gdm9pZCkgPT4gdm9pZDtcbiAgICB9LFxuICA+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHtcbiAgICB2YWxpZGF0ZTogKCkgPT4gRm9ybVZhbGlkYXRpb25SZXN1bHQ7XG4gICAgdmFsaWRhdGVGaWVsZDogKGZpZWxkTmFtZTogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgc3VibWl0OiAob3B0aW9ucz86IEZvcm1TdWJtaXRPcHRpb25zKSA9PiBQcm9taXNlPHVua25vd24+O1xuICAgIHNldFZhbGlkYXRpb25SdWxlczogKHJ1bGVzOiBGb3JtVmFsaWRhdGlvblJ1bGVbXSkgPT4gdm9pZDtcbiAgICBjbGVhckVycm9yczogKCkgPT4gdm9pZDtcbiAgICBjbGVhckZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHNldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSA9PiB2b2lkO1xuICAgIGdldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nKSA9PiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIH0gPT4ge1xuICAgIC8vIFZhbGlkYXRpb24gcnVsZXMgY2FuIGJlIHVwZGF0ZWQgYXQgcnVudGltZVxuICAgIGxldCB2YWxpZGF0aW9uUnVsZXMgPSBjb25maWcudmFsaWRhdGlvbiB8fCBbXTtcblxuICAgIC8vIFdoZXRoZXIgdG8gc2hvdyBlcnJvciBtZXNzYWdlcyBpbiBmaWVsZCBoZWxwZXIgdGV4dCAoZGVmYXVsdDogdHJ1ZSlcbiAgICBjb25zdCBzaG93TWVzc2FnZXMgPSBjb25maWcuc2hvd0ZpZWxkRXJyb3JNZXNzYWdlcyAhPT0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBvciBjbGVhcnMgZXJyb3Igb24gYSBmaWVsZCBjb21wb25lbnRcbiAgICAgKi9cbiAgICBjb25zdCBzaG93RmllbGRFcnJvciA9IChcbiAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgZXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICApOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkID0gY29tcG9uZW50LmZpZWxkcy5nZXQoZmllbGROYW1lKSBhcyBGb3JtRmllbGQgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoZmllbGQgJiYgdHlwZW9mIGZpZWxkLnNldEVycm9yID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgLy8gT25seSBwYXNzIG1lc3NhZ2UgaWYgc2hvd0ZpZWxkRXJyb3JNZXNzYWdlcyBpcyBlbmFibGVkXG4gICAgICAgICAgZmllbGQuc2V0RXJyb3IodHJ1ZSwgc2hvd01lc3NhZ2VzID8gZXJyb3IgOiB1bmRlZmluZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFBhc3MgZW1wdHkgc3RyaW5nIHRvIGFsc28gY2xlYXIgdGhlIGhlbHBlci9zdXBwb3J0aW5nIHRleHQgbWVzc2FnZVxuICAgICAgICAgIGZpZWxkLnNldEVycm9yKGZhbHNlLCBcIlwiKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTaG93cyBlcnJvcnMgb24gYWxsIGZpZWxkIGNvbXBvbmVudHNcbiAgICAgKi9cbiAgICBjb25zdCBzaG93QWxsRmllbGRFcnJvcnMgPSAoZXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KTogdm9pZCA9PiB7XG4gICAgICAvLyBDbGVhciBhbGwgZmllbGQgZXJyb3JzIGZpcnN0XG4gICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWVdIG9mIGNvbXBvbmVudC5maWVsZHMpIHtcbiAgICAgICAgc2hvd0ZpZWxkRXJyb3IoZmllbGROYW1lLCB1bmRlZmluZWQpO1xuICAgICAgfVxuICAgICAgLy8gU2hvdyBuZXcgZXJyb3JzXG4gICAgICBmb3IgKGNvbnN0IFtmaWVsZE5hbWUsIGVycm9yXSBvZiBPYmplY3QuZW50cmllcyhlcnJvcnMpKSB7XG4gICAgICAgIHNob3dGaWVsZEVycm9yKGZpZWxkTmFtZSwgZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBMaXN0ZW4gZm9yIGZpZWxkIGNoYW5nZXMgdG8gYXV0by1jbGVhci9yZXZhbGlkYXRlIGVycm9yc1xuICAgIGlmIChjb21wb25lbnQub24pIHtcbiAgICAgIC8vIENsZWFyIHZpc3VhbCBlcnJvcnMgd2hlbiBmb3JtIGlzIHJlc2V0XG4gICAgICBjb21wb25lbnQub24oXCJyZXNldFwiLCAoKSA9PiB7XG4gICAgICAgIHNob3dBbGxGaWVsZEVycm9ycyh7fSk7XG4gICAgICB9KTtcblxuICAgICAgY29tcG9uZW50Lm9uKFwiZmllbGQ6Y2hhbmdlXCIsIChldmVudDogdW5rbm93bikgPT4ge1xuICAgICAgICBjb25zdCB7IG5hbWUgfSA9IGV2ZW50IGFzIHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogdW5rbm93biB9O1xuXG4gICAgICAgIC8vIElmIHRoaXMgZmllbGQgaGFkIGFuIGVycm9yLCByZS12YWxpZGF0ZSBpdFxuICAgICAgICBpZiAoY29tcG9uZW50LnN0YXRlLmVycm9yc1tuYW1lXSkge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBjb21wb25lbnQuZ2V0RGF0YSgpO1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGVGaWVsZChuYW1lLCBkYXRhLCB2YWxpZGF0aW9uUnVsZXMpO1xuXG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBTdGlsbCBoYXMgZXJyb3IgLSB1cGRhdGUgbWVzc2FnZVxuICAgICAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9yc1tuYW1lXSA9IGVycm9yO1xuICAgICAgICAgICAgc2hvd0ZpZWxkRXJyb3IobmFtZSwgZXJyb3IpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGaWVsZCBpcyBub3cgdmFsaWQgLSBjbGVhciBlcnJvclxuICAgICAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbbmFtZV07XG4gICAgICAgICAgICBzaG93RmllbGRFcnJvcihuYW1lLCB1bmRlZmluZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZW5oYW5jZWQgPSB7XG4gICAgICAuLi5jb21wb25lbnQsXG5cbiAgICAgIC8qKlxuICAgICAgICogVmFsaWRhdGUgZm9ybSBkYXRhIGFnYWluc3QgY29uZmlndXJlZCBydWxlc1xuICAgICAgICogQXV0b21hdGljYWxseSBzaG93cyBlcnJvcnMgb24gZmllbGQgY29tcG9uZW50c1xuICAgICAgICogQHJldHVybnMgVmFsaWRhdGlvbiByZXN1bHQgd2l0aCB2YWxpZCBmbGFnIGFuZCBlcnJvcnMgb2JqZWN0XG4gICAgICAgKi9cbiAgICAgIHZhbGlkYXRlKCk6IEZvcm1WYWxpZGF0aW9uUmVzdWx0IHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHZhbGlkYXRlRGF0YShkYXRhLCB2YWxpZGF0aW9uUnVsZXMpO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzdGF0ZSB3aXRoIHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnMgPSByZXN1bHQuZXJyb3JzO1xuXG4gICAgICAgIC8vIFNob3cgZXJyb3JzIG9uIGZpZWxkIGNvbXBvbmVudHNcbiAgICAgICAgc2hvd0FsbEZpZWxkRXJyb3JzKHJlc3VsdC5lcnJvcnMpO1xuXG4gICAgICAgIC8vIEVtaXQgdmFsaWRhdGlvbiBldmVudCBpZiB0aGVyZSBhcmUgZXJyb3JzXG4gICAgICAgIGlmICghcmVzdWx0LnZhbGlkKSB7XG4gICAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5WQUxJREFUSU9OX0VSUk9SLCByZXN1bHQuZXJyb3JzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFZhbGlkYXRlIGEgc2luZ2xlIGZpZWxkXG4gICAgICAgKiBAcmV0dXJucyBFcnJvciBtZXNzYWdlIGlmIGludmFsaWQsIHVuZGVmaW5lZCBpZiB2YWxpZFxuICAgICAgICovXG4gICAgICB2YWxpZGF0ZUZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICAgIGNvbnN0IGVycm9yID0gdmFsaWRhdGVGaWVsZChmaWVsZE5hbWUsIGRhdGEsIHZhbGlkYXRpb25SdWxlcyk7XG5cbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9yc1tmaWVsZE5hbWVdID0gZXJyb3I7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGROYW1lXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHNob3dGaWVsZEVycm9yKGZpZWxkTmFtZSwgZXJyb3IpO1xuICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFN1Ym1pdCB0aGUgZm9ybVxuICAgICAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBzdWJtaXQgY29uZmlndXJhdGlvblxuICAgICAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHNlcnZlciByZXNwb25zZVxuICAgICAgICovXG4gICAgICBhc3luYyBzdWJtaXQob3B0aW9uczogRm9ybVN1Ym1pdE9wdGlvbnMgPSB7fSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgICAvLyBQcmV2ZW50IGRvdWJsZSBzdWJtaXNzaW9uXG4gICAgICAgIGlmIChjb21wb25lbnQuc3RhdGUuc3VibWl0dGluZykge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJGb3JtIGlzIGFscmVhZHkgc3VibWl0dGluZ1wiKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYWxpZGF0ZSBpZiByZXF1ZXN0ZWQgKGRlZmF1bHQ6IHRydWUpXG4gICAgICAgIGlmIChvcHRpb25zLnZhbGlkYXRlICE9PSBmYWxzZSAmJiB2YWxpZGF0aW9uUnVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb24gPSB0aGlzLnZhbGlkYXRlKCk7XG4gICAgICAgICAgaWYgKCF2YWxpZGF0aW9uLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKFwiVmFsaWRhdGlvbiBmYWlsZWRcIikpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgYXMgc3VibWl0dGluZ1xuICAgICAgICBjb21wb25lbnQuc3RhdGUuc3VibWl0dGluZyA9IHRydWU7XG5cbiAgICAgICAgLy8gSW1tZWRpYXRlbHkgZGlzYWJsZSBjb250cm9scyB0byBwcmV2ZW50IGRvdWJsZS1jbGlja3NcbiAgICAgICAgY29tcG9uZW50LmRpc2FibGVDb250cm9scygpO1xuXG4gICAgICAgIC8vIEFkZCBzdWJtaXR0aW5nIGNsYXNzIHRvIGVsZW1lbnRcbiAgICAgICAgaWYgKGNvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBcIm10cmxcIjtcbiAgICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgXCJmb3JtXCI7XG4gICAgICAgICAgY29tcG9uZW50LmVsZW1lbnQuY2xhc3NMaXN0LmFkZChcbiAgICAgICAgICAgIGAke3ByZWZpeH0tJHtjb21wb25lbnROYW1lfS0tJHtGT1JNX0NMQVNTRVMuU1VCTUlUVElOR31gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IHN1Ym1pdCBldmVudFxuICAgICAgICBjb25zdCBkYXRhID0gY29tcG9uZW50LmdldERhdGEoKTtcbiAgICAgICAgY29tcG9uZW50LmVtaXQ/LihGT1JNX0VWRU5UUy5TVUJNSVQsIGRhdGEpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbGV0IHJlc3VsdDogdW5rbm93bjtcblxuICAgICAgICAgIC8vIFVzZSBjdXN0b20gaGFuZGxlciBpZiBwcm92aWRlZFxuICAgICAgICAgIGlmIChvcHRpb25zLmhhbmRsZXIpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGF3YWl0IG9wdGlvbnMuaGFuZGxlcihcbiAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgY29tcG9uZW50IGFzIHVua25vd24gYXMgaW1wb3J0KFwiLi4vdHlwZXNcIikuRm9ybUNvbXBvbmVudCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChjb25maWcuYWN0aW9uKSB7XG4gICAgICAgICAgICAvLyBVc2UgZGVmYXVsdCBmZXRjaFxuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgcGVyZm9ybVJlcXVlc3QoY29uZmlnLmFjdGlvbiwgZGF0YSwge1xuICAgICAgICAgICAgICBtZXRob2Q6IG9wdGlvbnMubWV0aG9kIHx8IGNvbmZpZy5tZXRob2QgfHwgXCJQT1NUXCIsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBObyBhY3Rpb24gVVJMLCBqdXN0IHJldHVybiB0aGUgZGF0YVxuICAgICAgICAgICAgcmVzdWx0ID0gZGF0YTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTdWNjZXNzIVxuICAgICAgICAgIGNvbXBvbmVudC5zdGF0ZS5zdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICAgICAgY29tcG9uZW50LnN0YXRlLmVycm9ycyA9IHt9O1xuXG4gICAgICAgICAgLy8gUmVtb3ZlIHN1Ym1pdHRpbmcgY2xhc3NcbiAgICAgICAgICBpZiAoY29tcG9uZW50LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGNvbmZpZy5wcmVmaXggfHwgXCJtdHJsXCI7XG4gICAgICAgICAgICBjb25zdCBjb21wb25lbnROYW1lID0gY29uZmlnLmNvbXBvbmVudE5hbWUgfHwgXCJmb3JtXCI7XG4gICAgICAgICAgICBjb21wb25lbnQuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFxuICAgICAgICAgICAgICBgJHtwcmVmaXh9LSR7Y29tcG9uZW50TmFtZX0tLSR7Rk9STV9DTEFTU0VTLlNVQk1JVFRJTkd9YCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gVGFrZSBzbmFwc2hvdCBvZiBjdXJyZW50IGRhdGEgYXMgbmV3IGJhc2VsaW5lXG4gICAgICAgICAgLy8gVGhpcyByZXNldHMgbW9kaWZpZWQgc3RhdGUgdG8gZmFsc2UsIHdoaWNoIHdpbGwgdHJpZ2dlciBzdGF0ZTpjaGFuZ2VcbiAgICAgICAgICBjb21wb25lbnQuc25hcHNob3QoKTtcblxuICAgICAgICAgIC8vIERpc2FibGUgY29udHJvbHMgKGZvcm0gaXMgbm93IHByaXN0aW5lKVxuICAgICAgICAgIGNvbXBvbmVudC5kaXNhYmxlQ29udHJvbHMoKTtcblxuICAgICAgICAgIC8vIEVtaXQgc3VjY2VzcyBldmVudFxuICAgICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuU1VCTUlUX1NVQ0NFU1MsIHJlc3VsdCk7XG5cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIC8vIEVycm9yIVxuICAgICAgICAgIGNvbXBvbmVudC5zdGF0ZS5zdWJtaXR0aW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAvLyBSZW1vdmUgc3VibWl0dGluZyBjbGFzc1xuICAgICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gY29uZmlnLnByZWZpeCB8fCBcIm10cmxcIjtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudE5hbWUgPSBjb25maWcuY29tcG9uZW50TmFtZSB8fCBcImZvcm1cIjtcbiAgICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICAgICAgICAgIGAke3ByZWZpeH0tJHtjb21wb25lbnROYW1lfS0tJHtGT1JNX0NMQVNTRVMuU1VCTUlUVElOR31gLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBSZS1lbmFibGUgY29udHJvbHMgc28gdXNlciBjYW4gcmV0cnkgKGZvcm0gc3RpbGwgaGFzIHVuc2F2ZWQgY2hhbmdlcylcbiAgICAgICAgICBjb21wb25lbnQuZW5hYmxlQ29udHJvbHMoKTtcblxuICAgICAgICAgIC8vIEVtaXQgZXJyb3IgZXZlbnRcbiAgICAgICAgICBjb21wb25lbnQuZW1pdD8uKEZPUk1fRVZFTlRTLlNVQk1JVF9FUlJPUiwgZXJyb3IpO1xuXG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IHZhbGlkYXRpb24gcnVsZXMgYXQgcnVudGltZVxuICAgICAgICovXG4gICAgICBzZXRWYWxpZGF0aW9uUnVsZXMocnVsZXM6IEZvcm1WYWxpZGF0aW9uUnVsZVtdKTogdm9pZCB7XG4gICAgICAgIHZhbGlkYXRpb25SdWxlcyA9IHJ1bGVzO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDbGVhciBhbGwgdmFsaWRhdGlvbiBlcnJvcnMgYW5kIHZpc3VhbCBlcnJvciBzdGF0ZXNcbiAgICAgICAqL1xuICAgICAgY2xlYXJFcnJvcnMoKTogdm9pZCB7XG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnMgPSB7fTtcbiAgICAgICAgc2hvd0FsbEZpZWxkRXJyb3JzKHt9KTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqL1xuICAgICAgY2xlYXJGaWVsZEVycm9yKGZpZWxkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgZGVsZXRlIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdO1xuICAgICAgICBzaG93RmllbGRFcnJvcihmaWVsZCwgdW5kZWZpbmVkKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogU2V0IGFuIGVycm9yIGZvciBhIHNwZWNpZmljIGZpZWxkIChhbHNvIHNob3dzIG9uIGNvbXBvbmVudClcbiAgICAgICAqL1xuICAgICAgc2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdID0gZXJyb3I7XG4gICAgICAgIHNob3dGaWVsZEVycm9yKGZpZWxkLCBlcnJvcik7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCB0aGUgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5zdGF0ZS5lcnJvcnNbZmllbGRdO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGVuaGFuY2VkO1xuICB9O1xufTtcblxuZXhwb3J0IHsgdmFsaWRhdGVEYXRhLCB2YWxpZGF0ZUZpZWxkLCBwZXJmb3JtUmVxdWVzdCB9O1xuZXhwb3J0IGRlZmF1bHQgd2l0aFN1Ym1pdDtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9wcm90ZWN0aW9uLnRzXG5cbi8qKlxuICogUHJvdGVjdGlvbiBmZWF0dXJlIGZvciBGb3JtIGNvbXBvbmVudFxuICogSGFuZGxlcyBibG9ja2luZyBvdmVybGF5IHRvIHByZXZlbnQgY2xpY2tzIG91dHNpZGUgdGhlIGZvcm0gd2hlbiBpdCBoYXMgdW5zYXZlZCBjaGFuZ2VzXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIEZvcm1TdGF0ZSxcbiAgRm9ybUZpZWxkUmVnaXN0cnksXG4gIFByb3RlY3RDaGFuZ2VzQ29uZmlnLFxuICBEYXRhQ29uZmxpY3RFdmVudCxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBGT1JNX0VWRU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcblxuLyoqXG4gKiBOb3JtYWxpemVzIHByb3RlY3Rpb24gY29uZmlnIHRvIGEgY29uc2lzdGVudCBvYmplY3QgZm9ybWF0XG4gKi9cbmNvbnN0IG5vcm1hbGl6ZVByb3RlY3RDb25maWcgPSAoXG4gIGNvbmZpZzogYm9vbGVhbiB8IFByb3RlY3RDaGFuZ2VzQ29uZmlnIHwgdW5kZWZpbmVkLFxuKTogUHJvdGVjdENoYW5nZXNDb25maWcgPT4ge1xuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiB7IGJlZm9yZVVubG9hZDogZmFsc2UsIG9uRGF0YU92ZXJ3cml0ZTogZmFsc2UgfTtcbiAgfVxuICBpZiAoY29uZmlnID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIHsgYmVmb3JlVW5sb2FkOiB0cnVlLCBvbkRhdGFPdmVyd3JpdGU6IHRydWUgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGJlZm9yZVVubG9hZDogY29uZmlnLmJlZm9yZVVubG9hZCA/PyBmYWxzZSxcbiAgICBvbkRhdGFPdmVyd3JpdGU6IGNvbmZpZy5vbkRhdGFPdmVyd3JpdGUgPz8gZmFsc2UsXG4gIH07XG59O1xuXG4vKipcbiAqIHdpdGhQcm90ZWN0aW9uIGZlYXR1cmVcbiAqIEFkZHMgYmxvY2tpbmcgb3ZlcmxheSBwcm90ZWN0aW9uIHRvIHByZXZlbnQgY2xpY2tzIG91dHNpZGUgdGhlIGZvcm0gd2hlbiBtb2RpZmllZFxuICovXG5leHBvcnQgY29uc3Qgd2l0aFByb3RlY3Rpb24gPSAoY29uZmlnOiBGb3JtQ29uZmlnKSA9PiB7XG4gIHJldHVybiA8XG4gICAgVCBleHRlbmRzIEJhc2VGb3JtQ29tcG9uZW50ICYge1xuICAgICAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgICAgIHN0YXRlOiBGb3JtU3RhdGU7XG4gICAgICBlbWl0PzogKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgICAgb24/OiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWQ7XG4gICAgICByZXNldD86IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG4gICAgICBjbGVhckVycm9ycz86ICgpID0+IHZvaWQ7XG4gICAgICBkaXNhYmxlQ29udHJvbHM/OiAoKSA9PiB2b2lkO1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUID0+IHtcbiAgICAvLyBOb3JtYWxpemUgcHJvdGVjdGlvbiBjb25maWd1cmF0aW9uXG4gICAgY29uc3QgcHJvdGVjdENvbmZpZyA9IG5vcm1hbGl6ZVByb3RlY3RDb25maWcoY29uZmlnLnByb3RlY3RDaGFuZ2VzKTtcblxuICAgIC8vIElmIG92ZXJsYXkgcHJvdGVjdGlvbiBpcyBub3QgZW5hYmxlZCwgcmV0dXJuIGNvbXBvbmVudCB1bmNoYW5nZWRcbiAgICBpZiAoIXByb3RlY3RDb25maWcub25EYXRhT3ZlcndyaXRlKSB7XG4gICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgIH1cblxuICAgIC8vIFRyYWNrIGJsb2NraW5nIG92ZXJsYXkgZWxlbWVudHMgKHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodClcbiAgICBsZXQgYmxvY2tpbmdPdmVybGF5czogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICAgLy8gUmVzaXplL3Njcm9sbCBoYW5kbGVyIGZvciB1cGRhdGluZyBvdmVybGF5IHBvc2l0aW9uc1xuICAgIGxldCByZXNpemVIYW5kbGVyOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIFRyYWNrIGlmIHVzZXIgaGFzIGludGVyYWN0ZWQgd2l0aCB0aGUgZm9ybSAobWFkZSBhY3R1YWwgY2hhbmdlcylcbiAgICAvLyBUaGlzIHByZXZlbnRzIG92ZXJsYXlzIGZyb20gc2hvd2luZyBvbiBpbml0aWFsIGxvYWRcbiAgICBsZXQgaGFzVXNlckludGVyYWN0ZWQgPSBmYWxzZTtcblxuICAgIC8vIFRyYWNrIGlmIGRhdGEgaGFzIGJlZW4gbG9hZGVkIGF0IGxlYXN0IG9uY2VcbiAgICAvLyBUaGlzIGhlbHBzIGRpc3Rpbmd1aXNoIGJldHdlZW4gaW5pdGlhbCBsb2FkIGFuZCB1c2VyIGVkaXRzXG4gICAgbGV0IGRhdGFIYXNCZWVuTG9hZGVkID0gZmFsc2U7XG5cbiAgICAvLyBUcmFjayBpZiB3ZSdyZSBjdXJyZW50bHkgbG9hZGluZyBkYXRhIChpZ25vcmUgZmllbGQ6Y2hhbmdlIGV2ZW50cyBkdXJpbmcgdGhpcyB0aW1lKVxuICAgIGxldCBpc0xvYWRpbmdEYXRhID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGJsb2NraW5nIG92ZXJsYXkgZWxlbWVudHMgYXJvdW5kIHRoZSBmb3JtXG4gICAgICogVGhlc2Ugb3ZlcmxheXMgcHJldmVudCBjbGlja3Mgb3V0c2lkZSB0aGUgZm9ybSB3aGVuIGl0IGhhcyB1bnNhdmVkIGNoYW5nZXNcbiAgICAgKi9cbiAgICBjb25zdCBjcmVhdGVCbG9ja2luZ092ZXJsYXlzID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGJsb2NraW5nT3ZlcmxheXMubGVuZ3RoID4gMCkgcmV0dXJuOyAvLyBBbHJlYWR5IGNyZWF0ZWRcblxuICAgICAgY29uc3QgZm9ybUVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZm9ybUVsZW1lbnQpIHJldHVybjtcblxuICAgICAgLy8gR2V0IGZvcm0gcG9zaXRpb24gYW5kIGRpbWVuc2lvbnMgKHJlbGF0aXZlIHRvIHZpZXdwb3J0IGZvciBmaXhlZCBwb3NpdGlvbmluZylcbiAgICAgIGNvbnN0IHJlY3QgPSBmb3JtRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgLy8gQ29tbW9uIG92ZXJsYXkgc3R5bGVzIC0gdXNpbmcgZml4ZWQgcG9zaXRpb25pbmcgZm9yIHZpZXdwb3J0LXJlbGF0aXZlIHBsYWNlbWVudFxuICAgICAgLy8gei1pbmRleDogOTk5IGlzIGJlbG93IGRpYWxvZydzIG1vZGFsIHotaW5kZXggKDEwMDApIHNvIGRpYWxvZ3MgYXBwZWFyIGFib3ZlXG4gICAgICBjb25zdCBiYXNlU3R5bGVzID0gYFxuICAgICAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICB6LWluZGV4OiA5OTk7XG4gICAgICAgIGN1cnNvcjogbm90LWFsbG93ZWQ7XG4gICAgICBgO1xuXG4gICAgICAvLyBDcmVhdGUgdG9wIG92ZXJsYXkgKGZyb20gdG9wIG9mIHZpZXdwb3J0IHRvIHRvcCBvZiBmb3JtKVxuICAgICAgY29uc3QgdG9wT3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICB0b3BPdmVybGF5LmNsYXNzTmFtZSA9XG4gICAgICAgIFwibXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXkgbXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXktLXRvcFwiO1xuICAgICAgdG9wT3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gYCR7YmFzZVN0eWxlc31cbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAke3JlY3QudG9wfXB4O1xuICAgICAgYDtcblxuICAgICAgLy8gQ3JlYXRlIGJvdHRvbSBvdmVybGF5IChmcm9tIGJvdHRvbSBvZiBmb3JtIHRvIGJvdHRvbSBvZiB2aWV3cG9ydClcbiAgICAgIGNvbnN0IGJvdHRvbU92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgYm90dG9tT3ZlcmxheS5jbGFzc05hbWUgPVxuICAgICAgICBcIm10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5IG10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5LS1ib3R0b21cIjtcbiAgICAgIGJvdHRvbU92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGAke2Jhc2VTdHlsZXN9XG4gICAgICAgIHRvcDogJHtyZWN0LmJvdHRvbX1weDtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgIGA7XG5cbiAgICAgIC8vIENyZWF0ZSBsZWZ0IG92ZXJsYXkgKGZyb20gbGVmdCBvZiB2aWV3cG9ydCB0byBsZWZ0IG9mIGZvcm0sIGJldHdlZW4gdG9wIGFuZCBib3R0b20pXG4gICAgICBjb25zdCBsZWZ0T3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICBsZWZ0T3ZlcmxheS5jbGFzc05hbWUgPVxuICAgICAgICBcIm10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5IG10cmwtZm9ybS1ibG9ja2luZy1vdmVybGF5LS1sZWZ0XCI7XG4gICAgICBsZWZ0T3ZlcmxheS5zdHlsZS5jc3NUZXh0ID0gYCR7YmFzZVN0eWxlc31cbiAgICAgICAgdG9wOiAke3JlY3QudG9wfXB4O1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB3aWR0aDogJHtyZWN0LmxlZnR9cHg7XG4gICAgICAgIGhlaWdodDogJHtyZWN0LmhlaWdodH1weDtcbiAgICAgIGA7XG5cbiAgICAgIC8vIENyZWF0ZSByaWdodCBvdmVybGF5IChmcm9tIHJpZ2h0IG9mIGZvcm0gdG8gcmlnaHQgb2Ygdmlld3BvcnQsIGJldHdlZW4gdG9wIGFuZCBib3R0b20pXG4gICAgICBjb25zdCByaWdodE92ZXJsYXkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgcmlnaHRPdmVybGF5LmNsYXNzTmFtZSA9XG4gICAgICAgIFwibXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXkgbXRybC1mb3JtLWJsb2NraW5nLW92ZXJsYXktLXJpZ2h0XCI7XG4gICAgICByaWdodE92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGAke2Jhc2VTdHlsZXN9XG4gICAgICAgIHRvcDogJHtyZWN0LnRvcH1weDtcbiAgICAgICAgbGVmdDogJHtyZWN0LnJpZ2h0fXB4O1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgaGVpZ2h0OiAke3JlY3QuaGVpZ2h0fXB4O1xuICAgICAgYDtcblxuICAgICAgLy8gQWRkIGNsaWNrIGhhbmRsZXIgdG8gc2hvdyBkaWFsb2cgd2hlbiBjbGlja2luZyBvbiBvdmVybGF5XG4gICAgICBjb25zdCBoYW5kbGVPdmVybGF5Q2xpY2sgPSAoZTogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgLy8gRW1pdCBkYXRhOmNvbmZsaWN0IGV2ZW50IHRvIHNob3cgZGlhbG9nXG4gICAgICAgIGNvbnN0IGNvbmZsaWN0RXZlbnQ6IERhdGFDb25mbGljdEV2ZW50ID0ge1xuICAgICAgICAgIGN1cnJlbnREYXRhOiB7IC4uLmNvbXBvbmVudC5zdGF0ZS5jdXJyZW50RGF0YSB9LFxuICAgICAgICAgIG5ld0RhdGE6IHt9LFxuICAgICAgICAgIGNhbmNlbGxlZDogZmFsc2UsXG4gICAgICAgICAgY2FuY2VsOiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBVc2VyIGNob3NlIHRvIGtlZXAgZWRpdGluZyAtIGRvIG5vdGhpbmcsIG92ZXJsYXlzIHN0YXlcbiAgICAgICAgICB9LFxuICAgICAgICAgIHByb2NlZWQ6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIFVzZXIgY2hvc2UgdG8gZGlzY2FyZCAtIHJlc2V0IGZvcm0gdG8gaW5pdGlhbCBzdGF0ZVxuICAgICAgICAgICAgLy8gU2FtZSBhcyBjYW5jZWwgYnV0dG9uIGJlaGF2aW9yXG4gICAgICAgICAgICBoYXNVc2VySW50ZXJhY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gUmVzZXQgZm9ybSB0byBpbml0aWFsIGRhdGEgKGZvcmNlPXRydWUgYnlwYXNzZXMgcHJvdGVjdGlvbilcbiAgICAgICAgICAgIGNvbXBvbmVudC5yZXNldD8uKHRydWUpO1xuICAgICAgICAgICAgLy8gQ2xlYXIgYW55IHZhbGlkYXRpb24gZXJyb3JzXG4gICAgICAgICAgICBjb21wb25lbnQuY2xlYXJFcnJvcnM/LigpO1xuICAgICAgICAgICAgLy8gRGlzYWJsZSBjb250cm9scyAoZm9ybSBpcyBub3cgcHJpc3RpbmUpXG4gICAgICAgICAgICBjb21wb25lbnQuZGlzYWJsZUNvbnRyb2xzPy4oKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuREFUQV9DT05GTElDVCwgY29uZmxpY3RFdmVudCk7XG4gICAgICB9O1xuXG4gICAgICBbdG9wT3ZlcmxheSwgYm90dG9tT3ZlcmxheSwgbGVmdE92ZXJsYXksIHJpZ2h0T3ZlcmxheV0uZm9yRWFjaChcbiAgICAgICAgKG92ZXJsYXkpID0+IHtcbiAgICAgICAgICBvdmVybGF5LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVPdmVybGF5Q2xpY2spO1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQob3ZlcmxheSk7XG4gICAgICAgICAgYmxvY2tpbmdPdmVybGF5cy5wdXNoKG92ZXJsYXkpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBibG9ja2luZyBvdmVybGF5IGVsZW1lbnRzXG4gICAgICovXG4gICAgY29uc3QgcmVtb3ZlQmxvY2tpbmdPdmVybGF5cyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChibG9ja2luZ092ZXJsYXlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICBibG9ja2luZ092ZXJsYXlzLmZvckVhY2goKG92ZXJsYXkpID0+IHtcbiAgICAgICAgb3ZlcmxheS5yZW1vdmUoKTtcbiAgICAgIH0pO1xuICAgICAgYmxvY2tpbmdPdmVybGF5cyA9IFtdO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGJsb2NraW5nIG92ZXJsYXlzIHBvc2l0aW9uIChlLmcuLCBvbiB3aW5kb3cgcmVzaXplKVxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUJsb2NraW5nT3ZlcmxheXMgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoYmxvY2tpbmdPdmVybGF5cy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgICAgY29uc3QgZm9ybUVsZW1lbnQgPSBjb21wb25lbnQuZWxlbWVudDtcbiAgICAgIGlmICghZm9ybUVsZW1lbnQpIHJldHVybjtcblxuICAgICAgY29uc3QgcmVjdCA9IGZvcm1FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAvLyBVcGRhdGUgZWFjaCBvdmVybGF5IHBvc2l0aW9uICh1c2luZyBmaXhlZCBwb3NpdGlvbmluZywgbm8gc2Nyb2xsIG9mZnNldCBuZWVkZWQpXG4gICAgICBjb25zdCBbdG9wT3ZlcmxheSwgYm90dG9tT3ZlcmxheSwgbGVmdE92ZXJsYXksIHJpZ2h0T3ZlcmxheV0gPVxuICAgICAgICBibG9ja2luZ092ZXJsYXlzO1xuXG4gICAgICBpZiAodG9wT3ZlcmxheSkge1xuICAgICAgICB0b3BPdmVybGF5LnN0eWxlLmhlaWdodCA9IGAke3JlY3QudG9wfXB4YDtcbiAgICAgIH1cbiAgICAgIGlmIChib3R0b21PdmVybGF5KSB7XG4gICAgICAgIGJvdHRvbU92ZXJsYXkuc3R5bGUudG9wID0gYCR7cmVjdC5ib3R0b219cHhgO1xuICAgICAgfVxuICAgICAgaWYgKGxlZnRPdmVybGF5KSB7XG4gICAgICAgIGxlZnRPdmVybGF5LnN0eWxlLnRvcCA9IGAke3JlY3QudG9wfXB4YDtcbiAgICAgICAgbGVmdE92ZXJsYXkuc3R5bGUud2lkdGggPSBgJHtyZWN0LmxlZnR9cHhgO1xuICAgICAgICBsZWZ0T3ZlcmxheS5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0LmhlaWdodH1weGA7XG4gICAgICB9XG4gICAgICBpZiAocmlnaHRPdmVybGF5KSB7XG4gICAgICAgIHJpZ2h0T3ZlcmxheS5zdHlsZS50b3AgPSBgJHtyZWN0LnRvcH1weGA7XG4gICAgICAgIHJpZ2h0T3ZlcmxheS5zdHlsZS5sZWZ0ID0gYCR7cmVjdC5yaWdodH1weGA7XG4gICAgICAgIHJpZ2h0T3ZlcmxheS5zdHlsZS5oZWlnaHQgPSBgJHtyZWN0LmhlaWdodH1weGA7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZXMgYmxvY2tpbmcgb3ZlcmxheXMgYmFzZWQgb24gbW9kaWZpZWQgc3RhdGVcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVQcm90ZWN0aW9uU3RhdGUgPSAobW9kaWZpZWQ6IGJvb2xlYW4pOiB2b2lkID0+IHtcbiAgICAgIGlmIChtb2RpZmllZCAmJiBoYXNVc2VySW50ZXJhY3RlZCkge1xuICAgICAgICBjcmVhdGVCbG9ja2luZ092ZXJsYXlzKCk7XG4gICAgICAgIC8vIEFkZCByZXNpemUvc2Nyb2xsIGxpc3RlbmVycyB0byB1cGRhdGUgb3ZlcmxheSBwb3NpdGlvbnNcbiAgICAgICAgaWYgKCFyZXNpemVIYW5kbGVyKSB7XG4gICAgICAgICAgcmVzaXplSGFuZGxlciA9IHVwZGF0ZUJsb2NraW5nT3ZlcmxheXM7XG4gICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlbW92ZUJsb2NraW5nT3ZlcmxheXMoKTtcbiAgICAgICAgLy8gUmVtb3ZlIHJlc2l6ZS9zY3JvbGwgbGlzdGVuZXJzXG4gICAgICAgIGlmIChyZXNpemVIYW5kbGVyKSB7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgcmVzaXplSGFuZGxlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gTGlzdGVuIGZvciBmaWVsZDpjaGFuZ2UgZXZlbnRzIHRvIGRldGVjdCBhY3R1YWwgdXNlciBlZGl0c1xuICAgIC8vIFRoaXMgaXMgbW9yZSByZWxpYWJsZSB0aGFuIFNUQVRFX0NIQU5HRSBiZWNhdXNlIGl0IGZpcmVzIG9uIGV2ZXJ5IGZpZWxkIGVkaXRcbiAgICBjb21wb25lbnQub24/LihcImZpZWxkOmNoYW5nZVwiLCAoKSA9PiB7XG4gICAgICAvLyBJZ25vcmUgZmllbGQ6Y2hhbmdlIGV2ZW50cyBkdXJpbmcgZGF0YSBsb2FkaW5nXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBmcm9tIHByb2dyYW1tYXRpYyBmaWVsZCB1cGRhdGVzXG4gICAgICBpZiAoaXNMb2FkaW5nRGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE9ubHkgc2V0IGhhc1VzZXJJbnRlcmFjdGVkIGlmIGRhdGEgaGFzIGJlZW4gbG9hZGVkXG4gICAgICAvLyBUaGlzIHByZXZlbnRzIGZhbHNlIHBvc2l0aXZlcyBkdXJpbmcgaW5pdGlhbCBmb3JtIHNldHVwXG4gICAgICBpZiAoZGF0YUhhc0JlZW5Mb2FkZWQgJiYgIWhhc1VzZXJJbnRlcmFjdGVkKSB7XG4gICAgICAgIGhhc1VzZXJJbnRlcmFjdGVkID0gdHJ1ZTtcbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgbmVlZCB0byBzaG93IG92ZXJsYXlzIG5vd1xuICAgICAgICBpZiAoY29tcG9uZW50LnN0YXRlLm1vZGlmaWVkKSB7XG4gICAgICAgICAgdXBkYXRlUHJvdGVjdGlvblN0YXRlKHRydWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBMaXN0ZW4gZm9yIHN0YXRlIGNoYW5nZXMgdG8gc2hvdy9oaWRlIG92ZXJsYXlzXG4gICAgY29tcG9uZW50Lm9uPy4oRk9STV9FVkVOVFMuU1RBVEVfQ0hBTkdFLCAoZXZlbnQ6IHsgbW9kaWZpZWQ6IGJvb2xlYW4gfSkgPT4ge1xuICAgICAgLy8gV2hlbiBmb3JtIGJlY29tZXMgcHJpc3RpbmUgKGRhdGEgbG9hZGVkKSwgcmVzZXQgdGhlIGludGVyYWN0aW9uIGZsYWdcbiAgICAgIC8vIGFuZCBtYXJrIHRoYXQgZGF0YSBoYXMgYmVlbiBsb2FkZWRcbiAgICAgIGlmICghZXZlbnQubW9kaWZpZWQpIHtcbiAgICAgICAgaGFzVXNlckludGVyYWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgZGF0YUhhc0JlZW5Mb2FkZWQgPSB0cnVlO1xuICAgICAgICBpc0xvYWRpbmdEYXRhID0gdHJ1ZTtcblxuICAgICAgICAvLyBDbGVhciB0aGUgbG9hZGluZyBmbGFnIGFmdGVyIGEgc2hvcnQgZGVsYXkgdG8gYWxsb3cgYWxsIHByb2dyYW1tYXRpY1xuICAgICAgICAvLyBmaWVsZCB1cGRhdGVzIHRvIGNvbXBsZXRlIChjdXN0b20gZmllbGRzIG1heSB1cGRhdGUgYXN5bmMpXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlzTG9hZGluZ0RhdGEgPSBmYWxzZTtcbiAgICAgICAgfSwgMTAwKTtcbiAgICAgIH1cblxuICAgICAgLy8gVXBkYXRlIHByb3RlY3Rpb24gc3RhdGVcbiAgICAgIHVwZGF0ZVByb3RlY3Rpb25TdGF0ZShldmVudC5tb2RpZmllZCk7XG4gICAgfSk7XG5cbiAgICAvLyBBbHNvIGxpc3RlbiBmb3IgcmVzZXQgZXZlbnQgdG8gcmVtb3ZlIG92ZXJsYXlzXG4gICAgY29tcG9uZW50Lm9uPy4oRk9STV9FVkVOVFMuUkVTRVQsICgpID0+IHtcbiAgICAgIHVwZGF0ZVByb3RlY3Rpb25TdGF0ZShmYWxzZSk7XG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlciBjbGVhbnVwIHdoZW4gY29tcG9uZW50IGlzIGRlc3Ryb3llZFxuICAgIGNvbnN0IG9yaWdpbmFsTGlmZWN5Y2xlID0gY29tcG9uZW50LmxpZmVjeWNsZTtcbiAgICBpZiAob3JpZ2luYWxMaWZlY3ljbGUpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IG9yaWdpbmFsTGlmZWN5Y2xlLmRlc3Ryb3k7XG4gICAgICBvcmlnaW5hbExpZmVjeWNsZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICAvLyBDbGVhbiB1cCBibG9ja2luZyBvdmVybGF5c1xuICAgICAgICByZW1vdmVCbG9ja2luZ092ZXJsYXlzKCk7XG4gICAgICAgIGlmIChyZXNpemVIYW5kbGVyKSB7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgcmVzaXplSGFuZGxlcik7XG4gICAgICAgICAgcmVzaXplSGFuZGxlciA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2FsbCBvcmlnaW5hbCBkZXN0cm95XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveT8uKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBjb21wb25lbnQ7XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoUHJvdGVjdGlvbjtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvZm9ybS9mZWF0dXJlcy9hcGkudHNcblxuLyoqXG4gKiBBUEkgZmVhdHVyZSBmb3IgRm9ybSBjb21wb25lbnRcbiAqIFByb3ZpZGVzIGEgY2xlYW4sIHVuaWZpZWQgcHVibGljIEFQSSBmb3IgdGhlIGZvcm1cbiAqIEFsc28gd2lyZXMgdXAgY29udHJvbCBidXR0b24gY2xpY2sgaGFuZGxlcnMgKHN1Ym1pdC9jYW5jZWwpXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBGb3JtQ29uZmlnLFxuICBCYXNlRm9ybUNvbXBvbmVudCxcbiAgRm9ybUNvbXBvbmVudCxcbiAgRm9ybURhdGEsXG4gIERhdGFTdGF0ZSxcbiAgRm9ybVN0YXRlLFxuICBGb3JtRmllbGQsXG4gIEZvcm1GaWVsZFJlZ2lzdHJ5LFxuICBGb3JtVmFsaWRhdGlvblJlc3VsdCxcbiAgRm9ybVN1Ym1pdE9wdGlvbnMsXG4gIEZpZWxkVmFsdWUsXG59IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgRk9STV9FVkVOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogV2lyZXMgdXAgY2xpY2sgaGFuZGxlcnMgZm9yIGNvbnRyb2wgYnV0dG9ucyAoc3VibWl0LCBjYW5jZWwpXG4gKi9cbmNvbnN0IHdpcmVDb250cm9sQnV0dG9ucyA9IChcbiAgY29udHJvbHM6IE1hcDxzdHJpbmcsIEZvcm1GaWVsZD4sXG4gIGFwaTogRm9ybUNvbXBvbmVudCxcbiAgY29uZmlnOiBGb3JtQ29uZmlnLFxuKTogdm9pZCA9PiB7XG4gIC8vIFdpcmUgc3VibWl0IGJ1dHRvblxuICBjb25zdCBzdWJtaXRCdXR0b24gPSBjb250cm9scy5nZXQoXCJzdWJtaXRcIik7XG4gIGlmIChzdWJtaXRCdXR0b24/LmVsZW1lbnQpIHtcbiAgICBzdWJtaXRCdXR0b24uZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGNvbmZpZy5vblN1Ym1pdCkge1xuICAgICAgICAvLyBVc2UgY3VzdG9tIHN1Ym1pdCBoYW5kbGVyXG4gICAgICAgIC8vIE5vdGU6IFdlIGRvIE5PVCBhdXRvLWRpc2FibGUgY29udHJvbHMgaGVyZSAtIHRoZSBjdXN0b20gaGFuZGxlclxuICAgICAgICAvLyBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgY29udHJvbCBzdGF0ZSAoZS5nLiwgaXQgbWF5IG9wZW4gYSBkaWFsb2dcbiAgICAgICAgLy8gZm9yIGFzeW5jIG9wZXJhdGlvbnMgbGlrZSBmaWxlIHVwbG9hZHMpXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGFwaS5nZXREYXRhKCk7XG4gICAgICAgICAgYXdhaXQgY29uZmlnLm9uU3VibWl0KGRhdGEsIGFwaSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcIkZvcm0gc3VibWl0IGVycm9yOlwiLCBlcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFVzZSBkZWZhdWx0IGZvcm0gc3VibWl0IChoYW5kbGVzIGRpc2FibGluZyBpbnRlcm5hbGx5KVxuICAgICAgICBhd2FpdCBhcGkuc3VibWl0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyBXaXJlIGNhbmNlbCBidXR0b25cbiAgY29uc3QgY2FuY2VsQnV0dG9uID0gY29udHJvbHMuZ2V0KFwiY2FuY2VsXCIpO1xuICBpZiAoY2FuY2VsQnV0dG9uPy5lbGVtZW50KSB7XG4gICAgY2FuY2VsQnV0dG9uLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIGlmIChjb25maWcub25DYW5jZWwpIHtcbiAgICAgICAgLy8gVXNlIGN1c3RvbSBjYW5jZWwgaGFuZGxlclxuICAgICAgICBjb25maWcub25DYW5jZWwoYXBpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERlZmF1bHQ6IHJlc2V0IGZvcm0gdG8gaW5pdGlhbCBzdGF0ZVxuICAgICAgICAvLyBVc2UgZm9yY2U9dHJ1ZSB0byBieXBhc3MgcHJvdGVjdGlvbiBzaW5jZSB0aGlzIGlzIGFuIGludGVudGlvbmFsIHVzZXIgYWN0aW9uXG4gICAgICAgIGFwaS5yZXNldCh0cnVlKTtcbiAgICAgIH1cbiAgICAgIC8vIENsZWFyIGFueSB2YWxpZGF0aW9uIGVycm9ycyAodmlzdWFsIHN0YXRlIG9uIGZpZWxkcylcbiAgICAgIGFwaS5jbGVhckVycm9ycygpO1xuICAgICAgLy8gQWZ0ZXIgY2FuY2VsLCBkaXNhYmxlIGNvbnRyb2xzIChmb3JtIGlzIG5vdyBwcmlzdGluZSlcbiAgICAgIGFwaS5kaXNhYmxlQ29udHJvbHMoKTtcbiAgICB9KTtcbiAgfVxufTtcblxuLyoqXG4gKiBFeHRlbmRlZCBjb21wb25lbnQgaW50ZXJmYWNlIGJlZm9yZSBBUEkgaXMgYXBwbGllZFxuICovXG5pbnRlcmZhY2UgRW5oYW5jZWRGb3JtQ29tcG9uZW50IGV4dGVuZHMgQmFzZUZvcm1Db21wb25lbnQge1xuICBmb3JtOiBIVE1MRm9ybUVsZW1lbnQ7XG4gIHVpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgZmllbGRzOiBGb3JtRmllbGRSZWdpc3RyeTtcbiAgZmlsZXM6IEZvcm1GaWVsZFJlZ2lzdHJ5O1xuICBzdGF0ZTogRm9ybVN0YXRlO1xuICBjb250cm9sczogTWFwPHN0cmluZywgRm9ybUZpZWxkPjtcblxuICAvLyBEYXRhIG1ldGhvZHNcbiAgZ2V0RGF0YTogKCkgPT4gRm9ybURhdGE7XG4gIHNldERhdGE6IChkYXRhOiBGb3JtRGF0YSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcbiAgZ2V0RmllbGRWYWx1ZTogKG5hbWU6IHN0cmluZykgPT4gRmllbGRWYWx1ZTtcbiAgc2V0RmllbGRWYWx1ZTogKG5hbWU6IHN0cmluZywgdmFsdWU6IEZpZWxkVmFsdWUsIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG4gIGlzTW9kaWZpZWQ6ICgpID0+IGJvb2xlYW47XG4gIGdldE1vZGlmaWVkRGF0YTogKCkgPT4gRm9ybURhdGE7XG4gIHNuYXBzaG90OiAoKSA9PiB2b2lkO1xuICByZXNldDogKGZvcmNlPzogYm9vbGVhbikgPT4gYm9vbGVhbjtcbiAgY2xlYXI6IChmb3JjZT86IGJvb2xlYW4pID0+IGJvb2xlYW47XG5cbiAgLy8gRmllbGQgbWV0aG9kc1xuICBnZXRGaWVsZDogKG5hbWU6IHN0cmluZykgPT4gRm9ybUZpZWxkIHwgdW5kZWZpbmVkO1xuICBnZXRGaWVsZE5hbWVzOiAoKSA9PiBzdHJpbmdbXTtcbiAgaGFzRmllbGQ6IChuYW1lOiBzdHJpbmcpID0+IGJvb2xlYW47XG5cbiAgLy8gQ29udHJvbGxlciBtZXRob2RzXG4gIGdldERhdGFTdGF0ZTogKCkgPT4gRGF0YVN0YXRlO1xuICBlbmFibGVDb250cm9sczogKCkgPT4gdm9pZDtcbiAgZGlzYWJsZUNvbnRyb2xzOiAoKSA9PiB2b2lkO1xuICBlbmFibGVGaWVsZHM6ICgpID0+IHZvaWQ7XG4gIGRpc2FibGVGaWVsZHM6ICgpID0+IHZvaWQ7XG5cbiAgLy8gU3VibWl0L1ZhbGlkYXRpb24gbWV0aG9kc1xuICB2YWxpZGF0ZTogKCkgPT4gRm9ybVZhbGlkYXRpb25SZXN1bHQ7XG4gIHZhbGlkYXRlRmllbGQ6IChmaWVsZE5hbWU6IHN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBzdWJtaXQ6IChvcHRpb25zPzogRm9ybVN1Ym1pdE9wdGlvbnMpID0+IFByb21pc2U8dW5rbm93bj47XG4gIHNldFZhbGlkYXRpb25SdWxlczogKHJ1bGVzOiBpbXBvcnQoXCIuLi90eXBlc1wiKS5Gb3JtVmFsaWRhdGlvblJ1bGVbXSkgPT4gdm9pZDtcbiAgY2xlYXJFcnJvcnM6ICgpID0+IHZvaWQ7XG4gIGNsZWFyRmllbGRFcnJvcjogKGZpZWxkOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHNldEZpZWxkRXJyb3I6IChmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKSA9PiB2b2lkO1xuICBnZXRGaWVsZEVycm9yOiAoZmllbGQ6IHN0cmluZykgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8vIEV2ZW50IG1ldGhvZHNcbiAgb24/OiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pID0+IHZvaWQ7XG4gIG9mZj86IChldmVudDogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbikgPT4gdm9pZDtcbiAgZW1pdD86IChldmVudDogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZDtcblxuICAvLyBMaWZlY3ljbGVcbiAgbGlmZWN5Y2xlPzoge1xuICAgIGRlc3Ryb3k6ICgpID0+IHZvaWQ7XG4gIH07XG59XG5cbi8qKlxuICogd2l0aEFQSSBmZWF0dXJlXG4gKiBDcmVhdGVzIGEgY2xlYW4gcHVibGljIEFQSSBmb3IgdGhlIGZvcm0gY29tcG9uZW50XG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQVBJID0gKGNvbmZpZzogRm9ybUNvbmZpZykgPT4ge1xuICByZXR1cm4gKGNvbXBvbmVudDogRW5oYW5jZWRGb3JtQ29tcG9uZW50KTogRm9ybUNvbXBvbmVudCA9PiB7XG4gICAgLy8gUmVnaXN0ZXIgZXZlbnQgaGFuZGxlcnMgZnJvbSBjb25maWdcbiAgICBpZiAoY29uZmlnLm9uICYmIGNvbXBvbmVudC5vbikge1xuICAgICAgZm9yIChjb25zdCBbZXZlbnQsIGhhbmRsZXJdIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5vbikpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICBjb21wb25lbnQub24oZXZlbnQsIGhhbmRsZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBwdWJsaWMgQVBJXG4gICAgY29uc3QgYXBpOiBGb3JtQ29tcG9uZW50ID0ge1xuICAgICAgLy8gQ29yZSBwcm9wZXJ0aWVzXG4gICAgICBlbGVtZW50OiBjb21wb25lbnQuZWxlbWVudCxcbiAgICAgIGZvcm06IGNvbXBvbmVudC5mb3JtLFxuICAgICAgdWk6IGNvbXBvbmVudC51aSxcbiAgICAgIGZpZWxkczogY29tcG9uZW50LmZpZWxkcyxcbiAgICAgIHN0YXRlOiBjb21wb25lbnQuc3RhdGUsXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gRGF0YSBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgZm9ybSBkYXRhIGFzIGEga2V5LXZhbHVlIG9iamVjdFxuICAgICAgICovXG4gICAgICBnZXREYXRhKCk6IEZvcm1EYXRhIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXREYXRhKCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFNldCBmb3JtIGRhdGEgZnJvbSBhIGtleS12YWx1ZSBvYmplY3RcbiAgICAgICAqIEBwYXJhbSBkYXRhIC0gRGF0YSB0byBzZXRcbiAgICAgICAqIEBwYXJhbSBzaWxlbnQgLSBJZiB0cnVlLCBkb24ndCBlbWl0IGNoYW5nZSBldmVudHNcbiAgICAgICAqL1xuICAgICAgc2V0RGF0YShkYXRhOiBGb3JtRGF0YSwgc2lsZW50PzogYm9vbGVhbik6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuc2V0RGF0YShkYXRhLCBzaWxlbnQpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYSBzcGVjaWZpYyBmaWVsZCdzIHZhbHVlXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIEZpZWxkIG5hbWVcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRWYWx1ZShuYW1lOiBzdHJpbmcpOiBGaWVsZFZhbHVlIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXRGaWVsZFZhbHVlKG5hbWUpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgYSBzcGVjaWZpYyBmaWVsZCdzIHZhbHVlXG4gICAgICAgKiBAcGFyYW0gbmFtZSAtIEZpZWxkIG5hbWVcbiAgICAgICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHNldFxuICAgICAgICogQHBhcmFtIHNpbGVudCAtIElmIHRydWUsIGRvbid0IGVtaXQgY2hhbmdlIGV2ZW50c1xuICAgICAgICovXG4gICAgICBzZXRGaWVsZFZhbHVlKFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHZhbHVlOiBGaWVsZFZhbHVlLFxuICAgICAgICBzaWxlbnQ/OiBib29sZWFuLFxuICAgICAgKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5zZXRGaWVsZFZhbHVlKG5hbWUsIHZhbHVlLCBzaWxlbnQpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgYSBmaWVsZCBjb21wb25lbnQgYnkgbmFtZVxuICAgICAgICogQHBhcmFtIG5hbWUgLSBGaWVsZCBuYW1lXG4gICAgICAgKi9cbiAgICAgIGdldEZpZWxkKG5hbWU6IHN0cmluZyk6IEZvcm1GaWVsZCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RmllbGQobmFtZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBhbGwgZmllbGQgbmFtZXNcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGROYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQuZ2V0RmllbGROYW1lcygpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBpZiBmb3JtIGhhcyBiZWVuIG1vZGlmaWVkIGZyb20gaW5pdGlhbC9zbmFwc2hvdCBzdGF0ZVxuICAgICAgICovXG4gICAgICBpc01vZGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmlzTW9kaWZpZWQoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gU3RhdGUgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZGF0YSBzdGF0ZSAocHJpc3RpbmUgb3IgZGlydHkpXG4gICAgICAgKi9cbiAgICAgIGdldERhdGFTdGF0ZSgpOiBEYXRhU3RhdGUge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LmdldERhdGFTdGF0ZSgpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBWYWxpZGF0aW9uIEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogVmFsaWRhdGUgdGhlIGZvcm0gYWdhaW5zdCBjb25maWd1cmVkIHJ1bGVzXG4gICAgICAgKiBBdXRvbWF0aWNhbGx5IHNob3dzIGVycm9ycyBvbiBmaWVsZCBjb21wb25lbnRzXG4gICAgICAgKiBAcmV0dXJucyBWYWxpZGF0aW9uIHJlc3VsdCB3aXRoIHZhbGlkIGZsYWcgYW5kIGVycm9yc1xuICAgICAgICovXG4gICAgICB2YWxpZGF0ZSgpOiBGb3JtVmFsaWRhdGlvblJlc3VsdCB7XG4gICAgICAgIHJldHVybiBjb21wb25lbnQudmFsaWRhdGUoKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogVmFsaWRhdGUgYSBzaW5nbGUgZmllbGRcbiAgICAgICAqIEBwYXJhbSBmaWVsZE5hbWUgLSBGaWVsZCBuYW1lIHRvIHZhbGlkYXRlXG4gICAgICAgKiBAcmV0dXJucyBFcnJvciBtZXNzYWdlIGlmIGludmFsaWQsIHVuZGVmaW5lZCBpZiB2YWxpZFxuICAgICAgICovXG4gICAgICB2YWxpZGF0ZUZpZWxkKGZpZWxkTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC52YWxpZGF0ZUZpZWxkKGZpZWxkTmFtZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGFsbCB2YWxpZGF0aW9uIGVycm9yc1xuICAgICAgICovXG4gICAgICBjbGVhckVycm9ycygpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmNsZWFyRXJyb3JzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIENsZWFyIGVycm9yIGZvciBhIHNwZWNpZmljIGZpZWxkXG4gICAgICAgKiBAcGFyYW0gZmllbGQgLSBGaWVsZCBuYW1lXG4gICAgICAgKi9cbiAgICAgIGNsZWFyRmllbGRFcnJvcihmaWVsZDogc3RyaW5nKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5jbGVhckZpZWxkRXJyb3IoZmllbGQpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLyoqXG4gICAgICAgKiBTZXQgZXJyb3IgZm9yIGEgc3BlY2lmaWMgZmllbGRcbiAgICAgICAqIEBwYXJhbSBmaWVsZCAtIEZpZWxkIG5hbWVcbiAgICAgICAqIEBwYXJhbSBlcnJvciAtIEVycm9yIG1lc3NhZ2VcbiAgICAgICAqL1xuICAgICAgc2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nLCBlcnJvcjogc3RyaW5nKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5zZXRGaWVsZEVycm9yKGZpZWxkLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEdldCBlcnJvciBmb3IgYSBzcGVjaWZpYyBmaWVsZFxuICAgICAgICogQHBhcmFtIGZpZWxkIC0gRmllbGQgbmFtZVxuICAgICAgICogQHJldHVybnMgRXJyb3IgbWVzc2FnZSBvciB1bmRlZmluZWRcbiAgICAgICAqL1xuICAgICAgZ2V0RmllbGRFcnJvcihmaWVsZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5nZXRGaWVsZEVycm9yKGZpZWxkKTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgICAgLy8gU3VibWl0IEFQSVxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgICAgIC8qKlxuICAgICAgICogU3VibWl0IHRoZSBmb3JtXG4gICAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIHN1Ym1pdCBjb25maWd1cmF0aW9uXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHN1Ym1pdChvcHRpb25zPzogRm9ybVN1Ym1pdE9wdGlvbnMpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5zdWJtaXQob3B0aW9ucyk7XG4gICAgICB9LFxuXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAgIC8vIFN0YXRlIE1hbmFnZW1lbnQgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBSZXNldCBmb3JtIHRvIGluaXRpYWwvc25hcHNob3Qgc3RhdGVcbiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2UgLSBJZiB0cnVlLCBieXBhc3MgcHJvdGVjdGlvbiBhbmQgcmVzZXQgaW1tZWRpYXRlbHlcbiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSB0cnVlIGlmIHJlc2V0IHdhcyBwZXJmb3JtZWQsIGZhbHNlIGlmIGNhbmNlbGxlZCBieSBwcm90ZWN0aW9uXG4gICAgICAgKi9cbiAgICAgIHJlc2V0KGZvcmNlPzogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gY29tcG9uZW50LnJlc2V0KGZvcmNlKTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogQ2xlYXIgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcmNlIC0gSWYgdHJ1ZSwgYnlwYXNzIHByb3RlY3Rpb24gYW5kIGNsZWFyIGltbWVkaWF0ZWx5XG4gICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gdHJ1ZSBpZiBjbGVhciB3YXMgcGVyZm9ybWVkLCBmYWxzZSBpZiBjYW5jZWxsZWQgYnkgcHJvdGVjdGlvblxuICAgICAgICovXG4gICAgICBjbGVhcihmb3JjZT86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5jbGVhcihmb3JjZSk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIFRha2UgYSBzbmFwc2hvdCBvZiBjdXJyZW50IGRhdGEgYXMgdGhlIG5ldyBiYXNlbGluZVxuICAgICAgICogUmVzZXRzIG1vZGlmaWVkIHN0YXRlIHRvIGZhbHNlIGFuZCByZW1vdmVzIHByb3RlY3Rpb24gb3ZlcmxheXNcbiAgICAgICAqIFVzZWZ1bCBhZnRlciBzdWNjZXNzZnVsIGZvcm0gc3VibWlzc2lvblxuICAgICAgICovXG4gICAgICBzbmFwc2hvdCgpOiB2b2lkIHtcbiAgICAgICAgY29tcG9uZW50LnNuYXBzaG90KCk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBhbGwgZm9ybSBmaWVsZHNcbiAgICAgICAqL1xuICAgICAgZW5hYmxlKCk6IEZvcm1Db21wb25lbnQge1xuICAgICAgICBjb21wb25lbnQuZW5hYmxlRmllbGRzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgYWxsIGZvcm0gZmllbGRzXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGUoKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5kaXNhYmxlRmllbGRzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVuYWJsZSBjb250cm9sIGJ1dHRvbnMgKHN1Ym1pdCwgY2FuY2VsLCBldGMuKVxuICAgICAgICovXG4gICAgICBlbmFibGVDb250cm9scygpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmVuYWJsZUNvbnRyb2xzKCk7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIERpc2FibGUgY29udHJvbCBidXR0b25zXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVDb250cm9scygpOiBGb3JtQ29tcG9uZW50IHtcbiAgICAgICAgY29tcG9uZW50LmRpc2FibGVDb250cm9scygpO1xuICAgICAgICByZXR1cm4gYXBpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBFdmVudCBBUElcbiAgICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gICAgICAvKipcbiAgICAgICAqIEFkZCBhbiBldmVudCBsaXN0ZW5lclxuICAgICAgICogQHBhcmFtIGV2ZW50IC0gRXZlbnQgbmFtZVxuICAgICAgICogQHBhcmFtIGhhbmRsZXIgLSBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAgICAgKi9cbiAgICAgIG9uKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5vbj8uKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIGFwaTtcbiAgICAgIH0sXG5cbiAgICAgIC8qKlxuICAgICAgICogUmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAgICAgKiBAcGFyYW0gZXZlbnQgLSBFdmVudCBuYW1lXG4gICAgICAgKiBAcGFyYW0gaGFuZGxlciAtIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cbiAgICAgICAqL1xuICAgICAgb2ZmKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogRm9ybUNvbXBvbmVudCB7XG4gICAgICAgIGNvbXBvbmVudC5vZmY/LihldmVudCwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiBhcGk7XG4gICAgICB9LFxuXG4gICAgICAvKipcbiAgICAgICAqIEVtaXQgYW4gZXZlbnRcbiAgICAgICAqIEBwYXJhbSBldmVudCAtIEV2ZW50IG5hbWVcbiAgICAgICAqIEBwYXJhbSBkYXRhIC0gRXZlbnQgZGF0YVxuICAgICAgICovXG4gICAgICBlbWl0KGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKTogdm9pZCB7XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oZXZlbnQsIGRhdGEpO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgICAvLyBMaWZlY3ljbGUgQVBJXG4gICAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgICAgLyoqXG4gICAgICAgKiBEZXN0cm95IHRoZSBmb3JtIGFuZCBjbGVhbiB1cCByZXNvdXJjZXNcbiAgICAgICAqL1xuICAgICAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2xlYXIgYWxsIGZpZWxkIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICBmb3IgKGNvbnN0IFssIGZpZWxkXSBvZiBjb21wb25lbnQuZmllbGRzKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBmaWVsZC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGZpZWxkLmRlc3Ryb3koKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBjb250cm9sIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICBmb3IgKGNvbnN0IFssIGNvbnRyb2xdIG9mIGNvbXBvbmVudC5jb250cm9scykge1xuICAgICAgICAgIGlmICh0eXBlb2YgY29udHJvbC5kZXN0cm95ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuZGVzdHJveSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGwgbGlmZWN5Y2xlIGRlc3Ryb3kgaWYgYXZhaWxhYmxlXG4gICAgICAgIGlmIChjb21wb25lbnQubGlmZWN5Y2xlPy5kZXN0cm95KSB7XG4gICAgICAgICAgY29tcG9uZW50LmxpZmVjeWNsZS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgZm9ybSBlbGVtZW50IGZyb20gRE9NXG4gICAgICAgIGlmIChjb21wb25lbnQuZWxlbWVudD8ucGFyZW50Tm9kZSkge1xuICAgICAgICAgIGNvbXBvbmVudC5lbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY29tcG9uZW50LmVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW1pdCBkZXN0cm95IGV2ZW50XG4gICAgICAgIGNvbXBvbmVudC5lbWl0Py4oRk9STV9FVkVOVFMuUkVTRVQpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLy8gV2lyZSB1cCBjb250cm9sIGJ1dHRvbiBjbGljayBoYW5kbGVyc1xuICAgIHdpcmVDb250cm9sQnV0dG9ucyhjb21wb25lbnQuY29udHJvbHMsIGFwaSwgY29uZmlnKTtcblxuICAgIHJldHVybiBhcGk7XG4gIH07XG59O1xuXG5leHBvcnQgZGVmYXVsdCB3aXRoQVBJO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9jb2xvcnBpY2tlci50c1xuXG5pbXBvcnQgeyBwaXBlIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IGNyZWF0ZUJhc2UsIHdpdGhFbGVtZW50IH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IHdpdGhFdmVudHMsIHdpdGhEaXNhYmxlZCwgd2l0aExpZmVjeWNsZSB9IGZyb20gXCJtdHJsXCI7XG5pbXBvcnQgeyB3aXRoQXJlYSB9IGZyb20gXCIuL2ZlYXR1cmVzL2FyZWFcIjtcbmltcG9ydCB7IHdpdGhIdWUgfSBmcm9tIFwiLi9mZWF0dXJlcy9odWVcIjtcbmltcG9ydCB7IHdpdGhTd2F0Y2hlcyB9IGZyb20gXCIuL2ZlYXR1cmVzL3N3YXRjaGVzXCI7XG5pbXBvcnQgeyB3aXRoSW5wdXQgfSBmcm9tIFwiLi9mZWF0dXJlcy9pbnB1dFwiO1xuaW1wb3J0IHsgd2l0aFZhcmlhbnQgfSBmcm9tIFwiLi9mZWF0dXJlcy92YXJpYW50XCI7XG5pbXBvcnQgeyB3aXRoUGlwZXR0ZSwgaXNFeWVEcm9wcGVyU3VwcG9ydGVkIH0gZnJvbSBcIi4vZmVhdHVyZXMvcGlwZXR0ZVwiO1xuaW1wb3J0IHsgd2l0aE9wYWNpdHkgfSBmcm9tIFwiLi9mZWF0dXJlcy9vcGFjaXR5XCI7XG5pbXBvcnQgeyB3aXRoQVBJIH0gZnJvbSBcIi4vYXBpXCI7XG5pbXBvcnQgeyBDb2xvclBpY2tlckNvbmZpZywgQ29sb3JQaWNrZXJDb21wb25lbnQgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgY3JlYXRlQmFzZUNvbmZpZywgZ2V0RWxlbWVudENvbmZpZywgZ2V0QXBpQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnXCI7XG5pbXBvcnQgeyBDT0xPUlBJQ0tFUl9WQVJJQU5UUywgQ09MT1JQSUNLRVJfREVOU0lUSUVTIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBDb2xvclBpY2tlciBjb21wb25lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQSBjb2xvciBwaWNrZXIgd2l0aCBvcHRpb25hbCBzYXR1cmF0aW9uL2JyaWdodG5lc3MgYXJlYSwgaHVlIHNsaWRlcixcbiAqIGhleCBpbnB1dCwgYW5kIGNvbG9yIHN3YXRjaGVzLiBTdXBwb3J0cyBpbmxpbmUsIGRyb3Bkb3duLCBhbmQgZGlhbG9nIHZhcmlhbnRzLlxuICpcbiAqIFRoZSBDb2xvclBpY2tlciBjb21wb25lbnQgaXMgY3JlYXRlZCB1c2luZyBhIGZ1bmN0aW9uYWwgY29tcG9zaXRpb24gcGF0dGVybixcbiAqIGFwcGx5aW5nIHZhcmlvdXMgZmVhdHVyZXMgdGhyb3VnaCB0aGUgcGlwZSBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0NvbG9yUGlja2VyQ29uZmlnfSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBjb2xvciBwaWNrZXJcbiAqIEByZXR1cm5zIHtDb2xvclBpY2tlckNvbXBvbmVudH0gQSBmdWxseSBjb25maWd1cmVkIGNvbG9yIHBpY2tlciBjb21wb25lbnQgaW5zdGFuY2VcbiAqIEB0aHJvd3Mge0Vycm9yfSBUaHJvd3MgYW4gZXJyb3IgaWYgY29sb3IgcGlja2VyIGNyZWF0aW9uIGZhaWxzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiAvLyBJbmxpbmUgdmFyaWFudCAoZGVmYXVsdCkgLSBhbHdheXMgdmlzaWJsZVxuICogY29uc3QgcGlja2VyID0gY3JlYXRlQ29sb3JQaWNrZXIoe1xuICogICB2YWx1ZTogJyNmZjU3MjInLFxuICogICBzd2F0Y2hlczogWycjZjQ0MzM2JywgJyNlOTFlNjMnLCAnIzljMjdiMCddLFxuICogICBvbkNoYW5nZTogKGNvbG9yKSA9PiBjb25zb2xlLmxvZygnQ29sb3I6JywgY29sb3IpXG4gKiB9KTtcbiAqIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQocGlja2VyLmVsZW1lbnQpO1xuICpcbiAqIC8vIERyb3Bkb3duIHZhcmlhbnQgd2l0aCB0cmlnZ2VyIGVsZW1lbnRcbiAqIGNvbnN0IGRyb3Bkb3duID0gY3JlYXRlQ29sb3JQaWNrZXIoe1xuICogICB2YXJpYW50OiAnZHJvcGRvd24nLFxuICogICB0cmlnZ2VyOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29sb3ItYnV0dG9uJyksXG4gKiAgIHZhbHVlOiAnI2ZmNTcyMicsXG4gKiAgIG9uQ2hhbmdlOiAoY29sb3IpID0+IGNvbnNvbGUubG9nKCdDb2xvcjonLCBjb2xvcilcbiAqIH0pO1xuICpcbiAqIC8vIE1pbmltYWwgcGlja2VyIHdpdGggb25seSBzd2F0Y2hlc1xuICogY29uc3Qgc3dhdGNoUGlja2VyID0gY3JlYXRlQ29sb3JQaWNrZXIoe1xuICogICB2YXJpYW50OiAnZHJvcGRvd24nLFxuICogICB0cmlnZ2VyOiBteUJ1dHRvbixcbiAqICAgc2hvd0FyZWE6IGZhbHNlLFxuICogICBzaG93SHVlOiBmYWxzZSxcbiAqICAgc2hvd0lucHV0OiBmYWxzZSxcbiAqICAgc3dhdGNoZXM6IFsnI2ZmMDAwMCcsICcjMDBmZjAwJywgJyMwMDAwZmYnXVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAY2F0ZWdvcnkgQ29tcG9uZW50c1xuICovXG5jb25zdCBjcmVhdGVDb2xvclBpY2tlciA9IChcbiAgY29uZmlnOiBDb2xvclBpY2tlckNvbmZpZyA9IHt9LFxuKTogQ29sb3JQaWNrZXJDb21wb25lbnQgPT4ge1xuICBjb25zdCBiYXNlQ29uZmlnID0gY3JlYXRlQmFzZUNvbmZpZyhjb25maWcpO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgbmVlZHNWYXJpYW50QmVoYXZpb3IgPVxuICAgICAgYmFzZUNvbmZpZy52YXJpYW50ID09PSBDT0xPUlBJQ0tFUl9WQVJJQU5UUy5EUk9QRE9XTiB8fFxuICAgICAgYmFzZUNvbmZpZy52YXJpYW50ID09PSBDT0xPUlBJQ0tFUl9WQVJJQU5UUy5ESUFMT0c7XG5cbiAgICBjb25zdCBjb2xvclBpY2tlciA9IHBpcGUoXG4gICAgICBjcmVhdGVCYXNlLFxuICAgICAgd2l0aEV2ZW50cygpLFxuICAgICAgd2l0aEVsZW1lbnQoZ2V0RWxlbWVudENvbmZpZyhiYXNlQ29uZmlnKSksXG4gICAgICB3aXRoRGlzYWJsZWQoYmFzZUNvbmZpZyksXG4gICAgICAvLyBBcHBseSB2YXJpYW50IGZlYXR1cmUgZm9yIGRyb3Bkb3duL2RpYWxvZyAocmVzdHJ1Y3R1cmVzIERPTSlcbiAgICAgIG5lZWRzVmFyaWFudEJlaGF2aW9yID8gd2l0aFZhcmlhbnQoYmFzZUNvbmZpZykgOiAoYzogYW55KSA9PiBjLFxuICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgZmVhdHVyZXMgYmFzZWQgb24gY29uZmlnXG4gICAgICBiYXNlQ29uZmlnLnNob3dBcmVhICE9PSBmYWxzZSA/IHdpdGhBcmVhKGJhc2VDb25maWcpIDogKGM6IGFueSkgPT4gYyxcbiAgICAgIGJhc2VDb25maWcuc2hvd0h1ZSAhPT0gZmFsc2UgPyB3aXRoSHVlKGJhc2VDb25maWcpIDogKGM6IGFueSkgPT4gYyxcbiAgICAgIGJhc2VDb25maWcuc2hvd09wYWNpdHkgPT09IHRydWUgPyB3aXRoT3BhY2l0eShiYXNlQ29uZmlnKSA6IChjOiBhbnkpID0+IGMsXG4gICAgICBiYXNlQ29uZmlnLnNob3dJbnB1dCAhPT0gZmFsc2UgfHwgYmFzZUNvbmZpZy5zaG93UHJldmlldyAhPT0gZmFsc2VcbiAgICAgICAgPyB3aXRoSW5wdXQoYmFzZUNvbmZpZylcbiAgICAgICAgOiAoYzogYW55KSA9PiBjLFxuICAgICAgYmFzZUNvbmZpZy5zaG93U3dhdGNoZXMgIT09IGZhbHNlXG4gICAgICAgID8gd2l0aFN3YXRjaGVzKGJhc2VDb25maWcpXG4gICAgICAgIDogKGM6IGFueSkgPT4gYyxcbiAgICAgIC8vIEFkZCBwaXBldHRlIGlmIGVuYWJsZWQgb3IgaW1hZ2Ugc291cmNlIHByb3ZpZGVkXG4gICAgICBiYXNlQ29uZmlnLnNob3dQaXBldHRlICE9PSBmYWxzZSAmJlxuICAgICAgICAoaXNFeWVEcm9wcGVyU3VwcG9ydGVkKCkgfHwgYmFzZUNvbmZpZy5pbWFnZVNvdXJjZSlcbiAgICAgICAgPyB3aXRoUGlwZXR0ZShiYXNlQ29uZmlnKVxuICAgICAgICA6IChjOiBhbnkpID0+IGMsXG4gICAgICB3aXRoTGlmZWN5Y2xlKCksXG4gICAgICAoY29tcDogYW55KSA9PiB3aXRoQVBJKGdldEFwaUNvbmZpZyhjb21wKSkoY29tcCksXG4gICAgKShiYXNlQ29uZmlnKTtcblxuICAgIHJldHVybiBjb2xvclBpY2tlcjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiQ29sb3JQaWNrZXIgY3JlYXRpb24gZXJyb3I6XCIsIGVycm9yKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIGNyZWF0ZSBDb2xvclBpY2tlcjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCxcbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDb2xvclBpY2tlcjtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvY29sb3JwaWNrZXIvY29uc3RhbnRzLnRzXG5cbi8qKlxuICogQ29sb3IgcGlja2VyIGNvbXBvbmVudCBjb25zdGFudHNcbiAqIEBtb2R1bGUgY29tcG9uZW50cy9jb2xvcnBpY2tlclxuICovXG5cbi8qKlxuICogQ29sb3IgcGlja2VyIGV2ZW50c1xuICovXG5leHBvcnQgY29uc3QgQ09MT1JQSUNLRVJfRVZFTlRTID0ge1xuICAvKiogRmlyZWQgd2hlbiBjb2xvciB2YWx1ZSBjaGFuZ2VzIChjb21taXR0ZWQpICovXG4gIENIQU5HRTogXCJjaGFuZ2VcIixcbiAgLyoqIEZpcmVkIGR1cmluZyBjb2xvciBzZWxlY3Rpb24gKGxpdmUgcHJldmlldykgKi9cbiAgSU5QVVQ6IFwiaW5wdXRcIixcbiAgLyoqIEZpcmVkIHdoZW4gYSBzd2F0Y2ggaXMgY2xpY2tlZCAqL1xuICBTV0FUQ0hfU0VMRUNUOiBcInN3YXRjaFNlbGVjdFwiLFxuICAvKiogRmlyZWQgd2hlbiBzd2F0Y2hlcyBhcmUgdXBkYXRlZCAqL1xuICBTV0FUQ0hFU19DSEFOR0U6IFwic3dhdGNoZXNDaGFuZ2VcIixcbiAgLyoqIEZpcmVkIHdoZW4gcGlja2VyIG9wZW5zIChkcm9wZG93bi9kaWFsb2cgdmFyaWFudHMpICovXG4gIE9QRU46IFwib3BlblwiLFxuICAvKiogRmlyZWQgd2hlbiBwaWNrZXIgY2xvc2VzIChkcm9wZG93bi9kaWFsb2cgdmFyaWFudHMpICovXG4gIENMT1NFOiBcImNsb3NlXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIENvbG9yIHBpY2tlciB2YXJpYW50c1xuICovXG5leHBvcnQgY29uc3QgQ09MT1JQSUNLRVJfVkFSSUFOVFMgPSB7XG4gIC8qKiBJbmxpbmUgLSBhbHdheXMgdmlzaWJsZSwgbm8gdHJpZ2dlciAqL1xuICBJTkxJTkU6IFwiaW5saW5lXCIsXG4gIC8qKiBEcm9wZG93biAtIGF0dGFjaGVkIHRvIHRyaWdnZXIsIG9wZW5zIGJlbG93L2Fib3ZlICovXG4gIERST1BET1dOOiBcImRyb3Bkb3duXCIsXG4gIC8qKiBEaWFsb2cgLSBtb2RhbCBvdmVybGF5IGNlbnRlcmVkIG9uIHNjcmVlbiAqL1xuICBESUFMT0c6IFwiZGlhbG9nXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIENvbG9yIHBpY2tlciBkZW5zaXRpZXNcbiAqL1xuZXhwb3J0IGNvbnN0IENPTE9SUElDS0VSX0RFTlNJVElFUyA9IHtcbiAgLyoqIERlZmF1bHQgZGVuc2l0eSB3aXRoIHN0YW5kYXJkIHNwYWNpbmcgKi9cbiAgREVGQVVMVDogXCJkZWZhdWx0XCIsXG4gIC8qKiBDb21wYWN0IGRlbnNpdHkgLSBtaW5pbWFsIGxheW91dCwgaHVlIGJhciB1bmRlciBhcmVhICovXG4gIENPTVBBQ1Q6IFwiY29tcGFjdFwiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBDb2xvciBwaWNrZXIgc2l6ZXNcbiAqL1xuZXhwb3J0IGNvbnN0IENPTE9SUElDS0VSX1NJWkVTID0ge1xuICAvKiogU21hbGwgLSAyMDBweCB3aWRlICovXG4gIFM6IFwic1wiLFxuICAvKiogTWVkaXVtIC0gMjgwcHggd2lkZSAoZGVmYXVsdCkgKi9cbiAgTTogXCJtXCIsXG4gIC8qKiBMYXJnZSAtIDM2MHB4IHdpZGUgKi9cbiAgTDogXCJsXCIsXG59IGFzIGNvbnN0O1xuXG4vKipcbiAqIFN3YXRjaCBzaXplcyBpbiBwaXhlbHNcbiAqL1xuZXhwb3J0IGNvbnN0IFNXQVRDSF9TSVpFUyA9IHtcbiAgUzogMjQsXG4gIE06IDMyLFxuICBMOiA0MCxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogQ1NTIGNsYXNzZXMgdXNlZCBieSB0aGUgY29sb3IgcGlja2VyIGNvbXBvbmVudFxuICovXG5leHBvcnQgY29uc3QgQ09MT1JQSUNLRVJfQ0xBU1NFUyA9IHtcbiAgUk9PVDogXCJjb2xvcnBpY2tlclwiLFxuXG4gIC8vIE1haW4gYXJlYXNcbiAgQVJFQTogXCJjb2xvcnBpY2tlcl9fYXJlYVwiLFxuICBBUkVBX0dSQURJRU5UOiBcImNvbG9ycGlja2VyX19hcmVhLWdyYWRpZW50XCIsXG4gIEFSRUFfSEFORExFOiBcImNvbG9ycGlja2VyX19hcmVhLWhhbmRsZVwiLFxuXG4gIC8vIEh1ZSBzbGlkZXJcbiAgSFVFOiBcImNvbG9ycGlja2VyX19odWVcIixcbiAgSFVFX1NMSURFUjogXCJjb2xvcnBpY2tlcl9faHVlLXNsaWRlclwiLFxuICBIVUVfSEFORExFOiBcImNvbG9ycGlja2VyX19odWUtaGFuZGxlXCIsXG5cbiAgLy8gU3dhdGNoZXNcbiAgU1dBVENIRVM6IFwiY29sb3JwaWNrZXJfX3N3YXRjaGVzXCIsXG4gIFNXQVRDSDogXCJjb2xvcnBpY2tlcl9fc3dhdGNoXCIsXG4gIFNXQVRDSF9TRUxFQ1RFRDogXCJjb2xvcnBpY2tlcl9fc3dhdGNoLS1zZWxlY3RlZFwiLFxuICBTV0FUQ0hfQUREOiBcImNvbG9ycGlja2VyX19zd2F0Y2gtLWFkZFwiLFxuXG4gIC8vIFByZXZpZXcgYW5kIHZhbHVlXG4gIFBSRVZJRVc6IFwiY29sb3JwaWNrZXJfX3ByZXZpZXdcIixcbiAgVkFMVUU6IFwiY29sb3JwaWNrZXJfX3ZhbHVlXCIsXG4gIFZBTFVFX0lOUFVUOiBcImNvbG9ycGlja2VyX192YWx1ZS1pbnB1dFwiLFxuXG4gIC8vIENvbnRhaW5lciBmb3IgZHJvcGRvd24vZGlhbG9nIHZhcmlhbnRzXG4gIENPTlRBSU5FUjogXCJjb2xvcnBpY2tlcl9fY29udGFpbmVyXCIsXG4gIEJBQ0tEUk9QOiBcImNvbG9ycGlja2VyX19iYWNrZHJvcFwiLFxuXG4gIC8vIFN0YXRlc1xuICBESVNBQkxFRDogXCJjb2xvcnBpY2tlci0tZGlzYWJsZWRcIixcbiAgRFJBR0dJTkc6IFwiY29sb3JwaWNrZXItLWRyYWdnaW5nXCIsXG4gIE9QRU46IFwiY29sb3JwaWNrZXItLW9wZW5cIixcbiAgUE9TSVRJT05fVE9QOiBcImNvbG9ycGlja2VyLS1wb3NpdGlvbi10b3BcIixcbiAgQ09NUEFDVDogXCJjb2xvcnBpY2tlci0tY29tcGFjdFwiLFxuXG4gIC8vIFZhcmlhbnRzXG4gIElOTElORTogXCJjb2xvcnBpY2tlci0taW5saW5lXCIsXG4gIERST1BET1dOOiBcImNvbG9ycGlja2VyLS1kcm9wZG93blwiLFxuICBESUFMT0c6IFwiY29sb3JwaWNrZXItLWRpYWxvZ1wiLFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBEZWZhdWx0IGNvbG9yIHBpY2tlciBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBDT0xPUlBJQ0tFUl9ERUZBVUxUUyA9IHtcbiAgLyoqIERlZmF1bHQgY29sb3IgdmFsdWUgKi9cbiAgVkFMVUU6IFwiI2ZmMDAwMFwiLFxuICAvKiogRGVmYXVsdCBjb21wb25lbnQgc2l6ZSAqL1xuICBTSVpFOiBDT0xPUlBJQ0tFUl9TSVpFUy5NLFxuICAvKiogRGVmYXVsdCBzd2F0Y2ggc2l6ZSAqL1xuICBTV0FUQ0hfU0laRTogU1dBVENIX1NJWkVTLk0sXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgdGhlIGhleCBpbnB1dCAqL1xuICBTSE9XX0lOUFVUOiB0cnVlLFxuICAvKiogV2hldGhlciB0byBzaG93IHRoZSBwcmV2aWV3IHNxdWFyZSAqL1xuICBTSE9XX1BSRVZJRVc6IHRydWUsXG4gIC8qKiBXaGV0aGVyIHRvIHNob3cgc3dhdGNoZXMgKi9cbiAgU0hPV19TV0FUQ0hFUzogdHJ1ZSxcbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIHN3YXRjaGVzICovXG4gIE1BWF9TV0FUQ0hFUzogOCxcbiAgLyoqIERlZmF1bHQgdmFyaWFudCAqL1xuICBWQVJJQU5UOiBDT0xPUlBJQ0tFUl9WQVJJQU5UUy5JTkxJTkUsXG4gIC8qKiBDbG9zZSBvbiBzd2F0Y2ggc2VsZWN0IChkcm9wZG93bi9kaWFsb2cpICovXG4gIENMT1NFX09OX1NFTEVDVDogdHJ1ZSxcbn0gYXMgY29uc3Q7XG5cbi8qKlxuICogU2l6ZSBkaW1lbnNpb25zIGluIHBpeGVsc1xuICovXG5leHBvcnQgY29uc3QgU0laRV9ESU1FTlNJT05TID0ge1xuICBbQ09MT1JQSUNLRVJfU0laRVMuU106IHtcbiAgICB3aWR0aDogMjAwLFxuICAgIGFyZWFIZWlnaHQ6IDEyMCxcbiAgICBodWVIZWlnaHQ6IDE2LFxuICB9LFxuICBbQ09MT1JQSUNLRVJfU0laRVMuTV06IHtcbiAgICB3aWR0aDogMjgwLFxuICAgIGFyZWFIZWlnaHQ6IDE2MCxcbiAgICBodWVIZWlnaHQ6IDIwLFxuICB9LFxuICBbQ09MT1JQSUNLRVJfU0laRVMuTF06IHtcbiAgICB3aWR0aDogMzYwLFxuICAgIGFyZWFIZWlnaHQ6IDIwMCxcbiAgICBodWVIZWlnaHQ6IDI0LFxuICB9LFxufSBhcyBjb25zdDtcblxuLyoqXG4gKiBWaWJyYW50IHBhbGV0dGUgc3dhdGNoIGtleXMgaW4gb3JkZXIgb2YgcHJlZmVyZW5jZVxuICovXG5leHBvcnQgY29uc3QgUEFMRVRURV9TV0FUQ0hfT1JERVIgPSBbXG4gIFwiVmlicmFudFwiLFxuICBcIk11dGVkXCIsXG4gIFwiRGFya1ZpYnJhbnRcIixcbiAgXCJEYXJrTXV0ZWRcIixcbiAgXCJMaWdodFZpYnJhbnRcIixcbiAgXCJMaWdodE11dGVkXCIsXG5dIGFzIGNvbnN0O1xuXG4vLyBUeXBlIGV4cG9ydHNcbmV4cG9ydCB0eXBlIENvbG9yUGlja2VyRXZlbnQgPVxuICAodHlwZW9mIENPTE9SUElDS0VSX0VWRU5UUylba2V5b2YgdHlwZW9mIENPTE9SUElDS0VSX0VWRU5UU107XG5leHBvcnQgdHlwZSBDb2xvclBpY2tlclNpemUgPVxuICAodHlwZW9mIENPTE9SUElDS0VSX1NJWkVTKVtrZXlvZiB0eXBlb2YgQ09MT1JQSUNLRVJfU0laRVNdO1xuZXhwb3J0IHR5cGUgQ29sb3JQaWNrZXJWYXJpYW50ID1cbiAgKHR5cGVvZiBDT0xPUlBJQ0tFUl9WQVJJQU5UUylba2V5b2YgdHlwZW9mIENPTE9SUElDS0VSX1ZBUklBTlRTXTtcbmV4cG9ydCB0eXBlIFN3YXRjaFNpemUgPSAodHlwZW9mIFNXQVRDSF9TSVpFUylba2V5b2YgdHlwZW9mIFNXQVRDSF9TSVpFU107XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2NvbG9ycGlja2VyL3V0aWxzLnRzXG5cbmltcG9ydCB7IEhTVkNvbG9yLCBSR0JDb2xvciB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbi8qKlxuICogQ29udmVydHMgSFNWIHRvIFJHQlxuICogQHBhcmFtIGggLSBIdWUgKDAtMzYwKVxuICogQHBhcmFtIHMgLSBTYXR1cmF0aW9uICgwLTEwMClcbiAqIEBwYXJhbSB2IC0gVmFsdWUgKDAtMTAwKVxuICogQHJldHVybnMgUkdCIGNvbG9yIG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgaHN2VG9SZ2IgPSAoaDogbnVtYmVyLCBzOiBudW1iZXIsIHY6IG51bWJlcik6IFJHQkNvbG9yID0+IHtcbiAgY29uc3Qgc05vcm0gPSBzIC8gMTAwO1xuICBjb25zdCB2Tm9ybSA9IHYgLyAxMDA7XG5cbiAgY29uc3QgYyA9IHZOb3JtICogc05vcm07XG4gIGNvbnN0IHggPSBjICogKDEgLSBNYXRoLmFicygoKGggLyA2MCkgJSAyKSAtIDEpKTtcbiAgY29uc3QgbSA9IHZOb3JtIC0gYztcblxuICBsZXQgclByaW1lID0gMDtcbiAgbGV0IGdQcmltZSA9IDA7XG4gIGxldCBiUHJpbWUgPSAwO1xuXG4gIGlmIChoID49IDAgJiYgaCA8IDYwKSB7XG4gICAgclByaW1lID0gYztcbiAgICBnUHJpbWUgPSB4O1xuICAgIGJQcmltZSA9IDA7XG4gIH0gZWxzZSBpZiAoaCA+PSA2MCAmJiBoIDwgMTIwKSB7XG4gICAgclByaW1lID0geDtcbiAgICBnUHJpbWUgPSBjO1xuICAgIGJQcmltZSA9IDA7XG4gIH0gZWxzZSBpZiAoaCA+PSAxMjAgJiYgaCA8IDE4MCkge1xuICAgIHJQcmltZSA9IDA7XG4gICAgZ1ByaW1lID0gYztcbiAgICBiUHJpbWUgPSB4O1xuICB9IGVsc2UgaWYgKGggPj0gMTgwICYmIGggPCAyNDApIHtcbiAgICByUHJpbWUgPSAwO1xuICAgIGdQcmltZSA9IHg7XG4gICAgYlByaW1lID0gYztcbiAgfSBlbHNlIGlmIChoID49IDI0MCAmJiBoIDwgMzAwKSB7XG4gICAgclByaW1lID0geDtcbiAgICBnUHJpbWUgPSAwO1xuICAgIGJQcmltZSA9IGM7XG4gIH0gZWxzZSB7XG4gICAgclByaW1lID0gYztcbiAgICBnUHJpbWUgPSAwO1xuICAgIGJQcmltZSA9IHg7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHI6IE1hdGgucm91bmQoKHJQcmltZSArIG0pICogMjU1KSxcbiAgICBnOiBNYXRoLnJvdW5kKChnUHJpbWUgKyBtKSAqIDI1NSksXG4gICAgYjogTWF0aC5yb3VuZCgoYlByaW1lICsgbSkgKiAyNTUpLFxuICB9O1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBSR0IgdG8gSFNWXG4gKiBAcGFyYW0gciAtIFJlZCAoMC0yNTUpXG4gKiBAcGFyYW0gZyAtIEdyZWVuICgwLTI1NSlcbiAqIEBwYXJhbSBiIC0gQmx1ZSAoMC0yNTUpXG4gKiBAcmV0dXJucyBIU1YgY29sb3Igb2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCByZ2JUb0hzdiA9IChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogSFNWQ29sb3IgPT4ge1xuICBjb25zdCByTm9ybSA9IHIgLyAyNTU7XG4gIGNvbnN0IGdOb3JtID0gZyAvIDI1NTtcbiAgY29uc3QgYk5vcm0gPSBiIC8gMjU1O1xuXG4gIGNvbnN0IG1heCA9IE1hdGgubWF4KHJOb3JtLCBnTm9ybSwgYk5vcm0pO1xuICBjb25zdCBtaW4gPSBNYXRoLm1pbihyTm9ybSwgZ05vcm0sIGJOb3JtKTtcbiAgY29uc3QgZGVsdGEgPSBtYXggLSBtaW47XG5cbiAgbGV0IGggPSAwO1xuICBsZXQgcyA9IDA7XG4gIGNvbnN0IHYgPSBtYXggKiAxMDA7XG5cbiAgaWYgKGRlbHRhICE9PSAwKSB7XG4gICAgcyA9IChkZWx0YSAvIG1heCkgKiAxMDA7XG5cbiAgICBpZiAobWF4ID09PSByTm9ybSkge1xuICAgICAgaCA9IDYwICogKCgoZ05vcm0gLSBiTm9ybSkgLyBkZWx0YSkgJSA2KTtcbiAgICB9IGVsc2UgaWYgKG1heCA9PT0gZ05vcm0pIHtcbiAgICAgIGggPSA2MCAqICgoYk5vcm0gLSByTm9ybSkgLyBkZWx0YSArIDIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBoID0gNjAgKiAoKHJOb3JtIC0gZ05vcm0pIC8gZGVsdGEgKyA0KTtcbiAgICB9XG4gIH1cblxuICBpZiAoaCA8IDApIHtcbiAgICBoICs9IDM2MDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaDogTWF0aC5yb3VuZChoKSxcbiAgICBzOiBNYXRoLnJvdW5kKHMpLFxuICAgIHY6IE1hdGgucm91bmQodiksXG4gIH07XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIFJHQiB0byBoZXggc3RyaW5nXG4gKiBAcGFyYW0gciAtIFJlZCAoMC0yNTUpXG4gKiBAcGFyYW0gZyAtIEdyZWVuICgwLTI1NSlcbiAqIEBwYXJhbSBiIC0gQmx1ZSAoMC0yNTUpXG4gKiBAcmV0dXJucyBIZXggY29sb3Igc3RyaW5nIChlLmcuLCAnI2ZmMDAwMCcpXG4gKi9cbmV4cG9ydCBjb25zdCByZ2JUb0hleCA9IChyOiBudW1iZXIsIGc6IG51bWJlciwgYjogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3QgdG9IZXggPSAobjogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgICBjb25zdCBoZXggPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQobikpKS50b1N0cmluZygxNik7XG4gICAgcmV0dXJuIGhleC5sZW5ndGggPT09IDEgPyBcIjBcIiArIGhleCA6IGhleDtcbiAgfTtcbiAgcmV0dXJuIGAjJHt0b0hleChyKX0ke3RvSGV4KGcpfSR7dG9IZXgoYil9YDtcbn07XG5cbi8qKlxuICogQ29udmVydHMgaGV4IHN0cmluZyB0byBSR0JcbiAqIEBwYXJhbSBoZXggLSBIZXggY29sb3Igc3RyaW5nIChlLmcuLCAnI2ZmMDAwMCcgb3IgJ2ZmMDAwMCcpXG4gKiBAcmV0dXJucyBSR0IgY29sb3Igb2JqZWN0IG9yIG51bGwgaWYgaW52YWxpZFxuICovXG5leHBvcnQgY29uc3QgaGV4VG9SZ2IgPSAoaGV4OiBzdHJpbmcpOiBSR0JDb2xvciB8IG51bGwgPT4ge1xuICAvLyBSZW1vdmUgIyBpZiBwcmVzZW50XG4gIGNvbnN0IGNsZWFuSGV4ID0gaGV4LnJlcGxhY2UoL14jLywgXCJcIik7XG5cbiAgLy8gSGFuZGxlIDMtY2hhcmFjdGVyIGhleFxuICBsZXQgZnVsbEhleCA9IGNsZWFuSGV4O1xuICBpZiAoY2xlYW5IZXgubGVuZ3RoID09PSAzKSB7XG4gICAgZnVsbEhleCA9IGNsZWFuSGV4XG4gICAgICAuc3BsaXQoXCJcIilcbiAgICAgIC5tYXAoKGMpID0+IGMgKyBjKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBoZXggc3RyaW5nXG4gIGlmICghL15bMC05QS1GYS1mXXs2fSQvLnRlc3QoZnVsbEhleCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG51bSA9IHBhcnNlSW50KGZ1bGxIZXgsIDE2KTtcbiAgcmV0dXJuIHtcbiAgICByOiAobnVtID4+IDE2KSAmIDI1NSxcbiAgICBnOiAobnVtID4+IDgpICYgMjU1LFxuICAgIGI6IG51bSAmIDI1NSxcbiAgfTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgSFNWIHRvIGhleCBzdHJpbmdcbiAqIEBwYXJhbSBoIC0gSHVlICgwLTM2MClcbiAqIEBwYXJhbSBzIC0gU2F0dXJhdGlvbiAoMC0xMDApXG4gKiBAcGFyYW0gdiAtIFZhbHVlICgwLTEwMClcbiAqIEByZXR1cm5zIEhleCBjb2xvciBzdHJpbmdcbiAqL1xuZXhwb3J0IGNvbnN0IGhzdlRvSGV4ID0gKGg6IG51bWJlciwgczogbnVtYmVyLCB2OiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCByZ2IgPSBoc3ZUb1JnYihoLCBzLCB2KTtcbiAgcmV0dXJuIHJnYlRvSGV4KHJnYi5yLCByZ2IuZywgcmdiLmIpO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBoZXggc3RyaW5nIHRvIEhTVlxuICogQHBhcmFtIGhleCAtIEhleCBjb2xvciBzdHJpbmdcbiAqIEByZXR1cm5zIEhTViBjb2xvciBvYmplY3Qgb3IgbnVsbCBpZiBpbnZhbGlkXG4gKi9cbmV4cG9ydCBjb25zdCBoZXhUb0hzdiA9IChoZXg6IHN0cmluZyk6IEhTVkNvbG9yIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHJnYiA9IGhleFRvUmdiKGhleCk7XG4gIGlmICghcmdiKSByZXR1cm4gbnVsbDtcbiAgcmV0dXJuIHJnYlRvSHN2KHJnYi5yLCByZ2IuZywgcmdiLmIpO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBoZXggY29sb3Igc3RyaW5nXG4gKiBAcGFyYW0gaGV4IC0gU3RyaW5nIHRvIHZhbGlkYXRlXG4gKiBAcmV0dXJucyBUcnVlIGlmIHZhbGlkIGhleCBjb2xvclxuICovXG5leHBvcnQgY29uc3QgaXNWYWxpZEhleCA9IChoZXg6IHN0cmluZyk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gL14jPyhbMC05QS1GYS1mXXszfXxbMC05QS1GYS1mXXs2fSkkLy50ZXN0KGhleCk7XG59O1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBoZXggY29sb3IgdG8gNi1jaGFyYWN0ZXIgZm9ybWF0IHdpdGggI1xuICogQHBhcmFtIGhleCAtIEhleCBjb2xvciBzdHJpbmdcbiAqIEByZXR1cm5zIE5vcm1hbGl6ZWQgaGV4IHN0cmluZyBvciBvcmlnaW5hbCBpZiBpbnZhbGlkXG4gKi9cbmV4cG9ydCBjb25zdCBub3JtYWxpemVIZXggPSAoaGV4OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBpZiAoIWlzVmFsaWRIZXgoaGV4KSkgcmV0dXJuIGhleDtcblxuICBsZXQgY2xlYW5IZXggPSBoZXgucmVwbGFjZSgvXiMvLCBcIlwiKTtcblxuICAvLyBFeHBhbmQgMy1jaGFyYWN0ZXIgaGV4XG4gIGlmIChjbGVhbkhleC5sZW5ndGggPT09IDMpIHtcbiAgICBjbGVhbkhleCA9IGNsZWFuSGV4XG4gICAgICAuc3BsaXQoXCJcIilcbiAgICAgIC5tYXAoKGMpID0+IGMgKyBjKVxuICAgICAgLmpvaW4oXCJcIik7XG4gIH1cblxuICByZXR1cm4gYCMke2NsZWFuSGV4LnRvTG93ZXJDYXNlKCl9YDtcbn07XG5cbi8qKlxuICogQ2xhbXBzIGEgbnVtYmVyIGJldHdlZW4gbWluIGFuZCBtYXhcbiAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIGNsYW1wXG4gKiBAcGFyYW0gbWluIC0gTWluaW11bSB2YWx1ZVxuICogQHBhcmFtIG1heCAtIE1heGltdW0gdmFsdWVcbiAqIEByZXR1cm5zIENsYW1wZWQgdmFsdWVcbiAqL1xuZXhwb3J0IGNvbnN0IGNsYW1wID0gKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciA9PiB7XG4gIHJldHVybiBNYXRoLm1pbihNYXRoLm1heCh2YWx1ZSwgbWluKSwgbWF4KTtcbn07XG5cbi8qKlxuICogR2V0cyBjb250cmFzdGluZyB0ZXh0IGNvbG9yIChibGFjayBvciB3aGl0ZSkgZm9yIGEgYmFja2dyb3VuZFxuICogQHBhcmFtIGhleCAtIEJhY2tncm91bmQgaGV4IGNvbG9yXG4gKiBAcmV0dXJucyAnIzAwMDAwMCcgb3IgJyNmZmZmZmYnXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRDb250cmFzdENvbG9yID0gKGhleDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgY29uc3QgcmdiID0gaGV4VG9SZ2IoaGV4KTtcbiAgaWYgKCFyZ2IpIHJldHVybiBcIiMwMDAwMDBcIjtcblxuICAvLyBDYWxjdWxhdGUgcmVsYXRpdmUgbHVtaW5hbmNlXG4gIGNvbnN0IGx1bWluYW5jZSA9ICgwLjI5OSAqIHJnYi5yICsgMC41ODcgKiByZ2IuZyArIDAuMTE0ICogcmdiLmIpIC8gMjU1O1xuXG4gIHJldHVybiBsdW1pbmFuY2UgPiAwLjUgPyBcIiMwMDAwMDBcIiA6IFwiI2ZmZmZmZlwiO1xufTtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvY29sb3JwaWNrZXIvY29uZmlnLnRzXG5cbmltcG9ydCB7XG4gIENPTE9SUElDS0VSX0RFRkFVTFRTLFxuICBDT0xPUlBJQ0tFUl9TSVpFUyxcbiAgQ09MT1JQSUNLRVJfVkFSSUFOVFMsXG4gIENPTE9SUElDS0VSX0NMQVNTRVMsXG4gIENPTE9SUElDS0VSX0RFTlNJVElFUyxcbiAgU0laRV9ESU1FTlNJT05TLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbG9yUGlja2VyQ29uZmlnLCBDb2xvclBpY2tlclN0YXRlLCBIU1ZDb2xvciB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBoZXhUb0hzdiwgbm9ybWFsaXplSGV4IH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBDb2xvclBpY2tlciBjb21wb25lbnQuXG4gKiBUaGVzZSB2YWx1ZXMgd2lsbCBiZSB1c2VkIHdoZW4gbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLlxuICpcbiAqIEBjYXRlZ29yeSBDb21wb25lbnRzXG4gKi9cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29uZmlnOiBDb2xvclBpY2tlckNvbmZpZyA9IHtcbiAgdmFsdWU6IENPTE9SUElDS0VSX0RFRkFVTFRTLlZBTFVFLFxuICB2YXJpYW50OiBDT0xPUlBJQ0tFUl9WQVJJQU5UUy5JTkxJTkUsXG4gIHNpemU6IENPTE9SUElDS0VSX1NJWkVTLk0sXG4gIGRlbnNpdHk6IENPTE9SUElDS0VSX0RFTlNJVElFUy5ERUZBVUxULFxuICBzd2F0Y2hTaXplOiBDT0xPUlBJQ0tFUl9ERUZBVUxUUy5TV0FUQ0hfU0laRSxcbiAgc2hvd0lucHV0OiBDT0xPUlBJQ0tFUl9ERUZBVUxUUy5TSE9XX0lOUFVULFxuICBzaG93UHJldmlldzogQ09MT1JQSUNLRVJfREVGQVVMVFMuU0hPV19QUkVWSUVXLFxuICBzaG93U3dhdGNoZXM6IENPTE9SUElDS0VSX0RFRkFVTFRTLlNIT1dfU1dBVENIRVMsXG4gIHNob3dIdWU6IHRydWUsXG4gIHNob3dBcmVhOiB0cnVlLFxuICBtYXhTd2F0Y2hlczogQ09MT1JQSUNLRVJfREVGQVVMVFMuTUFYX1NXQVRDSEVTLFxuICBjbG9zZU9uU2VsZWN0OiBDT0xPUlBJQ0tFUl9ERUZBVUxUUy5DTE9TRV9PTl9TRUxFQ1QsXG4gIGRpc2FibGVkOiBmYWxzZSxcbiAgcHJlZml4OiBcIm10cmxcIixcbiAgY29tcG9uZW50TmFtZTogXCJjb2xvcnBpY2tlclwiLFxufTtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBiYXNlIGNvbmZpZ3VyYXRpb24gZm9yIENvbG9yUGlja2VyIGNvbXBvbmVudCBieSBtZXJnaW5nXG4gKiB1c2VyLXByb3ZpZGVkIGNvbmZpZyB3aXRoIGRlZmF1bHQgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBVc2VyIHByb3ZpZGVkIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIENvbXBsZXRlIGNvbmZpZ3VyYXRpb24gd2l0aCBkZWZhdWx0cyBhcHBsaWVkXG4gKiBAY2F0ZWdvcnkgQ29tcG9uZW50c1xuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVCYXNlQ29uZmlnID0gKFxuICBjb25maWc6IENvbG9yUGlja2VyQ29uZmlnID0ge30sXG4pOiBSZXF1aXJlZDxcbiAgUGljazxcbiAgICBDb2xvclBpY2tlckNvbmZpZyxcbiAgICB8IFwidmFsdWVcIlxuICAgIHwgXCJ2YXJpYW50XCJcbiAgICB8IFwic2l6ZVwiXG4gICAgfCBcImRlbnNpdHlcIlxuICAgIHwgXCJzd2F0Y2hTaXplXCJcbiAgICB8IFwic2hvd0lucHV0XCJcbiAgICB8IFwic2hvd1ByZXZpZXdcIlxuICAgIHwgXCJzaG93U3dhdGNoZXNcIlxuICAgIHwgXCJzaG93SHVlXCJcbiAgICB8IFwic2hvd0FyZWFcIlxuICAgIHwgXCJtYXhTd2F0Y2hlc1wiXG4gICAgfCBcImNsb3NlT25TZWxlY3RcIlxuICAgIHwgXCJkaXNhYmxlZFwiXG4gICAgfCBcInByZWZpeFwiXG4gICAgfCBcImNvbXBvbmVudE5hbWVcIlxuICA+XG4+ICZcbiAgQ29sb3JQaWNrZXJDb25maWcgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLmRlZmF1bHRDb25maWcsXG4gICAgLi4uY29uZmlnLFxuICAgIHZhbHVlOiBjb25maWcudmFsdWUgfHwgZGVmYXVsdENvbmZpZy52YWx1ZSEsXG4gICAgdmFyaWFudDogY29uZmlnLnZhcmlhbnQgfHwgZGVmYXVsdENvbmZpZy52YXJpYW50ISxcbiAgICBzaXplOiBjb25maWcuc2l6ZSB8fCBkZWZhdWx0Q29uZmlnLnNpemUhLFxuICAgIGRlbnNpdHk6IGNvbmZpZy5kZW5zaXR5IHx8IGRlZmF1bHRDb25maWcuZGVuc2l0eSEsXG4gICAgc3dhdGNoU2l6ZTogY29uZmlnLnN3YXRjaFNpemUgPz8gZGVmYXVsdENvbmZpZy5zd2F0Y2hTaXplISxcbiAgICBzaG93SW5wdXQ6IGNvbmZpZy5zaG93SW5wdXQgPz8gZGVmYXVsdENvbmZpZy5zaG93SW5wdXQhLFxuICAgIHNob3dQcmV2aWV3OiBjb25maWcuc2hvd1ByZXZpZXcgPz8gZGVmYXVsdENvbmZpZy5zaG93UHJldmlldyEsXG4gICAgc2hvd1N3YXRjaGVzOiBjb25maWcuc2hvd1N3YXRjaGVzID8/IGRlZmF1bHRDb25maWcuc2hvd1N3YXRjaGVzISxcbiAgICBzaG93SHVlOiBjb25maWcuc2hvd0h1ZSA/PyB0cnVlLFxuICAgIHNob3dBcmVhOiBjb25maWcuc2hvd0FyZWEgPz8gdHJ1ZSxcbiAgICBtYXhTd2F0Y2hlczogY29uZmlnLm1heFN3YXRjaGVzIHx8IGRlZmF1bHRDb25maWcubWF4U3dhdGNoZXMhLFxuICAgIGNsb3NlT25TZWxlY3Q6IGNvbmZpZy5jbG9zZU9uU2VsZWN0ID8/IGRlZmF1bHRDb25maWcuY2xvc2VPblNlbGVjdCEsXG4gICAgZGlzYWJsZWQ6IGNvbmZpZy5kaXNhYmxlZCB8fCBmYWxzZSxcbiAgICBwcmVmaXg6IGNvbmZpZy5wcmVmaXggfHwgZGVmYXVsdENvbmZpZy5wcmVmaXghLFxuICAgIGNvbXBvbmVudE5hbWU6IGRlZmF1bHRDb25maWcuY29tcG9uZW50TmFtZSEsXG4gIH07XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIGVsZW1lbnQgY29uZmlndXJhdGlvbiBmb3Igd2l0aEVsZW1lbnQuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbG9yIHBpY2tlciBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBFbGVtZW50IGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAY2F0ZWdvcnkgQ29tcG9uZW50c1xuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50Q29uZmlnID0gKGNvbmZpZzogQ29sb3JQaWNrZXJDb25maWcpID0+IHtcbiAgY29uc3QgZGltZW5zaW9ucyA9IGdldFNpemVEaW1lbnNpb25zKGNvbmZpZy5zaXplIHx8IFwibVwiKTtcbiAgY29uc3QgdmFyaWFudCA9IGNvbmZpZy52YXJpYW50IHx8IENPTE9SUElDS0VSX1ZBUklBTlRTLklOTElORTtcbiAgY29uc3QgZGVuc2l0eSA9IGNvbmZpZy5kZW5zaXR5IHx8IENPTE9SUElDS0VSX0RFTlNJVElFUy5ERUZBVUxUO1xuXG4gIC8vIEJ1aWxkIHZhcmlhbnQgY2xhc3NcbiAgbGV0IHZhcmlhbnRDbGFzczogc3RyaW5nO1xuICBpZiAodmFyaWFudCA9PT0gQ09MT1JQSUNLRVJfVkFSSUFOVFMuRFJPUERPV04pIHtcbiAgICB2YXJpYW50Q2xhc3MgPSBgJHtjb25maWcucHJlZml4fS0ke0NPTE9SUElDS0VSX0NMQVNTRVMuRFJPUERPV059YDtcbiAgfSBlbHNlIGlmICh2YXJpYW50ID09PSBDT0xPUlBJQ0tFUl9WQVJJQU5UUy5ESUFMT0cpIHtcbiAgICB2YXJpYW50Q2xhc3MgPSBgJHtjb25maWcucHJlZml4fS0ke0NPTE9SUElDS0VSX0NMQVNTRVMuRElBTE9HfWA7XG4gIH0gZWxzZSB7XG4gICAgdmFyaWFudENsYXNzID0gYCR7Y29uZmlnLnByZWZpeH0tJHtDT0xPUlBJQ0tFUl9DTEFTU0VTLklOTElORX1gO1xuICB9XG5cbiAgLy8gQnVpbGQgZGVuc2l0eSBjbGFzc1xuICBjb25zdCBkZW5zaXR5Q2xhc3MgPVxuICAgIGRlbnNpdHkgPT09IENPTE9SUElDS0VSX0RFTlNJVElFUy5DT01QQUNUXG4gICAgICA/IGAke2NvbmZpZy5wcmVmaXh9LSR7Q09MT1JQSUNLRVJfQ0xBU1NFUy5DT01QQUNUfWBcbiAgICAgIDogbnVsbDtcblxuICByZXR1cm4ge1xuICAgIHRhZzogXCJkaXZcIixcbiAgICBjb21wb25lbnROYW1lOiBjb25maWcuY29tcG9uZW50TmFtZSxcbiAgICBjbGFzc05hbWU6IFt2YXJpYW50Q2xhc3MsIGRlbnNpdHlDbGFzcywgY29uZmlnLmNsYXNzXS5maWx0ZXIoXG4gICAgICBCb29sZWFuLFxuICAgICkgYXMgc3RyaW5nW10sXG4gICAgc3R5bGU6IGB3aWR0aDogJHtkaW1lbnNpb25zLndpZHRofXB4YCxcbiAgfTtcbn07XG5cbi8qKlxuICogR2V0cyB0aGUgc2l6ZSBkaW1lbnNpb25zIGJhc2VkIG9uIHRoZSBzaXplIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAcGFyYW0gc2l6ZSAtIFNpemUga2V5ICgncycsICdtJywgJ2wnKVxuICogQHJldHVybnMgRGltZW5zaW9uIG9iamVjdCB3aXRoIHdpZHRoLCBhcmVhSGVpZ2h0LCBodWVIZWlnaHRcbiAqIEBjYXRlZ29yeSBDb21wb25lbnRzXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGdldFNpemVEaW1lbnNpb25zID0gKFxuICBzaXplOiBzdHJpbmcsXG4pOiB7IHdpZHRoOiBudW1iZXI7IGFyZWFIZWlnaHQ6IG51bWJlcjsgaHVlSGVpZ2h0OiBudW1iZXIgfSA9PiB7XG4gIHJldHVybiAoXG4gICAgU0laRV9ESU1FTlNJT05TW3NpemUgYXMga2V5b2YgdHlwZW9mIFNJWkVfRElNRU5TSU9OU10gfHxcbiAgICBTSVpFX0RJTUVOU0lPTlNbQ09MT1JQSUNLRVJfU0laRVMuTV1cbiAgKTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgaW5pdGlhbCBzdGF0ZSBmb3IgdGhlIGNvbG9yIHBpY2tlclxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb2xvciBwaWNrZXIgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgSW5pdGlhbCBzdGF0ZSBvYmplY3RcbiAqIEBjYXRlZ29yeSBDb21wb25lbnRzXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGNyZWF0ZUluaXRpYWxTdGF0ZSA9IChcbiAgY29uZmlnOiBDb2xvclBpY2tlckNvbmZpZyxcbik6IENvbG9yUGlja2VyU3RhdGUgPT4ge1xuICBjb25zdCBpbml0aWFsSHN2OiBIU1ZDb2xvciA9IGhleFRvSHN2KFxuICAgIGNvbmZpZy52YWx1ZSB8fCBDT0xPUlBJQ0tFUl9ERUZBVUxUUy5WQUxVRSxcbiAgKSB8fCB7XG4gICAgaDogMCxcbiAgICBzOiAxMDAsXG4gICAgdjogMTAwLFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgaHN2OiBpbml0aWFsSHN2LFxuICAgIGhleDogbm9ybWFsaXplSGV4KGNvbmZpZy52YWx1ZSB8fCBDT0xPUlBJQ0tFUl9ERUZBVUxUUy5WQUxVRSksXG4gICAgb3BhY2l0eTogY29uZmlnLm9wYWNpdHkgPz8gMSxcbiAgICBpc0RyYWdnaW5nOiBmYWxzZSxcbiAgICBkcmFnVGFyZ2V0OiBudWxsLFxuICAgIHN3YXRjaGVzOiBbXSxcbiAgICBpc09wZW46IGZhbHNlLFxuICAgIHJlZnM6IHt9LFxuICB9O1xufTtcblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBBUEkgY29uZmlndXJhdGlvbiBmb3IgdGhlIENvbG9yUGlja2VyIGNvbXBvbmVudC5cbiAqIFRoaXMgY29ubmVjdHMgdGhlIGNvcmUgY29tcG9uZW50IGZlYXR1cmVzIHRvIHRoZSBwdWJsaWMgQVBJIG1ldGhvZHMuXG4gKlxuICogQHBhcmFtIGNvbXAgLSBDb21wb25lbnQgd2l0aCBmZWF0dXJlcyBhcHBsaWVkXG4gKiBAcmV0dXJucyBBUEkgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIEBjYXRlZ29yeSBDb21wb25lbnRzXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFwaUNvbmZpZyA9IChjb21wOiB7XG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICBjb25maWc6IENvbG9yUGlja2VyQ29uZmlnO1xuICBnZXRDbGFzczogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nO1xuICBlbWl0OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gIG9uOiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbiAgb2ZmOiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbiAgZGlzYWJsZWQ6IHtcbiAgICBlbmFibGU6ICgpID0+IHZvaWQ7XG4gICAgZGlzYWJsZTogKCkgPT4gdm9pZDtcbiAgICBpc0Rpc2FibGVkOiAoKSA9PiBib29sZWFuO1xuICB9O1xuICBsaWZlY3ljbGU6IHtcbiAgICBkZXN0cm95OiAoKSA9PiB2b2lkO1xuICB9O1xuICAvLyBPcHRpb25hbCBmZWF0dXJlc1xuICBzdGF0ZT86IENvbG9yUGlja2VyU3RhdGU7XG4gIGFyZWE/OiB7XG4gICAgdXBkYXRlQmFja2dyb3VuZDogKCkgPT4gdm9pZDtcbiAgICB1cGRhdGVIYW5kbGU6ICgpID0+IHZvaWQ7XG4gIH07XG4gIGh1ZT86IHtcbiAgICB1cGRhdGVIYW5kbGU6ICgpID0+IHZvaWQ7XG4gIH07XG4gIG9wYWNpdHk/OiB7XG4gICAgdXBkYXRlQmFja2dyb3VuZDogKCkgPT4gdm9pZDtcbiAgICB1cGRhdGVIYW5kbGU6ICgpID0+IHZvaWQ7XG4gIH07XG4gIHN3YXRjaGVzPzoge1xuICAgIHVwZGF0ZTogKCkgPT4gdm9pZDtcbiAgICBzZXQ6IChzd2F0Y2hlczogdW5rbm93bltdKSA9PiB2b2lkO1xuICAgIGFkZDogKGNvbG9yOiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nKSA9PiB2b2lkO1xuICAgIHJlbW92ZTogKGNvbG9yOiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgY2xlYXI6ICgpID0+IHZvaWQ7XG4gICAgZ2V0OiAoKSA9PiB1bmtub3duW107XG4gIH07XG4gIGlucHV0Pzoge1xuICAgIHVwZGF0ZTogKCkgPT4gdm9pZDtcbiAgfTtcbiAgdmFyaWFudD86IHtcbiAgICBvcGVuOiAoKSA9PiB2b2lkO1xuICAgIGNsb3NlOiAoKSA9PiB2b2lkO1xuICAgIHRvZ2dsZTogKCkgPT4gdm9pZDtcbiAgICBpc09wZW46ICgpID0+IGJvb2xlYW47XG4gIH07XG59KSA9PiAoe1xuICBlbGVtZW50OiBjb21wLmVsZW1lbnQsXG4gIGNvbmZpZzogY29tcC5jb25maWcsXG4gIGdldENsYXNzOiBjb21wLmdldENsYXNzLFxuICBlbWl0OiBjb21wLmVtaXQsXG4gIG9uOiBjb21wLm9uLFxuICBvZmY6IGNvbXAub2ZmLFxuICBkaXNhYmxlZDogY29tcC5kaXNhYmxlZCxcbiAgbGlmZWN5Y2xlOiBjb21wLmxpZmVjeWNsZSxcbiAgc3RhdGU6IGNvbXAuc3RhdGUsXG4gIGFyZWE6IGNvbXAuYXJlYSxcbiAgaHVlOiBjb21wLmh1ZSxcbiAgb3BhY2l0eTogY29tcC5vcGFjaXR5LFxuICBzd2F0Y2hlczogY29tcC5zd2F0Y2hlcyxcbiAgaW5wdXQ6IGNvbXAuaW5wdXQsXG4gIHZhcmlhbnQ6IGNvbXAudmFyaWFudCxcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0Q29uZmlnO1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9mZWF0dXJlcy9hcmVhLnRzXG5cbmltcG9ydCB7IENPTE9SUElDS0VSX0NMQVNTRVMsIENPTE9SUElDS0VSX0VWRU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbG9yUGlja2VyQ29uZmlnLCBDb2xvclBpY2tlclN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBoc3ZUb0hleCxcbiAgY2xhbXAsXG4gIGdldENvbnRyYXN0Q29sb3IsXG4gIGhleFRvSHN2LFxuICBub3JtYWxpemVIZXgsXG59IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgZ2V0U2l6ZURpbWVuc2lvbnMsIGNyZWF0ZUluaXRpYWxTdGF0ZSB9IGZyb20gXCIuLi9jb25maWdcIjtcblxuLyoqXG4gKiBBcmVhIGZlYXR1cmUgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXJlYUZlYXR1cmUge1xuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgZ3JhZGllbnQ6IEhUTUxFbGVtZW50O1xuICBoYW5kbGU6IEhUTUxFbGVtZW50O1xuICB1cGRhdGVCYWNrZ3JvdW5kOiAoKSA9PiB2b2lkO1xuICB1cGRhdGVIYW5kbGU6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogQWRkcyB0aGUgc2F0dXJhdGlvbi9icmlnaHRuZXNzIGFyZWEgdG8gYSBjb2xvciBwaWNrZXIgY29tcG9uZW50XG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbG9yIHBpY2tlciBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBDb21wb25lbnQgZW5oYW5jZXIgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhBcmVhID1cbiAgKGNvbmZpZzogQ29sb3JQaWNrZXJDb25maWcpID0+XG4gIDxcbiAgICBUIGV4dGVuZHMge1xuICAgICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgICBnZXRDbGFzczogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgICAgZW1pdDogKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgICAgc3RhdGU/OiBDb2xvclBpY2tlclN0YXRlO1xuICAgICAgcGlja2VyQ29udGVudD86IEhUTUxFbGVtZW50O1xuICAgICAgaW5wdXQ/OiB7XG4gICAgICAgIHVwZGF0ZTogKCkgPT4gdm9pZDtcbiAgICAgIH07XG4gICAgICBvcGFjaXR5Pzoge1xuICAgICAgICB1cGRhdGVCYWNrZ3JvdW5kOiAoKSA9PiB2b2lkO1xuICAgICAgICB1cGRhdGVIYW5kbGU6ICgpID0+IHZvaWQ7XG4gICAgICB9O1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYgeyBhcmVhOiBBcmVhRmVhdHVyZTsgc3RhdGU6IENvbG9yUGlja2VyU3RhdGUgfSA9PiB7XG4gICAgY29uc3QgeyBlbGVtZW50LCBnZXRDbGFzcywgZW1pdCB9ID0gY29tcG9uZW50O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSBpZiBub3QgcHJlc2VudFxuICAgIGNvbnN0IHN0YXRlOiBDb2xvclBpY2tlclN0YXRlID1cbiAgICAgIGNvbXBvbmVudC5zdGF0ZSB8fCBjcmVhdGVJbml0aWFsU3RhdGUoY29uZmlnKTtcblxuICAgIC8vIEdldCBkaW1lbnNpb25zIGJhc2VkIG9uIHNpemVcbiAgICBjb25zdCBkaW1lbnNpb25zID0gZ2V0U2l6ZURpbWVuc2lvbnMoY29uZmlnLnNpemUgfHwgXCJtXCIpO1xuXG4gICAgLy8gVXNlIHBpY2tlckNvbnRlbnQgaWYgYXZhaWxhYmxlIChmb3IgZHJvcGRvd24vZGlhbG9nKSwgb3RoZXJ3aXNlIHVzZSBlbGVtZW50XG4gICAgY29uc3QgY29udGFpbmVyID0gY29tcG9uZW50LnBpY2tlckNvbnRlbnQgfHwgZWxlbWVudDtcblxuICAgIC8vIENyZWF0ZSBhcmVhIGNvbnRhaW5lclxuICAgIGNvbnN0IGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGFyZWEuY2xhc3NOYW1lID0gZ2V0Q2xhc3MoQ09MT1JQSUNLRVJfQ0xBU1NFUy5BUkVBKTtcbiAgICBhcmVhLnN0eWxlLmhlaWdodCA9IGAke2RpbWVuc2lvbnMuYXJlYUhlaWdodH1weGA7XG5cbiAgICAvLyBDcmVhdGUgZ3JhZGllbnQgb3ZlcmxheVxuICAgIGNvbnN0IGdyYWRpZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBncmFkaWVudC5jbGFzc05hbWUgPSBnZXRDbGFzcyhDT0xPUlBJQ0tFUl9DTEFTU0VTLkFSRUFfR1JBRElFTlQpO1xuXG4gICAgLy8gQ3JlYXRlIGhhbmRsZVxuICAgIGNvbnN0IGhhbmRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgaGFuZGxlLmNsYXNzTmFtZSA9IGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuQVJFQV9IQU5ETEUpO1xuXG4gICAgYXJlYS5hcHBlbmRDaGlsZChncmFkaWVudCk7XG4gICAgYXJlYS5hcHBlbmRDaGlsZChoYW5kbGUpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChhcmVhKTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgYXJlYSBiYWNrZ3JvdW5kIGJhc2VkIG9uIGN1cnJlbnQgaHVlXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlQmFja2dyb3VuZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IGh1ZUNvbG9yID0gaHN2VG9IZXgoc3RhdGUuaHN2LmgsIDEwMCwgMTAwKTtcbiAgICAgIGdyYWRpZW50LnN0eWxlLmJhY2tncm91bmQgPSBgXG4gICAgICAgIGxpbmVhci1ncmFkaWVudCh0byB0b3AsICMwMDAsIHRyYW5zcGFyZW50KSxcbiAgICAgICAgbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCAjZmZmLCAke2h1ZUNvbG9yfSlcbiAgICAgIGA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgaGFuZGxlIHBvc2l0aW9uIGFuZCBjb2xvclxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUhhbmRsZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHggPSAoc3RhdGUuaHN2LnMgLyAxMDApICogYXJlYS5vZmZzZXRXaWR0aDtcbiAgICAgIGNvbnN0IHkgPSAoKDEwMCAtIHN0YXRlLmhzdi52KSAvIDEwMCkgKiBhcmVhLm9mZnNldEhlaWdodDtcbiAgICAgIGhhbmRsZS5zdHlsZS5sZWZ0ID0gYCR7eH1weGA7XG4gICAgICBoYW5kbGUuc3R5bGUudG9wID0gYCR7eX1weGA7XG4gICAgICBoYW5kbGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gc3RhdGUuaGV4O1xuICAgICAgaGFuZGxlLnN0eWxlLmJvcmRlckNvbG9yID0gZ2V0Q29udHJhc3RDb2xvcihzdGF0ZS5oZXgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgbW91c2UvdG91Y2ggbW92ZSBvbiBhcmVhXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlQXJlYU1vdmUgPSAoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgIGNvbnN0IHJlY3QgPSBhcmVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3QgeCA9IGNsYW1wKGNsaWVudFggLSByZWN0LmxlZnQsIDAsIHJlY3Qud2lkdGgpO1xuICAgICAgY29uc3QgeSA9IGNsYW1wKGNsaWVudFkgLSByZWN0LnRvcCwgMCwgcmVjdC5oZWlnaHQpO1xuXG4gICAgICBjb25zdCBzID0gKHggLyByZWN0LndpZHRoKSAqIDEwMDtcbiAgICAgIGNvbnN0IHYgPSAxMDAgLSAoeSAvIHJlY3QuaGVpZ2h0KSAqIDEwMDtcblxuICAgICAgc3RhdGUuaHN2LnMgPSBNYXRoLnJvdW5kKHMpO1xuICAgICAgc3RhdGUuaHN2LnYgPSBNYXRoLnJvdW5kKHYpO1xuICAgICAgc3RhdGUuaGV4ID0gaHN2VG9IZXgoc3RhdGUuaHN2LmgsIHN0YXRlLmhzdi5zLCBzdGF0ZS5oc3Yudik7XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGlzIGZlYXR1cmVcbiAgICAgIHVwZGF0ZUhhbmRsZSgpO1xuXG4gICAgICAvLyBVcGRhdGUgb3RoZXIgZmVhdHVyZXMgdGhhdCBkZXBlbmQgb24gY29sb3IgdmlhIHJlZnNcbiAgICAgIHN0YXRlLnJlZnMuaW5wdXQ/LnVwZGF0ZT8uKCk7XG4gICAgICBzdGF0ZS5yZWZzLm9wYWNpdHk/LnVwZGF0ZUJhY2tncm91bmQ/LigpO1xuICAgICAgc3RhdGUucmVmcy5vcGFjaXR5Py51cGRhdGVIYW5kbGU/LigpO1xuXG4gICAgICBlbWl0KENPTE9SUElDS0VSX0VWRU5UUy5JTlBVVCwgc3RhdGUuaGV4KTtcbiAgICAgIGNvbmZpZy5vbklucHV0Py4oc3RhdGUuaGV4KTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIG1vdXNlIGRvd24gb24gYXJlYVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZU1vdXNlRG93biA9IChlOiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoY29uZmlnLmRpc2FibGVkKSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIHN0YXRlLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgc3RhdGUuZHJhZ1RhcmdldCA9IFwiYXJlYVwiO1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuRFJBR0dJTkcpKTtcblxuICAgICAgaGFuZGxlQXJlYU1vdmUoZS5jbGllbnRYLCBlLmNsaWVudFkpO1xuXG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVNb3VzZVVwKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIG1vdXNlIG1vdmUgKGRvY3VtZW50IGxldmVsKVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZU1vdXNlTW92ZSA9IChlOiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXN0YXRlLmlzRHJhZ2dpbmcgfHwgc3RhdGUuZHJhZ1RhcmdldCAhPT0gXCJhcmVhXCIpIHJldHVybjtcbiAgICAgIGhhbmRsZUFyZWFNb3ZlKGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIG1vdXNlIHVwIChkb2N1bWVudCBsZXZlbClcbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVNb3VzZVVwID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHN0YXRlLmlzRHJhZ2dpbmcgJiYgc3RhdGUuZHJhZ1RhcmdldCA9PT0gXCJhcmVhXCIpIHtcbiAgICAgICAgc3RhdGUuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICBzdGF0ZS5kcmFnVGFyZ2V0ID0gbnVsbDtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuRFJBR0dJTkcpKTtcblxuICAgICAgICBlbWl0KENPTE9SUElDS0VSX0VWRU5UUy5DSEFOR0UsIHN0YXRlLmhleCk7XG4gICAgICAgIGNvbmZpZy5vbkNoYW5nZT8uKHN0YXRlLmhleCk7XG4gICAgICB9XG5cbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgaGFuZGxlTW91c2VNb3ZlKTtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2ggc3RhcnQgb24gYXJlYVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVRvdWNoU3RhcnQgPSAoZTogVG91Y2hFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGNvbmZpZy5kaXNhYmxlZCkgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBzdGF0ZS5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmRyYWdUYXJnZXQgPSBcImFyZWFcIjtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChnZXRDbGFzcyhDT0xPUlBJQ0tFUl9DTEFTU0VTLkRSQUdHSU5HKSk7XG5cbiAgICAgIGNvbnN0IHRvdWNoID0gZS50b3VjaGVzWzBdO1xuICAgICAgaGFuZGxlQXJlYU1vdmUodG91Y2guY2xpZW50WCwgdG91Y2guY2xpZW50WSk7XG5cbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlLCB7XG4gICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgaGFuZGxlVG91Y2hFbmQpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgdG91Y2ggbW92ZSAoZG9jdW1lbnQgbGV2ZWwpXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gKGU6IFRvdWNoRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghc3RhdGUuaXNEcmFnZ2luZyB8fCBzdGF0ZS5kcmFnVGFyZ2V0ICE9PSBcImFyZWFcIikgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgdG91Y2ggPSBlLnRvdWNoZXNbMF07XG4gICAgICBoYW5kbGVBcmVhTW92ZSh0b3VjaC5jbGllbnRYLCB0b3VjaC5jbGllbnRZKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHRvdWNoIGVuZCAoZG9jdW1lbnQgbGV2ZWwpXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlVG91Y2hFbmQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoc3RhdGUuaXNEcmFnZ2luZyAmJiBzdGF0ZS5kcmFnVGFyZ2V0ID09PSBcImFyZWFcIikge1xuICAgICAgICBzdGF0ZS5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgIHN0YXRlLmRyYWdUYXJnZXQgPSBudWxsO1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoZ2V0Q2xhc3MoQ09MT1JQSUNLRVJfQ0xBU1NFUy5EUkFHR0lORykpO1xuXG4gICAgICAgIGVtaXQoQ09MT1JQSUNLRVJfRVZFTlRTLkNIQU5HRSwgc3RhdGUuaGV4KTtcbiAgICAgICAgY29uZmlnLm9uQ2hhbmdlPy4oc3RhdGUuaGV4KTtcbiAgICAgIH1cblxuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBoYW5kbGVUb3VjaE1vdmUpO1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIGhhbmRsZVRvdWNoRW5kKTtcbiAgICB9O1xuXG4gICAgLy8gQXR0YWNoIGV2ZW50IGxpc3RlbmVyc1xuICAgIGFyZWEuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBoYW5kbGVNb3VzZURvd24pO1xuICAgIGFyZWEuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIiwgaGFuZGxlVG91Y2hTdGFydCwgeyBwYXNzaXZlOiBmYWxzZSB9KTtcblxuICAgIC8vIEluaXRpYWwgcmVuZGVyXG4gICAgdXBkYXRlQmFja2dyb3VuZCgpO1xuICAgIHVwZGF0ZUhhbmRsZSgpO1xuXG4gICAgLy8gQ3JlYXRlIGFyZWEgZmVhdHVyZSBvYmplY3RcbiAgICBjb25zdCBhcmVhRmVhdHVyZTogQXJlYUZlYXR1cmUgPSB7XG4gICAgICBlbGVtZW50OiBhcmVhLFxuICAgICAgZ3JhZGllbnQsXG4gICAgICBoYW5kbGUsXG4gICAgICB1cGRhdGVCYWNrZ3JvdW5kLFxuICAgICAgdXBkYXRlSGFuZGxlLFxuICAgIH07XG5cbiAgICAvLyBFeHRlbmQgbGlmZWN5Y2xlIGRlc3Ryb3kgaWYgaXQgZXhpc3RzXG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gKGNvbXBvbmVudCBhcyBhbnkpLmxpZmVjeWNsZT8uZGVzdHJveTtcbiAgICBpZiAob3JpZ2luYWxEZXN0cm95KSB7XG4gICAgICAoY29tcG9uZW50IGFzIGFueSkubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIGFyZWEucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLCBoYW5kbGVNb3VzZURvd24pO1xuICAgICAgICBhcmVhLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaHN0YXJ0XCIsIGhhbmRsZVRvdWNoU3RhcnQpO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIGhhbmRsZU1vdXNlTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZU1vdXNlVXApO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaGVuZFwiLCBoYW5kbGVUb3VjaEVuZCk7XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveSgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgc3RhdGUsXG4gICAgICBhcmVhOiBhcmVhRmVhdHVyZSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9mZWF0dXJlcy9odWUudHNcblxuaW1wb3J0IHsgQ09MT1JQSUNLRVJfQ0xBU1NFUywgQ09MT1JQSUNLRVJfRVZFTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ29sb3JQaWNrZXJDb25maWcsIENvbG9yUGlja2VyU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGhzdlRvSGV4IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBjcmVhdGVJbml0aWFsU3RhdGUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5cbi8qKlxuICogSHVlIGZlYXR1cmUgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSHVlRmVhdHVyZSB7XG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICBoYW5kbGU6IEhUTUxFbGVtZW50O1xuICB1cGRhdGVIYW5kbGU6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogQWRkcyBhIHNpbXBsZSBodWUgYmFyIHdpdGggcmFpbmJvdyBncmFkaWVudCBhbmQgZHJhZ2dhYmxlIGhhbmRsZVxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb2xvciBwaWNrZXIgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgQ29tcG9uZW50IGVuaGFuY2VyIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoSHVlID1cbiAgKGNvbmZpZzogQ29sb3JQaWNrZXJDb25maWcpID0+XG4gIDxcbiAgICBUIGV4dGVuZHMge1xuICAgICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgICBnZXRDbGFzczogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgICAgZW1pdDogKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgICAgc3RhdGU/OiBDb2xvclBpY2tlclN0YXRlO1xuICAgICAgcGlja2VyQ29udGVudD86IEhUTUxFbGVtZW50O1xuICAgICAgYXJlYT86IHtcbiAgICAgICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgICAgIHVwZGF0ZUJhY2tncm91bmQ6ICgpID0+IHZvaWQ7XG4gICAgICAgIHVwZGF0ZUhhbmRsZTogKCkgPT4gdm9pZDtcbiAgICAgIH07XG4gICAgfSxcbiAgPihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7IGh1ZTogSHVlRmVhdHVyZTsgc3RhdGU6IENvbG9yUGlja2VyU3RhdGUgfSA9PiB7XG4gICAgY29uc3QgeyBlbGVtZW50LCBnZXRDbGFzcywgZW1pdCB9ID0gY29tcG9uZW50O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSBpZiBub3QgcHJlc2VudFxuICAgIGNvbnN0IHN0YXRlOiBDb2xvclBpY2tlclN0YXRlID1cbiAgICAgIGNvbXBvbmVudC5zdGF0ZSB8fCBjcmVhdGVJbml0aWFsU3RhdGUoY29uZmlnKTtcblxuICAgIC8vIFVzZSBwaWNrZXJDb250ZW50IGlmIGF2YWlsYWJsZSAoZm9yIGRyb3Bkb3duL2RpYWxvZyksIG90aGVyd2lzZSB1c2UgZWxlbWVudFxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbXBvbmVudC5waWNrZXJDb250ZW50IHx8IGVsZW1lbnQ7XG5cbiAgICAvLyBDcmVhdGUgaHVlIGJhciBjb250YWluZXJcbiAgICBjb25zdCBodWVCYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIGh1ZUJhci5jbGFzc05hbWUgPSBnZXRDbGFzcyhDT0xPUlBJQ0tFUl9DTEFTU0VTLkhVRSk7XG5cbiAgICAvLyBDcmVhdGUgcmFpbmJvdyBncmFkaWVudCB0cmFja1xuICAgIGNvbnN0IHRyYWNrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0cmFjay5jbGFzc05hbWUgPSBnZXRDbGFzcyhDT0xPUlBJQ0tFUl9DTEFTU0VTLkhVRV9TTElERVIpO1xuICAgIGh1ZUJhci5hcHBlbmRDaGlsZCh0cmFjayk7XG5cbiAgICAvLyBDcmVhdGUgZHJhZ2dhYmxlIGhhbmRsZVxuICAgIGNvbnN0IGhhbmRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgaGFuZGxlLmNsYXNzTmFtZSA9IGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuSFVFX0hBTkRMRSk7XG4gICAgaHVlQmFyLmFwcGVuZENoaWxkKGhhbmRsZSk7XG5cbiAgICAvLyBJbnNlcnQgYWZ0ZXIgYXJlYSBlbGVtZW50IGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIGFwcGVuZFxuICAgIGlmIChjb21wb25lbnQuYXJlYT8uZWxlbWVudCkge1xuICAgICAgY29tcG9uZW50LmFyZWEuZWxlbWVudC5pbnNlcnRBZGphY2VudEVsZW1lbnQoXCJhZnRlcmVuZFwiLCBodWVCYXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoaHVlQmFyKTtcbiAgICB9XG5cbiAgICAvLyBEcmFnZ2luZyBzdGF0ZVxuICAgIGxldCBpc0RyYWdnaW5nID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgaGFuZGxlIHBvc2l0aW9uIGJhc2VkIG9uIGN1cnJlbnQgaHVlXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlSGFuZGxlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgcGVyY2VudCA9IChzdGF0ZS5oc3YuaCAvIDM2MCkgKiAxMDA7XG4gICAgICBoYW5kbGUuc3R5bGUubGVmdCA9IGAke3BlcmNlbnR9JWA7XG4gICAgICAvLyBTZXQgaGFuZGxlIGNvbG9yIHRvIGN1cnJlbnQgaHVlIGF0IGZ1bGwgc2F0dXJhdGlvbi92YWx1ZVxuICAgICAgaGFuZGxlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGhzdlRvSGV4KHN0YXRlLmhzdi5oLCAxMDAsIDEwMCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENhbGN1bGF0ZSBodWUgZnJvbSBtb3VzZS90b3VjaCBwb3NpdGlvblxuICAgICAqL1xuICAgIGNvbnN0IGdldEh1ZUZyb21Qb3NpdGlvbiA9IChjbGllbnRYOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgY29uc3QgcmVjdCA9IGh1ZUJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihjbGllbnRYIC0gcmVjdC5sZWZ0LCByZWN0LndpZHRoKSk7XG4gICAgICBjb25zdCBwZXJjZW50ID0geCAvIHJlY3Qud2lkdGg7XG4gICAgICByZXR1cm4gTWF0aC5yb3VuZChwZXJjZW50ICogMzYwKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHN0YXRlIGFuZCBlbWl0IGV2ZW50c1xuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZUh1ZSA9IChoOiBudW1iZXIsIGlzQ29tbWl0OiBib29sZWFuKTogdm9pZCA9PiB7XG4gICAgICBzdGF0ZS5oc3YuaCA9IGg7XG4gICAgICBzdGF0ZS5oZXggPSBoc3ZUb0hleChzdGF0ZS5oc3YuaCwgc3RhdGUuaHN2LnMsIHN0YXRlLmhzdi52KTtcblxuICAgICAgdXBkYXRlSGFuZGxlKCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBhcmVhIGlmIHByZXNlbnRcbiAgICAgIGlmIChjb21wb25lbnQuYXJlYSkge1xuICAgICAgICBjb21wb25lbnQuYXJlYS51cGRhdGVCYWNrZ3JvdW5kKCk7XG4gICAgICAgIGNvbXBvbmVudC5hcmVhLnVwZGF0ZUhhbmRsZSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBVcGRhdGUgb3RoZXIgZmVhdHVyZXMgdGhhdCBkZXBlbmQgb24gY29sb3IgdmlhIHJlZnNcbiAgICAgIHN0YXRlLnJlZnMuaW5wdXQ/LnVwZGF0ZT8uKCk7XG4gICAgICBzdGF0ZS5yZWZzLm9wYWNpdHk/LnVwZGF0ZUJhY2tncm91bmQ/LigpO1xuICAgICAgc3RhdGUucmVmcy5vcGFjaXR5Py51cGRhdGVIYW5kbGU/LigpO1xuXG4gICAgICBpZiAoaXNDb21taXQpIHtcbiAgICAgICAgZW1pdChDT0xPUlBJQ0tFUl9FVkVOVFMuQ0hBTkdFLCBzdGF0ZS5oZXgpO1xuICAgICAgICBjb25maWcub25DaGFuZ2U/LihzdGF0ZS5oZXgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZW1pdChDT0xPUlBJQ0tFUl9FVkVOVFMuSU5QVVQsIHN0YXRlLmhleCk7XG4gICAgICAgIGNvbmZpZy5vbklucHV0Py4oc3RhdGUuaGV4KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHBvaW50ZXIgZG93biBvbiBodWUgYmFyXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlUG9pbnRlckRvd24gPSAoZTogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoY29uZmlnLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgc3RhdGUuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICBzdGF0ZS5kcmFnVGFyZ2V0ID0gXCJodWVcIjtcblxuICAgICAgLy8gQ2FwdHVyZSBwb2ludGVyIGZvciB0cmFja2luZyBvdXRzaWRlIGVsZW1lbnRcbiAgICAgIGh1ZUJhci5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG5cbiAgICAgIC8vIEFkZCBkcmFnZ2luZyBjbGFzc1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuRFJBR0dJTkcpKTtcblxuICAgICAgLy8gVXBkYXRlIGh1ZSBpbW1lZGlhdGVseVxuICAgICAgY29uc3QgaCA9IGdldEh1ZUZyb21Qb3NpdGlvbihlLmNsaWVudFgpO1xuICAgICAgdXBkYXRlSHVlKGgsIGZhbHNlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHBvaW50ZXIgbW92ZVxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVBvaW50ZXJNb3ZlID0gKGU6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGggPSBnZXRIdWVGcm9tUG9zaXRpb24oZS5jbGllbnRYKTtcbiAgICAgIHVwZGF0ZUh1ZShoLCBmYWxzZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBwb2ludGVyIHVwXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlUG9pbnRlclVwID0gKGU6IFBvaW50ZXJFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKCFpc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgIHN0YXRlLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgIHN0YXRlLmRyYWdUYXJnZXQgPSBudWxsO1xuXG4gICAgICAvLyBSZWxlYXNlIHBvaW50ZXIgY2FwdHVyZVxuICAgICAgaHVlQmFyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG5cbiAgICAgIC8vIFJlbW92ZSBkcmFnZ2luZyBjbGFzc1xuICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuRFJBR0dJTkcpKTtcblxuICAgICAgLy8gRW1pdCBmaW5hbCBjaGFuZ2VcbiAgICAgIGNvbnN0IGggPSBnZXRIdWVGcm9tUG9zaXRpb24oZS5jbGllbnRYKTtcbiAgICAgIHVwZGF0ZUh1ZShoLCB0cnVlKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGtleWJvYXJkIG5hdmlnYXRpb25cbiAgICAgKi9cbiAgICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmIChjb25maWcuZGlzYWJsZWQpIHJldHVybjtcblxuICAgICAgbGV0IGggPSBzdGF0ZS5oc3YuaDtcbiAgICAgIGNvbnN0IHN0ZXAgPSBlLnNoaWZ0S2V5ID8gMTAgOiAxO1xuXG4gICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgIGNhc2UgXCJBcnJvd0xlZnRcIjpcbiAgICAgICAgY2FzZSBcIkFycm93RG93blwiOlxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBoID0gKGggLSBzdGVwICsgMzYwKSAlIDM2MDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkFycm93UmlnaHRcIjpcbiAgICAgICAgY2FzZSBcIkFycm93VXBcIjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgaCA9IChoICsgc3RlcCkgJSAzNjA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJIb21lXCI6XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGggPSAwO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiRW5kXCI6XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGggPSAzNTk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB1cGRhdGVIdWUoaCwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lcnNcbiAgICBodWVCYXIuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICBodWVCYXIuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIGhhbmRsZVBvaW50ZXJNb3ZlKTtcbiAgICBodWVCYXIuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBoYW5kbGVQb2ludGVyVXApO1xuICAgIGh1ZUJhci5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmNhbmNlbFwiLCBoYW5kbGVQb2ludGVyVXApO1xuXG4gICAgLy8gTWFrZSBodWUgYmFyIGZvY3VzYWJsZSBmb3Iga2V5Ym9hcmQgbmF2aWdhdGlvblxuICAgIGh1ZUJhci50YWJJbmRleCA9IDA7XG4gICAgaHVlQmFyLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJzbGlkZXJcIik7XG4gICAgaHVlQmFyLnNldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIiwgXCJIdWVcIik7XG4gICAgaHVlQmFyLnNldEF0dHJpYnV0ZShcImFyaWEtdmFsdWVtaW5cIiwgXCIwXCIpO1xuICAgIGh1ZUJhci5zZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbWF4XCIsIFwiMzYwXCIpO1xuICAgIGh1ZUJhci5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcblxuICAgIC8vIEluaXRpYWwgaGFuZGxlIHBvc2l0aW9uXG4gICAgdXBkYXRlSGFuZGxlKCk7XG5cbiAgICAvLyBDcmVhdGUgaHVlIGZlYXR1cmUgb2JqZWN0XG4gICAgY29uc3QgaHVlRmVhdHVyZTogSHVlRmVhdHVyZSA9IHtcbiAgICAgIGVsZW1lbnQ6IGh1ZUJhcixcbiAgICAgIGhhbmRsZSxcbiAgICAgIHVwZGF0ZUhhbmRsZSxcbiAgICB9O1xuXG4gICAgLy8gRXh0ZW5kIGxpZmVjeWNsZSBkZXN0cm95IGlmIGl0IGV4aXN0c1xuICAgIGNvbnN0IG9yaWdpbmFsRGVzdHJveSA9IChjb21wb25lbnQgYXMgYW55KS5saWZlY3ljbGU/LmRlc3Ryb3k7XG4gICAgaWYgKG9yaWdpbmFsRGVzdHJveSkge1xuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmxpZmVjeWNsZS5kZXN0cm95ID0gKCkgPT4ge1xuICAgICAgICBodWVCYXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICAgICAgaHVlQmFyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBoYW5kbGVQb2ludGVyTW92ZSk7XG4gICAgICAgIGh1ZUJhci5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGhhbmRsZVBvaW50ZXJVcCk7XG4gICAgICAgIGh1ZUJhci5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmNhbmNlbFwiLCBoYW5kbGVQb2ludGVyVXApO1xuICAgICAgICBodWVCYXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93bik7XG4gICAgICAgIGh1ZUJhci5yZW1vdmUoKTtcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95KCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBzdGF0ZSxcbiAgICAgIGh1ZTogaHVlRmVhdHVyZSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9mZWF0dXJlcy9zd2F0Y2hlcy50c1xuXG5pbXBvcnQgeyBDT0xPUlBJQ0tFUl9DTEFTU0VTLCBDT0xPUlBJQ0tFUl9FVkVOVFMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBDb2xvclBpY2tlckNvbmZpZywgQ29sb3JQaWNrZXJTdGF0ZSwgQ29sb3JTd2F0Y2ggfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZUhleCwgaGV4VG9Ic3YsIGhzdlRvSGV4IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBjcmVhdGVJbml0aWFsU3RhdGUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5cbi8qKlxuICogU3dhdGNoZXMgZmVhdHVyZSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTd2F0Y2hlc0ZlYXR1cmUge1xuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgdXBkYXRlOiAoKSA9PiB2b2lkO1xuICBzZXQ6IChzd2F0Y2hlczogc3RyaW5nW10gfCBDb2xvclN3YXRjaFtdKSA9PiB2b2lkO1xuICBhZGQ6IChjb2xvcjogc3RyaW5nLCBsYWJlbD86IHN0cmluZykgPT4gdm9pZDtcbiAgcmVtb3ZlOiAoY29sb3I6IHN0cmluZykgPT4gdm9pZDtcbiAgY2xlYXI6ICgpID0+IHZvaWQ7XG4gIGdldDogKCkgPT4gQ29sb3JTd2F0Y2hbXTtcbn1cblxuLyoqXG4gKiBOb3JtYWxpemUgc3dhdGNoZXMgYXJyYXkgdG8gQ29sb3JTd2F0Y2ggb2JqZWN0c1xuICovXG5jb25zdCBub3JtYWxpemVTd2F0Y2hlcyA9IChcbiAgc3dhdGNoZXM6IHN0cmluZ1tdIHwgQ29sb3JTd2F0Y2hbXSxcbiAgbWF4U3dhdGNoZXM6IG51bWJlcixcbik6IENvbG9yU3dhdGNoW10gPT4ge1xuICByZXR1cm4gc3dhdGNoZXMuc2xpY2UoMCwgbWF4U3dhdGNoZXMpLm1hcCgocykgPT4ge1xuICAgIGlmICh0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHsgY29sb3I6IG5vcm1hbGl6ZUhleChzKSwgc2VsZWN0ZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIHJldHVybiB7IC4uLnMsIGNvbG9yOiBub3JtYWxpemVIZXgocy5jb2xvcikgfTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIEFkZHMgc3dhdGNoZXMgKGNvbG9yIHByZXNldHMpIHRvIGEgY29sb3IgcGlja2VyIGNvbXBvbmVudFxuICpcbiAqIEBwYXJhbSBjb25maWcgLSBDb2xvciBwaWNrZXIgY29uZmlndXJhdGlvblxuICogQHJldHVybnMgQ29tcG9uZW50IGVuaGFuY2VyIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoU3dhdGNoZXMgPVxuICAoY29uZmlnOiBDb2xvclBpY2tlckNvbmZpZykgPT5cbiAgPFxuICAgIFQgZXh0ZW5kcyB7XG4gICAgICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICAgIGdldENsYXNzOiAobmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XG4gICAgICBlbWl0OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBzdGF0ZT86IENvbG9yUGlja2VyU3RhdGU7XG4gICAgICBwaWNrZXJDb250ZW50PzogSFRNTEVsZW1lbnQ7XG4gICAgICB2YXJpYW50Pzoge1xuICAgICAgICBjbG9zZTogKCkgPT4gdm9pZDtcbiAgICAgIH07XG4gICAgICBhcmVhPzoge1xuICAgICAgICB1cGRhdGVCYWNrZ3JvdW5kOiAoKSA9PiB2b2lkO1xuICAgICAgICB1cGRhdGVIYW5kbGU6ICgpID0+IHZvaWQ7XG4gICAgICB9O1xuICAgICAgaHVlPzoge1xuICAgICAgICB1cGRhdGVIYW5kbGU6ICgpID0+IHZvaWQ7XG4gICAgICB9O1xuICAgICAgaW5wdXQ/OiB7XG4gICAgICAgIHVwZGF0ZTogKCkgPT4gdm9pZDtcbiAgICAgIH07XG4gICAgfSxcbiAgPihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7IHN3YXRjaGVzOiBTd2F0Y2hlc0ZlYXR1cmU7IHN0YXRlOiBDb2xvclBpY2tlclN0YXRlIH0gPT4ge1xuICAgIGNvbnN0IHsgZWxlbWVudCwgZ2V0Q2xhc3MsIGVtaXQgfSA9IGNvbXBvbmVudDtcblxuICAgIC8vIEluaXRpYWxpemUgc3RhdGUgaWYgbm90IHByZXNlbnRcbiAgICBjb25zdCBzdGF0ZTogQ29sb3JQaWNrZXJTdGF0ZSA9XG4gICAgICBjb21wb25lbnQuc3RhdGUgfHwgY3JlYXRlSW5pdGlhbFN0YXRlKGNvbmZpZyk7XG5cbiAgICAvLyBVc2UgcGlja2VyQ29udGVudCBpZiBhdmFpbGFibGUgKGZvciBkcm9wZG93bi9kaWFsb2cpLCBvdGhlcndpc2UgdXNlIGVsZW1lbnRcbiAgICBjb25zdCBjb250YWluZXIgPSBjb21wb25lbnQucGlja2VyQ29udGVudCB8fCBlbGVtZW50O1xuXG4gICAgY29uc3Qgc3dhdGNoU2l6ZSA9IGNvbmZpZy5zd2F0Y2hTaXplIHx8IDMyO1xuICAgIGNvbnN0IG1heFN3YXRjaGVzID0gY29uZmlnLm1heFN3YXRjaGVzIHx8IDg7XG5cbiAgICAvLyBJbml0aWFsaXplIHN3YXRjaGVzIGZyb20gY29uZmlnXG4gICAgaWYgKGNvbmZpZy5zd2F0Y2hlcykge1xuICAgICAgc3RhdGUuc3dhdGNoZXMgPSBub3JtYWxpemVTd2F0Y2hlcyhjb25maWcuc3dhdGNoZXMsIG1heFN3YXRjaGVzKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgc3dhdGNoZXMgY29udGFpbmVyXG4gICAgY29uc3Qgc3dhdGNoZXNDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHN3YXRjaGVzQ29udGFpbmVyLmNsYXNzTmFtZSA9IGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuU1dBVENIRVMpO1xuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzd2F0Y2hlc0NvbnRhaW5lcik7XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYWxsIFVJIGZlYXR1cmVzXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlQWxsVUkgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjb21wb25lbnQuYXJlYT8udXBkYXRlQmFja2dyb3VuZD8uKCk7XG4gICAgICBjb21wb25lbnQuYXJlYT8udXBkYXRlSGFuZGxlPy4oKTtcbiAgICAgIGNvbXBvbmVudC5odWU/LnVwZGF0ZUhhbmRsZT8uKCk7XG4gICAgICBzdGF0ZS5yZWZzLm9wYWNpdHk/LnVwZGF0ZUJhY2tncm91bmQ/LigpO1xuICAgICAgc3RhdGUucmVmcy5vcGFjaXR5Py51cGRhdGVIYW5kbGU/LigpO1xuICAgICAgc3RhdGUucmVmcy5pbnB1dD8udXBkYXRlPy4oKTtcbiAgICAgIHVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgc3dhdGNoIGNsaWNrXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlU3dhdGNoQ2xpY2sgPSAoc3dhdGNoOiBDb2xvclN3YXRjaCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKGNvbmZpZy5kaXNhYmxlZCkgcmV0dXJuO1xuXG4gICAgICAvLyBVcGRhdGUgc3RhdGUgZGlyZWN0bHlcbiAgICAgIGNvbnN0IGhzdiA9IGhleFRvSHN2KHN3YXRjaC5jb2xvcik7XG4gICAgICBpZiAoaHN2KSB7XG4gICAgICAgIHN0YXRlLmhzdiA9IGhzdjtcbiAgICAgICAgc3RhdGUuaGV4ID0gbm9ybWFsaXplSGV4KHN3YXRjaC5jb2xvcik7XG5cbiAgICAgICAgLy8gVXBkYXRlIGFsbCBVSVxuICAgICAgICB1cGRhdGVBbGxVSSgpO1xuXG4gICAgICAgIC8vIEVtaXQgY2hhbmdlIGV2ZW50XG4gICAgICAgIGVtaXQoQ09MT1JQSUNLRVJfRVZFTlRTLkNIQU5HRSwgc3RhdGUuaGV4KTtcbiAgICAgICAgY29uZmlnLm9uQ2hhbmdlPy4oc3RhdGUuaGV4KTtcbiAgICAgIH1cblxuICAgICAgZW1pdChDT0xPUlBJQ0tFUl9FVkVOVFMuU1dBVENIX1NFTEVDVCwgc3dhdGNoLmNvbG9yKTtcblxuICAgICAgLy8gQ2xvc2UgZHJvcGRvd24vZGlhbG9nIGlmIGNvbmZpZ3VyZWRcbiAgICAgIGlmIChjb25maWcuY2xvc2VPblNlbGVjdCAmJiBjb21wb25lbnQudmFyaWFudCkge1xuICAgICAgICBjb21wb25lbnQudmFyaWFudC5jbG9zZSgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHN3YXRjaGVzIGRpc3BsYXlcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGUgPSAoKTogdm9pZCA9PiB7XG4gICAgICBzd2F0Y2hlc0NvbnRhaW5lci5pbm5lckhUTUwgPSBcIlwiO1xuXG4gICAgICBzdGF0ZS5zd2F0Y2hlcy5mb3JFYWNoKChzd2F0Y2gpID0+IHtcbiAgICAgICAgY29uc3Qgc3dhdGNoRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiYnV0dG9uXCIpO1xuICAgICAgICBzd2F0Y2hFbC50eXBlID0gXCJidXR0b25cIjtcbiAgICAgICAgc3dhdGNoRWwuY2xhc3NOYW1lID0gZ2V0Q2xhc3MoQ09MT1JQSUNLRVJfQ0xBU1NFUy5TV0FUQ0gpO1xuICAgICAgICBzd2F0Y2hFbC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBzd2F0Y2guY29sb3I7XG5cbiAgICAgICAgLy8gTWFyayBhcyBzZWxlY3RlZCBpZiBtYXRjaGVzIGN1cnJlbnQgY29sb3JcbiAgICAgICAgaWYgKHN3YXRjaC5jb2xvci50b0xvd2VyQ2FzZSgpID09PSBzdGF0ZS5oZXgudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICAgIHN3YXRjaEVsLmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoQ09MT1JQSUNLRVJfQ0xBU1NFUy5TV0FUQ0hfU0VMRUNURUQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCB0b29sdGlwIGlmIGxhYmVsIGV4aXN0c1xuICAgICAgICBpZiAoc3dhdGNoLmxhYmVsKSB7XG4gICAgICAgICAgc3dhdGNoRWwudGl0bGUgPSBzd2F0Y2gubGFiZWw7XG4gICAgICAgIH1cblxuICAgICAgICBzd2F0Y2hFbC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGhhbmRsZVN3YXRjaENsaWNrKHN3YXRjaCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHN3YXRjaGVzQ29udGFpbmVyLmFwcGVuZENoaWxkKHN3YXRjaEVsKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXQgc3dhdGNoZXMgYXJyYXlcbiAgICAgKi9cbiAgICBjb25zdCBzZXQgPSAoc3dhdGNoZXM6IHN0cmluZ1tdIHwgQ29sb3JTd2F0Y2hbXSk6IHZvaWQgPT4ge1xuICAgICAgc3RhdGUuc3dhdGNoZXMgPSBub3JtYWxpemVTd2F0Y2hlcyhzd2F0Y2hlcywgbWF4U3dhdGNoZXMpO1xuICAgICAgdXBkYXRlKCk7XG4gICAgICBlbWl0KENPTE9SUElDS0VSX0VWRU5UUy5TV0FUQ0hFU19DSEFOR0UsIHN0YXRlLnN3YXRjaGVzKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQWRkIGEgc3dhdGNoXG4gICAgICovXG4gICAgY29uc3QgYWRkID0gKGNvbG9yOiBzdHJpbmcsIGxhYmVsPzogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICBpZiAoc3RhdGUuc3dhdGNoZXMubGVuZ3RoID49IG1heFN3YXRjaGVzKSB7XG4gICAgICAgIHN0YXRlLnN3YXRjaGVzLnNoaWZ0KCk7XG4gICAgICB9XG4gICAgICBzdGF0ZS5zd2F0Y2hlcy5wdXNoKHtcbiAgICAgICAgY29sb3I6IG5vcm1hbGl6ZUhleChjb2xvciksXG4gICAgICAgIGxhYmVsLFxuICAgICAgICBzZWxlY3RlZDogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIHVwZGF0ZSgpO1xuICAgICAgZW1pdChDT0xPUlBJQ0tFUl9FVkVOVFMuU1dBVENIRVNfQ0hBTkdFLCBzdGF0ZS5zd2F0Y2hlcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBhIHN3YXRjaCBieSBjb2xvclxuICAgICAqL1xuICAgIGNvbnN0IHJlbW92ZSA9IChjb2xvcjogc3RyaW5nKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBub3JtYWxpemVkQ29sb3IgPSBub3JtYWxpemVIZXgoY29sb3IpO1xuICAgICAgc3RhdGUuc3dhdGNoZXMgPSBzdGF0ZS5zd2F0Y2hlcy5maWx0ZXIoXG4gICAgICAgIChzKSA9PiBzLmNvbG9yLnRvTG93ZXJDYXNlKCkgIT09IG5vcm1hbGl6ZWRDb2xvci50b0xvd2VyQ2FzZSgpLFxuICAgICAgKTtcbiAgICAgIHVwZGF0ZSgpO1xuICAgICAgZW1pdChDT0xPUlBJQ0tFUl9FVkVOVFMuU1dBVENIRVNfQ0hBTkdFLCBzdGF0ZS5zd2F0Y2hlcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENsZWFyIGFsbCBzd2F0Y2hlc1xuICAgICAqL1xuICAgIGNvbnN0IGNsZWFyID0gKCk6IHZvaWQgPT4ge1xuICAgICAgc3RhdGUuc3dhdGNoZXMgPSBbXTtcbiAgICAgIHVwZGF0ZSgpO1xuICAgICAgZW1pdChDT0xPUlBJQ0tFUl9FVkVOVFMuU1dBVENIRVNfQ0hBTkdFLCBzdGF0ZS5zd2F0Y2hlcyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEdldCBjdXJyZW50IHN3YXRjaGVzXG4gICAgICovXG4gICAgY29uc3QgZ2V0ID0gKCk6IENvbG9yU3dhdGNoW10gPT4ge1xuICAgICAgcmV0dXJuIFsuLi5zdGF0ZS5zd2F0Y2hlc107XG4gICAgfTtcblxuICAgIC8vIEluaXRpYWwgcmVuZGVyXG4gICAgdXBkYXRlKCk7XG5cbiAgICAvLyBDcmVhdGUgc3dhdGNoZXMgZmVhdHVyZSBvYmplY3RcbiAgICBjb25zdCBzd2F0Y2hlc0ZlYXR1cmU6IFN3YXRjaGVzRmVhdHVyZSA9IHtcbiAgICAgIGVsZW1lbnQ6IHN3YXRjaGVzQ29udGFpbmVyLFxuICAgICAgdXBkYXRlLFxuICAgICAgc2V0LFxuICAgICAgYWRkLFxuICAgICAgcmVtb3ZlLFxuICAgICAgY2xlYXIsXG4gICAgICBnZXQsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBzdGF0ZSxcbiAgICAgIHN3YXRjaGVzOiBzd2F0Y2hlc0ZlYXR1cmUsXG4gICAgfTtcbiAgfTtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvY29sb3JwaWNrZXIvZmVhdHVyZXMvaW5wdXQudHNcblxuaW1wb3J0IHsgY3JlYXRlVGV4dGZpZWxkIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IENPTE9SUElDS0VSX0NMQVNTRVMsIENPTE9SUElDS0VSX0VWRU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbG9yUGlja2VyQ29uZmlnLCBDb2xvclBpY2tlclN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBpc1ZhbGlkSGV4LCBub3JtYWxpemVIZXgsIGhleFRvSHN2IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBjcmVhdGVJbml0aWFsU3RhdGUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5cbi8qKlxuICogSW5wdXQgZmVhdHVyZSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnB1dEZlYXR1cmUge1xuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgdGV4dGZpZWxkOiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVUZXh0ZmllbGQ+IHwgbnVsbDtcbiAgcHJldmlldzogSFRNTEVsZW1lbnQgfCBudWxsO1xuICB1cGRhdGU6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogQWRkcyB0aGUgaGV4IGlucHV0IGZpZWxkICh1c2luZyBtdHJsIHRleHRmaWVsZCkgYW5kIGNvbG9yIHByZXZpZXcgdG8gYSBjb2xvciBwaWNrZXIgY29tcG9uZW50XG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbG9yIHBpY2tlciBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBDb21wb25lbnQgZW5oYW5jZXIgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhJbnB1dCA9XG4gIChjb25maWc6IENvbG9yUGlja2VyQ29uZmlnKSA9PlxuICA8XG4gICAgVCBleHRlbmRzIHtcbiAgICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgICAgZ2V0Q2xhc3M6IChuYW1lOiBzdHJpbmcpID0+IHN0cmluZztcbiAgICAgIGVtaXQ6IChldmVudDogc3RyaW5nLCBkYXRhPzogdW5rbm93bikgPT4gdm9pZDtcbiAgICAgIHN0YXRlPzogQ29sb3JQaWNrZXJTdGF0ZTtcbiAgICAgIHBpY2tlckNvbnRlbnQ/OiBIVE1MRWxlbWVudDtcbiAgICAgIHZhcmlhbnQ/OiB7XG4gICAgICAgIGNsb3NlOiAoKSA9PiB2b2lkO1xuICAgICAgfTtcbiAgICAgIGFyZWE/OiB7XG4gICAgICAgIHVwZGF0ZUJhY2tncm91bmQ6ICgpID0+IHZvaWQ7XG4gICAgICAgIHVwZGF0ZUhhbmRsZTogKCkgPT4gdm9pZDtcbiAgICAgIH07XG4gICAgICBodWU/OiB7XG4gICAgICAgIHVwZGF0ZUhhbmRsZTogKCkgPT4gdm9pZDtcbiAgICAgIH07XG4gICAgfSxcbiAgPihcbiAgICBjb21wb25lbnQ6IFQsXG4gICk6IFQgJiB7IGlucHV0OiBJbnB1dEZlYXR1cmU7IHN0YXRlOiBDb2xvclBpY2tlclN0YXRlIH0gPT4ge1xuICAgIGNvbnN0IHsgZWxlbWVudCwgZ2V0Q2xhc3MsIGVtaXQgfSA9IGNvbXBvbmVudDtcblxuICAgIC8vIEluaXRpYWxpemUgc3RhdGUgaWYgbm90IHByZXNlbnRcbiAgICBjb25zdCBzdGF0ZTogQ29sb3JQaWNrZXJTdGF0ZSA9XG4gICAgICBjb21wb25lbnQuc3RhdGUgfHwgY3JlYXRlSW5pdGlhbFN0YXRlKGNvbmZpZyk7XG5cbiAgICAvLyBVc2UgcGlja2VyQ29udGVudCBpZiBhdmFpbGFibGUgKGZvciBkcm9wZG93bi9kaWFsb2cpLCBvdGhlcndpc2UgdXNlIGVsZW1lbnRcbiAgICBjb25zdCBjb250YWluZXIgPSBjb21wb25lbnQucGlja2VyQ29udGVudCB8fCBlbGVtZW50O1xuXG4gICAgY29uc3Qgc2hvd0lucHV0ID0gY29uZmlnLnNob3dJbnB1dCA/PyB0cnVlO1xuICAgIGNvbnN0IHNob3dQcmV2aWV3ID0gY29uZmlnLnNob3dQcmV2aWV3ID8/IHRydWU7XG5cbiAgICAvLyBPbmx5IGNyZWF0ZSBpZiBhdCBsZWFzdCBvbmUgaXMgZW5hYmxlZFxuICAgIGlmICghc2hvd0lucHV0ICYmICFzaG93UHJldmlldykge1xuICAgICAgY29uc3QgZW1wdHlGZWF0dXJlOiBJbnB1dEZlYXR1cmUgPSB7XG4gICAgICAgIGVsZW1lbnQ6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksXG4gICAgICAgIHRleHRmaWVsZDogbnVsbCxcbiAgICAgICAgcHJldmlldzogbnVsbCxcbiAgICAgICAgdXBkYXRlOiAoKSA9PiB7fSxcbiAgICAgIH07XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5jb21wb25lbnQsXG4gICAgICAgIHN0YXRlLFxuICAgICAgICBpbnB1dDogZW1wdHlGZWF0dXJlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgcm93IGNvbnRhaW5lclxuICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgcm93LmNsYXNzTmFtZSA9IGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuVkFMVUUpO1xuXG4gICAgbGV0IHByZXZpZXdFbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgdGV4dGZpZWxkQ29tcG9uZW50OiBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVUZXh0ZmllbGQ+IHwgbnVsbCA9IG51bGw7XG4gICAgbGV0IGlucHV0RWw6IEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICAgIC8vIENyZWF0ZSBwcmV2aWV3IHNxdWFyZVxuICAgIGlmIChzaG93UHJldmlldykge1xuICAgICAgcHJldmlld0VsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIHByZXZpZXdFbC5jbGFzc05hbWUgPSBnZXRDbGFzcyhDT0xPUlBJQ0tFUl9DTEFTU0VTLlBSRVZJRVcpO1xuICAgICAgcm93LmFwcGVuZENoaWxkKHByZXZpZXdFbCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRleHRmaWVsZCBzeW5jaHJvbm91c2x5XG4gICAgaWYgKHNob3dJbnB1dCkge1xuICAgICAgdGV4dGZpZWxkQ29tcG9uZW50ID0gY3JlYXRlVGV4dGZpZWxkKHtcbiAgICAgICAgdmFyaWFudDogXCJmaWxsZWRcIixcbiAgICAgICAgZGVuc2l0eTogXCJjb21wYWN0XCIsXG4gICAgICAgIGxhYmVsOiBjb25maWcuaW5wdXRMYWJlbCB8fCBcIkhleFwiLFxuICAgICAgICB2YWx1ZTogc3RhdGUuaGV4LnRvVXBwZXJDYXNlKCksXG4gICAgICAgIG1heExlbmd0aDogNyxcbiAgICAgICAgY2xhc3M6IGdldENsYXNzKFwiY29sb3JwaWNrZXJfX3RleHRmaWVsZFwiKSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBHZXQgdGhlIGFjdHVhbCBpbnB1dCBlbGVtZW50XG4gICAgICBpbnB1dEVsID0gdGV4dGZpZWxkQ29tcG9uZW50LmlucHV0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XG5cbiAgICAgIC8vIFN0eWxlIGFkanVzdG1lbnRzIGZvciBjb2xvciBwaWNrZXIgY29udGV4dFxuICAgICAgaWYgKHRleHRmaWVsZENvbXBvbmVudC5lbGVtZW50KSB7XG4gICAgICAgIHRleHRmaWVsZENvbXBvbmVudC5lbGVtZW50LnN0eWxlLmZsZXggPSBcIjFcIjtcbiAgICAgICAgcm93LmFwcGVuZENoaWxkKHRleHRmaWVsZENvbXBvbmVudC5lbGVtZW50KTtcblxuICAgICAgICAvLyBBcHBseSBtb25vc3BhY2UgZm9udCB0byBpbnB1dFxuICAgICAgICBpZiAoaW5wdXRFbCkge1xuICAgICAgICAgIGlucHV0RWwuc3R5bGUuZm9udEZhbWlseSA9IFwibW9ub3NwYWNlXCI7XG4gICAgICAgICAgaW5wdXRFbC5zdHlsZS50ZXh0VHJhbnNmb3JtID0gXCJ1cHBlcmNhc2VcIjtcbiAgICAgICAgICBpbnB1dEVsLnNwZWxsY2hlY2sgPSBmYWxzZTtcbiAgICAgICAgICBpbnB1dEVsLmF1dG9jb21wbGV0ZSA9IFwib2ZmXCI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gSGFuZGxlIGlucHV0IGNoYW5nZVxuICAgICAgdGV4dGZpZWxkQ29tcG9uZW50Lm9uKFwiY2hhbmdlXCIsIGhhbmRsZUlucHV0Q2hhbmdlKTtcbiAgICAgIHRleHRmaWVsZENvbXBvbmVudC5vbihcImJsdXJcIiwgaGFuZGxlQmx1cik7XG5cbiAgICAgIC8vIEhhbmRsZSBrZXlkb3duIGZvciBFbnRlci9Fc2NhcGVcbiAgICAgIGlmIChpbnB1dEVsKSB7XG4gICAgICAgIGlucHV0RWwuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93bik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKHJvdyk7XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYWxsIFVJIGZlYXR1cmVzXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlQWxsVUkgPSAoKTogdm9pZCA9PiB7XG4gICAgICBjb21wb25lbnQuYXJlYT8udXBkYXRlQmFja2dyb3VuZD8uKCk7XG4gICAgICBjb21wb25lbnQuYXJlYT8udXBkYXRlSGFuZGxlPy4oKTtcbiAgICAgIGNvbXBvbmVudC5odWU/LnVwZGF0ZUhhbmRsZT8uKCk7XG4gICAgICB1cGRhdGUoKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBwcmV2aWV3IGNvbG9yXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlUHJldmlldyA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChwcmV2aWV3RWwpIHtcbiAgICAgICAgcHJldmlld0VsLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHN0YXRlLmhleDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSB0ZXh0ZmllbGQgdmFsdWUgKG9ubHkgaWYgbm90IGZvY3VzZWQpXG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlSW5wdXQgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAodGV4dGZpZWxkQ29tcG9uZW50ICYmIGlucHV0RWwgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPT0gaW5wdXRFbCkge1xuICAgICAgICB0ZXh0ZmllbGRDb21wb25lbnQuc2V0VmFsdWUoc3RhdGUuaGV4LnRvVXBwZXJDYXNlKCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgYm90aCBwcmV2aWV3IGFuZCBpbnB1dFxuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIHVwZGF0ZVByZXZpZXcoKTtcbiAgICAgIHVwZGF0ZUlucHV0KCk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBpbnB1dCBjaGFuZ2UgKGJsdXIgb3IgZW50ZXIpXG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFuZGxlSW5wdXRDaGFuZ2UoKTogdm9pZCB7XG4gICAgICBpZiAoIXRleHRmaWVsZENvbXBvbmVudCkgcmV0dXJuO1xuXG4gICAgICBsZXQgdmFsdWUgPSB0ZXh0ZmllbGRDb21wb25lbnQuZ2V0VmFsdWUoKS50cmltKCk7XG5cbiAgICAgIC8vIEFkZCAjIGlmIG1pc3NpbmdcbiAgICAgIGlmICh2YWx1ZSAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIiNcIikpIHtcbiAgICAgICAgdmFsdWUgPSBcIiNcIiArIHZhbHVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNWYWxpZEhleCh2YWx1ZSkpIHtcbiAgICAgICAgY29uc3QgaHN2ID0gaGV4VG9Ic3YodmFsdWUpO1xuICAgICAgICBpZiAoaHN2KSB7XG4gICAgICAgICAgc3RhdGUuaHN2ID0gaHN2O1xuICAgICAgICAgIHN0YXRlLmhleCA9IG5vcm1hbGl6ZUhleCh2YWx1ZSk7XG5cbiAgICAgICAgICAvLyBVcGRhdGUgYWxsIFVJXG4gICAgICAgICAgdXBkYXRlQWxsVUkoKTtcblxuICAgICAgICAgIGVtaXQoQ09MT1JQSUNLRVJfRVZFTlRTLkNIQU5HRSwgc3RhdGUuaGV4KTtcbiAgICAgICAgICBjb25maWcub25DaGFuZ2U/LihzdGF0ZS5oZXgpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXZlcnQgdG8gY3VycmVudCB2YWxpZCBjb2xvclxuICAgICAgICB0ZXh0ZmllbGRDb21wb25lbnQuc2V0VmFsdWUoc3RhdGUuaGV4LnRvVXBwZXJDYXNlKCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBrZXlkb3duIG9uIGlucHV0XG4gICAgICovXG4gICAgZnVuY3Rpb24gaGFuZGxlS2V5RG93bihlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRW50ZXJcIikge1xuICAgICAgICBoYW5kbGVJbnB1dENoYW5nZSgpO1xuICAgICAgICBpbnB1dEVsPy5ibHVyKCk7XG4gICAgICB9XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgLy8gUmV2ZXJ0IGFuZCBibHVyXG4gICAgICAgIGlmICh0ZXh0ZmllbGRDb21wb25lbnQpIHtcbiAgICAgICAgICB0ZXh0ZmllbGRDb21wb25lbnQuc2V0VmFsdWUoc3RhdGUuaGV4LnRvVXBwZXJDYXNlKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0RWw/LmJsdXIoKTtcbiAgICAgICAgLy8gQ2xvc2UgZHJvcGRvd24vZGlhbG9nIGlmIGV4aXN0c1xuICAgICAgICBpZiAoY29tcG9uZW50LnZhcmlhbnQpIHtcbiAgICAgICAgICBjb21wb25lbnQudmFyaWFudC5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIGJsdXIgb24gaW5wdXRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBoYW5kbGVCbHVyKCk6IHZvaWQge1xuICAgICAgaGFuZGxlSW5wdXRDaGFuZ2UoKTtcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsIHJlbmRlclxuICAgIHVwZGF0ZVByZXZpZXcoKTtcblxuICAgIC8vIENyZWF0ZSBpbnB1dCBmZWF0dXJlIG9iamVjdFxuICAgIGNvbnN0IGlucHV0RmVhdHVyZTogSW5wdXRGZWF0dXJlID0ge1xuICAgICAgZWxlbWVudDogcm93LFxuICAgICAgdGV4dGZpZWxkOiB0ZXh0ZmllbGRDb21wb25lbnQsXG4gICAgICBwcmV2aWV3OiBwcmV2aWV3RWwsXG4gICAgICB1cGRhdGUsXG4gICAgfTtcblxuICAgIC8vIFJlZ2lzdGVyIGluIHJlZnMgZm9yIGNyb3NzLWZlYXR1cmUgYWNjZXNzXG4gICAgc3RhdGUucmVmcy5pbnB1dCA9IHsgdXBkYXRlIH07XG5cbiAgICAvLyBFeHRlbmQgbGlmZWN5Y2xlIGRlc3Ryb3kgaWYgaXQgZXhpc3RzXG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gKGNvbXBvbmVudCBhcyBhbnkpLmxpZmVjeWNsZT8uZGVzdHJveTtcbiAgICBpZiAob3JpZ2luYWxEZXN0cm95KSB7XG4gICAgICAoY29tcG9uZW50IGFzIGFueSkubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIGlmIChpbnB1dEVsKSB7XG4gICAgICAgICAgaW5wdXRFbC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dGZpZWxkQ29tcG9uZW50KSB7XG4gICAgICAgICAgdGV4dGZpZWxkQ29tcG9uZW50LmRlc3Ryb3koKTtcbiAgICAgICAgfVxuICAgICAgICBvcmlnaW5hbERlc3Ryb3koKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHN0YXRlLFxuICAgICAgaW5wdXQ6IGlucHV0RmVhdHVyZSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9mZWF0dXJlcy92YXJpYW50LnRzXG5cbmltcG9ydCB7XG4gIENPTE9SUElDS0VSX0NMQVNTRVMsXG4gIENPTE9SUElDS0VSX0VWRU5UUyxcbiAgQ09MT1JQSUNLRVJfVkFSSUFOVFMsXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbG9yUGlja2VyQ29uZmlnLCBDb2xvclBpY2tlclN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBjcmVhdGVJbml0aWFsU3RhdGUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5cbi8qKlxuICogVmFyaWFudCBmZWF0dXJlIGludGVyZmFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhcmlhbnRGZWF0dXJlIHtcbiAgYmFja2Ryb3A6IEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgY29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgb3BlbjogKCkgPT4gdm9pZDtcbiAgY2xvc2U6ICgpID0+IHZvaWQ7XG4gIHRvZ2dsZTogKCkgPT4gdm9pZDtcbiAgaXNPcGVuOiAoKSA9PiBib29sZWFuO1xuICBwb3NpdGlvbjogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBBZGRzIHZhcmlhbnQtc3BlY2lmaWMgYmVoYXZpb3IgKGRyb3Bkb3duL2RpYWxvZykgdG8gYSBjb2xvciBwaWNrZXIgY29tcG9uZW50LlxuICogSGFuZGxlcyBwb3NpdGlvbmluZywgb3Blbi9jbG9zZSwgYmFja2Ryb3AsIGFuZCBldmVudCBtYW5hZ2VtZW50IHRoYXQgQ1NTIGNhbm5vdCBoYW5kbGUuXG4gKlxuICogQHBhcmFtIGNvbmZpZyAtIENvbG9yIHBpY2tlciBjb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyBDb21wb25lbnQgZW5oYW5jZXIgZnVuY3Rpb25cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhWYXJpYW50ID1cbiAgKGNvbmZpZzogQ29sb3JQaWNrZXJDb25maWcpID0+XG4gIDxcbiAgICBUIGV4dGVuZHMge1xuICAgICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgICBnZXRDbGFzczogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nO1xuICAgICAgZW1pdDogKGV2ZW50OiBzdHJpbmcsIGRhdGE/OiB1bmtub3duKSA9PiB2b2lkO1xuICAgICAgc3RhdGU/OiBDb2xvclBpY2tlclN0YXRlO1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYge1xuICAgIHZhcmlhbnQ6IFZhcmlhbnRGZWF0dXJlO1xuICAgIHBpY2tlckNvbnRlbnQ6IEhUTUxFbGVtZW50O1xuICAgIHN0YXRlOiBDb2xvclBpY2tlclN0YXRlO1xuICB9ID0+IHtcbiAgICBjb25zdCB7IGVsZW1lbnQsIGdldENsYXNzLCBlbWl0IH0gPSBjb21wb25lbnQ7XG5cbiAgICAvLyBJbml0aWFsaXplIHN0YXRlIGlmIG5vdCBwcmVzZW50XG4gICAgY29uc3Qgc3RhdGU6IENvbG9yUGlja2VyU3RhdGUgPVxuICAgICAgY29tcG9uZW50LnN0YXRlIHx8IGNyZWF0ZUluaXRpYWxTdGF0ZShjb25maWcpO1xuXG4gICAgLy8gVHJhY2sgd2hlbiBkcmFnIGVuZGVkIHRvIHByZXZlbnQgY2xvc2luZyBvbiBkcmFnIHJlbGVhc2VcbiAgICBsZXQgbGFzdERyYWdFbmRUaW1lID0gMDtcblxuICAgIC8vIFRyYWNrIGlmIG1vdXNlZG93biBzdGFydGVkIGluc2lkZSB0aGUgcGlja2VyIChmb3IgdGV4dCBzZWxlY3Rpb24pXG4gICAgbGV0IG1vdXNlRG93bkluc2lkZVBpY2tlciA9IGZhbHNlO1xuXG4gICAgY29uc3QgdmFyaWFudFR5cGUgPSBjb25maWcudmFyaWFudCB8fCBDT0xPUlBJQ0tFUl9WQVJJQU5UUy5JTkxJTkU7XG5cbiAgICAvLyBPbmx5IGFwcGx5IHZhcmlhbnQgYmVoYXZpb3IgZm9yIGRyb3Bkb3duL2RpYWxvZyB2YXJpYW50c1xuICAgIGNvbnN0IG5lZWRzVmFyaWFudEJlaGF2aW9yID1cbiAgICAgIHZhcmlhbnRUeXBlID09PSBDT0xPUlBJQ0tFUl9WQVJJQU5UUy5EUk9QRE9XTiB8fFxuICAgICAgdmFyaWFudFR5cGUgPT09IENPTE9SUElDS0VSX1ZBUklBTlRTLkRJQUxPRztcblxuICAgIGlmICghbmVlZHNWYXJpYW50QmVoYXZpb3IpIHtcbiAgICAgIC8vIFJldHVybiBhIG5vLW9wIHZhcmlhbnQgZmVhdHVyZSBmb3IgaW5saW5lIHZhcmlhbnRcbiAgICAgIGNvbnN0IG5vb3BGZWF0dXJlOiBWYXJpYW50RmVhdHVyZSA9IHtcbiAgICAgICAgYmFja2Ryb3A6IG51bGwsXG4gICAgICAgIGNvbnRhaW5lcjogZWxlbWVudCxcbiAgICAgICAgb3BlbjogKCkgPT4ge30sXG4gICAgICAgIGNsb3NlOiAoKSA9PiB7fSxcbiAgICAgICAgdG9nZ2xlOiAoKSA9PiB7fSxcbiAgICAgICAgaXNPcGVuOiAoKSA9PiB0cnVlLFxuICAgICAgICBwb3NpdGlvbjogKCkgPT4ge30sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcGlja2VyQ29udGVudDogZWxlbWVudCxcbiAgICAgICAgdmFyaWFudDogbm9vcEZlYXR1cmUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBiYWNrZHJvcCAoZm9yIGRpYWxvZyBvciBjbGljay1vdXRzaWRlIGRldGVjdGlvbilcbiAgICBjb25zdCBiYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgYmFja2Ryb3AuY2xhc3NOYW1lID0gZ2V0Q2xhc3MoQ09MT1JQSUNLRVJfQ0xBU1NFUy5CQUNLRFJPUCk7XG4gICAgZWxlbWVudC5pbnNlcnRCZWZvcmUoYmFja2Ryb3AsIGVsZW1lbnQuZmlyc3RDaGlsZCk7XG5cbiAgICAvLyBDcmVhdGUgY29udGFpbmVyIGZvciBwaWNrZXIgY29udGVudFxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY29udGFpbmVyLmNsYXNzTmFtZSA9IGdldENsYXNzKENPTE9SUElDS0VSX0NMQVNTRVMuQ09OVEFJTkVSKTtcblxuICAgIC8vIEFkZCBjb250YWluZXIgdG8gZWxlbWVudFxuICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcblxuICAgIC8vIEFwcGVuZCB0byBib2R5IGZvciBwcm9wZXIgcG9zaXRpb25pbmdcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsZW1lbnQpO1xuXG4gICAgLyoqXG4gICAgICogUG9zaXRpb24gdGhlIGNvbnRhaW5lciByZWxhdGl2ZSB0byB0cmlnZ2VyIChkcm9wZG93bikgb3IgY2VudGVyIChkaWFsb2cpXG4gICAgICovXG4gICAgY29uc3QgcG9zaXRpb24gPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWNvbmZpZy50cmlnZ2VyKSByZXR1cm47XG5cbiAgICAgIGNvbnN0IHRyaWdnZXJSZWN0ID0gY29uZmlnLnRyaWdnZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCB2aWV3cG9ydFdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICAgIGNvbnN0IG1hcmdpbiA9IDQ7XG5cbiAgICAgIGlmICh2YXJpYW50VHlwZSA9PT0gQ09MT1JQSUNLRVJfVkFSSUFOVFMuRElBTE9HKSB7XG4gICAgICAgIC8vIENlbnRlciBvbiBzY3JlZW5cbiAgICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gXCJmaXhlZFwiO1xuICAgICAgICBjb25zdCBjb250YWluZXJSZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgICBjb250YWluZXIuc3R5bGUubGVmdCA9IGAkeyh2aWV3cG9ydFdpZHRoIC0gY29udGFpbmVyUmVjdC53aWR0aCkgLyAyfXB4YDtcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLnRvcCA9IGAkeyh2aWV3cG9ydEhlaWdodCAtIGNvbnRhaW5lclJlY3QuaGVpZ2h0KSAvIDJ9cHhgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRHJvcGRvd24gcG9zaXRpb25pbmdcbiAgICAgICAgY29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gXCJmaXhlZFwiO1xuICAgICAgICBjb250YWluZXIuc3R5bGUud2lkdGggPSBgJHt0cmlnZ2VyUmVjdC53aWR0aH1weGA7XG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5taW5XaWR0aCA9IGAke3RyaWdnZXJSZWN0LndpZHRofXB4YDtcblxuICAgICAgICAvLyBIb3Jpem9udGFsOiBhbGlnbiB3aXRoIHRyaWdnZXIgbGVmdCBlZGdlXG4gICAgICAgIGNvbnRhaW5lci5zdHlsZS5sZWZ0ID0gYCR7dHJpZ2dlclJlY3QubGVmdH1weGA7XG5cbiAgICAgICAgLy8gTWVhc3VyZSBjb250YWluZXIgaGVpZ2h0IGFmdGVyIHNldHRpbmcgd2lkdGhcbiAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICAvLyBWZXJ0aWNhbDogcHJlZmVyIGJlbG93IHRyaWdnZXIsIGJ1dCBmbGlwIGFib3ZlIGlmIG5vIHNwYWNlXG4gICAgICAgIGNvbnN0IHNwYWNlQmVsb3cgPSB2aWV3cG9ydEhlaWdodCAtIHRyaWdnZXJSZWN0LmJvdHRvbSAtIG1hcmdpbjtcbiAgICAgICAgY29uc3Qgc3BhY2VBYm92ZSA9IHRyaWdnZXJSZWN0LnRvcCAtIG1hcmdpbjtcblxuICAgICAgICAvLyBSZW1vdmUgcG9zaXRpb24gY2xhc3MgZmlyc3RcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGdldENsYXNzKFwiY29sb3JwaWNrZXItLXBvc2l0aW9uLXRvcFwiKSk7XG5cbiAgICAgICAgaWYgKHNwYWNlQmVsb3cgPCBjb250YWluZXJSZWN0LmhlaWdodCAmJiBzcGFjZUFib3ZlID4gc3BhY2VCZWxvdykge1xuICAgICAgICAgIC8vIFBvc2l0aW9uIGFib3ZlXG4gICAgICAgICAgY29uc3QgdG9wID0gdHJpZ2dlclJlY3QudG9wIC0gY29udGFpbmVyUmVjdC5oZWlnaHQgLSBtYXJnaW47XG4gICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG4gICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGdldENsYXNzKFwiY29sb3JwaWNrZXItLXBvc2l0aW9uLXRvcFwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUG9zaXRpb24gYmVsb3dcbiAgICAgICAgICBjb25zdCB0b3AgPSB0cmlnZ2VyUmVjdC5ib3R0b20gKyBtYXJnaW47XG4gICAgICAgICAgY29udGFpbmVyLnN0eWxlLnRvcCA9IGAke3RvcH1weGA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogT3BlbiB0aGUgcGlja2VyXG4gICAgICovXG4gICAgY29uc3Qgb3BlbiA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGlmIChzdGF0ZS5pc09wZW4gfHwgY29uZmlnLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICAgIHN0YXRlLmlzT3BlbiA9IHRydWU7XG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoQ09MT1JQSUNLRVJfQ0xBU1NFUy5PUEVOKSk7XG5cbiAgICAgIC8vIFBvc2l0aW9uIGFmdGVyIGFkZGluZyBvcGVuIGNsYXNzIChzbyB3ZSBjYW4gbWVhc3VyZSlcbiAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICAgIHBvc2l0aW9uKCk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQWRkIGRvY3VtZW50IGNsaWNrIGxpc3RlbmVyIGFmdGVyIGEgc2hvcnQgZGVsYXkgKGxpa2UgbWVudSBkb2VzKVxuICAgICAgLy8gdG8gYXZvaWQgY2xvc2luZyBpbW1lZGlhdGVseSBmcm9tIHRoZSBzYW1lIGNsaWNrIHRoYXQgb3BlbmVkIGl0XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHN0YXRlLmlzT3Blbikge1xuICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVEb2N1bWVudENsaWNrKTtcbiAgICAgICAgfVxuICAgICAgfSwgMCk7XG5cbiAgICAgIGVtaXQoQ09MT1JQSUNLRVJfRVZFTlRTLk9QRU4pO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDbG9zZSB0aGUgcGlja2VyXG4gICAgICovXG4gICAgY29uc3QgY2xvc2UgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoIXN0YXRlLmlzT3BlbikgcmV0dXJuO1xuXG4gICAgICBzdGF0ZS5pc09wZW4gPSBmYWxzZTtcbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShnZXRDbGFzcyhDT0xPUlBJQ0tFUl9DTEFTU0VTLk9QRU4pKTtcblxuICAgICAgLy8gUmVtb3ZlIGRvY3VtZW50IGNsaWNrIGxpc3RlbmVyXG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlRG9jdW1lbnRDbGljayk7XG5cbiAgICAgIGVtaXQoQ09MT1JQSUNLRVJfRVZFTlRTLkNMT1NFKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVG9nZ2xlIG9wZW4vY2xvc2VkXG4gICAgICovXG4gICAgY29uc3QgdG9nZ2xlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHN0YXRlLmlzT3Blbikge1xuICAgICAgICBjbG9zZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3BlbigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBvcGVuXG4gICAgICovXG4gICAgY29uc3QgaXNPcGVuID0gKCk6IGJvb2xlYW4gPT4gc3RhdGUuaXNPcGVuO1xuXG4gICAgLy8gPT09PT09PT09PT09PSBFdmVudCBIYW5kbGVycyA9PT09PT09PT09PT09XG5cbiAgICBjb25zdCBoYW5kbGVUcmlnZ2VyQ2xpY2sgPSAoZTogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRvZ2dsZSgpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVCYWNrZHJvcENsaWNrID0gKGU6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmIChlLnRhcmdldCA9PT0gYmFja2Ryb3ApIHtcbiAgICAgICAgY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlRG9jdW1lbnRDbGljayA9IChlOiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAvLyBEb24ndCBjbG9zZSBpZiB1c2VyIGlzIGN1cnJlbnRseSBkcmFnZ2luZyBhIGhhbmRsZSAoYXJlYSwgaHVlLCBvcGFjaXR5KVxuICAgICAgaWYgKHN0YXRlLmlzRHJhZ2dpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBjbG9zZSBpZiBkcmFnIGp1c3QgZW5kZWQgKHdpdGhpbiAxMDBtcykgLSB0aGlzIHByZXZlbnRzXG4gICAgICAvLyBjbG9zaW5nIHdoZW4gbW91c2V1cCBoYXBwZW5zIG91dHNpZGUgdGhlIHBpY2tlciBhZnRlciBkcmFnZ2luZ1xuICAgICAgaWYgKERhdGUubm93KCkgLSBsYXN0RHJhZ0VuZFRpbWUgPCAxMDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBjbG9zZSBpZiBtb3VzZWRvd24gc3RhcnRlZCBpbnNpZGUgcGlja2VyICh0ZXh0IHNlbGVjdGlvbiwgZXRjLilcbiAgICAgIGlmIChtb3VzZURvd25JbnNpZGVQaWNrZXIpIHtcbiAgICAgICAgbW91c2VEb3duSW5zaWRlUGlja2VyID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gRG9uJ3QgY2xvc2UgaWYgY2xpY2tlZCBpbnNpZGUgdGhlIHBpY2tlciBjb250YWluZXJcbiAgICAgIGlmIChjb250YWluZXIuY29udGFpbnMoZS50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBEb24ndCBjbG9zZSBpZiBjbGlja2VkIG9uIHRoZSB0cmlnZ2VyXG4gICAgICBpZiAoY29uZmlnLnRyaWdnZXIgJiYgY29uZmlnLnRyaWdnZXIuY29udGFpbnMoZS50YXJnZXQgYXMgTm9kZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBDbG9zZSB0aGUgcGlja2VyXG4gICAgICBjbG9zZSgpO1xuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVLZXlEb3duID0gKGU6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIiAmJiBzdGF0ZS5pc09wZW4pIHtcbiAgICAgICAgY2xvc2UoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlUmVzaXplID0gKCk6IHZvaWQgPT4ge1xuICAgICAgaWYgKHN0YXRlLmlzT3Blbikge1xuICAgICAgICBwb3NpdGlvbigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCBoYW5kbGVTY3JvbGwgPSAoKTogdm9pZCA9PiB7XG4gICAgICBpZiAoc3RhdGUuaXNPcGVuICYmIHZhcmlhbnRUeXBlID09PSBDT0xPUlBJQ0tFUl9WQVJJQU5UUy5EUk9QRE9XTikge1xuICAgICAgICBwb3NpdGlvbigpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyA9PT09PT09PT09PT09IFRyYWNrIGRyYWcgZW5kIGZvciBjbGljayBwcmV2ZW50aW9uID09PT09PT09PT09PT1cblxuICAgIGNvbnN0IGhhbmRsZURyYWdFbmQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAvLyBPbmx5IHJlY29yZCBkcmFnIGVuZCB0aW1lIGlmIHdlIHdlcmUgYWN0dWFsbHkgZHJhZ2dpbmdcbiAgICAgIGlmIChzdGF0ZS5pc0RyYWdnaW5nKSB7XG4gICAgICAgIGxhc3REcmFnRW5kVGltZSA9IERhdGUubm93KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIExpc3RlbiBmb3IgbW91c2V1cC9wb2ludGVydXAgb24gZG9jdW1lbnQgdG8gdHJhY2sgZHJhZyBlbmRcbiAgICAvLyBUaGVzZSBmaXJlIEJFRk9SRSB0aGUgaXNEcmFnZ2luZyBzdGF0ZSBpcyByZXNldCBieSB0aGUgZmVhdHVyZSBoYW5kbGVyc1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIGhhbmRsZURyYWdFbmQsIHRydWUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgaGFuZGxlRHJhZ0VuZCwgdHJ1ZSk7XG5cbiAgICAvLyA9PT09PT09PT09PT09IFRyYWNrIG1vdXNlZG93biBvcmlnaW4gZm9yIHRleHQgc2VsZWN0aW9uID09PT09PT09PT09PT1cblxuICAgIGNvbnN0IGhhbmRsZURvY3VtZW50TW91c2VEb3duID0gKGU6IE1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIC8vIFRyYWNrIGlmIG1vdXNlZG93biBzdGFydGVkIGluc2lkZSB0aGUgcGlja2VyIGNvbnRhaW5lclxuICAgICAgbW91c2VEb3duSW5zaWRlUGlja2VyID0gY29udGFpbmVyLmNvbnRhaW5zKGUudGFyZ2V0IGFzIE5vZGUpO1xuICAgIH07XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIGhhbmRsZURvY3VtZW50TW91c2VEb3duLCB0cnVlKTtcblxuICAgIC8vID09PT09PT09PT09PT0gQXR0YWNoIEV2ZW50IExpc3RlbmVycyA9PT09PT09PT09PT09XG5cbiAgICBpZiAoY29uZmlnLnRyaWdnZXIpIHtcbiAgICAgIGNvbmZpZy50cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVUcmlnZ2VyQ2xpY2spO1xuICAgIH1cblxuICAgIGJhY2tkcm9wLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBoYW5kbGVCYWNrZHJvcENsaWNrKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCBoYW5kbGVSZXNpemUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGhhbmRsZVNjcm9sbCwgdHJ1ZSk7XG5cbiAgICAvLyBDcmVhdGUgdmFyaWFudCBmZWF0dXJlIG9iamVjdFxuICAgIGNvbnN0IHZhcmlhbnRGZWF0dXJlOiBWYXJpYW50RmVhdHVyZSA9IHtcbiAgICAgIGJhY2tkcm9wLFxuICAgICAgY29udGFpbmVyLFxuICAgICAgb3BlbixcbiAgICAgIGNsb3NlLFxuICAgICAgdG9nZ2xlLFxuICAgICAgaXNPcGVuLFxuICAgICAgcG9zaXRpb24sXG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCBsaWZlY3ljbGUgZGVzdHJveSBpZiBpdCBleGlzdHNcbiAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSAoY29tcG9uZW50IGFzIGFueSkubGlmZWN5Y2xlPy5kZXN0cm95O1xuICAgIGlmIChvcmlnaW5hbERlc3Ryb3kpIHtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgaWYgKGNvbmZpZy50cmlnZ2VyKSB7XG4gICAgICAgICAgY29uZmlnLnRyaWdnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZVRyaWdnZXJDbGljayk7XG4gICAgICAgIH1cbiAgICAgICAgYmFja2Ryb3AucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGhhbmRsZUJhY2tkcm9wQ2xpY2spO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgaGFuZGxlRG9jdW1lbnRDbGljayk7XG4gICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleURvd24pO1xuICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLCBoYW5kbGVEcmFnRW5kLCB0cnVlKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBoYW5kbGVEcmFnRW5kLCB0cnVlKTtcbiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICBcIm1vdXNlZG93blwiLFxuICAgICAgICAgIGhhbmRsZURvY3VtZW50TW91c2VEb3duLFxuICAgICAgICAgIHRydWUsXG4gICAgICAgICk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIGhhbmRsZVJlc2l6ZSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGhhbmRsZVNjcm9sbCwgdHJ1ZSk7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50Tm9kZSA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBvcmlnaW5hbERlc3Ryb3koKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmNvbXBvbmVudCxcbiAgICAgIHN0YXRlLFxuICAgICAgcGlja2VyQ29udGVudDogY29udGFpbmVyLFxuICAgICAgdmFyaWFudDogdmFyaWFudEZlYXR1cmUsXG4gICAgfTtcbiAgfTtcbiIsCiAgICAiLy8gc3JjL2NvbXBvbmVudHMvY29sb3JwaWNrZXIvZmVhdHVyZXMvcGlwZXR0ZS50c1xuXG5pbXBvcnQgeyBjcmVhdGVJY29uQnV0dG9uIH0gZnJvbSBcIm10cmxcIjtcbmltcG9ydCB7IENPTE9SUElDS0VSX0VWRU5UUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbG9yUGlja2VyQ29uZmlnLCBDb2xvclBpY2tlclN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyByZ2JUb0hleCwgaGV4VG9Ic3YgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IGNyZWF0ZUluaXRpYWxTdGF0ZSB9IGZyb20gXCIuLi9jb25maWdcIjtcblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgbmF0aXZlIEV5ZURyb3BwZXIgQVBJIGlzIHN1cHBvcnRlZFxuICovXG5leHBvcnQgY29uc3QgaXNFeWVEcm9wcGVyU3VwcG9ydGVkID0gKCk6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gXCJFeWVEcm9wcGVyXCIgaW4gd2luZG93O1xufTtcblxuLyoqXG4gKiBQaXBldHRlIGZlYXR1cmUgaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZXR0ZUZlYXR1cmUge1xuICAvKiogVGhlIHBpcGV0dGUgYnV0dG9uIGVsZW1lbnQgKi9cbiAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gIC8qKiBTdGFydCBwaXBldHRlIHNhbXBsaW5nICovXG4gIHBpY2s6ICgpID0+IFByb21pc2U8c3RyaW5nIHwgbnVsbD47XG4gIC8qKiBTZXQgdGhlIGltYWdlIHNvdXJjZSBmb3IgY2FudmFzIGZhbGxiYWNrICovXG4gIHNldEltYWdlU291cmNlOiAoc291cmNlOiBIVE1MSW1hZ2VFbGVtZW50IHwgc3RyaW5nIHwgbnVsbCkgPT4gdm9pZDtcbiAgLyoqIENoZWNrIGlmIGN1cnJlbnRseSBzYW1wbGluZyAqL1xuICBpc1NhbXBsaW5nOiAoKSA9PiBib29sZWFuO1xuICAvKiogRGVzdHJveSBhbmQgY2xlYW51cCAqL1xuICBkZXN0cm95OiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBpcGV0dGUgY29uZmlndXJhdGlvbiBvcHRpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZXR0ZUNvbmZpZyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIHBpcGV0dGUgYnV0dG9uXG4gICAqIEBkZWZhdWx0IHRydWUgKHdoZW4gc3VwcG9ydGVkIG9yIGltYWdlU291cmNlIHByb3ZpZGVkKVxuICAgKi9cbiAgc2hvd1BpcGV0dGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbWFnZSBzb3VyY2UgZm9yIGNhbnZhcy1iYXNlZCBmYWxsYmFjayBzYW1wbGluZ1xuICAgKiBDYW4gYmUgYW4gSFRNTEltYWdlRWxlbWVudCwgVVJMIHN0cmluZywgb3IgbnVsbFxuICAgKi9cbiAgaW1hZ2VTb3VyY2U/OiBIVE1MSW1hZ2VFbGVtZW50IHwgc3RyaW5nIHwgbnVsbDtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiBwaXBldHRlIHNhbXBsaW5nIHN0YXJ0c1xuICAgKi9cbiAgb25QaXBldHRlU3RhcnQ/OiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB3aGVuIHBpcGV0dGUgc2FtcGxpbmcgZW5kc1xuICAgKi9cbiAgb25QaXBldHRlRW5kPzogKGNvbG9yOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkO1xufVxuXG4vLyBFeHRlbmQgQ29sb3JQaWNrZXJDb25maWcgdG8gaW5jbHVkZSBwaXBldHRlIG9wdGlvbnNcbmRlY2xhcmUgbW9kdWxlIFwiLi4vdHlwZXNcIiB7XG4gIGludGVyZmFjZSBDb2xvclBpY2tlckNvbmZpZyBleHRlbmRzIFBpcGV0dGVDb25maWcge31cbn1cblxuLyoqXG4gKiBQaXBldHRlIGljb24gU1ZHIHBhdGhcbiAqL1xuY29uc3QgUElQRVRURV9JQ09OID0gYDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwiY3VycmVudENvbG9yXCIgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCI+XG4gIDxwYXRoIGQ9XCJNMjAuNzEgNS42M2wtMi4zNC0yLjM0YTEgMSAwIDAgMC0xLjQxIDBsLTMuMTIgMy4xMi0xLjQxLTEuNDEtMS40MiAxLjQxIDEuNDIgMS40Mi04LjI5IDguMjlhMSAxIDAgMCAwLS4yOS43VjE5YTEgMSAwIDAgMCAxIDFoMi4xN2ExIDEgMCAwIDAgLjcxLS4yOWw4LjI5LTguMjkgMS40MSAxLjQxIDEuNDEtMS40MS0xLjQxLTEuNDEgMy4xMi0zLjEyYTEgMSAwIDAgMCAuMTYtMS4yNnpNNi40MSAxOUg1di0xLjQxbDguMjktOC4yOSAxLjQxIDEuNDF6XCIvPlxuPC9zdmc+YDtcblxuLyoqXG4gKiBDcmVhdGVzIGEgY2FudmFzLWJhc2VkIGNvbG9yIHNhbXBsZXIgZm9yIGFuIGltYWdlXG4gKi9cbmNsYXNzIENhbnZhc1NhbXBsZXIge1xuICBwcml2YXRlIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7XG4gIHByaXZhdGUgY3R4OiBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gIHByaXZhdGUgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBvdmVybGF5OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG1hZ25pZmllcjogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjcm9zc2hhaXI6IEhUTUxFbGVtZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29sb3JQcmV2aWV3OiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGlzQWN0aXZlID0gZmFsc2U7XG4gIHByaXZhdGUgcmVzb2x2ZVByb21pc2U6ICgoY29sb3I6IHN0cmluZyB8IG51bGwpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgYm91bmRNb3VzZU1vdmU6IChlOiBNb3VzZUV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIGJvdW5kTW91c2VEb3duOiAoZTogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBib3VuZEtleURvd246IChlOiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkO1xuICBwcml2YXRlIGJvdW5kVG91Y2hNb3ZlOiAoZTogVG91Y2hFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBib3VuZFRvdWNoRW5kOiAoZTogVG91Y2hFdmVudCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgdGhpcy5jdHggPSB0aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIiwgeyB3aWxsUmVhZEZyZXF1ZW50bHk6IHRydWUgfSkhO1xuXG4gICAgdGhpcy5ib3VuZE1vdXNlTW92ZSA9IHRoaXMuaGFuZGxlTW91c2VNb3ZlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5ib3VuZE1vdXNlRG93biA9IHRoaXMuaGFuZGxlTW91c2VEb3duLmJpbmQodGhpcyk7XG4gICAgdGhpcy5ib3VuZEtleURvd24gPSB0aGlzLmhhbmRsZUtleURvd24uYmluZCh0aGlzKTtcbiAgICB0aGlzLmJvdW5kVG91Y2hNb3ZlID0gdGhpcy5oYW5kbGVUb3VjaE1vdmUuYmluZCh0aGlzKTtcbiAgICB0aGlzLmJvdW5kVG91Y2hFbmQgPSB0aGlzLmhhbmRsZVRvdWNoRW5kLmJpbmQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBpbWFnZSB0byBzYW1wbGUgZnJvbVxuICAgKi9cbiAgc2V0SW1hZ2Uoc291cmNlOiBIVE1MSW1hZ2VFbGVtZW50IHwgc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBIVE1MSW1hZ2VFbGVtZW50KSB7XG4gICAgICAgIGlmIChzb3VyY2UuY29tcGxldGUgJiYgc291cmNlLm5hdHVyYWxXaWR0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmltYWdlID0gc291cmNlO1xuICAgICAgICAgIHRoaXMuZHJhd1RvQ2FudmFzKCk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvdXJjZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmltYWdlID0gc291cmNlO1xuICAgICAgICAgICAgdGhpcy5kcmF3VG9DYW52YXMoKTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHNvdXJjZS5vbmVycm9yID0gcmVqZWN0O1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgIGltZy5jcm9zc09yaWdpbiA9IFwiYW5vbnltb3VzXCI7XG4gICAgICAgIGltZy5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbWFnZSA9IGltZztcbiAgICAgICAgICB0aGlzLmRyYXdUb0NhbnZhcygpO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfTtcbiAgICAgICAgaW1nLm9uZXJyb3IgPSByZWplY3Q7XG4gICAgICAgIGltZy5zcmMgPSBzb3VyY2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKFwiSW52YWxpZCBpbWFnZSBzb3VyY2VcIikpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgdGhlIGltYWdlIHRvIHRoZSBpbnRlcm5hbCBjYW52YXNcbiAgICovXG4gIHByaXZhdGUgZHJhd1RvQ2FudmFzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pbWFnZSkgcmV0dXJuO1xuICAgIHRoaXMuY2FudmFzLndpZHRoID0gdGhpcy5pbWFnZS5uYXR1cmFsV2lkdGg7XG4gICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gdGhpcy5pbWFnZS5uYXR1cmFsSGVpZ2h0O1xuICAgIHRoaXMuY3R4LmRyYXdJbWFnZSh0aGlzLmltYWdlLCAwLCAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGNvbG9yIGF0IGEgc3BlY2lmaWMgcG9zaXRpb24gaW4gdGhlIGltYWdlXG4gICAqL1xuICBnZXRDb2xvckF0KHg6IG51bWJlciwgeTogbnVtYmVyKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmltYWdlKSByZXR1cm4gbnVsbDtcblxuICAgIC8vIENsYW1wIGNvb3JkaW5hdGVzIHRvIGltYWdlIGJvdW5kc1xuICAgIGNvbnN0IGNsYW1wZWRYID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oeCwgdGhpcy5jYW52YXMud2lkdGggLSAxKSk7XG4gICAgY29uc3QgY2xhbXBlZFkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih5LCB0aGlzLmNhbnZhcy5oZWlnaHQgLSAxKSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcGl4ZWwgPSB0aGlzLmN0eC5nZXRJbWFnZURhdGEoY2xhbXBlZFgsIGNsYW1wZWRZLCAxLCAxKS5kYXRhO1xuICAgICAgcmV0dXJuIHJnYlRvSGV4KHBpeGVsWzBdLCBwaXhlbFsxXSwgcGl4ZWxbMl0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBnZXQgcGl4ZWwgY29sb3IgKENPUlMgaXNzdWU/KTpcIiwgZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHRoZSBzYW1wbGluZyBvdmVybGF5IFVJXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZU92ZXJsYXkoKTogdm9pZCB7XG4gICAgLy8gQ3JlYXRlIGZ1bGxzY3JlZW4gb3ZlcmxheVxuICAgIHRoaXMub3ZlcmxheSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5vdmVybGF5LmNsYXNzTmFtZSA9IFwibXRybC1waXBldHRlLW92ZXJsYXlcIjtcbiAgICB0aGlzLm92ZXJsYXkuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHRvcDogMDtcbiAgICAgIGxlZnQ6IDA7XG4gICAgICB3aWR0aDogMTAwdnc7XG4gICAgICBoZWlnaHQ6IDEwMHZoO1xuICAgICAgei1pbmRleDogMTAwMDA7XG4gICAgICBjdXJzb3I6IGNyb3NzaGFpcjtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYDtcblxuICAgIC8vIENyZWF0ZSBpbWFnZSBjb250YWluZXJcbiAgICBjb25zdCBpbWFnZUNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgaW1hZ2VDb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIG1heC13aWR0aDogOTB2dztcbiAgICAgIG1heC1oZWlnaHQ6IDkwdmg7XG4gICAgICBib3gtc2hhZG93OiAwIDhweCAzMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYDtcblxuICAgIC8vIENsb25lIGFuZCBkaXNwbGF5IHRoZSBpbWFnZVxuICAgIGNvbnN0IGRpc3BsYXlJbWFnZSA9IHRoaXMuaW1hZ2UhLmNsb25lTm9kZSh0cnVlKSBhcyBIVE1MSW1hZ2VFbGVtZW50O1xuICAgIGRpc3BsYXlJbWFnZS5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBtYXgtd2lkdGg6IDkwdnc7XG4gICAgICBtYXgtaGVpZ2h0OiA5MHZoO1xuICAgICAgb2JqZWN0LWZpdDogY29udGFpbjtcbiAgICBgO1xuICAgIGRpc3BsYXlJbWFnZS5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgICBpbWFnZUNvbnRhaW5lci5hcHBlbmRDaGlsZChkaXNwbGF5SW1hZ2UpO1xuXG4gICAgLy8gQ3JlYXRlIGNyb3NzaGFpclxuICAgIHRoaXMuY3Jvc3NoYWlyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLmNyb3NzaGFpci5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICBib3JkZXI6IDJweCBzb2xpZCB3aGl0ZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMyksIGluc2V0IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIDAuMyk7XG4gICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICBgO1xuICAgIGltYWdlQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuY3Jvc3NoYWlyKTtcblxuICAgIC8vIENyZWF0ZSBtYWduaWZpZXIgKG9wdGlvbmFsIHpvb20gcHJldmlldylcbiAgICB0aGlzLm1hZ25pZmllciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgdGhpcy5tYWduaWZpZXIuc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHdpZHRoOiA4MHB4O1xuICAgICAgaGVpZ2h0OiA4MHB4O1xuICAgICAgYm9yZGVyOiAzcHggc29saWQgd2hpdGU7XG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwgMCwgMCwgMC4zKTtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IDQwMCU7XG4gICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7XG4gICAgYDtcbiAgICBpbWFnZUNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm1hZ25pZmllcik7XG5cbiAgICAvLyBDcmVhdGUgY29sb3IgcHJldmlld1xuICAgIHRoaXMuY29sb3JQcmV2aWV3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICB0aGlzLmNvbG9yUHJldmlldy5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgcG9zaXRpb246IGZpeGVkO1xuICAgICAgYm90dG9tOiAyMHB4O1xuICAgICAgbGVmdDogNTAlO1xuICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBnYXA6IDEycHg7XG4gICAgICBwYWRkaW5nOiAxMnB4IDIwcHg7XG4gICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDI0cHg7XG4gICAgICBib3gtc2hhZG93OiAwIDRweCAyMHB4IHJnYmEoMCwgMCwgMCwgMC4yKTtcbiAgICAgIGZvbnQtZmFtaWx5OiBzeXN0ZW0tdWksIHNhbnMtc2VyaWY7XG4gICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgYDtcblxuICAgIGNvbnN0IGNvbG9yU3dhdGNoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBjb2xvclN3YXRjaC5jbGFzc05hbWUgPSBcInBpcGV0dGUtc3dhdGNoXCI7XG4gICAgY29sb3JTd2F0Y2guc3R5bGUuY3NzVGV4dCA9IGBcbiAgICAgIHdpZHRoOiAzMnB4O1xuICAgICAgaGVpZ2h0OiAzMnB4O1xuICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgYm9yZGVyOiAycHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEpO1xuICAgIGA7XG5cbiAgICBjb25zdCBjb2xvclRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBjb2xvclRleHQuY2xhc3NOYW1lID0gXCJwaXBldHRlLXRleHRcIjtcbiAgICBjb2xvclRleHQudGV4dENvbnRlbnQgPSBcIkNsaWNrIHRvIHNlbGVjdCBjb2xvclwiO1xuICAgIGNvbG9yVGV4dC5zdHlsZS5jc3NUZXh0ID0gYFxuICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTtcbiAgICAgIG1pbi13aWR0aDogNzBweDtcbiAgICBgO1xuXG4gICAgY29uc3QgaGVscFRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgICBoZWxwVGV4dC50ZXh0Q29udGVudCA9IFwiRVNDIHRvIGNhbmNlbFwiO1xuICAgIGhlbHBUZXh0LnN0eWxlLmNzc1RleHQgPSBgXG4gICAgICBjb2xvcjogIzY2NjtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBgO1xuXG4gICAgdGhpcy5jb2xvclByZXZpZXcuYXBwZW5kQ2hpbGQoY29sb3JTd2F0Y2gpO1xuICAgIHRoaXMuY29sb3JQcmV2aWV3LmFwcGVuZENoaWxkKGNvbG9yVGV4dCk7XG4gICAgdGhpcy5jb2xvclByZXZpZXcuYXBwZW5kQ2hpbGQoaGVscFRleHQpO1xuXG4gICAgdGhpcy5vdmVybGF5LmFwcGVuZENoaWxkKGltYWdlQ29udGFpbmVyKTtcbiAgICB0aGlzLm92ZXJsYXkuYXBwZW5kQ2hpbGQodGhpcy5jb2xvclByZXZpZXcpO1xuXG4gICAgLy8gU3RvcmUgcmVmZXJlbmNlIHRvIGltYWdlIGNvbnRhaW5lciBmb3IgY29vcmRpbmF0ZSBjYWxjdWxhdGlvbnNcbiAgICAodGhpcy5vdmVybGF5IGFzIGFueSkuX2ltYWdlQ29udGFpbmVyID0gaW1hZ2VDb250YWluZXI7XG4gICAgKHRoaXMub3ZlcmxheSBhcyBhbnkpLl9kaXNwbGF5SW1hZ2UgPSBkaXNwbGF5SW1hZ2U7XG5cbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMub3ZlcmxheSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHRoZSBzYW1wbGluZyBvdmVybGF5XG4gICAqL1xuICBwcml2YXRlIHJlbW92ZU92ZXJsYXkoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMub3ZlcmxheSkge1xuICAgICAgdGhpcy5vdmVybGF5LnJlbW92ZSgpO1xuICAgICAgdGhpcy5vdmVybGF5ID0gbnVsbDtcbiAgICAgIHRoaXMubWFnbmlmaWVyID0gbnVsbDtcbiAgICAgIHRoaXMuY3Jvc3NoYWlyID0gbnVsbDtcbiAgICAgIHRoaXMuY29sb3JQcmV2aWV3ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogR2V0IGltYWdlIGNvb3JkaW5hdGVzIGZyb20gbW91c2UgZXZlbnRcbiAgICovXG4gIHByaXZhdGUgZ2V0SW1hZ2VDb29yZGluYXRlcyhcbiAgICBjbGllbnRYOiBudW1iZXIsXG4gICAgY2xpZW50WTogbnVtYmVyLFxuICApOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyBpbWFnZVg6IG51bWJlcjsgaW1hZ2VZOiBudW1iZXIgfSB8IG51bGwge1xuICAgIGlmICghdGhpcy5vdmVybGF5IHx8ICF0aGlzLmltYWdlKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IGRpc3BsYXlJbWFnZSA9ICh0aGlzLm92ZXJsYXkgYXMgYW55KVxuICAgICAgLl9kaXNwbGF5SW1hZ2UgYXMgSFRNTEltYWdlRWxlbWVudDtcbiAgICBjb25zdCByZWN0ID0gZGlzcGxheUltYWdlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgLy8gQ2hlY2sgaWYgbW91c2UgaXMgb3ZlciB0aGUgaW1hZ2VcbiAgICBpZiAoXG4gICAgICBjbGllbnRYIDwgcmVjdC5sZWZ0IHx8XG4gICAgICBjbGllbnRYID4gcmVjdC5yaWdodCB8fFxuICAgICAgY2xpZW50WSA8IHJlY3QudG9wIHx8XG4gICAgICBjbGllbnRZID4gcmVjdC5ib3R0b21cbiAgICApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbiByZWxhdGl2ZSB0byBpbWFnZVxuICAgIGNvbnN0IHggPSBjbGllbnRYIC0gcmVjdC5sZWZ0O1xuICAgIGNvbnN0IHkgPSBjbGllbnRZIC0gcmVjdC50b3A7XG5cbiAgICAvLyBTY2FsZSB0byBhY3R1YWwgaW1hZ2UgZGltZW5zaW9uc1xuICAgIGNvbnN0IHNjYWxlWCA9IHRoaXMuaW1hZ2UubmF0dXJhbFdpZHRoIC8gcmVjdC53aWR0aDtcbiAgICBjb25zdCBzY2FsZVkgPSB0aGlzLmltYWdlLm5hdHVyYWxIZWlnaHQgLyByZWN0LmhlaWdodDtcbiAgICBjb25zdCBpbWFnZVggPSBNYXRoLmZsb29yKHggKiBzY2FsZVgpO1xuICAgIGNvbnN0IGltYWdlWSA9IE1hdGguZmxvb3IoeSAqIHNjYWxlWSk7XG5cbiAgICByZXR1cm4geyB4LCB5LCBpbWFnZVgsIGltYWdlWSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgVUkgZHVyaW5nIHNhbXBsaW5nXG4gICAqL1xuICBwcml2YXRlIHVwZGF0ZVNhbXBsaW5nVUkoY2xpZW50WDogbnVtYmVyLCBjbGllbnRZOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBjb29yZHMgPSB0aGlzLmdldEltYWdlQ29vcmRpbmF0ZXMoY2xpZW50WCwgY2xpZW50WSk7XG5cbiAgICBpZiAoIWNvb3Jkcykge1xuICAgICAgaWYgKHRoaXMuY3Jvc3NoYWlyKSB0aGlzLmNyb3NzaGFpci5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICBpZiAodGhpcy5tYWduaWZpZXIpIHRoaXMubWFnbmlmaWVyLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb2xvciA9IHRoaXMuZ2V0Q29sb3JBdChjb29yZHMuaW1hZ2VYLCBjb29yZHMuaW1hZ2VZKTtcblxuICAgIC8vIFVwZGF0ZSBjcm9zc2hhaXIgcG9zaXRpb25cbiAgICBpZiAodGhpcy5jcm9zc2hhaXIpIHtcbiAgICAgIHRoaXMuY3Jvc3NoYWlyLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICB0aGlzLmNyb3NzaGFpci5zdHlsZS5sZWZ0ID0gYCR7Y29vcmRzLnh9cHhgO1xuICAgICAgdGhpcy5jcm9zc2hhaXIuc3R5bGUudG9wID0gYCR7Y29vcmRzLnl9cHhgO1xuICAgICAgaWYgKGNvbG9yKSB7XG4gICAgICAgIHRoaXMuY3Jvc3NoYWlyLnN0eWxlLmJvcmRlckNvbG9yID0gdGhpcy5pc0xpZ2h0Q29sb3IoY29sb3IpXG4gICAgICAgICAgPyBcIiMzMzNcIlxuICAgICAgICAgIDogXCIjZmZmXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIG1hZ25pZmllclxuICAgIGlmICh0aGlzLm1hZ25pZmllciAmJiB0aGlzLmltYWdlKSB7XG4gICAgICB0aGlzLm1hZ25pZmllci5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgLy8gUG9zaXRpb24gbWFnbmlmaWVyIG9mZnNldCBmcm9tIGN1cnNvclxuICAgICAgY29uc3Qgb2Zmc2V0WCA9XG4gICAgICAgIGNvb3Jkcy54ICsgMTAwID4gKHRoaXMub3ZlcmxheSBhcyBhbnkpLl9kaXNwbGF5SW1hZ2Uud2lkdGggPyAtMTAwIDogNTA7XG4gICAgICBjb25zdCBvZmZzZXRZID1cbiAgICAgICAgY29vcmRzLnkgKyAxMDAgPiAodGhpcy5vdmVybGF5IGFzIGFueSkuX2Rpc3BsYXlJbWFnZS5oZWlnaHQgPyAtMTAwIDogNTA7XG4gICAgICB0aGlzLm1hZ25pZmllci5zdHlsZS5sZWZ0ID0gYCR7Y29vcmRzLnggKyBvZmZzZXRYfXB4YDtcbiAgICAgIHRoaXMubWFnbmlmaWVyLnN0eWxlLnRvcCA9IGAke2Nvb3Jkcy55ICsgb2Zmc2V0WX1weGA7XG5cbiAgICAgIC8vIFNldCBtYWduaWZpZWQgYmFja2dyb3VuZFxuICAgICAgY29uc3QgYmdYID0gKGNvb3Jkcy5pbWFnZVggLyB0aGlzLmltYWdlLm5hdHVyYWxXaWR0aCkgKiAxMDA7XG4gICAgICBjb25zdCBiZ1kgPSAoY29vcmRzLmltYWdlWSAvIHRoaXMuaW1hZ2UubmF0dXJhbEhlaWdodCkgKiAxMDA7XG4gICAgICB0aGlzLm1hZ25pZmllci5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSBgdXJsKCR7dGhpcy5pbWFnZS5zcmN9KWA7XG4gICAgICB0aGlzLm1hZ25pZmllci5zdHlsZS5iYWNrZ3JvdW5kUG9zaXRpb24gPSBgJHtiZ1h9JSAke2JnWX0lYDtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgY29sb3IgcHJldmlld1xuICAgIGlmICh0aGlzLmNvbG9yUHJldmlldyAmJiBjb2xvcikge1xuICAgICAgY29uc3Qgc3dhdGNoID0gdGhpcy5jb2xvclByZXZpZXcucXVlcnlTZWxlY3RvcihcbiAgICAgICAgXCIucGlwZXR0ZS1zd2F0Y2hcIixcbiAgICAgICkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy5jb2xvclByZXZpZXcucXVlcnlTZWxlY3RvcihcbiAgICAgICAgXCIucGlwZXR0ZS10ZXh0XCIsXG4gICAgICApIGFzIEhUTUxFbGVtZW50O1xuICAgICAgaWYgKHN3YXRjaCkgc3dhdGNoLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbG9yO1xuICAgICAgaWYgKHRleHQpIHRleHQudGV4dENvbnRlbnQgPSBjb2xvci50b1VwcGVyQ2FzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBhIGNvbG9yIGlzIGxpZ2h0IChmb3IgY29udHJhc3QpXG4gICAqL1xuICBwcml2YXRlIGlzTGlnaHRDb2xvcihoZXg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHIgPSBwYXJzZUludChoZXguc2xpY2UoMSwgMyksIDE2KTtcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoaGV4LnNsaWNlKDMsIDUpLCAxNik7XG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGhleC5zbGljZSg1LCA3KSwgMTYpO1xuICAgIGNvbnN0IGx1bWluYW5jZSA9ICgwLjI5OSAqIHIgKyAwLjU4NyAqIGcgKyAwLjExNCAqIGIpIC8gMjU1O1xuICAgIHJldHVybiBsdW1pbmFuY2UgPiAwLjU7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIG1vdXNlIG1vdmUgZHVyaW5nIHNhbXBsaW5nXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZU1vdXNlTW92ZShlOiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlKSByZXR1cm47XG4gICAgdGhpcy51cGRhdGVTYW1wbGluZ1VJKGUuY2xpZW50WCwgZS5jbGllbnRZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgbW91c2UgZG93biB0byBzZWxlY3QgY29sb3JcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlTW91c2VEb3duKGU6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNBY3RpdmUpIHJldHVybjtcblxuICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuZ2V0SW1hZ2VDb29yZGluYXRlcyhlLmNsaWVudFgsIGUuY2xpZW50WSk7XG4gICAgaWYgKGNvb3Jkcykge1xuICAgICAgY29uc3QgY29sb3IgPSB0aGlzLmdldENvbG9yQXQoY29vcmRzLmltYWdlWCwgY29vcmRzLmltYWdlWSk7XG4gICAgICB0aGlzLmVuZFNhbXBsaW5nKGNvbG9yKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHRvdWNoIG1vdmUgZHVyaW5nIHNhbXBsaW5nXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVRvdWNoTW92ZShlOiBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlIHx8ICFlLnRvdWNoZXMubGVuZ3RoKSByZXR1cm47XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHRvdWNoID0gZS50b3VjaGVzWzBdO1xuICAgIHRoaXMudXBkYXRlU2FtcGxpbmdVSSh0b3VjaC5jbGllbnRYLCB0b3VjaC5jbGllbnRZKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgdG91Y2ggZW5kIHRvIHNlbGVjdCBjb2xvclxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVUb3VjaEVuZChlOiBUb3VjaEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzQWN0aXZlKSByZXR1cm47XG5cbiAgICBjb25zdCB0b3VjaCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07XG4gICAgY29uc3QgY29vcmRzID0gdGhpcy5nZXRJbWFnZUNvb3JkaW5hdGVzKHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpO1xuICAgIGlmIChjb29yZHMpIHtcbiAgICAgIGNvbnN0IGNvbG9yID0gdGhpcy5nZXRDb2xvckF0KGNvb3Jkcy5pbWFnZVgsIGNvb3Jkcy5pbWFnZVkpO1xuICAgICAgdGhpcy5lbmRTYW1wbGluZyhjb2xvcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBrZXlib2FyZCBldmVudHNcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlS2V5RG93bihlOiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICB0aGlzLmVuZFNhbXBsaW5nKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBzYW1wbGluZyBtb2RlXG4gICAqL1xuICBzdGFydFNhbXBsaW5nKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgaWYgKCF0aGlzLmltYWdlKSB7XG4gICAgICAgIHJlc29sdmUobnVsbCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG4gICAgICB0aGlzLnJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcblxuICAgICAgdGhpcy5jcmVhdGVPdmVybGF5KCk7XG5cbiAgICAgIC8vIEFkZCBldmVudCBsaXN0ZW5lcnNcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIiwgdGhpcy5ib3VuZE1vdXNlTW92ZSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vkb3duXCIsIHRoaXMuYm91bmRNb3VzZURvd24pO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5ib3VuZEtleURvd24pO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCB0aGlzLmJvdW5kVG91Y2hNb3ZlLCB7XG4gICAgICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgICAgfSk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIiwgdGhpcy5ib3VuZFRvdWNoRW5kKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmQgc2FtcGxpbmcgbW9kZVxuICAgKi9cbiAgcHJpdmF0ZSBlbmRTYW1wbGluZyhjb2xvcjogc3RyaW5nIHwgbnVsbCk6IHZvaWQge1xuICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTtcblxuICAgIC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsIHRoaXMuYm91bmRNb3VzZU1vdmUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZWRvd25cIiwgdGhpcy5ib3VuZE1vdXNlRG93bik7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgdGhpcy5ib3VuZEtleURvd24pO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgdGhpcy5ib3VuZFRvdWNoTW92ZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsIHRoaXMuYm91bmRUb3VjaEVuZCk7XG5cbiAgICB0aGlzLnJlbW92ZU92ZXJsYXkoKTtcblxuICAgIGlmICh0aGlzLnJlc29sdmVQcm9taXNlKSB7XG4gICAgICB0aGlzLnJlc29sdmVQcm9taXNlKGNvbG9yKTtcbiAgICAgIHRoaXMucmVzb2x2ZVByb21pc2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBpZiBjdXJyZW50bHkgc2FtcGxpbmdcbiAgICovXG4gIGlzU2FtcGxpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNBY3RpdmU7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYW51cFxuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmVuZFNhbXBsaW5nKG51bGwpO1xuICAgIHRoaXMuaW1hZ2UgPSBudWxsO1xuICB9XG59XG5cbi8qKlxuICogVXNlIHRoZSBuYXRpdmUgRXllRHJvcHBlciBBUElcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXNlTmF0aXZlRXllRHJvcHBlcigpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+IHtcbiAgaWYgKCFpc0V5ZURyb3BwZXJTdXBwb3J0ZWQoKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBAdHMtaWdub3JlIC0gRXllRHJvcHBlciBBUElcbiAgICBjb25zdCBleWVEcm9wcGVyID0gbmV3IHdpbmRvdy5FeWVEcm9wcGVyKCk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXllRHJvcHBlci5vcGVuKCk7XG4gICAgcmV0dXJuIHJlc3VsdC5zUkdCSGV4O1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gVXNlciBjYW5jZWxsZWQgb3IgZXJyb3Igb2NjdXJyZWRcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIEFkZHMgcGlwZXR0ZS9jb2xvciBwaWNrZXIgZnVuY3Rpb25hbGl0eSB0byBhIGNvbG9yIHBpY2tlciBjb21wb25lbnRcbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29sb3IgcGlja2VyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIENvbXBvbmVudCBlbmhhbmNlciBmdW5jdGlvblxuICovXG5leHBvcnQgY29uc3Qgd2l0aFBpcGV0dGUgPVxuICAoY29uZmlnOiBDb2xvclBpY2tlckNvbmZpZykgPT5cbiAgPFxuICAgIFQgZXh0ZW5kcyB7XG4gICAgICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICAgIGdldENsYXNzOiAobmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XG4gICAgICBlbWl0OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBzdGF0ZT86IENvbG9yUGlja2VyU3RhdGU7XG4gICAgICBwaWNrZXJDb250ZW50PzogSFRNTEVsZW1lbnQ7XG4gICAgICBpbnB1dD86IHtcbiAgICAgICAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gICAgICB9O1xuICAgIH0sXG4gID4oXG4gICAgY29tcG9uZW50OiBULFxuICApOiBUICYgeyBwaXBldHRlOiBQaXBldHRlRmVhdHVyZTsgc3RhdGU6IENvbG9yUGlja2VyU3RhdGUgfSA9PiB7XG4gICAgY29uc3QgeyBlbGVtZW50LCBnZXRDbGFzcywgZW1pdCB9ID0gY29tcG9uZW50O1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSBpZiBub3QgcHJlc2VudFxuICAgIGNvbnN0IHN0YXRlOiBDb2xvclBpY2tlclN0YXRlID1cbiAgICAgIGNvbXBvbmVudC5zdGF0ZSB8fCBjcmVhdGVJbml0aWFsU3RhdGUoY29uZmlnKTtcblxuICAgIC8vIFVzZSBwaWNrZXJDb250ZW50IGlmIGF2YWlsYWJsZSAoZm9yIGRyb3Bkb3duL2RpYWxvZyksIG90aGVyd2lzZSB1c2UgZWxlbWVudFxuICAgIGNvbnN0IGNvbnRhaW5lciA9IGNvbXBvbmVudC5waWNrZXJDb250ZW50IHx8IGVsZW1lbnQ7XG5cbiAgICAvLyBEZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHNob3cgdGhlIHBpcGV0dGVcbiAgICBjb25zdCBoYXNJbWFnZVNvdXJjZSA9ICEhY29uZmlnLmltYWdlU291cmNlO1xuICAgIGNvbnN0IGhhc05hdGl2ZVN1cHBvcnQgPSBpc0V5ZURyb3BwZXJTdXBwb3J0ZWQoKTtcbiAgICBjb25zdCBzaG93UGlwZXR0ZSA9XG4gICAgICBjb25maWcuc2hvd1BpcGV0dGUgPz8gKGhhc05hdGl2ZVN1cHBvcnQgfHwgaGFzSW1hZ2VTb3VyY2UpO1xuXG4gICAgaWYgKCFzaG93UGlwZXR0ZSkge1xuICAgICAgLy8gQ3JlYXRlIGEgbm8tb3AgZmVhdHVyZVxuICAgICAgY29uc3QgZW1wdHlGZWF0dXJlOiBQaXBldHRlRmVhdHVyZSA9IHtcbiAgICAgICAgZWxlbWVudDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxcbiAgICAgICAgcGljazogYXN5bmMgKCkgPT4gbnVsbCxcbiAgICAgICAgc2V0SW1hZ2VTb3VyY2U6ICgpID0+IHt9LFxuICAgICAgICBpc1NhbXBsaW5nOiAoKSA9PiBmYWxzZSxcbiAgICAgICAgZGVzdHJveTogKCkgPT4ge30sXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgICBzdGF0ZSxcbiAgICAgICAgcGlwZXR0ZTogZW1wdHlGZWF0dXJlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY2FudmFzIHNhbXBsZXIgZm9yIGZhbGxiYWNrXG4gICAgY29uc3QgY2FudmFzU2FtcGxlciA9IG5ldyBDYW52YXNTYW1wbGVyKCk7XG4gICAgbGV0IGN1cnJlbnRJbWFnZVNvdXJjZTogSFRNTEltYWdlRWxlbWVudCB8IHN0cmluZyB8IG51bGwgPVxuICAgICAgY29uZmlnLmltYWdlU291cmNlIHx8IG51bGw7XG4gICAgbGV0IGlzU2FtcGxpbmcgPSBmYWxzZTtcblxuICAgIC8vIEluaXRpYWxpemUgaW1hZ2Ugc291cmNlIGlmIHByb3ZpZGVkXG4gICAgaWYgKGN1cnJlbnRJbWFnZVNvdXJjZSkge1xuICAgICAgY2FudmFzU2FtcGxlci5zZXRJbWFnZShjdXJyZW50SW1hZ2VTb3VyY2UpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIkZhaWxlZCB0byBsb2FkIHBpcGV0dGUgaW1hZ2Ugc291cmNlOlwiLCBlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBwaXBldHRlIGJ1dHRvbiAodG8gYmUgaW5zZXJ0ZWQgaW5zaWRlIHRoZSB2YWx1ZSByb3cgYWZ0ZXIgdGV4dGZpZWxkKVxuICAgIGNvbnN0IGJ1dHRvbiA9IGNyZWF0ZUljb25CdXR0b24oe1xuICAgICAgaWNvbjogUElQRVRURV9JQ09OLFxuICAgICAgYXJpYUxhYmVsOiBcIlBpY2sgY29sb3IgZnJvbSBpbWFnZVwiLFxuICAgICAgdmFyaWFudDogXCJzdGFuZGFyZFwiLFxuICAgICAgY2xhc3M6IGdldENsYXNzKFwiY29sb3JwaWNrZXJfX3BpcGV0dGUtYnRuXCIpLFxuICAgIH0pO1xuXG4gICAgLy8gSW5zZXJ0IGluc2lkZSB0aGUgdmFsdWUgcm93IChhZnRlciB0ZXh0ZmllbGQpIG9yIGF0IHRoZSBlbmQgb2YgY29udGFpbmVyXG4gICAgaWYgKGNvbXBvbmVudC5pbnB1dD8uZWxlbWVudCkge1xuICAgICAgY29tcG9uZW50LmlucHV0LmVsZW1lbnQuYXBwZW5kQ2hpbGQoYnV0dG9uLmVsZW1lbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoYnV0dG9uLmVsZW1lbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhbGwgVUkgZmVhdHVyZXNcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVBbGxVSSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5hcmVhPy51cGRhdGVCYWNrZ3JvdW5kPy4oKTtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5hcmVhPy51cGRhdGVIYW5kbGU/LigpO1xuICAgICAgKGNvbXBvbmVudCBhcyBhbnkpLmh1ZT8udXBkYXRlSGFuZGxlPy4oKTtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5pbnB1dD8udXBkYXRlPy4oKTtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5zd2F0Y2hlcz8udXBkYXRlPy4oKTtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogSGFuZGxlIHBpY2tlZCBjb2xvclxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVBpY2tlZENvbG9yID0gKGNvbG9yOiBzdHJpbmcgfCBudWxsKTogdm9pZCA9PiB7XG4gICAgICBpc1NhbXBsaW5nID0gZmFsc2U7XG4gICAgICBjb25maWcub25QaXBldHRlRW5kPy4oY29sb3IpO1xuXG4gICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgY29uc3QgaHN2ID0gaGV4VG9Ic3YoY29sb3IpO1xuICAgICAgICBpZiAoaHN2KSB7XG4gICAgICAgICAgc3RhdGUuaHN2ID0gaHN2O1xuICAgICAgICAgIHN0YXRlLmhleCA9IGNvbG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgdXBkYXRlQWxsVUkoKTtcblxuICAgICAgICAgIGVtaXQoQ09MT1JQSUNLRVJfRVZFTlRTLklOUFVULCBzdGF0ZS5oZXgpO1xuICAgICAgICAgIGVtaXQoQ09MT1JQSUNLRVJfRVZFTlRTLkNIQU5HRSwgc3RhdGUuaGV4KTtcbiAgICAgICAgICBjb25maWcub25JbnB1dD8uKHN0YXRlLmhleCk7XG4gICAgICAgICAgY29uZmlnLm9uQ2hhbmdlPy4oc3RhdGUuaGV4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTdGFydCBwaXBldHRlIHBpY2tpbmdcbiAgICAgKi9cbiAgICBjb25zdCBwaWNrID0gYXN5bmMgKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4gPT4ge1xuICAgICAgaWYgKGlzU2FtcGxpbmcpIHJldHVybiBudWxsO1xuXG4gICAgICBpc1NhbXBsaW5nID0gdHJ1ZTtcbiAgICAgIGNvbmZpZy5vblBpcGV0dGVTdGFydD8uKCk7XG5cbiAgICAgIGxldCBjb2xvcjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICAgIC8vIFRyeSBuYXRpdmUgQVBJIGZpcnN0IGlmIHN1cHBvcnRlZCBhbmQgbm8gc3BlY2lmaWMgaW1hZ2Ugc291cmNlXG4gICAgICBpZiAoaGFzTmF0aXZlU3VwcG9ydCAmJiAhY3VycmVudEltYWdlU291cmNlKSB7XG4gICAgICAgIGNvbG9yID0gYXdhaXQgdXNlTmF0aXZlRXllRHJvcHBlcigpO1xuICAgICAgfSBlbHNlIGlmIChjdXJyZW50SW1hZ2VTb3VyY2UpIHtcbiAgICAgICAgLy8gVXNlIGNhbnZhcyBzYW1wbGVyIGZvciBzcGVjaWZpYyBpbWFnZVxuICAgICAgICBjb2xvciA9IGF3YWl0IGNhbnZhc1NhbXBsZXIuc3RhcnRTYW1wbGluZygpO1xuICAgICAgfSBlbHNlIGlmIChoYXNOYXRpdmVTdXBwb3J0KSB7XG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIG5hdGl2ZSBpZiBhdmFpbGFibGVcbiAgICAgICAgY29sb3IgPSBhd2FpdCB1c2VOYXRpdmVFeWVEcm9wcGVyKCk7XG4gICAgICB9XG5cbiAgICAgIGhhbmRsZVBpY2tlZENvbG9yKGNvbG9yKTtcbiAgICAgIHJldHVybiBjb2xvcjtcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogU2V0IHRoZSBpbWFnZSBzb3VyY2UgZm9yIGNhbnZhcyBzYW1wbGluZ1xuICAgICAqL1xuICAgIGNvbnN0IHNldEltYWdlU291cmNlID0gKHNvdXJjZTogSFRNTEltYWdlRWxlbWVudCB8IHN0cmluZyB8IG51bGwpOiB2b2lkID0+IHtcbiAgICAgIGN1cnJlbnRJbWFnZVNvdXJjZSA9IHNvdXJjZTtcbiAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgY2FudmFzU2FtcGxlci5zZXRJbWFnZShzb3VyY2UpLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFwiRmFpbGVkIHRvIGxvYWQgcGlwZXR0ZSBpbWFnZSBzb3VyY2U6XCIsIGUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLy8gQnV0dG9uIGNsaWNrIGhhbmRsZXJcbiAgICBidXR0b24ub24oXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICBwaWNrKCk7XG4gICAgfSk7XG5cbiAgICAvLyBDcmVhdGUgcGlwZXR0ZSBmZWF0dXJlIG9iamVjdFxuICAgIGNvbnN0IHBpcGV0dGVGZWF0dXJlOiBQaXBldHRlRmVhdHVyZSA9IHtcbiAgICAgIGVsZW1lbnQ6IGJ1dHRvbi5lbGVtZW50LFxuICAgICAgcGljayxcbiAgICAgIHNldEltYWdlU291cmNlLFxuICAgICAgaXNTYW1wbGluZzogKCkgPT4gaXNTYW1wbGluZyB8fCBjYW52YXNTYW1wbGVyLmlzU2FtcGxpbmcoKSxcbiAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgY2FudmFzU2FtcGxlci5kZXN0cm95KCk7XG4gICAgICAgIGJ1dHRvbi5kZXN0cm95Py4oKTtcbiAgICAgICAgYnV0dG9uLmVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICAvLyBFeHRlbmQgbGlmZWN5Y2xlIGRlc3Ryb3kgaWYgaXQgZXhpc3RzXG4gICAgY29uc3Qgb3JpZ2luYWxEZXN0cm95ID0gKGNvbXBvbmVudCBhcyBhbnkpLmxpZmVjeWNsZT8uZGVzdHJveTtcbiAgICBpZiAob3JpZ2luYWxEZXN0cm95KSB7XG4gICAgICAoY29tcG9uZW50IGFzIGFueSkubGlmZWN5Y2xlLmRlc3Ryb3kgPSAoKSA9PiB7XG4gICAgICAgIHBpcGV0dGVGZWF0dXJlLmRlc3Ryb3koKTtcbiAgICAgICAgb3JpZ2luYWxEZXN0cm95KCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5jb21wb25lbnQsXG4gICAgICBzdGF0ZSxcbiAgICAgIHBpcGV0dGU6IHBpcGV0dGVGZWF0dXJlLFxuICAgIH07XG4gIH07XG4iLAogICAgIi8vIHNyYy9jb21wb25lbnRzL2NvbG9ycGlja2VyL2ZlYXR1cmVzL29wYWNpdHkudHNcblxuaW1wb3J0IHsgQ09MT1JQSUNLRVJfRVZFTlRTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ29sb3JQaWNrZXJDb25maWcsIENvbG9yUGlja2VyU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGhzdlRvSGV4IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBjcmVhdGVJbml0aWFsU3RhdGUgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5cbi8qKlxuICogT3BhY2l0eSBmZWF0dXJlIGludGVyZmFjZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wYWNpdHlGZWF0dXJlIHtcbiAgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gIGhhbmRsZTogSFRNTEVsZW1lbnQ7XG4gIHVwZGF0ZUhhbmRsZTogKCkgPT4gdm9pZDtcbiAgdXBkYXRlQmFja2dyb3VuZDogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBBZGRzIGFuIG9wYWNpdHkvYWxwaGEgYmFyIHdpdGggY2hlY2tlcmJvYXJkIGJhY2tncm91bmQgYW5kIGRyYWdnYWJsZSBoYW5kbGVcbiAqXG4gKiBAcGFyYW0gY29uZmlnIC0gQ29sb3IgcGlja2VyIGNvbmZpZ3VyYXRpb25cbiAqIEByZXR1cm5zIENvbXBvbmVudCBlbmhhbmNlciBmdW5jdGlvblxuICovXG5leHBvcnQgY29uc3Qgd2l0aE9wYWNpdHkgPVxuICAoY29uZmlnOiBDb2xvclBpY2tlckNvbmZpZykgPT5cbiAgPFxuICAgIFQgZXh0ZW5kcyB7XG4gICAgICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgICAgIGdldENsYXNzOiAobmFtZTogc3RyaW5nKSA9PiBzdHJpbmc7XG4gICAgICBlbWl0OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gICAgICBzdGF0ZT86IENvbG9yUGlja2VyU3RhdGU7XG4gICAgICBwaWNrZXJDb250ZW50PzogSFRNTEVsZW1lbnQ7XG4gICAgICBodWU/OiB7XG4gICAgICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICAgICAgfTtcbiAgICB9LFxuICA+KFxuICAgIGNvbXBvbmVudDogVCxcbiAgKTogVCAmIHsgb3BhY2l0eTogT3BhY2l0eUZlYXR1cmU7IHN0YXRlOiBDb2xvclBpY2tlclN0YXRlIH0gPT4ge1xuICAgIGNvbnN0IHsgZWxlbWVudCwgZ2V0Q2xhc3MsIGVtaXQgfSA9IGNvbXBvbmVudDtcblxuICAgIC8vIEluaXRpYWxpemUgc3RhdGUgaWYgbm90IHByZXNlbnRcbiAgICBjb25zdCBzdGF0ZTogQ29sb3JQaWNrZXJTdGF0ZSA9XG4gICAgICBjb21wb25lbnQuc3RhdGUgfHwgY3JlYXRlSW5pdGlhbFN0YXRlKGNvbmZpZyk7XG5cbiAgICAvLyBJbml0aWFsaXplIG9wYWNpdHkgaW4gc3RhdGUgaWYgbm90IHByZXNlbnRcbiAgICBpZiAoc3RhdGUub3BhY2l0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzdGF0ZS5vcGFjaXR5ID0gY29uZmlnLm9wYWNpdHkgPz8gMTtcbiAgICB9XG5cbiAgICAvLyBVc2UgcGlja2VyQ29udGVudCBpZiBhdmFpbGFibGUgKGZvciBkcm9wZG93bi9kaWFsb2cpLCBvdGhlcndpc2UgdXNlIGVsZW1lbnRcbiAgICBjb25zdCBjb250YWluZXIgPSBjb21wb25lbnQucGlja2VyQ29udGVudCB8fCBlbGVtZW50O1xuXG4gICAgLy8gQ3JlYXRlIG9wYWNpdHkgYmFyIGNvbnRhaW5lclxuICAgIGNvbnN0IG9wYWNpdHlCYXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIG9wYWNpdHlCYXIuY2xhc3NOYW1lID0gZ2V0Q2xhc3MoXCJjb2xvcnBpY2tlcl9fb3BhY2l0eVwiKTtcblxuICAgIC8vIENyZWF0ZSBjaGVja2VyYm9hcmQgYmFja2dyb3VuZCAoZm9yIHRyYW5zcGFyZW5jeSB2aXN1YWxpemF0aW9uKVxuICAgIGNvbnN0IGNoZWNrZXJib2FyZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgY2hlY2tlcmJvYXJkLmNsYXNzTmFtZSA9IGdldENsYXNzKFwiY29sb3JwaWNrZXJfX29wYWNpdHktY2hlY2tlcmJvYXJkXCIpO1xuICAgIG9wYWNpdHlCYXIuYXBwZW5kQ2hpbGQoY2hlY2tlcmJvYXJkKTtcblxuICAgIC8vIENyZWF0ZSBncmFkaWVudCB0cmFjayAodHJhbnNwYXJlbnQgdG8gc29saWQgY29sb3IpXG4gICAgY29uc3QgdHJhY2sgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgIHRyYWNrLmNsYXNzTmFtZSA9IGdldENsYXNzKFwiY29sb3JwaWNrZXJfX29wYWNpdHktdHJhY2tcIik7XG4gICAgb3BhY2l0eUJhci5hcHBlbmRDaGlsZCh0cmFjayk7XG5cbiAgICAvLyBDcmVhdGUgZHJhZ2dhYmxlIGhhbmRsZVxuICAgIGNvbnN0IGhhbmRsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgaGFuZGxlLmNsYXNzTmFtZSA9IGdldENsYXNzKFwiY29sb3JwaWNrZXJfX29wYWNpdHktaGFuZGxlXCIpO1xuICAgIG9wYWNpdHlCYXIuYXBwZW5kQ2hpbGQoaGFuZGxlKTtcblxuICAgIC8vIEluc2VydCBhZnRlciBodWUgZWxlbWVudCBpZiBpdCBleGlzdHMsIG90aGVyd2lzZSBhcHBlbmRcbiAgICBpZiAoY29tcG9uZW50Lmh1ZT8uZWxlbWVudCkge1xuICAgICAgY29tcG9uZW50Lmh1ZS5lbGVtZW50Lmluc2VydEFkamFjZW50RWxlbWVudChcImFmdGVyZW5kXCIsIG9wYWNpdHlCYXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQob3BhY2l0eUJhcik7XG4gICAgfVxuXG4gICAgLy8gRHJhZ2dpbmcgc3RhdGVcbiAgICBsZXQgaXNEcmFnZ2luZyA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBncmFkaWVudCBiYWNrZ3JvdW5kIGJhc2VkIG9uIGN1cnJlbnQgY29sb3JcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVCYWNrZ3JvdW5kID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3Qgc29saWRDb2xvciA9IGhzdlRvSGV4KHN0YXRlLmhzdi5oLCBzdGF0ZS5oc3Yucywgc3RhdGUuaHN2LnYpO1xuICAgICAgdHJhY2suc3R5bGUuYmFja2dyb3VuZCA9IGBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHRyYW5zcGFyZW50LCAke3NvbGlkQ29sb3J9KWA7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBoYW5kbGUgcG9zaXRpb24gYmFzZWQgb24gY3VycmVudCBvcGFjaXR5XG4gICAgICovXG4gICAgY29uc3QgdXBkYXRlSGFuZGxlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgY29uc3QgcGVyY2VudCA9IHN0YXRlLm9wYWNpdHkgKiAxMDA7XG4gICAgICBoYW5kbGUuc3R5bGUubGVmdCA9IGAke3BlcmNlbnR9JWA7XG4gICAgICAvLyBTZXQgaGFuZGxlIGNvbG9yIHdpdGggY3VycmVudCBvcGFjaXR5XG4gICAgICBjb25zdCBzb2xpZENvbG9yID0gaHN2VG9IZXgoc3RhdGUuaHN2LmgsIHN0YXRlLmhzdi5zLCBzdGF0ZS5oc3Yudik7XG4gICAgICBoYW5kbGUuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gc29saWRDb2xvcjtcbiAgICAgIGhhbmRsZS5zdHlsZS5vcGFjaXR5ID0gU3RyaW5nKHN0YXRlLm9wYWNpdHkpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGUgb3BhY2l0eSBmcm9tIG1vdXNlL3RvdWNoIHBvc2l0aW9uXG4gICAgICovXG4gICAgY29uc3QgZ2V0T3BhY2l0eUZyb21Qb3NpdGlvbiA9IChjbGllbnRYOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgICAgY29uc3QgcmVjdCA9IG9wYWNpdHlCYXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBjb25zdCB4ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oY2xpZW50WCAtIHJlY3QubGVmdCwgcmVjdC53aWR0aCkpO1xuICAgICAgY29uc3QgcGVyY2VudCA9IHggLyByZWN0LndpZHRoO1xuICAgICAgcmV0dXJuIE1hdGgucm91bmQocGVyY2VudCAqIDEwMCkgLyAxMDA7IC8vIFJvdW5kIHRvIDIgZGVjaW1hbCBwbGFjZXNcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHN0YXRlIGFuZCBlbWl0IGV2ZW50c1xuICAgICAqL1xuICAgIGNvbnN0IHVwZGF0ZU9wYWNpdHkgPSAob3BhY2l0eTogbnVtYmVyLCBpc0NvbW1pdDogYm9vbGVhbik6IHZvaWQgPT4ge1xuICAgICAgc3RhdGUub3BhY2l0eSA9IG9wYWNpdHk7XG5cbiAgICAgIHVwZGF0ZUhhbmRsZSgpO1xuXG4gICAgICAvLyBVcGRhdGUgYXJpYSB2YWx1ZVxuICAgICAgb3BhY2l0eUJhci5zZXRBdHRyaWJ1dGUoXG4gICAgICAgIFwiYXJpYS12YWx1ZW5vd1wiLFxuICAgICAgICBTdHJpbmcoTWF0aC5yb3VuZChvcGFjaXR5ICogMTAwKSksXG4gICAgICApO1xuXG4gICAgICAvLyBVcGRhdGUgaW5wdXQgZmllbGQgdmlhIHJlZnNcbiAgICAgIHN0YXRlLnJlZnMuaW5wdXQ/LnVwZGF0ZT8uKCk7XG5cbiAgICAgIGlmIChpc0NvbW1pdCkge1xuICAgICAgICBlbWl0KENPTE9SUElDS0VSX0VWRU5UUy5DSEFOR0UsIHN0YXRlLmhleCk7XG4gICAgICAgIGNvbmZpZy5vbkNoYW5nZT8uKHN0YXRlLmhleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbWl0KENPTE9SUElDS0VSX0VWRU5UUy5JTlBVVCwgc3RhdGUuaGV4KTtcbiAgICAgICAgY29uZmlnLm9uSW5wdXQ/LihzdGF0ZS5oZXgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgcG9pbnRlciBkb3duIG9uIG9wYWNpdHkgYmFyXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlUG9pbnRlckRvd24gPSAoZTogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoY29uZmlnLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgc3RhdGUuaXNEcmFnZ2luZyA9IHRydWU7XG4gICAgICBzdGF0ZS5kcmFnVGFyZ2V0ID0gXCJvcGFjaXR5XCI7XG5cbiAgICAgIC8vIENhcHR1cmUgcG9pbnRlciBmb3IgdHJhY2tpbmcgb3V0c2lkZSBlbGVtZW50XG4gICAgICBvcGFjaXR5QmFyLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcblxuICAgICAgLy8gQWRkIGRyYWdnaW5nIGNsYXNzXG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoZ2V0Q2xhc3MoXCJjb2xvcnBpY2tlci0tZHJhZ2dpbmdcIikpO1xuXG4gICAgICAvLyBVcGRhdGUgb3BhY2l0eSBpbW1lZGlhdGVseVxuICAgICAgY29uc3Qgb3BhY2l0eSA9IGdldE9wYWNpdHlGcm9tUG9zaXRpb24oZS5jbGllbnRYKTtcbiAgICAgIHVwZGF0ZU9wYWNpdHkob3BhY2l0eSwgZmFsc2UpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgcG9pbnRlciBtb3ZlXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlUG9pbnRlck1vdmUgPSAoZTogUG9pbnRlckV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoIWlzRHJhZ2dpbmcpIHJldHVybjtcblxuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3Qgb3BhY2l0eSA9IGdldE9wYWNpdHlGcm9tUG9zaXRpb24oZS5jbGllbnRYKTtcbiAgICAgIHVwZGF0ZU9wYWNpdHkob3BhY2l0eSwgZmFsc2UpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBIYW5kbGUgcG9pbnRlciB1cFxuICAgICAqL1xuICAgIGNvbnN0IGhhbmRsZVBvaW50ZXJVcCA9IChlOiBQb2ludGVyRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgIGlmICghaXNEcmFnZ2luZykgcmV0dXJuO1xuXG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICBzdGF0ZS5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgICBzdGF0ZS5kcmFnVGFyZ2V0ID0gbnVsbDtcblxuICAgICAgLy8gUmVsZWFzZSBwb2ludGVyIGNhcHR1cmVcbiAgICAgIG9wYWNpdHlCYXIucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcblxuICAgICAgLy8gUmVtb3ZlIGRyYWdnaW5nIGNsYXNzXG4gICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoZ2V0Q2xhc3MoXCJjb2xvcnBpY2tlci0tZHJhZ2dpbmdcIikpO1xuXG4gICAgICAvLyBFbWl0IGZpbmFsIGNoYW5nZVxuICAgICAgY29uc3Qgb3BhY2l0eSA9IGdldE9wYWNpdHlGcm9tUG9zaXRpb24oZS5jbGllbnRYKTtcbiAgICAgIHVwZGF0ZU9wYWNpdHkob3BhY2l0eSwgdHJ1ZSk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIEhhbmRsZSBrZXlib2FyZCBuYXZpZ2F0aW9uXG4gICAgICovXG4gICAgY29uc3QgaGFuZGxlS2V5RG93biA9IChlOiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICBpZiAoY29uZmlnLmRpc2FibGVkKSByZXR1cm47XG5cbiAgICAgIGxldCBvcGFjaXR5ID0gc3RhdGUub3BhY2l0eTtcbiAgICAgIGNvbnN0IHN0ZXAgPSBlLnNoaWZ0S2V5ID8gMC4xIDogMC4wMTtcblxuICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICBjYXNlIFwiQXJyb3dMZWZ0XCI6XG4gICAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgb3BhY2l0eSA9IE1hdGgubWF4KDAsIG9wYWNpdHkgLSBzdGVwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkFycm93UmlnaHRcIjpcbiAgICAgICAgY2FzZSBcIkFycm93VXBcIjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgb3BhY2l0eSA9IE1hdGgubWluKDEsIG9wYWNpdHkgKyBzdGVwKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBcIkhvbWVcIjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgb3BhY2l0eSA9IDA7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJFbmRcIjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgb3BhY2l0eSA9IDE7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBSb3VuZCB0byBhdm9pZCBmbG9hdGluZyBwb2ludCBpc3N1ZXNcbiAgICAgIG9wYWNpdHkgPSBNYXRoLnJvdW5kKG9wYWNpdHkgKiAxMDApIC8gMTAwO1xuICAgICAgdXBkYXRlT3BhY2l0eShvcGFjaXR5LCB0cnVlKTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGV2ZW50IGxpc3RlbmVyc1xuICAgIG9wYWNpdHlCYXIuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGhhbmRsZVBvaW50ZXJEb3duKTtcbiAgICBvcGFjaXR5QmFyLmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBoYW5kbGVQb2ludGVyTW92ZSk7XG4gICAgb3BhY2l0eUJhci5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGhhbmRsZVBvaW50ZXJVcCk7XG4gICAgb3BhY2l0eUJhci5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmNhbmNlbFwiLCBoYW5kbGVQb2ludGVyVXApO1xuXG4gICAgLy8gTWFrZSBvcGFjaXR5IGJhciBmb2N1c2FibGUgZm9yIGtleWJvYXJkIG5hdmlnYXRpb25cbiAgICBvcGFjaXR5QmFyLnRhYkluZGV4ID0gMDtcbiAgICBvcGFjaXR5QmFyLnNldEF0dHJpYnV0ZShcInJvbGVcIiwgXCJzbGlkZXJcIik7XG4gICAgb3BhY2l0eUJhci5zZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIsIFwiT3BhY2l0eVwiKTtcbiAgICBvcGFjaXR5QmFyLnNldEF0dHJpYnV0ZShcImFyaWEtdmFsdWVtaW5cIiwgXCIwXCIpO1xuICAgIG9wYWNpdHlCYXIuc2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZW1heFwiLCBcIjEwMFwiKTtcbiAgICBvcGFjaXR5QmFyLnNldEF0dHJpYnV0ZShcbiAgICAgIFwiYXJpYS12YWx1ZW5vd1wiLFxuICAgICAgU3RyaW5nKE1hdGgucm91bmQoc3RhdGUub3BhY2l0eSAqIDEwMCkpLFxuICAgICk7XG4gICAgb3BhY2l0eUJhci5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlEb3duKTtcblxuICAgIC8vIFJlZ2lzdGVyIGluIHJlZnMgZm9yIGNyb3NzLWZlYXR1cmUgYWNjZXNzXG4gICAgc3RhdGUucmVmcy5vcGFjaXR5ID0geyB1cGRhdGVCYWNrZ3JvdW5kLCB1cGRhdGVIYW5kbGUgfTtcblxuICAgIC8vIEluaXRpYWwgdXBkYXRlc1xuICAgIHVwZGF0ZUJhY2tncm91bmQoKTtcbiAgICB1cGRhdGVIYW5kbGUoKTtcblxuICAgIC8vIENyZWF0ZSBvcGFjaXR5IGZlYXR1cmUgb2JqZWN0XG4gICAgY29uc3Qgb3BhY2l0eUZlYXR1cmU6IE9wYWNpdHlGZWF0dXJlID0ge1xuICAgICAgZWxlbWVudDogb3BhY2l0eUJhcixcbiAgICAgIGhhbmRsZSxcbiAgICAgIHVwZGF0ZUhhbmRsZSxcbiAgICAgIHVwZGF0ZUJhY2tncm91bmQsXG4gICAgfTtcblxuICAgIC8vIEV4dGVuZCBsaWZlY3ljbGUgZGVzdHJveSBpZiBpdCBleGlzdHNcbiAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSAoY29tcG9uZW50IGFzIGFueSkubGlmZWN5Y2xlPy5kZXN0cm95O1xuICAgIGlmIChvcmlnaW5hbERlc3Ryb3kpIHtcbiAgICAgIChjb21wb25lbnQgYXMgYW55KS5saWZlY3ljbGUuZGVzdHJveSA9ICgpID0+IHtcbiAgICAgICAgb3BhY2l0eUJhci5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgaGFuZGxlUG9pbnRlckRvd24pO1xuICAgICAgICBvcGFjaXR5QmFyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVybW92ZVwiLCBoYW5kbGVQb2ludGVyTW92ZSk7XG4gICAgICAgIG9wYWNpdHlCYXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBoYW5kbGVQb2ludGVyVXApO1xuICAgICAgICBvcGFjaXR5QmFyLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyY2FuY2VsXCIsIGhhbmRsZVBvaW50ZXJVcCk7XG4gICAgICAgIG9wYWNpdHlCYXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIiwgaGFuZGxlS2V5RG93bik7XG4gICAgICAgIG9wYWNpdHlCYXIucmVtb3ZlKCk7XG4gICAgICAgIG9yaWdpbmFsRGVzdHJveSgpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uY29tcG9uZW50LFxuICAgICAgc3RhdGUsXG4gICAgICBvcGFjaXR5OiBvcGFjaXR5RmVhdHVyZSxcbiAgICB9O1xuICB9O1xuIiwKICAgICIvLyBzcmMvY29tcG9uZW50cy9jb2xvcnBpY2tlci9hcGkudHNcblxuaW1wb3J0IHtcbiAgQ29sb3JQaWNrZXJDb21wb25lbnQsXG4gIENvbG9yUGlja2VyQ29uZmlnLFxuICBDb2xvclBpY2tlclN0YXRlLFxuICBDb2xvclN3YXRjaCxcbiAgSFNWQ29sb3IsXG4gIFJHQkNvbG9yLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgaGV4VG9Ic3YsIGhleFRvUmdiLCBoc3ZUb0hleCwgcmdiVG9IZXgsIG5vcm1hbGl6ZUhleCB9IGZyb20gXCIuL3V0aWxzXCI7XG5pbXBvcnQgeyBDT0xPUlBJQ0tFUl9FVkVOVFMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEFyZWFGZWF0dXJlIH0gZnJvbSBcIi4vZmVhdHVyZXMvYXJlYVwiO1xuaW1wb3J0IHsgSHVlRmVhdHVyZSB9IGZyb20gXCIuL2ZlYXR1cmVzL2h1ZVwiO1xuaW1wb3J0IHsgU3dhdGNoZXNGZWF0dXJlIH0gZnJvbSBcIi4vZmVhdHVyZXMvc3dhdGNoZXNcIjtcbmltcG9ydCB7IElucHV0RmVhdHVyZSB9IGZyb20gXCIuL2ZlYXR1cmVzL2lucHV0XCI7XG5pbXBvcnQgeyBWYXJpYW50RmVhdHVyZSB9IGZyb20gXCIuL2ZlYXR1cmVzL3ZhcmlhbnRcIjtcbmltcG9ydCB7IFBpcGV0dGVGZWF0dXJlIH0gZnJvbSBcIi4vZmVhdHVyZXMvcGlwZXR0ZVwiO1xuaW1wb3J0IHsgT3BhY2l0eUZlYXR1cmUgfSBmcm9tIFwiLi9mZWF0dXJlcy9vcGFjaXR5XCI7XG5cbi8qKlxuICogQVBJIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgY29sb3IgcGlja2VyIGNvbXBvbmVudFxuICogQGNhdGVnb3J5IENvbXBvbmVudHNcbiAqIEBpbnRlcm5hbFxuICovXG5pbnRlcmZhY2UgQXBpT3B0aW9ucyB7XG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICBjb25maWc6IENvbG9yUGlja2VyQ29uZmlnO1xuICBnZXRDbGFzczogKG5hbWU6IHN0cmluZykgPT4gc3RyaW5nO1xuICBlbWl0OiAoZXZlbnQ6IHN0cmluZywgZGF0YT86IHVua25vd24pID0+IHZvaWQ7XG4gIG9uOiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbiAgb2ZmOiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCkgPT4gdW5rbm93bjtcbiAgZGlzYWJsZWQ6IHtcbiAgICBlbmFibGU6ICgpID0+IHZvaWQ7XG4gICAgZGlzYWJsZTogKCkgPT4gdm9pZDtcbiAgICBpc0Rpc2FibGVkOiAoKSA9PiBib29sZWFuO1xuICB9O1xuICBsaWZlY3ljbGU6IHtcbiAgICBkZXN0cm95OiAoKSA9PiB2b2lkO1xuICB9O1xuICAvLyBPcHRpb25hbCBmZWF0dXJlc1xuICBzdGF0ZT86IENvbG9yUGlja2VyU3RhdGU7XG4gIGFyZWE/OiBBcmVhRmVhdHVyZTtcbiAgaHVlPzogSHVlRmVhdHVyZTtcbiAgc3dhdGNoZXM/OiBTd2F0Y2hlc0ZlYXR1cmU7XG4gIGlucHV0PzogSW5wdXRGZWF0dXJlO1xuICB2YXJpYW50PzogVmFyaWFudEZlYXR1cmU7XG4gIHBpcGV0dGU/OiBQaXBldHRlRmVhdHVyZTtcbiAgb3BhY2l0eT86IE9wYWNpdHlGZWF0dXJlO1xufVxuXG4vKipcbiAqIEVuaGFuY2VzIGEgY29sb3IgcGlja2VyIGNvbXBvbmVudCB3aXRoIEFQSSBtZXRob2RzLlxuICogVGhpcyBmb2xsb3dzIHRoZSBoaWdoZXItb3JkZXIgZnVuY3Rpb24gcGF0dGVybiB0byBhZGQgcHVibGljIEFQSSBtZXRob2RzXG4gKiB0byB0aGUgY29tcG9uZW50LCBtYWtpbmcgdGhlbSBhdmFpbGFibGUgdG8gdGhlIGVuZCB1c2VyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQVBJIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICogQHJldHVybnMgSGlnaGVyLW9yZGVyIGZ1bmN0aW9uIHRoYXQgYWRkcyBBUEkgbWV0aG9kcyB0byBjb21wb25lbnRcbiAqIEBjYXRlZ29yeSBDb21wb25lbnRzXG4gKiBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhBUEkgPVxuICAob3B0aW9uczogQXBpT3B0aW9ucykgPT5cbiAgKGNvbXBvbmVudDogdW5rbm93bik6IENvbG9yUGlja2VyQ29tcG9uZW50ID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBlbGVtZW50LFxuICAgICAgY29uZmlnLFxuICAgICAgZ2V0Q2xhc3MsXG4gICAgICBlbWl0LFxuICAgICAgb24sXG4gICAgICBvZmYsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIGxpZmVjeWNsZSxcbiAgICAgIHN0YXRlLFxuICAgICAgYXJlYSxcbiAgICAgIGh1ZSxcbiAgICAgIHN3YXRjaGVzLFxuICAgICAgaW5wdXQsXG4gICAgICB2YXJpYW50LFxuICAgICAgcGlwZXR0ZSxcbiAgICAgIG9wYWNpdHksXG4gICAgfSA9IG9wdGlvbnM7XG5cbiAgICAvLyBFbnN1cmUgc3RhdGUgZXhpc3RzXG4gICAgaWYgKCFzdGF0ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29sb3JQaWNrZXI6IHN0YXRlIGlzIHJlcXVpcmVkXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSBhbGwgVUkgZWxlbWVudHNcbiAgICAgKi9cbiAgICBjb25zdCB1cGRhdGVVSSA9ICgpOiB2b2lkID0+IHtcbiAgICAgIGFyZWE/LnVwZGF0ZUJhY2tncm91bmQoKTtcbiAgICAgIGFyZWE/LnVwZGF0ZUhhbmRsZSgpO1xuICAgICAgaHVlPy51cGRhdGVIYW5kbGUoKTtcbiAgICAgIG9wYWNpdHk/LnVwZGF0ZUJhY2tncm91bmQoKTtcbiAgICAgIG9wYWNpdHk/LnVwZGF0ZUhhbmRsZSgpO1xuICAgICAgaW5wdXQ/LnVwZGF0ZSgpO1xuICAgICAgc3dhdGNoZXM/LnVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICAvKipcbiAgICAgKiBTZXQgY29sb3IgZnJvbSBoZXggdmFsdWVcbiAgICAgKi9cbiAgICBjb25zdCBzZXRDb2xvciA9IChoZXg6IHN0cmluZywgZW1pdENoYW5nZTogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCA9PiB7XG4gICAgICBjb25zdCBoc3YgPSBoZXhUb0hzdihoZXgpO1xuICAgICAgaWYgKCFoc3YpIHJldHVybjtcblxuICAgICAgc3RhdGUuaHN2ID0gaHN2O1xuICAgICAgc3RhdGUuaGV4ID0gbm9ybWFsaXplSGV4KGhleCk7XG4gICAgICB1cGRhdGVVSSgpO1xuXG4gICAgICBpZiAoZW1pdENoYW5nZSkge1xuICAgICAgICBlbWl0KENPTE9SUElDS0VSX0VWRU5UUy5DSEFOR0UsIHN0YXRlLmhleCk7XG4gICAgICAgIGNvbmZpZy5vbkNoYW5nZT8uKHN0YXRlLmhleCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFNldCBjb2xvciBmcm9tIEhTViB2YWx1ZXNcbiAgICAgKi9cbiAgICBjb25zdCBzZXRIU1ZJbnRlcm5hbCA9IChcbiAgICAgIGhzdjogSFNWQ29sb3IsXG4gICAgICBlbWl0Q2hhbmdlOiBib29sZWFuID0gZmFsc2UsXG4gICAgKTogdm9pZCA9PiB7XG4gICAgICBzdGF0ZS5oc3YgPSB7XG4gICAgICAgIGg6IE1hdGgubWF4KDAsIE1hdGgubWluKDM2MCwgaHN2LmgpKSxcbiAgICAgICAgczogTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBoc3YucykpLFxuICAgICAgICB2OiBNYXRoLm1heCgwLCBNYXRoLm1pbigxMDAsIGhzdi52KSksXG4gICAgICB9O1xuICAgICAgc3RhdGUuaGV4ID0gaHN2VG9IZXgoc3RhdGUuaHN2LmgsIHN0YXRlLmhzdi5zLCBzdGF0ZS5oc3Yudik7XG4gICAgICB1cGRhdGVVSSgpO1xuXG4gICAgICBpZiAoZW1pdENoYW5nZSkge1xuICAgICAgICBlbWl0KENPTE9SUElDS0VSX0VWRU5UUy5DSEFOR0UsIHN0YXRlLmhleCk7XG4gICAgICAgIGNvbmZpZy5vbkNoYW5nZT8uKHN0YXRlLmhleCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8vIEJ1aWxkIHRoZSBjb21wb25lbnQgQVBJXG4gICAgY29uc3QgY29sb3JQaWNrZXJDb21wb25lbnQ6IENvbG9yUGlja2VyQ29tcG9uZW50ID0ge1xuICAgICAgZWxlbWVudCxcblxuICAgICAgLy8gPT09PT09PT09PT09PSBWYWx1ZSBNZXRob2RzID09PT09PT09PT09PT1cblxuICAgICAgZ2V0VmFsdWU6ICgpID0+IHN0YXRlLmhleCxcblxuICAgICAgc2V0VmFsdWU6IChjb2xvcjogc3RyaW5nKSA9PiB7XG4gICAgICAgIHNldENvbG9yKGNvbG9yLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBjb2xvclBpY2tlckNvbXBvbmVudDtcbiAgICAgIH0sXG5cbiAgICAgIGdldEhTVjogKCkgPT4gKHsgLi4uc3RhdGUuaHN2IH0pLFxuXG4gICAgICBzZXRIU1Y6IChoc3Y6IEhTVkNvbG9yKSA9PiB7XG4gICAgICAgIHNldEhTVkludGVybmFsKGhzdiwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gY29sb3JQaWNrZXJDb21wb25lbnQ7XG4gICAgICB9LFxuXG4gICAgICBnZXRSR0I6ICgpOiBSR0JDb2xvciA9PiB7XG4gICAgICAgIGNvbnN0IHJnYiA9IGhleFRvUmdiKHN0YXRlLmhleCk7XG4gICAgICAgIHJldHVybiByZ2IgfHwgeyByOiAwLCBnOiAwLCBiOiAwIH07XG4gICAgICB9LFxuXG4gICAgICBzZXRSR0I6IChyZ2I6IFJHQkNvbG9yKSA9PiB7XG4gICAgICAgIGNvbnN0IGhleCA9IHJnYlRvSGV4KHJnYi5yLCByZ2IuZywgcmdiLmIpO1xuICAgICAgICBzZXRDb2xvcihoZXgsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGlja2VyQ29tcG9uZW50O1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PSBTd2F0Y2hlcyBNZXRob2RzID09PT09PT09PT09PT1cblxuICAgICAgc2V0U3dhdGNoZXM6IChzd2F0Y2hlc0FycmF5OiBzdHJpbmdbXSB8IENvbG9yU3dhdGNoW10pID0+IHtcbiAgICAgICAgaWYgKHN3YXRjaGVzKSB7XG4gICAgICAgICAgc3dhdGNoZXMuc2V0KHN3YXRjaGVzQXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xvclBpY2tlckNvbXBvbmVudDtcbiAgICAgIH0sXG5cbiAgICAgIGdldFN3YXRjaGVzOiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBzd2F0Y2hlcyA/IHN3YXRjaGVzLmdldCgpIDogW107XG4gICAgICB9LFxuXG4gICAgICBhZGRTd2F0Y2g6IChjb2xvcjogc3RyaW5nLCBsYWJlbD86IHN0cmluZykgPT4ge1xuICAgICAgICBpZiAoc3dhdGNoZXMpIHtcbiAgICAgICAgICBzd2F0Y2hlcy5hZGQoY29sb3IsIGxhYmVsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sb3JQaWNrZXJDb21wb25lbnQ7XG4gICAgICB9LFxuXG4gICAgICByZW1vdmVTd2F0Y2g6IChjb2xvcjogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChzd2F0Y2hlcykge1xuICAgICAgICAgIHN3YXRjaGVzLnJlbW92ZShjb2xvcik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbG9yUGlja2VyQ29tcG9uZW50O1xuICAgICAgfSxcblxuICAgICAgY2xlYXJTd2F0Y2hlczogKCkgPT4ge1xuICAgICAgICBpZiAoc3dhdGNoZXMpIHtcbiAgICAgICAgICBzd2F0Y2hlcy5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xvclBpY2tlckNvbXBvbmVudDtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT0gU3RhdGUgTWV0aG9kcyA9PT09PT09PT09PT09XG5cbiAgICAgIGVuYWJsZTogKCkgPT4ge1xuICAgICAgICBkaXNhYmxlZC5lbmFibGUoKTtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGlja2VyQ29tcG9uZW50O1xuICAgICAgfSxcblxuICAgICAgZGlzYWJsZTogKCkgPT4ge1xuICAgICAgICBkaXNhYmxlZC5kaXNhYmxlKCk7XG4gICAgICAgIHJldHVybiBjb2xvclBpY2tlckNvbXBvbmVudDtcbiAgICAgIH0sXG5cbiAgICAgIGlzRGlzYWJsZWQ6ICgpID0+IGRpc2FibGVkLmlzRGlzYWJsZWQoKSxcblxuICAgICAgLy8gPT09PT09PT09PT09PSBWYXJpYW50IE1ldGhvZHMgKGRyb3Bkb3duL2RpYWxvZykgPT09PT09PT09PT09PVxuXG4gICAgICBvcGVuOiAoKSA9PiB7XG4gICAgICAgIGlmICh2YXJpYW50KSB7XG4gICAgICAgICAgdmFyaWFudC5vcGVuKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbG9yUGlja2VyQ29tcG9uZW50O1xuICAgICAgfSxcblxuICAgICAgY2xvc2U6ICgpID0+IHtcbiAgICAgICAgaWYgKHZhcmlhbnQpIHtcbiAgICAgICAgICB2YXJpYW50LmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbG9yUGlja2VyQ29tcG9uZW50O1xuICAgICAgfSxcblxuICAgICAgdG9nZ2xlOiAoKSA9PiB7XG4gICAgICAgIGlmICh2YXJpYW50KSB7XG4gICAgICAgICAgdmFyaWFudC50b2dnbGUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29sb3JQaWNrZXJDb21wb25lbnQ7XG4gICAgICB9LFxuXG4gICAgICBpc09wZW46ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHZhcmlhbnQgPyB2YXJpYW50LmlzT3BlbigpIDogdHJ1ZTtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT0gUGlwZXR0ZSBNZXRob2RzID09PT09PT09PT09PT1cblxuICAgICAgcGlja0NvbG9yOiBhc3luYyAoKSA9PiB7XG4gICAgICAgIGlmIChwaXBldHRlKSB7XG4gICAgICAgICAgcmV0dXJuIHBpcGV0dGUucGljaygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSxcblxuICAgICAgc2V0SW1hZ2VTb3VyY2U6IChzb3VyY2U6IEhUTUxJbWFnZUVsZW1lbnQgfCBzdHJpbmcgfCBudWxsKSA9PiB7XG4gICAgICAgIGlmIChwaXBldHRlKSB7XG4gICAgICAgICAgcGlwZXR0ZS5zZXRJbWFnZVNvdXJjZShzb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb2xvclBpY2tlckNvbXBvbmVudDtcbiAgICAgIH0sXG5cbiAgICAgIGlzU2FtcGxpbmc6ICgpID0+IHtcbiAgICAgICAgcmV0dXJuIHBpcGV0dGUgPyBwaXBldHRlLmlzU2FtcGxpbmcoKSA6IGZhbHNlO1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PSBPcGFjaXR5IE1ldGhvZHMgPT09PT09PT09PT09PVxuXG4gICAgICBnZXRPcGFjaXR5OiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5vcGFjaXR5O1xuICAgICAgfSxcblxuICAgICAgc2V0T3BhY2l0eTogKG9wYWNpdHlWYWx1ZTogbnVtYmVyKSA9PiB7XG4gICAgICAgIHN0YXRlLm9wYWNpdHkgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBvcGFjaXR5VmFsdWUpKTtcbiAgICAgICAgb3BhY2l0eT8udXBkYXRlSGFuZGxlKCk7XG4gICAgICAgIHJldHVybiBjb2xvclBpY2tlckNvbXBvbmVudDtcbiAgICAgIH0sXG5cbiAgICAgIC8vID09PT09PT09PT09PT0gRXZlbnQgTWV0aG9kcyA9PT09PT09PT09PT09XG5cbiAgICAgIG9uOiAoZXZlbnQ6IHN0cmluZywgaGFuZGxlcjogKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZCkgPT4ge1xuICAgICAgICBvbihldmVudCwgaGFuZGxlcik7XG4gICAgICAgIHJldHVybiBjb2xvclBpY2tlckNvbXBvbmVudDtcbiAgICAgIH0sXG5cbiAgICAgIG9mZjogKGV2ZW50OiBzdHJpbmcsIGhhbmRsZXI6ICguLi5hcmdzOiB1bmtub3duW10pID0+IHZvaWQpID0+IHtcbiAgICAgICAgb2ZmKGV2ZW50LCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIGNvbG9yUGlja2VyQ29tcG9uZW50O1xuICAgICAgfSxcblxuICAgICAgLy8gPT09PT09PT09PT09PSBMaWZlY3ljbGUgTWV0aG9kcyA9PT09PT09PT09PT09XG5cbiAgICAgIGRlc3Ryb3k6ICgpID0+IHtcbiAgICAgICAgbGlmZWN5Y2xlLmRlc3Ryb3koKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vIEF0dGFjaCBpbnRlcm5hbCBtZXRob2RzIHRvIGNvbXBvbmVudCBmb3IgZmVhdHVyZXMgdG8gdXNlXG4gICAgKGNvbG9yUGlja2VyQ29tcG9uZW50IGFzIGFueSkuc2V0Q29sb3IgPSBzZXRDb2xvcjtcbiAgICAoY29sb3JQaWNrZXJDb21wb25lbnQgYXMgYW55KS51cGRhdGVVSSA9IHVwZGF0ZVVJO1xuXG4gICAgLy8gSW5pdGlhbCBVSSB1cGRhdGUgZm9yIGlubGluZSB2YXJpYW50XG4gICAgaWYgKCF2YXJpYW50IHx8IHZhcmlhbnQuaXNPcGVuKCkpIHtcbiAgICAgIHVwZGF0ZVVJKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbG9yUGlja2VyQ29tcG9uZW50O1xuICB9O1xuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpQk8sU0FBUyxXQUFXLENBQ3pCLElBQ0EsSUFDQSxJQUNBLElBQ1E7QUFBQSxFQUNSLE9BQU8sS0FBSyxLQUFLLEtBQUssSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQUE7QUFZdkQsU0FBUyxRQUFRLENBQ3RCLElBQ0EsSUFDQSxJQUNBLElBQ1E7QUFBQSxFQUNSLE1BQU0sUUFBUyxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssRUFBRSxJQUFJLE1BQU8sS0FBSztBQUFBLEVBQzFELE9BQU8sUUFBUSxJQUFJLFFBQVEsTUFBTTtBQUFBO0FBVzVCLFNBQVMsa0JBQWtCLENBQ2hDLE1BQ0EsZUFDQSxPQUNjO0FBQUEsRUFDZCxNQUFNLFVBQVUsS0FBSyxJQUFJO0FBQUEsRUFDekIsSUFBSSxtQkFBbUI7QUFBQSxFQUV2QixNQUFNLFFBQXNCO0FBQUEsSUFDMUI7QUFBQSxJQUNBO0FBQUEsSUFDQSxRQUNHLE1BQU0sVUFBMkIsY0FBYztBQUFBLElBQ2xELFdBQVcsTUFBTTtBQUFBLElBQ2pCO0FBQUEsSUFDQSxVQUFVLFVBQVUsTUFBTTtBQUFBLElBQzFCO0FBQUEsSUFDQSxnQkFBZ0IsTUFBTTtBQUFBLE1BQ3BCLG1CQUFtQjtBQUFBLE1BQ25CLE1BQU0sbUJBQW1CO0FBQUEsTUFDekIsSUFBSSxjQUFjLFlBQVk7QUFBQSxRQUM1QixjQUFjLGVBQWU7QUFBQSxNQUMvQjtBQUFBO0FBQUEsSUFFRixpQkFBaUIsTUFBTTtBQUFBLE1BQ3JCLGNBQWMsZ0JBQWdCO0FBQUE7QUFBQSxFQUVsQztBQUFBLEVBRUEsT0FBTztBQUFBO0FBUUYsU0FBUyxlQUFlLEdBQVk7QUFBQSxFQUN6QyxNQUFNLFlBQWEsVUFBa0I7QUFBQSxFQUNyQyxPQUNFLGtCQUFrQixVQUFXLE9BQU8sY0FBYyxZQUFZLFlBQVk7QUFBQTtBQVN2RSxTQUFTLGlCQUFpQixHQUFZO0FBQUEsRUFDM0MsT0FBTyxDQUFDLENBQUMsT0FBTztBQUFBO0FBVVgsU0FBUyxtQkFBbUIsQ0FDakMsR0FDc0M7QUFBQSxFQUN0QyxJQUFJLGFBQWEsS0FBSyxNQUFNLFFBQVEsRUFBRSxPQUFPLEtBQUssRUFBRSxRQUFRLFNBQVMsR0FBRztBQUFBLElBQ3RFLE9BQU87QUFBQSxNQUNMLFNBQVMsRUFBRSxRQUFRLEdBQUc7QUFBQSxNQUN0QixTQUFTLEVBQUUsUUFBUSxHQUFHO0FBQUEsSUFDeEI7QUFBQSxFQUNGO0FBQUEsRUFFQSxPQUFPO0FBQUEsSUFDTCxTQUFVLEVBQWdDO0FBQUEsSUFDMUMsU0FBVSxFQUFnQztBQUFBLEVBQzVDO0FBQUE7OztBQy9HSyxTQUFTLFNBQVMsQ0FBQyxTQUFtRDtBQUFBLEVBQzNFLFFBQVEsT0FBTyxTQUFTLGtCQUFrQjtBQUFBLEVBRzFDLE1BQU0sU0FBUyxNQUFNLFdBQVcsTUFBTTtBQUFBLEVBQ3RDLE1BQU0sU0FBUyxNQUFNLFdBQVcsTUFBTTtBQUFBLEVBQ3RDLE1BQU0sV0FBVyxLQUFLLEtBQUssU0FBUyxTQUFTLFNBQVMsTUFBTTtBQUFBLEVBRzVELElBQUksV0FBVyxRQUFRLHNCQUFzQjtBQUFBLElBRTNDLE1BQU0sTUFBTSxLQUFLLElBQUk7QUFBQSxJQUNyQixNQUFNLGNBQWMsTUFBTSxNQUFNLGNBQWM7QUFBQSxJQUU5QyxNQUFNLFdBQVcsY0FBYyxNQUFNLFdBQVcsSUFBSTtBQUFBLElBR3BELE1BQU0sV0FBcUI7QUFBQSxTQUN0QixtQkFBbUIsT0FBTyxlQUFlLEtBQUs7QUFBQSxNQUNqRCxNQUFNO0FBQUEsTUFDTixPQUFPO0FBQUEsTUFDUCxHQUFHLE1BQU07QUFBQSxNQUNULEdBQUcsTUFBTTtBQUFBLElBQ1g7QUFBQSxJQUVBLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxPQUFPO0FBQUE7OztBQzNCRixTQUFTLGlCQUFpQixDQUFDLFFBQWdCLFFBQWtDO0FBQUEsRUFDbEYsSUFBSSxLQUFLLElBQUksTUFBTSxJQUFJLEtBQUssSUFBSSxNQUFNLEdBQUc7QUFBQSxJQUN2QyxPQUFPLFNBQVM7QUFBQSxFQUNsQjtBQUFBLEVBQ0EsT0FBTyxTQUFTO0FBQUE7QUFTWCxTQUFTLFdBQVcsQ0FBQyxTQUFxRDtBQUFBLEVBQy9FLFFBQVEsT0FBTyxTQUFTLGtCQUFrQjtBQUFBLEVBRzFDLE1BQU0sU0FBUyxNQUFNLFdBQVcsTUFBTTtBQUFBLEVBQ3RDLE1BQU0sU0FBUyxNQUFNLFdBQVcsTUFBTTtBQUFBLEVBQ3RDLE1BQU0sV0FBVyxLQUFLLEtBQUssU0FBUyxTQUFTLFNBQVMsTUFBTTtBQUFBLEVBRzVELE1BQU0sVUFBVSxLQUFLLElBQUk7QUFBQSxFQUN6QixNQUFNLFlBQVksVUFBVSxNQUFNO0FBQUEsRUFDbEMsTUFBTSxXQUFXLFdBQVc7QUFBQSxFQUc1QixJQUFJLFlBQVksUUFBUSxrQkFBa0IsYUFBYSxRQUFRLG9CQUFvQjtBQUFBLElBQ2pGLE1BQU0sWUFBWSxrQkFBa0IsUUFBUSxNQUFNO0FBQUEsSUFHbEQsTUFBTSxhQUF5QjtBQUFBLFNBQzFCLG1CQUFtQixTQUFTLGVBQWUsS0FBSztBQUFBLE1BQ25ELE1BQU07QUFBQSxNQUNOO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0EsUUFBUSxNQUFNO0FBQUEsTUFDZCxRQUFRLE1BQU07QUFBQSxNQUNkLE1BQU0sTUFBTTtBQUFBLE1BQ1osTUFBTSxNQUFNO0FBQUEsSUFDZDtBQUFBLElBRUEsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUVBLE9BQU87QUFBQTs7O0FDN0NGLFNBQVMsZUFBZSxDQUM3QixTQUNBLFVBQ1k7QUFBQSxFQUNaLFFBQVEsT0FBTyxTQUFTLGtCQUFrQjtBQUFBLEVBRzFDLE1BQU0sUUFBUSxPQUFPLFdBQVcsTUFBTTtBQUFBLElBRXBDLElBQUksTUFBTSxRQUFRO0FBQUEsTUFFaEIsTUFBTSxRQUFRLEtBQUssSUFBSSxNQUFNLFdBQVcsTUFBTSxNQUFNO0FBQUEsTUFDcEQsTUFBTSxRQUFRLEtBQUssSUFBSSxNQUFNLFdBQVcsTUFBTSxNQUFNO0FBQUEsTUFFcEQsSUFBSSxRQUFRLFFBQVEsd0JBQXdCLFFBQVEsUUFBUSxzQkFBc0I7QUFBQSxRQUVoRixNQUFNLGlCQUFpQztBQUFBLGFBQ2xDLG1CQUFtQixhQUFhLGVBQWUsS0FBSztBQUFBLFVBQ3ZELE1BQU07QUFBQSxVQUNOLEdBQUcsTUFBTTtBQUFBLFVBQ1QsR0FBRyxNQUFNO0FBQUEsUUFDWDtBQUFBLFFBR0EsU0FBUyxjQUFjO0FBQUEsTUFDekI7QUFBQSxJQUNGO0FBQUEsS0FDQyxRQUFRLGFBQWE7QUFBQSxFQUd4QixPQUFPLE1BQU07QUFBQSxJQUNYLGFBQWEsS0FBSztBQUFBO0FBQUE7QUFVZixTQUFTLHFCQUFxQixDQUFDLFNBQTJDO0FBQUEsRUFDL0UsUUFBUSxPQUFPLFlBQVk7QUFBQSxFQUUzQixNQUFNLFFBQVEsS0FBSyxJQUFJLE1BQU0sV0FBVyxNQUFNLE1BQU07QUFBQSxFQUNwRCxNQUFNLFFBQVEsS0FBSyxJQUFJLE1BQU0sV0FBVyxNQUFNLE1BQU07QUFBQSxFQUVwRCxPQUFPLFFBQVEsUUFBUSx3QkFBd0IsUUFBUSxRQUFRO0FBQUE7OztBQ25EMUQsU0FBUyxTQUFTLENBQUMsU0FBbUQ7QUFBQSxFQUMzRSxRQUFRLE9BQU8sa0JBQWtCO0FBQUEsRUFHakMsTUFBTSxTQUFTLE1BQU0sV0FBVyxNQUFNO0FBQUEsRUFDdEMsTUFBTSxTQUFTLE1BQU0sV0FBVyxNQUFNO0FBQUEsRUFHdEMsTUFBTSxhQUFhLE1BQU0sV0FBVyxNQUFNO0FBQUEsRUFDMUMsTUFBTSxhQUFhLE1BQU0sV0FBVyxNQUFNO0FBQUEsRUFDMUMsTUFBTSxZQUFZLEtBQUssS0FDckIsYUFBYSxhQUFhLGFBQWEsVUFDekM7QUFBQSxFQUdBLElBQUksWUFBWSxHQUFHO0FBQUEsSUFFakIsTUFBTSxXQUFxQjtBQUFBLFNBQ3RCLG1CQUFtQixPQUFPLGVBQWUsS0FBSztBQUFBLE1BQ2pELE1BQU07QUFBQSxNQUNOO0FBQUEsTUFDQTtBQUFBLE1BQ0EsUUFBUSxNQUFNO0FBQUEsTUFDZCxRQUFRLE1BQU07QUFBQSxNQUNkLFVBQVUsTUFBTTtBQUFBLE1BQ2hCLFVBQVUsTUFBTTtBQUFBLElBQ2xCO0FBQUEsSUFFQSxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsT0FBTztBQUFBOzs7QUM3QkYsU0FBUyxXQUFXLENBQ3pCLFNBQ0EsUUFDQSxRQUNtQjtBQUFBLEVBQ25CLFFBQVEsT0FBTyxrQkFBa0I7QUFBQSxFQUdqQyxNQUFNLGtCQUFrQixZQUN0QixPQUFPLFNBQ1AsT0FBTyxTQUNQLE9BQU8sU0FDUCxPQUFPLE9BQ1Q7QUFBQSxFQUdBLE1BQU0sa0JBQWtCO0FBQUEsRUFHeEIsSUFBSSxLQUFLLElBQUksa0JBQWtCLE1BQU0sYUFBYSxJQUFJLGlCQUFpQjtBQUFBLElBRXJFLE1BQU0sUUFBUSxrQkFBa0IsTUFBTTtBQUFBLElBR3RDLE1BQU0sV0FBVyxPQUFPLFVBQVUsT0FBTyxXQUFXO0FBQUEsSUFDcEQsTUFBTSxXQUFXLE9BQU8sVUFBVSxPQUFPLFdBQVc7QUFBQSxJQUdwRCxNQUFNLGFBQXlCO0FBQUEsU0FDMUIsbUJBQW1CLFNBQVMsZUFBZSxLQUFLO0FBQUEsTUFDbkQsTUFBTTtBQUFBLE1BQ047QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxJQUVBLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxPQUFPO0FBQUE7OztBQ3ZDRixTQUFTLFlBQVksQ0FDMUIsU0FDQSxRQUNBLFFBQ29CO0FBQUEsRUFDcEIsUUFBUSxPQUFPLGtCQUFrQjtBQUFBLEVBR2pDLE1BQU0sZUFBZSxTQUNuQixPQUFPLFNBQ1AsT0FBTyxTQUNQLE9BQU8sU0FDUCxPQUFPLE9BQ1Q7QUFBQSxFQUdBLE1BQU0scUJBQXFCO0FBQUEsRUFHM0IsTUFBTSxlQUFlLGVBQWUsTUFBTTtBQUFBLEVBRzFDLElBQUksS0FBSyxJQUFJLFlBQVksSUFBSSxvQkFBb0I7QUFBQSxJQUUvQyxNQUFNLFdBQVcsT0FBTyxVQUFVLE9BQU8sV0FBVztBQUFBLElBQ3BELE1BQU0sV0FBVyxPQUFPLFVBQVUsT0FBTyxXQUFXO0FBQUEsSUFHcEQsTUFBTSxjQUEyQjtBQUFBLFNBQzVCLG1CQUFtQixVQUFVLGVBQWUsS0FBSztBQUFBLE1BQ3BELE1BQU07QUFBQSxNQUNOLFVBQVU7QUFBQSxNQUNWO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxJQUVBLE9BQU87QUFBQSxFQUNUO0FBQUEsRUFFQSxPQUFPO0FBQUE7OztBQ3JCRixJQUFNLHVCQUF1QixDQUNsQyxTQUNBLFNBQXdCLENBQUMsTUFDTjtBQUFBLEVBRW5CLE1BQU0sVUFBbUM7QUFBQSxJQUN2QyxnQkFBZ0I7QUFBQSxJQUNoQixvQkFBb0I7QUFBQSxJQUNwQixlQUFlO0FBQUEsSUFDZixzQkFBc0I7QUFBQSxJQUN0QixnQkFBZ0I7QUFBQSxJQUNoQixpQkFBaUI7QUFBQSxPQUNkO0FBQUEsRUFDTDtBQUFBLEVBR0EsTUFBTSxXQUE2QyxJQUFJO0FBQUEsRUFHdkQsTUFBTSxRQUFzQjtBQUFBLElBQzFCLFFBQVE7QUFBQSxJQUNSLFdBQVc7QUFBQSxJQUNYLFFBQVE7QUFBQSxJQUNSLFFBQVE7QUFBQSxJQUNSLE9BQU87QUFBQSxJQUNQLE9BQU87QUFBQSxJQUNQLFVBQVU7QUFBQSxJQUNWLFVBQVU7QUFBQSxJQUNWLFlBQVk7QUFBQSxJQUNaLGdCQUFnQjtBQUFBLElBQ2hCLGVBQWU7QUFBQSxJQUNmLFlBQVk7QUFBQSxJQUNaLGFBQWE7QUFBQSxJQUNiLFVBQVU7QUFBQSxJQUNWLFFBQVE7QUFBQSxFQUNWO0FBQUEsRUFHQSxNQUFNLGVBQWUsZ0JBQWdCO0FBQUEsRUFDckMsTUFBTSxpQkFBaUIsa0JBQWtCO0FBQUEsRUFFekMsTUFBTSxpQkFBaUI7QUFBQSxJQUNyQixLQUFLO0FBQUEsSUFDTCxPQUFPO0FBQUEsSUFDUCxXQUFXO0FBQUEsSUFDWCxZQUFZO0FBQUEsSUFDWixTQUFTO0FBQUEsSUFDVCxXQUFXO0FBQUEsSUFDWCxXQUFXO0FBQUEsSUFDWCxLQUFLO0FBQUEsSUFDTCxPQUFPLGdCQUFnQjtBQUFBLElBQ3ZCLFFBQVEsZ0JBQWdCO0FBQUEsRUFDMUI7QUFBQSxFQUtBLE1BQU0sa0JBQWtCLENBQUMsVUFBaUM7QUFBQSxJQUV4RCxNQUFNLGdCQUFnQixTQUFTLElBQUksTUFBTSxJQUFJO0FBQUEsSUFDN0MsSUFBSSxDQUFDO0FBQUEsTUFBZTtBQUFBLElBR3BCLGNBQWMsUUFBUSxhQUFXO0FBQUEsTUFDL0IsSUFBSTtBQUFBLFFBQ0YsUUFBUSxLQUFLO0FBQUEsUUFDYixPQUFPLE9BQU87QUFBQSxRQUNkLFFBQVEsTUFBTSxnQ0FBZ0MsTUFBTSxTQUFTLEtBQUs7QUFBQTtBQUFBLEtBRXJFO0FBQUEsSUFHRCxJQUFJLE1BQU0sU0FBUyxXQUFXLGVBQWUsT0FBTztBQUFBLE1BQ2xELE1BQU0saUJBQWlCLEtBQUssT0FBTyxNQUFNLFFBQVEsTUFBTSxZQUFtQjtBQUFBLE1BQzFFLGdCQUFnQixjQUFxQjtBQUFBLElBQ3ZDO0FBQUEsSUFHQSxJQUFJLFFBQVEsa0JBQWtCLENBQUMsTUFBTSxrQkFBa0I7QUFBQSxNQUNyRCxNQUFNLGVBQWU7QUFBQSxJQUN2QjtBQUFBLElBRUEsSUFBSSxRQUFRLGlCQUFpQjtBQUFBLE1BQzNCLE1BQU0sZ0JBQWdCO0FBQUEsSUFDeEI7QUFBQTtBQUFBLEVBSUYsSUFBSSxtQkFBd0M7QUFBQSxFQUs1QyxNQUFNLGNBQWMsQ0FBQyxNQUFvRDtBQUFBLElBQ3ZFLE1BQU0sUUFBUSxvQkFBb0IsQ0FBQztBQUFBLElBQ25DLE1BQU0sYUFBYSxhQUFhLElBQUksRUFBRSxRQUFRLFNBQVM7QUFBQSxJQUd2RCxNQUFNLFNBQVM7QUFBQSxJQUNmLE1BQU0sWUFBWSxLQUFLLElBQUk7QUFBQSxJQUMzQixNQUFNLFNBQVMsTUFBTSxRQUFRLE1BQU0sV0FBVyxNQUFNO0FBQUEsSUFDcEQsTUFBTSxTQUFTLE1BQU0sUUFBUSxNQUFNLFdBQVcsTUFBTTtBQUFBLElBQ3BELE1BQU0sYUFBYTtBQUFBLElBQ25CLE1BQU0sU0FBUyxFQUFFO0FBQUEsSUFHakIsSUFBSSxlQUFlLEtBQUssYUFBYSxHQUFHO0FBQUEsTUFDdEMsTUFBTSxTQUFTLEVBQUUsUUFBUTtBQUFBLE1BQ3pCLE1BQU0sU0FBUyxFQUFFLFFBQVE7QUFBQSxNQUd6QixNQUFNLGdCQUFnQixLQUFLLEtBQ3pCLEtBQUssSUFBSSxPQUFPLFVBQVUsT0FBTyxTQUFTLENBQUMsSUFDM0MsS0FBSyxJQUFJLE9BQU8sVUFBVSxPQUFPLFNBQVMsQ0FBQyxDQUM3QztBQUFBLE1BRUEsTUFBTSxhQUFhLEtBQUssTUFDdEIsT0FBTyxVQUFVLE9BQU8sU0FDeEIsT0FBTyxVQUFVLE9BQU8sT0FDMUIsSUFBSSxNQUFNLEtBQUs7QUFBQSxNQUVmLElBQUksTUFBTSxhQUFhO0FBQUEsUUFBRyxNQUFNLGNBQWM7QUFBQSxJQUNoRDtBQUFBLElBR0EsTUFBTSxVQUFtQztBQUFBLE1BQ3ZDO0FBQUEsTUFDQTtBQUFBLE1BQ0EsZUFBZTtBQUFBLElBQ2pCO0FBQUEsSUFHQSxJQUFJLGtCQUFrQjtBQUFBLE1BQ3BCLGlCQUFpQjtBQUFBLElBQ25CO0FBQUEsSUFFQSxtQkFBbUIsZ0JBQWdCLFNBQVMsQ0FBQyxtQkFBbUI7QUFBQSxNQUM5RCxnQkFBZ0IsY0FBYztBQUFBLEtBQy9CO0FBQUE7QUFBQSxFQU1ILE1BQU0sYUFBYSxDQUFDLE1BQW9EO0FBQUEsSUFDdEUsSUFBSSxDQUFDLE1BQU07QUFBQSxNQUFRO0FBQUEsSUFFbkIsTUFBTSxRQUFRLG9CQUFvQixDQUFDO0FBQUEsSUFDbkMsTUFBTSxhQUFhLGFBQWEsSUFBSSxFQUFFLFFBQVEsU0FBUztBQUFBLElBR3ZELE1BQU0sUUFBUSxNQUFNO0FBQUEsSUFDcEIsTUFBTSxRQUFRLE1BQU07QUFBQSxJQUNwQixNQUFNLFdBQVcsTUFBTTtBQUFBLElBQ3ZCLE1BQU0sV0FBVyxNQUFNO0FBQUEsSUFHdkIsTUFBTSxVQUFtQztBQUFBLE1BQ3ZDO0FBQUEsTUFDQTtBQUFBLE1BQ0EsZUFBZTtBQUFBLElBQ2pCO0FBQUEsSUFHQSxJQUFJLHNCQUFzQixPQUFPLEtBQUssa0JBQWtCO0FBQUEsTUFDdEQsaUJBQWlCO0FBQUEsTUFDakIsbUJBQW1CO0FBQUEsSUFDckI7QUFBQSxJQUdBLE1BQU0sV0FBVyxVQUFVLE9BQU87QUFBQSxJQUNsQyxJQUFJLFVBQVU7QUFBQSxNQUNaLGdCQUFnQixRQUFRO0FBQUEsSUFDMUI7QUFBQSxJQUdBLElBQUksZUFBZSxLQUFLLGFBQWEsR0FBRztBQUFBLE1BQ3RDLE1BQU0sU0FBUyxFQUFFLFFBQVE7QUFBQSxNQUN6QixNQUFNLFNBQVMsRUFBRSxRQUFRO0FBQUEsTUFHekIsTUFBTSxhQUFhLFlBQVksU0FBUyxRQUFRLE1BQU07QUFBQSxNQUN0RCxJQUFJLFlBQVk7QUFBQSxRQUNkLGdCQUFnQixVQUFVO0FBQUEsTUFDNUI7QUFBQSxNQUdBLE1BQU0sY0FBYyxhQUFhLFNBQVMsUUFBUSxNQUFNO0FBQUEsTUFDeEQsSUFBSSxhQUFhO0FBQUEsUUFDZixnQkFBZ0IsV0FBVztBQUFBLE1BQzdCO0FBQUEsSUFDRjtBQUFBO0FBQUEsRUFNRixNQUFNLFlBQVksQ0FBQyxNQUFvRDtBQUFBLElBQ3JFLElBQUksQ0FBQyxNQUFNO0FBQUEsTUFBUTtBQUFBLElBR25CLElBQUksa0JBQWtCO0FBQUEsTUFDcEIsaUJBQWlCO0FBQUEsTUFDakIsbUJBQW1CO0FBQUEsSUFDckI7QUFBQSxJQUdBLE1BQU0sVUFBbUM7QUFBQSxNQUN2QztBQUFBLE1BQ0E7QUFBQSxNQUNBLGVBQWU7QUFBQSxJQUNqQjtBQUFBLElBR0EsTUFBTSxXQUFXLFVBQVUsT0FBTztBQUFBLElBQ2xDLElBQUksVUFBVTtBQUFBLE1BRVosTUFBTSxjQUFjLEtBQUssSUFBSTtBQUFBLE1BQzdCLE1BQU0sV0FBVyxTQUFTO0FBQUEsTUFFMUIsZ0JBQWdCLFFBQVE7QUFBQSxJQUMxQixFQUFPO0FBQUEsTUFFTCxNQUFNLGFBQWEsWUFBWSxPQUFPO0FBQUEsTUFDdEMsSUFBSSxZQUFZO0FBQUEsUUFDZCxnQkFBZ0IsVUFBVTtBQUFBLE1BQzVCO0FBQUE7QUFBQSxJQUlGLE1BQU0sU0FBUztBQUFBO0FBQUEsRUFNakIsTUFBTSxlQUFlLE1BQVk7QUFBQSxJQUUvQixJQUFJLGtCQUFrQjtBQUFBLE1BQ3BCLGlCQUFpQjtBQUFBLE1BQ2pCLG1CQUFtQjtBQUFBLElBQ3JCO0FBQUEsSUFHQSxNQUFNLFNBQVM7QUFBQTtBQUFBLEVBSWpCLElBQUksaUJBRUEsQ0FBQztBQUFBLEVBS0wsTUFBTSxzQkFBc0IsTUFBWTtBQUFBLElBQ3RDLElBQUksZ0JBQWdCO0FBQUEsTUFFbEIsaUJBQWlCO0FBQUEsUUFDZixhQUFhO0FBQUEsUUFDYixhQUFhO0FBQUEsUUFDYixXQUFXO0FBQUEsUUFDWCxlQUFlO0FBQUEsTUFDakI7QUFBQSxJQUNGLEVBQU8sU0FBSSxjQUFjO0FBQUEsTUFFdkIsaUJBQWlCO0FBQUEsUUFDZixZQUFZO0FBQUEsUUFDWixXQUFXO0FBQUEsUUFDWCxVQUFVO0FBQUEsUUFDVixhQUFhO0FBQUEsTUFDZjtBQUFBLElBQ0YsRUFBTztBQUFBLE1BRUwsaUJBQWlCO0FBQUEsUUFDZixXQUFXO0FBQUEsUUFDWCxXQUFXO0FBQUEsUUFDWCxTQUFTO0FBQUEsUUFDVCxZQUFZO0FBQUEsTUFDZDtBQUFBO0FBQUEsSUFJRixPQUFPLFFBQVEsY0FBYyxFQUFFLFFBQVEsRUFBRSxPQUFPLGNBQWM7QUFBQSxNQUM1RCxRQUFRLGlCQUFpQixPQUFPLFVBQVUsRUFBRSxTQUFTLENBQUMsUUFBUSxlQUFlLENBQUM7QUFBQSxLQUMvRTtBQUFBO0FBQUEsRUFNSCxNQUFNLHVCQUF1QixNQUFZO0FBQUEsSUFFdkMsT0FBTyxRQUFRLGNBQWMsRUFBRSxRQUFRLEVBQUUsT0FBTyxjQUFjO0FBQUEsTUFDNUQsUUFBUSxvQkFBb0IsT0FBTyxRQUFRO0FBQUEsS0FDNUM7QUFBQSxJQUdELGlCQUFpQixDQUFDO0FBQUE7QUFBQSxFQUlwQixvQkFBb0I7QUFBQSxFQUVwQixPQUFPO0FBQUEsSUFPTCxFQUFFLENBQUMsV0FBbUIsU0FBeUM7QUFBQSxNQUM3RCxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsR0FBRztBQUFBLFFBQzVCLFNBQVMsSUFBSSxXQUFXLElBQUksR0FBSztBQUFBLE1BQ25DO0FBQUEsTUFFQSxTQUFTLElBQUksU0FBUyxFQUFHLElBQUksT0FBTztBQUFBLE1BQ3BDLE9BQU87QUFBQTtBQUFBLElBU1QsR0FBRyxDQUFDLFdBQW1CLFNBQXlDO0FBQUEsTUFDOUQsTUFBTSxnQkFBZ0IsU0FBUyxJQUFJLFNBQVM7QUFBQSxNQUM1QyxJQUFJLGVBQWU7QUFBQSxRQUNqQixjQUFjLE9BQU8sT0FBTztBQUFBLFFBRTVCLElBQUksY0FBYyxTQUFTLEdBQUc7QUFBQSxVQUM1QixTQUFTLE9BQU8sU0FBUztBQUFBLFFBQzNCO0FBQUEsTUFDRjtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsSUFRVCxXQUFXLENBQUMsYUFBOEI7QUFBQSxNQUN4QyxPQUFPLGVBQWUsa0JBQWtCLGVBQWU7QUFBQTtBQUFBLElBT3pELE1BQU0sR0FBbUI7QUFBQSxNQUN2QixvQkFBb0I7QUFBQSxNQUNwQixPQUFPO0FBQUE7QUFBQSxJQU9ULE9BQU8sR0FBbUI7QUFBQSxNQUN4QixxQkFBcUI7QUFBQSxNQUNyQixPQUFPO0FBQUE7QUFBQSxJQU1ULE9BQU8sR0FBUztBQUFBLE1BRWQscUJBQXFCO0FBQUEsTUFHckIsSUFBSSxrQkFBa0I7QUFBQSxRQUNwQixpQkFBaUI7QUFBQSxRQUNqQixtQkFBbUI7QUFBQSxNQUNyQjtBQUFBLE1BR0EsU0FBUyxNQUFNO0FBQUE7QUFBQSxFQUVuQjtBQUFBOztBQ2xab0MsSUFBdEM7QUEwRk8sSUFBTSxlQUNYLENBQUMsU0FBZ0MsQ0FBQyxNQUNsQyxDQUE2QixjQUF3QztBQUFBLEVBQ25FLElBQUksQ0FBQyxVQUFVLFNBQVM7QUFBQSxJQUN0QixRQUFRLEtBQUssaURBQWlEO0FBQUEsSUFDOUQsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUdBO0FBQUEsSUFDRSxpQkFBaUI7QUFBQSxJQUNqQixrQkFBa0IsQ0FBQztBQUFBLE9BQ2hCO0FBQUEsTUFDRDtBQUFBLEVBR0osTUFBTSxpQkFBaUIscUJBQ3JCLFVBQVUsU0FDVixhQUNGO0FBQUEsRUFHQSxPQUFPLFFBQVEsZUFBZSxFQUFFLFFBQVEsRUFBRSxXQUFXLGFBQWE7QUFBQSxJQUNoRSxlQUFlLEdBQUcsV0FBVyxPQUFPO0FBQUEsR0FDckM7QUFBQSxFQUdELElBQUksQ0FBQyxnQkFBZ0I7QUFBQSxJQUNuQixlQUFlLFFBQVE7QUFBQSxFQUN6QjtBQUFBLEVBR0EsSUFBSSxvQkFBUSxTQUFTLEdBQUc7QUFBQSxJQUV0QixNQUFNLHVCQUF1QixDQUFDLFVBQTJCO0FBQUEsTUFDdkQsVUFBVSxLQUFLLE1BQU0sTUFBTSxLQUFLO0FBQUE7QUFBQSxJQUlsQztBQUFBLE1BQ0U7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxJQUNGLEVBQUUsUUFBUSxDQUFDLFNBQVM7QUFBQSxNQUNsQixlQUFlLEdBQUcsTUFBTSxvQkFBb0I7QUFBQSxLQUM3QztBQUFBLEVBQ0g7QUFBQSxFQUdBLElBQUkseUJBQWEsU0FBUyxHQUFHO0FBQUEsSUFDM0IsTUFBTSxrQkFBa0IsVUFBVSxVQUFVO0FBQUEsSUFFNUMsVUFBVSxVQUFVLFVBQVUsTUFBTTtBQUFBLE1BRWxDLGVBQWUsUUFBUTtBQUFBLE1BR3ZCLGdCQUFnQixLQUFLLFVBQVUsU0FBUztBQUFBO0FBQUEsRUFFNUM7QUFBQSxFQUdBLE9BQU87QUFBQSxPQUNGO0FBQUEsSUFDSCxVQUFVO0FBQUEsSUFRVixTQUFTLENBQUMsV0FBbUIsU0FBeUI7QUFBQSxNQUNwRCxlQUFlLEdBQUcsV0FBVyxPQUFPO0FBQUEsTUFDcEMsT0FBTztBQUFBO0FBQUEsSUFTVCxVQUFVLENBQUMsV0FBbUIsU0FBeUI7QUFBQSxNQUNyRCxlQUFlLElBQUksV0FBVyxPQUFPO0FBQUEsTUFDckMsT0FBTztBQUFBO0FBQUEsSUFRVCxrQkFBa0IsQ0FBQyxhQUFxQjtBQUFBLE1BQ3RDLE9BQU8sZUFBZSxZQUFZLFdBQVc7QUFBQTtBQUFBLElBTy9DLGNBQWMsR0FBRztBQUFBLE1BQ2YsZUFBZSxPQUFPO0FBQUEsTUFDdEIsT0FBTztBQUFBO0FBQUEsSUFPVCxlQUFlLEdBQUc7QUFBQSxNQUNoQixlQUFlLFFBQVE7QUFBQSxNQUN2QixPQUFPO0FBQUE7QUFBQSxFQUVYO0FBQUE7O0FDek5rQyxJQUF0QztBQW1GTyxJQUFNLGlCQUNYLENBQUMsU0FBMkIsQ0FBQyxNQUM3QixDQUE2QixjQUEwQztBQUFBLEVBQ3JFLElBQUksQ0FBQyxVQUFVLFNBQVM7QUFBQSxJQUN0QixRQUFRLEtBQUsscURBQXFEO0FBQUEsSUFDbEUsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUdBO0FBQUEsSUFDRSx1QkFBdUI7QUFBQSxJQUN2QixpQkFBaUI7QUFBQSxJQUNqQjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1I7QUFBQSxFQUdKLE1BQU0sV0FBMkMsSUFBSTtBQUFBLEVBR3JELElBQUksT0FBTztBQUFBLElBQ1QsU0FBUyxJQUFJLEtBQWtDO0FBQUEsRUFDakQ7QUFBQSxFQUdBLElBQUksU0FBUztBQUFBLEVBQ2IsSUFBSSxTQUFTO0FBQUEsRUFDYixJQUFJLFNBQVM7QUFBQSxFQUNiLElBQUksWUFBWTtBQUFBLEVBQ2hCLElBQUksY0FBYztBQUFBLEVBQ2xCLElBQUksV0FBVztBQUFBLEVBQ2YsSUFBSSxZQUFZO0FBQUEsRUFLaEIsTUFBTSxjQUFjLENBQ2xCLEdBQ0EsR0FDQSxNQUNTO0FBQUEsSUFDVCxNQUFNLE1BQU0sS0FBSyxJQUFJO0FBQUEsSUFDckIsTUFBTSxjQUFjLE1BQU0sY0FBYztBQUFBLElBRXhDLElBQUksYUFBYTtBQUFBLE1BQ2Y7QUFBQSxJQUNGLEVBQU87QUFBQSxNQUNMLFdBQVc7QUFBQTtBQUFBLElBR2IsY0FBYztBQUFBLElBR2QsTUFBTSxXQUFxQjtBQUFBLE1BQ3pCLE1BQU07QUFBQSxNQUNOLGVBQWU7QUFBQSxNQUNmLFFBQVEsRUFBRTtBQUFBLE1BQ1Y7QUFBQSxNQUNBLFNBQVM7QUFBQSxNQUNULFVBQVUsTUFBTTtBQUFBLE1BQ2hCLGtCQUFrQjtBQUFBLE1BQ2xCLGdCQUFnQixNQUFNO0FBQUEsUUFDcEIsU0FBUyxtQkFBbUI7QUFBQSxRQUM1QixJQUFJLEVBQUUsWUFBWTtBQUFBLFVBQ2hCLEVBQUUsZUFBZTtBQUFBLFFBQ25CO0FBQUE7QUFBQSxNQUVGLGlCQUFpQixNQUFNO0FBQUEsUUFDckIsRUFBRSxnQkFBZ0I7QUFBQTtBQUFBLE1BRXBCLE9BQU87QUFBQSxNQUNQO0FBQUEsTUFDQTtBQUFBLElBQ0Y7QUFBQSxJQUdBLFNBQVMsUUFBUSxDQUFDLFlBQVk7QUFBQSxNQUM1QixJQUFJO0FBQUEsUUFDRixRQUFRLFFBQVE7QUFBQSxRQUNoQixPQUFPLE9BQU87QUFBQSxRQUNkLFFBQVEsTUFBTSx5QkFBeUIsS0FBSztBQUFBO0FBQUEsS0FFL0M7QUFBQSxJQUdELElBQUkscUJBQVEsU0FBUyxHQUFHO0FBQUEsTUFDdEIsVUFBVSxLQUFLLE9BQU8sUUFBUTtBQUFBLElBQ2hDO0FBQUEsSUFHQSxJQUFJLGtCQUFrQixDQUFDLFNBQVMsa0JBQWtCO0FBQUEsTUFDaEQsU0FBUyxlQUFlO0FBQUEsSUFDMUI7QUFBQTtBQUFBLEVBTUYsTUFBTSxjQUFjLENBQUMsTUFBcUM7QUFBQSxJQUN4RCxJQUFJLENBQUM7QUFBQSxNQUFXO0FBQUEsSUFFaEIsTUFBTSxRQUFRLGFBQWEsSUFBSSxFQUFFLFFBQVEsS0FBSztBQUFBLElBRTlDLFNBQVMsTUFBTTtBQUFBLElBQ2YsU0FBUyxNQUFNO0FBQUEsSUFDZixZQUFZLEtBQUssSUFBSTtBQUFBLElBQ3JCLFNBQVM7QUFBQTtBQUFBLEVBTVgsTUFBTSxZQUFZLENBQUMsTUFBcUM7QUFBQSxJQUN0RCxJQUFJLENBQUMsVUFBVSxDQUFDO0FBQUEsTUFBVztBQUFBLElBRTNCLE1BQU0sUUFDSixvQkFBb0IsS0FBSyxFQUFFLGVBQWUsU0FBUyxJQUMvQyxFQUFFLGVBQWUsS0FDaEI7QUFBQSxJQUVQLE1BQU0sT0FBTyxNQUFNO0FBQUEsSUFDbkIsTUFBTSxPQUFPLE1BQU07QUFBQSxJQUduQixNQUFNLFNBQVMsT0FBTztBQUFBLElBQ3RCLE1BQU0sU0FBUyxPQUFPO0FBQUEsSUFDdEIsTUFBTSxXQUFXLEtBQUssS0FBSyxTQUFTLFNBQVMsU0FBUyxNQUFNO0FBQUEsSUFHNUQsSUFBSSxXQUFXLHNCQUFzQjtBQUFBLE1BQ25DLFlBQVksR0FBRyxNQUFNLElBQUk7QUFBQSxJQUMzQjtBQUFBLElBRUEsU0FBUztBQUFBO0FBQUEsRUFNWCxNQUFNLGVBQWUsTUFBWTtBQUFBLElBQy9CLFNBQVM7QUFBQTtBQUFBLEVBSVgsTUFBTSxpQkFBZ0Q7QUFBQSxJQUNwRCxXQUFXO0FBQUEsSUFDWCxTQUFTO0FBQUEsSUFDVCxZQUFZO0FBQUEsSUFDWixZQUFZO0FBQUEsSUFDWixVQUFVO0FBQUEsSUFDVixhQUFhO0FBQUEsRUFDZjtBQUFBLEVBS0EsTUFBTSxzQkFBc0IsTUFBWTtBQUFBLElBQ3RDLE9BQU8sUUFBUSxjQUFjLEVBQUUsUUFBUSxFQUFFLE9BQU8sY0FBYztBQUFBLE1BQzVELFVBQVUsUUFBUSxpQkFBaUIsT0FBTyxVQUFVO0FBQUEsUUFDbEQsU0FBUyxDQUFDO0FBQUEsTUFDWixDQUFDO0FBQUEsS0FDRjtBQUFBO0FBQUEsRUFNSCxNQUFNLHVCQUF1QixNQUFZO0FBQUEsSUFDdkMsT0FBTyxRQUFRLGNBQWMsRUFBRSxRQUFRLEVBQUUsT0FBTyxjQUFjO0FBQUEsTUFDNUQsVUFBVSxRQUFRLG9CQUFvQixPQUFPLFFBQVE7QUFBQSxLQUN0RDtBQUFBO0FBQUEsRUFJSCxJQUFJLFdBQVc7QUFBQSxJQUNiLG9CQUFvQjtBQUFBLEVBQ3RCO0FBQUEsRUFHQSxJQUFJLDBCQUFhLFNBQVMsR0FBRztBQUFBLElBQzNCLE1BQU0sa0JBQWtCLFVBQVUsVUFBVTtBQUFBLElBRTVDLFVBQVUsVUFBVSxVQUFVLE1BQU07QUFBQSxNQUVsQyxxQkFBcUI7QUFBQSxNQUdyQixTQUFTLE1BQU07QUFBQSxNQUdmLGdCQUFnQixLQUFLLFVBQVUsU0FBUztBQUFBO0FBQUEsRUFFNUM7QUFBQSxFQUdBLE9BQU87QUFBQSxPQUNGO0FBQUEsSUFPSCxLQUFLLENBQUMsU0FBb0M7QUFBQSxNQUN4QyxTQUFTLElBQUksT0FBTztBQUFBLE1BQ3BCLE9BQU87QUFBQTtBQUFBLElBUVQsTUFBTSxDQUFDLFNBQW9DO0FBQUEsTUFDekMsU0FBUyxPQUFPLE9BQU87QUFBQSxNQUN2QixPQUFPO0FBQUE7QUFBQSxJQU9ULFNBQVMsR0FBRztBQUFBLE1BQ1YsSUFBSSxDQUFDLFdBQVc7QUFBQSxRQUNkLFlBQVk7QUFBQSxRQUNaLG9CQUFvQjtBQUFBLE1BQ3RCO0FBQUEsTUFDQSxPQUFPO0FBQUE7QUFBQSxJQU9ULFVBQVUsR0FBRztBQUFBLE1BQ1gsSUFBSSxXQUFXO0FBQUEsUUFDYixZQUFZO0FBQUEsUUFDWixxQkFBcUI7QUFBQSxNQUN2QjtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsRUFFWDtBQUFBOztBQ2hVa0MsSUFBdEM7QUEwSkEsU0FBUyxrQkFBaUIsQ0FBQyxRQUFnQixRQUFrQztBQUFBLEVBQzNFLElBQUksS0FBSyxJQUFJLE1BQU0sSUFBSSxLQUFLLElBQUksTUFBTSxHQUFHO0FBQUEsSUFDdkMsT0FBTyxTQUFTO0FBQUEsRUFDbEI7QUFBQSxFQUNBLE9BQU8sU0FBUztBQUFBO0FBd0JYLElBQU0sbUJBQ1gsQ0FBQyxTQUE2QixDQUFDLE1BQy9CLENBQTZCLGNBQTRDO0FBQUEsRUFDdkUsSUFBSSxDQUFDLFVBQVUsU0FBUztBQUFBLElBQ3RCLFFBQVEsS0FBSyx1REFBdUQ7QUFBQSxJQUNwRSxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBR0E7QUFBQSxJQUNFLGlCQUFpQjtBQUFBLElBQ2pCLHFCQUFxQjtBQUFBLElBQ3JCLGlCQUFpQjtBQUFBLElBQ2pCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1I7QUFBQSxFQUdKLE1BQU0sV0FBVztBQUFBLElBQ2YsT0FBTyxJQUFJO0FBQUEsSUFDWCxXQUFXLElBQUk7QUFBQSxJQUNmLFlBQVksSUFBSTtBQUFBLElBQ2hCLFNBQVMsSUFBSTtBQUFBLElBQ2IsV0FBVyxJQUFJO0FBQUEsRUFDakI7QUFBQSxFQUdBLElBQUk7QUFBQSxJQUFTLFNBQVMsTUFBTSxJQUFJLE9BQXNDO0FBQUEsRUFDdEUsSUFBSTtBQUFBLElBQ0YsU0FBUyxVQUFVLElBQUksV0FBMEM7QUFBQSxFQUNuRSxJQUFJO0FBQUEsSUFDRixTQUFTLFdBQVcsSUFBSSxZQUEyQztBQUFBLEVBQ3JFLElBQUk7QUFBQSxJQUNGLFNBQVMsUUFBUSxJQUFJLFNBQXdDO0FBQUEsRUFDL0QsSUFBSTtBQUFBLElBQ0YsU0FBUyxVQUFVLElBQUksV0FBMEM7QUFBQSxFQUduRSxJQUFJLFNBQVM7QUFBQSxFQUNiLElBQUksU0FBUztBQUFBLEVBQ2IsSUFBSSxTQUFTO0FBQUEsRUFDYixJQUFJLFlBQVk7QUFBQSxFQUNoQixJQUFJLFlBQVk7QUFBQSxFQUtoQixNQUFNLGdCQUFnQixDQUNwQixHQUNBLE1BQ0EsU0FDUztBQUFBLElBQ1QsTUFBTSxTQUFTLE9BQU87QUFBQSxJQUN0QixNQUFNLFNBQVMsT0FBTztBQUFBLElBQ3RCLE1BQU0sV0FBVyxLQUFLLEtBQUssU0FBUyxTQUFTLFNBQVMsTUFBTTtBQUFBLElBQzVELE1BQU0sVUFBVSxLQUFLLElBQUk7QUFBQSxJQUN6QixNQUFNLFdBQVcsVUFBVTtBQUFBLElBQzNCLE1BQU0sV0FBVyxXQUFXO0FBQUEsSUFDNUIsTUFBTSxZQUFZLG1CQUFrQixRQUFRLE1BQU07QUFBQSxJQUdsRCxNQUFNLGFBQXlCO0FBQUEsTUFDN0IsTUFBTTtBQUFBLE1BQ04sZUFBZTtBQUFBLE1BQ2YsUUFBUSxFQUFFO0FBQUEsTUFDVjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxrQkFBa0I7QUFBQSxNQUNsQixnQkFBZ0IsTUFBTTtBQUFBLFFBQ3BCLFdBQVcsbUJBQW1CO0FBQUEsUUFDOUIsSUFBSSxFQUFFLFlBQVk7QUFBQSxVQUNoQixFQUFFLGVBQWU7QUFBQSxRQUNuQjtBQUFBO0FBQUEsTUFFRixpQkFBaUIsTUFBTTtBQUFBLFFBQ3JCLEVBQUUsZ0JBQWdCO0FBQUE7QUFBQSxNQUVwQjtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLElBR0EsU0FBUyxNQUFNLFFBQVEsQ0FBQyxZQUFZO0FBQUEsTUFDbEMsSUFBSTtBQUFBLFFBQ0YsUUFBUSxVQUFVO0FBQUEsUUFDbEIsT0FBTyxPQUFPO0FBQUEsUUFDZCxRQUFRLE1BQU0sMkJBQTJCLEtBQUs7QUFBQTtBQUFBLEtBRWpEO0FBQUEsSUFHRCxNQUFNLGVBQWUsUUFBUTtBQUFBLElBQzdCLFNBQVMsY0FBYyxRQUFRLENBQUMsWUFBWTtBQUFBLE1BQzFDLElBQUk7QUFBQSxRQUNGLFFBQVEsS0FBSyxZQUFZLE1BQU0sYUFBYSxDQUFlO0FBQUEsUUFDM0QsT0FBTyxPQUFPO0FBQUEsUUFDZCxRQUFRLE1BQU0sWUFBWSx5QkFBeUIsS0FBSztBQUFBO0FBQUEsS0FFM0Q7QUFBQSxJQUdELElBQUkscUJBQVEsU0FBUyxHQUFHO0FBQUEsTUFDdEIsVUFBVSxLQUFLLFNBQVMsVUFBVTtBQUFBLE1BQ2xDLFVBQVUsS0FBSyxjQUFjLFVBQVU7QUFBQSxJQUN6QztBQUFBLElBR0EsSUFBSSxrQkFBa0IsQ0FBQyxXQUFXLGtCQUFrQjtBQUFBLE1BQ2xELFdBQVcsZUFBZTtBQUFBLElBQzVCO0FBQUE7QUFBQSxFQU1GLE1BQU0sY0FBYyxDQUFDLE1BQXFDO0FBQUEsSUFDeEQsSUFBSSxDQUFDO0FBQUEsTUFBVztBQUFBLElBRWhCLE1BQU0sUUFBUSxhQUFhLElBQUksRUFBRSxRQUFRLEtBQUs7QUFBQSxJQUU5QyxTQUFTLE1BQU07QUFBQSxJQUNmLFNBQVMsTUFBTTtBQUFBLElBQ2YsWUFBWSxLQUFLLElBQUk7QUFBQSxJQUNyQixTQUFTO0FBQUE7QUFBQSxFQU1YLE1BQU0sWUFBWSxDQUFDLE1BQXFDO0FBQUEsSUFDdEQsSUFBSSxDQUFDLFVBQVUsQ0FBQztBQUFBLE1BQVc7QUFBQSxJQUUzQixNQUFNLFFBQ0osb0JBQW9CLEtBQUssRUFBRSxlQUFlLFNBQVMsSUFDL0MsRUFBRSxlQUFlLEtBQ2hCO0FBQUEsSUFFUCxNQUFNLE9BQU8sTUFBTTtBQUFBLElBQ25CLE1BQU0sT0FBTyxNQUFNO0FBQUEsSUFHbkIsTUFBTSxTQUFTLE9BQU87QUFBQSxJQUN0QixNQUFNLFNBQVMsT0FBTztBQUFBLElBQ3RCLE1BQU0sV0FBVyxLQUFLLEtBQUssU0FBUyxTQUFTLFNBQVMsTUFBTTtBQUFBLElBQzVELE1BQU0sV0FBVyxLQUFLLElBQUksSUFBSTtBQUFBLElBRzlCLElBQUksWUFBWSxrQkFBa0IsWUFBWSxvQkFBb0I7QUFBQSxNQUNoRSxjQUFjLEdBQUcsTUFBTSxJQUFJO0FBQUEsSUFDN0I7QUFBQSxJQUVBLFNBQVM7QUFBQTtBQUFBLEVBTVgsTUFBTSxlQUFlLE1BQVk7QUFBQSxJQUMvQixTQUFTO0FBQUE7QUFBQSxFQUlYLE1BQU0saUJBQWdEO0FBQUEsSUFDcEQsV0FBVztBQUFBLElBQ1gsU0FBUztBQUFBLElBQ1QsWUFBWTtBQUFBLElBQ1osWUFBWTtBQUFBLElBQ1osVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLEVBQ2Y7QUFBQSxFQUtBLE1BQU0sc0JBQXNCLE1BQVk7QUFBQSxJQUN0QyxPQUFPLFFBQVEsY0FBYyxFQUFFLFFBQVEsRUFBRSxPQUFPLGNBQWM7QUFBQSxNQUM1RCxVQUFVLFFBQVEsaUJBQWlCLE9BQU8sVUFBVTtBQUFBLFFBQ2xELFNBQVMsQ0FBQztBQUFBLE1BQ1osQ0FBQztBQUFBLEtBQ0Y7QUFBQTtBQUFBLEVBTUgsTUFBTSx1QkFBdUIsTUFBWTtBQUFBLElBQ3ZDLE9BQU8sUUFBUSxjQUFjLEVBQUUsUUFBUSxFQUFFLE9BQU8sY0FBYztBQUFBLE1BQzVELFVBQVUsUUFBUSxvQkFBb0IsT0FBTyxRQUFRO0FBQUEsS0FDdEQ7QUFBQTtBQUFBLEVBSUgsSUFBSSxXQUFXO0FBQUEsSUFDYixvQkFBb0I7QUFBQSxFQUN0QjtBQUFBLEVBR0EsSUFBSSwwQkFBYSxTQUFTLEdBQUc7QUFBQSxJQUMzQixNQUFNLGtCQUFrQixVQUFVLFVBQVU7QUFBQSxJQUU1QyxVQUFVLFVBQVUsVUFBVSxNQUFNO0FBQUEsTUFFbEMscUJBQXFCO0FBQUEsTUFHckIsT0FBTyxPQUFPLFFBQVEsRUFBRSxRQUFRLENBQUMsZUFBZSxXQUFXLE1BQU0sQ0FBQztBQUFBLE1BR2xFLGdCQUFnQixLQUFLLFVBQVUsU0FBUztBQUFBO0FBQUEsRUFFNUM7QUFBQSxFQUdBLE9BQU87QUFBQSxPQUNGO0FBQUEsSUFHSCxPQUFPLENBQUMsU0FBc0M7QUFBQSxNQUM1QyxTQUFTLE1BQU0sSUFBSSxPQUFPO0FBQUEsTUFDMUIsT0FBTztBQUFBO0FBQUEsSUFHVCxXQUFXLENBQUMsU0FBc0M7QUFBQSxNQUNoRCxTQUFTLFVBQVUsSUFBSSxPQUFPO0FBQUEsTUFDOUIsT0FBTztBQUFBO0FBQUEsSUFHVCxZQUFZLENBQUMsU0FBc0M7QUFBQSxNQUNqRCxTQUFTLFdBQVcsSUFBSSxPQUFPO0FBQUEsTUFDL0IsT0FBTztBQUFBO0FBQUEsSUFHVCxTQUFTLENBQUMsU0FBc0M7QUFBQSxNQUM5QyxTQUFTLFFBQVEsSUFBSSxPQUFPO0FBQUEsTUFDNUIsT0FBTztBQUFBO0FBQUEsSUFHVCxXQUFXLENBQUMsU0FBc0M7QUFBQSxNQUNoRCxTQUFTLFVBQVUsSUFBSSxPQUFPO0FBQUEsTUFDOUIsT0FBTztBQUFBO0FBQUEsSUFJVCxRQUFRLENBQUMsU0FBc0M7QUFBQSxNQUM3QyxTQUFTLE1BQU0sT0FBTyxPQUFPO0FBQUEsTUFDN0IsT0FBTztBQUFBO0FBQUEsSUFHVCxZQUFZLENBQUMsU0FBc0M7QUFBQSxNQUNqRCxTQUFTLFVBQVUsT0FBTyxPQUFPO0FBQUEsTUFDakMsT0FBTztBQUFBO0FBQUEsSUFHVCxhQUFhLENBQUMsU0FBc0M7QUFBQSxNQUNsRCxTQUFTLFdBQVcsT0FBTyxPQUFPO0FBQUEsTUFDbEMsT0FBTztBQUFBO0FBQUEsSUFHVCxVQUFVLENBQUMsU0FBc0M7QUFBQSxNQUMvQyxTQUFTLFFBQVEsT0FBTyxPQUFPO0FBQUEsTUFDL0IsT0FBTztBQUFBO0FBQUEsSUFHVCxZQUFZLENBQUMsU0FBc0M7QUFBQSxNQUNqRCxTQUFTLFVBQVUsT0FBTyxPQUFPO0FBQUEsTUFDakMsT0FBTztBQUFBO0FBQUEsSUFJVCxXQUFXLEdBQUc7QUFBQSxNQUNaLElBQUksQ0FBQyxXQUFXO0FBQUEsUUFDZCxZQUFZO0FBQUEsUUFDWixvQkFBb0I7QUFBQSxNQUN0QjtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsSUFHVCxZQUFZLEdBQUc7QUFBQSxNQUNiLElBQUksV0FBVztBQUFBLFFBQ2IsWUFBWTtBQUFBLFFBQ1oscUJBQXFCO0FBQUEsTUFDdkI7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLEVBRVg7QUFBQTs7QUNsZWtDLElBQXRDO0FBOEZPLElBQU0sdUJBQ1gsQ0FBQyxTQUFpQyxDQUFDLE1BQ25DLENBQTZCLGNBQWdEO0FBQUEsRUFDM0UsSUFBSSxDQUFDLFVBQVUsU0FBUztBQUFBLElBQ3RCLFFBQVEsS0FDTiw0REFDRjtBQUFBLElBQ0EsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUdBO0FBQUEsSUFDRSxnQkFBZ0I7QUFBQSxJQUNoQixnQkFBZ0I7QUFBQSxJQUNoQixpQkFBaUI7QUFBQSxJQUNqQjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1I7QUFBQSxFQUdKLE1BQU0sV0FBaUQsSUFBSTtBQUFBLEVBRzNELElBQUksYUFBYTtBQUFBLElBQ2YsU0FBUyxJQUFJLFdBQThDO0FBQUEsRUFDN0Q7QUFBQSxFQUdBLElBQUksU0FBUztBQUFBLEVBQ2IsSUFBSSxTQUFTO0FBQUEsRUFDYixJQUFJLFdBQVc7QUFBQSxFQUNmLElBQUksV0FBVztBQUFBLEVBQ2YsSUFBSSxTQUFTO0FBQUEsRUFDYixJQUFJLFlBQVk7QUFBQSxFQUNoQixJQUFJLGlCQUFnQztBQUFBLEVBQ3BDLElBQUksWUFBWTtBQUFBLEVBS2hCLE1BQU0sb0JBQW9CLENBQUMsTUFBcUM7QUFBQSxJQUU5RCxNQUFNLGlCQUFpQztBQUFBLE1BQ3JDLE1BQU07QUFBQSxNQUNOLGVBQWU7QUFBQSxNQUNmLFFBQVEsRUFBRTtBQUFBLE1BQ1Y7QUFBQSxNQUNBLFNBQVMsS0FBSyxJQUFJO0FBQUEsTUFDbEIsVUFBVSxLQUFLLElBQUksSUFBSTtBQUFBLE1BQ3ZCLGtCQUFrQjtBQUFBLE1BQ2xCLGdCQUFnQixNQUFNO0FBQUEsUUFDcEIsZUFBZSxtQkFBbUI7QUFBQSxRQUNsQyxJQUFJLEVBQUUsWUFBWTtBQUFBLFVBQ2hCLEVBQUUsZUFBZTtBQUFBLFFBQ25CO0FBQUE7QUFBQSxNQUVGLGlCQUFpQixNQUFNO0FBQUEsUUFDckIsRUFBRSxnQkFBZ0I7QUFBQTtBQUFBLE1BRXBCLEdBQUc7QUFBQSxNQUNILEdBQUc7QUFBQSxJQUNMO0FBQUEsSUFHQSxTQUFTLFFBQVEsQ0FBQyxZQUFZO0FBQUEsTUFDNUIsSUFBSTtBQUFBLFFBQ0YsUUFBUSxjQUFjO0FBQUEsUUFDdEIsT0FBTyxPQUFPO0FBQUEsUUFDZCxRQUFRLE1BQU0sZ0NBQWdDLEtBQUs7QUFBQTtBQUFBLEtBRXREO0FBQUEsSUFHRCxJQUFJLHFCQUFRLFNBQVMsR0FBRztBQUFBLE1BQ3RCLFVBQVUsS0FBSyxhQUFhLGNBQWM7QUFBQSxJQUM1QztBQUFBLElBR0EsSUFBSSxrQkFBa0IsQ0FBQyxlQUFlLGtCQUFrQjtBQUFBLE1BQ3RELGVBQWUsZUFBZTtBQUFBLElBQ2hDO0FBQUE7QUFBQSxFQU1GLE1BQU0sY0FBYyxDQUFDLE1BQXFDO0FBQUEsSUFDeEQsSUFBSSxDQUFDO0FBQUEsTUFBVztBQUFBLElBRWhCLE1BQU0sUUFBUSxhQUFhLElBQUksRUFBRSxRQUFRLEtBQUs7QUFBQSxJQUU5QyxTQUFTLFdBQVcsTUFBTTtBQUFBLElBQzFCLFNBQVMsV0FBVyxNQUFNO0FBQUEsSUFDMUIsWUFBWSxLQUFLLElBQUk7QUFBQSxJQUNyQixTQUFTO0FBQUEsSUFHVCxJQUFJLG1CQUFtQixNQUFNO0FBQUEsTUFDM0IsT0FBTyxhQUFhLGNBQWM7QUFBQSxJQUNwQztBQUFBLElBR0EsaUJBQWlCLE9BQU8sV0FBVyxNQUFNO0FBQUEsTUFDdkMsSUFBSSxRQUFRO0FBQUEsUUFFVixNQUFNLFNBQVMsV0FBVztBQUFBLFFBQzFCLE1BQU0sU0FBUyxXQUFXO0FBQUEsUUFDMUIsTUFBTSxXQUFXLEtBQUssS0FBSyxTQUFTLFNBQVMsU0FBUyxNQUFNO0FBQUEsUUFFNUQsSUFBSSxXQUFXLGVBQWU7QUFBQSxVQUM1QixrQkFBa0IsQ0FBQztBQUFBLFFBQ3JCO0FBQUEsTUFDRjtBQUFBLE1BRUEsaUJBQWlCO0FBQUEsT0FDaEIsYUFBYTtBQUFBO0FBQUEsRUFNbEIsTUFBTSxhQUFhLENBQUMsTUFBcUM7QUFBQSxJQUN2RCxJQUFJLENBQUMsVUFBVSxDQUFDO0FBQUEsTUFBVztBQUFBLElBRTNCLE1BQU0sUUFBUSxhQUFhLElBQUksRUFBRSxRQUFRLEtBQUs7QUFBQSxJQUU5QyxXQUFXLE1BQU07QUFBQSxJQUNqQixXQUFXLE1BQU07QUFBQSxJQUdqQixNQUFNLFNBQVMsV0FBVztBQUFBLElBQzFCLE1BQU0sU0FBUyxXQUFXO0FBQUEsSUFDMUIsTUFBTSxXQUFXLEtBQUssS0FBSyxTQUFTLFNBQVMsU0FBUyxNQUFNO0FBQUEsSUFFNUQsSUFBSSxXQUFXLGVBQWU7QUFBQSxNQUU1QixJQUFJLG1CQUFtQixNQUFNO0FBQUEsUUFDM0IsT0FBTyxhQUFhLGNBQWM7QUFBQSxRQUNsQyxpQkFBaUI7QUFBQSxNQUNuQjtBQUFBLElBQ0Y7QUFBQTtBQUFBLEVBTUYsTUFBTSxZQUFZLE1BQVk7QUFBQSxJQUM1QixJQUFJLG1CQUFtQixNQUFNO0FBQUEsTUFDM0IsT0FBTyxhQUFhLGNBQWM7QUFBQSxNQUNsQyxpQkFBaUI7QUFBQSxJQUNuQjtBQUFBLElBRUEsU0FBUztBQUFBO0FBQUEsRUFNWCxNQUFNLGVBQWUsTUFBWTtBQUFBLElBQy9CLElBQUksbUJBQW1CLE1BQU07QUFBQSxNQUMzQixPQUFPLGFBQWEsY0FBYztBQUFBLE1BQ2xDLGlCQUFpQjtBQUFBLElBQ25CO0FBQUEsSUFFQSxTQUFTO0FBQUE7QUFBQSxFQUlYLE1BQU0saUJBQWdEO0FBQUEsSUFDcEQsV0FBVztBQUFBLElBQ1gsV0FBVztBQUFBLElBQ1gsU0FBUztBQUFBLElBQ1QsWUFBWTtBQUFBLElBQ1osWUFBWTtBQUFBLElBQ1osV0FBVztBQUFBLElBQ1gsVUFBVTtBQUFBLElBQ1YsYUFBYTtBQUFBLEVBQ2Y7QUFBQSxFQUtBLE1BQU0sc0JBQXNCLE1BQVk7QUFBQSxJQUN0QyxPQUFPLFFBQVEsY0FBYyxFQUFFLFFBQVEsRUFBRSxPQUFPLGNBQWM7QUFBQSxNQUM1RCxVQUFVLFFBQVEsaUJBQWlCLE9BQU8sVUFBVTtBQUFBLFFBQ2xELFNBQVMsQ0FBQztBQUFBLE1BQ1osQ0FBQztBQUFBLEtBQ0Y7QUFBQTtBQUFBLEVBTUgsTUFBTSx1QkFBdUIsTUFBWTtBQUFBLElBQ3ZDLE9BQU8sUUFBUSxjQUFjLEVBQUUsUUFBUSxFQUFFLE9BQU8sY0FBYztBQUFBLE1BQzVELFVBQVUsUUFBUSxvQkFBb0IsT0FBTyxRQUFRO0FBQUEsS0FDdEQ7QUFBQTtBQUFBLEVBSUgsSUFBSSxXQUFXO0FBQUEsSUFDYixvQkFBb0I7QUFBQSxFQUN0QjtBQUFBLEVBR0EsSUFBSSwwQkFBYSxTQUFTLEdBQUc7QUFBQSxJQUMzQixNQUFNLGtCQUFrQixVQUFVLFVBQVU7QUFBQSxJQUU1QyxVQUFVLFVBQVUsVUFBVSxNQUFNO0FBQUEsTUFFbEMscUJBQXFCO0FBQUEsTUFHckIsSUFBSSxtQkFBbUIsTUFBTTtBQUFBLFFBQzNCLE9BQU8sYUFBYSxjQUFjO0FBQUEsUUFDbEMsaUJBQWlCO0FBQUEsTUFDbkI7QUFBQSxNQUdBLFNBQVMsTUFBTTtBQUFBLE1BR2YsZ0JBQWdCLEtBQUssVUFBVSxTQUFTO0FBQUE7QUFBQSxFQUU1QztBQUFBLEVBR0EsT0FBTztBQUFBLE9BQ0Y7QUFBQSxJQU9ILFdBQVcsQ0FBQyxTQUEwQztBQUFBLE1BQ3BELFNBQVMsSUFBSSxPQUFPO0FBQUEsTUFDcEIsT0FBTztBQUFBO0FBQUEsSUFRVCxZQUFZLENBQUMsU0FBMEM7QUFBQSxNQUNyRCxTQUFTLE9BQU8sT0FBTztBQUFBLE1BQ3ZCLE9BQU87QUFBQTtBQUFBLElBT1QsZUFBZSxHQUFHO0FBQUEsTUFDaEIsSUFBSSxDQUFDLFdBQVc7QUFBQSxRQUNkLFlBQVk7QUFBQSxRQUNaLG9CQUFvQjtBQUFBLE1BQ3RCO0FBQUEsTUFDQSxPQUFPO0FBQUE7QUFBQSxJQU9ULGdCQUFnQixHQUFHO0FBQUEsTUFDakIsSUFBSSxXQUFXO0FBQUEsUUFDYixZQUFZO0FBQUEsUUFDWixxQkFBcUI7QUFBQSxRQUdyQixJQUFJLG1CQUFtQixNQUFNO0FBQUEsVUFDM0IsT0FBTyxhQUFhLGNBQWM7QUFBQSxVQUNsQyxpQkFBaUI7QUFBQSxRQUNuQjtBQUFBLE1BQ0Y7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLEVBRVg7QUFBQTs7QUNyWGtDLElBQXRDO0FBNEhPLElBQU0saUJBQ1gsQ0FBQyxTQUEyQixDQUFDLE1BQzdCLENBQTZCLGNBQTBDO0FBQUEsRUFDckUsSUFBSSxDQUFDLFVBQVUsU0FBUztBQUFBLElBQ3RCLFFBQVEsS0FBSyxxREFBcUQ7QUFBQSxJQUNsRSxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBR0E7QUFBQSxJQUNFLGlCQUFpQjtBQUFBLElBQ2pCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBLFVBQVU7QUFBQSxNQUNSO0FBQUEsRUFHSixNQUFNLFdBQVc7QUFBQSxJQUNmLFVBQVUsSUFBSTtBQUFBLElBQ2QsS0FBSyxJQUFJO0FBQUEsSUFDVCxRQUFRLElBQUk7QUFBQSxFQUNkO0FBQUEsRUFHQSxJQUFJO0FBQUEsSUFDRixTQUFTLFNBQVMsSUFBSSxVQUF1QztBQUFBLEVBQy9ELElBQUk7QUFBQSxJQUFPLFNBQVMsSUFBSSxJQUFJLEtBQWtDO0FBQUEsRUFDOUQsSUFBSTtBQUFBLElBQVUsU0FBUyxPQUFPLElBQUksUUFBcUM7QUFBQSxFQUd2RSxJQUFJLFNBQVM7QUFBQSxFQUNiLElBQUksU0FBUztBQUFBLEVBQ2IsSUFBSSxRQUFRO0FBQUEsRUFDWixJQUFJLFFBQVE7QUFBQSxFQUNaLElBQUksV0FBVztBQUFBLEVBQ2YsSUFBSSxXQUFXO0FBQUEsRUFDZixJQUFJLFNBQVM7QUFBQSxFQUNiLElBQUksWUFBWTtBQUFBLEVBQ2hCLElBQUksWUFBWTtBQUFBLEVBQ2hCLElBQUksWUFBWTtBQUFBLEVBS2hCLE1BQU0saUJBQWlCLENBQ3JCLEdBQ0EsU0FDcUI7QUFBQSxJQUNyQixNQUFNLFFBQTBCO0FBQUEsTUFDOUI7QUFBQSxNQUNBLGVBQWU7QUFBQSxNQUNmLFFBQVEsRUFBRTtBQUFBLE1BQ1Y7QUFBQSxNQUNBLFNBQVMsS0FBSyxJQUFJO0FBQUEsTUFDbEIsVUFBVSxLQUFLLElBQUksSUFBSTtBQUFBLE1BQ3ZCLGtCQUFrQjtBQUFBLE1BQ2xCLGdCQUFnQixNQUFNO0FBQUEsUUFDcEIsTUFBTSxtQkFBbUI7QUFBQSxRQUN6QixJQUFJLEVBQUUsWUFBWTtBQUFBLFVBQ2hCLEVBQUUsZUFBZTtBQUFBLFFBQ25CO0FBQUE7QUFBQSxNQUVGLGlCQUFpQixNQUFNO0FBQUEsUUFDckIsRUFBRSxnQkFBZ0I7QUFBQTtBQUFBLE1BRXBCLFFBQVEsV0FBVztBQUFBLE1BQ25CLFFBQVEsV0FBVztBQUFBLE1BQ25CO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsSUFDRjtBQUFBLElBQ0EsT0FBTztBQUFBO0FBQUEsRUFNVCxNQUFNLGNBQWMsQ0FDbEIsR0FDQSxTQUNTO0FBQUEsSUFDVCxNQUFNLG1CQUFtQixlQUFlLEdBQUcsSUFBSTtBQUFBLElBRy9DLFNBQVMsTUFBTSxRQUFRLENBQUMsWUFBWTtBQUFBLE1BQ2xDLElBQUk7QUFBQSxRQUVGLFFBQVEsZ0JBQXVDO0FBQUEsUUFDL0MsT0FBTyxPQUFPO0FBQUEsUUFDZCxRQUFRLE1BQU0sWUFBWSxpQkFBaUIsS0FBSztBQUFBO0FBQUEsS0FFbkQ7QUFBQSxJQUdELElBQUkscUJBQVEsU0FBUyxHQUFHO0FBQUEsTUFDdEIsVUFBVSxLQUFLLE1BQU0sZ0JBQWdCO0FBQUEsSUFDdkM7QUFBQSxJQUdBLElBQUksa0JBQWtCLENBQUMsaUJBQWlCLGtCQUFrQjtBQUFBLE1BQ3hELGlCQUFpQixlQUFlO0FBQUEsSUFDbEM7QUFBQTtBQUFBLEVBTUYsTUFBTSxjQUFjLENBQUMsTUFBcUM7QUFBQSxJQUN4RCxJQUFJLENBQUM7QUFBQSxNQUFXO0FBQUEsSUFFaEIsTUFBTSxRQUFRLGFBQWEsSUFBSSxFQUFFLFFBQVEsS0FBSztBQUFBLElBRTlDLFNBQVMsUUFBUSxXQUFXLE1BQU07QUFBQSxJQUNsQyxTQUFTLFFBQVEsV0FBVyxNQUFNO0FBQUEsSUFDbEMsWUFBWSxLQUFLLElBQUk7QUFBQSxJQUNyQixTQUFTO0FBQUEsSUFDVCxZQUFZO0FBQUE7QUFBQSxFQU1kLE1BQU0sYUFBYSxDQUFDLE1BQXFDO0FBQUEsSUFDdkQsSUFBSSxDQUFDLFVBQVUsQ0FBQztBQUFBLE1BQVc7QUFBQSxJQUUzQixNQUFNLFFBQVEsYUFBYSxJQUFJLEVBQUUsUUFBUSxLQUFLO0FBQUEsSUFHOUMsUUFBUTtBQUFBLElBQ1IsUUFBUTtBQUFBLElBQ1IsV0FBVyxNQUFNO0FBQUEsSUFDakIsV0FBVyxNQUFNO0FBQUEsSUFHakIsTUFBTSxhQUFhLFdBQVc7QUFBQSxJQUM5QixNQUFNLGFBQWEsV0FBVztBQUFBLElBQzlCLE1BQU0sWUFBWSxLQUFLLEtBQ3JCLGFBQWEsYUFBYSxhQUFhLFVBQ3pDO0FBQUEsSUFHQSxJQUFJLFlBQVksR0FBRztBQUFBLE1BRWpCLElBQUksQ0FBQyxXQUFXO0FBQUEsUUFDZCxZQUFZO0FBQUEsUUFDWixZQUFZLEdBQUcsVUFBVTtBQUFBLE1BQzNCO0FBQUEsTUFHQSxZQUFZLEdBQUcsS0FBSztBQUFBLElBQ3RCO0FBQUE7QUFBQSxFQU1GLE1BQU0sWUFBWSxDQUFDLE1BQXFDO0FBQUEsSUFDdEQsSUFBSSxDQUFDLFVBQVUsQ0FBQztBQUFBLE1BQVc7QUFBQSxJQUczQixJQUFJLFdBQVc7QUFBQSxNQUNiLFlBQVksR0FBRyxRQUFRO0FBQUEsSUFDekI7QUFBQSxJQUVBLFNBQVM7QUFBQSxJQUNULFlBQVk7QUFBQTtBQUFBLEVBTWQsTUFBTSxlQUFlLENBQUMsTUFBcUM7QUFBQSxJQUN6RCxJQUFJLENBQUMsVUFBVSxDQUFDO0FBQUEsTUFBVztBQUFBLElBRzNCLElBQUksV0FBVztBQUFBLE1BQ2IsWUFBWSxHQUFHLFFBQVE7QUFBQSxJQUN6QjtBQUFBLElBRUEsU0FBUztBQUFBLElBQ1QsWUFBWTtBQUFBO0FBQUEsRUFJZCxNQUFNLGlCQUFnRDtBQUFBLElBQ3BELFdBQVc7QUFBQSxJQUNYLFdBQVc7QUFBQSxJQUNYLFNBQVM7QUFBQSxJQUNULFlBQVk7QUFBQSxJQUNaLFlBQVk7QUFBQSxJQUNaLFdBQVc7QUFBQSxJQUNYLFVBQVU7QUFBQSxJQUNWLGFBQWE7QUFBQSxFQUNmO0FBQUEsRUFLQSxNQUFNLHNCQUFzQixNQUFZO0FBQUEsSUFDdEMsT0FBTyxRQUFRLGNBQWMsRUFBRSxRQUFRLEVBQUUsT0FBTyxjQUFjO0FBQUEsTUFDNUQsVUFBVSxRQUFRLGlCQUFpQixPQUFPLFVBQVU7QUFBQSxRQUNsRCxTQUFTLENBQUM7QUFBQSxNQUNaLENBQUM7QUFBQSxLQUNGO0FBQUE7QUFBQSxFQU1ILE1BQU0sdUJBQXVCLE1BQVk7QUFBQSxJQUN2QyxPQUFPLFFBQVEsY0FBYyxFQUFFLFFBQVEsRUFBRSxPQUFPLGNBQWM7QUFBQSxNQUM1RCxVQUFVLFFBQVEsb0JBQW9CLE9BQU8sUUFBUTtBQUFBLEtBQ3REO0FBQUE7QUFBQSxFQUlILElBQUksV0FBVztBQUFBLElBQ2Isb0JBQW9CO0FBQUEsRUFDdEI7QUFBQSxFQUdBLElBQUksMEJBQWEsU0FBUyxHQUFHO0FBQUEsSUFDM0IsTUFBTSxrQkFBa0IsVUFBVSxVQUFVO0FBQUEsSUFFNUMsVUFBVSxVQUFVLFVBQVUsTUFBTTtBQUFBLE1BRWxDLHFCQUFxQjtBQUFBLE1BR3JCLE9BQU8sT0FBTyxRQUFRLEVBQUUsUUFBUSxDQUFDLGVBQWUsV0FBVyxNQUFNLENBQUM7QUFBQSxNQUdsRSxnQkFBZ0IsS0FBSyxVQUFVLFNBQVM7QUFBQTtBQUFBLEVBRTVDO0FBQUEsRUFHQSxPQUFPO0FBQUEsT0FDRjtBQUFBLElBR0gsVUFBVSxDQUFDLFNBQW9DO0FBQUEsTUFDN0MsU0FBUyxTQUFTLElBQUksT0FBTztBQUFBLE1BQzdCLE9BQU87QUFBQTtBQUFBLElBR1QsS0FBSyxDQUFDLFNBQW9DO0FBQUEsTUFDeEMsU0FBUyxJQUFJLElBQUksT0FBTztBQUFBLE1BQ3hCLE9BQU87QUFBQTtBQUFBLElBR1QsUUFBUSxDQUFDLFNBQW9DO0FBQUEsTUFDM0MsU0FBUyxPQUFPLElBQUksT0FBTztBQUFBLE1BQzNCLE9BQU87QUFBQTtBQUFBLElBSVQsV0FBVyxDQUFDLFNBQW9DO0FBQUEsTUFDOUMsU0FBUyxTQUFTLE9BQU8sT0FBTztBQUFBLE1BQ2hDLE9BQU87QUFBQTtBQUFBLElBR1QsTUFBTSxDQUFDLFNBQW9DO0FBQUEsTUFDekMsU0FBUyxJQUFJLE9BQU8sT0FBTztBQUFBLE1BQzNCLE9BQU87QUFBQTtBQUFBLElBR1QsU0FBUyxDQUFDLFNBQW9DO0FBQUEsTUFDNUMsU0FBUyxPQUFPLE9BQU8sT0FBTztBQUFBLE1BQzlCLE9BQU87QUFBQTtBQUFBLElBSVQsU0FBUyxHQUFHO0FBQUEsTUFDVixJQUFJLENBQUMsV0FBVztBQUFBLFFBQ2QsWUFBWTtBQUFBLFFBQ1osb0JBQW9CO0FBQUEsTUFDdEI7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLElBR1QsVUFBVSxHQUFHO0FBQUEsTUFDWCxJQUFJLFdBQVc7QUFBQSxRQUNiLFlBQVk7QUFBQSxRQUNaLHFCQUFxQjtBQUFBLE1BQ3ZCO0FBQUEsTUFDQSxPQUFPO0FBQUE7QUFBQSxFQUVYO0FBQUE7O0FDelVKLE1BQU0sYUFBYTtBQUFBLEVBQ1QsT0FBMkIsQ0FBQztBQUFBLEVBQzVCLFVBQVU7QUFBQSxFQUVsQixHQUFHLEdBQXFCO0FBQUEsSUFDdEIsT0FBTyxLQUFLLEtBQUssSUFBSSxLQUFLLFNBQVMsdUJBQXVCO0FBQUE7QUFBQSxFQUc1RCxPQUFPLENBQUMsVUFBa0M7QUFBQSxJQUN4QyxJQUFJLEtBQUssS0FBSyxTQUFTLEtBQUssV0FBVyxTQUFTLFdBQVcsV0FBVyxHQUFHO0FBQUEsTUFDdkUsS0FBSyxLQUFLLEtBQUssUUFBUTtBQUFBLElBQ3pCO0FBQUE7QUFBQSxFQUdGLEtBQUssR0FBUztBQUFBLElBQ1osS0FBSyxLQUFLLFNBQVM7QUFBQTtBQUV2QjtBQUVBLElBQU0sZUFBZSxJQUFJO0FBTXpCLElBQU0sYUFBYSxJQUFJO0FBR3ZCLElBQU0sU0FBUztBQUNmLElBQU0sbUJBQW1CLEdBQUc7QUFNNUIsU0FBUyxrQkFBa0IsQ0FDekIsTUFDQSxVQUNBLE9BQ1E7QUFBQSxFQUNSLE1BQU0sTUFBTSxHQUFHLFFBQVEsWUFBWTtBQUFBLEVBQ25DLElBQUksQ0FBQyxXQUFXLElBQUksR0FBRyxHQUFHO0FBQUEsSUFDeEIsSUFBSSxTQUFTLFFBQVE7QUFBQSxNQUNuQixXQUFXLElBQ1QsS0FDQSxhQUFhLEtBQ1QsaUJBQWlCLFVBQ2pCLGlCQUFpQixZQUFZLE9BQ25DO0FBQUEsSUFDRixFQUFPO0FBQUEsTUFHTCxJQUFJLGFBQWEsU0FBUztBQUFBLFFBQ3hCLFdBQVcsSUFBSSxLQUFLLFdBQVcsUUFBUSxPQUFPO0FBQUEsTUFDaEQsRUFBTztBQUFBLFFBQ0wsV0FBVyxJQUFJLEtBQUssV0FBVyxRQUFRLFlBQVksT0FBTztBQUFBO0FBQUE7QUFBQSxFQUdoRTtBQUFBLEVBQ0EsT0FBTyxXQUFXLElBQUksR0FBRztBQUFBO0FBVTNCLFNBQVMsV0FBVyxDQUFDLE9BQW9DO0FBQUEsRUFDdkQsT0FBTyxTQUFTLE9BQU8sVUFBVSxZQUFZLGFBQWE7QUFBQTtBQU01RCxTQUFTLGNBQWMsR0FBcUI7QUFBQSxFQUMxQyxPQUFPLGFBQWEsSUFBSTtBQUFBO0FBTTFCLFNBQVMsZUFBZSxDQUFDLFVBQWtDO0FBQUEsRUFDekQsYUFBYSxRQUFRLFFBQVE7QUFBQTtBQU8vQixTQUFTLGlCQUFpQixDQUN4QixTQUNBLGFBQWEsT0FDUTtBQUFBLEVBQ3JCLElBQUksQ0FBQztBQUFBLElBQVMsT0FBTztBQUFBLEVBRXJCLE1BQU0sY0FBYyxRQUFRO0FBQUEsRUFDNUIsTUFBTSxrQkFBa0IsUUFBUSxTQUFTLFFBQVE7QUFBQSxFQUdqRCxJQUFJLENBQUMsZUFBZSxDQUFDO0FBQUEsSUFBaUIsT0FBTztBQUFBLEVBRzdDLElBQUksZUFBZSxDQUFDLG1CQUFtQixZQUFZO0FBQUEsSUFDakQsTUFBTSxhQUFZLEtBQUssUUFBUTtBQUFBLElBQy9CLE9BQU8sV0FBVTtBQUFBLElBR2pCLElBQUksT0FBTyxnQkFBZ0IsVUFBVTtBQUFBLE1BQ25DLFdBQVUsUUFBUTtBQUFBLElBQ3BCLEVBQU87QUFBQSxNQUVMLFdBQVUsUUFBUSxZQUFZLEtBQUssR0FBRztBQUFBO0FBQUEsSUFFeEMsT0FBTztBQUFBLEVBQ1Q7QUFBQSxFQUdBLE1BQU0sWUFBWSxLQUFLLFFBQVE7QUFBQSxFQUMvQixJQUFJLGVBQWU7QUFBQSxFQUduQixJQUFJLENBQUMsY0FBYyxpQkFBaUI7QUFBQSxJQUNsQyxJQUFJLGlCQUFpQjtBQUFBLElBRXJCLElBQUksVUFBVSxPQUFPO0FBQUEsTUFDbkIsa0JBQWtCLE1BQU0sUUFBUSxVQUFVLEtBQUssSUFDM0MsVUFBVSxNQUFNLEtBQUssR0FBRyxJQUN4QixVQUFVO0FBQUEsSUFDaEI7QUFBQSxJQUNBLElBQUksVUFBVSxXQUFXO0FBQUEsTUFDdkIsbUJBQW1CLGlCQUFpQixNQUFNLE1BQU0sVUFBVTtBQUFBLElBQzVEO0FBQUEsSUFFQSxJQUFJLGdCQUFnQjtBQUFBLE1BQ2xCLGVBQWUsZUFDWixNQUFNLEtBQUssRUFDWCxPQUFPLE9BQU8sRUFDZCxJQUFJLENBQUMsUUFDSixJQUFJLFdBQVcsZ0JBQWdCLElBQUksTUFBTSxtQkFBbUIsR0FDOUQsRUFDQyxLQUFLLEdBQUc7QUFBQSxJQUNiO0FBQUEsRUFDRjtBQUFBLEVBR0EsSUFBSSxhQUFhO0FBQUEsSUFDZixNQUFNLFlBQVksTUFBTSxRQUFRLFdBQVcsSUFDdkMsWUFBWSxPQUFPLE9BQU8sRUFBRSxLQUFLLEdBQUcsSUFDcEM7QUFBQSxJQUVKLGlCQUFpQixlQUFlLE1BQU0sTUFBTTtBQUFBLEVBQzlDO0FBQUEsRUFFQSxJQUFJLGNBQWM7QUFBQSxJQUNoQixVQUFVLFFBQVE7QUFBQSxFQUNwQjtBQUFBLEVBR0EsT0FBTyxVQUFVO0FBQUEsRUFDakIsT0FBTyxVQUFVO0FBQUEsRUFFakIsT0FBTztBQUFBO0FBY1QsU0FBUyxpQkFBaUIsQ0FDeEIsUUFDQSxZQUNBLGdCQUNxQjtBQUFBLEVBQ3JCLE1BQU0sUUFBUSxPQUFPLE1BQU0sWUFBWSxhQUFhLENBQUM7QUFBQSxFQUNyRCxJQUFJLFNBQVMsTUFBTTtBQUFBLEVBQ25CLElBQUksV0FBVztBQUFBLEVBRWYsT0FBTyxPQUFPLFFBQVEsU0FBUztBQUFBLEVBRS9CLElBQUksT0FBTyxVQUFVLFlBQVk7QUFBQSxJQUMvQixVQUFVO0FBQUEsSUFDVixJQUFJLE9BQU8sV0FBVyxVQUFVO0FBQUEsTUFDOUIsT0FBTztBQUFBLE1BQ1AsV0FBVztBQUFBLE1BQ1gsSUFBSSxTQUFTLEtBQUssR0FBRztBQUFBLFFBQ25CLFVBQVU7QUFBQSxRQUNWLFdBQVc7QUFBQSxNQUNiO0FBQUEsSUFDRixFQUFPLFNBQUksU0FBUyxNQUFNLEdBQUc7QUFBQSxNQUMzQixVQUFVO0FBQUEsTUFDVixXQUFXO0FBQUEsSUFDYjtBQUFBLEVBQ0YsRUFBTyxTQUFJLE9BQU8sVUFBVSxVQUFVO0FBQUEsSUFDcEMsVUFBVTtBQUFBLElBQ1YsT0FBTztBQUFBLElBQ1AsSUFBSSxTQUFTLE1BQU0sR0FBRztBQUFBLE1BQ3BCLFVBQVU7QUFBQSxNQUNWLFdBQVc7QUFBQSxJQUNiO0FBQUEsRUFDRixFQUFPLFNBQUksU0FBUyxLQUFLLEdBQUc7QUFBQSxJQUMxQixVQUFVO0FBQUEsSUFDVixVQUFVO0FBQUEsRUFDWjtBQUFBLEVBRUEsT0FBTztBQUFBLElBQ0wsU0FBUyxXQUFXO0FBQUEsSUFDcEI7QUFBQSxJQUNBLFNBQVUsV0FBVyxDQUFDO0FBQUEsSUFDdEI7QUFBQSxFQUNGO0FBQUE7QUFNRixTQUFTLFFBQVEsQ0FBQyxPQUFxQjtBQUFBLEVBQ3JDLE9BQU8sVUFBVSxRQUFRLE9BQU8sVUFBVSxZQUFZLENBQUMsTUFBTSxRQUFRLEtBQUs7QUFBQTtBQVU1RSxTQUFTLGFBQWEsQ0FBQyxVQUErQixDQUFDLEdBQWdCO0FBQUEsRUFDckUsTUFBTSxNQUFNLFFBQVEsT0FBTztBQUFBLEVBQzNCLE1BQU0sVUFBVSxTQUFTLGNBQWMsR0FBRztBQUFBLEVBRTFDLElBQUksUUFBUSxPQUFPO0FBQUEsSUFDakIsUUFBUSxZQUFZLFFBQVE7QUFBQSxFQUM5QjtBQUFBLEVBRUEsSUFBSSxRQUFRLE9BQU87QUFBQSxJQUNqQixJQUFJLE9BQU8sUUFBUSxVQUFVLFVBQVU7QUFBQSxNQUNyQyxRQUFRLGFBQWEsU0FBUyxRQUFRLEtBQUs7QUFBQSxJQUM3QyxFQUFPLFNBQUksT0FBTyxRQUFRLFVBQVUsVUFBVTtBQUFBLE1BQzVDLE9BQU8sT0FBTyxRQUFRLE9BQU8sUUFBUSxLQUFLO0FBQUEsSUFDNUM7QUFBQSxFQUNGO0FBQUEsRUFFQSxJQUFJLFFBQVEsYUFBYTtBQUFBLElBQ3ZCLFFBQVEsY0FBYyxRQUFRO0FBQUEsRUFDaEM7QUFBQSxFQUVBLElBQUksUUFBUSxNQUFNO0FBQUEsSUFDaEIsUUFBUSxjQUFjLFFBQVE7QUFBQSxFQUNoQztBQUFBLEVBRUEsT0FBTztBQUFBO0FBTVQsU0FBUyxRQUFRLENBQUMsU0FBc0IsV0FBeUI7QUFBQSxFQUMvRCxJQUFJLFdBQVcsV0FBVztBQUFBLElBQ3hCLFFBQVEsVUFBVSxJQUFJLFNBQVM7QUFBQSxFQUNqQztBQUFBO0FBTUYsU0FBUyxRQUFRLENBQUMsU0FBc0IsV0FBNEI7QUFBQSxFQUNsRSxPQUFPLFdBQVcsUUFBUSxVQUFVLFNBQVMsU0FBUztBQUFBO0FBV3hELFNBQVMsdUJBQXVCLENBQzlCLFdBQ0EsVUFBK0IsQ0FBQyxHQUMzQjtBQUFBLEVBQ0wsSUFBSTtBQUFBLElBRUY7QUFBQSxNQUNFLFFBQVE7QUFBQSxNQUNSLFlBQVk7QUFBQSxNQUNaLE9BQU87QUFBQSxNQUNQLFlBQVk7QUFBQSxNQUNaLFFBQVE7QUFBQSxNQUNSO0FBQUEsU0FDRztBQUFBLFFBQ0Q7QUFBQSxJQUdKLE1BQU0sb0JBQW9CLGdCQUFnQjtBQUFBLElBRzFDLElBQUksZUFBZSxPQUFPLGdCQUFnQixVQUFVO0FBQUEsTUFDbEQsYUFBYSxRQUFRO0FBQUEsSUFDdkI7QUFBQSxJQUdBLE1BQU0sVUFDSixPQUFPLGNBQWMsY0FDckIsT0FBTyx5QkFBeUIsV0FBVyxXQUFXLEdBQUcsYUFDdkQ7QUFBQSxJQUVKLE1BQU0sWUFBWSxVQUNkLElBQUksVUFBVSxZQUFZLElBQzFCLFVBQVUsWUFBWTtBQUFBLElBRzFCLElBQUksV0FBVztBQUFBLE1BQ2IsTUFBTSxVQUNKLFVBQVUsWUFDVCxxQkFBcUIsY0FBYyxZQUFZO0FBQUEsTUFDbEQsSUFBSSxTQUFTO0FBQUEsUUFFWCxJQUFJO0FBQUEsVUFBYyxtQkFBbUIsU0FBUyxZQUFZO0FBQUEsUUFHMUQsSUFBSTtBQUFBLFVBQWtCLHVCQUF1QixTQUFTLGdCQUFnQjtBQUFBLFFBR3RFLElBQUksZUFBZSxPQUFPLGdCQUFnQixVQUFVO0FBQUEsVUFDbEQsT0FBTyxPQUFPLFFBQVEsT0FBTyxXQUFXO0FBQUEsUUFDMUM7QUFBQSxRQUdBLElBQUksb0JBQW9CLE9BQU8scUJBQXFCLFVBQVU7QUFBQSxVQUM1RCxZQUFZLEtBQUssVUFBVSxPQUFPLFFBQVEsZ0JBQWdCLEdBQUc7QUFBQSxZQUMzRCxJQUFJLFVBQVUsYUFBYSxVQUFVLE1BQU07QUFBQSxjQUN6QyxRQUFRLGFBQWEsS0FBSyxNQUFNLFNBQVMsQ0FBQztBQUFBLFlBQzVDO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxRQUdBLElBQUkscUJBQXFCLE9BQU8sc0JBQXNCLFVBQVU7QUFBQSxVQUM5RCxJQUFJLE1BQU0sUUFBUSxpQkFBaUIsR0FBRztBQUFBLFlBQ3BDLFdBQVcsWUFBWSxtQkFBbUI7QUFBQSxjQUN4QyxJQUFJLE1BQU0sUUFBUSxRQUFRLEtBQUssU0FBUyxVQUFVLEdBQUc7QUFBQSxnQkFDbkQsT0FBTyxXQUFXLFdBQVc7QUFBQSxnQkFDN0IsSUFDRSxPQUFPLGNBQWMsWUFDckIsT0FBTyxZQUFZLFlBQ25CO0FBQUEsa0JBQ0EsUUFBUSxpQkFBaUIsV0FBVyxPQUFPO0FBQUEsZ0JBQzdDO0FBQUEsY0FDRjtBQUFBLFlBQ0Y7QUFBQSxVQUNGLEVBQU87QUFBQSxZQUNMLFlBQVksV0FBVyxZQUFZLE9BQU8sUUFDeEMsaUJBQ0YsR0FBRztBQUFBLGNBQ0QsSUFBSSxPQUFPLFlBQVksWUFBWTtBQUFBLGdCQUNqQyxRQUFRLGlCQUFpQixXQUFXLE9BQU87QUFBQSxjQUM3QztBQUFBLFlBQ0Y7QUFBQTtBQUFBLFFBRUo7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBRUEsT0FBTztBQUFBLElBQ1AsT0FBTyxPQUFPO0FBQUEsSUFDZCxRQUFRLE1BQU0sc0NBQXNDLEtBQUs7QUFBQSxJQUN6RCxPQUFPLFNBQVMsY0FBYyxLQUFLO0FBQUE7QUFBQTtBQVl2QyxTQUFTLGtCQUFrQixDQUN6QixTQUNBLGNBQ007QUFBQSxFQUNOLElBQUksQ0FBQyxXQUFXLENBQUM7QUFBQSxJQUFjO0FBQUEsRUFHL0IsSUFBSSxhQUFhLE1BQU07QUFBQSxJQUNyQixTQUFTLFNBQVMsR0FBRywyQkFBMkIsYUFBYSxNQUFNO0FBQUEsRUFDckU7QUFBQSxFQUdBLE1BQU0sYUFBYSxhQUFhLFFBQVEsY0FBYyxPQUFPO0FBQUEsRUFDN0QsSUFBSSxZQUFZO0FBQUEsSUFDZCxJQUFJLGFBQWEsUUFBUSxXQUFXO0FBQUEsTUFDbEMsU0FDRSxTQUNBLG1CQUNFLG1CQUFtQixZQUFZLE9BQU8sYUFBYSxHQUFHLENBQzFEO0FBQUEsSUFDRjtBQUFBLElBQ0EsSUFBSSxhQUFhLE9BQU87QUFBQSxNQUN0QixTQUNFLFNBQ0EsbUJBQ0UsbUJBQW1CLFlBQVksU0FBUyxhQUFhLEtBQUssQ0FDOUQ7QUFBQSxJQUNGO0FBQUEsSUFDQSxJQUFJLGFBQWEsU0FBUztBQUFBLE1BQ3hCLFNBQ0UsU0FDQSxtQkFDRSxtQkFBbUIsWUFBWSxXQUFXLGFBQWEsT0FBTyxDQUNsRTtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQUEsRUFHQSxJQUFJLGFBQWEsU0FBUyxVQUFVLGNBQWMsT0FBTyxNQUFNLFFBQVE7QUFBQSxJQUNyRSxJQUFJLE9BQU8sYUFBYSxZQUFZLFVBQVU7QUFBQSxNQUM1QyxTQUNFLFNBQ0EsbUJBQ0UsbUJBQW1CLFFBQVEsUUFBUSxhQUFhLE9BQU8sQ0FDM0Q7QUFBQSxJQUNGLEVBQU8sU0FBSSxhQUFhLFlBQVksYUFBYTtBQUFBLE1BQy9DLFNBQ0UsU0FDQSxtQkFBbUIsbUJBQW1CLFFBQVEsUUFBUSxNQUFNLENBQzlEO0FBQUEsSUFDRixFQUFPLFNBQUksYUFBYSxZQUFZLFlBQVk7QUFBQSxNQUM5QyxTQUNFLFNBQ0EsbUJBQW1CLG1CQUFtQixRQUFRLFFBQVEsVUFBVSxDQUNsRTtBQUFBLElBQ0Y7QUFBQSxJQUNBLElBQUksYUFBYTtBQUFBLE1BQ2YsU0FBUyxTQUFTLEdBQUcsb0NBQW9DO0FBQUEsSUFDM0QsSUFBSSxhQUFhO0FBQUEsTUFDZixTQUFTLFNBQVMsR0FBRywwQ0FBMEM7QUFBQSxFQUNuRTtBQUFBLEVBR0EsSUFBSSxhQUFhLFNBQVMsU0FBUyxjQUFjLE9BQU8sTUFBTSxPQUFPO0FBQUEsSUFDbkUsSUFBSSxhQUFhLFNBQVMsU0FBUyxhQUFhLFNBQVMsVUFBVTtBQUFBLE1BQ2pFLFNBQVMsU0FBUyxHQUFHLG9DQUFvQztBQUFBLElBQzNELEVBQU8sU0FBSSxhQUFhLFNBQVMsV0FBVztBQUFBLE1BQzFDLFNBQVMsU0FBUyxHQUFHLDBDQUEwQztBQUFBLElBQ2pFO0FBQUEsSUFDQSxJQUFJLGFBQWE7QUFBQSxNQUNmLFNBQVMsU0FBUyxHQUFHLDBDQUEwQztBQUFBLElBQ2pFLElBQUksYUFBYTtBQUFBLE1BQ2YsU0FBUyxTQUFTLEdBQUcsMkNBQTJDO0FBQUEsRUFDcEU7QUFBQSxFQUdBLElBQUksYUFBYSxPQUFPO0FBQUEsSUFDdEIsYUFBYSxNQUNWLE1BQU0sR0FBRyxFQUNULE9BQU8sT0FBTyxFQUNkLFFBQVEsQ0FBQyxRQUFRLFFBQVEsVUFBVSxJQUFJLEdBQUcsQ0FBQztBQUFBLEVBQ2hEO0FBQUE7QUFPRixTQUFTLHNCQUFzQixDQUM3QixTQUNBLFlBQ007QUFBQSxFQUNOLElBQUksQ0FBQyxXQUFXLENBQUM7QUFBQSxJQUFZO0FBQUEsRUFFN0IsU0FBUyxTQUFTLEdBQUcsOEJBQThCO0FBQUEsRUFHbkQsSUFBSSxXQUFXLFNBQVMsV0FBVyxTQUFTLEtBQUssV0FBVyxTQUFTLElBQUk7QUFBQSxJQUN2RSxTQUNFLFNBQ0EsbUJBQW1CLG1CQUFtQixRQUFRLElBQUksV0FBVyxLQUFLLENBQ3BFO0FBQUEsRUFDRjtBQUFBLEVBQ0EsSUFBSSxXQUFXO0FBQUEsSUFDYixTQUNFLFNBQ0EsbUJBQW1CLG1CQUFtQixRQUFRLE1BQU0sV0FBVyxFQUFFLENBQ25FO0FBQUEsRUFDRixJQUFJLFdBQVc7QUFBQSxJQUNiLFNBQ0UsU0FDQSxtQkFBbUIsbUJBQW1CLFFBQVEsTUFBTSxXQUFXLEVBQUUsQ0FDbkU7QUFBQSxFQUNGLElBQUksV0FBVztBQUFBLElBQ2IsU0FDRSxTQUNBLG1CQUFtQixtQkFBbUIsUUFBUSxNQUFNLFdBQVcsRUFBRSxDQUNuRTtBQUFBLEVBQ0YsSUFBSSxXQUFXO0FBQUEsSUFDYixTQUNFLFNBQ0EsbUJBQW1CLG1CQUFtQixRQUFRLE1BQU0sV0FBVyxFQUFFLENBQ25FO0FBQUEsRUFHRixJQUFJLFdBQVc7QUFBQSxJQUNiLFNBQ0UsU0FDQSxtQkFBbUIsbUJBQW1CLFFBQVEsUUFBUSxXQUFXLElBQUksQ0FDdkU7QUFBQSxFQUNGLElBQUksV0FBVztBQUFBLElBQ2IsU0FDRSxTQUNBLG1CQUNFLG1CQUFtQixRQUFRLFlBQVksV0FBVyxPQUFPLENBQzdEO0FBQUEsRUFHRixJQUFJLFdBQVc7QUFBQSxJQUNiLFNBQ0UsU0FDQSxtQkFBbUIsbUJBQW1CLFFBQVEsU0FBUyxXQUFXLEtBQUssQ0FDekU7QUFBQSxFQUNGLElBQUksV0FBVztBQUFBLElBQ2IsU0FDRSxTQUNBLG1CQUFtQixtQkFBbUIsUUFBUSxRQUFRLFdBQVcsS0FBSyxDQUN4RTtBQUFBLEVBQ0YsSUFBSSxXQUFXO0FBQUEsSUFDYixTQUFTLFNBQVMsR0FBRyxvQ0FBb0M7QUFBQTtBQU03RCxTQUFTLGFBQWEsQ0FBQyxTQUE4QjtBQUFBLEVBQ25ELE9BQU8sU0FBUyxTQUFTLEdBQUcsK0JBQStCLElBQ3ZELFVBQ0EsU0FBUyxTQUFTLEdBQUcsNkJBQTZCLElBQ2hELFFBQ0EsU0FBUyxTQUFTLEdBQUcsOEJBQThCLElBQ2pELFNBQ0E7QUFBQTtBQVdWLFNBQVMsa0JBQWtCLENBQ3pCLFFBQ0EsZ0JBQW9DLE1BQ3BDLFFBQWdCLEdBQ2hCLFVBQXlCLENBQUMsR0FDWjtBQUFBLEVBQ2Q7QUFBQSxFQUNBLE1BQU0sU0FBOEIsQ0FBQztBQUFBLEVBQ3JDLE1BQU0sYUFBbUMsQ0FBQztBQUFBLEVBQzFDLE1BQU0sV0FBVyxlQUFlO0FBQUEsRUFDaEMsSUFBSSxZQUFZO0FBQUEsRUFFaEIsSUFBSSxDQUFDLE1BQU0sUUFBUSxNQUFNLEdBQUc7QUFBQSxJQUMxQixPQUFPLG1CQUFtQixNQUFNO0FBQUEsRUFDbEM7QUFBQSxFQUVBLE1BQU0saUJBQWtCLFFBQWdCLFdBQVc7QUFBQSxFQUVuRCxTQUFTLElBQUksRUFBRyxJQUFJLE9BQU8sUUFBUSxLQUFLO0FBQUEsSUFDdEMsTUFBTSxPQUFPLE9BQU87QUFBQSxJQUNwQixJQUFJLENBQUM7QUFBQSxNQUFNO0FBQUEsSUFHWCxJQUFJLE1BQU0sUUFBUSxJQUFJLEdBQUc7QUFBQSxNQUN2QixNQUFNLFlBQVksYUFBYTtBQUFBLE1BQy9CLE1BQU0sU0FBUyxtQkFBbUIsTUFBTSxXQUFXLE9BQU8sT0FBTztBQUFBLE1BRWpFLElBQUksTUFBTSxRQUFRLE9BQU8sT0FBTyxVQUFVLEdBQUc7QUFBQSxRQUMzQyxXQUFXLEtBQUssR0FBRyxPQUFPLE9BQU8sVUFBVTtBQUFBLFFBQzNDLE9BQU8sT0FBTyxPQUFPO0FBQUEsTUFDdkI7QUFBQSxNQUNBLE9BQU8sT0FBTyxRQUFRLE9BQU8sTUFBTTtBQUFBLE1BQ25DO0FBQUEsSUFDRjtBQUFBLElBR0E7QUFBQSxNQUNFO0FBQUEsTUFDQTtBQUFBLE1BQ0EsU0FBUztBQUFBLE1BQ1Q7QUFBQSxRQUNFLGtCQUFrQixRQUFRLEdBQUcsY0FBYztBQUFBLElBRS9DLElBQUksQ0FBQyxTQUFTO0FBQUEsTUFDWixRQUFRLEtBQUssbUNBQW1DLElBQUk7QUFBQSxNQUNwRDtBQUFBLElBQ0Y7QUFBQSxJQUdBLElBQUksWUFBWSxpQkFBaUIsRUFBRSxTQUFTLGNBQWM7QUFBQSxNQUN4RCxZQUFZLE1BQU07QUFBQSxJQUNwQjtBQUFBLElBR0EsS0FBSyxXQUFXO0FBQUEsSUFHaEIsTUFBTSxvQkFDSixZQUFZLGNBQWMsWUFBWSxTQUFTLFFBQVEsV0FBVztBQUFBLElBR3BFLE1BQU0sbUJBQ0oscUJBQXFCLFlBQVksV0FDN0Isa0JBQWtCLGFBQWEsQ0FBQyxpQkFBaUIsSUFDakQ7QUFBQSxJQUdOLElBQ0UsUUFDQSxFQUFFLFVBQVUscUJBQ1osRUFBRSxZQUFZLGlCQUFrQixRQUFnQixZQUNoRDtBQUFBLE1BQ0EsaUJBQWlCLE9BQU87QUFBQSxJQUMxQjtBQUFBLElBR0EsWUFBWSx3QkFBd0IsU0FBUyxnQkFBZ0I7QUFBQSxJQUM3RCxNQUFNLFVBQVUsWUFBWSxTQUFTLElBQUksVUFBVSxVQUFVO0FBQUEsSUFFN0QsSUFBSSxVQUFVO0FBQUEsTUFBRyxPQUFPLFVBQVU7QUFBQSxJQUNsQyxJQUFJLE1BQU07QUFBQSxNQUNSLE9BQU8sUUFBUTtBQUFBLE1BQ2YsV0FBVyxLQUFLLENBQUMsTUFBTSxTQUFTLENBQUM7QUFBQSxJQUNuQztBQUFBLElBR0EsSUFBSSxXQUFXO0FBQUEsTUFDYixJQUFJLFlBQVksYUFBYSxPQUFPLFVBQVUsV0FBVyxZQUFZO0FBQUEsUUFDbkUsVUFBVSxPQUFPLFFBQVE7QUFBQSxNQUMzQixFQUFPO0FBQUEsUUFDTCxTQUFTLFlBQVksT0FBTztBQUFBO0FBQUEsTUFHOUIsSUFBSSxlQUFlO0FBQUEsUUFDakIsVUFBVSxhQUFhO0FBQUEsUUFDdkIsSUFDRSxnQkFBZ0IsYUFDaEIsT0FBTyxVQUFVLGVBQWUsWUFDaEM7QUFBQSxVQUNBLFVBQVUsV0FBVyxhQUFhO0FBQUEsUUFDcEM7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFBQSxFQUdBLElBQUksaUJBQWlCLFNBQVMsY0FBYyxHQUFHO0FBQUEsSUFDN0MsTUFBTSxVQUFVLFlBQVksYUFBYSxJQUNyQyxjQUFjLFVBQ2Q7QUFBQSxJQUNKLFFBQVEsWUFBWSxRQUFRO0FBQUEsRUFDOUI7QUFBQSxFQUdBLGdCQUFnQixRQUFRO0FBQUEsRUFFeEIsT0FBTyxhQUFhO0FBQUEsRUFDcEIsT0FBTyxtQkFBbUIsTUFBTTtBQUFBO0FBT2xDLFNBQVMsbUJBQW1CLENBQzFCLFFBQ0EsZ0JBQW9DLE1BQ3BDLFVBQXlCLENBQUMsR0FDWjtBQUFBLEVBQ2QsTUFBTSxTQUE4QixDQUFDO0FBQUEsRUFDckMsTUFBTSxpQkFBaUIsUUFBUSxXQUFXO0FBQUEsRUFHMUMsSUFBSyxPQUFlLFdBQVcsQ0FBQyxlQUFlO0FBQUEsSUFDN0MsTUFBTSxhQUFjLE9BQWU7QUFBQSxJQUNuQyxNQUFNLGtCQUFrQixXQUFXLFdBQVc7QUFBQSxJQUU5QyxNQUFNLGlCQUFpQixXQUFXLFdBQVcsQ0FBQztBQUFBLElBQzlDLE1BQU0sbUJBQ0osUUFBUSxXQUFXLFFBQ2Ysa0JBQWtCLGNBQWMsSUFDaEMsS0FBSyxlQUFlO0FBQUEsSUFFMUIsTUFBTSxnQkFBZ0Isd0JBQ3BCLGlCQUNBLGdCQUNGO0FBQUEsSUFDQSxPQUFPLFVBQVU7QUFBQSxJQUNqQixJQUFJLFdBQVc7QUFBQSxNQUFNLE9BQU8sV0FBVyxRQUFRO0FBQUEsSUFHL0MsSUFBSSxXQUFXLFVBQVU7QUFBQSxNQUN2QixNQUFNLGNBQWMsWUFBWSxhQUFhLElBQ3pDLGNBQWMsVUFDZDtBQUFBLE1BQ0osTUFBTSxjQUFjLG9CQUNsQixXQUFXLFVBQ1gsYUFDQSxPQUNGO0FBQUEsTUFDQSxPQUFPLE9BQU8sUUFBUSxZQUFZLE1BQU07QUFBQSxJQUMxQztBQUFBLElBRUEsT0FBTyxtQkFBbUIsTUFBTTtBQUFBLEVBQ2xDO0FBQUEsRUFHQSxNQUFNLFdBQVcsZ0JBQWdCLGVBQWUsSUFBSTtBQUFBLEVBRXBELFdBQVcsT0FBTyxRQUErQjtBQUFBLElBQy9DLE1BQU0sTUFBTyxPQUErQjtBQUFBLElBQzVDLElBQUksQ0FBQztBQUFBLE1BQUs7QUFBQSxJQUVWLE1BQU0saUJBQWlCLElBQUksV0FBVztBQUFBLElBQ3RDLE1BQU0saUJBQWlCLElBQUksV0FBVyxDQUFDO0FBQUEsSUFDdkMsTUFBTSxvQkFDSixZQUFZLGlCQUNSLGVBQWUsU0FDZixRQUFRLFdBQVc7QUFBQSxJQUN6QixNQUFNLG1CQUFtQixvQkFDckIsa0JBQWtCLGNBQWMsSUFDaEMsS0FBSyxlQUFlO0FBQUEsSUFFeEIsSUFBSSxDQUFDLElBQUksUUFBUSxRQUFRLFdBQVc7QUFBQSxNQUNsQyxJQUFJLE9BQU87QUFBQSxJQUNiO0FBQUEsSUFFQSxNQUFNLFVBQVUsd0JBQXdCLGdCQUFnQixnQkFBZ0I7QUFBQSxJQUN4RSxPQUFPLE9BQU87QUFBQSxJQUNkLElBQUksSUFBSSxRQUFRLElBQUksU0FBUztBQUFBLE1BQUssT0FBTyxJQUFJLFFBQVE7QUFBQSxJQUVyRCxNQUFNLFVBQVUsWUFBWSxPQUFPLElBQUksUUFBUSxVQUFVO0FBQUEsSUFDekQsSUFBSTtBQUFBLE1BQVUsU0FBUyxZQUFZLE9BQU87QUFBQSxJQUcxQyxJQUFJLElBQUksVUFBVTtBQUFBLE1BQ2hCLE1BQU0sY0FBYyxvQkFBb0IsSUFBSSxVQUFVLFNBQVMsT0FBTztBQUFBLE1BQ3RFLE9BQU8sT0FBTyxRQUFRLFlBQVksTUFBTTtBQUFBLElBQzFDO0FBQUEsRUFDRjtBQUFBLEVBR0EsSUFBSSxpQkFBaUIsVUFBVTtBQUFBLElBQzdCLE1BQU0sWUFBWSxZQUFZLGFBQWEsSUFDdkMsY0FBYyxVQUNkO0FBQUEsSUFDSixVQUFVLFlBQVksUUFBUTtBQUFBLElBQzlCLGdCQUFnQixRQUFRO0FBQUEsRUFDMUI7QUFBQSxFQUVBLE9BQU8sbUJBQW1CLE1BQU07QUFBQTtBQVVsQyxTQUFTLGFBQWEsQ0FBQyxRQUFrRDtBQUFBLEVBQ3ZFLE1BQU0sWUFBaUMsQ0FBQztBQUFBLEVBRXhDLElBQUksQ0FBQyxVQUFVLE9BQU8sV0FBVztBQUFBLElBQVUsT0FBTztBQUFBLEVBRWxELFdBQVcsT0FBTyxRQUFRO0FBQUEsSUFDeEIsTUFBTSxRQUFRLE9BQU87QUFBQSxJQUNyQixJQUNFLFNBQ0EsT0FBTyxVQUFVLGVBQ2hCLGlCQUFpQixlQUNmLE9BQU8sZUFBZSxlQUFlLGlCQUFpQixjQUN2RCxZQUFZLEtBQUssSUFDbkI7QUFBQSxNQUNBLFVBQVUsT0FBTztBQUFBLElBQ25CO0FBQUEsRUFDRjtBQUFBLEVBRUEsT0FBTztBQUFBO0FBTVQsU0FBUyxrQkFBa0IsQ0FBQyxRQUEyQztBQUFBLEVBQ3JFLE1BQU0sc0JBQXNCLGNBQWMsTUFBTTtBQUFBLEVBRWhELE9BQU87QUFBQSxJQUNMO0FBQUEsSUFDQSxTQUFTLE9BQU87QUFBQSxJQUNoQixXQUFXO0FBQUEsSUFFWCxHQUFHLENBQUMsTUFBbUI7QUFBQSxNQUNyQixPQUFPLE9BQU8sU0FBUztBQUFBO0FBQUEsSUFHekIsTUFBTSxHQUF3QjtBQUFBLE1BQzVCLE9BQU87QUFBQTtBQUFBLElBR1QsT0FBTyxHQUFTO0FBQUEsTUFFZCxNQUFNLFlBQVksSUFBSTtBQUFBLE1BR3RCLE1BQU0sbUJBQW1CLENBQUMsY0FBeUI7QUFBQSxRQUNqRCxJQUFJLENBQUMsYUFBYSxVQUFVLElBQUksU0FBUztBQUFBLFVBQUc7QUFBQSxRQUc1QyxJQUFJLHFCQUFxQixlQUFlLE9BQU8sY0FBYztBQUFBLFVBQzNEO0FBQUEsUUFHRixJQUFJLE9BQU8sVUFBVSxZQUFZLFlBQVk7QUFBQSxVQUMzQyxVQUFVLElBQUksU0FBUztBQUFBLFVBQ3ZCLElBQUk7QUFBQSxZQUNGLFVBQVUsUUFBUTtBQUFBLFlBQ2xCLE9BQU8sR0FBRztBQUFBLFFBR2Q7QUFBQTtBQUFBLE1BS0YsSUFBSSxNQUFNLFFBQVEsT0FBTyxVQUFVLEdBQUc7QUFBQSxRQUNwQyxZQUFZLE1BQU0sY0FBYyxPQUFPLFlBQVk7QUFBQSxVQUNqRCxpQkFBaUIsU0FBUztBQUFBLFFBQzVCO0FBQUEsTUFDRjtBQUFBLE1BR0EsV0FBVyxPQUFPLFFBQVE7QUFBQSxRQUN4QixJQUFJLFFBQVEsYUFBYSxRQUFRO0FBQUEsVUFBYztBQUFBLFFBQy9DLGlCQUFpQixPQUFPLElBQUk7QUFBQSxNQUM5QjtBQUFBLE1BR0EsSUFBSSxNQUFNLFFBQVEsT0FBTyxVQUFVLEdBQUc7QUFBQSxRQUNwQyxPQUFPLFdBQVcsU0FBUztBQUFBLE1BQzdCO0FBQUEsTUFHQSxJQUFJLE9BQU8sU0FBUztBQUFBLFFBQ2xCLE1BQU0sVUFBVSxZQUFZLE9BQU8sT0FBTyxJQUN0QyxPQUFPLFFBQVEsVUFDZixPQUFPO0FBQUEsUUFDWCxJQUFJLFdBQVcsUUFBUSxZQUFZO0FBQUEsVUFDakMsUUFBUSxXQUFXLFlBQVksT0FBTztBQUFBLFFBQ3hDO0FBQUEsTUFDRjtBQUFBLE1BR0EsV0FBVyxPQUFPLFFBQVE7QUFBQSxRQUN4QixPQUFPLE9BQU87QUFBQSxNQUNoQjtBQUFBO0FBQUEsRUFFSjtBQUFBO0FBV0ssU0FBUyxZQUFZLENBQzFCLFFBQ0EsZ0JBQW9DLE1BQ3BDLFVBQXlCLENBQUMsR0FDWjtBQUFBLEVBRWQsSUFBSSxPQUFPLFdBQVcsWUFBWTtBQUFBLElBQ2hDLFNBQVMsT0FBTztBQUFBLEVBQ2xCO0FBQUEsRUFHQSxJQUFJLE9BQU8sV0FBVyxVQUFVO0FBQUEsSUFDOUIsTUFBTSxXQUFXLFNBQVMsY0FBYyxVQUFVO0FBQUEsSUFDbEQsU0FBUyxZQUFZLE9BQU8sS0FBSztBQUFBLElBQ2pDLE1BQU0sV0FBVyxTQUFTO0FBQUEsSUFFMUIsSUFBSSxpQkFBaUIsU0FBUyxjQUFjLEdBQUc7QUFBQSxNQUM3QyxjQUFjLFlBQVksUUFBUTtBQUFBLElBQ3BDO0FBQUEsSUFFQSxNQUFNLFNBQVMsRUFBRSxTQUFTLFNBQVMsa0JBQWlDO0FBQUEsSUFDcEUsT0FBTyxtQkFBbUIsTUFBTTtBQUFBLEVBQ2xDO0FBQUEsRUFHQSxJQUNFLE1BQU0sUUFBUSxNQUFNLEtBQ3BCLE9BQU8sVUFBVSxLQUNqQixPQUFPLE9BQU8sT0FBTyxjQUNyQixPQUFPLE9BQU8sT0FBTyxZQUNyQixTQUFTLE9BQU8sRUFBRSxHQUNsQjtBQUFBLElBQ0EsT0FBTyxtQkFBbUIsUUFBUSxlQUFlLEdBQUcsT0FBTztBQUFBLEVBQzdEO0FBQUEsRUFHQSxPQUFPLE1BQU0sUUFBUSxNQUFNLElBQ3ZCLG1CQUFtQixRQUFRLGVBQWUsR0FBRyxPQUFPLElBQ3BELG9CQUFvQixRQUFRLGVBQWUsT0FBTztBQUFBOztBQ3IvQnhELElBQU0sVUFBUztBQUNmLElBQU0sb0JBQW1CLEdBQUc7QUFxQnJCLFNBQVMsb0JBQW9CLENBQUMsU0FBb0I7QUFBQSxFQUN2RCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVE7QUFBQSxJQUFXO0FBQUEsRUFHcEMsTUFBTSxZQUFZLE1BQU0sS0FBSyxRQUFRLFNBQVM7QUFBQSxFQUc5QyxNQUFNLGdCQUFnQixVQUFVLE9BQzlCLENBQUMsUUFDQyxJQUFJLFdBQVcsR0FBRywyQkFBMEIsS0FDNUMsSUFBSSxTQUFTLElBQUksMkJBQTBCLENBQy9DO0FBQUEsRUFHQSxjQUFjLFFBQVEsQ0FBQyxRQUFnQjtBQUFBLElBQ3JDLFFBQVEsVUFBVSxPQUFPLEdBQUc7QUFBQSxHQUM3QjtBQUFBOztBQ2pDSSxJQUFNLFdBQVcsT0FBTyxVQUFVOztBQ0RwQixJQUFyQjs7O0FDRU8sU0FBUyxjQUE2RCxDQUMzRSxZQUNBLGFBQ007QUFBQSxFQUNOLE1BQU0scUJBQXFCLFdBQVUsU0FBUztBQUFBLEVBQzlDLFdBQVUsU0FBUyxhQUFhLE1BQU07QUFBQSxJQUVwQyxNQUFNLFNBQVMsbUJBQW1CO0FBQUEsSUFFbEMsSUFBSSxXQUFXLE9BQU87QUFBQSxNQUNwQixZQUFZO0FBQUEsSUFDZDtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUE7QUFRSixTQUFTLFdBQTBDLENBQ3hELFlBQ0EsU0FDTTtBQUFBLEVBQ04sSUFBSSxhQUFhLGNBQWEsT0FBTyxXQUFVLFlBQVksWUFBWTtBQUFBLElBQ3JFLE1BQU0sa0JBQWtCLFdBQVU7QUFBQSxJQUNqQyxXQUFrQixVQUFVLE1BQU07QUFBQSxNQUNqQyxRQUFRO0FBQUEsTUFDUixrQkFBa0I7QUFBQTtBQUFBLEVBRXRCO0FBQUE7QUFPSyxTQUFTLGdCQUFnQixDQUFDLFlBQW1DO0FBQUEsRUFDbEUsT0FBUSxXQUFVLFNBQWlCO0FBQUE7QUFPOUIsU0FBUyxhQUFhLENBQUMsTUFBb0I7QUFBQSxFQUNoRCxPQUNFLFFBQ0EsT0FBTyxTQUFTLGFBQ2YsS0FBSyxpQkFBaUIsUUFBUSxLQUFLLG9CQUFvQjtBQUFBO0FBZ0JyRCxTQUFTLEtBQUssQ0FBQyxPQUFlLEtBQWEsS0FBcUI7QUFBQSxFQUNyRSxPQUFPLEtBQUssSUFBSSxLQUFLLEtBQUssSUFBSSxLQUFLLEtBQUssQ0FBQztBQUFBO0FBT3BDLFNBQVMsb0JBQW1ELENBQ2pFLFlBQ0EsTUFDQSxJQUNNO0FBQUEsRUFDTCxXQUFrQixRQUFRO0FBQUE7OztBQ3pFdEIsSUFBTSxXQUFXLENBQUMsU0FBcUIsQ0FBQyxNQUFNO0FBQUEsRUFDbkQsT0FBTyxDQUFnRCxlQUFvQjtBQUFBLElBQ3pFLFFBQVEsWUFBWSxpQkFBaUIsY0FBYyxlQUFlO0FBQUEsSUFHbEUsZUFBZSxZQUFXLE1BQU07QUFBQSxNQUM5QixNQUFNLFVBQVUsV0FBVTtBQUFBLE1BQzFCLElBQUksQ0FBQztBQUFBLFFBQVM7QUFBQSxNQUdkLElBQUksa0JBQWtCLFFBQVEsY0FDNUIsZ0JBQ0Y7QUFBQSxNQUVBLElBQUksQ0FBQyxpQkFBaUI7QUFBQSxRQUNwQixrQkFBa0IsU0FBUyxjQUFjLEtBQUs7QUFBQSxRQUM5QyxnQkFBZ0IsWUFBWTtBQUFBLFFBQzVCLGdCQUFnQixNQUFNLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFRaEMsZ0JBQWdCLGFBQWEsb0JBQW9CLFdBQVc7QUFBQSxRQUc1RCxNQUFNLGlCQUFpQixTQUFTLGNBQWMsS0FBSztBQUFBLFFBQ25ELGVBQWUsWUFBWTtBQUFBLFFBQzNCLGVBQWUsTUFBTSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFLL0IsZ0JBQWdCLFlBQVksY0FBYztBQUFBLFFBQzFDLFFBQVEsWUFBWSxlQUFlO0FBQUEsUUFHbkMsTUFBTSxRQUFRLGlCQUFpQixVQUFTO0FBQUEsUUFDeEMsSUFBSSxPQUFPO0FBQUEsVUFDVCxNQUFNLGtCQUFrQjtBQUFBLFVBQ3hCLE1BQU0saUJBQWlCO0FBQUEsUUFDekI7QUFBQSxRQUdDLFdBQWtCLGtCQUFrQjtBQUFBLFFBQ3BDLFdBQWtCLGlCQUFpQjtBQUFBLE1BQ3RDO0FBQUEsS0FDRDtBQUFBLElBRUQsT0FBTztBQUFBO0FBQUE7OztBQzlESixJQUFNLHFCQUFxQjtBQUFBLEVBRWhDLGdCQUFnQjtBQUFBLElBQ2QsbUJBQW1CO0FBQUEsSUFDbkIsaUJBQWlCO0FBQUEsSUFDakIsb0JBQW9CO0FBQUEsSUFDcEIsa0JBQWtCLE1BQU0sT0FBTztBQUFBLElBQy9CLHVCQUF1QjtBQUFBLEVBQ3pCO0FBQUEsRUFHQSxXQUFXO0FBQUEsSUFDVCxVQUFVO0FBQUEsRUFDWjtBQUFBLEVBR0EsV0FBVztBQUFBLElBRVQsdUJBQXVCO0FBQUEsSUFDdkIsU0FBUztBQUFBLE1BQ1AsTUFBTTtBQUFBLElBQ1I7QUFBQSxFQUNGO0FBQUEsRUFHQSxTQUFTO0FBQUEsSUFDUCxrQkFBa0I7QUFBQSxJQUNsQix5QkFBeUI7QUFBQSxJQUN6QixvQkFBb0I7QUFBQSxJQUNwQixrQkFBa0I7QUFBQSxJQUNsQixnQkFBZ0I7QUFBQSxJQUNoQixnQkFBZ0I7QUFBQSxJQUNoQixpQkFBaUI7QUFBQSxJQUNqQixnQkFBZ0I7QUFBQSxJQUNoQixhQUFhO0FBQUEsRUFDZjtBQUFBLEVBR0EsZUFBZTtBQUFBLElBQ2IsU0FBUztBQUFBLElBQ1QsZ0JBQWdCO0FBQUEsSUFDaEIscUJBQXFCO0FBQUEsRUFDdkI7QUFBQSxFQUdBLGFBQWE7QUFBQSxJQUNYLGdCQUFnQjtBQUFBLElBQ2hCLE9BQU87QUFBQSxJQUNQLGlCQUFpQjtBQUFBLElBQ2pCLGtCQUFrQjtBQUFBLElBQ2xCLHdCQUF3QjtBQUFBLEVBQzFCO0FBQUEsRUFHQSxnQkFBZ0I7QUFBQSxJQUVkLHFCQUFxQjtBQUFBLEVBQ3ZCO0FBQUEsRUFHQSxVQUFVO0FBQUEsSUFDUixTQUFTO0FBQUEsSUFDVCxxQkFBcUI7QUFBQSxJQUNyQixjQUFjO0FBQUEsSUFDZCxjQUFjO0FBQUEsSUFDZCx3QkFBd0I7QUFBQSxJQUN4QixZQUFZO0FBQUEsRUFDZDtBQUFBLEVBR0EsY0FBYztBQUFBLElBQ1osVUFBVTtBQUFBLElBQ1YscUJBQXFCO0FBQUEsSUFDckIsV0FBVztBQUFBLElBQ1gsV0FBVztBQUFBLElBQ1gsbUJBQW1CO0FBQUEsSUFDbkIsb0JBQW9CO0FBQUEsSUFDcEIsZUFBZTtBQUFBLEVBQ2pCO0FBQUEsRUFHQSxXQUFXO0FBQUEsSUFDVCxnQkFBZ0I7QUFBQSxFQUNsQjtBQUFBLEVBR0EsV0FBVztBQUFBLElBRVQsU0FBUztBQUFBLE1BQ1AsV0FBVztBQUFBLE1BQ1gsaUJBQWlCO0FBQUEsTUFDakIsaUJBQWlCO0FBQUEsTUFDakIsbUJBQW1CO0FBQUEsTUFDbkIsb0JBQW9CO0FBQUEsTUFDcEIsMEJBQTBCO0FBQUEsSUFDNUI7QUFBQSxFQUNGO0FBQUEsRUFHQSxhQUFhO0FBQUEsSUFDWCxxQkFBcUI7QUFBQSxJQUNyQiw4QkFBOEI7QUFBQSxJQUM5QixtQkFBbUI7QUFBQSxFQUNyQjtBQUFBLEVBRUEsWUFBWTtBQUFBLElBQ1Ysa0JBQWtCO0FBQUEsSUFDbEIsZUFBZTtBQUFBLElBQ2YsWUFBWTtBQUFBLE1BQ1YsTUFBTTtBQUFBLE1BQ04sUUFBUTtBQUFBLE1BQ1IsUUFBUTtBQUFBLElBQ1Y7QUFBQSxJQUNBLHlCQUF5QjtBQUFBLElBQ3pCLHFCQUFxQjtBQUFBLElBRXJCLGlDQUFpQztBQUFBLElBQ2pDLG9DQUFvQztBQUFBLEVBQ3RDO0FBQ0Y7OztBQ3pHTyxJQUFNLGNBQWMsQ0FBQyxTQUF3QixDQUFDLE1BQU07QUFBQSxFQUN6RCxPQUFPLENBQWdELGVBQW9CO0FBQUEsSUFDekU7QUFBQSxNQUNFO0FBQUEsTUFDQSxXQUFXLG1CQUFtQixlQUFlO0FBQUEsTUFDN0MsY0FBYztBQUFBLE1BQ2QscUJBQXFCLGFBQWEsWUFDOUIsbUJBQW1CLGVBQWUsd0JBQ2xDO0FBQUEsTUFDSixRQUFRO0FBQUEsTUFDUixxQkFBcUI7QUFBQSxRQUNuQjtBQUFBLElBR0osTUFBTSxrQkFDSixZQUFZLG1CQUFtQixlQUFlO0FBQUEsSUFFaEQsTUFBTSxtQkFBbUIsbUJBQW1CLGVBQWU7QUFBQSxJQUMzRCxJQUFJO0FBQUEsSUFDSixJQUFJLHdCQUF3QjtBQUFBLElBQzVCLElBQUksc0NBQXNDO0FBQUEsSUFHMUMsZUFBZSxZQUFXLE1BQU07QUFBQSxNQUM5QixnQkFBZ0IsaUJBQWlCLFVBQVM7QUFBQSxNQUMxQyxJQUFJLENBQUM7QUFBQSxRQUFlO0FBQUEsTUFFcEIsT0FBTyxPQUFPLGVBQWU7QUFBQSxRQUMzQixVQUFVO0FBQUEsUUFDVjtBQUFBLFFBQ0EsZUFDRSxjQUFjLGtCQUNaLGdCQUFnQixlQUFlLGdCQUFnQixtQkFDNUM7QUFBQSxNQUNULENBQUM7QUFBQSxNQUVELHVCQUF1QixjQUFjLFVBQVU7QUFBQSxNQUsvQyxJQUFJLHdCQUF3QixjQUFjLGtCQUFrQjtBQUFBLE1BRTVELElBQUkscUJBQXFCLEdBQUc7QUFBQSxRQUV6QixjQUFzQixvQkFBb0I7QUFBQSxRQUczQyx3QkFDRSxzQkFBc0IsY0FBYyxZQUFZO0FBQUEsUUFDbEQsY0FBYyxpQkFBaUI7QUFBQSxRQUkvQixXQUFXLE1BQU07QUFBQSxVQUNmLFdBQVUsT0FBTyxpQ0FBaUM7QUFBQSxZQUNoRCxVQUFVO0FBQUEsWUFDVixRQUFRO0FBQUEsVUFDVixDQUFDO0FBQUEsV0FDQSxDQUFDO0FBQUEsTUFDTjtBQUFBLE1BRUEsbUJBQW1CLHFCQUFxQjtBQUFBLE1BR3hDLHNCQUFzQixNQUFNO0FBQUEsUUFDMUIsb0JBQW9CO0FBQUEsT0FDckI7QUFBQSxLQUNGO0FBQUEsSUFHRCxNQUFNLHNCQUFzQixNQUFjO0FBQUEsTUFDeEMsSUFBSSxDQUFDLGVBQWU7QUFBQSxRQUFrQixPQUFPO0FBQUEsTUFDN0MsTUFBTSxhQUFhLGNBQWMsYUFBYSxjQUFjO0FBQUEsTUFDNUQsT0FBTyxjQUFjLG1CQUFtQixJQUFJLG1CQUFtQjtBQUFBO0FBQUEsSUFHakUsTUFBTSxNQUFNLENBQUMsU0FBaUIsU0FBZTtBQUFBLE1BQzNDLElBQUk7QUFBQSxRQUFPLFFBQVEsSUFBSSxhQUFhLFdBQVcsSUFBSTtBQUFBO0FBQUEsSUFJckQsTUFBTSx3QkFBd0IsQ0FDNUIsbUJBQ21DO0FBQUEsTUFDbkMsSUFBSSxDQUFDLGVBQWU7QUFBQSxRQUNsQixRQUFRLEtBQUssb0RBQW9EO0FBQUEsUUFDakUsT0FBTyxFQUFFLE9BQU8sR0FBRyxLQUFLLEVBQUU7QUFBQSxNQUM1QjtBQUFBLE1BRUEsUUFBUSxlQUFlLGVBQWU7QUFBQSxNQUd0QyxJQUNFLENBQUMsaUJBQ0QsaUJBQWlCLEtBQ2pCLENBQUMsY0FDRCxjQUFjLEdBQ2Q7QUFBQSxRQUdBLElBQUkscUJBQXFCLEdBQUc7QUFBQSxVQUMxQixNQUFNLGdCQUFlLEtBQUssTUFDdkIsaUJBQWlCLFFBQ2YsY0FBYyxZQUFZLGdCQUMvQjtBQUFBLFVBQ0EsTUFBTSxTQUFRLEtBQUssSUFBSSxHQUFHLHFCQUFxQixRQUFRO0FBQUEsVUFDdkQsTUFBTSxPQUFNLHFCQUFxQixnQkFBZTtBQUFBLFVBQ2hELE9BQU8sRUFBRSxlQUFPLFVBQUk7QUFBQSxRQUN0QjtBQUFBLFFBQ0EsSUFBSSw0QkFBNEIsd0JBQXdCLFlBQVk7QUFBQSxRQUNwRSxPQUFPLEVBQUUsT0FBTyxHQUFHLEtBQUssRUFBRTtBQUFBLE1BQzVCO0FBQUEsTUFFQSxNQUFNLGNBQ0osY0FBYyxvQkFBb0IsYUFBYSxjQUFjO0FBQUEsTUFDL0QsTUFBTSxlQUFlLEtBQUssS0FBSyxnQkFBZ0IsY0FBYyxRQUFRO0FBQUEsTUFDckUsTUFBTSxvQkFBbUIsb0JBQW9CO0FBQUEsTUFFN0MsSUFBSSxPQUFlO0FBQUEsTUFHbkIsTUFBTSxvQkFBcUIsY0FBc0I7QUFBQSxNQUVqRCxJQUFJLG9CQUFtQixHQUFHO0FBQUEsUUFJeEIsSUFBSSxzQkFBc0IsYUFBYSxvQkFBb0IsR0FBRztBQUFBLFVBQzVELFFBQVEsS0FBSyxJQUFJLEdBQUcsb0JBQW9CLFFBQVE7QUFBQSxVQUNoRCxNQUFNLEtBQUssSUFDVCxhQUFhLEdBQ2Isb0JBQW9CLGVBQWUsUUFDckM7QUFBQSxVQUVBLE9BQVEsY0FBc0I7QUFBQSxRQUNoQyxFQUFPO0FBQUEsVUFDTCxNQUFNLGNBQWMsaUJBQWlCO0FBQUEsVUFDckMsTUFBTSxhQUFhLGNBQWM7QUFBQSxVQUNqQyxRQUFRLEtBQUssTUFBTSxVQUFVO0FBQUEsVUFDN0IsTUFBTSxLQUFLLEtBQUssVUFBVSxJQUFJO0FBQUE7QUFBQSxRQUloQyxNQUFNLFlBQVksY0FBYztBQUFBLFFBQ2hDLE1BQU0scUJBQXFCLFlBQVk7QUFBQSxRQUV2QyxJQUFJLHNCQUFzQixpQkFBaUIsc0JBQXNCLElBQUk7QUFBQSxVQUNuRSxNQUFNLGdCQUFnQixLQUFLLE1BQ3pCLGdCQUFnQixjQUFjLFFBQ2hDO0FBQUEsVUFDQSxNQUFNLHVCQUF1QixLQUFLLElBQUksR0FBRyxhQUFhLGFBQWE7QUFBQSxVQUNuRSxNQUFNLGdCQUFnQixLQUFLLElBQ3pCLEdBQ0EsS0FBSyxJQUFJLEdBQUcsSUFBSSxxQkFBcUIsYUFBYSxDQUNwRDtBQUFBLFVBRUEsUUFBUSxLQUFLLE1BQ1gsU0FBUyx1QkFBdUIsU0FBUyxhQUMzQztBQUFBLFVBQ0EsTUFDRSxzQkFBc0IsSUFDbEIsYUFBYSxJQUNiLEtBQUssSUFBSSxhQUFhLEdBQUcsUUFBUSxlQUFlLFFBQVE7QUFBQSxVQUU5RCxJQUFJLDRCQUE0QjtBQUFBLFlBQzlCO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNIO0FBQUEsUUFHQSxRQUFRLEtBQUssSUFBSSxHQUFHLFFBQVEsUUFBUTtBQUFBLFFBQ3BDLE1BQU0sS0FBSyxJQUFJLGFBQWEsR0FBRyxNQUFNLFFBQVE7QUFBQSxNQUMvQyxFQUFPO0FBQUEsUUFFTCxRQUFRLEtBQUssSUFDWCxHQUNBLEtBQUssTUFBTSxpQkFBaUIsY0FBYyxRQUFRLElBQUksUUFDeEQ7QUFBQSxRQUNBLE1BQU0sS0FBSyxJQUFJLGFBQWEsR0FBRyxRQUFRLGVBQWUsV0FBVyxDQUFDO0FBQUE7QUFBQSxNQUlwRSxJQUFJLE1BQU0sS0FBSyxLQUFLLE1BQU0sR0FBRyxHQUFHO0FBQUEsUUFDOUIsUUFBUSxNQUFNLHVDQUF1QztBQUFBLFVBQ25EO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBLFVBQVUsY0FBYztBQUFBLFVBQ3hCO0FBQUEsUUFDRixDQUFDO0FBQUEsUUFDRCxPQUFPLEVBQUUsT0FBTyxHQUFHLEtBQUssRUFBRTtBQUFBLE1BQzVCO0FBQUEsTUFhQSxPQUFPLEVBQUUsT0FBTyxJQUFJO0FBQUE7QUFBQSxJQUl0QixNQUFNLDhCQUE4QixDQUFDLG1CQUEyQjtBQUFBLE1BQzlELElBQUksQ0FBQztBQUFBLFFBQWUsT0FBTyxFQUFFLE9BQU8sR0FBRyxLQUFLLEVBQUU7QUFBQSxNQUU5QyxRQUFRLGVBQWUsZUFBZTtBQUFBLE1BQ3RDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztBQUFBLFFBQVksT0FBTyxFQUFFLE9BQU8sR0FBRyxLQUFLLEVBQUU7QUFBQSxNQUU3RCxNQUFNLFlBQVcsY0FBYztBQUFBLE1BQy9CLE1BQU0sZUFBZSxLQUFLLEtBQUssZ0JBQWdCLFNBQVE7QUFBQSxNQUN2RCxNQUFNLG9CQUFtQixjQUFjLG1CQUNsQyxhQUFhLFlBQVksY0FBYyxtQkFDeEM7QUFBQSxNQUVKLElBQUksT0FBZTtBQUFBLE1BRW5CLElBQUksb0JBQW1CLEdBQUc7QUFBQSxRQUV4QixNQUFNLGNBQ0osY0FBYyxvQkFBb0IsYUFBYTtBQUFBLFFBQ2pELE1BQU0sY0FBYyxpQkFBaUI7QUFBQSxRQUNyQyxRQUFRLEtBQUssTUFBTSxjQUFjLFVBQVU7QUFBQSxRQUMzQyxNQUFNLEtBQUssSUFBSSxhQUFhLEdBQUcsUUFBUSxlQUFlLENBQUM7QUFBQSxNQUN6RCxFQUFPO0FBQUEsUUFFTCxRQUFRLEtBQUssTUFBTSxpQkFBaUIsU0FBUTtBQUFBLFFBQzVDLE1BQU0sS0FBSyxJQUFJLGFBQWEsR0FBRyxRQUFRLGVBQWUsQ0FBQztBQUFBO0FBQUEsTUFJekQsUUFBUSxLQUFLLElBQUksR0FBRyxLQUFLO0FBQUEsTUFDekIsTUFBTSxLQUFLLElBQUksT0FBTyxHQUFHO0FBQUEsTUFFekIsT0FBTyxFQUFFLE9BQU8sSUFBSTtBQUFBO0FBQUEsSUFJdEIsTUFBTSxxQkFBcUIsQ0FBQyxtQkFBMkI7QUFBQSxNQUNyRCxJQUFJLENBQUM7QUFBQSxRQUFlO0FBQUEsTUFDcEIsY0FBYyxlQUFlLHNCQUFzQixjQUFjO0FBQUEsTUFLakUsTUFBTSxxQkFBcUIsNEJBQTRCLGNBQWM7QUFBQSxNQUVyRSxXQUFVLE9BQU8sMEJBQTBCO0FBQUEsUUFDekMsT0FBTyxjQUFjO0FBQUEsUUFDckIsY0FBYztBQUFBLFFBQ2Q7QUFBQSxNQUNGLENBQUM7QUFBQTtBQUFBLElBSUgsTUFBTSx5QkFBeUIsQ0FBQyxlQUF1QjtBQUFBLE1BQ3JELElBQUksQ0FBQztBQUFBLFFBQWU7QUFBQSxNQUVwQixNQUFNLFVBQVUsY0FBYztBQUFBLE1BQzlCLGNBQWMsYUFBYTtBQUFBLE1BQzNCLE1BQU0sYUFBYSxhQUFhLGNBQWM7QUFBQSxNQUc5QyxJQUFJLGVBQWU7QUFBQSxNQUNuQixJQUFJLGNBQWMsZ0JBQWdCO0FBQUEsUUFDaEMsTUFBTSxnQkFBZ0IsT0FBTyxpQkFDM0IsY0FBYyxjQUNoQjtBQUFBLFFBQ0EsTUFBTSxhQUFhLFdBQVcsY0FBYyxVQUFVLEtBQUs7QUFBQSxRQUMzRCxNQUFNLGdCQUFnQixXQUFXLGNBQWMsYUFBYSxLQUFLO0FBQUEsUUFDakUsZUFBZSxhQUFhO0FBQUEsTUFDOUI7QUFBQSxNQUdBLGNBQWMsbUJBQW1CLEtBQUssSUFDcEMsYUFBYSxjQUNiLGdCQUNGO0FBQUEsTUFPQSxXQUFVLE9BQU8saUNBQWlDO0FBQUEsUUFDaEQsa0JBQWtCLGNBQWM7QUFBQSxRQUNoQztBQUFBLFFBQ0Esa0JBQWtCLG9CQUFvQjtBQUFBLE1BQ3hDLENBQUM7QUFBQTtBQUFBLElBSUgsTUFBTSxzQkFBc0IsTUFBTTtBQUFBLE1BQ2hDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjO0FBQUEsUUFBaUI7QUFBQSxNQUV0RCxNQUFNLE9BQ0osY0FBYyxnQkFDWixjQUFjLGdCQUFnQixlQUMxQixnQkFDQTtBQUFBLE1BUVIsSUFBSSxTQUFTLGNBQWMsZUFBZTtBQUFBLFFBQ3hDLGNBQWMsZ0JBQWdCO0FBQUEsUUFDOUIsbUJBQW1CLGNBQWMsa0JBQWtCLENBQUM7QUFBQSxRQUNwRCx1QkFBdUIsY0FBYyxVQUFVO0FBQUEsUUFDL0MsV0FBVSxPQUFPLG1DQUFtQztBQUFBLFVBQ2xELGVBQWU7QUFBQSxRQUNqQixDQUFDO0FBQUEsTUFDSDtBQUFBO0FBQUEsSUFJRixXQUFVLFNBQVMsa0JBQWtCLE1BQ25DLGVBQWUsZ0JBQ2Ysc0JBQXNCLGVBQWUsa0JBQWtCLENBQUM7QUFBQSxJQUcxRCxXQUFVLEtBQUssbUJBQW1CLENBQUMsU0FDakMsbUJBQW1CLEtBQUssUUFBUSxDQUNsQztBQUFBLElBRUEsV0FBVSxLQUFLLDBCQUEwQixDQUFDLFNBQWM7QUFBQSxNQUN0RCxJQUFJLEtBQUssZUFBZSxXQUFXO0FBQUEsUUFDakMsdUJBQXVCLEtBQUssVUFBVTtBQUFBLFFBQ3RDLG1CQUFtQixlQUFlLGtCQUFrQixDQUFDO0FBQUEsTUFDdkQ7QUFBQSxLQUNEO0FBQUEsSUFNRCxXQUFVLEtBQUssZ0NBQWdDLENBQUMsU0FBYztBQUFBLE1BQzVELElBQUksS0FBSyxVQUFVO0FBQUEsUUFBVztBQUFBLE1BUzlCLElBQ0UscUJBQXFCLEtBQ3JCLENBQUMsdUNBQ0QsS0FBSyxRQUFRLEdBQ2I7QUFBQSxRQUNBLE1BQU0sa0JBQWtCLEtBQUssUUFBUSxjQUFjO0FBQUEsUUFDbkQsTUFBTSxlQUFlLGtCQUFrQjtBQUFBLFFBRXZDLElBQUksY0FBYztBQUFBLFVBR2hCLE1BQU0sUUFBUSxxQkFBcUIsS0FBSztBQUFBLFVBQ3hDLE1BQU0scUJBQXFCLFFBQVE7QUFBQSxVQUVuQyxjQUFjLGlCQUFpQjtBQUFBLFVBRy9CLFdBQVUsT0FBTyxpQ0FBaUM7QUFBQSxZQUNoRCxVQUFVO0FBQUEsWUFDVixRQUFRO0FBQUEsVUFDVixDQUFDO0FBQUEsVUFJRCxPQUFRLGNBQXNCO0FBQUEsUUFDaEM7QUFBQSxRQUdBLHNDQUFzQztBQUFBLE1BQ3hDO0FBQUEsTUFFQSx1QkFBdUIsS0FBSyxLQUFLO0FBQUEsTUFDakMsbUJBQW1CLGVBQWUsa0JBQWtCLENBQUM7QUFBQSxNQUdyRCxXQUFVLFVBQVUsY0FBYztBQUFBLEtBQ25DO0FBQUEsSUFHRCxXQUFVLEtBQUssbUNBQW1DLENBQUMsU0FBYztBQUFBLE1BQy9ELElBQUksaUJBQWlCLEtBQUssa0JBQWtCLGNBQWMsZUFBZTtBQUFBLFFBQ3ZFLGNBQWMsZ0JBQWdCLEtBQUs7QUFBQSxRQUVuQyx1QkFBdUIsY0FBYyxVQUFVO0FBQUEsUUFDL0MsbUJBQW1CLGNBQWMsa0JBQWtCLENBQUM7QUFBQSxNQUN0RDtBQUFBLEtBQ0Q7QUFBQSxJQUVELFdBQVUsS0FBSywyQkFBMkIsQ0FBQyxTQUFjO0FBQUEsTUFDdkQsSUFDRSxLQUFLLFVBQVUsYUFDZixLQUFLLFVBQVUsZUFBZSxZQUM5QjtBQUFBLFFBQ0EsdUJBQXVCLEtBQUssS0FBSztBQUFBLE1BQ25DO0FBQUEsTUFDQSxtQkFBbUIsZUFBZSxrQkFBa0IsQ0FBQztBQUFBLE1BQ3JELFdBQVUsVUFBVSxjQUFjO0FBQUEsS0FDbkM7QUFBQSxJQUdELElBQUksb0JBQW9CO0FBQUEsTUFDdEIsV0FBVSxLQUFLLDJCQUEyQixDQUFDLFNBQWM7QUFBQSxRQUN2RCxJQUNFLENBQUMseUJBQ0QsS0FBSyxVQUFVLFNBQVMsS0FDeEIsZUFDQTtBQUFBLFVBRUEsTUFBTSxRQUFrQixDQUFDO0FBQUEsVUFDekIsTUFBTSxlQUNKLGdCQUFnQixlQUFlLGdCQUFnQjtBQUFBLFVBRWpELEtBQUssU0FBUyxRQUFRLENBQUMsWUFBeUI7QUFBQSxZQUM5QyxNQUFNLE9BQU8sUUFBUTtBQUFBLFlBQ3JCLElBQUksT0FBTyxHQUFHO0FBQUEsY0FDWixNQUFNLEtBQUssSUFBSTtBQUFBLFlBQ2pCO0FBQUEsV0FDRDtBQUFBLFVBRUQsSUFBSSxNQUFNLFNBQVMsR0FBRztBQUFBLFlBQ3BCLE1BQU0sVUFBVSxLQUFLLE1BQ25CLE1BQU0sT0FBTyxDQUFDLEtBQUssU0FBUyxNQUFNLE1BQU0sQ0FBQyxJQUFJLE1BQU0sTUFDckQ7QUFBQSxZQUNBLE1BQU0sbUJBQW1CLGNBQWM7QUFBQSxZQUN2QyxjQUFjLFdBQVc7QUFBQSxZQUl6QixJQUFJLHFCQUFxQixLQUFLLFlBQVksa0JBQWtCO0FBQUEsY0FDMUQsTUFBTSxvQkFBb0IscUJBQXFCO0FBQUEsY0FDL0MsY0FBYyxpQkFBaUI7QUFBQSxjQUcvQixXQUFVLE9BQU8saUNBQWlDO0FBQUEsZ0JBQ2hELFVBQVU7QUFBQSxnQkFDVixRQUFRO0FBQUEsY0FDVixDQUFDO0FBQUEsWUFDSDtBQUFBLFlBR0EsdUJBQXVCLGNBQWMsVUFBVTtBQUFBLFlBQy9DLG1CQUFtQixjQUFjLGtCQUFrQixDQUFDO0FBQUEsWUFHcEQsV0FBVSxVQUFVLGNBQWM7QUFBQSxZQUdsQyxXQUFVLE9BQU8sK0JBQStCO0FBQUEsY0FDOUMsY0FBYztBQUFBLGNBQ2QsY0FBYztBQUFBLFlBQ2hCLENBQUM7QUFBQSxZQUVELHdCQUF3QjtBQUFBLFVBQzFCO0FBQUEsUUFDRjtBQUFBLE9BQ0Q7QUFBQSxJQUNIO0FBQUEsSUFHQSxNQUFNLG1CQUFtQixvQkFBb0I7QUFBQSxJQUM1QyxXQUFrQixVQUFVO0FBQUEsTUFDM0I7QUFBQSxNQUNBO0FBQUEsTUFDQSxxQkFBcUIsTUFBTSxlQUFlLG9CQUFvQjtBQUFBLE1BQzlELGtCQUFrQixNQUFNLGVBQWUsaUJBQWlCO0FBQUEsTUFDeEQscUJBQXFCLENBQUMsU0FBaUI7QUFBQSxRQUNyQyxJQUFJLGVBQWU7QUFBQSxVQUNqQixjQUFjLGdCQUFnQjtBQUFBLFVBQzlCLG1CQUFtQixjQUFjLGtCQUFrQixDQUFDO0FBQUEsUUFDdEQ7QUFBQTtBQUFBLE1BRUYsYUFBYSxNQUFNLGVBQWUsWUFBWTtBQUFBLE1BQzlDLDRCQUE0QixDQUFDLGFBQzNCLEtBQUssTUFDSCxhQUNJLGVBQWUsWUFBWSxtQkFBbUIsaUJBQ3BEO0FBQUEsTUFDRiwyQkFBMkIsQ0FBQyxVQUMxQixTQUFTLGVBQWUsWUFBWSxtQkFBbUI7QUFBQSxJQUMzRDtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUE7OztBQzVlWCxJQUFNLHFCQUFxQixPQUFxQjtBQUFBLEVBQzlDLFVBQVU7QUFBQSxFQUNWLGNBQWM7QUFBQSxFQUNkLFVBQVUsS0FBSyxJQUFJO0FBQUEsRUFDbkIsV0FBVztBQUFBLEVBQ1gsU0FBUyxDQUFDO0FBQ1o7QUFLQSxJQUFNLHFCQUFxQixDQUN6QixTQUNBLGFBQ0EscUJBQ2lCO0FBQUEsRUFDakIsTUFBTSxNQUFNLEtBQUssSUFBSTtBQUFBLEVBQ3JCLE1BQU0sWUFBWSxNQUFNLFFBQVE7QUFBQSxFQUVoQyxJQUFJLGNBQWM7QUFBQSxJQUFHLE9BQU87QUFBQSxFQUU1QixNQUFNLGdCQUFnQixjQUFjO0FBQUEsRUFFcEMsTUFBTSxrQkFBa0IsZ0JBQWdCO0FBQUEsRUFHeEMsTUFBTSxVQUFVLENBQUMsR0FBRyxRQUFRLFNBQVMsRUFBRSxVQUFVLGFBQWEsTUFBTSxJQUFJLENBQUM7QUFBQSxFQUd6RSxNQUFNLGdCQUFnQixRQUFRLE9BQU8sQ0FBQyxNQUFNLE1BQU0sRUFBRSxPQUFPLEdBQUc7QUFBQSxFQUc5RCxJQUFJLGNBQWM7QUFBQSxFQUNsQixJQUFJLGNBQWMsU0FBUyxHQUFHO0FBQUEsSUFDNUIsTUFBTSxlQUFlLGNBQWM7QUFBQSxJQUNuQyxNQUFNLGdCQUFnQixjQUFjLGFBQWE7QUFBQSxJQUNqRCxNQUFNLFlBQVksTUFBTSxhQUFhO0FBQUEsSUFDckMsY0FBYyxZQUFZLElBQUksZ0JBQWdCLFlBQVk7QUFBQSxFQUM1RDtBQUFBLEVBRUEsT0FBTztBQUFBLElBQ0wsVUFBVTtBQUFBLElBQ1YsY0FBYztBQUFBLElBQ2QsVUFBVTtBQUFBLElBQ1YsV0FBVyxpQkFBaUIsSUFBSSxZQUFZO0FBQUEsSUFDNUMsU0FBUztBQUFBLEVBQ1g7QUFBQTtBQU9LLElBQU0sZ0JBQWdCLENBQUMsU0FBMEIsQ0FBQyxNQUFNO0FBQUEsRUFDN0QsT0FBTyxDQUFnRCxlQUFvQjtBQUFBLElBQ3pFO0FBQUEsTUFDRSxjQUFjO0FBQUEsTUFDZCxjQUFjLG1CQUFtQixlQUFlO0FBQUEsTUFDaEQsWUFBWTtBQUFBLE1BQ1osY0FBYztBQUFBLE1BQ2QsY0FBYztBQUFBLFFBQ1o7QUFBQSxJQUdKLElBQUksaUJBQWlCO0FBQUEsSUFDckIsSUFBSSxtQkFBbUI7QUFBQSxJQUN2QixJQUFJLGdCQUFnQjtBQUFBLElBQ3BCLElBQUksY0FBYztBQUFBLElBQ2xCLElBQUksb0JBQW9CO0FBQUEsSUFDeEIsSUFBSSxpQkFBaUI7QUFBQSxJQUNyQixJQUFJLGVBQWUsbUJBQW1CO0FBQUEsSUFDdEMsSUFBSSxnQkFBK0I7QUFBQSxJQUNuQyxJQUFJLGlCQUFnQztBQUFBLElBQ3BDLElBQUksd0JBQXdCO0FBQUEsSUFDNUIsSUFBSSxpQkFBaUI7QUFBQSxJQUNyQixJQUFJLGlCQUFnQztBQUFBLElBQ3BDLElBQUksYUFBYTtBQUFBLElBQ2pCLElBQUksZ0JBQWdCO0FBQUEsSUFDcEIsSUFBSSxxQkFBcUI7QUFBQSxJQUN6QixJQUFJLGtCQUFrQjtBQUFBLElBQ3RCLElBQUksaUJBQWlCO0FBQUEsSUFDckIsSUFBSSx1QkFBdUI7QUFBQSxJQUMzQixJQUFJLHFCQUFxQjtBQUFBLElBS3pCLE1BQU0scUJBQXFCO0FBQUEsSUFNM0IsTUFBTSxzQkFBc0IsQ0FDMUIsaUJBQ0EsYUFDRztBQUFBLE1BQ0gsTUFBTSxtQkFBbUIsV0FBVztBQUFBLE1BQ3BDLElBQUkscUJBQXFCLG1CQUFtQjtBQUFBLFFBQzFDLG9CQUFvQjtBQUFBLFFBRXBCLE1BQU0saUJBQWlCLGdCQUFnQixRQUFRLGFBQWE7QUFBQSxRQUM1RCxJQUFJLGdCQUFnQjtBQUFBLFVBQ2xCLGVBQWUsVUFBVSxPQUN2Qix3QkFDQSxnQkFDRjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUE7QUFBQSxJQUlGLElBQUk7QUFBQSxJQUdKLGVBQWUsWUFBVyxNQUFNO0FBQUEsTUFDOUIsZ0JBQWdCLGlCQUFpQixVQUFTO0FBQUEsTUFHMUMsSUFBSSxlQUFlO0FBQUEsUUFDakIsbUJBQW1CLGNBQWMsb0JBQW9CO0FBQUEsUUFDckQsZ0JBQWdCLGNBQWMsaUJBQWlCO0FBQUEsUUFFL0MsSUFBSSxjQUFjLGlCQUFpQixHQUFHO0FBQUEsVUFDcEMsaUJBQWlCLGNBQWM7QUFBQSxRQUNqQztBQUFBLE1BQ0Y7QUFBQSxNQUdBLFdBQVUsS0FBSyxpQ0FBaUMsQ0FBQyxTQUFjO0FBQUEsUUFFN0QsbUJBQW1CLEtBQUssa0JBQWtCLGFBQWE7QUFBQSxPQUN4RDtBQUFBLE1BR0QsV0FBVSxLQUFLLGlDQUFpQyxDQUFDLFNBQWM7QUFBQSxRQUM3RCxJQUFJLEtBQUssYUFBYSxhQUFhLEtBQUssYUFBYSxnQkFBZ0I7QUFBQSxVQUNuRSxpQkFBaUIsS0FBSztBQUFBLFVBRXRCLG1CQUNFLGVBQWUsb0JBQW9CO0FBQUEsVUFDckMsZ0JBQWdCLGVBQWUsaUJBQWlCO0FBQUEsUUFDbEQ7QUFBQSxPQUNEO0FBQUEsTUFHRCxXQUFVLEtBQUssbUNBQW1DLENBQUMsU0FBYztBQUFBLFFBQy9ELElBQUksS0FBSyxlQUFlO0FBQUEsVUFDdEIsZ0JBQWdCLEtBQUs7QUFBQSxVQUNyQixtQkFBbUIsa0JBQWtCLGFBQWE7QUFBQSxRQUNwRDtBQUFBLE9BQ0Q7QUFBQSxNQUdELE1BQU0sa0JBQ0osZUFBZSxtQkFBb0IsV0FBa0I7QUFBQSxNQUN2RCxJQUFJLGlCQUFpQjtBQUFBLFFBRW5CLGdCQUFnQixpQkFBaUIsU0FBUyxhQUFhO0FBQUEsVUFDckQsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFFBR0Qsb0JBQW9CLGlCQUFpQixjQUFjO0FBQUEsUUFHbkQsSUFBSSxhQUFhO0FBQUEsVUFDZixnQkFBZ0IsaUJBQWlCLGFBQWEsZUFBZTtBQUFBLFFBQy9EO0FBQUEsUUFHQyxXQUFrQiw0QkFBNEI7QUFBQSxRQUM5QyxXQUFrQix3QkFBd0I7QUFBQSxNQUM3QyxFQUFPO0FBQUEsUUFDTCxRQUFRLEtBQUssd0RBQXdEO0FBQUE7QUFBQSxLQUV4RTtBQUFBLElBS0QsTUFBTSxxQkFBcUIsTUFBTTtBQUFBLE1BSS9CLElBQUksbUJBQW1CLE1BQU07QUFBQSxRQUMzQixxQkFBcUIsY0FBYztBQUFBLFFBQ25DLGlCQUFpQjtBQUFBLE1BQ25CO0FBQUEsTUFFQSxpQkFBaUI7QUFBQSxNQUNqQixNQUFNLFlBQVksTUFBTTtBQUFBLFFBQ3RCLElBQUksbUJBQW1CLHVCQUF1QjtBQUFBLFVBRTVDLElBQUksQ0FBQyxtQkFBbUIsYUFBYSxXQUFXLEtBQUssY0FBYztBQUFBLFlBSWpFLGlCQUFpQjtBQUFBLFlBQ2pCLGtCQUFrQjtBQUFBLFVBQ3BCO0FBQUEsUUFDRixFQUFPO0FBQUEsVUFFTCxpQkFBaUI7QUFBQTtBQUFBLFFBRW5CLHdCQUF3QjtBQUFBLFFBQ3hCLGlCQUFpQixzQkFBc0IsU0FBUztBQUFBO0FBQUEsTUFFbEQsaUJBQWlCLHNCQUFzQixTQUFTO0FBQUE7QUFBQSxJQUlsRCxNQUFNLG9CQUFvQixNQUFNO0FBQUEsTUFDOUIsSUFBSSxnQkFBZ0I7QUFBQSxRQUVsQixxQkFBcUIsY0FBYztBQUFBLFFBQ25DLGlCQUFpQjtBQUFBLE1BQ25CO0FBQUE7QUFBQSxJQUlGLE1BQU0sb0JBQW9CLE1BQU07QUFBQSxNQUU5QixrQkFBa0I7QUFBQSxNQUVsQixlQUFlLG1CQUFtQjtBQUFBLE1BQ2xDLGNBQWM7QUFBQSxNQUdkLFdBQVUsT0FBTyw2QkFBNkI7QUFBQSxRQUM1QyxVQUFVO0FBQUEsUUFDVixXQUFXLGFBQWE7QUFBQSxNQUMxQixDQUFDO0FBQUEsTUFHRCxXQUFVLE9BQU8saUJBQWlCO0FBQUEsUUFDaEMsVUFBVTtBQUFBLFFBQ1Y7QUFBQSxNQUNGLENBQUM7QUFBQTtBQUFBLElBR0gsTUFBTSwwQkFBMEIsTUFBTTtBQUFBLE1BQ3BDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxjQUFjO0FBQUEsUUFBZ0I7QUFBQTtBQUFBLElBT3ZELE1BQU0sa0JBQWtCLENBQUMsT0FBbUI7QUFBQSxNQUcxQyxpQkFBaUI7QUFBQSxNQUNqQixhQUFhLEtBQUssSUFBSTtBQUFBLE1BQ3RCLHFCQUFxQjtBQUFBLE1BQ3JCLGtCQUFrQjtBQUFBLE1BQ2xCLGlCQUFpQjtBQUFBLE1BQ2pCLHVCQUF1QjtBQUFBLE1BQ3ZCLHFCQUFxQjtBQUFBLE1BR3JCLElBQUksZUFBZSxhQUFhLFdBQVcsR0FBRztBQUFBLFFBQzVDLGtCQUFrQjtBQUFBLE1BQ3BCO0FBQUEsTUFFQSxNQUFNLGdCQUFpQixXQUFVLFNBQWlCO0FBQUEsTUFDbEQsSUFBSSxlQUFlLGNBQWM7QUFBQSxRQUMvQixjQUFjLGFBQWE7QUFBQSxNQUM3QjtBQUFBO0FBQUEsSUFJRixNQUFNLGNBQWMsQ0FBQyxVQUFzQjtBQUFBLE1BQ3pDLE1BQU0sZUFBZTtBQUFBLE1BRXJCLE1BQU0sUUFBUSxnQkFBZ0IsYUFBYSxNQUFNLFNBQVMsTUFBTTtBQUFBLE1BQ2hFLE1BQU0sY0FBYyxRQUFRO0FBQUEsTUFFNUIsTUFBTSxNQUFNLEtBQUssSUFBSTtBQUFBLE1BQ3JCLE1BQU0scUJBQXFCLE1BQU07QUFBQSxNQUNqQyxnQkFBZ0I7QUFBQSxNQUloQixJQUFJLG1CQUFtQixNQUFNO0FBQUEsUUFDM0IsTUFBTSxrQkFBa0IsTUFBTTtBQUFBLFFBQzlCLE1BQU0sc0JBQXNCLEtBQUssSUFBSSxXQUFXO0FBQUEsUUFHaEQsSUFBSSx1QkFBdUIsR0FBRztBQUFBLFVBQzVCLHFCQUFxQjtBQUFBLFVBQ3JCLGtCQUFrQjtBQUFBLFVBQ2xCLGlCQUFpQjtBQUFBLFFBQ25CO0FBQUEsUUFHQSxpQkFBaUIsS0FBSyxJQUFJLGdCQUFnQixtQkFBbUI7QUFBQSxRQUs3RCxNQUFNLGlCQUNKLHNCQUFzQixrQkFBa0IsT0FDeEMsc0JBQXNCLGtCQUFrQjtBQUFBLFFBSTFDLElBQUksQ0FBQyxrQkFBa0Isc0JBQXNCLGtCQUFrQixNQUFNO0FBQUEsVUFDbkU7QUFBQSxRQUNGLEVBQU8sU0FBSSxzQkFBc0Isa0JBQWtCLE1BQU07QUFBQSxVQUV2RCx1QkFBdUI7QUFBQSxRQUN6QjtBQUFBLFFBS0EsSUFBSSxDQUFDLGtCQUFrQixzQkFBc0IsaUJBQWlCLE1BQU07QUFBQSxVQUNsRTtBQUFBLFFBQ0YsRUFBTztBQUFBLFVBQ0wscUJBQXFCO0FBQUE7QUFBQSxRQUl2QixNQUFNLG9CQUFvQix3QkFBd0I7QUFBQSxRQUNsRCxNQUFNLGdCQUFnQixzQkFBc0I7QUFBQSxRQUM1QyxNQUFNLHNCQUNKLENBQUMsa0JBQ0Qsc0JBQXNCLGlCQUFpQixRQUN2QyxzQkFBc0Isa0JBQWtCO0FBQUEsUUFDMUMsTUFBTSxrQkFDSixxQkFBcUIsaUJBQWlCO0FBQUEsUUFPeEMsTUFBTSxjQUFjLHFCQUFxQjtBQUFBLFFBQ3pDLE1BQU0sZUFBZSxzQkFBc0IscUJBQXFCO0FBQUEsUUFDaEUsTUFBTSxhQUFhLHNCQUFzQjtBQUFBLFFBRXpDLElBQUksYUFBYTtBQUFBLFVBRWYsaUJBQWlCO0FBQUEsUUFDbkIsRUFBTyxTQUFJLG1CQUFtQixrQkFBa0IsS0FBSztBQUFBLFVBRW5ELGlCQUFpQjtBQUFBLFFBQ25CLEVBQU8sU0FBSSxZQUFZO0FBQUEsVUFFckIsaUJBQWlCO0FBQUEsUUFDbkIsRUFBTyxTQUFJLGdCQUFnQixrQkFBa0IsS0FBSztBQUFBLFVBRWhELGlCQUFpQjtBQUFBLFFBQ25CLEVBQU87QUFBQSxVQUVMLElBQUksbUJBQW1CLGdCQUFnQjtBQUFBLFlBQ3JDLGlCQUFpQjtBQUFBLFlBQ2pCLElBQUksZUFBZTtBQUFBLGNBQ2pCLGNBQWMsaUJBQWlCO0FBQUEsWUFDakM7QUFBQSxZQUNBLFdBQVUsU0FBUyxZQUFZO0FBQUEsVUFDakM7QUFBQSxVQUVBLGtCQUFrQjtBQUFBLFVBQ2xCO0FBQUE7QUFBQSxRQUlGLGtCQUFrQjtBQUFBLE1BQ3BCO0FBQUEsTUFFQSxNQUFNLG1CQUFtQjtBQUFBLE1BQ3pCLE1BQU0sWUFBWSxLQUFLLElBQUksR0FBRyxtQkFBbUIsYUFBYTtBQUFBLE1BRTlELElBQUksY0FBYyxpQkFBaUI7QUFBQSxNQUduQyxJQUFJLFdBQVc7QUFBQSxRQUNiLE1BQU0sa0JBQWtCO0FBQUEsUUFDeEIsY0FBYyxpQkFBaUIsY0FBYztBQUFBLE1BQy9DO0FBQUEsTUFFQSxjQUFjLE1BQU0sYUFBYSxHQUFHLFNBQVM7QUFBQSxNQUU3QyxJQUFJLGdCQUFnQixnQkFBZ0I7QUFBQSxRQUNsQyxpQkFBaUI7QUFBQSxRQUNqQixNQUFNLE9BQU0sS0FBSyxJQUFJO0FBQUEsUUFHckIsSUFBSSxDQUFDLGFBQWE7QUFBQSxVQUNoQixjQUFjO0FBQUEsVUFFZCxrQkFBa0I7QUFBQSxVQUNsQixtQkFBbUI7QUFBQSxRQUNyQjtBQUFBLFFBQ0EsaUJBQWlCO0FBQUEsUUFHakIsZUFBZSxtQkFDYixjQUNBLGdCQUNBLGdCQUNGO0FBQUEsUUFHQSxJQUFJLGVBQWU7QUFBQSxVQUNqQixjQUFjLGlCQUFpQjtBQUFBLFVBQy9CLGNBQWMsV0FBVyxhQUFhO0FBQUEsVUFDdEMsY0FBYyxrQkFBa0IsYUFBYTtBQUFBLFFBQy9DO0FBQUEsUUFHQSxNQUFNLGFBQ0osZUFBZSxtQkFBb0IsV0FBa0I7QUFBQSxRQUN2RCxJQUFJLFlBQVk7QUFBQSxVQUNkLG9CQUFvQixZQUFZLGNBQWM7QUFBQSxRQUNoRDtBQUFBLFFBR0EsV0FBVSxPQUFPLG1CQUFtQjtBQUFBLFVBQ2xDLFVBQVU7QUFBQSxVQUNWLFdBQVcsYUFBYTtBQUFBLFVBQ3hCO0FBQUEsUUFDRixDQUFDO0FBQUEsUUFFRCxXQUFVLE9BQU8sNkJBQTZCO0FBQUEsVUFDNUMsVUFBVSxhQUFhO0FBQUEsVUFDdkIsV0FBVyxhQUFhO0FBQUEsUUFDMUIsQ0FBQztBQUFBLFFBR0QsV0FBVSxTQUFTLFlBQVk7QUFBQSxNQUNqQztBQUFBO0FBQUEsSUFJRixNQUFNLG1CQUFtQixDQUFDLFVBQWtCLFdBQW9CO0FBQUEsTUFDOUQsTUFBTSxZQUFZLEtBQUssSUFBSSxHQUFHLG1CQUFtQixhQUFhO0FBQUEsTUFDOUQsTUFBTSxrQkFBa0IsTUFBTSxVQUFVLEdBQUcsU0FBUztBQUFBLE1BUXBELElBQUksb0JBQW9CLGdCQUFnQjtBQUFBLFFBQ3RDLE1BQU0sbUJBQW1CO0FBQUEsUUFDekIsaUJBQWlCO0FBQUEsUUFHakIsZUFBZSxtQkFDYixjQUNBLGdCQUNBLGdCQUNGO0FBQUEsUUFHQSxJQUFJLGVBQWU7QUFBQSxVQUNqQixjQUFjLGlCQUFpQjtBQUFBLFVBQy9CLGNBQWMsV0FBVyxhQUFhO0FBQUEsVUFDdEMsY0FBYyxrQkFBa0IsYUFBYTtBQUFBLFFBQy9DO0FBQUEsUUFFQSxNQUFNLFlBQ0osa0JBQWtCLG1CQUFtQixZQUFZO0FBQUEsUUFHbkQsTUFBTSxhQUNKLGVBQWUsbUJBQW9CLFdBQWtCO0FBQUEsUUFDdkQsSUFBSSxZQUFZO0FBQUEsVUFDZCxvQkFBb0IsWUFBWSxjQUFjO0FBQUEsUUFDaEQ7QUFBQSxRQUdBLFdBQVUsT0FBTyxtQkFBbUI7QUFBQSxVQUNsQyxVQUFVO0FBQUEsVUFDVjtBQUFBLFVBQ0E7QUFBQSxRQUNGLENBQUM7QUFBQSxRQUdELFdBQVUsT0FBTyw2QkFBNkI7QUFBQSxVQUM1QyxVQUFVLGFBQWE7QUFBQSxVQUN2QixXQUFXLGFBQWE7QUFBQSxRQUMxQixDQUFDO0FBQUEsUUFHRCxJQUFJLENBQUMsYUFBYTtBQUFBLFVBQ2hCLGNBQWM7QUFBQSxVQUNkLG1CQUFtQjtBQUFBLFFBQ3JCO0FBQUEsUUFDQSxpQkFBaUIsS0FBSyxJQUFJO0FBQUEsUUFHMUIsV0FBVSxTQUFTLFlBQVk7QUFBQSxNQUNqQyxFQUFPO0FBQUE7QUFBQSxJQVNULE1BQU0sZ0JBQWdCLENBQ3BCLE9BQ0EsWUFBd0MsWUFDckM7QUFBQSxNQUlILElBQUksQ0FBQyxlQUFlO0FBQUEsUUFFbEI7QUFBQSxNQUNGO0FBQUEsTUFFQSxNQUFNLFdBQVcsY0FBYyxZQUFZO0FBQUEsTUFDM0MsTUFBTSxhQUFhLGNBQWMsY0FBYztBQUFBLE1BQy9DLE1BQU0sa0JBQWtCLGFBQWE7QUFBQSxNQUNyQyxNQUFNLG1CQUNKLG1CQUFtQixlQUFlO0FBQUEsTUFDcEMsTUFBTSxlQUFlLGtCQUFrQjtBQUFBLE1BRXZDLElBQUk7QUFBQSxNQUVKLElBQUksY0FBYztBQUFBLFFBRWhCLE1BQU0sUUFBUSxRQUFRO0FBQUEsUUFDdEIsaUJBQWlCLFFBQVEsS0FBSyxJQUFJLGlCQUFpQixnQkFBZ0I7QUFBQSxNQUNyRSxFQUFPO0FBQUEsUUFFTCxpQkFBaUIsUUFBUTtBQUFBO0FBQUEsTUFJM0IsUUFBUTtBQUFBLGFBQ0Q7QUFBQSxVQUNILGtCQUFrQixnQkFBZ0IsSUFBSSxXQUFXO0FBQUEsVUFDakQ7QUFBQSxhQUNHO0FBQUEsVUFDSCxrQkFBa0IsZ0JBQWdCO0FBQUEsVUFDbEM7QUFBQTtBQUFBLE1BV0osaUJBQWlCLGdCQUFnQixlQUFlO0FBQUE7QUFBQSxJQUlsRCxNQUFNLGVBQWUsQ0FDbkIsTUFDQSxRQUFnQixJQUNoQixZQUF3QyxZQUNyQztBQUFBLE1BRUgsSUFDRSxPQUFPLGNBQWMsWUFDckIsQ0FBQyxDQUFDLFNBQVMsVUFBVSxLQUFLLEVBQUUsU0FBUyxTQUFTLEdBQzlDO0FBQUEsUUFDQSxRQUFRLEtBQ04sa0NBQWtDLDJCQUNwQztBQUFBLFFBQ0EsWUFBWTtBQUFBLE1BQ2Q7QUFBQSxNQUdBLE1BQU0saUJBQWtCLFdBQWtCO0FBQUEsTUFDMUMsTUFBTSxlQUFlLGdCQUFnQixZQUFZLGFBQWE7QUFBQSxNQUU5RCxJQUFJLGNBQWM7QUFBQSxRQUVoQixNQUFNLGFBQWMsV0FBVSxTQUFpQjtBQUFBLFFBQy9DLElBQUksWUFBWTtBQUFBLFVBQ2QsTUFBTSxvQkFBb0IsS0FBSyxNQUM3QixXQUFXLGdCQUFnQixFQUFFLElBQy9CO0FBQUEsVUFFQSxJQUFJLE9BQU8sb0JBQW9CLEdBQUc7QUFBQSxZQUVoQyxNQUFNLGlCQUFpQjtBQUFBLFlBQ3ZCLE1BQU0sYUFBYSxLQUFLLElBQ3RCLE1BQ0Esb0JBQW9CLGNBQ3RCO0FBQUEsWUFFQSxRQUFRLEtBQ04sNENBQTRDLDBCQUMxQyw0REFBNEQsd0JBQzVELHdCQUF3QixZQUM1QjtBQUFBLFlBR0EsTUFBTSxnQkFBZ0IsYUFBYSxLQUFLO0FBQUEsWUFDeEMsTUFBTSxnQkFBZ0Isb0JBQW9CO0FBQUEsWUFVMUMsTUFBTSxrQkFBa0Isb0JBQW9CO0FBQUEsWUFDNUMsY0FBYyxpQkFBaUIsU0FBUztBQUFBLFlBR3hDO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsTUFHQSxNQUFNLFNBQVMsT0FBTyxLQUFLO0FBQUEsTUFPM0IsY0FBYyxPQUFPLFNBQVM7QUFBQTtBQUFBLElBSWhDLE1BQU0scUJBQXFCLENBQ3pCLGNBQ0EscUJBQ0c7QUFBQSxNQUNILG1CQUFtQjtBQUFBLE1BQ25CLGdCQUFnQjtBQUFBLE1BRWhCLElBQUksZUFBZTtBQUFBLFFBQ2pCLGNBQWMsbUJBQW1CO0FBQUEsUUFDakMsY0FBYyxnQkFBZ0I7QUFBQSxNQUNoQztBQUFBLE1BS0EsTUFBTSxhQUFhLGVBQWUsY0FBYztBQUFBLE1BQ2hELElBQUksY0FBYyxHQUFHO0FBQUEsUUFDbkI7QUFBQSxNQUNGO0FBQUEsTUFHQSxNQUFNLFlBQVksS0FBSyxJQUFJLEdBQUcsbUJBQW1CLGFBQWE7QUFBQSxNQUM5RCxJQUFJLGlCQUFpQixXQUFXO0FBQUEsUUFDOUIsaUJBQWlCLFNBQVM7QUFBQSxNQUM1QjtBQUFBO0FBQUEsSUFJRixNQUFNLHdCQUF3QixXQUFVLFNBQVM7QUFBQSxJQUNqRCxXQUFVLFNBQVMsZ0JBQWdCLENBQ2pDLE9BQ0EsY0FDRztBQUFBLE1BQ0gsY0FBYyxPQUFPLFNBQVM7QUFBQSxNQUM5Qix3QkFBd0IsT0FBTyxTQUFTO0FBQUE7QUFBQSxJQUl6QyxXQUFVLFNBQWlCLGVBQWUsQ0FDekMsTUFDQSxPQUNBLGNBQ0c7QUFBQSxNQUNILGFBQWEsTUFBTSxPQUFPLFNBQVM7QUFBQTtBQUFBLElBR3JDLE1BQU0sMkJBQTJCLFdBQVUsU0FBUztBQUFBLElBQ3BELFdBQVUsU0FBUyxtQkFBbUIsQ0FBQyxhQUFxQjtBQUFBLE1BQzFELGlCQUFpQixVQUFVLEtBQUs7QUFBQSxNQUNoQywyQkFBMkIsUUFBUTtBQUFBO0FBQUEsSUFHckMsTUFBTSw0QkFBNEIsV0FBVSxTQUFTO0FBQUEsSUFDckQsV0FBVSxTQUFTLG9CQUFvQixNQUFNO0FBQUEsTUFDM0MsT0FBTztBQUFBO0FBQUEsSUFPVCxJQUFJLGFBQWEsY0FBYSxPQUFPLFdBQVUsWUFBWSxZQUFZO0FBQUEsTUFDckUsTUFBTSxrQkFBa0IsV0FBVTtBQUFBLE1BQ2xDLFdBQVUsVUFBVSxNQUFNO0FBQUEsUUFFeEIsTUFBTSxrQkFBbUIsV0FBa0I7QUFBQSxRQUMzQyxJQUFJLGlCQUFpQjtBQUFBLFVBQ25CLGdCQUFnQixvQkFBb0IsU0FBUyxXQUFXO0FBQUEsVUFDeEQsSUFBSyxXQUFrQix1QkFBdUI7QUFBQSxZQUM1QyxnQkFBZ0Isb0JBQW9CLGFBQWEsZUFBZTtBQUFBLFVBQ2xFO0FBQUEsUUFDRjtBQUFBLFFBR0EsSUFBSSxlQUFlO0FBQUEsVUFDakIsYUFBYSxhQUFhO0FBQUEsUUFDNUI7QUFBQSxRQUVBLGtCQUFrQjtBQUFBLFFBQ2xCLGtCQUFrQjtBQUFBO0FBQUEsSUFFdEI7QUFBQSxJQUdBLE1BQU0sV0FBVyxDQUFDLFVBQWtCO0FBQUEsTUFDbEMsTUFBTSxtQkFBbUI7QUFBQSxNQUN6QixNQUFNLFlBQVksS0FBSyxJQUFJLEdBQUcsbUJBQW1CLGFBQWE7QUFBQSxNQUM5RCxNQUFNLGNBQWMsTUFBTSxpQkFBaUIsT0FBTyxHQUFHLFNBQVM7QUFBQSxNQUU5RCxJQUFJLGdCQUFnQixrQkFBa0I7QUFBQSxRQUNwQyxpQkFBaUI7QUFBQSxRQUdqQixlQUFlLG1CQUNiLGNBQ0EsZ0JBQ0EsZ0JBQ0Y7QUFBQSxRQUdBLElBQUksZUFBZTtBQUFBLFVBQ2pCLGNBQWMsaUJBQWlCO0FBQUEsVUFDL0IsY0FBYyxXQUFXLGFBQWE7QUFBQSxRQUN4QztBQUFBLFFBR0EsTUFBTSxhQUNKLGVBQWUsbUJBQW9CLFdBQWtCO0FBQUEsUUFDdkQsSUFBSSxZQUFZO0FBQUEsVUFDZCxvQkFBb0IsWUFBWSxjQUFjO0FBQUEsUUFDaEQ7QUFBQSxRQUdBLFdBQVUsT0FBTyxtQkFBbUI7QUFBQSxVQUNsQyxVQUFVO0FBQUEsVUFDVixVQUFVLGFBQWE7QUFBQSxVQUN2QixXQUFXLGFBQWE7QUFBQSxRQUMxQixDQUFDO0FBQUEsUUFHRCxXQUFVLFNBQVMsY0FBYztBQUFBLFFBR2pDLElBQUksQ0FBQyxhQUFhO0FBQUEsVUFDaEIsY0FBYztBQUFBLFVBQ2QsbUJBQW1CO0FBQUEsUUFDckI7QUFBQSxRQUNBLGlCQUFpQixLQUFLLElBQUk7QUFBQSxNQUM1QjtBQUFBO0FBQUEsSUFJRCxXQUFVLFNBQWlCLGlCQUFpQjtBQUFBLE1BQzNDO0FBQUEsSUFDRjtBQUFBLElBR0EsV0FBVSxTQUFTLFdBQVc7QUFBQSxJQUM5QixXQUFVLFNBQVMsY0FBYyxNQUFNLGFBQWE7QUFBQSxJQUduRCxXQUFrQixZQUFZO0FBQUEsTUFDN0I7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQSxtQkFBbUIsTUFBTTtBQUFBLE1BQ3pCO0FBQUEsTUFDQSxhQUFhLE1BQU0sYUFBYTtBQUFBLE1BQ2hDLGNBQWMsTUFBTSxhQUFhO0FBQUEsTUFDakMsYUFBYSxNQUFNO0FBQUEsSUFDckI7QUFBQSxJQUVBLE9BQU87QUFBQTtBQUFBOzs7QUMxeEJKLElBQU0sZUFBZSxDQUFDLFNBQXlCLENBQUMsTUFBTTtBQUFBLEVBQzNELE9BQU8sQ0FBZ0QsZUFBb0I7QUFBQSxJQUN6RTtBQUFBLE1BQ0UsVUFBVSxtQkFBbUIsU0FBUztBQUFBLE1BQ3RDLGVBQWUsbUJBQW1CLFNBQVM7QUFBQSxNQUMzQyxjQUFjLG1CQUFtQixTQUFTO0FBQUEsTUFDMUMsY0FBYyxtQkFBbUIsU0FBUztBQUFBLE1BQzFDLHVCQUF1QixtQkFBbUIsU0FBUztBQUFBLE1BQ25ELGNBQWM7QUFBQSxRQUNaO0FBQUEsSUFLSixJQUFJLHNCQUFxQztBQUFBLElBQ3pDLElBQUksYUFBYTtBQUFBLElBQ2pCLElBQUksa0JBQWtCO0FBQUEsSUFDdEIsSUFBSSxvQkFBb0I7QUFBQSxJQUN4QixJQUFJLG9CQUFvQjtBQUFBLElBQ3hCLElBQUksaUJBQWlCO0FBQUEsSUFDckIsSUFBSTtBQUFBLElBQ0osSUFBSTtBQUFBLElBQ0osSUFBSSxZQUFZO0FBQUEsSUFHaEIsTUFBTSxxQkFBcUIsV0FBVSxTQUFTO0FBQUEsSUFDOUMsV0FBVSxTQUFTLGFBQWEsTUFBTTtBQUFBLE1BQ3BDLE1BQU0sU0FBUyxtQkFBbUI7QUFBQSxNQUVsQyxJQUFJLFdBQVcsT0FBTztBQUFBLFFBQ3BCLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFHQSxnQkFBaUIsV0FBVSxTQUFpQjtBQUFBLE1BQzVDLGlCQUFrQixXQUFVLFNBQWlCO0FBQUEsTUFDN0MsT0FBTztBQUFBO0FBQUEsSUFJVCxNQUFNLGVBQWUsTUFBTTtBQUFBLE1BQ3pCLElBQUkscUJBQXFCO0FBQUEsUUFDdkIscUJBQXFCLG1CQUFtQjtBQUFBLFFBQ3hDLHNCQUFzQjtBQUFBLFFBRXRCLElBQUksZ0JBQWdCO0FBQUEsVUFDbEIsZUFBZSxvQkFBb0I7QUFBQSxRQUNyQztBQUFBLE1BQ0Y7QUFBQTtBQUFBLElBSUYsTUFBTSxnQkFBZ0IsQ0FBQyxvQkFBNEI7QUFBQSxNQUVqRCxJQUFJLHFCQUFxQjtBQUFBLFFBQ3ZCLHFCQUFxQixtQkFBbUI7QUFBQSxNQUMxQztBQUFBLE1BRUEsSUFBSSxXQUFXO0FBQUEsTUFFZixNQUFNLFVBQVUsTUFBTTtBQUFBLFFBRXBCLFlBQVk7QUFBQSxRQUdaLElBQUksS0FBSyxJQUFJLFFBQVEsSUFBSSxhQUFhO0FBQUEsVUFDcEMsc0JBQXNCO0FBQUEsVUFFdEIsSUFBSSxnQkFBZ0I7QUFBQSxZQUNsQixlQUFlLG9CQUFvQjtBQUFBLFVBQ3JDO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUdBLE1BQU0sYUFBYSxXQUFXLG1CQUFtQixTQUFTO0FBQUEsUUFHMUQsSUFBSSxXQUFVLFNBQVMsVUFBVTtBQUFBLFVBQy9CLFdBQVUsU0FBUyxTQUFTLFVBQVU7QUFBQSxVQUd0QyxzQkFBc0Isc0JBQXNCLE9BQU87QUFBQSxRQUNyRCxFQUFPO0FBQUEsVUFFTCxzQkFBc0I7QUFBQTtBQUFBO0FBQUEsTUFJMUIsc0JBQXNCLHNCQUFzQixPQUFPO0FBQUE7QUFBQSxJQUlyRCxNQUFNLG1CQUFtQixDQUFDLE1BQWtCO0FBQUEsTUFDMUMsYUFBYTtBQUFBLE1BQ2IsTUFBTSxRQUFRLEVBQUUsUUFBUTtBQUFBLE1BQ3hCLE1BQU0sY0FBYyxlQUFlLGVBQWU7QUFBQSxNQUNsRCxvQkFDRSxnQkFBZ0IsYUFBYSxNQUFNLFVBQVUsTUFBTTtBQUFBLE1BQ3JELGlCQUFpQixLQUFLLElBQUk7QUFBQSxNQUcxQixJQUFJLHFCQUFxQjtBQUFBLFFBQ3ZCLHFCQUFxQixtQkFBbUI7QUFBQSxRQUN4QyxzQkFBc0I7QUFBQSxNQUN4QjtBQUFBO0FBQUEsSUFHRixNQUFNLGtCQUFrQixDQUFDLE1BQWtCO0FBQUEsTUFDekMsSUFBSSxDQUFDO0FBQUEsUUFBWTtBQUFBLE1BRWpCLEVBQUUsZUFBZTtBQUFBLE1BRWpCLE1BQU0sUUFBUSxFQUFFLFFBQVE7QUFBQSxNQUN4QixNQUFNLGNBQWMsZUFBZSxlQUFlO0FBQUEsTUFDbEQsTUFBTSxrQkFDSixnQkFBZ0IsYUFBYSxNQUFNLFVBQVUsTUFBTTtBQUFBLE1BQ3JELE1BQU0sUUFBUSxvQkFBb0I7QUFBQSxNQUNsQyxvQkFBb0I7QUFBQSxNQUdwQixJQUFJLFdBQVUsU0FBUyxVQUFVO0FBQUEsUUFDL0IsV0FBVSxTQUFTLFNBQVMsS0FBSztBQUFBLE1BQ25DO0FBQUE7QUFBQSxJQUdGLE1BQU0saUJBQWlCLE1BQU07QUFBQSxNQUMzQixJQUFJLENBQUM7QUFBQSxRQUFZO0FBQUEsTUFDakIsYUFBYTtBQUFBLE1BRWIsTUFBTSxlQUFlLEtBQUssSUFBSTtBQUFBLE1BQzlCLE1BQU0sZ0JBQWdCLGVBQWU7QUFBQSxNQUdyQyxNQUFNLFdBQVcsV0FBVSxTQUFTLGNBQWMsS0FBSztBQUFBLE1BR3ZELElBQ0UsZ0JBQWdCLGVBQ2hCLEtBQUssSUFBSSxRQUFRLElBQUksc0JBQ3JCO0FBQUEsUUFDQSxjQUFjLFFBQVE7QUFBQSxNQUN4QjtBQUFBO0FBQUEsSUFJRixNQUFNLGNBQWMsQ0FBQyxPQUFtQjtBQUFBLE1BQ3RDLGFBQWE7QUFBQTtBQUFBLElBSWYsTUFBTSxrQkFBa0IsQ0FBQyxNQUFrQjtBQUFBLE1BQ3pDLGtCQUFrQjtBQUFBLE1BQ2xCLE1BQU0sY0FBYyxlQUFlLGVBQWU7QUFBQSxNQUNsRCxvQkFBb0IsZ0JBQWdCLGFBQWEsRUFBRSxVQUFVLEVBQUU7QUFBQSxNQUMvRCxpQkFBaUIsS0FBSyxJQUFJO0FBQUEsTUFHMUIsYUFBYTtBQUFBLE1BR2IsRUFBRSxlQUFlO0FBQUE7QUFBQSxJQUduQixNQUFNLGtCQUFrQixDQUFDLE1BQWtCO0FBQUEsTUFDekMsSUFBSSxDQUFDO0FBQUEsUUFBaUI7QUFBQSxNQUV0QixNQUFNLGNBQWMsZUFBZSxlQUFlO0FBQUEsTUFDbEQsTUFBTSxrQkFDSixnQkFBZ0IsYUFBYSxFQUFFLFVBQVUsRUFBRTtBQUFBLE1BQzdDLE1BQU0sUUFBUSxvQkFBb0I7QUFBQSxNQUNsQyxvQkFBb0I7QUFBQSxNQUdwQixJQUFJLFdBQVUsU0FBUyxVQUFVO0FBQUEsUUFDL0IsV0FBVSxTQUFTLFNBQVMsS0FBSztBQUFBLE1BQ25DO0FBQUE7QUFBQSxJQUdGLE1BQU0sZ0JBQWdCLE1BQU07QUFBQSxNQUMxQixJQUFJLENBQUM7QUFBQSxRQUFpQjtBQUFBLE1BQ3RCLGtCQUFrQjtBQUFBLE1BRWxCLE1BQU0sY0FBYyxLQUFLLElBQUk7QUFBQSxNQUM3QixNQUFNLGVBQWUsY0FBYztBQUFBLE1BR25DLE1BQU0sV0FBVyxXQUFVLFNBQVMsY0FBYyxLQUFLO0FBQUEsTUFHdkQsSUFDRSxlQUFlLGVBQ2YsS0FBSyxJQUFJLFFBQVEsSUFBSSxzQkFDckI7QUFBQSxRQUNBLGNBQWMsUUFBUTtBQUFBLE1BQ3hCO0FBQUE7QUFBQSxJQUlGLE1BQU0sZUFBZSxXQUFVLFNBQVM7QUFBQSxJQUN4QyxXQUFVLFNBQVMsYUFBYSxNQUFNO0FBQUEsTUFDcEMsTUFBTSxTQUFTLGFBQWE7QUFBQSxNQUU1QixJQUFJLFdBQVcsT0FBTztBQUFBLFFBQ3BCLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFFQSxNQUFNLGtCQUNILFdBQWtCLG1CQUNsQixXQUFVLFNBQWlCLE9BQU87QUFBQSxNQUVyQyxJQUFJLGlCQUFpQjtBQUFBLFFBRW5CLGdCQUFnQixpQkFBaUIsY0FBYyxrQkFBa0I7QUFBQSxVQUMvRCxTQUFTO0FBQUEsUUFDWCxDQUFDO0FBQUEsUUFDRCxnQkFBZ0IsaUJBQWlCLGFBQWEsaUJBQWlCO0FBQUEsVUFDN0QsU0FBUztBQUFBLFFBQ1gsQ0FBQztBQUFBLFFBQ0QsZ0JBQWdCLGlCQUFpQixZQUFZLGdCQUFnQjtBQUFBLFVBQzNELFNBQVM7QUFBQSxRQUNYLENBQUM7QUFBQSxRQUdELGdCQUFnQixpQkFBaUIsYUFBYSxlQUFlO0FBQUEsUUFDN0QsZ0JBQWdCLGlCQUFpQixhQUFhLGVBQWU7QUFBQSxRQUM3RCxnQkFBZ0IsaUJBQWlCLFdBQVcsYUFBYTtBQUFBLFFBQ3pELGdCQUFnQixpQkFBaUIsY0FBYyxhQUFhO0FBQUEsUUFHNUQsSUFBSSxhQUFhO0FBQUEsVUFDZixnQkFBZ0IsaUJBQWlCLFNBQVMsV0FBVztBQUFBLFFBQ3ZEO0FBQUEsUUFHQyxXQUFrQiwyQkFBMkI7QUFBQSxRQUM3QyxXQUFrQix1QkFBdUI7QUFBQSxNQUM1QztBQUFBO0FBQUEsSUFJRixJQUFJLGFBQWEsY0FBYSxPQUFPLFdBQVUsWUFBWSxZQUFZO0FBQUEsTUFDckUsTUFBTSxrQkFBa0IsV0FBVTtBQUFBLE1BQ2xDLFdBQVUsVUFBVSxNQUFNO0FBQUEsUUFFeEIsTUFBTSxrQkFBbUIsV0FBa0I7QUFBQSxRQUMzQyxJQUFJLGlCQUFpQjtBQUFBLFVBQ25CLGdCQUFnQixvQkFBb0IsY0FBYyxnQkFBZ0I7QUFBQSxVQUNsRSxnQkFBZ0Isb0JBQW9CLGFBQWEsZUFBZTtBQUFBLFVBQ2hFLGdCQUFnQixvQkFBb0IsWUFBWSxjQUFjO0FBQUEsVUFDOUQsZ0JBQWdCLG9CQUFvQixhQUFhLGVBQWU7QUFBQSxVQUNoRSxnQkFBZ0Isb0JBQW9CLGFBQWEsZUFBZTtBQUFBLFVBQ2hFLGdCQUFnQixvQkFBb0IsV0FBVyxhQUFhO0FBQUEsVUFDNUQsZ0JBQWdCLG9CQUFvQixjQUFjLGFBQWE7QUFBQSxVQUMvRCxJQUFLLFdBQWtCLHNCQUFzQjtBQUFBLFlBQzNDLGdCQUFnQixvQkFBb0IsU0FBUyxXQUFXO0FBQUEsVUFDMUQ7QUFBQSxRQUNGO0FBQUEsUUFHQSxhQUFhO0FBQUEsUUFFYixnQkFBZ0I7QUFBQTtBQUFBLElBRXBCO0FBQUEsSUFHQyxXQUFVLFNBQWlCLGdCQUFnQjtBQUFBLE1BQzFDO0FBQUEsSUFDRjtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUE7OztBQzVSbUMsSUFBOUM7QUF3Qk8sU0FBUyxhQUFhLENBQUMsU0FBMEIsQ0FBQyxHQUFHO0FBQUEsRUFDMUQsT0FBTyxDQUNMLGVBQzJCO0FBQUEsSUFDM0I7QUFBQSxNQUNFLFVBQVU7QUFBQSxNQUNWLFdBQVc7QUFBQSxNQUNYLGlCQUFpQjtBQUFBLE1BQ2pCLGVBQWU7QUFBQSxNQUNmLGNBQWM7QUFBQSxRQUNaO0FBQUEsSUFHSixJQUFJLENBQUMsU0FBUztBQUFBLE1BQ1osT0FBTztBQUFBLFdBQ0Y7QUFBQSxRQUNILFdBQVc7QUFBQSxVQUNULE1BQU0sTUFBTTtBQUFBLFVBQ1osTUFBTSxNQUFNO0FBQUEsVUFDWixjQUFjLE1BQU07QUFBQSxVQUNwQixnQkFBZ0IsTUFBTTtBQUFBLFFBQ3hCO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUdBLElBQUksa0JBQXNDO0FBQUEsSUFDMUMsSUFBSSxpQkFBcUM7QUFBQSxJQUN6QyxJQUFJLGlCQUFxQztBQUFBLElBQ3pDLElBQUksZ0JBQWdCO0FBQUEsSUFDcEIsSUFBSSxhQUFhO0FBQUEsSUFDakIsSUFBSSxhQUFhO0FBQUEsSUFDakIsSUFBSSwwQkFBMEI7QUFBQSxJQUM5QixJQUFJLGNBQW9EO0FBQUEsSUFDeEQsSUFBSSxtQkFBbUI7QUFBQSxJQUN2QixJQUFJLGdCQUFnQjtBQUFBLElBQ3BCLElBQUksY0FBYztBQUFBLElBQ2xCLElBQUksbUJBQWtDO0FBQUEsSUFDdEMsSUFBSSw4QkFBNkM7QUFBQSxJQUNqRCxJQUFJLGVBQWU7QUFBQSxJQUNuQixJQUFJLG1CQUFtQjtBQUFBLElBR3ZCLE1BQU0sMEJBQTBCLE1BQU07QUFBQSxNQUNwQyxJQUFJLENBQUM7QUFBQSxRQUFpQjtBQUFBLE1BRXRCLGlCQUFpQixTQUFTLGNBQWMsS0FBSztBQUFBLE1BQzdDLHNCQUFTLGdCQUFnQixtQkFBbUIsVUFBVSxRQUFRLFNBQVM7QUFBQSxNQUN2RSxlQUFlLE1BQU0sVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLE1BUS9CLGlCQUFpQixTQUFTLGNBQWMsS0FBSztBQUFBLE1BRTdDLHNCQUNFLGdCQUNBLG1CQUFtQixVQUFVLFFBQVEsZUFDdkM7QUFBQSxNQUVBLGVBQWUsWUFBWSxjQUFjO0FBQUEsTUFDekMsZ0JBQWdCLFlBQVksY0FBYztBQUFBO0FBQUEsSUFJNUMsTUFBTSxPQUFPLE1BQU07QUFBQSxNQUNqQixJQUFJLENBQUMsa0JBQWtCLG9CQUFvQjtBQUFBLFFBQWU7QUFBQSxNQUUxRCxJQUFJLGFBQWE7QUFBQSxRQUNmLGFBQWEsV0FBVztBQUFBLFFBQ3hCLGNBQWM7QUFBQSxNQUNoQjtBQUFBLE1BRUEsc0JBQ0UsZ0JBQ0EsbUJBQW1CLFVBQVUsUUFBUSxpQkFDdkM7QUFBQSxNQUVBLElBQUksWUFBWSxDQUFDLFlBQVk7QUFBQSxRQUMzQixjQUFjLFdBQVcsTUFBTSxXQUFXO0FBQUEsTUFDNUM7QUFBQTtBQUFBLElBR0YsTUFBTSxPQUFPLE1BQU07QUFBQSxNQUNqQixJQUFJLENBQUMsa0JBQWtCO0FBQUEsUUFBWTtBQUFBLE1BQ25DLHlCQUNFLGdCQUNBLG1CQUFtQixVQUFVLFFBQVEsaUJBQ3ZDO0FBQUE7QUFBQSxJQUlGLE1BQU0sZUFBZSxDQUFDLGNBQXNCLHFCQUE2QjtBQUFBLE1BQ3ZFLG1CQUFtQjtBQUFBLE1BQ25CLGdCQUFnQjtBQUFBLE1BRWhCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztBQUFBLFFBQWdCO0FBQUEsTUFFeEMsTUFBTSxpQkFBaUIsbUJBQW1CO0FBQUEsTUFJMUMsZUFBZSxNQUFNLFVBQVUsaUJBQWlCLFVBQVU7QUFBQSxNQUUxRCxJQUFJLGdCQUFnQjtBQUFBLFFBQ2xCLElBQUk7QUFBQSxRQUVKLElBQUksZ0JBQWdCLG1CQUFtQixHQUFHO0FBQUEsVUFHeEMsTUFBTSxpQkFDSixtQkFBbUIsSUFBSSxtQkFBbUIsbUJBQW1CO0FBQUEsVUFDL0QsY0FDRSxnQkFDQSxLQUFLLElBQUksZ0JBQWdCLG1CQUFtQixhQUFhO0FBQUEsUUFDN0QsRUFBTztBQUFBLFVBRUwsY0FBYyxnQkFBZ0I7QUFBQTtBQUFBLFFBR2hDLGNBQWMsS0FBSyxJQUFJLGdCQUFnQixjQUFjLGFBQWE7QUFBQSxRQUNsRSxlQUFlLE1BQU0sU0FBUyxHQUFHO0FBQUEsUUFDakMsZUFBZSxXQUFVLFVBQVUsa0JBQWtCLEtBQUssQ0FBQztBQUFBLE1BQzdEO0FBQUE7QUFBQSxJQUlGLE1BQU0saUJBQWlCLENBQUMsY0FBc0I7QUFBQSxNQUM1QyxJQUFJLENBQUMsa0JBQWtCLENBQUM7QUFBQSxRQUFnQjtBQUFBLE1BRXhDLE1BQU0scUJBQXFCLG1CQUFtQjtBQUFBLE1BQzlDLElBQUksc0JBQXNCO0FBQUEsUUFBRztBQUFBLE1BRTdCLE1BQU0sY0FBYyxLQUFLLElBQ3ZCLEdBQ0EsS0FBSyxJQUFJLEdBQUcsWUFBWSxrQkFBa0IsQ0FDNUM7QUFBQSxNQUNBLE1BQU0sbUJBQ0osZUFBZSxlQUFlLGVBQWU7QUFBQSxNQUMvQyxNQUFNLGdCQUFnQixjQUFjO0FBQUEsTUFFcEMsZUFBZSxNQUFNLFlBQVksY0FBYztBQUFBO0FBQUEsSUFJakQsTUFBTSxtQkFBbUIsQ0FBQyxNQUFrQjtBQUFBLE1BQzFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxrQkFBa0IsRUFBRSxXQUFXO0FBQUEsUUFDckQ7QUFBQSxNQUVGLE1BQU0sWUFBWSxlQUFlLHNCQUFzQjtBQUFBLE1BQ3ZELE1BQU0sU0FBUyxFQUFFLFVBQVUsVUFBVTtBQUFBLE1BQ3JDLE1BQU0sZUFBZSxTQUFTLGNBQWM7QUFBQSxNQUM1QyxNQUFNLG1CQUFtQixnQkFBZ0I7QUFBQSxNQUN6QyxNQUFNLGdCQUFnQixLQUFLLElBQ3pCLEdBQ0EsS0FBSyxJQUFJLGNBQWMsZ0JBQWdCLENBQ3pDO0FBQUEsTUFDQSxNQUFNLGNBQWMsZ0JBQWdCO0FBQUEsTUFDcEMsTUFBTSx1QkFDSixlQUFlLG1CQUFtQjtBQUFBLE1BRXBDLFdBQVUsVUFBVSxpQkFBaUIsb0JBQW9CO0FBQUE7QUFBQSxJQUkzRCxNQUFNLHVCQUF1QixDQUFDLE1BQWtCO0FBQUEsTUFDOUMsRUFBRSxlQUFlO0FBQUEsTUFDakIsRUFBRSxnQkFBZ0I7QUFBQSxNQUVsQixhQUFhO0FBQUEsTUFDYixhQUFhLEVBQUU7QUFBQSxNQUNmLDBCQUEwQixXQUFVLFVBQVUsa0JBQWtCLEtBQUs7QUFBQSxNQUVyRSxJQUFJLGdCQUFnQjtBQUFBLFFBQ2xCLHNCQUNFLGdCQUNBLG1CQUFtQixVQUFVLFFBQVEsa0JBQ3ZDO0FBQUEsTUFDRjtBQUFBLE1BR0EsV0FBVSxPQUFPLHVCQUF1QjtBQUFBLFFBQ3RDLFFBQVE7QUFBQSxRQUNSLGVBQWU7QUFBQSxNQUNqQixDQUFDO0FBQUEsTUFFRCxTQUFTLGlCQUFpQixhQUFhLGVBQWU7QUFBQSxNQUN0RCxTQUFTLGlCQUFpQixXQUFXLGFBQWE7QUFBQTtBQUFBLElBR3BELE1BQU0sa0JBQWtCLENBQUMsTUFBa0I7QUFBQSxNQUN6QyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDO0FBQUEsUUFBZ0I7QUFBQSxNQUV2RCxNQUFNLFNBQVMsRUFBRSxVQUFVO0FBQUEsTUFDM0IsTUFBTSxjQUFjLGVBQWU7QUFBQSxNQUNuQyxNQUFNLGVBQWMsZUFBZTtBQUFBLE1BQ25DLE1BQU0saUJBQWlCLGNBQWM7QUFBQSxNQUVyQyxJQUFJLGtCQUFrQjtBQUFBLFFBQUc7QUFBQSxNQUV6QixNQUFNLGFBQWEsU0FBUztBQUFBLE1BQzVCLE1BQU0sdUJBQ0osMkJBQTJCLG1CQUFtQjtBQUFBLE1BQ2hELE1BQU0saUJBQWlCLEtBQUssSUFDMUIsR0FDQSxLQUFLLElBQUksR0FBRyx1QkFBdUIsVUFBVSxDQUMvQztBQUFBLE1BR0EsTUFBTSxnQkFBZ0IsaUJBQWlCO0FBQUEsTUFDdkMsZUFBZSxNQUFNLFlBQVksY0FBYztBQUFBLE1BRy9DLE1BQU0sY0FBYyxrQkFBa0IsbUJBQW1CO0FBQUEsTUFDekQsOEJBQThCO0FBQUEsTUFTOUIsSUFBSSxxQkFBcUIsUUFBUSxXQUFVLFVBQVU7QUFBQSxRQUNuRCxtQkFBbUIsc0JBQXNCLE1BQU07QUFBQSxVQUk3QyxJQUFJLGdDQUFnQyxRQUFRLFdBQVUsVUFBVTtBQUFBLFlBQzlELFdBQVUsU0FBUyxpQkFBaUIsMkJBQTJCO0FBQUEsVUFDakU7QUFBQSxVQUNBLG1CQUFtQjtBQUFBLFNBQ3BCO0FBQUEsTUFDSDtBQUFBO0FBQUEsSUFHRixNQUFNLGdCQUFnQixNQUFNO0FBQUEsTUFFMUIsYUFBYTtBQUFBLE1BRWIsSUFBSSxxQkFBcUIsTUFBTTtBQUFBLFFBQzdCLHFCQUFxQixnQkFBZ0I7QUFBQSxRQUNyQyxtQkFBbUI7QUFBQSxNQUNyQjtBQUFBLE1BRUEsSUFBSSxnQ0FBZ0MsUUFBUSxXQUFVLFVBQVU7QUFBQSxRQUM5RCxXQUFVLFNBQVMsaUJBQWlCLDJCQUEyQjtBQUFBLFFBQy9ELDhCQUE4QjtBQUFBLE1BQ2hDO0FBQUEsTUFFQSxJQUFJLGdCQUFnQjtBQUFBLFFBQ2xCLHlCQUNFLGdCQUNBLG1CQUFtQixVQUFVLFFBQVEsa0JBQ3ZDO0FBQUEsTUFDRjtBQUFBLE1BR0EsV0FBVSxPQUFPLHFCQUFxQjtBQUFBLFFBQ3BDLFFBQVE7QUFBQSxRQUNSLGFBQWEsV0FBVSxVQUFVLGtCQUFrQixLQUFLO0FBQUEsTUFDMUQsQ0FBQztBQUFBLE1BRUQsS0FBSztBQUFBLE1BRUwsU0FBUyxvQkFBb0IsYUFBYSxlQUFlO0FBQUEsTUFDekQsU0FBUyxvQkFBb0IsV0FBVyxhQUFhO0FBQUE7QUFBQSxJQUl2RCxNQUFNLGFBQWEsTUFBTTtBQUFBLE1BQ3ZCLElBQUk7QUFBQSxRQUFlO0FBQUEsTUFFbkIsa0JBQWtCLFdBQVUsU0FBUyxjQUNuQyxJQUFJLDhCQUNOO0FBQUEsTUFFQSxJQUFJLENBQUMsaUJBQWlCO0FBQUEsUUFDcEIsUUFBUSxLQUFLLHVDQUF1QztBQUFBLFFBQ3BEO0FBQUEsTUFDRjtBQUFBLE1BRUEsSUFDRSxnQkFBZ0IsY0FDZCxJQUFJLHVCQUFVLG1CQUFtQixVQUFVLFFBQVEsV0FDckQ7QUFBQSxRQUVBO0FBQUEsTUFFRix3QkFBd0I7QUFBQSxNQUN4QixnQkFBZ0I7QUFBQSxNQUVoQixJQUFJLGtCQUFrQixpQkFBaUI7QUFBQSxRQUNyQyxlQUFlLGlCQUFpQixTQUFTLGdCQUFnQjtBQUFBLFFBRXpELElBQUksZ0JBQWdCO0FBQUEsVUFDbEIsZUFBZSxpQkFBaUIsYUFBYSxvQkFBb0I7QUFBQSxRQUNuRTtBQUFBLFFBRUEsZ0JBQWdCLGlCQUFpQixjQUFjLE1BQU0sRUFBRSxTQUFTLEtBQUssQ0FBQztBQUFBLFFBQ3RFLGdCQUFnQixpQkFDZCxjQUNBLE1BQU07QUFBQSxVQUNKLElBQUksQ0FBQztBQUFBLFlBQVksS0FBSztBQUFBLFdBRXhCLEVBQUUsU0FBUyxLQUFLLENBQ2xCO0FBQUEsTUFDRjtBQUFBLE1BR0EsSUFBSSxXQUFVLFVBQVU7QUFBQSxRQUN0QixNQUFNLE9BQU8sV0FBVSxTQUFTLGdCQUFnQjtBQUFBLFFBQ2hELG1CQUFtQixLQUFLO0FBQUEsUUFDeEIsZ0JBQWdCLEtBQUs7QUFBQSxRQUdyQixNQUFNLGFBQWMsV0FBa0I7QUFBQSxRQUN0QyxNQUFNLGlCQUFrQixXQUFrQjtBQUFBLFFBQzFDLGVBQWUsZ0JBQWdCLFlBQVksYUFBYTtBQUFBLFFBRXhELGFBQWEsa0JBQWtCLGFBQWE7QUFBQSxRQUM1QyxlQUFlLFdBQVUsU0FBUyxrQkFBa0IsQ0FBQztBQUFBLE1BQ3ZEO0FBQUEsTUFHQSxXQUFVLEtBQUssbUJBQW1CLENBQUMsU0FBYztBQUFBLFFBQy9DLElBQUksQ0FBQyxZQUFZO0FBQUEsVUFDZixlQUFlLEtBQUssUUFBUTtBQUFBLFVBQzVCLEtBQUs7QUFBQSxRQUNQO0FBQUEsT0FDRDtBQUFBLE1BRUQsV0FBVSxLQUFLLGlDQUFpQyxDQUFDLFNBQWM7QUFBQSxRQUM3RCxtQkFBbUIsS0FBSztBQUFBLFFBQ3hCLGFBQWEsS0FBSyxrQkFBa0IsYUFBYTtBQUFBLE9BQ2xEO0FBQUEsTUFFRCxXQUFVLEtBQUssbUNBQW1DLENBQUMsU0FBYztBQUFBLFFBQy9ELGdCQUFnQixLQUFLO0FBQUEsUUFDckIsYUFBYSxrQkFBa0IsS0FBSyxhQUFhO0FBQUEsT0FDbEQ7QUFBQSxNQUdELFdBQVUsS0FBSywwQkFBMEIsQ0FBQyxTQUFjO0FBQUEsUUFDdEQsSUFBSSxjQUFjO0FBQUEsVUFDaEIsbUJBQW1CLEtBQUssZUFBZTtBQUFBLFVBQ3ZDLGFBQWEsa0JBQWtCLGFBQWE7QUFBQSxRQUM5QztBQUFBLE9BQ0Q7QUFBQSxNQUdELFdBQVUsS0FBSyxnQ0FBZ0MsQ0FBQyxTQUFjO0FBQUEsUUFDNUQsSUFBSSxnQkFBZ0IsS0FBSyxPQUFPO0FBQUEsVUFFOUIsUUFBUSxJQUNOLDBEQUEwRCxLQUFLLE9BQ2pFO0FBQUEsVUFDQSxhQUFhLGtCQUFrQixhQUFhO0FBQUEsUUFDOUM7QUFBQSxPQUNEO0FBQUE7QUFBQSxJQUlILHFCQUFxQixZQUFXLHdCQUF3QixVQUFVO0FBQUEsSUFHbEUsZUFBZSxZQUFXLFVBQVU7QUFBQSxJQUdwQyxNQUFNLFVBQVUsTUFBTTtBQUFBLE1BQ3BCLElBQUksZ0JBQWdCO0FBQUEsUUFDbEIsZUFBZSxPQUFPO0FBQUEsUUFDdEIsaUJBQWlCO0FBQUEsTUFDbkI7QUFBQSxNQUNBLGlCQUFpQjtBQUFBLE1BQ2pCLGtCQUFrQjtBQUFBLE1BQ2xCLGdCQUFnQjtBQUFBLE1BRWhCLElBQUksYUFBYTtBQUFBLFFBQ2YsYUFBYSxXQUFXO0FBQUEsUUFDeEIsY0FBYztBQUFBLE1BQ2hCO0FBQUEsTUFFQSxTQUFTLG9CQUFvQixhQUFhLGVBQWU7QUFBQSxNQUN6RCxTQUFTLG9CQUFvQixXQUFXLGFBQWE7QUFBQTtBQUFBLElBR3ZELHFCQUFxQixZQUFXLHFCQUFxQixPQUFPO0FBQUEsSUFDNUQsWUFBWSxZQUFXLE9BQU87QUFBQSxJQUc5QixPQUFPO0FBQUEsU0FDRjtBQUFBLE1BQ0gsV0FBVyxFQUFFLE1BQU0sTUFBTSxjQUFjLGVBQWU7QUFBQSxJQUN4RDtBQUFBO0FBQUE7OztBQ3hYRyxTQUFTLGNBQWMsQ0FBQyxTQUEyQixDQUFDLEdBQUc7QUFBQSxFQUM1RCxPQUFPLENBQ0wsZUFDNEI7QUFBQSxJQUM1QjtBQUFBLE1BQ0U7QUFBQSxNQUNBLFlBQVksbUJBQW1CLFFBQVE7QUFBQSxNQUN2QyxXQUFXO0FBQUEsTUFDWDtBQUFBLE1BQ0Esc0JBQXNCLG1CQUFtQixRQUFRO0FBQUEsTUFDakQsd0JBQXdCLG1CQUFtQixRQUN4QztBQUFBLE1BQ0gscUJBQXFCLG1CQUFtQixjQUFjO0FBQUEsTUFDdEQsZUFBZSxtQkFBbUIsY0FBYztBQUFBLE1BQ2hELGdCQUFnQjtBQUFBLE1BQ2hCLHFCQUFxQjtBQUFBLE1BQ3JCO0FBQUEsTUFDQSxXQUFXO0FBQUEsTUFDWCxrQkFBa0I7QUFBQSxNQUNsQixpQkFBaUI7QUFBQSxNQUNqQixpQkFBaUI7QUFBQSxRQUNmO0FBQUEsSUFJSixJQUFJLGtDQUFrQztBQUFBLElBQ3RDLE1BQU0sd0JBQXdCLHFCQUFxQjtBQUFBLElBbUJuRCxJQUFJLGtCQUFrQjtBQUFBLElBQ3RCLElBQUksa0JBQWtCO0FBQUEsSUFDdEIsSUFBSSxpQkFBaUI7QUFBQSxJQUNyQixJQUFJLGNBQWM7QUFBQSxJQUNsQixJQUFJLGlCQUFpQjtBQUFBLElBQ3JCLElBQUksYUFBYTtBQUFBLElBR2pCLE1BQU0sbUJBQW1CO0FBQUEsSUFDekIsTUFBTSxrQkFBa0I7QUFBQSxJQUd4QixNQUFNLGlCQUFpQixDQUFDLFdBQW1CO0FBQUEsTUFDekMsTUFBTSxZQUFZLE1BQU0sT0FBTyxPQUFPLEVBQUU7QUFBQSxNQUN4QyxNQUFNLG1CQUFtQixhQUFhO0FBQUEsTUFDdEMsTUFBTSxvQkFBb0IsY0FBYztBQUFBLE1BQ3hDLE1BQU0sdUJBQXVCLGlCQUFpQjtBQUFBO0FBQUEsSUFPaEQsTUFBTSxvQkFBb0IsQ0FBQyxjQUFzQixlQUF1QjtBQUFBLE1BQ3RFLE1BQU0sWUFBWSxNQUFNLE9BQU8sT0FBTyxFQUFFO0FBQUEsTUFHeEMsSUFBSSxhQUFhLGtCQUFrQjtBQUFBLFFBQ2pDO0FBQUEsTUFDRjtBQUFBLE1BRUEsTUFBTSxZQUFZLEtBQUssSUFBSSxHQUFHLGVBQWUsZUFBZTtBQUFBLE1BQzVELE1BQU0sVUFBVSxhQUFhO0FBQUEsTUFFN0IsSUFBSSxlQUFlO0FBQUEsTUFDbkIsTUFBTSxpQkFBaUIsSUFBSTtBQUFBLE1BRzNCLFNBQVMsSUFBSSxFQUFHLElBQUksTUFBTSxRQUFRLEtBQUs7QUFBQSxRQUNyQyxJQUFJLE1BQU0sT0FBTyxjQUFjLElBQUksYUFBYSxJQUFJLFVBQVU7QUFBQSxVQUM1RCxPQUFPLE1BQU07QUFBQSxVQUNiO0FBQUEsVUFHQSxNQUFNLGtCQUFrQixLQUFLLE1BQU0sSUFBSSxTQUFTO0FBQUEsVUFDaEQsZUFBZSxJQUFJLGVBQWU7QUFBQSxRQUNwQztBQUFBLE1BQ0Y7QUFBQSxNQU9BLGVBQWUsUUFBUSxDQUFDLFlBQVk7QUFBQSxRQUNsQyxhQUFhLE9BQU8sT0FBTztBQUFBLFFBQzNCLGNBQWMsT0FBTyxPQUFPO0FBQUEsUUFFNUIsZUFBZSxPQUFPLE9BQU87QUFBQSxRQUU3QixNQUFNLGFBQWEsaUJBQWlCLElBQUksT0FBTztBQUFBLFFBQy9DLElBQUksWUFBWTtBQUFBLFVBQ2QsV0FBVyxNQUFNO0FBQUEsVUFDakIsaUJBQWlCLE9BQU8sT0FBTztBQUFBLFFBQ2pDO0FBQUEsT0FDRDtBQUFBLE1BRUQsSUFBSSxlQUFlLEdBQUc7QUFBQSxRQUVwQixXQUFVLE9BQU8sNEJBQTRCO0FBQUEsVUFDM0M7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFFBQ0YsQ0FBQztBQUFBLE1BQ0g7QUFBQTtBQUFBLElBR0YsTUFBTSxtQkFBbUIsSUFBSTtBQUFBLElBQzdCLElBQUksbUJBQW9DLENBQUM7QUFBQSxJQUd6QyxNQUFNLG1CQUFtQixJQUFJO0FBQUEsSUFHN0IsSUFBSSxRQUFlLENBQUM7QUFBQSxJQUNwQixJQUFJLGFBQWE7QUFBQSxJQUNqQixJQUFJLGVBQWUsSUFBSTtBQUFBLElBQ3ZCLElBQUksZ0JBQWdCLElBQUk7QUFBQSxJQUN4QixJQUFJLGVBQWUsSUFBSTtBQUFBLElBUXZCLElBQUksaUJBQWlCLElBQUk7QUFBQSxJQUd6QixJQUFJLGdCQUErQjtBQUFBLElBQ25DLElBQUksWUFBWSxJQUFJO0FBQUEsSUFDcEIsSUFBSSxrQkFBa0IsSUFBSTtBQUFBLElBQzFCLElBQUksb0JBQW9CO0FBQUEsSUFDeEIsSUFBSSxrQkFBaUM7QUFBQSxJQUNyQyxJQUFJLGdCQUFnQjtBQUFBLElBR3BCLFdBQVUsUUFBUTtBQUFBLElBS2xCLE1BQU0sYUFBYSxDQUFDLFFBQWdCLFVBQTBCO0FBQUEsTUFHNUQsT0FBTyxLQUFLLE1BQU0sU0FBUyxTQUFTO0FBQUE7QUFBQSxJQUl0QyxNQUFNLGNBQWMsQ0FBQyxVQUFrRDtBQUFBLE1BQ3JFLE9BQU8sR0FBRyxNQUFNLFNBQVMsTUFBTTtBQUFBO0FBQUEsSUFHakMsTUFBTSxVQUFVLE1BQWU7QUFBQSxNQUM3QixPQUFPLG1CQUFtQjtBQUFBO0FBQUEsSUFHNUIsTUFBTSxlQUFlLE1BQU07QUFBQSxNQUN6QixJQUFJLENBQUMsc0JBQXNCLGlCQUFpQixXQUFXO0FBQUEsUUFBRztBQUFBLE1BRzFELGlCQUFpQixLQUFLLENBQUMsR0FBRyxNQUFNO0FBQUEsUUFDOUIsTUFBTSxnQkFBZ0IsRUFBRSxNQUFNLEdBQUcsUUFBUSxHQUFHLEtBQUssRUFBRTtBQUFBLFFBQ25ELE1BQU0sZUFDSixjQUFjLEVBQUUsWUFBWSxjQUFjLEVBQUU7QUFBQSxRQUM5QyxPQUFPLGlCQUFpQixJQUFJLGVBQWUsRUFBRSxZQUFZLEVBQUU7QUFBQSxPQUM1RDtBQUFBLE1BR0QsT0FDRSxpQkFBaUIsU0FBUyxLQUMxQixrQkFBa0IsdUJBQ2xCO0FBQUEsUUFDQSxNQUFNLFVBQVUsaUJBQWlCLE1BQU07QUFBQSxRQUN2QyxJQUFJLFNBQVM7QUFBQSxVQUNYLGtCQUFrQixPQUFPO0FBQUEsUUFDM0I7QUFBQSxNQUNGO0FBQUE7QUFBQSxJQUdGLE1BQU0sb0JBQW9CLENBQUMsWUFBMkI7QUFBQSxNQUNwRDtBQUFBLE1BQ0EsaUJBQWlCLElBQUksWUFBWSxRQUFRLEtBQUssQ0FBQztBQUFBLE1BRy9DLDBCQUEwQixRQUFRLE9BQU8sUUFBUSxNQUFNLEVBQ3BELEtBQUssTUFBTTtBQUFBLFFBQ1YsUUFBUSxRQUFRO0FBQUEsUUFDaEI7QUFBQSxPQUNELEVBQ0EsTUFBTSxDQUFDLFVBQWlCO0FBQUEsUUFDdkIsUUFBUSxPQUFPLEtBQUs7QUFBQSxRQUNwQjtBQUFBLE9BQ0QsRUFDQSxRQUFRLE1BQU07QUFBQSxRQUNiO0FBQUEsUUFDQSxpQkFBaUIsT0FBTyxZQUFZLFFBQVEsS0FBSyxDQUFDO0FBQUEsUUFDbEQsYUFBYTtBQUFBLE9BQ2Q7QUFBQTtBQUFBLElBTUwsTUFBTSxpQkFBaUIsQ0FBQyxhQUEyQjtBQUFBLE1BQ2pELElBQUksQ0FBQztBQUFBLFFBQVcsT0FBTztBQUFBLE1BQ3ZCLE9BQU8sU0FBUyxJQUFJLFNBQVM7QUFBQTtBQUFBLElBTS9CLE1BQU0sWUFBWSxPQUFPLFFBQWdCLFVBQWtDO0FBQUEsTUFLekUsSUFBSSxDQUFDLFlBQVk7QUFBQSxRQUNmLFFBQVEsS0FBSywrQ0FBK0M7QUFBQSxRQUM1RCxPQUFPLENBQUM7QUFBQSxNQUNWO0FBQUEsTUFFQSxNQUFNLFVBQVUsV0FBVyxRQUFRLEtBQUs7QUFBQSxNQUl4QyxJQUFJLGFBQWEsSUFBSSxPQUFPLEdBQUc7QUFBQSxRQUM3QixPQUFPLE1BQU0sTUFBTSxRQUFRLFNBQVMsS0FBSztBQUFBLE1BQzNDO0FBQUEsTUFHQSxJQUFJLGNBQWMsSUFBSSxPQUFPLEdBQUc7QUFBQSxRQUM5QixNQUFNLGtCQUFrQixlQUFlLElBQUksT0FBTztBQUFBLFFBQ2xELElBQUksaUJBQWlCO0FBQUEsVUFDbkIsT0FBTztBQUFBLFFBQ1Q7QUFBQSxNQUNGO0FBQUEsTUFHQSxjQUFjLElBQUksT0FBTztBQUFBLE1BR3pCLE1BQU0sa0JBQWtCLElBQUk7QUFBQSxNQUM1QixpQkFBaUIsSUFBSSxTQUFTLGVBQWU7QUFBQSxNQUc3QyxNQUFNLGtCQUFrQixZQUFZO0FBQUEsUUFDbEMsSUFBSTtBQUFBLFVBRUYsTUFBTSxPQUFPLEtBQUssTUFBTSxTQUFTLEtBQUssSUFBSTtBQUFBLFVBQzFDLElBQUk7QUFBQSxVQUVKLElBQUksYUFBYSxVQUFVO0FBQUEsWUFFekIsSUFBSSxTQUFTLEdBQUc7QUFBQSxjQUVkLFNBQVMsRUFBRSxNQUFNO0FBQUEsWUFDbkIsRUFBTztBQUFBLGNBRUwsTUFBTSxpQkFBaUIsVUFBVSxJQUFJLE9BQU8sQ0FBQztBQUFBLGNBQzdDLElBQUksQ0FBQyxnQkFBZ0I7QUFBQSxnQkFFbkIsUUFBUSxLQUNOLGlDQUFpQyxnQ0FDL0IsT0FBTyxHQUVYO0FBQUEsZ0JBQ0EsTUFBTSxJQUFJLE1BQ1IseURBQ0UsT0FBTyxHQUVYO0FBQUEsY0FDRjtBQUFBLGNBQ0EsU0FBUyxFQUFFLFFBQVEsZ0JBQWdCLE1BQU07QUFBQTtBQUFBLFVBRTdDLEVBQU8sU0FBSSxhQUFhLFFBQVE7QUFBQSxZQUM5QixTQUFTLEVBQUUsTUFBTSxNQUFNO0FBQUEsVUFDekIsRUFBTztBQUFBLFlBRUwsU0FBUyxFQUFFLFFBQVEsTUFBTTtBQUFBO0FBQUEsVUFTM0IsTUFBTSxXQUFXLE1BQU0sV0FBVyxLQUFLO0FBQUEsZUFDbEM7QUFBQSxZQUNILFFBQVEsZ0JBQWdCO0FBQUEsVUFDMUIsQ0FBQztBQUFBLFVBR0QsTUFBTSxXQUFXLFNBQVMsUUFBUSxTQUFTLFNBQVM7QUFBQSxVQUNwRCxNQUFNLE9BQU8sU0FBUyxRQUFRLENBQUM7QUFBQSxVQUcvQixNQUFNLGlCQUFpQixLQUFLLFVBQVUsS0FBSztBQUFBLFVBQzNDLElBQUksYUFBYSxZQUFZLGdCQUFnQjtBQUFBLFlBQzNDLGdCQUFnQjtBQUFBLFlBQ2hCLFVBQVUsSUFBSSxNQUFNLGNBQWM7QUFBQSxZQUNsQyxnQkFBZ0IsSUFBSSxNQUFNLE1BQU07QUFBQSxZQUNoQyxvQkFBb0IsS0FBSyxJQUFJLG1CQUFtQixJQUFJO0FBQUEsVUFJdEQ7QUFBQSxVQUdBLElBQUksYUFBYSxZQUFZLEtBQUssWUFBWSxPQUFPO0FBQUEsWUFDbkQsZ0JBQWdCO0FBQUEsVUFJbEI7QUFBQSxVQU1BLElBQUksS0FBSyxVQUFVLFdBQVc7QUFBQSxZQUM1QixrQkFBa0IsS0FBSztBQUFBLFVBQ3pCO0FBQUEsVUFJQSxNQUFNLG1CQUFtQixlQUFlLFFBQVE7QUFBQSxVQUdoRCxpQkFBaUIsUUFBUSxDQUFDLE1BQU0sVUFBVTtBQUFBLFlBQ3hDLE1BQU0sU0FBUyxTQUFTO0FBQUEsV0FDekI7QUFBQSxVQUlELElBQUksV0FBVyxtQkFBbUI7QUFBQSxVQUtsQyxJQUFJLFdBQVcsS0FBSyxpQkFBaUIsV0FBVyxHQUFHO0FBQUEsWUFJakQsV0FBVztBQUFBLFlBQ1gsa0JBQWtCO0FBQUEsVUFDcEI7QUFBQSxVQUtBLElBQUksYUFBYSxVQUFVO0FBQUEsWUFFekIsTUFBTSxtQkFBbUIsTUFBTSxPQUM3QixDQUFDLFNBQVMsU0FBUyxTQUNyQixFQUFFO0FBQUEsWUFDRixNQUFNLGNBQWMsZ0JBQ2hCLElBQ0EsWUFDQSxtQkFBbUIsV0FBVztBQUFBLFlBQ2xDLE1BQU0sa0JBQ0osWUFDQSxtQkFBbUIsV0FBVztBQUFBLFlBR2hDLFdBQVcsS0FBSyxJQUNkLG1CQUFtQixhQUNuQixlQUNGO0FBQUEsWUFPQSxJQUFJLFdBQVcsWUFBWTtBQUFBLGNBSXpCLGFBQWE7QUFBQSxjQUNiLGNBQWMsUUFBUTtBQUFBLFlBQ3hCO0FBQUEsVUFDRixFQUFPO0FBQUEsWUFHTCxXQUFXLG1CQUFtQjtBQUFBO0FBQUEsVUFPaEMsSUFBSSxhQUFhLFlBQVk7QUFBQSxZQUUzQixhQUFhO0FBQUEsWUFDYixjQUFjLFFBQVE7QUFBQSxVQUN4QjtBQUFBLFVBR0EsV0FBVSxRQUFRO0FBQUEsVUFHbEIsV0FBVSxPQUFPLDBCQUEwQjtBQUFBLFlBQ3pDLFlBQVk7QUFBQSxZQUNaLGFBQWEsTUFBTSxPQUFPLENBQUMsU0FBUyxTQUFTLFNBQVMsRUFBRTtBQUFBLFVBQzFELENBQUM7QUFBQSxVQUdELE1BQU0sZ0JBQWlCLFdBQVUsU0FBaUI7QUFBQSxVQUNsRCxJQUFJLGVBQWU7QUFBQSxZQUVqQixjQUFjLGFBQWEsWUFBWSxNQUFNO0FBQUEsVUFDL0M7QUFBQSxVQVNBLE1BQU0sc0JBQ0osaUJBQWlCLFNBQVMsS0FDMUIsaUJBQWlCLE1BQ2YsQ0FBQyxHQUFHLFFBQVEsTUFBTSxTQUFTLFNBQVMsU0FDdEM7QUFBQSxVQUVGLElBQUkscUJBQXFCO0FBQUEsWUFFdkIsYUFBYSxJQUFJLE9BQU87QUFBQSxVQUMxQjtBQUFBLFVBRUEsY0FBYyxPQUFPLE9BQU87QUFBQSxVQUM1QixhQUFhLE9BQU8sT0FBTztBQUFBLFVBTzNCLElBQUksaUJBQWlCLE1BQU0sR0FBRztBQUFBLFlBQzVCLGVBQWUsUUFBUSxnQkFBZ0I7QUFBQSxVQUN6QztBQUFBLFVBR0EsV0FBVSxPQUFPLHlCQUF5QjtBQUFBLFlBQ3hDO0FBQUEsWUFDQTtBQUFBLFlBQ0EsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFVBQ1QsQ0FBQztBQUFBLFVBR0QsV0FBVSxPQUFPLDJCQUEyQjtBQUFBLFlBQzFDO0FBQUEsWUFDQTtBQUFBLFlBQ0EsT0FBTztBQUFBLFlBQ1AsT0FBTztBQUFBLFlBQ1A7QUFBQSxZQUNBLGVBQWUsTUFBTSxPQUFPLENBQUMsU0FBUyxTQUFTLFNBQVMsRUFBRTtBQUFBLFlBQzFELFFBQVEsYUFBYSxXQUFXLGdCQUFnQjtBQUFBLFVBQ2xELENBQUM7QUFBQSxVQUdELFdBQVUsVUFBVSxpQkFBaUI7QUFBQSxVQUVyQyxPQUFPO0FBQUEsVUFDUCxPQUFPLE9BQU87QUFBQSxVQUVkLE1BQU0sZUFDSCxNQUFnQixTQUFTLGdCQUN4QixNQUFnQixZQUFZLHFCQUM1QixnQkFBZ0IsT0FBTztBQUFBLFVBRTNCLElBQUksY0FBYztBQUFBLFlBQ2hCLGNBQWMsT0FBTyxPQUFPO0FBQUEsWUFDNUI7QUFBQSxZQUVBLE9BQU8sQ0FBQztBQUFBLFVBQ1Y7QUFBQSxVQUdBLGNBQWMsT0FBTyxPQUFPO0FBQUEsVUFDNUI7QUFBQSxVQUVBLE1BQU0sWUFBWSxhQUFhLElBQUksT0FBTyxHQUFHLFlBQVksS0FBSztBQUFBLFVBQzlELGFBQWEsSUFBSSxTQUFTO0FBQUEsWUFDeEI7QUFBQSxZQUNBLFdBQVc7QUFBQSxZQUNYLFdBQVcsS0FBSyxJQUFJO0FBQUEsVUFDdEIsQ0FBQztBQUFBLFVBR0QsV0FBVSxPQUFPLHdCQUF3QjtBQUFBLFlBQ3ZDO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDRixDQUFDO0FBQUEsVUFFRCxNQUFNO0FBQUEsa0JBQ047QUFBQSxVQUNBLGVBQWUsT0FBTyxPQUFPO0FBQUEsVUFDN0IsaUJBQWlCLE9BQU8sT0FBTztBQUFBO0FBQUEsU0FFaEM7QUFBQSxNQUVILGVBQWUsSUFBSSxTQUFTLGNBQWM7QUFBQSxNQUMxQyxPQUFPO0FBQUE7QUFBQSxJQU1ULE1BQU0sNEJBQTRCLE9BQ2hDLE9BSUEsV0FDa0I7QUFBQSxNQUNsQixJQUFJLENBQUM7QUFBQSxRQUFZO0FBQUEsTUFPakIsSUFBSSxhQUFhLFVBQVU7QUFBQSxRQUN6QixNQUFNLFlBQVksS0FBSyxNQUFNLE1BQU0sUUFBUSxTQUFTLElBQUk7QUFBQSxRQUN4RCxNQUFNLFVBQVUsS0FBSyxNQUFNLE1BQU0sTUFBTSxTQUFTLElBQUk7QUFBQSxRQUdwRCxNQUFNLGlCQUFpQjtBQUFBLFFBQ3ZCLE1BQU0scUJBQXFCLHFCQUFxQjtBQUFBLFFBQ2hELE1BQU0saUJBQWlCLEtBQUssSUFDMUIsU0FDQSxxQkFBcUIsY0FDdkI7QUFBQSxRQU9BLFNBQVMsT0FBTyxVQUFXLFFBQVEsZ0JBQWdCLFFBQVE7QUFBQSxVQUN6RCxNQUFNLFVBQVUsT0FBTztBQUFBLFVBQ3ZCLE1BQU0sU0FBUyxVQUFVO0FBQUEsVUFHekIsSUFBSSxjQUFjLElBQUksT0FBTyxHQUFHO0FBQUEsWUFFOUI7QUFBQSxVQUNGO0FBQUEsVUFFQSxJQUFJLENBQUMsYUFBYSxJQUFJLE9BQU8sS0FBSyxDQUFDLGNBQWMsSUFBSSxPQUFPLEdBQUc7QUFBQSxZQUc3RCxJQUFJLE9BQU8sR0FBRztBQUFBLGNBQ1osSUFBSSxXQUFVO0FBQUEsY0FDZCxTQUFTLFdBQVcsRUFBRyxXQUFXLE1BQU0sWUFBWTtBQUFBLGdCQUNsRCxNQUFNLGNBQWMsV0FBVztBQUFBLGdCQUMvQixJQUFJLENBQUMsYUFBYSxJQUFJLFdBQVcsR0FBRztBQUFBLGtCQUlsQyxXQUFVO0FBQUEsa0JBR1YsSUFBSSxDQUFDLGNBQWMsSUFBSSxXQUFXLEdBQUc7QUFBQSxvQkFDbkMsSUFBSTtBQUFBLHNCQUNGLE1BQU0sVUFBVSxjQUFjLFdBQVcsU0FBUztBQUFBLHNCQUNsRCxPQUFPLE9BQU87QUFBQSxzQkFDZCxRQUFRLE1BQ04saURBQWlELGFBQ2pELEtBQ0Y7QUFBQSxzQkFDQTtBQUFBO0FBQUEsa0JBRUo7QUFBQSxrQkFDQTtBQUFBLGdCQUNGO0FBQUEsY0FDRjtBQUFBLGNBRUEsSUFBSSxDQUFDLFVBQVM7QUFBQSxnQkFDWjtBQUFBLGNBQ0Y7QUFBQSxZQUNGO0FBQUEsWUFFQSxJQUFJO0FBQUEsY0FDRixNQUFNLFVBQVUsUUFBUSxTQUFTO0FBQUEsY0FDakMsT0FBTyxPQUFPO0FBQUEsY0FDZCxRQUFRLE1BQU0sb0NBQW9DLFNBQVMsS0FBSztBQUFBLGNBQ2hFO0FBQUE7QUFBQSxVQUVKO0FBQUEsUUFDRjtBQUFBLFFBRUEsSUFBSSxVQUFVLGdCQUFnQixDQUk5QjtBQUFBLFFBRUE7QUFBQSxNQUNGO0FBQUEsTUFJQSxNQUFNLGFBQWEsS0FBSyxNQUFNLE1BQU0sUUFBUSxTQUFTO0FBQUEsTUFDckQsTUFBTSxXQUFXLEtBQUssTUFBTSxNQUFNLE1BQU0sU0FBUztBQUFBLE1BT2pELE1BQU0sZUFBeUIsQ0FBQztBQUFBLE1BQ2hDLFNBQVMsVUFBVSxXQUFZLFdBQVcsVUFBVSxXQUFXO0FBQUEsUUFDN0QsSUFBSSxDQUFDLGFBQWEsSUFBSSxPQUFPLEtBQUssQ0FBQyxjQUFjLElBQUksT0FBTyxHQUFHO0FBQUEsVUFDN0QsYUFBYSxLQUFLLE9BQU87QUFBQSxRQUMzQjtBQUFBLE1BQ0Y7QUFBQSxNQUVBLElBQUksYUFBYSxXQUFXLEdBQUc7QUFBQSxRQUc3QixTQUFTLFVBQVUsV0FBWSxXQUFXLFVBQVUsV0FBVztBQUFBLFVBQzdELElBQUksYUFBYSxJQUFJLE9BQU8sR0FBRztBQUFBLFlBRTdCLE1BQU0sYUFBYSxVQUFVO0FBQUEsWUFDN0IsTUFBTSxVQUFVLE1BQ2IsTUFBTSxZQUFZLGFBQWEsU0FBUyxFQUN4QyxLQUFLLENBQUMsU0FBUyxTQUFTLFNBQVM7QUFBQSxZQUNwQyxJQUFJLENBQUMsU0FBUztBQUFBLGNBRVosYUFBYSxPQUFPLE9BQU87QUFBQSxjQUMzQixhQUFhLEtBQUssT0FBTztBQUFBLFlBQzNCO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxRQUVBLElBQ0UsYUFBYSxXQUFXLEtBQ3hCLGlCQUFpQixTQUFTLEtBQzFCLGtCQUFrQix1QkFDbEI7QUFBQSxVQUNBLGFBQWE7QUFBQSxRQUNmO0FBQUEsUUFDQSxJQUFJLGFBQWEsV0FBVyxHQUFHO0FBQUEsVUFDN0I7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLE1BT0EsTUFBTSxXQUFXLGFBQWEsSUFBSSxDQUFDLFlBQ2pDLFVBQVUsVUFBVSxXQUFXLFNBQVMsQ0FDMUM7QUFBQSxNQUNBLE1BQU0sUUFBUSxXQUFXLFFBQVE7QUFBQTtBQUFBLElBTW5DLE1BQU0sb0JBQW9CLENBQ3hCLE9BSUEsV0FDa0I7QUFBQSxNQUNsQixPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUFBLFFBQ3RDLE1BQU0sV0FBVyxZQUFZLEtBQUs7QUFBQSxRQUdsQyxJQUFJLGlCQUFpQixJQUFJLFFBQVEsR0FBRztBQUFBLFVBQ2xDLFFBQVE7QUFBQSxVQUNSO0FBQUEsUUFDRjtBQUFBLFFBR0EsSUFBSSxjQUFjLGtCQUFrQixPQUFPLGtCQUFrQixHQUFHO0FBQUEsVUFDOUQ7QUFBQSxVQUNBLFFBQVE7QUFBQSxVQUNSO0FBQUEsUUFDRjtBQUFBLFFBR0EsSUFBSSxDQUFDLFFBQVEsR0FBRztBQUFBLFVBQ2Q7QUFBQSxVQUNBLFFBQVE7QUFBQSxVQUNSO0FBQUEsUUFDRjtBQUFBLFFBR0EsSUFBSSxrQkFBa0IsdUJBQXVCO0FBQUEsVUFFM0Msa0JBQWtCO0FBQUEsWUFDaEI7QUFBQSxZQUNBLFVBQVU7QUFBQSxZQUNWLFdBQVcsS0FBSyxJQUFJO0FBQUEsWUFDcEI7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0gsRUFBTyxTQUNMLHNCQUNBLGlCQUFpQixTQUFTLGNBQzFCO0FBQUEsVUFFQSxpQkFBaUIsS0FBSztBQUFBLFlBQ3BCO0FBQUEsWUFDQSxVQUFVO0FBQUEsWUFDVixXQUFXLEtBQUssSUFBSTtBQUFBLFlBQ3BCO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUlILEVBQU87QUFBQSxVQUdMLElBQ0UsV0FBVyxtQkFDWCxXQUFXLDBCQUNYO0FBQUEsWUFFQSxpQkFBaUIsUUFBUSxDQUFDLE1BQU07QUFBQSxjQUM5QjtBQUFBLGNBQ0EsRUFBRSxRQUFRO0FBQUEsYUFDWDtBQUFBLFlBQ0QsaUJBQWlCLFNBQVM7QUFBQSxZQUUxQixpQkFBaUIsS0FBSztBQUFBLGNBQ3BCO0FBQUEsY0FDQSxVQUFVO0FBQUEsY0FDVixXQUFXLEtBQUssSUFBSTtBQUFBLGNBQ3BCO0FBQUEsY0FDQTtBQUFBLGNBQ0E7QUFBQSxZQUNGLENBQUM7QUFBQSxVQUNILEVBQU87QUFBQSxZQUVMLElBQUksaUJBQWlCLFVBQVUsY0FBYztBQUFBLGNBQzNDLE1BQU0sVUFBVSxpQkFBaUIsT0FDL0IsR0FDQSxpQkFBaUIsU0FBUyxZQUM1QjtBQUFBLGNBQ0EsUUFBUSxRQUFRLENBQUMsTUFBTTtBQUFBLGdCQUNyQjtBQUFBLGdCQUNBLEVBQUUsUUFBUTtBQUFBLGVBQ1g7QUFBQSxZQUNIO0FBQUEsWUFDQSxRQUFRO0FBQUE7QUFBQTtBQUFBLE9BR2I7QUFBQTtBQUFBLElBTUgsTUFBTSxtQkFBbUIsT0FBTyxZQUFvQztBQUFBLE1BQ2xFLGFBQWEsT0FBTyxPQUFPO0FBQUEsTUFDM0IsTUFBTSxTQUFTLFVBQVU7QUFBQSxNQUN6QixPQUFPLFVBQVUsUUFBUSxTQUFTO0FBQUE7QUFBQSxJQU1wQyxNQUFNLGdCQUFnQixDQUFDLFVBQXdCO0FBQUEsTUFDN0MsYUFBYTtBQUFBLE1BR2IsTUFBTSxnQkFBaUIsV0FBVSxTQUFpQjtBQUFBLE1BQ2xELElBQUksZUFBZTtBQUFBLFFBQ2pCLGNBQWMsYUFBYTtBQUFBLE1BQzdCO0FBQUEsTUFFQSxXQUFVLE9BQU8sZ0NBQWdDLEVBQUUsTUFBTSxDQUFDO0FBQUE7QUFBQSxJQUk1RCxNQUFNLHFCQUFxQixXQUFVLFNBQVM7QUFBQSxJQUM5QyxXQUFVLFNBQVMsYUFBYSxNQUFNO0FBQUEsTUFDcEMsTUFBTSxTQUFTLG1CQUFtQjtBQUFBLE1BRWxDLElBQUksV0FBVyxPQUFPO0FBQUEsUUFDcEIsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUdBLElBQUksV0FBVSxZQUFZO0FBQUEsUUFDeEIsYUFBYSxXQUFVO0FBQUEsTUFDekI7QUFBQSxNQUdBLFdBQVUsS0FBSyx1QkFBdUIsTUFBTTtBQUFBLFFBQzFDLGFBQWE7QUFBQSxPQUNkO0FBQUEsTUFFRCxXQUFVLEtBQUsscUJBQXFCLE1BQU07QUFBQSxRQUN4QyxhQUFhO0FBQUEsUUFHYixJQUFJLGVBQWU7QUFBQSxVQUNqQixhQUFhO0FBQUEsUUFDZjtBQUFBLE9BQ0Q7QUFBQSxNQUdELFdBQVUsS0FBSywwQkFBMEIsT0FBTyxTQUFjO0FBQUEsUUFJNUQsTUFBTSxRQUFRLEtBQUssU0FBUztBQUFBLFFBQzVCLFFBQVEsT0FBTyxRQUFRO0FBQUEsUUFHdkIsSUFBSSxPQUFPLFVBQVUsWUFBWSxPQUFPLFFBQVEsVUFBVTtBQUFBLFVBQ3hELFFBQVEsS0FDTiwrREFDQSxJQUNGO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFBQSxRQUtBLElBQUkseUJBQXlCLENBQUMsaUNBQWlDO0FBQUEsVUFDN0QsTUFBTSxnQkFBZ0IsWUFBWTtBQUFBLFVBQ2xDLElBQUksVUFBVSxLQUFLLE9BQU8sZUFBZTtBQUFBLFlBRXZDO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxRQUdBLE1BQU0sa0JBQWtCLEVBQUUsT0FBTyxJQUFJLEdBQUcsd0JBQXdCO0FBQUEsUUFHaEUsa0JBQWtCLE9BQU8sR0FBRztBQUFBLFFBRzVCLElBQUksYUFBYSxZQUFZLENBQUMsZUFBZTtBQUFBLFVBQzNDLE1BQU0sbUJBQW1CLE1BQU0sT0FDN0IsQ0FBQyxTQUFTLFNBQVMsU0FDckIsRUFBRTtBQUFBLFVBQ0YsTUFBTSxjQUNKLFlBQ0EsbUJBQW1CLFdBQVc7QUFBQSxVQUNoQyxNQUFNLGtCQUNKLFlBQ0EsbUJBQW1CLFdBQVc7QUFBQSxVQUNoQyxNQUFNLGVBQWUsS0FBSyxJQUN4QixtQkFBbUIsYUFDbkIsZUFDRjtBQUFBLFVBRUEsSUFBSSxpQkFBaUIsWUFBWTtBQUFBLFlBSS9CLGNBQWMsWUFBWTtBQUFBLFVBQzVCO0FBQUEsUUFDRjtBQUFBLE9BQ0Q7QUFBQSxNQUdELFdBQVUsS0FBSyw2QkFBNkIsQ0FBQyxTQUFjO0FBQUEsUUFDekQsTUFBTSxtQkFBbUI7QUFBQSxRQUN6QixrQkFBa0IsS0FBSyxJQUFJLEtBQUssWUFBWSxDQUFDO0FBQUEsUUFHN0MsSUFDRSxtQkFBbUIsdUJBQ25CLG1CQUFtQixxQkFDbkI7QUFBQSxVQUNBLGFBQWE7QUFBQSxRQUNmO0FBQUEsT0FDRDtBQUFBLE1BR0QsV0FBVSxLQUFLLGlCQUFpQixPQUFPLFNBQWM7QUFBQSxRQUNuRCxrQkFBa0I7QUFBQSxRQUdsQixJQUFJLFlBQVk7QUFBQSxVQUNkLGFBQWE7QUFBQSxRQUNmO0FBQUEsUUFHQSxNQUFNLGdCQUFpQixXQUFVLFNBQWlCO0FBQUEsUUFDbEQsTUFBTSxlQUFlLGVBQWU7QUFBQSxRQUVwQyxJQUFJLGNBQWM7QUFBQSxVQUVoQixNQUFNLFNBQVMsWUFBWTtBQUFBLFVBQzNCLG1CQUFtQixpQkFBaUIsT0FBTyxDQUFDLFlBQVk7QUFBQSxZQUN0RCxNQUFNLGFBQWEsUUFBUSxNQUFNO0FBQUEsWUFDakMsTUFBTSxlQUFlLFFBQVEsTUFBTTtBQUFBLFlBQ25DLE1BQU0sYUFDSixjQUFjLGFBQWEsUUFBUSxVQUNuQyxnQkFBZ0IsYUFBYSxNQUFNO0FBQUEsWUFFckMsSUFBSSxDQUFDLFlBQVk7QUFBQSxjQUNmLFFBQVEsUUFBUTtBQUFBLFlBQ2xCO0FBQUEsWUFDQSxPQUFPO0FBQUEsV0FDUjtBQUFBLFVBR0QsTUFBTSxrQkFBa0IsY0FBYyxlQUFlO0FBQUEsUUFDdkQ7QUFBQSxRQUdBLGFBQWE7QUFBQSxPQUNkO0FBQUEsTUFLRCxXQUFVLEtBQUssZ0JBQWdCLENBQUMsU0FBYztBQUFBLFFBTTVDLElBQUksb0JBQW9CLFFBQVEsa0JBQWtCLEdBQUc7QUFBQSxVQUNuRCxrQkFBa0Isa0JBQWtCO0FBQUEsUUFJdEM7QUFBQSxPQWFEO0FBQUEsTUFHRCxJQUFJLGNBQWMsVUFBVTtBQUFBLFFBSTFCLElBQ0UscUJBQXFCLEtBQ3BCLGFBQWEsYUFBYSxhQUFhLE1BQ3hDO0FBQUEsVUFHQSxNQUFNLGVBQWUsV0FBVSxVQUFVLGtCQUFrQjtBQUFBLFVBRTNELElBQ0UsaUJBQ0MsYUFBYSxRQUFRLEtBQUssYUFBYSxNQUFNLElBQzlDO0FBQUEsWUFFQSxrQkFBa0IsY0FBYyxrQkFBa0IsRUFDL0MsS0FBSyxNQUFNO0FBQUEsY0FDVixrQ0FBa0M7QUFBQSxjQUVsQyxJQUFJLGFBQWEsV0FBVztBQUFBLGdCQUMxQixXQUFVLE9BQU8sb0NBQW9DO0FBQUEsa0JBQ25EO0FBQUEsa0JBQ0E7QUFBQSxnQkFDRixDQUFDO0FBQUEsY0FDSDtBQUFBLGFBQ0QsRUFDQSxNQUFNLENBQUMsVUFBVTtBQUFBLGNBQ2hCLFFBQVEsTUFDTixzREFDQSxLQUNGO0FBQUEsY0FDQSxrQ0FBa0M7QUFBQSxhQUNuQztBQUFBLFVBQ0wsRUFBTztBQUFBLFlBR0wsTUFBTSxXQUFXO0FBQUEsWUFDakIsTUFBTSx3QkFBd0IsS0FBSyxLQUFLLE1BQU0sRUFBRTtBQUFBLFlBQ2hELE1BQU0sUUFBUSxLQUFLLElBQUksR0FBRyxxQkFBcUIsUUFBUTtBQUFBLFlBQ3ZELE1BQU0sTUFBTSxxQkFBcUIsd0JBQXdCO0FBQUEsWUFFekQsa0JBQWtCLEVBQUUsT0FBTyxJQUFJLEdBQUcsMkJBQTJCLEVBQzFELEtBQUssTUFBTTtBQUFBLGNBQ1Ysa0NBQWtDO0FBQUEsY0FFbEMsSUFBSSxhQUFhLFdBQVc7QUFBQSxnQkFDMUIsV0FBVSxPQUFPLG9DQUFvQztBQUFBLGtCQUNuRDtBQUFBLGtCQUNBO0FBQUEsZ0JBQ0YsQ0FBQztBQUFBLGNBQ0g7QUFBQSxhQUNELEVBQ0EsTUFBTSxDQUFDLFVBQVU7QUFBQSxjQUNoQixRQUFRLE1BQ04saUVBQ0EsS0FDRjtBQUFBLGNBQ0Esa0NBQWtDO0FBQUEsYUFDbkM7QUFBQTtBQUFBLFVBRUw7QUFBQSxRQUNGO0FBQUEsUUFHQSxVQUFVLEdBQUcsU0FBUyxFQUNuQixLQUFLLE1BQU07QUFBQSxVQUVWLElBQUksbUJBQW1CLE1BQU0sU0FBUyxHQUFHO0FBQUEsWUFDdkMsTUFBTSxZQUFZLE1BQU07QUFBQSxZQUN4QixNQUFNLFVBQVUsV0FBVyxPQUFPLFdBQVc7QUFBQSxZQUM3QyxJQUFJLFlBQVksV0FBVztBQUFBLGNBQ3pCLFdBQVUsT0FBTyxvQ0FBb0M7QUFBQSxnQkFDbkQsVUFBVTtBQUFBLGdCQUNWLG9CQUFvQjtBQUFBLGNBQ3RCLENBQUM7QUFBQSxZQUNIO0FBQUEsVUFDRjtBQUFBLFNBQ0QsRUFDQSxNQUFNLENBQUMsVUFBVTtBQUFBLFVBQ2hCLFFBQVEsTUFBTSw2Q0FBNkMsS0FBSztBQUFBLFNBQ2pFO0FBQUEsTUFDTDtBQUFBLE1BRUEsT0FBTztBQUFBO0FBQUEsSUFPVCxNQUFNLFFBQVEsTUFBTTtBQUFBLE1BQ2xCLGVBQWUsY0FBYztBQUFBLE1BRzdCLGlCQUFpQixRQUFRLENBQUMsZUFBZTtBQUFBLFFBQ3ZDLElBQUk7QUFBQSxVQUNGLFdBQVcsTUFBTTtBQUFBLFVBQ2pCLE9BQU8sR0FBRztBQUFBLE9BR2I7QUFBQSxNQUNELGlCQUFpQixNQUFNO0FBQUEsTUFHdkIsTUFBTSxTQUFTO0FBQUEsTUFDZixpQkFBaUIsU0FBUztBQUFBLE1BQzFCLGFBQWEsTUFBTTtBQUFBLE1BQ25CLGNBQWMsTUFBTTtBQUFBLE1BQ3BCLGFBQWEsTUFBTTtBQUFBLE1BQ25CLGlCQUFpQixNQUFNO0FBQUEsTUFDdkIsZUFBZSxNQUFNO0FBQUEsTUFDckIsVUFBVSxNQUFNO0FBQUEsTUFDaEIsZ0JBQWdCLE1BQU07QUFBQSxNQUd0QixhQUFhO0FBQUEsTUFDYixnQkFBZ0I7QUFBQSxNQUNoQixvQkFBb0I7QUFBQSxNQUNwQixrQkFBa0I7QUFBQSxNQUNsQixnQkFBZ0I7QUFBQSxNQUNoQixrQ0FBa0M7QUFBQSxNQUdsQyxrQkFBa0I7QUFBQSxNQUNsQixpQkFBaUI7QUFBQSxNQUNqQixjQUFjO0FBQUEsTUFDZCxpQkFBaUI7QUFBQSxNQUdqQixXQUFVLFFBQVE7QUFBQSxNQUNsQixXQUFVLGFBQWE7QUFBQSxNQUV2QixlQUFlLGFBQWE7QUFBQSxNQUc1QixXQUFVLE9BQU8sa0JBQWtCO0FBQUE7QUFBQSxJQUlyQyxXQUFVLFNBQVMsYUFBYTtBQUFBLE1BQzlCLFdBQVcsQ0FBQyxRQUFnQixVQUFrQixVQUFVLFFBQVEsS0FBSztBQUFBLE1BQ3JFLG1CQUFtQixDQUNqQixPQUNBLFdBQ0csa0JBQWtCLE9BQU8sVUFBVSxxQkFBcUI7QUFBQSxNQUM3RCxpQkFBaUIsTUFBTTtBQUFBLE1BQ3ZCLGtCQUFrQixNQUFNO0FBQUEsTUFDeEIsbUJBQW1CLE1BQU0sYUFBYSxNQUFNO0FBQUEsTUFDNUM7QUFBQSxNQUNBO0FBQUEsTUFDQSxlQUFlLE1BQU07QUFBQSxNQUVyQixrQkFBa0IsTUFBTTtBQUFBLE1BQ3hCLGtCQUFrQixDQUFDLFNBQWlCLFVBQVUsSUFBSSxJQUFJLEtBQUs7QUFBQSxNQUUzRDtBQUFBLElBQ0Y7QUFBQSxJQUdDLFdBQWtCLGFBQWE7QUFBQSxNQUM5QjtBQUFBLE1BQ0EsVUFBVSxNQUFNO0FBQUEsTUFDaEIsU0FBUyxDQUFDLFVBQWtCLE1BQU07QUFBQSxNQUNsQztBQUFBLE1BQ0EsbUJBQW1CLENBQ2pCLE9BQ0EsV0FDRyxrQkFBa0IsT0FBTyxVQUFVLHNCQUFzQjtBQUFBLE1BQzlELGlCQUFpQixPQUFPO0FBQUEsUUFDdEIsaUJBQWlCO0FBQUEsUUFDakIsbUJBQW1CO0FBQUEsUUFDbkIsZ0JBQWdCO0FBQUEsUUFDaEIsbUJBQW1CO0FBQUEsUUFDbkI7QUFBQSxRQUNBLFNBQVMsUUFBUTtBQUFBLFFBQ2pCLGdCQUFnQixpQkFBaUI7QUFBQSxNQUNuQztBQUFBLE1BRUEsZUFBZSxNQUFNO0FBQUEsTUFDckI7QUFBQSxNQUVBLGtCQUFrQixNQUFNO0FBQUEsTUFDeEIsa0JBQWtCLENBQUMsU0FBaUIsVUFBVSxJQUFJLElBQUksS0FBSztBQUFBLE1BRTNEO0FBQUEsSUFDRjtBQUFBLElBR0EsV0FBVSxRQUFRO0FBQUEsSUFHbEIsTUFBTSxVQUFVLE1BQU07QUFBQSxNQUNwQixlQUFlLGdCQUFnQjtBQUFBLE1BRy9CLGlCQUFpQixRQUFRLENBQUMsZUFBZTtBQUFBLFFBQ3ZDLElBQUk7QUFBQSxVQUNGLFdBQVcsTUFBTTtBQUFBLFVBQ2pCLE9BQU8sR0FBRztBQUFBLE9BR2I7QUFBQSxNQUNELGlCQUFpQixNQUFNO0FBQUEsTUFHdkIsTUFBTSxTQUFTO0FBQUEsTUFDZixpQkFBaUIsU0FBUztBQUFBLE1BQzFCLGFBQWEsTUFBTTtBQUFBLE1BQ25CLGNBQWMsTUFBTTtBQUFBLE1BQ3BCLGFBQWEsTUFBTTtBQUFBLE1BQ25CLGlCQUFpQixNQUFNO0FBQUEsTUFDdkIsZUFBZSxNQUFNO0FBQUEsTUFDckIsVUFBVSxNQUFNO0FBQUEsTUFDaEIsZ0JBQWdCLE1BQU07QUFBQSxNQUd0QixhQUFhO0FBQUEsTUFDYixnQkFBZ0I7QUFBQSxNQUNoQixvQkFBb0I7QUFBQSxNQUNwQixrQkFBa0I7QUFBQSxNQUNsQixnQkFBZ0I7QUFBQSxNQUdoQixJQUFJLFdBQVUsVUFBVSxPQUFPO0FBQUEsUUFDN0IsV0FBVSxRQUFRLENBQUM7QUFBQSxNQUNyQjtBQUFBLE1BRUEsZUFBZSxlQUFlO0FBQUE7QUFBQSxJQUloQyxZQUFZLFlBQVcsT0FBTztBQUFBLElBRzlCLE9BQU87QUFBQSxTQUNGO0FBQUEsTUFDSCxZQUFZO0FBQUEsUUFFVjtBQUFBLFFBQ0EsVUFBVSxNQUFNO0FBQUEsUUFDaEIsU0FBUyxDQUFDLFVBQWtCLE1BQU07QUFBQSxRQUVsQztBQUFBLFFBQ0EsbUJBQW1CLENBQ2pCLE9BQ0EsV0FDRyxrQkFBa0IsT0FBTyxVQUFVLG1CQUFtQjtBQUFBLFFBQzNELGlCQUFpQixNQUFNO0FBQUEsUUFDdkIsa0JBQWtCLE1BQU07QUFBQSxRQUN4QixtQkFBbUIsTUFBTSxhQUFhLE1BQU07QUFBQSxRQUM1QztBQUFBLFFBQ0E7QUFBQSxRQUNBLGVBQWUsTUFBTTtBQUFBLFFBRXJCLGtCQUFrQixNQUFNO0FBQUEsUUFDeEIsa0JBQWtCLENBQUMsU0FBaUIsVUFBVSxJQUFJLElBQUksS0FBSztBQUFBLFFBRTNEO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQTtBQUFBOzs7QUMxdENHLFNBQVMsZ0JBQWdCLENBQUMsU0FBNEIsQ0FBQyxHQUFHO0FBQUEsRUFDL0QsT0FBTyxDQUNMLGVBQzZCO0FBQUEsSUFDN0I7QUFBQSxNQUNFLFVBQVU7QUFBQSxNQUNWLG1CQUFtQjtBQUFBLE1BQ25CLGdCQUFnQixtQkFBbUIsWUFBWTtBQUFBLE1BQy9DLHVCQUF1QixtQkFBbUIsWUFDdkM7QUFBQSxRQUNEO0FBQUEsSUFHSixJQUFJLGtCQUFzRDtBQUFBLElBQzFELElBQUksY0FBYztBQUFBLElBQ2xCLElBQUksdUJBQXVCO0FBQUEsSUFLM0IsTUFBTSx1QkFBdUIsQ0FBQyxVQUF1QjtBQUFBLE1BQ25ELElBQUksQ0FBQyxXQUFXLGVBQWUsQ0FBQyxNQUFNLFFBQVE7QUFBQSxRQUM1QztBQUFBLE1BQ0Y7QUFBQSxNQU1BLE1BQU0sYUFBYSxJQUFJO0FBQUEsTUFDdkIsTUFBTSxhQUFhLEtBQUssSUFDdEIsTUFBTSxRQUNOLG1CQUFtQixZQUFZLGVBQ2pDO0FBQUEsTUFHQSxNQUFNLGFBQWEsSUFBSTtBQUFBLE1BRXZCLFNBQVMsSUFBSSxFQUFHLElBQUksWUFBWSxLQUFLO0FBQUEsUUFDbkMsTUFBTSxPQUFPLE1BQU07QUFBQSxRQUNuQixJQUFJLENBQUMsUUFBUSxPQUFPLFNBQVM7QUFBQSxVQUFVO0FBQUEsUUFFdkMsT0FBTyxLQUFLLElBQUksRUFBRSxRQUFRLENBQUMsVUFBVTtBQUFBLFVBRW5DLElBQ0UsTUFBTSxXQUFXLEdBQUcsS0FDcEIsVUFBVSxtQkFBbUIsWUFBWSxrQkFDekM7QUFBQSxZQUNBO0FBQUEsVUFDRjtBQUFBLFVBRUEsTUFBTSxRQUFRLE9BQU8sS0FBSyxVQUFVLEVBQUU7QUFBQSxVQUN0QyxNQUFNLFNBQVMsTUFBTTtBQUFBLFVBRXJCLElBQUksQ0FBQyxXQUFXLElBQUksS0FBSyxHQUFHO0FBQUEsWUFDMUIsV0FBVyxJQUFJLE9BQU8sQ0FBQyxDQUFDO0FBQUEsVUFDMUI7QUFBQSxVQUNBLFdBQVcsSUFBSSxLQUFLLEVBQUcsS0FBSyxNQUFNO0FBQUEsU0FDbkM7QUFBQSxNQUNIO0FBQUEsTUFHQSxXQUFXLFFBQVEsQ0FBQyxTQUFTLFVBQVU7QUFBQSxRQUNyQyxJQUFJLFFBQVEsV0FBVztBQUFBLFVBQUc7QUFBQSxRQUUxQixNQUFNLFlBQVksS0FBSyxJQUFJLEdBQUcsT0FBTztBQUFBLFFBQ3JDLE1BQU0sWUFBWSxLQUFLLElBQUksR0FBRyxPQUFPO0FBQUEsUUFDckMsTUFBTSxZQUFZLEtBQUssTUFDckIsUUFBUSxPQUFPLENBQUMsS0FBSyxRQUFRLE1BQU0sS0FBSyxDQUFDLElBQUksUUFBUSxNQUN2RDtBQUFBLFFBRUEsV0FBVyxJQUFJLE9BQU87QUFBQSxVQUNwQjtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsUUFDRixDQUFDO0FBQUEsT0FDRjtBQUFBLE1BRUQsa0JBQWtCO0FBQUEsTUFDbEIsY0FBYztBQUFBLE1BUWQsV0FBVSxPQUFPLDRDQUE0QztBQUFBLFFBQzNELFdBQVcsT0FBTyxZQUFZLFVBQVU7QUFBQSxNQUMxQyxDQUFDO0FBQUE7QUFBQSxJQU1ILE1BQU0sMEJBQTBCLENBQUMsVUFBdUI7QUFBQSxNQUN0RCxNQUFNLGNBQW1DO0FBQUEsUUFDdkMsSUFBSSxlQUFlO0FBQUEsU0FDbEIsbUJBQW1CLFlBQVksbUJBQW1CO0FBQUEsUUFDbkQsUUFBUTtBQUFBLE1BQ1Y7QUFBQSxNQUVBLElBQUksQ0FBQyxtQkFBbUIsZ0JBQWdCLFNBQVMsR0FBRztBQUFBLFFBRWxELFlBQVksUUFBUSxjQUFjLE9BQU8sRUFBRTtBQUFBLFFBQzNDLE9BQU87QUFBQSxNQUNUO0FBQUEsTUFHQSxnQkFBZ0IsUUFBUSxDQUFDLFdBQVcsVUFBVTtBQUFBLFFBQzVDLElBQUk7QUFBQSxRQUVKLElBQ0Usd0JBQ0EsVUFBVSxjQUFjLFVBQVUsV0FDbEM7QUFBQSxVQUVBLFNBQVMsS0FBSyxNQUNaLEtBQUssT0FBTyxLQUFLLFVBQVUsWUFBWSxVQUFVLFlBQVksS0FDM0QsVUFBVSxTQUNkO0FBQUEsUUFDRixFQUFPO0FBQUEsVUFFTCxTQUFTLFVBQVU7QUFBQTtBQUFBLFFBSXJCLElBQUksd0JBQXdCLEtBQUssT0FBTyxJQUFJLEtBQUs7QUFBQSxVQUMvQyxTQUFTLEtBQUssSUFBSSxHQUFHLFNBQVMsS0FBSyxNQUFNLEtBQUssT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0FBQUEsUUFDakU7QUFBQSxRQUVBLFlBQVksU0FBUyxjQUFjLE9BQU8sTUFBTTtBQUFBLE9BQ2pEO0FBQUEsTUFFRCxPQUFPO0FBQUE7QUFBQSxJQU1ULE1BQU0sMkJBQTJCLENBQUMsVUFHckI7QUFBQSxNQUNYLE1BQU0sUUFBZSxDQUFDO0FBQUEsTUFDdEIsU0FBUyxJQUFJLE1BQU0sTUFBTyxLQUFLLE1BQU0sS0FBSyxLQUFLO0FBQUEsUUFDN0MsTUFBTSxLQUFLLHdCQUF3QixDQUFDLENBQUM7QUFBQSxNQUN2QztBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsSUFNVCxNQUFNLG1CQUFtQixDQUFDLFVBQWdEO0FBQUEsTUFDeEUsSUFBSSxDQUFDO0FBQUEsUUFBUztBQUFBLE1BRWQsTUFBTSxlQUFlLHlCQUF5QixLQUFLO0FBQUEsTUFHbkQsSUFBSSxXQUFVLE9BQU87QUFBQSxRQUNuQixTQUFTLElBQUksRUFBRyxJQUFJLGFBQWEsUUFBUSxLQUFLO0FBQUEsVUFDNUMsTUFBTSxRQUFRLE1BQU0sUUFBUTtBQUFBLFVBQzVCLElBQUksQ0FBQyxXQUFVLE1BQU0sUUFBUTtBQUFBLFlBQzNCLFdBQVUsTUFBTSxTQUFTLGFBQWE7QUFBQSxVQUN4QztBQUFBLFFBQ0Y7QUFBQSxNQUNGO0FBQUEsTUFFQSxRQUFRLElBQ04sdUNBQTRCLGFBQWEsaUNBQWlDLE1BQU0sU0FBUyxNQUFNLEtBQ2pHO0FBQUEsTUFHQSxXQUFVLE9BQU8sK0JBQStCO0FBQUEsUUFDOUM7QUFBQSxRQUNBLE9BQU8sYUFBYTtBQUFBLE1BQ3RCLENBQUM7QUFBQTtBQUFBLElBTUgsTUFBTSxpQkFBZ0IsQ0FBQyxTQUF1QjtBQUFBLE1BQzVDLE9BQ0UsUUFDQSxPQUFPLFNBQVMsWUFDaEIsS0FBSyxtQkFBbUIsWUFBWSxzQkFBc0I7QUFBQTtBQUFBLElBTzlELE1BQU0sc0JBQXNCLENBQUMsT0FBYyxXQUF5QjtBQUFBLE1BQ2xFLElBQUksQ0FBQyxXQUFVO0FBQUEsUUFBTztBQUFBLE1BRXRCLElBQUksZ0JBQWdCO0FBQUEsTUFFcEIsU0FBUyxJQUFJLEVBQUcsSUFBSSxNQUFNLFFBQVEsS0FBSztBQUFBLFFBQ3JDLE1BQU0sUUFBUSxTQUFTO0FBQUEsUUFDdkIsTUFBTSxjQUFjLFdBQVUsTUFBTTtBQUFBLFFBRXBDLElBQUksZUFBYyxXQUFXLEdBQUc7QUFBQSxVQUM5QixXQUFVLE1BQU0sU0FBUyxNQUFNO0FBQUEsVUFDL0I7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLE1BRUEsSUFBSSxnQkFBZ0IsR0FBRztBQUFBLFFBQ3JCLFFBQVEsSUFDTiw2QkFBNEIsd0NBQXdDLFFBQ3RFO0FBQUEsUUFHQSxXQUFVLE9BQU8sa0NBQWtDO0FBQUEsVUFDakQ7QUFBQSxVQUNBLE9BQU87QUFBQSxRQUNULENBQUM7QUFBQSxNQUNIO0FBQUE7QUFBQSxJQU1GLE1BQU0sUUFBUSxNQUFZO0FBQUEsTUFDeEIsa0JBQWtCO0FBQUEsTUFDbEIsY0FBYztBQUFBLE1BQ2QsdUJBQXVCO0FBQUE7QUFBQSxJQUl6QixNQUFNLGFBQWEsTUFBTTtBQUFBLE1BQ3ZCLElBQUksQ0FBQztBQUFBLFFBQVM7QUFBQSxNQUdkLElBQUksa0JBQWtCO0FBQUEsUUFDcEIsTUFBTSxvQkFBb0IsQ0FBQyxTQUFjO0FBQUEsVUFDdkMsSUFBSSxDQUFDLGVBQWUsS0FBSyxTQUFTLEtBQUssTUFBTSxTQUFTLEdBQUc7QUFBQSxZQUN2RCxxQkFBcUIsS0FBSyxLQUFLO0FBQUEsVUFDakM7QUFBQSxVQUdBLG9CQUFvQixLQUFLLE9BQU8sS0FBSyxNQUFNO0FBQUE7QUFBQSxRQUc3QyxXQUFVLEtBQUsseUJBQXlCLGlCQUFpQjtBQUFBLE1BQzNEO0FBQUEsTUFHQSxNQUFNLGFBQWEsV0FBVSxZQUFZLGNBQWMsS0FBSztBQUFBLE1BQzVELElBQUksYUFBYSxHQUFHO0FBQUEsUUFDbEIsTUFBTSxlQUFlO0FBQUEsVUFDbkIsT0FBTztBQUFBLFVBQ1AsS0FBSyxLQUFLLElBQ1IsbUJBQW1CLFlBQVksa0JBQWtCLEdBQ2pELGFBQWEsQ0FDZjtBQUFBLFFBQ0Y7QUFBQSxRQUNBLGlCQUFpQixZQUFZO0FBQUEsTUFDL0I7QUFBQTtBQUFBLElBSUYsTUFBTSxVQUFVLE1BQU07QUFBQSxNQUNwQixNQUFNO0FBQUE7QUFBQSxJQUlQLFdBQWtCLDBCQUEwQjtBQUFBLElBQzVDLFdBQWtCLHVCQUF1QjtBQUFBLElBRzFDLE9BQU87QUFBQSxTQUNGO0FBQUEsTUFDSCxjQUFjO0FBQUEsUUFDWjtBQUFBLFFBQ0Esc0JBQXNCLE1BQU07QUFBQSxRQUM1QjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQTtBQUFBOzs7QUN2VTRDLElBQWhEO0FBeUNPLElBQU0sZ0JBQWdCLENBQUMsU0FBMEIsQ0FBQyxNQUFNO0FBQUEsRUFDN0QsT0FBTyxDQUFnRCxlQUFvQjtBQUFBLElBQ3pFO0FBQUEsTUFDRTtBQUFBLE1BQ0EsV0FBVztBQUFBLE1BQ1gsZUFBZTtBQUFBLE1BQ2Ysa0JBQWtCO0FBQUEsTUFDbEIsY0FBYyxtQkFBbUIsVUFBVTtBQUFBLE1BQzNDLG1CQUFtQjtBQUFBLFFBQ2pCO0FBQUEsSUFHSixNQUFNLHFCQUFxQixNQUFhO0FBQUEsTUFDdEMsT0FDRyxXQUFrQixZQUFZLFNBQVUsV0FBa0IsU0FBUyxDQUFDO0FBQUE7QUFBQSxJQUt6RSxNQUFNLG1CQUFtQixJQUFJO0FBQUEsSUFDN0IsTUFBTSxjQUE2QixDQUFDO0FBQUEsSUFDcEMsTUFBTSxZQUFZLEVBQUUsU0FBUyxHQUFHLFVBQVUsR0FBRyxVQUFVLEdBQUcsVUFBVSxFQUFFO0FBQUEsSUFHdEUsTUFBTSxnQkFBZ0IsSUFBSTtBQUFBLElBRzFCLE1BQU0saUJBQWlCLFNBQVMsY0FBYyxVQUFVO0FBQUEsSUFFeEQsSUFBSSxnQkFBc0M7QUFBQSxJQUMxQyxJQUFJLHNCQUFzQixFQUFFLE9BQU8sR0FBRyxLQUFLLEVBQUU7QUFBQSxJQUM3QyxJQUFJLGlCQUFpQjtBQUFBLElBQ3JCLElBQUksaUJBQWlCO0FBQUEsSUFHckIsTUFBTSxtQkFBbUIsTUFBbUI7QUFBQSxNQUMxQyxJQUFJLG1CQUFtQixZQUFZLFNBQVMsR0FBRztBQUFBLFFBQzdDLFVBQVU7QUFBQSxRQUNWLE9BQU8sWUFBWSxJQUFJO0FBQUEsTUFDekI7QUFBQSxNQUNBLE1BQU0sVUFBVSxTQUFTLGNBQWMsS0FBSztBQUFBLE1BQzVDLFFBQVEsWUFBWTtBQUFBLE1BQ3BCLFVBQVU7QUFBQSxNQUNWLE9BQU87QUFBQTtBQUFBLElBR1QsTUFBTSxpQkFBaUIsQ0FBQyxZQUErQjtBQUFBLE1BQ3JELFVBQVU7QUFBQSxNQUlWLE1BQU0sZUFBZSxjQUFjLElBQUksT0FBTztBQUFBLE1BQzlDLElBQUksZ0JBQWdCLE9BQU8sYUFBYSxZQUFZLFlBQVk7QUFBQSxRQUM5RCxJQUFJO0FBQUEsVUFDRixhQUFhLFFBQVE7QUFBQSxVQUNyQixPQUFPLEdBQUc7QUFBQSxRQUdaLGNBQWMsT0FBTyxPQUFPO0FBQUEsTUFDOUI7QUFBQSxNQUVBLElBQUksQ0FBQyxpQkFBaUI7QUFBQSxRQUNwQixRQUFRLE9BQU87QUFBQSxRQUNmO0FBQUEsTUFDRjtBQUFBLE1BRUEsUUFBUSxZQUFZO0FBQUEsTUFDcEIsUUFBUSxnQkFBZ0IsWUFBWTtBQUFBLE1BQ3BDLFFBQVEsTUFBTSxVQUFVO0FBQUEsTUFDeEIsUUFBUSxZQUFZO0FBQUEsTUFHcEIsSUFBSSxRQUFRLFlBQVk7QUFBQSxRQUN0QixRQUFRLFdBQVcsWUFBWSxPQUFPO0FBQUEsTUFDeEM7QUFBQSxNQUdBLElBQUksWUFBWSxTQUFTLGFBQWE7QUFBQSxRQUNwQyxZQUFZLEtBQUssT0FBTztBQUFBLFFBQ3hCLFVBQVUsV0FBVyxZQUFZO0FBQUEsTUFDbkM7QUFBQTtBQUFBLElBS0YsZUFBZSxZQUFXLE1BQU07QUFBQSxNQUM5QixnQkFBZ0IsaUJBQWlCLFVBQVM7QUFBQSxNQUcxQyxJQUFJLGVBQWUsa0JBQWtCLGNBQWMsbUJBQW1CLEdBQUc7QUFBQSxRQUN2RSxjQUFjLGVBQWUsTUFBTSxTQUFTLEdBQUcsY0FBYztBQUFBLE1BQy9EO0FBQUEsTUFHQSxXQUFVLEtBQUssdUJBQXVCLENBQUMsU0FBYztBQUFBLFFBQ25ELFFBQVEsT0FBTyxNQUFNLGlCQUFpQjtBQUFBLFFBS3RDLE1BQU0sa0JBQWtCLGlCQUFpQixJQUFJLEtBQUs7QUFBQSxRQUNsRCxNQUFNLGFBQWEsQ0FBQyxDQUFDO0FBQUEsUUFHckIsTUFBTSxjQUFjLGtCQUNoQixzQkFDRSxpQkFDQSxtQkFBbUIsVUFBVSxjQUMvQixLQUFLLHNCQUFTLGlCQUFpQiw4QkFBOEIsSUFDN0Q7QUFBQSxRQUVKLElBQUksbUJBQW1CLGdCQUFnQixZQUFZO0FBQUEsVUFFakQsTUFBTSxhQUFhLFdBQVcsTUFBTSxLQUFLO0FBQUEsVUFFekMsSUFBSSxZQUFZO0FBQUEsWUFFZCxPQUFPLE9BQU8sV0FBVyxPQUFPO0FBQUEsY0FDOUIsVUFBVSxnQkFBZ0IsTUFBTTtBQUFBLGNBQ2hDLFdBQVcsZ0JBQWdCLE1BQU07QUFBQSxjQUNqQyxPQUFPLGdCQUFnQixNQUFNO0FBQUEsWUFDL0IsQ0FBQztBQUFBLFlBR0QsSUFBSSxhQUFhO0FBQUEsY0FDZixzQkFBUyxZQUFZLG1CQUFtQixVQUFVLGNBQWM7QUFBQSxjQUNoRSxzQkFBUyxZQUFZLDhCQUE4QjtBQUFBLFlBQ3JEO0FBQUEsWUFHQSxzQkFBUyxZQUFZLHdCQUF3QjtBQUFBLFlBRTdDLE1BQU0sWUFBWSxXQUFXO0FBQUEsWUFDN0IsSUFBSSxXQUFXO0FBQUEsY0FDYixzQkFBUyxXQUFXLGVBQWU7QUFBQSxZQUNyQztBQUFBLFlBR0EsZ0JBQWdCLFdBQVcsYUFDekIsWUFDQSxlQUNGO0FBQUEsWUFDQSxpQkFBaUIsSUFBSSxPQUFPLFVBQVU7QUFBQSxZQUN0QyxlQUFlLGVBQWU7QUFBQSxZQUc5QixXQUFXLE1BQU07QUFBQSxjQUNmLHlCQUFZLFlBQVksd0JBQXdCO0FBQUEsY0FDaEQsSUFBSSxXQUFXO0FBQUEsZ0JBQ2IseUJBQVksV0FBVyxlQUFlO0FBQUEsY0FDeEM7QUFBQSxlQUNDLEdBQUc7QUFBQSxVQUNSO0FBQUEsUUFDRjtBQUFBLFFBR0EsV0FBVSxPQUFPLGdCQUFnQjtBQUFBLFVBQy9CO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFFBQ0YsQ0FBQztBQUFBLE9BQ0Y7QUFBQSxNQUdELFdBQVUsS0FBSyx1QkFBdUIsQ0FBQyxTQUFjO0FBQUEsUUFDbkQsUUFBUSxPQUFPLFNBQVM7QUFBQSxRQUN4QixpQkFBaUI7QUFBQSxRQU1qQixNQUFNLGtCQUFrQixpQkFBaUIsSUFBSSxLQUFLO0FBQUEsUUFDbEQsSUFBSSxtQkFBbUIsZ0JBQWdCLFlBQVk7QUFBQSxVQUNqRCxlQUFlLGVBQWU7QUFBQSxRQUNoQztBQUFBLFFBQ0EsaUJBQWlCLE9BQU8sS0FBSztBQUFBLFFBRzdCLE1BQU0sZUFBZSxNQUFNLEtBQUssaUJBQWlCLEtBQUssQ0FBQyxFQUFFLEtBQ3ZELENBQUMsR0FBRyxNQUFNLElBQUksQ0FDaEI7QUFBQSxRQUNBLE1BQU0sc0JBQXNCLElBQUk7QUFBQSxRQUNoQyxXQUFXLE9BQU8sY0FBYztBQUFBLFVBQzlCLElBQUksTUFBTSxPQUFPO0FBQUEsWUFDZixNQUFNLFVBQVUsaUJBQWlCLElBQUksR0FBRztBQUFBLFlBQ3hDLElBQUksU0FBUztBQUFBLGNBRVgsUUFBUSxRQUFRLFFBQVEsT0FBTyxNQUFNLENBQUM7QUFBQSxjQUN0QyxvQkFBb0IsSUFBSSxNQUFNLEdBQUcsT0FBTztBQUFBLFlBQzFDO0FBQUEsVUFDRixFQUFPLFNBQUksTUFBTSxPQUFPO0FBQUEsWUFDdEIsTUFBTSxVQUFVLGlCQUFpQixJQUFJLEdBQUc7QUFBQSxZQUN4QyxJQUFJLFNBQVM7QUFBQSxjQUNYLG9CQUFvQixJQUFJLEtBQUssT0FBTztBQUFBLFlBQ3RDO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxRQUNBLGlCQUFpQixNQUFNO0FBQUEsUUFDdkIsWUFBWSxLQUFLLFlBQVkscUJBQXFCO0FBQUEsVUFDaEQsaUJBQWlCLElBQUksS0FBSyxPQUFPO0FBQUEsUUFDbkM7QUFBQSxRQUtBLElBQUksaUJBQWlCLGNBQWMsYUFBYSxHQUFHO0FBQUEsVUFDakQsY0FBYztBQUFBLFFBQ2hCO0FBQUEsUUFHQSxzQkFBc0IsRUFBRSxPQUFPLElBQUksS0FBSyxHQUFHO0FBQUEsUUFHM0MsV0FBVSxPQUFPLGdCQUFnQjtBQUFBLFVBQy9CO0FBQUEsVUFDQTtBQUFBLFFBQ0YsQ0FBQztBQUFBLFFBTUQsTUFBTSxhQUFjLFdBQVUsVUFBa0I7QUFBQSxRQUNoRCxJQUFJLFlBQVksaUJBQWlCO0FBQUEsVUFDL0IsTUFBTSxlQUFlLFdBQVcsZ0JBQWdCO0FBQUEsVUFDaEQsYUFBYSxNQUFNO0FBQUEsUUFDckI7QUFBQSxRQUdBLE1BQU0scUJBQXFCLG1CQUFtQjtBQUFBLFFBQzlDLE1BQU0sbUJBQW1CLG1CQUFtQjtBQUFBLFFBQzVDLE1BQU0sZUFBZSxXQUFVLFVBQVUsa0JBQWtCO0FBQUEsUUFDM0QsSUFBSSxnQkFBZ0IsWUFBWSxtQkFBbUI7QUFBQSxVQUNqRCxXQUFXLGtCQUNULEVBQUUsT0FBTyxHQUFHLEtBQUssS0FBSyxJQUFJLGFBQWEsS0FBSyxnQkFBZ0IsRUFBRSxHQUM5RCxjQUNGO0FBQUEsUUFDRjtBQUFBLFFBR0EsWUFBWTtBQUFBLFFBQ1osaUJBQWlCO0FBQUEsT0FDbEI7QUFBQSxNQUdELFdBQVUsS0FBSyxxQkFBcUIsQ0FBQyxTQUFjO0FBQUEsUUFDakQsUUFBUSxPQUFPLFVBQVUsVUFBVSxrQkFBa0I7QUFBQSxRQUVyRCxJQUFJLENBQUMsWUFBWSxTQUFTLFdBQVc7QUFBQSxVQUFHO0FBQUEsUUFLeEMsTUFBTSxhQUFhLFNBQVM7QUFBQSxRQUU1QixJQUFJLGFBQWEsU0FBUztBQUFBLFVBRXhCLE1BQU0sZUFBZSxNQUFNLEtBQUssaUJBQWlCLEtBQUssQ0FBQyxFQUFFLEtBQ3ZELENBQUMsR0FBRyxNQUFNLElBQUksQ0FDaEI7QUFBQSxVQUNBLE1BQU0sc0JBQXNCLElBQUk7QUFBQSxVQUNoQyxXQUFXLE9BQU8sY0FBYztBQUFBLFlBQzlCLE1BQU0sVUFBVSxpQkFBaUIsSUFBSSxHQUFHO0FBQUEsWUFDeEMsTUFBTSxXQUFXLE1BQU07QUFBQSxZQUN2QixRQUFRLGFBQWEsY0FBYyxPQUFPLFFBQVEsQ0FBQztBQUFBLFlBQ25ELG9CQUFvQixJQUFJLFVBQVUsT0FBTztBQUFBLFVBQzNDO0FBQUEsVUFDQSxpQkFBaUIsTUFBTTtBQUFBLFVBQ3ZCLG9CQUFvQixRQUFRLENBQUMsSUFBSSxRQUMvQixpQkFBaUIsSUFBSSxLQUFLLEVBQUUsQ0FDOUI7QUFBQSxRQUNGO0FBQUEsUUFJQSxJQUFJLGVBQWU7QUFBQSxVQUNqQixjQUFjLGNBQ1gsY0FBYyxjQUFjLEtBQUs7QUFBQSxRQUN0QztBQUFBLFFBR0Esc0JBQXNCLEVBQUUsT0FBTyxJQUFJLEtBQUssR0FBRztBQUFBLFFBRzNDLE1BQU0sYUFBYyxXQUFVLFVBQWtCO0FBQUEsUUFDaEQsSUFBSSxZQUFZLGlCQUFpQjtBQUFBLFVBQy9CLE1BQU0sZUFBZSxXQUFXLGdCQUFnQjtBQUFBLFVBQ2hELGFBQWEsTUFBTTtBQUFBLFFBQ3JCO0FBQUEsUUFHQSxZQUFZO0FBQUEsUUFHWixXQUFVLE9BQU8seUJBQXlCO0FBQUEsVUFDeEMsT0FBTztBQUFBLFVBQ1A7QUFBQSxVQUNBLE9BQU8sZUFBZSxjQUFjO0FBQUEsUUFDdEMsQ0FBQztBQUFBLE9BQ0Y7QUFBQSxNQUdELFdBQVUsS0FBSyw0QkFBNEIsQ0FBQyxTQUFjO0FBQUEsUUFDeEQsUUFBUSxXQUFXLFlBQVk7QUFBQSxRQUcvQixpQkFBaUIsUUFBUSxDQUFDLFNBQVMsVUFBVTtBQUFBLFVBQzNDLElBQUksUUFBUSxhQUFhLFFBQVEsU0FBUztBQUFBLFlBQ3hDLGVBQWUsT0FBTztBQUFBLFlBQ3RCLGlCQUFpQixPQUFPLEtBQUs7QUFBQSxVQUMvQjtBQUFBLFNBQ0Q7QUFBQSxPQUNGO0FBQUEsTUFHRCxXQUFVLEtBQUssb0JBQW9CLE1BQU07QUFBQSxRQUV2QyxpQkFBaUIsUUFBUSxDQUFDLFlBQVk7QUFBQSxVQUNwQyxlQUFlLE9BQU87QUFBQSxTQUN2QjtBQUFBLFFBQ0QsaUJBQWlCLE1BQU07QUFBQSxRQUd2QixzQkFBc0IsRUFBRSxPQUFPLElBQUksS0FBSyxHQUFHO0FBQUEsT0FDNUM7QUFBQSxNQUdELFdBQVUsS0FBSywyQkFBMkIsQ0FBQyxTQUFjO0FBQUEsUUFDdkQsSUFBSSxDQUFDLEtBQUssT0FBTztBQUFBLFVBQVE7QUFBQSxRQUd6QixNQUFNLGVBQWdCLFdBQWtCO0FBQUEsUUFDeEMsSUFBSSxnQkFBZ0IsQ0FBQyxhQUFhLHFCQUFxQixHQUFHO0FBQUEsVUFDeEQsYUFBYSxxQkFBcUIsS0FBSyxLQUFLO0FBQUEsUUFDOUM7QUFBQSxRQUdBLEtBQUssTUFBTSxRQUFRLENBQUMsTUFBVyxNQUFjO0FBQUEsVUFDM0MsTUFBTSxRQUFRLEtBQUssU0FBUztBQUFBLFVBQzVCLE1BQU0sVUFBVSxpQkFBaUIsSUFBSSxLQUFLO0FBQUEsVUFJMUMsTUFBTSx1QkFDSixTQUFTLFVBQVUsU0FBUyxtQkFBbUIsWUFBWSxLQUFLLEtBQ2hFLFNBQVMsVUFBVSxTQUNqQixRQUFRLG1CQUFtQixZQUFZLE9BQ3pDO0FBQUEsVUFDRixJQUFJLHNCQUFzQjtBQUFBLFlBQ3hCLE1BQU0sYUFBYSxXQUFXLE1BQU0sS0FBSztBQUFBLFlBQ3pDLElBQUksWUFBWTtBQUFBLGNBRWQseUJBQVksWUFBWSxtQkFBbUIsWUFBWSxLQUFLO0FBQUEsY0FFNUQsSUFBSSxXQUFXLG1CQUFtQjtBQUFBLGdCQUNoQyx5QkFDRSxXQUFXLG1CQUNYLG1CQUFtQixZQUFZLEtBQ2pDO0FBQUEsY0FDRjtBQUFBLGNBR0Esc0JBQVMsWUFBWSx5QkFBeUI7QUFBQSxjQUc5QyxPQUFPLE9BQU8sV0FBVyxPQUFPO0FBQUEsZ0JBQzlCLFVBQVUsUUFBUSxNQUFNO0FBQUEsZ0JBQ3hCLFdBQVcsUUFBUSxNQUFNO0FBQUEsZ0JBQ3pCLE9BQU8sUUFBUSxNQUFNO0FBQUEsY0FDdkIsQ0FBQztBQUFBLGNBQ0QsUUFBUSxZQUFZLGFBQWEsWUFBWSxPQUFPO0FBQUEsY0FDcEQsaUJBQWlCLElBQUksT0FBTyxVQUFVO0FBQUEsY0FDdEMsZUFBZSxPQUFPO0FBQUEsY0FHdEIsV0FBVyxNQUFNO0FBQUEsZ0JBQ2YseUJBQVksWUFBWSx5QkFBeUI7QUFBQSxpQkFDaEQsR0FBRztBQUFBLFlBQ1IsRUFBTztBQUFBLGNBRUwsZUFBZSxPQUFPO0FBQUEsY0FDdEIsaUJBQWlCLE9BQU8sS0FBSztBQUFBO0FBQUEsVUFFakM7QUFBQSxTQUNEO0FBQUEsUUFHRCxRQUFRLGlCQUFpQixpQkFBaUIsQ0FBQztBQUFBLFFBQzNDLElBQUksY0FBYztBQUFBLFVBQ2hCLE1BQU0sY0FBYyxLQUFLLElBQUksR0FBRyxhQUFhLFFBQVEsUUFBUTtBQUFBLFVBQzdELE1BQU0sWUFBWSxLQUFLLElBQ3JCLGVBQWUsY0FBYyxJQUFJLEdBQ2pDLGFBQWEsTUFBTSxRQUNyQjtBQUFBLFVBQ0EsTUFBTSxjQUFjLEtBQUs7QUFBQSxVQUN6QixNQUFNLFlBQVksS0FBSyxTQUFTLEtBQUssTUFBTSxTQUFTO0FBQUEsVUFHcEQsTUFBTSxjQUNKLGVBQWUsYUFDZixhQUFhLGVBQ2IsaUJBQWlCLE9BQU8sWUFBWSxjQUFjO0FBQUEsVUFFcEQsSUFBSTtBQUFBLFlBQWEsWUFBWTtBQUFBLFFBQy9CO0FBQUEsT0FDRDtBQUFBLE1BR0QsV0FBVSxLQUFLLDBCQUEwQixXQUFXO0FBQUEsTUFDcEQsV0FBVSxLQUFLLG1CQUFtQixtQkFBbUI7QUFBQSxNQUdyRCxXQUFVLEtBQUssaUNBQWlDLENBQUMsU0FBYztBQUFBLFFBQzdELElBQ0UsZUFBZSxrQkFDZixLQUFLLHFCQUFxQixXQUMxQjtBQUFBLFVBQ0EsY0FBYyxlQUFlLE1BQU0sU0FBUyxHQUFHLEtBQUs7QUFBQSxRQUN0RDtBQUFBLE9BQ0Q7QUFBQSxLQUNGO0FBQUEsSUFHRCxNQUFNLHFCQUFxQixNQUFNLENBQUMsTUFBVyxVQUFrQjtBQUFBLE1BRTdELE9BQU87QUFBQSxRQUNMO0FBQUEsVUFDRSxLQUFLO0FBQUEsVUFDTCxPQUFPO0FBQUEsVUFDUCxNQUNFLE9BQU8sU0FBUyxXQUNaLEtBQUssUUFBUSxLQUFLLFNBQVMsS0FBSyxRQUFRLFFBQVEsVUFDaEQsT0FBTyxJQUFJO0FBQUEsUUFDbkI7QUFBQSxNQUNGO0FBQUE7QUFBQSxJQUlGLE1BQU0sc0JBQXNCLENBQzFCLFFBQ0EsTUFDQSxVQUNRO0FBQUEsTUFDUixJQUFJLE9BQU8sV0FBVyxVQUFVO0FBQUEsUUFFOUIsT0FBTyxPQUFPLFFBQVEsb0JBQW9CLENBQUMsT0FBTyxRQUFRO0FBQUEsVUFDeEQsSUFBSSxRQUFRO0FBQUEsWUFBUyxPQUFPLE9BQU8sS0FBSztBQUFBLFVBQ3hDLElBQUksUUFBUTtBQUFBLFlBQVEsT0FBTyxPQUFPLElBQUk7QUFBQSxVQUd0QyxNQUFNLFFBQVEsSUFBSSxNQUFNLEdBQUcsRUFBRSxPQUFPLENBQUMsS0FBVSxTQUFpQjtBQUFBLFlBQzlELE9BQU8sTUFBTSxLQUFLLEtBQUs7QUFBQSxhQUN0QixJQUFJO0FBQUEsVUFFUCxPQUFPLFVBQVUsWUFBWSxPQUFPLEtBQUssSUFBSTtBQUFBLFNBQzlDO0FBQUEsTUFDSDtBQUFBLE1BRUEsSUFBSSxNQUFNLFFBQVEsTUFBTSxHQUFHO0FBQUEsUUFDekIsT0FBTyxPQUFPLElBQUksQ0FBQyxVQUFVLG9CQUFvQixPQUFPLE1BQU0sS0FBSyxDQUFDO0FBQUEsTUFDdEU7QUFBQSxNQUVBLElBQUksT0FBTyxXQUFXLFlBQVksV0FBVyxNQUFNO0FBQUEsUUFDakQsTUFBTSxZQUFpQixDQUFDO0FBQUEsUUFDeEIsWUFBWSxLQUFLLFVBQVUsT0FBTyxRQUFRLE1BQU0sR0FBRztBQUFBLFVBQ2pELFVBQVUsT0FBTyxvQkFBb0IsT0FBTyxNQUFNLEtBQUs7QUFBQSxRQUN6RDtBQUFBLFFBQ0EsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUVBLE9BQU87QUFBQTtBQUFBLElBSVQsTUFBTSx3QkFBd0IsQ0FDNUIsT0FDQSxnQkFDQSxZQUNBLFVBQ0Esa0JBQ0EsZUFDQSxzQkFDVztBQUFBLE1BQ1gsTUFBTSxrQkFBa0IsYUFBYTtBQUFBLE1BQ3JDLE1BQU0sZUFDSixrQkFBa0Isb0JBQW9CLG1CQUFtQjtBQUFBLE1BSTNELElBQUksc0JBQXNCLGFBQWEsb0JBQW9CLEdBQUc7QUFBQSxRQUc1RCxRQUFRLFFBQVEscUJBQXFCO0FBQUEsTUFDdkM7QUFBQSxNQUVBLElBQUksQ0FBQyxnQkFBZ0IsZUFBZSxHQUFHO0FBQUEsUUFDckMsT0FBTyxRQUFRLFdBQVc7QUFBQSxNQUM1QjtBQUFBLE1BR0EsTUFBTSxvQkFBb0IsbUJBQW1CO0FBQUEsTUFDN0MsTUFBTSxxQkFBcUIsb0JBQW9CO0FBQUEsTUFDL0MsTUFBTSxzQkFBc0I7QUFBQSxNQUU1QixJQUNFLHNCQUFzQix1QkFDdEIsc0JBQXNCLElBQ3RCO0FBQUEsUUFFQSxNQUFNLGdCQUFnQixLQUFLLE1BQU0sZ0JBQWdCLFFBQVE7QUFBQSxRQUN6RCxNQUFNLHVCQUF1QixLQUFLLElBQUksR0FBRyxhQUFhLGFBQWE7QUFBQSxRQUNuRSxNQUFNLGVBQWMsaUJBQWlCO0FBQUEsUUFDckMsTUFBTSxtQkFBbUIsZUFBYztBQUFBLFFBQ3ZDLE1BQU0sZ0JBQWdCLEtBQUssSUFDekIsR0FDQSxLQUFLLElBQUksR0FBRyxJQUFJLHFCQUFxQixtQkFBbUIsQ0FDMUQ7QUFBQSxRQUVBLE1BQU0sa0JBQWtCLFFBQVEsd0JBQXdCO0FBQUEsUUFDeEQsTUFBTSxrQkFBa0IsUUFBUSxvQkFBb0I7QUFBQSxRQUNwRCxPQUNFLGtCQUFrQixpQkFBaUIsa0JBQWtCO0FBQUEsTUFFekQ7QUFBQSxNQUdBLE1BQU0sY0FBYyxpQkFBaUI7QUFBQSxNQUNyQyxRQUFRLFFBQVEsY0FBYyxjQUFjO0FBQUE7QUFBQSxJQUk5QyxNQUFNLGFBQWEsQ0FBQyxNQUFXLFVBQXNDO0FBQUEsTUFDbkUsTUFBTSxlQUFlLFlBQVksbUJBQW1CO0FBQUEsTUFFcEQsSUFBSTtBQUFBLFFBQ0YsTUFBTSxTQUFTLGFBQWEsTUFBTSxLQUFLO0FBQUEsUUFDdkMsSUFBSTtBQUFBLFFBR0osSUFDRSxNQUFNLFFBQVEsTUFBTSxLQUNuQixPQUFPLFdBQVcsWUFDakIsV0FBVyxRQUNYLEVBQUUsa0JBQWtCLGNBQ3RCO0FBQUEsVUFFQSxNQUFNLGtCQUFrQixvQkFBb0IsUUFBUSxNQUFNLEtBQUs7QUFBQSxVQUcvRCxNQUFNLGVBQWUsYUFBYSxlQUFlO0FBQUEsVUFDakQsVUFBVSxhQUFhO0FBQUEsVUFHdkIsSUFBSSxXQUFXLFFBQVEsYUFBYSxHQUFHO0FBQUEsWUFHckMsY0FBYyxJQUFJLFNBQVMsWUFBWTtBQUFBLFVBQ3pDLEVBQU87QUFBQSxZQUVMLFVBQVUsaUJBQWlCO0FBQUEsWUFDM0IsSUFBSSxhQUFhLFNBQVM7QUFBQSxjQUN4QixRQUFRLFlBQVksYUFBYSxPQUFPO0FBQUEsY0FFeEMsY0FBYyxJQUFJLFNBQVMsWUFBWTtBQUFBLFlBQ3pDO0FBQUE7QUFBQSxRQUVKLEVBQU8sU0FBSSxPQUFPLFdBQVcsVUFBVTtBQUFBLFVBR3JDLGVBQWUsWUFBWTtBQUFBLFVBQzNCLE1BQU0sVUFBVSxlQUFlO0FBQUEsVUFFL0IsSUFBSSxRQUFRLFNBQVMsV0FBVyxHQUFHO0FBQUEsWUFFakMsVUFBVSxRQUFRO0FBQUEsWUFDbEIsUUFBUSxZQUFZLE9BQU87QUFBQSxZQUMzQixzQkFBUyxTQUFTLG9CQUFvQjtBQUFBLFlBQ3RDLElBQUksY0FBYyxJQUFJLEdBQUc7QUFBQSxjQUN2QixzQkFBUyxTQUFTLG1CQUFtQixZQUFZLEtBQUs7QUFBQSxZQUN4RDtBQUFBLFVBQ0YsRUFBTztBQUFBLFlBRUwsVUFBVSxpQkFBaUI7QUFBQSxZQUMzQixPQUFPLFFBQVEsWUFBWTtBQUFBLGNBQ3pCLFFBQVEsWUFBWSxRQUFRLFVBQVU7QUFBQSxZQUN4QztBQUFBO0FBQUEsUUFFSixFQUFPLFNBQUksa0JBQWtCLGFBQWE7QUFBQSxVQUN4QyxVQUFVLGlCQUFpQjtBQUFBLFVBQzNCLFFBQVEsWUFBWSxNQUFNO0FBQUEsUUFDNUIsRUFBTztBQUFBLFVBQ0wsUUFBUSxLQUFLLGdEQUFnRCxPQUFPO0FBQUEsVUFDcEUsT0FBTztBQUFBO0FBQUEsUUFJVCxJQUFJLENBQUMsc0JBQVMsU0FBUyxlQUFlO0FBQUEsVUFDcEMsc0JBQVMsU0FBUyxlQUFlO0FBQUEsUUFDbkMsSUFBSSxjQUFjLElBQUksR0FBRztBQUFBLFVBQ3ZCLHNCQUFTLFNBQVMsbUJBQW1CLFlBQVksS0FBSztBQUFBLFFBQ3hEO0FBQUEsUUFFQSxRQUFRLFFBQVEsUUFBUSxPQUFPLEtBQUs7QUFBQSxRQUdwQyxNQUFNLFNBQVMsTUFBTSxPQUFPLE1BQU07QUFBQSxRQUNsQyxJQUFJLFdBQVcsYUFBYSxXQUFXLE1BQU07QUFBQSxVQUMzQyxRQUFRLFFBQVEsS0FBSyxPQUFPLE1BQU07QUFBQSxRQUNwQztBQUFBLFFBQ0EsT0FBTztBQUFBLFFBQ1AsT0FBTyxPQUFPO0FBQUEsUUFDZCxRQUFRLE1BQU0sb0NBQW9DLFVBQVUsS0FBSztBQUFBLFFBQ2pFLE9BQU87QUFBQTtBQUFBO0FBQUEsSUFLWCxNQUFNLHNCQUFzQixNQUFZO0FBQUEsTUFDdEMsSUFBSSxDQUFDLGlCQUFpQixpQkFBaUIsU0FBUztBQUFBLFFBQUc7QUFBQSxNQUVuRDtBQUFBLFFBQ0U7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsVUFDRTtBQUFBLE1BQ0osTUFBTSxrQkFBa0IsYUFBYTtBQUFBLE1BQ3JDLE1BQU0sZUFDSixrQkFBa0Isb0JBQW9CLG1CQUFtQjtBQUFBLE1BRTNELE1BQU0sZ0JBQWdCLE1BQU0sS0FBSyxpQkFBaUIsS0FBSyxDQUFDLEVBQUUsS0FDeEQsQ0FBQyxHQUFHLE1BQU0sSUFBSSxDQUNoQjtBQUFBLE1BQ0EsSUFBSSxDQUFDLGNBQWM7QUFBQSxRQUFRO0FBQUEsTUFFM0IsTUFBTSxhQUFhLGNBQWM7QUFBQSxNQUNqQyxJQUFJLGtCQUFrQjtBQUFBLE1BRXRCLElBQUksY0FBYztBQUFBLFFBQ2hCLE1BQU0sWUFBWSxtQkFBbUI7QUFBQSxRQUNyQyxNQUFNLHFCQUFxQixZQUFZO0FBQUEsUUFFdkMsSUFBSSxzQkFBc0IsaUJBQWlCLHNCQUFzQixJQUFJO0FBQUEsVUFFbkUsTUFBTSxnQkFBZ0IsS0FBSyxNQUFNLGdCQUFnQixRQUFRO0FBQUEsVUFDekQsTUFBTSx1QkFBdUIsS0FBSyxJQUFJLEdBQUcsYUFBYSxhQUFhO0FBQUEsVUFDbkUsTUFBTSxjQUFjLGlCQUFpQjtBQUFBLFVBQ3JDLE1BQU0sbUJBQW1CLGNBQWM7QUFBQSxVQUN2QyxNQUFNLGdCQUFnQixLQUFLLElBQ3pCLEdBQ0EsS0FBSyxJQUFJLEdBQUcsSUFBSSxxQkFBcUIsYUFBYSxDQUNwRDtBQUFBLFVBRUEsTUFBTSxhQUFhLGFBQWEsd0JBQXdCO0FBQUEsVUFDeEQsTUFBTSxhQUFhLGFBQWEsb0JBQW9CO0FBQUEsVUFDcEQsa0JBQWtCLGFBQWEsWUFBWSxhQUFhO0FBQUEsUUFDMUQsRUFBTztBQUFBLFVBQ0wsTUFBTSxjQUFjLGlCQUFpQjtBQUFBLFVBQ3JDLG1CQUFtQixhQUFhLGNBQWMsY0FBYztBQUFBO0FBQUEsTUFFaEUsRUFBTztBQUFBLFFBQ0wsa0JBQWtCLGFBQWEsV0FBVztBQUFBO0FBQUEsTUFJNUMsY0FBYyxRQUFRLENBQUMsVUFBVTtBQUFBLFFBQy9CLE1BQU0sVUFBVSxpQkFBaUIsSUFBSSxLQUFLO0FBQUEsUUFDMUMsSUFBSSxTQUFTO0FBQUEsVUFDWCxRQUFRLE1BQU0sWUFBWSxjQUFjLEtBQUssTUFDM0MsZUFDRjtBQUFBLFVBV0EsbUJBQW1CO0FBQUEsUUFDckI7QUFBQSxPQUNEO0FBQUE7QUFBQSxJQUlILE1BQU0sY0FBYyxNQUFNO0FBQUEsTUFDeEIsSUFBSSxDQUFDLGVBQWUsZ0JBQWdCO0FBQUEsUUFDbEM7QUFBQSxNQUNGO0FBQUEsTUFFQTtBQUFBLFFBQ0U7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxVQUNFO0FBQUEsTUFHSixJQUNFLENBQUMsZ0JBQ0QsY0FBYyxLQUNkLGFBQWEsUUFBUSxLQUNyQixhQUFhLFNBQVMsY0FDdEIsYUFBYSxNQUFNLGFBQWEsU0FDaEMsTUFBTSxhQUFhLEtBQUssS0FDeEIsTUFBTSxhQUFhLEdBQUcsR0FDdEI7QUFBQSxRQUVBLElBQUksY0FBYyxLQUFLLGlCQUFpQixPQUFPLEdBQUc7QUFBQSxVQUNoRCxNQUFNLEtBQUssaUJBQWlCLFFBQVEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxPQUFPLGFBQWE7QUFBQSxZQUNuRSxJQUFJLFFBQVE7QUFBQSxjQUFZLGVBQWUsT0FBTztBQUFBLFlBQzlDLGlCQUFpQixPQUFPLEtBQUs7QUFBQSxXQUM5QjtBQUFBLFVBQ0Qsc0JBQXNCLEVBQUUsT0FBTyxJQUFJLEtBQUssR0FBRztBQUFBLFFBQzdDO0FBQUEsUUFDQTtBQUFBLE1BQ0Y7QUFBQSxNQUdBLElBQ0UsYUFBYSxVQUFVLG9CQUFvQixTQUMzQyxhQUFhLFFBQVEsb0JBQW9CLE9BQ3pDLGlCQUFpQixPQUFPLEdBQ3hCO0FBQUEsUUFDQSxvQkFBb0I7QUFBQSxRQUNwQjtBQUFBLE1BQ0Y7QUFBQSxNQUVBLGlCQUFpQixLQUFLLElBQUk7QUFBQSxNQUMxQixNQUFNLGNBQWMsS0FBSyxJQUFJLEdBQUcsYUFBYSxRQUFRLFFBQVE7QUFBQSxNQUM3RCxNQUFNLFlBQVksS0FBSyxJQUFJLGFBQWEsR0FBRyxhQUFhLE1BQU0sUUFBUTtBQUFBLE1BWXRFLE1BQU0sS0FBSyxpQkFBaUIsUUFBUSxDQUFDLEVBQ2xDLE9BQU8sRUFBRSxXQUFXLFFBQVEsZUFBZSxRQUFRLFNBQVMsRUFDNUQsUUFBUSxFQUFFLE9BQU8sYUFBYTtBQUFBLFFBQzdCLElBQUksUUFBUTtBQUFBLFVBQVksZUFBZSxPQUFPO0FBQUEsUUFDOUMsaUJBQWlCLE9BQU8sS0FBSztBQUFBLE9BQzlCO0FBQUEsTUFHSCxNQUFNLFFBQVEsbUJBQW1CO0FBQUEsTUFDakMsTUFBTSxlQUF5QixDQUFDO0FBQUEsTUFHaEMsTUFBTSxjQUE0QyxDQUFDO0FBQUEsTUFHbkQsU0FBUyxJQUFJLFlBQWEsS0FBSyxXQUFXLEtBQUs7QUFBQSxRQUM3QyxJQUFJLElBQUksS0FBSyxLQUFLLGNBQWMsaUJBQWlCLElBQUksQ0FBQztBQUFBLFVBQUc7QUFBQSxRQUV6RCxJQUFJLE9BQU8sTUFBTTtBQUFBLFFBQ2pCLElBQUksQ0FBQyxNQUFNO0FBQUEsVUFDVCxhQUFhLEtBQUssQ0FBQztBQUFBLFVBRW5CLE1BQU0sZUFBZ0IsV0FBa0I7QUFBQSxVQUN4QyxPQUFPLGNBQWMsd0JBQXdCLENBQUMsS0FBSztBQUFBLFlBQ2pELGNBQWM7QUFBQSxZQUNkLE9BQU87QUFBQSxZQUNQLElBQUksZUFBZTtBQUFBLFlBQ25CLE1BQU0sbUJBQW1CLFlBQVksZUFBZSxPQUFPLEVBQUU7QUFBQSxZQUM3RCxNQUFNLG1CQUFtQixZQUFZLGVBQWUsT0FBTyxFQUFFO0FBQUEsWUFDN0QsYUFDRSxtQkFBbUIsWUFBWSxlQUFlLE9BQU8sRUFBRTtBQUFBLFVBQzNEO0FBQUEsUUFDRjtBQUFBLFFBRUEsTUFBTSxVQUFVLFdBQVcsTUFBTSxDQUFDO0FBQUEsUUFDbEMsSUFBSSxTQUFTO0FBQUEsVUFFWCxNQUFNLG9CQUFxQixlQUF1QjtBQUFBLFVBQ2xELE1BQU0sV0FBVyxzQkFDZixHQUNBLGdCQUNBLFlBQ0EsVUFDQSxrQkFDQSxlQUNBLGlCQUNGO0FBQUEsVUFFQSxPQUFPLE9BQU8sUUFBUSxPQUFPO0FBQUEsWUFDM0IsVUFBVTtBQUFBLFlBQ1YsV0FBVyxjQUFjO0FBQUEsWUFDekIsT0FBTztBQUFBLFVBQ1QsQ0FBQztBQUFBLFVBR0QsSUFBSSxrQkFBa0I7QUFBQSxZQUNwQixZQUFZLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQztBQUFBLFVBQy9CLEVBQU87QUFBQSxZQUNMLGVBQWUsWUFBWSxPQUFPO0FBQUE7QUFBQSxVQUVwQyxpQkFBaUIsSUFBSSxHQUFHLE9BQU87QUFBQSxRQUNqQztBQUFBLE1BQ0Y7QUFBQSxNQUlBLElBQUksb0JBQW9CLFlBQVksU0FBUyxHQUFHO0FBQUEsUUFFOUMsWUFBWSxLQUFLLEVBQUUsS0FBSyxPQUFPLElBQUksQ0FBQztBQUFBLFFBR3BDLE1BQU0sbUJBQW1CLE1BQU0sS0FDN0IsZUFBZSxRQUNqQjtBQUFBLFFBR0EsSUFBSSxTQUFTO0FBQUEsUUFDYixJQUFJLGNBQWM7QUFBQSxRQUVsQixPQUFPLFNBQVMsWUFBWSxRQUFRO0FBQUEsVUFDbEMsT0FBTyxVQUFVLGNBQWMsWUFBWTtBQUFBLFVBRzNDLE9BQ0UsY0FBYyxpQkFBaUIsVUFDL0IsU0FBUyxpQkFBaUIsYUFBYSxRQUFRLFNBQVMsTUFBTSxFQUFFLElBQzlELFVBQ0Y7QUFBQSxZQUNBO0FBQUEsVUFDRjtBQUFBLFVBRUEsSUFBSSxjQUFjLGlCQUFpQixRQUFRO0FBQUEsWUFFekMsZUFBZSxhQUNiLFlBQ0EsaUJBQWlCLFlBQ25CO0FBQUEsVUFDRixFQUFPO0FBQUEsWUFFTCxlQUFlLFlBQVksVUFBVTtBQUFBO0FBQUEsVUFFdkM7QUFBQSxRQUNGO0FBQUEsTUFDRjtBQUFBLE1BR0EsSUFDRSxhQUFhLFNBQVMsS0FDdEIsV0FBVSxVQUFVLFlBQVksbUJBQ2hDO0FBQUEsUUFDQSxXQUFVLFNBQVMsV0FBVyxrQkFDNUI7QUFBQSxVQUNFLE9BQU8sS0FBSyxJQUFJLEdBQUcsWUFBWTtBQUFBLFVBQy9CLEtBQUssS0FBSyxJQUFJLEdBQUcsWUFBWTtBQUFBLFFBQy9CLEdBQ0EseUJBQ0Y7QUFBQSxNQUNGO0FBQUEsTUFFQSxzQkFBc0I7QUFBQSxNQUd0QixNQUFNLHdCQUF3QixNQUFNLEtBQUssaUJBQWlCLE9BQU8sQ0FBQztBQUFBLE1BQ2xFLFdBQVUsT0FBTywyQkFBMkI7QUFBQSxRQUMxQyxVQUFVO0FBQUEsUUFDVixPQUFPO0FBQUEsTUFDVCxDQUFDO0FBQUEsTUFFRCxXQUFVLE9BQU8scUJBQXFCO0FBQUEsUUFDcEMsT0FBTztBQUFBLFFBQ1AsZUFBZSxpQkFBaUI7QUFBQSxNQUNsQyxDQUFDO0FBQUEsTUFDRCxvQkFBb0I7QUFBQSxNQUdwQixJQUNFLGlCQUFpQixTQUFTLEtBQzFCLGFBQWEsS0FDYixXQUFVLFVBQVUsWUFDcEI7QUFBQSxRQUNBLFdBQVUsU0FBUyxXQUFXLGtCQUM1QixjQUNBLG9CQUNGO0FBQUEsTUFDRjtBQUFBO0FBQUEsSUFJRixNQUFNLHNCQUFzQixXQUFVLFNBQVM7QUFBQSxJQUMvQyxXQUFVLFNBQVMsY0FBYyxNQUFNO0FBQUEsTUFDckMsWUFBWTtBQUFBLE1BQ1osc0JBQXNCO0FBQUE7QUFBQSxJQUl4QixZQUFZLFlBQVcsTUFBTTtBQUFBLE1BRTNCLGlCQUFpQixRQUFRLENBQUMsWUFBWTtBQUFBLFFBQ3BDLGVBQWUsT0FBTztBQUFBLE9BQ3ZCO0FBQUEsTUFDRCxpQkFBaUIsTUFBTTtBQUFBLE1BR3ZCLFlBQVksU0FBUztBQUFBLE1BR3JCLHNCQUFzQixFQUFFLE9BQU8sSUFBSSxLQUFLLEdBQUc7QUFBQSxNQUMzQyxnQkFBZ0I7QUFBQSxNQUNoQixpQkFBaUI7QUFBQSxNQUdqQixVQUFVLFVBQVU7QUFBQSxNQUNwQixVQUFVLFdBQVc7QUFBQSxNQUNyQixVQUFVLFdBQVc7QUFBQSxLQUN0QjtBQUFBLElBRUQsT0FBTztBQUFBO0FBQUE7OztBQzU3QkosSUFBTSxhQUFhLENBQUMsU0FBdUIsQ0FBQyxNQUFNO0FBQUEsRUFDdkQsT0FBTyxDQUFnRCxlQUFvQjtBQUFBLElBQ3pFLFFBQVEsUUFBUSxVQUFVO0FBQUEsSUFHMUIsTUFBTSxZQUFZLElBQUk7QUFBQSxJQUd0QixNQUFNLE9BQU8sQ0FBQyxPQUFlLFNBQWU7QUFBQSxNQUsxQyxNQUFNLGlCQUFpQixVQUFVLElBQUksS0FBSztBQUFBLE1BQzFDLElBQUksZ0JBQWdCO0FBQUEsUUFDbEIsZUFBZSxRQUFRLENBQUMsYUFBYTtBQUFBLFVBQ25DLElBQUk7QUFBQSxZQUNGLFNBQVMsSUFBSTtBQUFBLFlBQ2IsT0FBTyxPQUFPO0FBQUEsWUFDZCxRQUFRLE1BQU0sa0NBQWtDLFVBQVUsS0FBSztBQUFBO0FBQUEsU0FFbEU7QUFBQSxNQUNIO0FBQUE7QUFBQSxJQUlGLE1BQU0sS0FBSyxDQUFDLE9BQWUsWUFBb0M7QUFBQSxNQUM3RCxJQUFJLENBQUMsVUFBVSxJQUFJLEtBQUssR0FBRztBQUFBLFFBQ3pCLFVBQVUsSUFBSSxPQUFPLElBQUksR0FBSztBQUFBLE1BQ2hDO0FBQUEsTUFFQSxVQUFVLElBQUksS0FBSyxFQUFHLElBQUksT0FBTztBQUFBLE1BT2pDLE9BQU8sTUFBTTtBQUFBLFFBQ1gsTUFBTSxpQkFBaUIsVUFBVSxJQUFJLEtBQUs7QUFBQSxRQUMxQyxJQUFJLGdCQUFnQjtBQUFBLFVBQ2xCLGVBQWUsT0FBTyxPQUFPO0FBQUEsVUFDN0IsSUFBSSxlQUFlLFNBQVMsR0FBRztBQUFBLFlBQzdCLFVBQVUsT0FBTyxLQUFLO0FBQUEsVUFDeEI7QUFBQSxRQUNGO0FBQUE7QUFBQTtBQUFBLElBS0osTUFBTSxPQUFPLENBQUMsT0FBZSxZQUFvQztBQUFBLE1BQy9ELE1BQU0saUJBQWlCLENBQUMsU0FBYztBQUFBLFFBQ3BDLFFBQVEsSUFBSTtBQUFBLFFBQ1osSUFBSSxPQUFPLGNBQWM7QUFBQTtBQUFBLE1BRTNCLE9BQU8sR0FBRyxPQUFPLGNBQWM7QUFBQTtBQUFBLElBSWpDLE1BQU0sTUFBTSxDQUFDLE9BQWUsWUFBc0I7QUFBQSxNQUNoRCxNQUFNLGlCQUFpQixVQUFVLElBQUksS0FBSztBQUFBLE1BQzFDLElBQUksZ0JBQWdCO0FBQUEsUUFDbEIsZUFBZSxPQUFPLE9BQU87QUFBQSxRQUM3QixJQUFJLGVBQWUsU0FBUyxHQUFHO0FBQUEsVUFDN0IsVUFBVSxPQUFPLEtBQUs7QUFBQSxRQUN4QjtBQUFBLE1BQ0Y7QUFBQTtBQUFBLElBSUYsTUFBTSxRQUFRLENBQUMsVUFBbUI7QUFBQSxNQUNoQyxJQUFJLE9BQU87QUFBQSxRQUNULFVBQVUsT0FBTyxLQUFLO0FBQUEsTUFDeEIsRUFBTztBQUFBLFFBQ0wsVUFBVSxNQUFNO0FBQUE7QUFBQTtBQUFBLElBS3BCLFdBQVUsT0FBTztBQUFBLElBQ2pCLFdBQVUsS0FBSztBQUFBLElBQ2YsV0FBVSxPQUFPO0FBQUEsSUFDakIsV0FBVSxNQUFNO0FBQUEsSUFHZixXQUFVLFNBQWlCLFNBQVM7QUFBQSxNQUNuQztBQUFBLE1BQ0E7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0E7QUFBQSxNQUNBLGtCQUFrQixDQUFDLFVBQW1CO0FBQUEsUUFDcEMsSUFBSSxPQUFPO0FBQUEsVUFDVCxPQUFPLFVBQVUsSUFBSSxLQUFLLEdBQUcsUUFBUTtBQUFBLFFBQ3ZDO0FBQUEsUUFDQSxJQUFJLFFBQVE7QUFBQSxRQUNaLFVBQVUsUUFBUSxDQUFDLFFBQVMsU0FBUyxJQUFJLElBQUs7QUFBQSxRQUM5QyxPQUFPO0FBQUE7QUFBQSxJQUVYO0FBQUEsSUFHQSxJQUFJLGFBQWEsY0FBYSxPQUFPLFdBQVUsWUFBWSxZQUFZO0FBQUEsTUFDckUsTUFBTSxrQkFBa0IsV0FBVTtBQUFBLE1BQ2xDLFdBQVUsVUFBVSxNQUFNO0FBQUEsUUFDeEIsTUFBTTtBQUFBLFFBQ04sa0JBQWtCO0FBQUE7QUFBQSxJQUV0QjtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUE7OztBWHRGSixJQUFNLGlCQUFpQixDQUFDLFNBQXlCLENBQUMsTUFBTTtBQUFBLEVBQzdELE9BQU8sQ0FBNEIsZUFBd0M7QUFBQSxJQUV6RSxJQUFJLGdCQUFnQjtBQUFBLElBS3BCLE1BQU0sUUFBdUI7QUFBQSxNQUMzQixnQkFBZ0I7QUFBQSxNQUNoQixZQUFZLFdBQVUsY0FBYztBQUFBLE1BQ3BDLFVBQVUsT0FBTyxTQUFTLFlBQVk7QUFBQSxNQUN0QyxlQUFlO0FBQUEsTUFDZixrQkFBa0I7QUFBQSxNQUNsQixjQUFjLEVBQUUsT0FBTyxHQUFHLEtBQUssRUFBRTtBQUFBLE1BQ2pDLGdCQUFnQjtBQUFBLE1BQ2hCLFVBQVU7QUFBQSxNQUNWLGlCQUFpQjtBQUFBLElBQ25CO0FBQUEsSUFHQSxNQUFNLGNBQWM7QUFBQSxNQUVsQixZQUFZLE1BQU07QUFBQSxRQUVoQixJQUFJLGVBQWU7QUFBQSxVQUNqQixPQUFPO0FBQUEsUUFDVDtBQUFBLFFBQ0EsZ0JBQWdCO0FBQUEsUUFTaEIsSUFBSSxXQUFVLFNBQVM7QUFBQSxVQUNyQixNQUFNLGdCQUNKLE9BQU8sV0FBVyxnQkFBZ0IsZUFDOUIsV0FBVSxRQUFRLGNBQ2xCLFdBQVUsUUFBUTtBQUFBLFFBRzFCO0FBQUEsUUFHQSxNQUFNLG1CQUFtQixNQUFNLGFBQWEsTUFBTTtBQUFBLFFBR2xELE1BQU0sZUFBZSxzQkFBc0IsTUFBTSxjQUFjO0FBQUE7QUFBQSxNQVNqRSxTQUFTLE1BQU07QUFBQSxNQUlmLGdCQUFnQixNQUFNO0FBQUEsTUFLdEIsZUFBZSxNQUFNO0FBQUEsTUFHckIscUJBQXFCLE1BQU07QUFBQSxRQUN6QixnQkFBZ0I7QUFBQTtBQUFBLE1BSWxCLGFBQWEsTUFBTSxDQUFDO0FBQUEsTUFHcEIsZUFBZSxDQUNiLE9BQ0EsY0FDRztBQUFBLE1BSUwsa0JBQWtCLENBQUMsYUFBcUI7QUFBQSxNQUl4QyxtQkFBbUIsTUFBTSxNQUFNO0FBQUEsTUFHL0IsaUJBQWlCLE1BQU0sTUFBTTtBQUFBLE1BRTdCLGlCQUFpQixPQUFxQjtBQUFBLFFBQ3BDLGVBQWUsTUFBTTtBQUFBLFFBQ3JCLGtCQUFrQixNQUFNO0FBQUEsUUFDeEIsY0FBYyxNQUFNO0FBQUEsUUFDcEIsdUJBQXVCLE1BQU07QUFBQSxNQUMvQjtBQUFBLE1BR0EsYUFBYSxNQUFNO0FBQUEsTUFLbkI7QUFBQSxJQUNGO0FBQUEsSUFHQSxNQUFNLHdCQUF3QixDQUFDLGNBQWlDO0FBQUEsTUFDOUQsTUFBTSxXQUFXLE1BQU07QUFBQSxNQUN2QixNQUFNLFFBQVEsS0FBSyxNQUFNLFlBQVksUUFBUTtBQUFBLE1BQzdDLE1BQU0sZUFBZSxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsUUFBUTtBQUFBLE1BQzdELE1BQU0sTUFBTSxLQUFLLElBQUksUUFBUSxjQUFjLE1BQU0sYUFBYSxDQUFDO0FBQUEsTUFFL0QsT0FBTyxFQUFFLE9BQU8sS0FBSyxJQUFJLEdBQUcsS0FBSyxHQUFHLEtBQUssS0FBSyxJQUFJLEdBQUcsR0FBRyxFQUFFO0FBQUE7QUFBQSxJQUk1RCxNQUFNLGdCQUFnQjtBQUFBLFNBQ2pCO0FBQUEsTUFDSCxVQUFVO0FBQUEsSUFDWjtBQUFBLElBR0EsTUFBTSxZQUFvQyxDQUFDO0FBQUEsSUFHM0MsVUFBVSxLQUNSLFdBQVc7QUFBQSxNQUNULE9BQU8sT0FBTztBQUFBLElBQ2hCLENBQUMsQ0FDSDtBQUFBLElBR0EsVUFBVSxLQUNSLFNBQVM7QUFBQSxNQUNQLFdBQVcsT0FBTztBQUFBLE1BQ2xCLGFBQWEsT0FBTyxXQUFXO0FBQUEsSUFDakMsQ0FBQyxDQUNIO0FBQUEsSUFHQSxVQUFVLEtBQ1IsWUFBWTtBQUFBLE1BQ1YsVUFBVSxPQUFPLFNBQVM7QUFBQSxNQUMxQixVQUFVLE9BQU8sU0FBUztBQUFBLE1BQzFCLGFBQWEsT0FBTyxXQUFXO0FBQUEsTUFDL0Isb0JBQW9CLE9BQU8sU0FBUztBQUFBLE1BQ3BDLG9CQUFxQixPQUFlO0FBQUEsSUFDdEMsQ0FBQyxDQUNIO0FBQUEsSUFHQSxVQUFVLEtBQ1IsY0FBYztBQUFBLE1BQ1osYUFBYSxPQUFPLFdBQVc7QUFBQSxNQUMvQixhQUFhLE9BQU8sV0FBVztBQUFBLE1BQy9CLFdBQVcsT0FBTyxXQUFXO0FBQUEsTUFDN0IsYUFBYSxPQUFPLFdBQVc7QUFBQSxJQUNqQyxDQUFDLENBQ0g7QUFBQSxJQUdBLFVBQVUsS0FDUixhQUFhO0FBQUEsTUFDWCxTQUFTO0FBQUEsTUFDVCxhQUFhLE9BQU8sV0FBVztBQUFBLE1BQy9CLGNBQWMsT0FBTyxXQUFXLFVBQVU7QUFBQSxNQUMxQyxhQUFhLE9BQU8sV0FBVyxVQUFVO0FBQUEsTUFDekMsYUFBYSxPQUFPLFdBQVcsVUFBVTtBQUFBLE1BQ3pDLHNCQUFzQixPQUFPLFdBQVcsVUFBVTtBQUFBLElBQ3BELENBQUMsQ0FDSDtBQUFBLElBR0EsSUFBSSxPQUFPLFdBQVcsWUFBWSxPQUFPO0FBQUEsTUFDdkMsVUFBVSxLQUNSLGNBQWM7QUFBQSxRQUNaLFNBQVM7QUFBQSxRQUNULFVBQVUsT0FBTyxXQUFXO0FBQUEsTUFDOUIsQ0FBQyxDQUNIO0FBQUEsSUFDRjtBQUFBLElBR0EsSUFBSSxPQUFPLFlBQVksU0FBUztBQUFBLE1BQzlCLFVBQVUsS0FDUixlQUFlO0FBQUEsUUFDYixZQUFZLE9BQU8sV0FBVztBQUFBLFFBQzlCLFdBQVcsT0FBTyxZQUFZO0FBQUEsUUFDOUIsVUFBVSxPQUFPLFlBQVk7QUFBQSxRQUs3QixXQUFXLE9BQU8sWUFBWTtBQUFBLFFBQzlCLHFCQUFxQixPQUFPLGFBQWE7QUFBQSxRQUN6Qyx1QkFBdUIsT0FBTyxhQUFhO0FBQUEsUUFDM0Msb0JBQW9CLE9BQU8sYUFBYSx1QkFBdUI7QUFBQSxRQUMvRCxvQkFBcUIsT0FBZTtBQUFBLFFBQ3BDLFVBQVcsT0FBZTtBQUFBLFFBQzFCLFVBQVcsT0FBZSxhQUFhO0FBQUEsUUFDdkMsaUJBQWtCLE9BQWU7QUFBQSxRQUNqQyxnQkFBZ0IsT0FBTyxPQUFPO0FBQUEsUUFDOUIsZ0JBQWdCLE9BQU8sT0FBTztBQUFBLE1BQ2hDLENBQUMsQ0FDSDtBQUFBLElBQ0Y7QUFBQSxJQUdBLElBQUksT0FBTyxZQUFZLFdBQVcsT0FBTyxjQUFjLFlBQVksT0FBTztBQUFBLE1BQ3hFLFVBQVUsS0FDUixpQkFBaUI7QUFBQSxRQUNmLFNBQVM7QUFBQSxRQUNULGtCQUFrQixPQUFPLGNBQWMsb0JBQW9CO0FBQUEsUUFDM0QsZUFBZSxPQUFPLGNBQWM7QUFBQSxNQUN0QyxDQUFDLENBQ0g7QUFBQSxJQUNGO0FBQUEsSUFHQSxVQUFVLEtBQ1IsY0FBYztBQUFBLE1BQ1osVUFBVSxPQUFPO0FBQUEsTUFDakIsVUFBVSxPQUFPLFNBQVM7QUFBQSxNQUMxQixrQkFBa0IsT0FBTyxXQUFXO0FBQUEsSUFDdEMsQ0FBQyxDQUNIO0FBQUEsSUFHQSxNQUFNLFVBQVUsa0JBQUssR0FBRyxTQUFTO0FBQUEsSUFHakMsTUFBTSxXQUFXLFFBQVEsYUFBYTtBQUFBLElBR3RDLElBQUksU0FBUyxTQUFTO0FBQUEsTUFDcEIsU0FBUyxTQUFTLFdBQVc7QUFBQSxJQUMvQjtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUE7O0FZalJVLElBQXJCO0FBQ3dDLElBQXhDO0FBQzBDLElBQTFDOzs7QUNETyxJQUFNLGVBQWUsQ0FDMUIsV0FDRztBQUFBLEVBQ0gsT0FBTyxDQUFDLGVBQW1CO0FBQUEsSUFFekIsSUFBSSxPQUFPLE9BQU87QUFBQSxNQUNoQixXQUFVLFFBQVEsT0FBTztBQUFBLE1BQ3pCLFdBQVUsYUFBYSxPQUFPLE1BQU07QUFBQSxJQUN0QztBQUFBLElBR0EsSUFBSSxPQUFPLFVBQVU7QUFBQSxNQUNuQixXQUFVLFdBQVcsT0FBTztBQUFBLElBQzlCO0FBQUEsSUFHQSxNQUFNLGlCQUFpQjtBQUFBLFNBQ2xCO0FBQUEsTUFDSCxXQUFXO0FBQUEsSUFDYjtBQUFBLElBR0EsTUFBTSxtQkFBbUIsZUFBZSxjQUFxQixFQUFFLFVBQVM7QUFBQSxJQUd4RSxJQUFJLE9BQU8sVUFBVSxPQUFPLFdBQVc7QUFBQSxNQUNyQyxNQUFNLFlBQVksT0FBTyxVQUFVLE9BQU87QUFBQSxNQUMxQyxNQUFNLFVBQ0osT0FBTyxjQUFjLFdBQ2pCLFNBQVMsY0FBYyxTQUFTLElBQ2hDO0FBQUEsTUFFTixJQUFJLFdBQVcsaUJBQWlCLFNBQVM7QUFBQSxRQUN2QyxRQUFRLFlBQVksaUJBQWlCLE9BQU87QUFBQSxRQUc1QyxJQUFJLGlCQUFpQixZQUFZLGlCQUFpQixTQUFTLFlBQVk7QUFBQSxVQUVyRSxpQkFBaUIsU0FBUyxXQUFXO0FBQUEsUUFDdkM7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBRUEsT0FBTztBQUFBO0FBQUE7OztBQzlDSixJQUFNLFVBQVUsQ0FDckIsV0FDRztBQUFBLEVBQ0gsT0FBTyxDQUFDLGVBQW1CO0FBQUEsSUFFekIsV0FBVyxNQUFNO0FBQUEsTUFDZixJQUFJLFdBQVUsWUFBWSxXQUFVLFNBQVMsWUFBWTtBQUFBLFFBQ3ZELFdBQVUsU0FBUyxXQUFXO0FBQUEsTUFDaEM7QUFBQSxPQUNDLENBQUM7QUFBQSxJQUdKLElBQUksWUFBWTtBQUFBLElBQ2hCLElBQUksY0FBYyxJQUFJO0FBQUEsSUFJdEIsTUFBTSxrQkFBa0IsSUFBSTtBQUFBLElBRzVCLFdBQVUsS0FBSywyQkFBMkIsTUFBTTtBQUFBLE1BQzlDLFlBQVk7QUFBQSxLQUNiO0FBQUEsSUFDRCxXQUFVLEtBQUssMkJBQTJCLE1BQU07QUFBQSxNQUM5QyxZQUFZO0FBQUEsS0FDYjtBQUFBLElBRUQsT0FBTztBQUFBLFNBQ0Y7QUFBQSxXQVFHLE9BQU0sR0FBa0I7QUFBQSxRQUU1QixJQUFJLFdBQVUsVUFBVSxZQUFZLE9BQU87QUFBQSxVQUN6QyxXQUFVLFNBQVMsV0FBVyxNQUFNO0FBQUEsUUFDdEM7QUFBQSxRQUdBLElBQUksV0FBVSxVQUFVLFVBQVU7QUFBQSxVQUNoQyxXQUFVLFNBQVMsU0FBUyxDQUFDO0FBQUEsUUFDL0I7QUFBQSxRQUdBLE1BQU0saUJBQWlCLFdBQVUsU0FBUyxjQUN4QyxzQkFDRjtBQUFBLFFBQ0EsSUFBSSxnQkFBZ0I7QUFBQSxVQUNsQixlQUFlLFlBQVk7QUFBQSxRQUM3QjtBQUFBLFFBR0EsSUFBSSxXQUFVLFVBQVUscUJBQXFCO0FBQUEsVUFDM0MsV0FBVSxTQUFTLG9CQUFvQjtBQUFBLFFBQ3pDO0FBQUEsUUFHQSxJQUFJLFdBQVUsVUFBVSxZQUFZO0FBQUEsVUFDbEMsV0FBVSxTQUFTLFdBQVc7QUFBQSxRQUNoQztBQUFBLFFBRUEsV0FBVSxPQUFPLFVBQVU7QUFBQTtBQUFBLE1BTTdCLEtBQUssR0FBUztBQUFBLFFBRVosSUFBSSxXQUFVLFVBQVUsWUFBWSxPQUFPO0FBQUEsVUFDekMsV0FBVSxTQUFTLFdBQVcsTUFBTTtBQUFBLFFBQ3RDO0FBQUEsUUFHQSxJQUFJLFdBQVUsVUFBVSxVQUFVO0FBQUEsVUFDaEMsV0FBVSxTQUFTLFNBQVMsQ0FBQztBQUFBLFFBQy9CO0FBQUEsUUFHQSxNQUFNLGlCQUFpQixXQUFVLFNBQVMsY0FDeEMsc0JBQ0Y7QUFBQSxRQUNBLElBQUksZ0JBQWdCO0FBQUEsVUFDbEIsZUFBZSxZQUFZO0FBQUEsUUFDN0I7QUFBQSxRQUVBLFdBQVUsT0FBTyxTQUFTO0FBQUE7QUFBQSxNQUc1QixRQUFRLENBQUMsT0FBWTtBQUFBLFFBQ25CLElBQUksV0FBVSxVQUFVLFlBQVk7QUFBQSxVQUNsQyxXQUFVLFNBQVMsV0FBVyxTQUFTLEtBQUs7QUFBQSxRQUM5QyxFQUFPO0FBQUEsVUFDTCxXQUFVLFFBQVE7QUFBQSxVQUNsQixXQUFVLGFBQWEsTUFBTTtBQUFBO0FBQUEsUUFFL0IsV0FBVSxPQUFPLGFBQWEsRUFBRSxPQUFPLE9BQU8sTUFBTSxPQUFPLENBQUM7QUFBQTtBQUFBLE1BUzlELFFBQVEsQ0FBQyxVQUFlLFdBQTRCLFNBQWU7QUFBQSxRQUNqRSxJQUFJLENBQUMsWUFBWSxTQUFTLFdBQVcsR0FBRztBQUFBLFVBQ3RDLFFBQVEsS0FBSyxxQ0FBcUM7QUFBQSxVQUNsRDtBQUFBLFFBQ0Y7QUFBQSxRQUVBLE1BQU0sYUFBYyxXQUFrQjtBQUFBLFFBQ3RDLE1BQU0sZUFBZSxLQUFLLFNBQVM7QUFBQSxRQUduQyxJQUFJLFlBQVksT0FBTztBQUFBLFVBQ3JCLElBQUksYUFBYSxTQUFTO0FBQUEsWUFFeEIsV0FBVyxNQUFNLFFBQVEsR0FBRyxRQUFRO0FBQUEsVUFDdEMsRUFBTztBQUFBLFlBRUwsV0FBVyxNQUFNLEtBQUssR0FBRyxRQUFRO0FBQUE7QUFBQSxRQUVyQztBQUFBLFFBSUEsV0FBVSxPQUFPLHFCQUFxQjtBQUFBLFVBQ3BDLE9BQU87QUFBQSxVQUNQO0FBQUEsVUFDQSxlQUFlLGFBQWE7QUFBQSxRQUM5QixDQUFDO0FBQUEsUUFHRCxNQUFNLGFBQWEsU0FBUztBQUFBLFFBQzVCLElBQUksWUFBWSxpQkFBaUIsWUFBWSxlQUFlO0FBQUEsVUFDMUQsTUFBTSxlQUFlLFdBQVcsY0FBYztBQUFBLFVBQzlDLFdBQVcsY0FBYyxlQUFlLFVBQVU7QUFBQSxRQUNwRCxFQUFPLFNBQUksV0FBVSxVQUFVLFlBQVksZUFBZTtBQUFBLFVBQ3hELE1BQU0sZUFBZSxXQUFVLFNBQVMsV0FBVyxjQUFjO0FBQUEsVUFDakUsV0FBVSxTQUFTLFdBQVcsY0FDNUIsZUFBZSxVQUNqQjtBQUFBLFFBQ0YsRUFBTztBQUFBLFVBQ0wsSUFBSSxXQUFVLGVBQWUsV0FBVztBQUFBLFlBQ3RDLFdBQVUsYUFBYSxXQUFVLGFBQWE7QUFBQSxVQUNoRDtBQUFBO0FBQUEsUUFJRixXQUFVLE9BQU8sZUFBZTtBQUFBLFVBQzlCLE9BQU87QUFBQSxVQUNQO0FBQUEsVUFDQSxPQUFPLEtBQUssYUFBYTtBQUFBLFFBQzNCLENBQUM7QUFBQTtBQUFBLE1BU0gsT0FBTyxDQUFDLE1BQVMsV0FBNEIsU0FBZTtBQUFBLFFBQzFELElBQUksQ0FBQyxNQUFNO0FBQUEsVUFDVCxRQUFRLEtBQUssbUNBQW1DO0FBQUEsVUFDaEQ7QUFBQSxRQUNGO0FBQUEsUUFDQSxLQUFLLFNBQVMsQ0FBQyxJQUFJLEdBQUcsUUFBUTtBQUFBO0FBQUEsTUFHaEMsUUFBUSxHQUFRO0FBQUEsUUFFZCxJQUFLLFdBQWtCLFlBQVksVUFBVTtBQUFBLFVBQzNDLE9BQVEsV0FBa0IsV0FBVyxTQUFTO0FBQUEsUUFDaEQ7QUFBQSxRQUNBLE9BQU8sV0FBVSxTQUFTLENBQUM7QUFBQTtBQUFBLE1BRzdCLGVBQWUsR0FBUTtBQUFBLFFBQ3JCLE1BQU0sUUFBUSxXQUFVLFVBQVUsZ0JBQWdCLEtBQUs7QUFBQSxVQUNyRCxPQUFPO0FBQUEsVUFDUCxLQUFLO0FBQUEsUUFDUDtBQUFBLFFBQ0EsTUFBTSxRQUFRLEtBQUssU0FBUztBQUFBLFFBQzVCLE9BQU8sTUFBTSxNQUFNLE1BQU0sT0FBTyxNQUFNLEdBQUc7QUFBQTtBQUFBLE1BRzNDLFlBQVksR0FBVztBQUFBLFFBQ3JCLElBQUksV0FBVSxVQUFVLFlBQVk7QUFBQSxVQUNsQyxPQUFPLFdBQVUsU0FBUyxXQUFXLGNBQWM7QUFBQSxRQUNyRDtBQUFBLFFBQ0EsT0FBTyxXQUFVLGNBQWMsV0FBVSxPQUFPLFVBQVU7QUFBQTtBQUFBLE1BUTVELE9BQU8sQ0FBQyxPQUE4QjtBQUFBLFFBQ3BDLElBQUssV0FBa0IsWUFBWSxTQUFTO0FBQUEsVUFDMUMsT0FBUSxXQUFrQixXQUFXLFFBQVEsS0FBSztBQUFBLFFBQ3BEO0FBQUEsUUFDQSxNQUFNLFFBQVEsS0FBSyxTQUFTO0FBQUEsUUFDNUIsT0FBTyxNQUFNO0FBQUE7QUFBQSxNQVFmLFVBQVUsQ0FBQyxPQUFlLE1BQWU7QUFBQSxRQUN2QyxNQUFNLFFBQVEsS0FBSyxTQUFTO0FBQUEsUUFFNUIsSUFBSSxRQUFRLEtBQUssU0FBUyxNQUFNLFFBQVE7QUFBQSxVQUN0QyxRQUFRLEtBQUssNkJBQTZCLHFCQUFxQjtBQUFBLFVBQy9EO0FBQUEsUUFDRjtBQUFBLFFBRUEsTUFBTSxlQUFlLE1BQU07QUFBQSxRQUczQixJQUFLLFdBQWtCLFlBQVksT0FBTztBQUFBLFVBQ3ZDLFdBQWtCLFdBQVcsTUFBTSxTQUFTO0FBQUEsUUFDL0M7QUFBQSxRQUdBLFdBQVUsT0FBTyx1QkFBdUI7QUFBQSxVQUN0QztBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsUUFDRixDQUFDO0FBQUE7QUFBQSxNQVlILGNBQWMsQ0FDWixJQUNBLE1BQ0EsVUFLSSxDQUFDLEdBQ0k7QUFBQSxRQUNULFFBQVEsVUFBVSxVQUFVO0FBQUEsUUFDNUIsTUFBTSxRQUFRLEtBQUssU0FBUztBQUFBLFFBSTVCLE1BQU0sUUFBUSxNQUFNLFVBQVUsQ0FBQyxTQUFjO0FBQUEsVUFDM0MsSUFBSSxDQUFDO0FBQUEsWUFBTSxPQUFPO0FBQUEsVUFFbEIsTUFBTSxhQUFhLENBQUMsS0FBSyxJQUFJLEtBQUssS0FBSyxLQUFLLE9BQU8sRUFBRSxPQUNuRCxDQUFDLE1BQU0sTUFBTSxhQUFhLE1BQU0sSUFDbEM7QUFBQSxVQUNBLE9BQU8sV0FBVyxLQUNoQixDQUFDLFdBQVcsV0FBVyxNQUFNLE9BQU8sTUFBTSxNQUFNLE9BQU8sRUFBRSxDQUMzRDtBQUFBLFNBQ0Q7QUFBQSxRQUVELElBQUksVUFBVSxJQUFJO0FBQUEsVUFDaEIsUUFBUSxLQUFLLHdDQUF3QyxjQUFjO0FBQUEsVUFDbkUsT0FBTztBQUFBLFFBQ1Q7QUFBQSxRQUVBLE1BQU0sZUFBZSxNQUFNO0FBQUEsUUFHM0IsSUFBSTtBQUFBLFFBQ0osSUFBSSxTQUFTO0FBQUEsVUFDWCxjQUFjLEtBQUssTUFBTSxJQUFJLGFBQWEsTUFBTSxHQUFHO0FBQUEsUUFDckQsRUFBTztBQUFBLFVBR0wsY0FBYyxLQUFLLGFBQWE7QUFBQSxVQUNoQyxZQUFZLEtBQUssVUFBVSxPQUFPLFFBQVEsSUFBSSxHQUFHO0FBQUEsWUFDL0MsSUFBSSxVQUFVLFdBQVc7QUFBQSxjQUN0QixZQUFvQixPQUFPO0FBQUEsWUFDOUI7QUFBQSxVQUNGO0FBQUE7QUFBQSxRQUlGLElBQUssV0FBa0IsWUFBWSxPQUFPO0FBQUEsVUFDdkMsV0FBa0IsV0FBVyxNQUFNLFNBQVM7QUFBQSxRQUMvQztBQUFBLFFBR0EsV0FBVSxPQUFPLHVCQUF1QjtBQUFBLFVBQ3RDO0FBQUEsVUFDQSxNQUFNO0FBQUEsVUFDTjtBQUFBLFFBQ0YsQ0FBQztBQUFBLFFBRUQsT0FBTztBQUFBO0FBQUEsTUFTVCxVQUFVLENBQUMsT0FBd0I7QUFBQSxRQUNqQyxNQUFNLFFBQVEsS0FBSyxTQUFTO0FBQUEsUUFDNUIsTUFBTSxhQUFjLFdBQWtCO0FBQUEsUUFFdEMsSUFBSSxRQUFRLEtBQUssU0FBUyxNQUFNLFFBQVE7QUFBQSxVQUN0QyxRQUFRLEtBQUssNkJBQTZCLHFCQUFxQjtBQUFBLFVBQy9ELE9BQU87QUFBQSxRQUNUO0FBQUEsUUFFQSxNQUFNLGNBQWMsTUFBTTtBQUFBLFFBRzFCLElBQUssV0FBa0IsWUFBWSxPQUFPO0FBQUEsVUFDdkMsV0FBa0IsV0FBVyxNQUFNLE9BQU8sT0FBTyxDQUFDO0FBQUEsUUFDckQ7QUFBQSxRQUlBLFdBQVUsT0FBTyx1QkFBdUI7QUFBQSxVQUN0QztBQUFBLFVBQ0EsTUFBTTtBQUFBLFFBQ1IsQ0FBQztBQUFBLFFBSUQsSUFBSSxZQUFZLGlCQUFpQixZQUFZLGVBQWU7QUFBQSxVQUMxRCxNQUFNLGVBQWUsV0FBVyxjQUFjO0FBQUEsVUFDOUMsV0FBVyxjQUFjLEtBQUssSUFBSSxHQUFHLGVBQWUsQ0FBQyxDQUFDO0FBQUEsUUFDeEQsRUFBTyxTQUFJLFdBQVUsVUFBVSxZQUFZLGVBQWU7QUFBQSxVQUV4RCxNQUFNLGVBQWUsV0FBVSxTQUFTLFdBQVcsY0FBYztBQUFBLFVBQ2pFLFdBQVUsU0FBUyxXQUFXLGNBQzVCLEtBQUssSUFBSSxHQUFHLGVBQWUsQ0FBQyxDQUM5QjtBQUFBLFFBQ0YsRUFBTztBQUFBLFVBRUwsSUFBSSxXQUFVLGVBQWUsV0FBVztBQUFBLFlBQ3RDLFdBQVUsYUFBYSxLQUFLLElBQUksR0FBRyxXQUFVLGFBQWEsQ0FBQztBQUFBLFVBQzdEO0FBQUE7QUFBQSxRQUdGLE9BQU87QUFBQTtBQUFBLE1BWVQsY0FBYyxDQUNaLElBQ0EsVUFBNkIsQ0FBQyxHQUNyQjtBQUFBLFFBQ1QsUUFBUSxlQUFlLE1BQU0saUJBQWlCLFNBQVM7QUFBQSxRQUV2RCxJQUFJLE9BQU8sYUFBYSxPQUFPLE1BQU07QUFBQSxVQUNuQyxRQUFRLEtBQUssb0NBQW9DO0FBQUEsVUFDakQsT0FBTztBQUFBLFFBQ1Q7QUFBQSxRQUdBLElBQUksY0FBYztBQUFBLFVBQ2hCLGdCQUFnQixJQUFJLEVBQUU7QUFBQSxVQUd0QixXQUFXLE1BQU07QUFBQSxZQUNmLGdCQUFnQixPQUFPLEVBQUU7QUFBQSxhQUN4QixjQUFjO0FBQUEsUUFDbkI7QUFBQSxRQUVBLE1BQU0sUUFBUSxLQUFLLFNBQVM7QUFBQSxRQUk1QixNQUFNLFFBQVEsTUFBTSxVQUFVLENBQUMsU0FBYztBQUFBLFVBQzNDLElBQUksQ0FBQztBQUFBLFlBQU0sT0FBTztBQUFBLFVBRWxCLE1BQU0sYUFBYSxDQUFDLEtBQUssSUFBSSxLQUFLLEtBQUssS0FBSyxPQUFPLEVBQUUsT0FDbkQsQ0FBQyxNQUFNLE1BQU0sYUFBYSxNQUFNLElBQ2xDO0FBQUEsVUFDQSxPQUFPLFdBQVcsS0FDaEIsQ0FBQyxXQUFXLFdBQVcsTUFBTSxPQUFPLE1BQU0sTUFBTSxPQUFPLEVBQUUsQ0FDM0Q7QUFBQSxTQUNEO0FBQUEsUUFFRCxJQUFJLFVBQVUsSUFBSTtBQUFBLFVBQ2hCLE9BQU87QUFBQSxRQUNUO0FBQUEsUUFFQSxPQUFPLEtBQUssV0FBVyxLQUFLO0FBQUE7QUFBQSxNQVE5QixnQkFBZ0IsQ0FBQyxJQUE4QjtBQUFBLFFBQzdDLE9BQU8sZ0JBQWdCLElBQUksRUFBRTtBQUFBO0FBQUEsTUFPL0Isa0JBQWtCLEdBQXlCO0FBQUEsUUFDekMsT0FBTyxJQUFJLElBQUksZUFBZTtBQUFBO0FBQUEsTUFPaEMsbUJBQW1CLENBQUMsSUFBMkI7QUFBQSxRQUM3QyxnQkFBZ0IsT0FBTyxFQUFFO0FBQUE7QUFBQSxNQU0zQix1QkFBdUIsR0FBUztBQUFBLFFBQzlCLGdCQUFnQixNQUFNO0FBQUE7QUFBQSxNQVN4QixxQkFBd0QsQ0FDdEQsT0FDSztBQUFBLFFBQ0wsSUFBSSxnQkFBZ0IsU0FBUztBQUFBLFVBQUcsT0FBTztBQUFBLFFBRXZDLE9BQU8sTUFBTSxPQUFPLENBQUMsU0FBUztBQUFBLFVBQzVCLE1BQU0sS0FBSyxLQUFLLE9BQU8sS0FBSztBQUFBLFVBQzVCLE9BQU8sQ0FBQyxnQkFBZ0IsSUFBSSxFQUFFO0FBQUEsU0FDL0I7QUFBQTtBQUFBLFdBSUcsVUFBUyxDQUNiLE1BQ0EsT0FDQSxXQUFtQixRQUNuQixXQUNBO0FBQUEsUUFDQSxZQUFZO0FBQUEsUUFFWixJQUFJLFdBQVUsVUFBVSxZQUFZO0FBQUEsVUFDbEMsTUFBTSxTQUFTLGFBQWEsVUFBVSxPQUFPLEtBQUssUUFBUTtBQUFBLFVBQzFELElBQUk7QUFBQSxZQUNGLE1BQU0sV0FBVSxTQUFTLFdBQVcsVUFBVSxRQUFRLEtBQUs7QUFBQSxZQUMzRCxXQUFVLE9BQU8sUUFBUSxFQUFFLE1BQU0sT0FBTyxTQUFTLENBQUM7QUFBQSxZQUdsRCxJQUFJLFdBQVc7QUFBQSxjQUNiLE1BQU0sUUFBUTtBQUFBLGNBQ2QsS0FBSyxjQUFjLE9BQU8sU0FBUztBQUFBLFlBQ3JDO0FBQUEsWUFDQSxPQUFPLE9BQU87QUFBQSxZQUNkLFdBQVUsT0FBTyxTQUFTLEVBQUUsTUFBTSxDQUFDO0FBQUEsWUFDbkMsTUFBTTtBQUFBLG9CQUNOO0FBQUEsWUFDQSxZQUFZO0FBQUE7QUFBQSxRQUVoQjtBQUFBO0FBQUEsTUFJRixVQUFVLGNBQWUsR0FBRztBQUFBLFFBQzFCLFFBQVEsSUFBSSxvQkFBb0I7QUFBQSxRQUVoQyxJQUFJLFdBQVUsVUFBVSxZQUFZO0FBQUEsVUFDbEMsTUFBTSxhQUFhLFdBQVUsU0FBUyxXQUFXLGNBQWM7QUFBQSxVQUMvRCxNQUFNLGVBQWUsV0FBVSxTQUFTLFdBQVcsZ0JBQWdCO0FBQUEsVUFHbkUsSUFBSSxhQUFhO0FBQUEsVUFDakIsV0FBVyxXQUFXLGNBQWM7QUFBQSxZQUNsQyxNQUFNLFlBQVksVUFBVSxNQUFNLE9BQU8sWUFBWSxTQUFTO0FBQUEsWUFDOUQsSUFBSSxXQUFXLFlBQVk7QUFBQSxjQUN6QixhQUFhO0FBQUEsWUFDZjtBQUFBLFVBQ0Y7QUFBQSxVQUVBLElBQUksYUFBYSxZQUFZO0FBQUEsWUFDM0IsTUFBTSxXQUFVLFNBQVMsV0FBVyxVQUNsQyxZQUNBLE9BQU8sWUFBWSxTQUFTLEVBQzlCO0FBQUEsVUFDRjtBQUFBLFFBQ0Y7QUFBQSxRQUVBLE9BQU8sUUFBUSxRQUFRO0FBQUE7QUFBQSxNQUd6QixTQUFTLEdBQVk7QUFBQSxRQUNuQixPQUFPO0FBQUE7QUFBQSxNQUdULE9BQU8sR0FBWTtBQUFBLFFBQ2pCLElBQUksV0FBVSxVQUFVLFlBQVk7QUFBQSxVQUNsQyxNQUFNLFFBQVEsV0FBVSxTQUFTLFdBQVcsY0FBYztBQUFBLFVBQzFELE1BQU0sUUFBUSxXQUFVLFNBQVMsV0FBVyxTQUFTO0FBQUEsVUFDckQsT0FBTyxNQUFNLFNBQVM7QUFBQSxRQUN4QjtBQUFBLFFBQ0EsT0FBTztBQUFBO0FBQUEsTUFLVCxjQUFjLEdBQXdCO0FBQUEsUUFDcEMsSUFBSSxPQUFPLFdBQVUsdUJBQXVCLFlBQVk7QUFBQSxVQUV0RCxNQUFNLFFBQVEsS0FBSyxTQUFTO0FBQUEsVUFDNUIsTUFBTSxVQUFVLFdBQVUsbUJBQW1CO0FBQUEsVUFDN0MsT0FBTyxRQUFRLElBQUksQ0FBQyxRQUFpQixNQUFNLE1BQWMsTUFBTSxHQUFHO0FBQUEsUUFDcEU7QUFBQSxRQUVBLE9BQU8sTUFBTSxLQUFLLFdBQVc7QUFBQTtBQUFBLE1BRy9CLFVBQVUsQ0FBQyxJQUFxQjtBQUFBLFFBQzlCLElBQUksT0FBTyxXQUFVLGdCQUFnQixZQUFZO0FBQUEsVUFFL0MsTUFBTSxRQUFRLEtBQUssU0FBUztBQUFBLFVBQzVCLE1BQU0sUUFBUSxNQUFNLFVBQVUsQ0FBQyxTQUFjLEtBQUssT0FBTyxFQUFFO0FBQUEsVUFDM0QsSUFBSSxTQUFTLEdBQUc7QUFBQSxZQUNkLFdBQVUsWUFBWSxDQUFDLEtBQUssQ0FBQztBQUFBLFVBQy9CO0FBQUEsUUFDRixFQUFPO0FBQUEsVUFFTCxZQUFZLElBQUksRUFBRTtBQUFBLFVBQ2xCLFdBQVUsT0FBTyxvQkFBb0I7QUFBQSxZQUNuQyxVQUFVLEtBQUssZUFBZTtBQUFBLFVBQ2hDLENBQUM7QUFBQTtBQUFBO0FBQUEsTUFJTCxZQUFZLENBQUMsSUFBcUI7QUFBQSxRQUNoQyxJQUFJLE9BQU8sV0FBVSxrQkFBa0IsWUFBWTtBQUFBLFVBRWpELE1BQU0sUUFBUSxLQUFLLFNBQVM7QUFBQSxVQUM1QixNQUFNLFFBQVEsTUFBTSxVQUFVLENBQUMsU0FBYyxLQUFLLE9BQU8sRUFBRTtBQUFBLFVBQzNELElBQUksU0FBUyxHQUFHO0FBQUEsWUFDZCxXQUFVLGNBQWMsQ0FBQyxLQUFLLENBQUM7QUFBQSxVQUNqQztBQUFBLFFBQ0YsRUFBTztBQUFBLFVBRUwsWUFBWSxPQUFPLEVBQUU7QUFBQSxVQUNyQixXQUFVLE9BQU8sb0JBQW9CO0FBQUEsWUFDbkMsVUFBVSxLQUFLLGVBQWU7QUFBQSxVQUNoQyxDQUFDO0FBQUE7QUFBQTtBQUFBLE1BSUwsY0FBYyxHQUFHO0FBQUEsUUFDZixJQUFJLE9BQU8sV0FBVSxtQkFBbUIsWUFBWTtBQUFBLFVBRWxELFdBQVUsZUFBZTtBQUFBLFFBQzNCLEVBQU87QUFBQSxVQUVMLFlBQVksTUFBTTtBQUFBLFVBQ2xCLFdBQVUsT0FBTyxvQkFBb0IsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDO0FBQUE7QUFBQTtBQUFBLE1BS3pELGVBQWUsQ0FDYixPQUNBLFlBQXdDLFNBQ3hDLFlBQ0c7QUFBQSxRQUNILElBQUksV0FBVSxVQUFVO0FBQUEsVUFDdEIsV0FBVSxTQUFTLGNBQWMsT0FBTyxTQUFTO0FBQUEsUUFDbkQ7QUFBQSxRQUNBLE9BQU8sUUFBUSxRQUFRO0FBQUE7QUFBQSxNQU96Qix3QkFBd0IsY0FBZSxDQUNyQyxPQUNBLFVBQ0EsWUFBd0MsU0FDeEM7QUFBQSxRQUNBLElBQUksV0FBVSxVQUFVO0FBQUEsVUFDdEIsV0FBVSxTQUFTLGNBQWMsT0FBTyxTQUFTO0FBQUEsUUFDbkQ7QUFBQSxRQUdBLE1BQU0sZ0JBQWdCLE1BQU07QUFBQSxVQUMxQixXQUFVLE1BQU0seUJBQXlCLGFBQWE7QUFBQSxVQUN0RCxzQkFBc0IsTUFBTTtBQUFBLFlBQzFCLElBQUksV0FBVSxZQUFZO0FBQUEsY0FDeEIsV0FBVSxXQUFXLFFBQVE7QUFBQSxZQUMvQjtBQUFBLFdBQ0Q7QUFBQTtBQUFBLFFBR0gsV0FBVSxLQUFLLHlCQUF5QixhQUFhO0FBQUEsUUFHckQsV0FBVyxNQUFNO0FBQUEsVUFDZixXQUFVLE1BQU0seUJBQXlCLGFBQWE7QUFBQSxVQUN0RCxJQUFJLFdBQVUsWUFBWTtBQUFBLFlBQ3hCLFdBQVUsV0FBVyxRQUFRO0FBQUEsVUFDL0I7QUFBQSxXQUNDLEdBQUc7QUFBQSxRQUVOLE9BQU8sUUFBUSxRQUFRO0FBQUE7QUFBQSxNQUd6QixjQUFjLGNBQWUsQ0FDM0IsUUFDQSxZQUF3QyxTQUN4QyxTQUNBO0FBQUEsUUFDQSxNQUFNLFFBQVEsS0FBSyxTQUFTO0FBQUEsUUFDNUIsTUFBTSxRQUFRLE1BQU0sVUFDbEIsQ0FBQyxTQUFjLE9BQU8sS0FBSyxFQUFFLE1BQU0sT0FBTyxNQUFNLENBQ2xEO0FBQUEsUUFFQSxJQUFJLFNBQVMsR0FBRztBQUFBLFVBQ2QsT0FBTyxLQUFLLGNBQWMsT0FBTyxXQUFXLE9BQU87QUFBQSxRQUNyRDtBQUFBLFFBRUEsUUFBUSxLQUFLLFFBQVEsa0JBQWtCO0FBQUEsUUFDdkMsT0FBTyxRQUFRLFFBQVE7QUFBQTtBQUFBLE1BR3pCLGFBQWEsUUFBUyxHQUFHO0FBQUEsUUFDdkIsT0FBTyxLQUFLLGNBQWMsR0FBRyxPQUFPO0FBQUE7QUFBQSxNQUd0QyxnQkFBZ0IsUUFBUyxHQUFHO0FBQUEsUUFDMUIsTUFBTSxhQUFhLEtBQUssYUFBYTtBQUFBLFFBQ3JDLElBQUksYUFBYSxHQUFHO0FBQUEsVUFDbEIsT0FBTyxLQUFLLGNBQWMsYUFBYSxHQUFHLEtBQUs7QUFBQSxRQUNqRDtBQUFBLFFBQ0EsT0FBTyxRQUFRLFFBQVE7QUFBQTtBQUFBLE1BR3pCLGNBQWMsY0FBZSxDQUMzQixTQUNBLFlBQXdDLFNBQ3hDLFNBQ0E7QUFBQSxRQUlBLE1BQU0sUUFBUSxPQUFPLFlBQVksU0FBUztBQUFBLFFBRzFDLElBQUksT0FBTyxZQUFZLGFBQWEsVUFBVTtBQUFBLFVBRTVDLE1BQU0sYUFBYyxXQUFVLFVBQWtCO0FBQUEsVUFDaEQsSUFBSSxZQUFZO0FBQUEsWUFDZCxNQUFNLGVBQWUsV0FBVyxnQkFBZ0I7QUFBQSxZQUNoRCxNQUFNLG9CQUFvQixhQUFhO0FBQUEsWUFFdkMsSUFBSSxVQUFVLG9CQUFvQixHQUFHO0FBQUEsY0FDbkMsUUFBUSxLQUNOLCtCQUErQiw2QkFDN0IsbUNBQ0Usb0JBQW9CLFFBQ2YsU0FDWDtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUFBLFFBR0EsSUFBSyxXQUFVLFVBQWtCLGNBQWM7QUFBQSxVQUM1QyxXQUFVLFNBQWlCLGFBQWEsU0FBUyxPQUFPLFNBQVM7QUFBQSxRQUNwRSxFQUFPO0FBQUEsVUFFTCxNQUFNLGVBQWUsVUFBVSxLQUFLO0FBQUEsVUFDcEMsTUFBTSxLQUFLLGNBQWMsYUFBYSxTQUFTO0FBQUE7QUFBQTtBQUFBLE1BSW5ELG1CQUFtQixNQUFNO0FBQUEsUUFDdkIsT0FBTyxXQUFVLFVBQVUsa0JBQWtCLEtBQUs7QUFBQTtBQUFBLE1BR3BELGtCQUFrQixNQUFNO0FBQUEsUUFDdEIsTUFBTSxhQUFjLFdBQVUsVUFBa0I7QUFBQSxRQUNoRCxPQUFPLFlBQVksbUJBQW1CLEtBQUs7QUFBQTtBQUFBLE1BRzdDLGtCQUFrQixDQUFDLFNBQWtCO0FBQUEsUUFFbkMsV0FBVSxrQkFBa0I7QUFBQTtBQUFBLE1BSTlCLFFBQVEsR0FBRztBQUFBLFFBQ1QsT0FBTztBQUFBLFVBQ0wsT0FBTyxLQUFLLFNBQVM7QUFBQSxVQUNyQixZQUFZLFdBQVUsVUFBVSxhQUM1QixXQUFVLFNBQVMsV0FBVyxjQUFjLElBQzVDLFdBQVUsY0FBYztBQUFBLFVBQzVCLGNBQWMsV0FBVSxVQUFVLGdCQUFnQixLQUFLO0FBQUEsWUFDckQsT0FBTztBQUFBLFlBQ1AsS0FBSztBQUFBLFVBQ1A7QUFBQSxVQUNBLGdCQUFnQixXQUFVLFVBQVUsa0JBQWtCLEtBQUs7QUFBQSxVQUMzRCxhQUFhLEtBQUssZUFBZTtBQUFBLFVBQ2pDLFdBQVcsS0FBSyxVQUFVO0FBQUEsUUFDNUI7QUFBQTtBQUFBLE1BSUYsT0FBTyxHQUFHO0FBQUEsUUFDUixJQUFJLFdBQVUsVUFBVSxTQUFTO0FBQUEsVUFDL0IsV0FBVSxTQUFTLFFBQVE7QUFBQSxRQUM3QjtBQUFBLFFBQ0EsWUFBWSxNQUFNO0FBQUEsUUFDbEIsV0FBVSxPQUFPLFdBQVc7QUFBQTtBQUFBLElBRWhDO0FBQUE7QUFBQTs7O0FDeHVCRyxJQUFNLGdCQUFnQjtBQUFBLEVBRTNCLE1BQU07QUFBQSxFQUVOLE1BQU07QUFBQSxFQUVOLFVBQVU7QUFBQSxFQUVWLE9BQU87QUFBQSxFQUVQLFVBQVU7QUFDWjs7O0FDcEI4QyxJQUE5QztBQWNBLElBQU0sWUFBWSxDQUFDLFNBQTJDO0FBQUEsRUFDNUQsSUFBSSxNQUFNLE9BQU87QUFBQSxJQUFXLE9BQU8sS0FBSztBQUFBLEVBQ3hDLElBQUksTUFBTSxRQUFRO0FBQUEsSUFBVyxPQUFPLEtBQUs7QUFBQSxFQUN6QyxJQUFJLE9BQU8sU0FBUyxZQUFZLE9BQU8sU0FBUztBQUFBLElBQVUsT0FBTztBQUFBLEVBQ2pFO0FBQUE7QUFNSyxJQUFNLGdCQUFnQixDQUMzQixXQUNHO0FBQUEsRUFDSCxPQUFPLENBQUMsZUFBb0Q7QUFBQSxJQUMxRCxJQUFJLENBQUMsT0FBTyxXQUFXLFdBQVcsT0FBTyxXQUFXLFNBQVMsUUFBUTtBQUFBLE1BQ25FLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFFQSxNQUFNLFFBQXdCO0FBQUEsTUFDNUIsYUFBYSxJQUFJO0FBQUEsTUFDakIsTUFBTSxPQUFPLFdBQVcsUUFBUTtBQUFBLE1BQ2hDLG1CQUFtQjtBQUFBLElBQ3JCO0FBQUEsSUFFQSxNQUFNLG1CQUFtQixPQUFPLFdBQVcsb0JBQW9CO0FBQUEsSUFLL0QsTUFBTSwyQkFBMkIsTUFBTTtBQUFBLE1BQ3JDLE1BQU0sWUFBWSxXQUFVLFNBQVMsY0FDbkMsSUFBSSxvQ0FDTjtBQUFBLE1BQ0EsSUFBSSxDQUFDO0FBQUEsUUFBVztBQUFBLE1BRWhCLE1BQU0sUUFBUSxVQUFVLGlCQUN0QixJQUFJLDRDQUNOO0FBQUEsTUFFQSxNQUFNLFFBQVEsQ0FBQyxPQUFPO0FBQUEsUUFDcEIsTUFBTSxVQUFVO0FBQUEsUUFDaEIsTUFBTSxLQUFLLFFBQVEsUUFBUTtBQUFBLFFBQzNCLElBQUksT0FBTyxXQUFXO0FBQUEsVUFFcEIsTUFBTSxhQUNKLE1BQU0sWUFBWSxJQUFJLEVBQUUsS0FBSyxNQUFNLFlBQVksSUFBSSxPQUFPLEVBQUUsQ0FBQztBQUFBLFVBQy9ELElBQUksWUFBWTtBQUFBLFlBQ2Qsc0JBQVMsU0FBUyxjQUFjLFFBQVE7QUFBQSxVQUMxQyxFQUFPO0FBQUEsWUFDTCx5QkFBWSxTQUFTLGNBQWMsUUFBUTtBQUFBO0FBQUEsUUFFL0M7QUFBQSxPQUNEO0FBQUE7QUFBQSxJQU1ILE1BQU0sa0JBQWtCLENBQUMsTUFBa0I7QUFBQSxNQUN6QyxNQUFNLGVBQWdCLEVBQUUsT0FBdUIsUUFDN0MsSUFBSSwrQ0FDTjtBQUFBLE1BQ0EsSUFBSSxDQUFDO0FBQUEsUUFBYztBQUFBLE1BRW5CLE1BQU0sUUFBUSxTQUFTLGFBQWEsUUFBUSxTQUFTLElBQUk7QUFBQSxNQUN6RCxJQUFJLFFBQVE7QUFBQSxRQUFHO0FBQUEsTUFFZixNQUFNLG9CQUFvQjtBQUFBLE1BQzFCLE1BQU0sUUFBUSxrQkFBa0IsV0FBVztBQUFBLE1BQzNDLE1BQU0sT0FBTyxRQUFRO0FBQUEsTUFDckIsSUFBSSxDQUFDO0FBQUEsUUFBTTtBQUFBLE1BRVgsTUFBTSxTQUFTLFVBQVUsSUFBSTtBQUFBLE1BQzdCLElBQUksV0FBVztBQUFBLFFBQVc7QUFBQSxNQUUxQixNQUFNLGNBQWMsTUFBTSxZQUFZLElBQUksTUFBTTtBQUFBLE1BRWhELElBQUksTUFBTSxTQUFTLFVBQVU7QUFBQSxRQUMzQixNQUFNLFlBQVksTUFBTTtBQUFBLFFBQ3hCLElBQUksQ0FBQyxhQUFhO0FBQUEsVUFDaEIsTUFBTSxZQUFZLElBQUksTUFBTTtBQUFBLFVBQzVCLE1BQU0sb0JBQW9CO0FBQUEsUUFDNUIsRUFBTztBQUFBLFVBQ0wsTUFBTSxvQkFBb0I7QUFBQTtBQUFBLE1BRTlCLEVBQU8sU0FBSSxNQUFNLFNBQVMsWUFBWTtBQUFBLFFBQ3BDLElBQUksRUFBRSxZQUFZLE1BQU0sc0JBQXNCLFdBQVc7QUFBQSxVQUN2RCxNQUFNLFFBQVEsS0FBSyxJQUFJLE1BQU0sbUJBQW1CLEtBQUs7QUFBQSxVQUNyRCxNQUFNLE1BQU0sS0FBSyxJQUFJLE1BQU0sbUJBQW1CLEtBQUs7QUFBQSxVQUVuRCxJQUFJLENBQUMsRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTO0FBQUEsWUFDNUIsTUFBTSxZQUFZLE1BQU07QUFBQSxVQUMxQjtBQUFBLFVBRUEsU0FBUyxJQUFJLE1BQU8sS0FBSyxLQUFLLEtBQUs7QUFBQSxZQUNqQyxNQUFNLFlBQVksUUFBUTtBQUFBLFlBQzFCLE1BQU0sY0FBYyxVQUFVLFNBQVM7QUFBQSxZQUN2QyxJQUFJLGdCQUFnQixXQUFXO0FBQUEsY0FDN0IsTUFBTSxZQUFZLElBQUksV0FBVztBQUFBLFlBQ25DO0FBQUEsVUFDRjtBQUFBLFFBQ0YsRUFBTyxTQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVM7QUFBQSxVQUNqQyxJQUFJLGFBQWE7QUFBQSxZQUNmLE1BQU0sWUFBWSxPQUFPLE1BQU07QUFBQSxVQUNqQyxFQUFPO0FBQUEsWUFDTCxNQUFNLFlBQVksSUFBSSxNQUFNO0FBQUE7QUFBQSxVQUU5QixNQUFNLG9CQUFvQjtBQUFBLFFBQzVCLEVBQU87QUFBQSxVQUNMLElBQUksa0JBQWtCO0FBQUEsWUFDcEIsTUFBTSxZQUFZLE1BQU07QUFBQSxZQUN4QixNQUFNLFlBQVksSUFBSSxNQUFNO0FBQUEsVUFDOUIsRUFBTztBQUFBLFlBQ0wsSUFBSSxhQUFhO0FBQUEsY0FDZixNQUFNLFlBQVksT0FBTyxNQUFNO0FBQUEsWUFDakMsRUFBTztBQUFBLGNBQ0wsTUFBTSxZQUFZLElBQUksTUFBTTtBQUFBO0FBQUE7QUFBQSxVQUdoQyxNQUFNLG9CQUFvQjtBQUFBO0FBQUEsTUFFOUI7QUFBQSxNQUVBLHlCQUF5QjtBQUFBLE1BQ3pCLG9CQUFvQjtBQUFBO0FBQUEsSUFNdEIsTUFBTSxzQkFBc0IsTUFBTTtBQUFBLE1BQ2hDLE1BQU0sb0JBQW9CO0FBQUEsTUFDMUIsTUFBTSxRQUFRLGtCQUFrQixXQUFXLEtBQUssQ0FBQztBQUFBLE1BRWpELE1BQU0sZ0JBQWdCLE1BQU0sT0FBTyxDQUFDLFNBQWM7QUFBQSxRQUNoRCxNQUFNLEtBQUssVUFBVSxJQUFJO0FBQUEsUUFDekIsT0FBTyxPQUFPLGFBQWEsTUFBTSxZQUFZLElBQUksRUFBRTtBQUFBLE9BQ3BEO0FBQUEsTUFFRCxNQUFNLGtCQUFrQixNQUFNLE9BQzVCLENBQUMsS0FBZSxNQUFXLFFBQWdCO0FBQUEsUUFDekMsTUFBTSxLQUFLLFVBQVUsSUFBSTtBQUFBLFFBQ3pCLElBQUksT0FBTyxhQUFhLE1BQU0sWUFBWSxJQUFJLEVBQUUsR0FBRztBQUFBLFVBQ2pELElBQUksS0FBSyxHQUFHO0FBQUEsUUFDZDtBQUFBLFFBQ0EsT0FBTztBQUFBLFNBRVQsQ0FBQyxDQUNIO0FBQUEsTUFFQSxXQUFVLE9BQU8sb0JBQW9CLEVBQUUsZUFBZSxnQkFBZ0IsQ0FBQztBQUFBLE1BRXZFLElBQUksT0FBTyxXQUFXLG1CQUFtQjtBQUFBLFFBQ3ZDLE9BQU8sVUFBVSxrQkFBa0IsZUFBZSxlQUFlO0FBQUEsTUFDbkU7QUFBQTtBQUFBLElBSUYsTUFBTSxRQUFRLE1BQU07QUFBQSxNQUVsQixJQUFJLFdBQVUsU0FBUztBQUFBLFFBQ3JCLHNCQUFTLFdBQVUsU0FBUyxrQkFBa0I7QUFBQSxRQUM5QyxzQkFBUyxXQUFVLFNBQVMsb0JBQW9CLE1BQU0sTUFBTTtBQUFBLFFBQzVELFdBQVUsUUFBUSxpQkFBaUIsU0FBUyxpQkFBaUIsSUFBSTtBQUFBLE1BQ25FO0FBQUEsTUFHQyxXQUFrQixLQUNqQiwyQkFDQSx3QkFDRjtBQUFBLE1BQ0MsV0FBa0IsS0FBSyxxQkFBcUIsd0JBQXdCO0FBQUEsTUFHcEUsV0FBa0IsS0FDakIsZ0JBQ0EsQ0FBQyxTQUF1QztBQUFBLFFBQ3RDLE1BQU0sU0FBUyxVQUFVLEtBQUssSUFBSTtBQUFBLFFBQ2xDLElBQUksV0FBVyxhQUFhLE1BQU0sWUFBWSxJQUFJLE1BQU0sR0FBRztBQUFBLFVBQ3pELE1BQU0sWUFBWSxPQUFPLE1BQU07QUFBQSxVQUUvQixJQUFJLE1BQU0sc0JBQXNCLEtBQUssT0FBTztBQUFBLFlBQzFDLE1BQU0sb0JBQW9CO0FBQUEsVUFDNUIsRUFBTyxTQUNMLE1BQU0sc0JBQXNCLGFBQzVCLE1BQU0sb0JBQW9CLEtBQUssT0FDL0I7QUFBQSxZQUVBLE1BQU07QUFBQSxVQUNSO0FBQUEsVUFDQSxvQkFBb0I7QUFBQSxRQUN0QjtBQUFBLE9BRUo7QUFBQTtBQUFBLElBSUYsV0FBVyxPQUFPLENBQUM7QUFBQSxJQUlsQixXQUFrQixLQUNqQixvQ0FDQSxDQUFDLFNBQXdDO0FBQUEsTUFDdkMsSUFBSSxNQUFNLGFBQWEsV0FBVztBQUFBLFFBRWhDLHNCQUFzQixNQUFNO0FBQUEsVUFDMUIsSUFBSSxNQUFNLFNBQVMsVUFBVTtBQUFBLFlBQzNCLE1BQU0sWUFBWSxNQUFNO0FBQUEsVUFDMUI7QUFBQSxVQUNBLE1BQU0sWUFBWSxJQUFJLEtBQUssUUFBUTtBQUFBLFVBQ25DLHlCQUF5QjtBQUFBLFVBQ3pCLG9CQUFvQjtBQUFBLFNBQ3JCO0FBQUEsTUFDSDtBQUFBLEtBRUo7QUFBQSxJQUdBLE1BQU0sa0JBQWtCLFdBQVU7QUFBQSxJQUNsQyxXQUFVLFVBQVUsTUFBTTtBQUFBLE1BQ3hCLFdBQVUsU0FBUyxvQkFBb0IsU0FBUyxpQkFBaUIsSUFBSTtBQUFBLE1BQ3JFLGtCQUFrQjtBQUFBO0FBQUEsSUFJcEIsT0FBTztBQUFBLFNBQ0Y7QUFBQSxNQUVILFdBQVcsQ0FBQyxTQUFtQjtBQUFBLFFBQzdCLE1BQU0sUUFBUyxLQUFhLFdBQVc7QUFBQSxRQUN2QyxJQUFJLENBQUM7QUFBQSxVQUFPO0FBQUEsUUFFWixJQUFJLE1BQU0sU0FBUyxVQUFVO0FBQUEsVUFFM0IsTUFBTSxZQUFZLE1BQU07QUFBQSxVQUN4QixJQUFJLFFBQVEsU0FBUyxHQUFHO0FBQUEsWUFDdEIsVUFBVSxDQUFDLFFBQVEsRUFBRTtBQUFBLFVBQ3ZCO0FBQUEsUUFDRjtBQUFBLFFBRUEsUUFBUSxRQUFRLENBQUMsVUFBVTtBQUFBLFVBQ3pCLE1BQU0sU0FBUyxVQUFVLE1BQU0sTUFBTTtBQUFBLFVBQ3JDLElBQUksV0FBVyxXQUFXO0FBQUEsWUFDeEIsTUFBTSxZQUFZLElBQUksTUFBTTtBQUFBLFVBQzlCO0FBQUEsU0FDRDtBQUFBLFFBRUQsSUFBSSxRQUFRLFNBQVMsR0FBRztBQUFBLFVBQ3RCLE1BQU0sb0JBQW9CLFFBQVEsUUFBUSxTQUFTO0FBQUEsUUFDckQ7QUFBQSxRQUVBLHlCQUF5QjtBQUFBLFFBQ3pCLG9CQUFvQjtBQUFBO0FBQUEsTUFHdEIsYUFBYSxDQUFDLFNBQW1CO0FBQUEsUUFDL0IsTUFBTSxRQUFTLEtBQWEsV0FBVztBQUFBLFFBQ3ZDLElBQUksQ0FBQztBQUFBLFVBQU87QUFBQSxRQUVaLFFBQVEsUUFBUSxDQUFDLFVBQVU7QUFBQSxVQUN6QixNQUFNLFNBQVMsVUFBVSxNQUFNLE1BQU07QUFBQSxVQUNyQyxJQUFJLFdBQVcsV0FBVztBQUFBLFlBQ3hCLE1BQU0sWUFBWSxPQUFPLE1BQU07QUFBQSxVQUNqQztBQUFBLFNBQ0Q7QUFBQSxRQUVELHlCQUF5QjtBQUFBLFFBQ3pCLG9CQUFvQjtBQUFBO0FBQUEsTUFHdEIsY0FBYyxHQUFHO0FBQUEsUUFDZixNQUFNLFlBQVksTUFBTTtBQUFBLFFBQ3hCLE1BQU0sb0JBQW9CO0FBQUEsUUFDMUIseUJBQXlCO0FBQUEsUUFDekIsb0JBQW9CO0FBQUE7QUFBQSxNQUd0QixnQkFBZ0IsR0FBUTtBQUFBLFFBQ3RCLE1BQU0sUUFBUyxLQUFhLFdBQVcsS0FBSyxDQUFDO0FBQUEsUUFDN0MsT0FBTyxNQUFNLE9BQU8sQ0FBQyxTQUFjO0FBQUEsVUFDakMsTUFBTSxLQUFLLFVBQVUsSUFBSTtBQUFBLFVBQ3pCLE9BQU8sT0FBTyxhQUFhLE1BQU0sWUFBWSxJQUFJLEVBQUU7QUFBQSxTQUNwRDtBQUFBO0FBQUEsTUFHSCxrQkFBa0IsR0FBYTtBQUFBLFFBQzdCLE1BQU0sUUFBUyxLQUFhLFdBQVcsS0FBSyxDQUFDO0FBQUEsUUFDN0MsT0FBTyxNQUFNLE9BQU8sQ0FBQyxLQUFlLE1BQVcsVUFBa0I7QUFBQSxVQUMvRCxNQUFNLEtBQUssVUFBVSxJQUFJO0FBQUEsVUFDekIsSUFBSSxPQUFPLGFBQWEsTUFBTSxZQUFZLElBQUksRUFBRSxHQUFHO0FBQUEsWUFDakQsSUFBSSxLQUFLLEtBQUs7QUFBQSxVQUNoQjtBQUFBLFVBQ0EsT0FBTztBQUFBLFdBQ04sQ0FBQyxDQUFhO0FBQUE7QUFBQSxNQUduQixVQUFVLENBQUMsT0FBd0I7QUFBQSxRQUNqQyxNQUFNLFFBQVMsS0FBYSxXQUFXO0FBQUEsUUFDdkMsTUFBTSxTQUFTLFVBQVUsUUFBUSxNQUFNO0FBQUEsUUFDdkMsT0FBTyxXQUFXLGFBQWEsTUFBTSxZQUFZLElBQUksTUFBTTtBQUFBO0FBQUEsTUFHN0QsVUFBVSxDQUFDLElBQXFCLFNBQWtCLE9BQWdCO0FBQUEsUUFDaEUsSUFBSSxPQUFPLGFBQWEsT0FBTztBQUFBLFVBQU0sT0FBTztBQUFBLFFBRTVDLElBQUksTUFBTSxTQUFTLFVBQVU7QUFBQSxVQUMzQixNQUFNLFlBQVksTUFBTTtBQUFBLFFBQzFCO0FBQUEsUUFFQSxNQUFNLFlBQVksSUFBSSxFQUFFO0FBQUEsUUFDeEIseUJBQXlCO0FBQUEsUUFDekIsSUFBSSxDQUFDLFFBQVE7QUFBQSxVQUNYLG9CQUFvQjtBQUFBLFFBQ3RCO0FBQUEsUUFDQSxPQUFPO0FBQUE7QUFBQSxNQU9ULGtCQUFrQixDQUFDLE9BQXdCO0FBQUEsUUFDekMsTUFBTSxZQUFZLFdBQVUsU0FBUyxjQUNuQyxJQUFJLG9DQUNOO0FBQUEsUUFDQSxJQUFJLENBQUM7QUFBQSxVQUFXLE9BQU87QUFBQSxRQUV2QixNQUFNLFlBQVcsV0FBVSxTQUFTLGNBQ2xDLElBQUksOEJBQ047QUFBQSxRQUNBLElBQUksQ0FBQztBQUFBLFVBQVUsT0FBTztBQUFBLFFBRXRCLE1BQU0sY0FBYyxVQUFVLGNBQzVCLElBQUksaURBQW9DLFNBQzFDO0FBQUEsUUFDQSxJQUFJLENBQUM7QUFBQSxVQUFhLE9BQU87QUFBQSxRQUV6QixNQUFNLGVBQWUsVUFBUyxzQkFBc0I7QUFBQSxRQUNwRCxNQUFNLFdBQVcsWUFBWSxzQkFBc0I7QUFBQSxRQUduRCxPQUNFLFNBQVMsT0FBTyxhQUFhLE9BQzdCLFNBQVMsVUFBVSxhQUFhO0FBQUE7QUFBQSxXQVM5QixjQUFhLENBQUMsT0FBaUM7QUFBQSxRQUNuRCxNQUFNLG9CQUFvQjtBQUFBLFFBQzFCLE1BQU0sYUFBYSxrQkFBa0IsZUFBZSxLQUFLO0FBQUEsUUFFekQsSUFBSSxRQUFRLEtBQUssU0FBUyxZQUFZO0FBQUEsVUFDcEMsT0FBTztBQUFBLFFBQ1Q7QUFBQSxRQUdBLE1BQU0saUJBQWlCLEtBQUssbUJBQW1CO0FBQUEsUUFDL0MsTUFBTSxlQUFlLGVBQWUsU0FBUyxJQUFJLGVBQWUsS0FBSztBQUFBLFFBQ3JFLE1BQU0sWUFBWSxRQUFRLGVBQWUsU0FBUztBQUFBLFFBR2xELE1BQU0saUJBQWlCLEtBQUssbUJBQW1CLEtBQUs7QUFBQSxRQUVwRCxJQUFJLENBQUMsa0JBQWtCLGtCQUFrQixVQUFVLGVBQWU7QUFBQSxVQUloRSxNQUFNLFlBQVksY0FBYyxTQUFTLFFBQVE7QUFBQSxVQUNqRCxrQkFBa0IsU0FBUyxjQUFjLE9BQU8sU0FBUztBQUFBLFFBQzNEO0FBQUEsUUFHQSxNQUFNLFFBQVEsa0JBQWtCLFdBQVcsS0FBSyxDQUFDO0FBQUEsUUFDakQsSUFBSSxNQUFNLFFBQVE7QUFBQSxVQUNoQixLQUFLLFlBQVksQ0FBQyxLQUFLLENBQUM7QUFBQSxVQUN4QixPQUFPO0FBQUEsUUFDVDtBQUFBLFFBR0EsT0FBTyxJQUFJLFFBQWlCLENBQUMsWUFBWTtBQUFBLFVBQ3ZDLElBQUksV0FBVztBQUFBLFVBRWYsTUFBTSxnQkFBZ0IsTUFBTTtBQUFBLFlBQzFCLElBQUk7QUFBQSxjQUFVO0FBQUEsWUFDZCxXQUFXO0FBQUEsWUFDWCxXQUFVLE1BQU0seUJBQXlCLGFBQWE7QUFBQSxZQUN0RCxzQkFBc0IsTUFBTTtBQUFBLGNBQzFCLEtBQUssWUFBWSxDQUFDLEtBQUssQ0FBQztBQUFBLGNBQ3hCLFFBQVEsSUFBSTtBQUFBLGFBQ2I7QUFBQTtBQUFBLFVBR0gsV0FBVSxLQUFLLHlCQUF5QixhQUFhO0FBQUEsVUFHckQsV0FBVyxNQUFNO0FBQUEsWUFDZixJQUFJO0FBQUEsY0FBVTtBQUFBLFlBQ2QsV0FBVztBQUFBLFlBQ1gsV0FBVSxNQUFNLHlCQUF5QixhQUFhO0FBQUEsWUFDdEQsS0FBSyxZQUFZLENBQUMsS0FBSyxDQUFDO0FBQUEsWUFDeEIsUUFBUSxJQUFJO0FBQUEsYUFDWCxHQUFHO0FBQUEsU0FDUDtBQUFBO0FBQUEsV0FRRyxXQUFVLEdBQXFCO0FBQUEsUUFDbkMsTUFBTSxvQkFBb0I7QUFBQSxRQUMxQixNQUFNLGtCQUFrQixLQUFLLG1CQUFtQjtBQUFBLFFBQ2hELE1BQU0sYUFBYSxrQkFBa0IsZUFBZSxLQUFLO0FBQUEsUUFDekQsTUFBTSxPQUFPLE9BQU8sVUFBVSxRQUFRO0FBQUEsUUFFdEMsSUFBSSxnQkFBZ0IsV0FBVyxHQUFHO0FBQUEsVUFFaEMsT0FBTyxLQUFLLGNBQWMsQ0FBQztBQUFBLFFBQzdCO0FBQUEsUUFFQSxNQUFNLGVBQWUsZ0JBQWdCO0FBQUEsUUFDckMsTUFBTSxZQUFZLGVBQWU7QUFBQSxRQUVqQyxJQUFJLFlBQVksWUFBWTtBQUFBLFVBQzFCLE9BQU8sS0FBSyxjQUFjLFNBQVM7QUFBQSxRQUNyQztBQUFBLFFBR0EsSUFBSSxRQUFRLGFBQWEsR0FBRztBQUFBLFVBQzFCLE9BQU8sS0FBSyxjQUFjLENBQUM7QUFBQSxRQUM3QjtBQUFBLFFBRUEsT0FBTztBQUFBO0FBQUEsV0FRSCxlQUFjLEdBQXFCO0FBQUEsUUFDdkMsTUFBTSxvQkFBb0I7QUFBQSxRQUMxQixNQUFNLGtCQUFrQixLQUFLLG1CQUFtQjtBQUFBLFFBQ2hELE1BQU0sYUFBYSxrQkFBa0IsZUFBZSxLQUFLO0FBQUEsUUFDekQsTUFBTSxPQUFPLE9BQU8sVUFBVSxRQUFRO0FBQUEsUUFFdEMsSUFBSSxnQkFBZ0IsV0FBVyxHQUFHO0FBQUEsVUFFaEMsSUFBSSxRQUFRLGFBQWEsR0FBRztBQUFBLFlBQzFCLE9BQU8sS0FBSyxjQUFjLGFBQWEsQ0FBQztBQUFBLFVBQzFDO0FBQUEsVUFDQSxPQUFPO0FBQUEsUUFDVDtBQUFBLFFBRUEsTUFBTSxlQUFlLGdCQUFnQjtBQUFBLFFBQ3JDLE1BQU0sWUFBWSxlQUFlO0FBQUEsUUFFakMsSUFBSSxhQUFhLEdBQUc7QUFBQSxVQUNsQixPQUFPLEtBQUssY0FBYyxTQUFTO0FBQUEsUUFDckM7QUFBQSxRQUdBLElBQUksUUFBUSxhQUFhLEdBQUc7QUFBQSxVQUMxQixPQUFPLEtBQUssY0FBYyxhQUFhLENBQUM7QUFBQSxRQUMxQztBQUFBLFFBRUEsT0FBTztBQUFBO0FBQUEsSUFFWDtBQUFBO0FBQUE7OztBQ3hkMEMsSUFBOUM7QUFLQSxJQUFNLHVCQUF1QjtBQVM3QixJQUFNLE9BQU87QUFBQSxFQUNYLGNBQWM7QUFBQSxFQUNkLGFBQWE7QUFBQSxFQUNiLHVCQUF1QjtBQUFBLEVBQ3ZCLGVBQWU7QUFBQSxFQUNmLFlBQVk7QUFBQSxFQUNaLHNCQUFzQjtBQUN4QjtBQUtBLElBQU0sb0JBQW9CLENBQ3hCLFlBQ3VCO0FBQUEsRUFDdkIsT0FBTyxTQUFTLGNBQWMsSUFBSSxxQ0FBdUIsS0FBSztBQUFBO0FBTWhFLElBQU0sbUJBQW1CLENBQUMsY0FBaUQ7QUFBQSxFQUN6RSxJQUFJLENBQUM7QUFBQSxJQUFXLE9BQU8sQ0FBQztBQUFBLEVBQ3hCLE9BQU8sTUFBTSxLQUNYLFVBQVUsaUJBQWlCLElBQUksZ0RBQWtDLENBQ25FO0FBQUE7QUFNSyxJQUFNLGVBQWUsQ0FDMUIsV0FDRztBQUFBLEVBQ0gsT0FBTyxDQUFDLGVBQW9EO0FBQUEsSUFFMUQsTUFBTSxtQkFDSixPQUFPLFdBQVcsV0FBVyxPQUFPLFdBQVcsU0FBUztBQUFBLElBQzFELE1BQU0saUJBQWlCLE9BQU8sWUFBWSxDQUFDO0FBQUEsSUFDM0MsTUFBTSxVQUFVLGVBQWUsV0FBVztBQUFBLElBRTFDLElBQUksQ0FBQyxTQUFTO0FBQUEsTUFDWixPQUFPO0FBQUEsSUFDVDtBQUFBLElBR0EsTUFBTSxVQUFVO0FBQUEsTUFDZCxTQUFTLGVBQWUsV0FBVztBQUFBLE1BQ25DLFlBQVksZUFBZSxjQUFjO0FBQUEsTUFDekMsVUFBVSxlQUFlLFlBQVk7QUFBQSxNQUNyQyxXQUFXLGVBQWUsYUFBYTtBQUFBLE1BQ3ZDLGtCQUFrQixlQUFlLG9CQUFvQjtBQUFBLE1BQ3JELE1BQU0sZUFBZSxRQUFRO0FBQUEsTUFDN0IsWUFBWSxlQUFlO0FBQUEsSUFDN0I7QUFBQSxJQUdBLElBQUksa0JBQWtCO0FBQUEsSUFDdEIsSUFBSSxpQkFBdUQ7QUFBQSxJQUczRCxJQUFJLG9CQUFvQjtBQUFBLElBS3hCLE1BQU0scUJBQXFCLE1BQU07QUFBQSxNQUMvQixNQUFNLFVBQVUsV0FBVTtBQUFBLE1BQzFCLElBQUksQ0FBQztBQUFBLFFBQVM7QUFBQSxNQUdkLFFBQVEsYUFBYSxRQUFRLEtBQUssWUFBWTtBQUFBLE1BRzlDLElBQUksT0FBTyxXQUFXLFNBQVMsWUFBWTtBQUFBLFFBQ3pDLFFBQVEsYUFBYSxLQUFLLHNCQUFzQixNQUFNO0FBQUEsTUFDeEQ7QUFBQSxNQUdBLElBQUksQ0FBQyxRQUFRLGFBQWEsVUFBVSxHQUFHO0FBQUEsUUFDckMsUUFBUSxhQUFhLFlBQVksR0FBRztBQUFBLE1BQ3RDO0FBQUEsTUFHQSxJQUFJLENBQUMsUUFBUSxhQUFhLEtBQUssVUFBVSxHQUFHO0FBQUEsUUFDMUMsUUFBUSxhQUFhLEtBQUssWUFBWSxNQUFNO0FBQUEsTUFDOUM7QUFBQTtBQUFBLElBTUYsTUFBTSwwQkFBMEIsTUFBTTtBQUFBLE1BQ3BDLE1BQU0sWUFBWSxrQkFBa0IsV0FBVSxPQUFPO0FBQUEsTUFDckQsTUFBTSxRQUFRLGlCQUFpQixTQUFTO0FBQUEsTUFDeEMsTUFBTSxvQkFBb0I7QUFBQSxNQUMxQixNQUFNLGtCQUFrQixrQkFBa0IscUJBQXFCLEtBQUssQ0FBQztBQUFBLE1BRXJFLE1BQU0sUUFBUSxDQUFDLFNBQVM7QUFBQSxRQUN0QixNQUFNLFFBQVEsU0FBUyxLQUFLLFFBQVEsU0FBUyxNQUFNLEVBQUU7QUFBQSxRQUNyRCxJQUFJLFFBQVE7QUFBQSxVQUFHO0FBQUEsUUFHZixLQUFLLGFBQWEsUUFBUSxLQUFLLFdBQVc7QUFBQSxRQUcxQyxNQUFNLFNBQVMsR0FBRyxtQ0FBcUI7QUFBQSxRQUN2QyxLQUFLLEtBQUs7QUFBQSxRQUdWLE1BQU0sYUFBYSxnQkFBZ0IsU0FBUyxLQUFLO0FBQUEsUUFDakQsS0FBSyxhQUFhLEtBQUssZUFBZSxPQUFPLFVBQVUsQ0FBQztBQUFBLE9BQ3pEO0FBQUEsTUFHRCxJQUFJLGdCQUFnQixTQUFTLEtBQUssV0FBVSxTQUFTO0FBQUEsUUFDbkQsTUFBTSxXQUFXLEdBQUcsbUNBQXFCLGdCQUFnQjtBQUFBLFFBQ3pELFdBQVUsUUFBUSxhQUFhLEtBQUssdUJBQXVCLFFBQVE7QUFBQSxNQUNyRSxFQUFPO0FBQUEsUUFDTCxXQUFVLFNBQVMsZ0JBQWdCLEtBQUsscUJBQXFCO0FBQUE7QUFBQTtBQUFBLElBT2pFLE1BQU0sa0JBQWtCLENBQUMsU0FBaUI7QUFBQSxNQUN4QyxJQUFJLENBQUMsUUFBUTtBQUFBLFFBQVcsT0FBTztBQUFBLE1BRy9CLElBQUksZ0JBQWdCO0FBQUEsUUFDbEIsYUFBYSxjQUFjO0FBQUEsTUFDN0I7QUFBQSxNQUdBLG1CQUFtQixLQUFLLFlBQVk7QUFBQSxNQUdwQyxpQkFBaUIsV0FBVyxNQUFNO0FBQUEsUUFDaEMsa0JBQWtCO0FBQUEsU0FDakIsUUFBUSxnQkFBZ0I7QUFBQSxNQUczQixNQUFNLG9CQUFvQjtBQUFBLE1BQzFCLE1BQU0sUUFBUSxrQkFBa0IsV0FBVyxLQUFLLENBQUM7QUFBQSxNQUNqRCxNQUFNLGtCQUFrQixrQkFBa0IscUJBQXFCLEtBQUssQ0FBQztBQUFBLE1BQ3JFLE1BQU0sYUFDSixnQkFBZ0IsU0FBUyxJQUFJLGdCQUFnQixLQUFLLElBQUk7QUFBQSxNQUd4RCxTQUFTLElBQUksRUFBRyxJQUFJLE1BQU0sUUFBUSxLQUFLO0FBQUEsUUFDckMsTUFBTSxTQUFTLGFBQWEsS0FBSyxNQUFNO0FBQUEsUUFDdkMsTUFBTSxPQUFPLE1BQU07QUFBQSxRQUNuQixJQUFJLENBQUM7QUFBQSxVQUFNO0FBQUEsUUFHWCxNQUFNLE9BQU8sWUFBWSxJQUFJLEVBQUUsWUFBWTtBQUFBLFFBQzNDLElBQUksS0FBSyxXQUFXLGVBQWUsR0FBRztBQUFBLFVBQ3BDLGtCQUFrQixnQkFBZ0IsS0FBSztBQUFBLFVBQ3ZDLFFBQVEsYUFBYSxPQUFPLFdBQVc7QUFBQSxVQUN2QyxPQUFPO0FBQUEsUUFDVDtBQUFBLE1BQ0Y7QUFBQSxNQUVBLE9BQU87QUFBQTtBQUFBLElBTVQsTUFBTSxjQUFjLENBQUMsU0FBc0I7QUFBQSxNQUN6QyxJQUFJLE9BQU8sU0FBUztBQUFBLFFBQVUsT0FBTztBQUFBLE1BQ3JDLE9BQU8sS0FBSyxTQUFTLEtBQUssUUFBUSxLQUFLLFNBQVMsS0FBSyxRQUFRO0FBQUE7QUFBQSxJQVkvRCxNQUFNLGdCQUFnQixPQUFPLE1BQXFCO0FBQUEsTUFDaEQsTUFBTSxvQkFBb0I7QUFBQSxNQUMxQixNQUFNLGFBQWEsa0JBQWtCLGVBQWUsS0FBSztBQUFBLE1BRXpELElBQUksZUFBZTtBQUFBLFFBQUc7QUFBQSxNQUV0QixNQUFNLGtCQUFrQixrQkFBa0IscUJBQXFCLEtBQUssQ0FBQztBQUFBLE1BQ3JFLE1BQU0sZUFBZSxnQkFBZ0IsU0FBUyxJQUFJLGdCQUFnQixLQUFLO0FBQUEsTUFFdkUsSUFBSSxjQUE2QjtBQUFBLE1BQ2pDLElBQUksVUFBVTtBQUFBLE1BR2QsTUFBTSxjQUFjLE1BQU07QUFBQSxRQUN4QixVQUFVO0FBQUEsUUFDVixFQUFFLGVBQWU7QUFBQSxRQUNqQixFQUFFLGdCQUFnQjtBQUFBLFFBQ2xCLEVBQUUseUJBQXlCO0FBQUE7QUFBQSxNQUc3QixRQUFRLEVBQUU7QUFBQSxhQUVIO0FBQUEsYUFDQTtBQUFBLFVBQ0gsWUFBWTtBQUFBLFVBQ1osSUFBSSxlQUFlLEdBQUc7QUFBQSxZQUNwQixjQUFjO0FBQUEsVUFDaEIsRUFBTyxTQUFJLGVBQWUsYUFBYSxHQUFHO0FBQUEsWUFDeEMsY0FBYyxlQUFlO0FBQUEsVUFDL0IsRUFBTyxTQUFJLFFBQVEsTUFBTTtBQUFBLFlBRXZCLGNBQWM7QUFBQSxVQUNoQjtBQUFBLFVBQ0E7QUFBQSxhQUdHO0FBQUEsYUFDQTtBQUFBLFVBQ0gsWUFBWTtBQUFBLFVBQ1osSUFBSSxlQUFlLEdBQUc7QUFBQSxZQUNwQixjQUFjLGFBQWE7QUFBQSxVQUM3QixFQUFPLFNBQUksZUFBZSxHQUFHO0FBQUEsWUFDM0IsY0FBYyxlQUFlO0FBQUEsVUFDL0IsRUFBTyxTQUFJLFFBQVEsTUFBTTtBQUFBLFlBRXZCLGNBQWMsYUFBYTtBQUFBLFVBQzdCO0FBQUEsVUFDQTtBQUFBLGFBRUc7QUFBQSxVQUNILElBQUksUUFBUSxTQUFTO0FBQUEsWUFDbkIsWUFBWTtBQUFBLFlBQ1osY0FBYztBQUFBLFVBQ2hCO0FBQUEsVUFDQTtBQUFBLGFBRUc7QUFBQSxVQUNILElBQUksUUFBUSxTQUFTO0FBQUEsWUFDbkIsWUFBWTtBQUFBLFlBQ1osY0FBYyxhQUFhO0FBQUEsVUFDN0I7QUFBQSxVQUNBO0FBQUEsYUFFRztBQUFBLFVBQ0gsSUFBSSxRQUFRLFlBQVk7QUFBQSxZQUN0QixZQUFZO0FBQUEsWUFDWixJQUFJLGVBQWUsR0FBRztBQUFBLGNBQ3BCLGNBQWMsS0FBSyxJQUFJLFFBQVEsV0FBVyxHQUFHLGFBQWEsQ0FBQztBQUFBLFlBQzdELEVBQU87QUFBQSxjQUNMLGNBQWMsS0FBSyxJQUNqQixlQUFlLFFBQVEsVUFDdkIsYUFBYSxDQUNmO0FBQUE7QUFBQSxVQUVKO0FBQUEsVUFDQTtBQUFBLGFBRUc7QUFBQSxVQUNILElBQUksUUFBUSxZQUFZO0FBQUEsWUFDdEIsWUFBWTtBQUFBLFlBQ1osSUFBSSxlQUFlLEdBQUc7QUFBQSxjQUNwQixjQUFjO0FBQUEsWUFDaEIsRUFBTztBQUFBLGNBQ0wsY0FBYyxLQUFLLElBQUksZUFBZSxRQUFRLFVBQVUsQ0FBQztBQUFBO0FBQUEsVUFFN0Q7QUFBQSxVQUNBO0FBQUEsYUFHRztBQUFBLGFBQ0E7QUFBQSxVQUNILFlBQVk7QUFBQSxVQUNaLElBQUksZ0JBQWdCLEdBQUc7QUFBQSxZQUNyQixJQUFJLE9BQU8sV0FBVyxTQUFTLFlBQVk7QUFBQSxjQUV6QyxNQUFNLGFBQWEsa0JBQWtCLGFBQWEsWUFBWTtBQUFBLGNBQzlELElBQUksWUFBWTtBQUFBLGdCQUNkLGtCQUFrQixnQkFBZ0IsQ0FBQyxZQUFZLENBQUM7QUFBQSxjQUNsRCxFQUFPO0FBQUEsZ0JBQ0wsa0JBQWtCLGNBQWMsQ0FBQyxZQUFZLENBQUM7QUFBQTtBQUFBLFlBRWxELEVBQU87QUFBQSxjQUVMLGtCQUFrQixjQUFjLENBQUMsWUFBWSxDQUFDO0FBQUEsY0FFOUMsV0FBVSxPQUFPLGlCQUFpQjtBQUFBLGdCQUNoQyxPQUFPO0FBQUEsZ0JBQ1AsTUFBTSxrQkFBa0IsV0FBVyxJQUFJO0FBQUEsY0FDekMsQ0FBQztBQUFBO0FBQUEsVUFFTDtBQUFBLFVBQ0E7QUFBQSxhQUVHO0FBQUEsYUFDQTtBQUFBLFVBRUgsS0FDRyxFQUFFLFdBQVcsRUFBRSxZQUNoQixPQUFPLFdBQVcsU0FBUyxZQUMzQjtBQUFBLFlBQ0EsWUFBWTtBQUFBLFlBQ1osTUFBTSxhQUFhLE1BQU0sS0FBSyxFQUFFLFFBQVEsV0FBVyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUM7QUFBQSxZQUNqRSxrQkFBa0IsY0FBYyxVQUFVO0FBQUEsVUFDNUM7QUFBQSxVQUNBO0FBQUEsYUFFRztBQUFBLFVBRUgsWUFBWTtBQUFBLFVBQ1osa0JBQWtCLGlCQUFpQjtBQUFBLFVBQ25DO0FBQUE7QUFBQSxVQUlBLElBQUksRUFBRSxJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsV0FBVyxDQUFDLEVBQUUsUUFBUTtBQUFBLFlBQy9ELFVBQVUsZ0JBQWdCLEVBQUUsR0FBRztBQUFBLFVBQ2pDO0FBQUEsVUFDQTtBQUFBO0FBQUEsTUFJSixJQUFJLGdCQUFnQixRQUFRLGdCQUFnQixjQUFjO0FBQUEsUUFFeEQsSUFDRSxFQUFFLFlBQ0YsT0FBTyxXQUFXLFNBQVMsY0FDM0IsZ0JBQWdCLEdBQ2hCO0FBQUEsVUFDQSxNQUFNLFFBQVEsS0FBSyxJQUFJLGNBQWMsV0FBVztBQUFBLFVBQ2hELE1BQU0sTUFBTSxLQUFLLElBQUksY0FBYyxXQUFXO0FBQUEsVUFDOUMsTUFBTSxlQUFlLE1BQU0sS0FDekIsRUFBRSxRQUFRLE1BQU0sUUFBUSxFQUFFLEdBQzFCLENBQUMsR0FBRyxNQUFNLFFBQVEsQ0FDcEI7QUFBQSxVQUNBLGtCQUFrQixjQUFjLFlBQVk7QUFBQSxRQUM5QyxFQUFPO0FBQUEsVUFHTCxNQUFNLGtCQUFrQixnQkFBZ0IsV0FBVztBQUFBO0FBQUEsUUFFckQsUUFBUSxhQUFhLGFBQWEsRUFBRSxHQUFHO0FBQUEsTUFDekM7QUFBQSxNQUdBLElBQUksU0FBUztBQUFBLFFBQ1gsV0FBVSxPQUFPLHFCQUFxQjtBQUFBLFVBQ3BDLEtBQUssRUFBRTtBQUFBLFVBQ1AsT0FBTyxlQUFlO0FBQUEsVUFDdEIsVUFBVSxFQUFFO0FBQUEsVUFDWixTQUFTLEVBQUU7QUFBQSxVQUNYLFNBQVMsRUFBRTtBQUFBLFFBQ2IsQ0FBQztBQUFBLE1BQ0g7QUFBQTtBQUFBLElBVUYsTUFBTSxjQUFjLE1BQU07QUFBQSxNQUN4QixNQUFNLG9CQUFvQjtBQUFBLE1BQzFCLE1BQU0sa0JBQWtCLGtCQUFrQixxQkFBcUIsS0FBSyxDQUFDO0FBQUEsTUFDckUsTUFBTSxhQUFhLGtCQUFrQixlQUFlLEtBQUs7QUFBQSxNQUl6RCxNQUFNLGdCQUFnQixLQUFLLElBQUksSUFBSSxvQkFBb0I7QUFBQSxNQUN2RCxJQUFJLENBQUMsaUJBQWlCLFdBQVUsU0FBUztBQUFBLFFBQ3ZDLHVCQUFTLFdBQVUsU0FBUyxvQkFBb0I7QUFBQSxNQUNsRDtBQUFBLE1BRUEsSUFBSSxlQUFlO0FBQUEsUUFBRztBQUFBLE1BSXRCLElBQUksZ0JBQWdCLFdBQVcsR0FBRztBQUFBLFFBQ2hDLGtCQUFrQixnQkFBZ0IsQ0FBQztBQUFBLE1BQ3JDLEVBQU87QUFBQSxRQUdMLE1BQU0sZ0JBQWdCLGdCQUFnQjtBQUFBLFFBQ3RDLE1BQU0sWUFBWSxrQkFBa0IscUJBQXFCLGFBQWE7QUFBQSxRQUN0RSxJQUFJLENBQUMsYUFBYSxrQkFBa0IsVUFBVSxlQUFlO0FBQUEsVUFDM0Qsa0JBQWtCLFNBQVMsY0FBYyxhQUFhO0FBQUEsUUFDeEQ7QUFBQTtBQUFBLE1BR0YsV0FBVSxPQUFPLGdCQUFnQjtBQUFBO0FBQUEsSUFNbkMsTUFBTSxhQUFhLE1BQU07QUFBQSxNQUV2QixJQUFJLFdBQVUsU0FBUztBQUFBLFFBQ3JCLDBCQUFZLFdBQVUsU0FBUyxvQkFBb0I7QUFBQSxNQUNyRDtBQUFBLE1BR0Esa0JBQWtCO0FBQUEsTUFDbEIsSUFBSSxnQkFBZ0I7QUFBQSxRQUNsQixhQUFhLGNBQWM7QUFBQSxRQUMzQixpQkFBaUI7QUFBQSxNQUNuQjtBQUFBLE1BRUEsV0FBVSxPQUFPLGVBQWU7QUFBQTtBQUFBLElBTWxDLE1BQU0sUUFBUSxNQUFNO0FBQUEsTUFDbEIsbUJBQW1CO0FBQUEsTUFFbkIsSUFBSSxXQUFVLFNBQVM7QUFBQSxRQUNyQixXQUFVLFFBQVEsaUJBQWlCLFdBQVcsYUFBYTtBQUFBLFFBQzNELFdBQVUsUUFBUSxpQkFBaUIsU0FBUyxXQUFXO0FBQUEsUUFDdkQsV0FBVSxRQUFRLGlCQUFpQixRQUFRLFVBQVU7QUFBQSxRQUdyRCxXQUFVLFFBQVEsaUJBQWlCLGFBQWEsTUFBTTtBQUFBLFVBQ3BELG9CQUFvQixLQUFLLElBQUk7QUFBQSxTQUM5QjtBQUFBLFFBR0QsV0FBVSxRQUFRLGlCQUFpQixTQUFTLE1BQU07QUFBQSxVQUNoRCxXQUFVLFNBQVMsTUFBTTtBQUFBLFNBQzFCO0FBQUEsTUFDSDtBQUFBLE1BR0MsV0FBa0IsS0FDakIsMkJBQ0EsdUJBQ0Y7QUFBQSxNQUNDLFdBQWtCLEtBQUsscUJBQXFCLHVCQUF1QjtBQUFBLE1BR25FLFdBQWtCLEtBQUssb0JBQW9CLHVCQUF1QjtBQUFBO0FBQUEsSUFJckUsV0FBVyxPQUFPLENBQUM7QUFBQSxJQUduQixNQUFNLGtCQUFrQixXQUFVO0FBQUEsSUFDbEMsV0FBVSxVQUFVLE1BQU07QUFBQSxNQUN4QixJQUFJLFdBQVUsU0FBUztBQUFBLFFBQ3JCLFdBQVUsUUFBUSxvQkFBb0IsV0FBVyxhQUFhO0FBQUEsUUFDOUQsV0FBVSxRQUFRLG9CQUFvQixTQUFTLFdBQVc7QUFBQSxRQUMxRCxXQUFVLFFBQVEsb0JBQW9CLFFBQVEsVUFBVTtBQUFBLE1BQzFEO0FBQUEsTUFDQSxJQUFJLGdCQUFnQjtBQUFBLFFBQ2xCLGFBQWEsY0FBYztBQUFBLE1BQzdCO0FBQUEsTUFDQSxrQkFBa0I7QUFBQTtBQUFBLElBSXBCLE9BQU87QUFBQSxTQUNGO0FBQUEsTUFLSCxLQUFLLEdBQVM7QUFBQSxRQUNaLFdBQVUsU0FBUyxNQUFNO0FBQUE7QUFBQSxNQU0zQixJQUFJLEdBQVM7QUFBQSxRQUNYLFdBQVUsU0FBUyxLQUFLO0FBQUE7QUFBQSxNQU0xQixRQUFRLEdBQVk7QUFBQSxRQUNsQixPQUFPLFNBQVMsa0JBQWtCLFdBQVU7QUFBQTtBQUFBLFdBTXhDLFlBQVcsR0FBcUI7QUFBQSxRQUNwQyxNQUFNLG9CQUFvQjtBQUFBLFFBQzFCLE1BQU0sYUFBYSxrQkFBa0IsZUFBZSxLQUFLO0FBQUEsUUFDekQsSUFBSSxhQUFhLEdBQUc7QUFBQSxVQUNsQixPQUFPLGtCQUFrQixnQkFBZ0IsQ0FBQyxLQUFLO0FBQUEsUUFDakQ7QUFBQSxRQUNBLE9BQU87QUFBQTtBQUFBLFdBTUgsV0FBVSxHQUFxQjtBQUFBLFFBQ25DLE1BQU0sb0JBQW9CO0FBQUEsUUFDMUIsTUFBTSxhQUFhLGtCQUFrQixlQUFlLEtBQUs7QUFBQSxRQUN6RCxJQUFJLGFBQWEsR0FBRztBQUFBLFVBQ2xCLE9BQU8sa0JBQWtCLGdCQUFnQixhQUFhLENBQUMsS0FBSztBQUFBLFFBQzlEO0FBQUEsUUFDQSxPQUFPO0FBQUE7QUFBQSxJQUVYO0FBQUE7QUFBQTs7O0FMMWZHLElBQU0sY0FBYyxDQUN6QixTQUF5QixDQUFDLE1BQ0o7QUFBQSxFQUN0QixJQUFJO0FBQUEsSUFPRixNQUFNLFlBQVk7QUFBQSxNQUVoQjtBQUFBLE1BQ0EseUJBQVc7QUFBQSxNQUNYLDBCQUFZO0FBQUEsUUFDVixLQUFLO0FBQUEsUUFDTCxXQUFXLE9BQU8sYUFBYTtBQUFBLFFBQy9CLFlBQVk7QUFBQSxVQUNWLE1BQU07QUFBQSxVQUNOLGNBQWMsT0FBTyxhQUFhO0FBQUEsUUFDcEM7QUFBQSxNQUNGLENBQUM7QUFBQSxNQUlELGFBQWE7QUFBQSxXQUNSO0FBQUEsUUFDSCxpQkFBaUIsT0FBTyxXQUFXO0FBQUEsTUFDckMsQ0FBQztBQUFBLE1BR0QsNEJBQWM7QUFBQSxNQUdkLFFBQVEsTUFBTTtBQUFBLElBQ2hCO0FBQUEsSUFHQSxJQUFJLE9BQU8sV0FBVyxTQUFTO0FBQUEsTUFDN0IsVUFBVSxLQUFLLGNBQWMsTUFBTSxDQUFDO0FBQUEsSUFDdEM7QUFBQSxJQUdBLElBQUksT0FBTyxXQUFXLFdBQVcsT0FBTyxVQUFVLFNBQVM7QUFBQSxNQUN6RCxVQUFVLEtBQUssYUFBYSxNQUFNLENBQUM7QUFBQSxJQUNyQztBQUFBLElBRUEsTUFBTSxhQUFZLG1CQUFLLEdBQUcsU0FBUyxFQUFFO0FBQUEsU0FDaEM7QUFBQSxNQUNILGVBQWU7QUFBQSxNQUNmLFFBQVEsT0FBTyxVQUFVO0FBQUEsSUFDM0IsQ0FBQztBQUFBLElBRUQsT0FBTztBQUFBLElBQ1AsT0FBTyxPQUFPO0FBQUEsSUFDZCxRQUFRLE1BQU0sK0NBQThDLEtBQUs7QUFBQSxJQUNqRSxNQUFNO0FBQUE7QUFBQTs7QU10RlcsSUFBckI7QUFDd0MsSUFBeEM7QUFDMEMsSUFBMUM7OztBQ0hBLElBQU0scUJBQXFCO0FBRzNCLElBQU0saUJBQWlCO0FBS3ZCLElBQU0sb0JBQW9CLENBQUMsV0FBd0M7QUFBQSxFQUNqRSxNQUFNLE9BQU8sU0FBUyxjQUFjLE1BQU07QUFBQSxFQUUxQyxJQUFJLE9BQU8sUUFBUTtBQUFBLElBQ2pCLEtBQUssYUFBYSxVQUFVLE9BQU8sTUFBTTtBQUFBLEVBQzNDO0FBQUEsRUFFQSxJQUFJLE9BQU8sUUFBUTtBQUFBLElBQ2pCLEtBQUssYUFBYSxVQUFVLE9BQU8sTUFBTTtBQUFBLEVBQzNDO0FBQUEsRUFFQSxJQUFJLE9BQU8sY0FBYztBQUFBLElBQ3ZCLEtBQUssYUFBYSxnQkFBZ0IsT0FBTyxZQUFZO0FBQUEsRUFDdkQ7QUFBQSxFQUdBLEtBQUssaUJBQWlCLFVBQVUsQ0FBQyxNQUFNO0FBQUEsSUFDckMsRUFBRSxlQUFlO0FBQUEsR0FDbEI7QUFBQSxFQUVELE9BQU87QUFBQTtBQU1ULElBQU0sc0JBQXNCLENBQzFCLFFBQ0EsTUFDQSxXQUMyRDtBQUFBLEVBQzNELElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxRQUFRLE1BQU0sS0FBSyxPQUFPLFdBQVcsR0FBRztBQUFBLElBQzVELE9BQU8sRUFBRSxJQUFJLENBQUMsR0FBRyxjQUFjLEtBQUs7QUFBQSxFQUN0QztBQUFBLEVBR0EsTUFBTSxlQUFlLGFBQWEsUUFBUSxNQUFNLENBQUMsQ0FBQztBQUFBLEVBR2xELE1BQU0sS0FBOEIsQ0FBQztBQUFBLEVBRXJDLElBQUksZ0JBQWdCLE9BQU8saUJBQWlCLFVBQVU7QUFBQSxJQUVwRCxNQUFNLFNBQVM7QUFBQSxJQUNmLElBQUksT0FBTyxXQUFXO0FBQUEsTUFDcEIsT0FBTyxPQUFPLElBQUksT0FBTyxTQUFTO0FBQUEsSUFDcEM7QUFBQSxFQUNGO0FBQUEsRUFFQSxPQUFPLEVBQUUsSUFBSSxhQUFhO0FBQUE7QUFNNUIsSUFBTSx1QkFBdUIsQ0FDM0IsTUFDQSxrQkFDaUI7QUFBQSxFQUNqQixNQUFNLGFBQWdDLENBQUM7QUFBQSxFQUd2QyxNQUFNLGNBQWMsS0FBSyxjQUEyQixZQUFZO0FBQUEsRUFDaEUsSUFBSSxhQUFhO0FBQUEsSUFFZixNQUFNLGdCQUFnQixNQUFNO0FBQUEsTUFDMUIsTUFBTSxVQUFVLFlBQVk7QUFBQSxNQUM1QixjQUFjLE1BQU0sWUFBWSx3QkFBd0IsR0FBRyxXQUFXO0FBQUE7QUFBQSxJQUV4RSxjQUFjO0FBQUEsSUFHZCxNQUFNLGlCQUFpQixJQUFJLGVBQWUsYUFBYTtBQUFBLElBQ3ZELGVBQWUsUUFBUSxJQUFJO0FBQUEsSUFFM0IsV0FBVyxLQUFLLE1BQU07QUFBQSxNQUNwQixlQUFlLFdBQVc7QUFBQSxNQUMxQixjQUFjLE1BQU0sZUFBZSxzQkFBc0I7QUFBQSxLQUMxRDtBQUFBLEVBQ0g7QUFBQSxFQUdBLE1BQU0sZUFBZSxLQUFLLGlCQUE4QixZQUFZO0FBQUEsRUFFcEUsYUFBYSxRQUFRLENBQUMsaUJBQWdCO0FBQUEsSUFDcEMsSUFBSSxhQUFhO0FBQUEsSUFFakIsTUFBTSxlQUFlLE1BQU07QUFBQSxNQUN6QixNQUFNLG1CQUFtQixhQUFZLFlBQVk7QUFBQSxNQUNqRCxJQUFJLHFCQUFxQixZQUFZO0FBQUEsUUFDbkMsYUFBYTtBQUFBLFFBQ2IsY0FBYyxVQUFVLE9BQU8sZ0JBQWdCLGdCQUFnQjtBQUFBLE1BQ2pFO0FBQUE7QUFBQSxJQUlGLGFBQWE7QUFBQSxJQUdiLGFBQVksaUJBQWlCLFVBQVUsY0FBYyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQUEsSUFFdEUsV0FBVyxLQUFLLE1BQU07QUFBQSxNQUNwQixhQUFZLG9CQUFvQixVQUFVLFlBQVk7QUFBQSxNQUN0RCxjQUFjLFVBQVUsT0FBTyxjQUFjO0FBQUEsS0FDOUM7QUFBQSxHQUNGO0FBQUEsRUFHRCxPQUFPLE1BQU07QUFBQSxJQUNYLFdBQVcsUUFBUSxDQUFDLE9BQU8sR0FBRyxDQUFDO0FBQUE7QUFBQTtBQVE1QixJQUFNLGFBQWEsQ0FBQyxXQUF1QjtBQUFBLEVBQ2hELE9BQU8sQ0FDTCxlQU1HO0FBQUEsSUFFSCxNQUFNLE9BQU8sa0JBQWtCLE1BQU07QUFBQSxJQUdyQyxJQUFJLFdBQVUsU0FBUztBQUFBLE1BQ3JCLFdBQVUsUUFBUSxZQUFZLElBQUk7QUFBQSxJQUNwQztBQUFBLElBR0EsUUFBUSxJQUFJLGlCQUFpQixPQUFPLFNBQ2hDLG9CQUFvQixPQUFPLFFBQVEsTUFBTSxNQUFNLElBQy9DLEVBQUUsSUFBSSxDQUFDLEdBQUcsY0FBYyxLQUFLO0FBQUEsSUFHakMsTUFBTSx5QkFBeUIscUJBQzdCLE1BQ0EsV0FBVSxPQUNaO0FBQUEsSUFFQSxPQUFPO0FBQUEsU0FDRjtBQUFBLE1BQ0g7QUFBQSxNQUNBO0FBQUEsTUFDQTtBQUFBLE1BQ0EseUJBQXlCO0FBQUEsSUFDM0I7QUFBQTtBQUFBOztBQ3JLRyxJQUFNLGFBQWE7QUFBQSxFQUV4QixVQUFVO0FBQUEsRUFFVixPQUFPO0FBQ1Q7QUFLTyxJQUFNLGNBQWM7QUFBQSxFQUV6QixRQUFRO0FBQUEsRUFFUixRQUFRO0FBQUEsRUFFUixjQUFjO0FBQUEsRUFFZCxVQUFVO0FBQUEsRUFFVixVQUFVO0FBQUEsRUFFVixjQUFjO0FBQUEsRUFFZCxrQkFBa0I7QUFBQSxFQUVsQixnQkFBZ0I7QUFBQSxFQUVoQixjQUFjO0FBQUEsRUFFZCxPQUFPO0FBQUEsRUFFUCxlQUFlO0FBQ2pCO0FBS08sSUFBTSxlQUFlO0FBQUEsRUFFMUIsVUFBVTtBQUFBLEVBRVYsWUFBWTtBQUFBLEVBRVosVUFBVTtBQUFBLEVBRVYsVUFBVTtBQUNaO0FBS08sSUFBTSxnQkFBZ0I7QUFBQSxFQUMzQixRQUFRO0FBQUEsRUFDUixlQUFlO0FBQUEsRUFDZixLQUFLO0FBQUEsRUFDTCxTQUFTO0FBQUEsRUFDVCxRQUFRO0FBQUEsRUFDUixjQUFjO0FBQUEsRUFDZCxZQUFZO0FBQUEsRUFDWixVQUFVLENBQUMsVUFBVSxRQUFRO0FBQy9COzs7QUN4RE8sSUFBTSxtQkFBbUIsQ0FBQyxTQUFxQixDQUFDLE1BQWtCO0FBQUEsRUFDdkUsT0FBTztBQUFBLE9BQ0Y7QUFBQSxPQUNBO0FBQUEsSUFDSCxRQUFRLE9BQU8sVUFBVSxjQUFjO0FBQUEsSUFDdkMsZUFBZSxPQUFPLGlCQUFpQixjQUFjO0FBQUEsSUFDckQsVUFDRSxPQUFPLGFBQWEsWUFDaEIsT0FBTyxXQUNQLENBQUMsR0FBRyxjQUFjLFFBQVE7QUFBQSxJQUNoQyxTQUFTLE9BQU8sV0FBVyxDQUFDO0FBQUEsSUFDNUIsWUFBWSxPQUFPLGNBQWMsQ0FBQztBQUFBLElBQ2xDLElBQUksT0FBTyxNQUFNLENBQUM7QUFBQSxFQUNwQjtBQUFBO0FBTUssSUFBTSxxQkFBcUIsQ0FBQyxXQUFrQztBQUFBLEVBQ25FLE1BQU0sY0FBYyxPQUFPLE9BQU8sS0FBSyxPQUFPLEtBQUssSUFBSSxDQUFDO0FBQUEsRUFFeEQsT0FBTztBQUFBLElBQ0wsVUFBVTtBQUFBLElBQ1YsWUFBWTtBQUFBLElBQ1osVUFBVTtBQUFBLElBQ1Y7QUFBQSxJQUNBLGFBQWEsS0FBSyxZQUFZO0FBQUEsSUFDOUIsUUFBUSxDQUFDO0FBQUEsRUFDWDtBQUFBO0FBTUssSUFBTSxtQkFBbUIsQ0FBQyxXQUF1QjtBQUFBLEVBQ3RELE1BQU0sU0FBUyxPQUFPLFVBQVUsY0FBYztBQUFBLEVBQzlDLE1BQU0sZ0JBQWdCLE9BQU8saUJBQWlCLGNBQWM7QUFBQSxFQUU1RCxNQUFNLGFBQWEsQ0FBQyxHQUFHLFVBQVUsZUFBZTtBQUFBLEVBRWhELElBQUksT0FBTyxPQUFPO0FBQUEsSUFDaEIsV0FBVyxLQUFLLE9BQU8sS0FBSztBQUFBLEVBQzlCO0FBQUEsRUFFQSxPQUFPO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxXQUFXLFdBQVcsS0FBSyxHQUFHO0FBQUEsSUFDOUIsWUFBWTtBQUFBLE1BQ1Ysa0JBQWtCO0FBQUEsSUFDcEI7QUFBQSxFQUNGO0FBQUE7QUFNSyxJQUFNLG1CQUFtQixDQUFDLGlCQUFpQztBQUFBLEVBQ2hFLE1BQU0sUUFBUSxhQUFhLE1BQU0sR0FBRztBQUFBLEVBQ3BDLE9BQU8sTUFBTSxTQUFTLElBQUksTUFBTSxNQUFNLENBQUMsRUFBRSxLQUFLLEdBQUcsSUFBSTtBQUFBO0FBZ0JoRCxJQUFNLGNBQWMsQ0FBQyxTQUEwQjtBQUFBLEVBQ3BELE9BQU8sS0FBSyxXQUFXLE9BQU8sS0FBSyxLQUFLLFdBQVcsT0FBTztBQUFBO0FBTXJELElBQU0sYUFBYSxDQUFDLFNBQTBCO0FBQUEsRUFDbkQsT0FBTyxLQUFLLFdBQVcsT0FBTztBQUFBO0FBTXpCLElBQU0sZUFBZSxDQUFDLEdBQVksTUFBd0I7QUFBQSxFQUUvRCxJQUFJLE1BQU07QUFBQSxJQUFHLE9BQU87QUFBQSxFQUNwQixJQUFJLEtBQUssUUFBUSxLQUFLO0FBQUEsSUFBTSxPQUFPLEtBQUs7QUFBQSxFQUd4QyxJQUFJLE1BQU0sUUFBUSxDQUFDLEtBQUssTUFBTSxRQUFRLENBQUMsR0FBRztBQUFBLElBQ3hDLElBQUksRUFBRSxXQUFXLEVBQUU7QUFBQSxNQUFRLE9BQU87QUFBQSxJQUNsQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssUUFBUSxhQUFhLEtBQUssRUFBRSxJQUFJLENBQUM7QUFBQSxFQUN4RDtBQUFBLEVBR0EsSUFBSSxPQUFPLE1BQU0sWUFBWSxPQUFPLE1BQU0sVUFBVTtBQUFBLElBQ2xELE1BQU0sUUFBUSxPQUFPLEtBQUssQ0FBVztBQUFBLElBQ3JDLE1BQU0sUUFBUSxPQUFPLEtBQUssQ0FBVztBQUFBLElBQ3JDLElBQUksTUFBTSxXQUFXLE1BQU07QUFBQSxNQUFRLE9BQU87QUFBQSxJQUMxQyxPQUFPLE1BQU0sTUFBTSxDQUFDLFFBQ2xCLGFBQ0csRUFBOEIsTUFDOUIsRUFBOEIsSUFDakMsQ0FDRjtBQUFBLEVBQ0Y7QUFBQSxFQUlBLE9BQU8sS0FBSztBQUFBO0FBTVAsSUFBTSxpQkFBaUIsQ0FDNUIsU0FDQSxZQUNZO0FBQUEsRUFDWixNQUFNLFVBQVUsSUFBSSxJQUFJLENBQUMsR0FBRyxPQUFPLEtBQUssT0FBTyxHQUFHLEdBQUcsT0FBTyxLQUFLLE9BQU8sQ0FBQyxDQUFDO0FBQUEsRUFFMUUsV0FBVyxPQUFPLFNBQVM7QUFBQSxJQUN6QixJQUFJLENBQUMsYUFBYSxRQUFRLE1BQU0sUUFBUSxJQUFJLEdBQUc7QUFBQSxNQUM3QyxPQUFPO0FBQUEsSUFDVDtBQUFBLEVBQ0Y7QUFBQSxFQUVBLE9BQU87QUFBQTtBQU1GLElBQU0sb0JBQW9CLENBQy9CLFNBQ0EsWUFDYTtBQUFBLEVBQ2IsTUFBTSxXQUFxQixDQUFDO0FBQUEsRUFDNUIsTUFBTSxVQUFVLElBQUksSUFBSSxDQUFDLEdBQUcsT0FBTyxLQUFLLE9BQU8sR0FBRyxHQUFHLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQztBQUFBLEVBRTFFLFdBQVcsT0FBTyxTQUFTO0FBQUEsSUFDekIsSUFBSSxDQUFDLGFBQWEsUUFBUSxNQUFNLFFBQVEsSUFBSSxHQUFHO0FBQUEsTUFDN0MsU0FBUyxPQUFPLFFBQVE7QUFBQSxJQUMxQjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLE9BQU87QUFBQTs7O0FDL0lULElBQU0sY0FBYyxDQUFDLFFBQW1DO0FBQUEsRUFDdEQsSUFBSSxDQUFDLE9BQU8sT0FBTyxRQUFRO0FBQUEsSUFBVSxPQUFPO0FBQUEsRUFFNUMsTUFBTSxZQUFZO0FBQUEsRUFHbEIsSUFBSSxDQUFDLFVBQVUsV0FBVyxFQUFFLFVBQVUsbUJBQW1CLGNBQWM7QUFBQSxJQUNyRSxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBR0EsT0FDRSxPQUFPLFVBQVUsYUFBYSxjQUM5QixPQUFPLFVBQVUsYUFBYTtBQUFBO0FBWTNCLElBQU0sZ0JBQWdCLENBQUMsVUFBaUM7QUFBQSxFQUM3RCxJQUFJLE9BQU8sTUFBTSxhQUFhLFlBQVk7QUFBQSxJQUN4QyxPQUFPLE1BQU0sU0FBUztBQUFBLEVBQ3hCO0FBQUEsRUFHQSxNQUFNLFdBQVc7QUFBQSxFQUNqQixJQUFJLFdBQVcsVUFBVTtBQUFBLElBQ3ZCLE9BQU8sU0FBUztBQUFBLEVBQ2xCO0FBQUEsRUFFQTtBQUFBO0FBYUssSUFBTSxnQkFBZ0IsQ0FDM0IsT0FDQSxPQUNBLFNBQWtCLFVBQ1Q7QUFBQSxFQUNULE1BQU0sV0FBVztBQUFBLEVBSWpCLE1BQU0sb0JBQW9CLGVBQWUsWUFBWSxVQUFVO0FBQUEsRUFFL0QsSUFBSSxVQUFVLENBQUMsbUJBQW1CO0FBQUEsSUFHaEMsTUFBTSxRQUFRLFNBQVM7QUFBQSxJQUl2QixJQUFJLE9BQU87QUFBQSxNQUdULElBQUksaUJBQWlCLG9CQUFvQixNQUFNLFNBQVMsWUFBWTtBQUFBLFFBQ2xFLE1BQU0sa0JBQ0osVUFBVSxRQUFRLFVBQVUsVUFBVSxVQUFVO0FBQUEsUUFDbEQsTUFBTSxVQUFVO0FBQUEsUUFFaEIsTUFBTSxVQUFVLFNBQVM7QUFBQSxRQUN6QixJQUFJLFNBQVM7QUFBQSxVQUNYLE1BQU0sWUFBWSxNQUFNLEtBQUssUUFBUSxTQUFTO0FBQUEsVUFDOUMsTUFBTSxZQUFZLFVBQVUsS0FDMUIsQ0FBQyxNQUFNLEVBQUUsV0FBVyxPQUFPLEtBQUssQ0FBQyxFQUFFLFNBQVMsSUFBSSxDQUNsRDtBQUFBLFVBQ0EsSUFBSSxXQUFXO0FBQUEsWUFDYixRQUFRLFVBQVUsT0FBTyxHQUFHLHNCQUFzQixlQUFlO0FBQUEsVUFDbkU7QUFBQSxRQUNGO0FBQUEsTUFDRixFQUFPO0FBQUEsUUFFTCxNQUFNLFFBQVMsU0FBb0I7QUFBQSxRQUVuQyxNQUFNLFVBQVUsU0FBUztBQUFBLFFBQ3pCLElBQUksU0FBUztBQUFBLFVBQ1gsTUFBTSxZQUFZLE1BQU0sS0FBSyxRQUFRLFNBQVM7QUFBQSxVQUM5QyxNQUFNLFlBQVksVUFBVSxLQUMxQixDQUFDLE1BQU0sRUFBRSxXQUFXLE9BQU8sS0FBSyxDQUFDLEVBQUUsU0FBUyxJQUFJLENBQ2xEO0FBQUEsVUFDQSxJQUFJLFdBQVc7QUFBQSxZQUNiLE1BQU0sVUFBVSxDQUFDLE1BQU07QUFBQSxZQUN2QixRQUFRLFVBQVUsT0FBTyxHQUFHLG9CQUFvQixPQUFPO0FBQUEsVUFDekQ7QUFBQSxRQUNGO0FBQUE7QUFBQSxNQUVGO0FBQUEsSUFDRjtBQUFBLEVBR0Y7QUFBQSxFQUdBLElBQUksT0FBTyxNQUFNLGFBQWEsWUFBWTtBQUFBLElBQ3hDLE1BQU0sU0FBUyxLQUFLO0FBQUEsSUFDcEI7QUFBQSxFQUNGO0FBQUEsRUFHQSxJQUFJLFdBQVcsVUFBVTtBQUFBLElBQ3ZCLFNBQVMsUUFBUTtBQUFBLEVBQ25CO0FBQUE7QUFPRixJQUFNLGdCQUFnQixDQUNwQixJQUNBLFdBQzREO0FBQUEsRUFDNUQsTUFBTSxTQUE0QixJQUFJO0FBQUEsRUFDdEMsTUFBTSxRQUEyQixJQUFJO0FBQUEsRUFFckMsSUFBSSxDQUFDO0FBQUEsSUFBSSxPQUFPLEVBQUUsUUFBUSxNQUFNO0FBQUEsRUFFaEMsWUFBWSxNQUFNLGVBQWMsT0FBTyxRQUFRLEVBQUUsR0FBRztBQUFBLElBRWxELElBQUksQ0FBQyxZQUFZLFVBQVM7QUFBQSxNQUFHO0FBQUEsSUFFN0IsSUFBSSxZQUFZLElBQUksR0FBRztBQUFBLE1BRXJCLE1BQU0sWUFBWSxpQkFBaUIsSUFBSTtBQUFBLE1BQ3ZDLE9BQU8sSUFBSSxXQUFXLFVBQVM7QUFBQSxJQUNqQyxFQUFPLFNBQUksV0FBVyxJQUFJLEdBQUc7QUFBQSxNQUUzQixNQUFNLFdBQVcsaUJBQWlCLElBQUk7QUFBQSxNQUN0QyxNQUFNLElBQUksVUFBVSxVQUFTO0FBQUEsSUFDL0I7QUFBQSxFQUNGO0FBQUEsRUFFQSxPQUFPLEVBQUUsUUFBUSxNQUFNO0FBQUE7QUFPekIsSUFBTSxjQUFjLENBQUMsR0FBZSxNQUEyQjtBQUFBLEVBRTdELElBQUksTUFBTTtBQUFBLElBQUcsT0FBTztBQUFBLEVBQ3BCLElBQUksS0FBSyxRQUFRLEtBQUs7QUFBQSxJQUFNLE9BQU87QUFBQSxFQUduQyxJQUFJLE1BQU0sUUFBUSxDQUFDLEtBQUssTUFBTSxRQUFRLENBQUMsR0FBRztBQUFBLElBQ3hDLElBQUksRUFBRSxXQUFXLEVBQUU7QUFBQSxNQUFRLE9BQU87QUFBQSxJQUNsQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssTUFBTSxRQUFRLEVBQUUsRUFBRTtBQUFBLEVBQ3pDO0FBQUEsRUFFQSxPQUFPO0FBQUE7QUFpQlQsSUFBSSxvQkFBb0Q7QUFtQmpELElBQU0seUJBQXlCLENBQUMsV0FBb0M7QUFBQSxFQUN6RSxJQUFJLG1CQUFtQjtBQUFBLElBQ3JCLFlBQVksTUFBTSxVQUFVLFFBQVE7QUFBQSxNQUNsQyxrQkFBa0IsSUFBSSxNQUFNLGNBQWMsS0FBSyxDQUFDO0FBQUEsSUFDbEQ7QUFBQSxFQUNGO0FBQUE7QUFPSyxJQUFNLHlCQUF5QixNQUFZO0FBQUEsRUFDaEQsb0JBQW9CLElBQUk7QUFBQTtBQUcxQixJQUFNLGtCQUFrQixDQUN0QixRQUNBLGtCQUNTO0FBQUEsRUFFVCxJQUFJLENBQUMsbUJBQW1CO0FBQUEsSUFDdEIsb0JBQW9CLElBQUk7QUFBQSxFQUMxQjtBQUFBLEVBRUEsTUFBTSxvQkFBb0I7QUFBQSxFQUUxQixZQUFZLE1BQU0sVUFBVSxRQUFRO0FBQUEsSUFDbEMsSUFBSSxPQUFPLE1BQU0sT0FBTyxZQUFZO0FBQUEsTUFFbEMsa0JBQWtCLElBQUksTUFBTSxjQUFjLEtBQUssQ0FBQztBQUFBLE1BR2hELE1BQU0sZUFBZSxNQUFNO0FBQUEsUUFDekIsTUFBTSxRQUFRLGNBQWMsS0FBSztBQUFBLFFBQ2pDLE1BQU0sWUFBWSxrQkFBa0IsSUFBSSxJQUFJO0FBQUEsUUFHNUMsSUFBSSxDQUFDLFlBQVksT0FBTyxTQUFTLEdBQUc7QUFBQSxVQUNsQyxrQkFBa0IsSUFBSSxNQUFNLEtBQUs7QUFBQSxVQUNqQyxjQUFjLE1BQU0sS0FBSztBQUFBLFFBQzNCO0FBQUE7QUFBQSxNQUlGLE1BQU0sR0FBRyxTQUFTLFlBQVk7QUFBQSxNQUk5QixNQUFNLEdBQUcsVUFBVSxZQUFZO0FBQUEsSUFDakM7QUFBQSxFQUNGO0FBQUE7QUFPSyxJQUFNLGFBQWEsQ0FBQyxXQUF1QjtBQUFBLEVBQ2hELE9BQU8sQ0FDTCxlQU9HO0FBQUEsSUFFSCxRQUFRLFFBQVEsVUFBVSxjQUFjLFdBQVUsTUFBTSxDQUFDLEdBQUcsTUFBTTtBQUFBLElBSWxFLHVCQUF1QjtBQUFBLElBR3ZCLElBQUksV0FBVSxNQUFNO0FBQUEsTUFDbEIsZ0JBQWdCLFFBQVEsQ0FBQyxNQUFNLFVBQVU7QUFBQSxRQUN2QyxXQUFVLE9BQU8sZ0JBQWdCLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFBQSxRQUNoRCxXQUFVLE9BQU8sVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQUEsT0FDM0M7QUFBQSxNQUdELGdCQUFnQixPQUFPLENBQUMsTUFBTSxVQUFVO0FBQUEsUUFDdEMsV0FBVSxPQUFPLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUFBLFFBQy9DLFdBQVUsT0FBTyxVQUFVLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFBQSxPQUMzQztBQUFBLElBQ0g7QUFBQSxJQUVBLE9BQU87QUFBQSxTQUNGO0FBQUEsTUFDSDtBQUFBLE1BQ0E7QUFBQSxNQUtBLFFBQVEsQ0FBQyxNQUFxQztBQUFBLFFBQzVDLE9BQU8sT0FBTyxJQUFJLElBQUk7QUFBQTtBQUFBLE1BTXhCLGFBQWEsR0FBYTtBQUFBLFFBQ3hCLE9BQU8sTUFBTSxLQUFLLE9BQU8sS0FBSyxDQUFDO0FBQUE7QUFBQSxNQU1qQyxRQUFRLENBQUMsTUFBdUI7QUFBQSxRQUM5QixPQUFPLE9BQU8sSUFBSSxJQUFJO0FBQUE7QUFBQSxJQUUxQjtBQUFBO0FBQUE7O0FDbFRKLElBQU0sbUJBQW1CLENBQUMsV0FBd0M7QUFBQSxFQUNoRSxNQUFNLE9BQWlCLENBQUM7QUFBQSxFQUV4QixZQUFZLE1BQU0sVUFBVSxRQUFRO0FBQUEsSUFDbEMsTUFBTSxRQUFRLGNBQWMsS0FBSztBQUFBLElBQ2pDLElBQUksVUFBVSxXQUFXO0FBQUEsTUFDdkIsS0FBSyxRQUFRO0FBQUEsSUFDZjtBQUFBLEVBQ0Y7QUFBQSxFQUVBLE9BQU87QUFBQTtBQU9ULElBQU0sZ0JBQWdCLENBQ3BCLFFBQ0EsTUFDQSxTQUFrQixVQUNUO0FBQUEsRUFDVCxZQUFZLE1BQU0sVUFBVSxRQUFRO0FBQUEsSUFFbEMsSUFBSSxRQUFRLE1BQU07QUFBQSxNQUNoQixjQUFjLE9BQU8sS0FBSyxPQUFPLE1BQU07QUFBQSxNQUN2QztBQUFBLElBQ0Y7QUFBQSxJQUlBLE1BQU0sUUFBUSxlQUFlLE1BQU0sSUFBSTtBQUFBLElBQ3ZDLElBQUksVUFBVSxXQUFXO0FBQUEsTUFDdkIsY0FBYyxPQUFPLE9BQXFCLE1BQU07QUFBQSxJQUNsRDtBQUFBLEVBQ0Y7QUFBQTtBQU1GLElBQU0saUJBQWlCLENBQ3JCLEtBQ0EsU0FDWTtBQUFBLEVBQ1osTUFBTSxRQUFRLEtBQUssTUFBTSxHQUFHO0FBQUEsRUFDNUIsSUFBSSxVQUFtQjtBQUFBLEVBRXZCLFdBQVcsUUFBUSxPQUFPO0FBQUEsSUFDeEIsSUFBSSxZQUFZLFFBQVEsWUFBWSxXQUFXO0FBQUEsTUFDN0M7QUFBQSxJQUNGO0FBQUEsSUFDQSxJQUFJLE9BQU8sWUFBWSxVQUFVO0FBQUEsTUFDL0I7QUFBQSxJQUNGO0FBQUEsSUFDQSxVQUFXLFFBQW9DO0FBQUEsRUFDakQ7QUFBQSxFQUVBLE9BQU87QUFBQTtBQThDVCxJQUFNLHlCQUF5QixDQUM3QixXQUN5QjtBQUFBLEVBQ3pCLElBQUksQ0FBQyxRQUFRO0FBQUEsSUFDWCxPQUFPLEVBQUUsY0FBYyxPQUFPLGlCQUFpQixNQUFNO0FBQUEsRUFDdkQ7QUFBQSxFQUNBLElBQUksV0FBVyxNQUFNO0FBQUEsSUFDbkIsT0FBTyxFQUFFLGNBQWMsTUFBTSxpQkFBaUIsS0FBSztBQUFBLEVBQ3JEO0FBQUEsRUFDQSxPQUFPO0FBQUEsSUFDTCxjQUFjLE9BQU8sZ0JBQWdCO0FBQUEsSUFDckMsaUJBQWlCLE9BQU8sbUJBQW1CO0FBQUEsRUFDN0M7QUFBQTtBQU9LLElBQU0sV0FBVyxDQUFDLFdBQXVCO0FBQUEsRUFDOUMsT0FBTyxDQU1MLGVBWUc7QUFBQSxJQUVILE1BQU0sUUFBUSxtQkFBbUIsTUFBTTtBQUFBLElBR3ZDLE1BQU0sZ0JBQWdCLHVCQUF1QixPQUFPLGNBQWM7QUFBQSxJQUdsRSxJQUFJLHNCQUErRDtBQUFBLElBS25FLE1BQU0scUJBQXFCLENBQUMsTUFBK0I7QUFBQSxNQUN6RCxJQUFJLE1BQU0sVUFBVTtBQUFBLFFBRWxCLEVBQUUsZUFBZTtBQUFBLFFBRWpCLEVBQUUsY0FBYztBQUFBLE1BQ2xCO0FBQUE7QUFBQSxJQU1GLE1BQU0sdUJBQXVCLE1BQVk7QUFBQSxNQUN2QyxJQUFJLGNBQWMsZ0JBQWdCLENBQUMscUJBQXFCO0FBQUEsUUFDdEQsc0JBQXNCO0FBQUEsUUFDdEIsT0FBTyxpQkFBaUIsZ0JBQWdCLG1CQUFtQjtBQUFBLE1BQzdEO0FBQUE7QUFBQSxJQU1GLE1BQU0seUJBQXlCLE1BQVk7QUFBQSxNQUN6QyxJQUFJLHFCQUFxQjtBQUFBLFFBQ3ZCLE9BQU8sb0JBQW9CLGdCQUFnQixtQkFBbUI7QUFBQSxRQUM5RCxzQkFBc0I7QUFBQSxNQUN4QjtBQUFBO0FBQUEsSUFNRixNQUFNLDBCQUEwQixDQUFDLGFBQTRCO0FBQUEsTUFDM0QsSUFBSSxjQUFjLGNBQWM7QUFBQSxRQUM5QixJQUFJLFVBQVU7QUFBQSxVQUNaLHFCQUFxQjtBQUFBLFFBQ3ZCO0FBQUEsTUFHRjtBQUFBO0FBQUEsSUFJRixJQUFJLE9BQU8sUUFBUSxXQUFVLFFBQVE7QUFBQSxNQUNuQyxjQUFjLFdBQVUsUUFBUSxPQUFPLE1BQU0sSUFBSTtBQUFBLE1BQ2pELE1BQU0sY0FBYyxpQkFBaUIsV0FBVSxNQUFNO0FBQUEsTUFDckQsTUFBTSxjQUFjLEtBQUssTUFBTSxZQUFZO0FBQUEsTUFHM0MsdUJBQXVCLFdBQVUsTUFBTTtBQUFBLElBQ3pDO0FBQUEsSUFHQSxJQUFJLGNBQWMsY0FBYztBQUFBLE1BQzlCLHFCQUFxQjtBQUFBLElBQ3ZCO0FBQUEsSUFHQSxNQUFNLGVBQWUsQ0FBQyxVQUErQztBQUFBLE1BQ25FLE1BQU0sWUFBWSxNQUFNLFFBQVEsTUFBTTtBQUFBLE1BQ3RDLE1BQU0sY0FBYyxNQUFNO0FBQUEsTUFDMUIsTUFBTSxXQUFXLGVBQWUsTUFBTSxhQUFhLE1BQU0sV0FBVztBQUFBLE1BR3BFLElBQUksZ0JBQWdCLE1BQU0sVUFBVTtBQUFBLFFBQ2xDLHdCQUF3QixNQUFNLFFBQVE7QUFBQSxNQUN4QztBQUFBLE1BSUEsSUFBSSxnQkFBZ0IsTUFBTSxVQUFVO0FBQUEsUUFDbEMsV0FBVSxPQUFPLFlBQVksY0FBYztBQUFBLFVBQ3pDLFVBQVUsTUFBTTtBQUFBLFVBQ2hCLE9BQU8sTUFBTSxXQUFXLFdBQVcsUUFBUSxXQUFXO0FBQUEsVUFDdEQsTUFBTSxNQUFNO0FBQUEsVUFDWixPQUFPLE1BQU07QUFBQSxRQUNmLENBQUM7QUFBQSxNQUNIO0FBQUE7QUFBQSxJQUlGLElBQUksV0FBVSxJQUFJO0FBQUEsTUFDaEIsV0FBVSxHQUFHLGdCQUFnQixZQUFZO0FBQUEsTUFFekMsV0FBVSxHQUFHLGVBQWUsWUFBWTtBQUFBLElBQzFDO0FBQUEsSUFLQSxNQUFNLGlCQUFpQixDQUFDLE1BQWdCLFdBQTBCO0FBQUEsTUFDaEUsY0FBYyxXQUFVLFFBQVEsTUFBTSxNQUFNO0FBQUEsTUFDNUMsTUFBTSxjQUFjLGlCQUFpQixXQUFVLE1BQU07QUFBQSxNQUVyRCxJQUFJLFFBQVE7QUFBQSxRQUdWLE1BQU0sY0FBYyxLQUFLLE1BQU0sWUFBWTtBQUFBLFFBQzNDLE1BQU0sV0FBVztBQUFBLFFBRWpCLHVCQUF1QixXQUFVLE1BQU07QUFBQSxRQUV2Qyx3QkFBd0IsS0FBSztBQUFBLE1BQy9CLEVBQU87QUFBQSxRQUNMLFdBQVUsT0FBTyxZQUFZLFVBQVUsTUFBTSxXQUFXO0FBQUE7QUFBQTtBQUFBLElBTzVELE1BQU0sZUFBZSxNQUFZO0FBQUEsTUFDL0IsY0FBYyxXQUFVLFFBQVEsTUFBTSxhQUFhLElBQUk7QUFBQSxNQUN2RCxNQUFNLGNBQWMsS0FBSyxNQUFNLFlBQVk7QUFBQSxNQUMzQyxNQUFNLFdBQVc7QUFBQSxNQUNqQixNQUFNLFNBQVMsQ0FBQztBQUFBLE1BRWhCLHdCQUF3QixLQUFLO0FBQUEsTUFFN0IsV0FBVSxPQUFPLFlBQVksY0FBYztBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUNWLE9BQU8sV0FBVztBQUFBLE1BQ3BCLENBQUM7QUFBQSxNQUNELFdBQVUsT0FBTyxZQUFZLEtBQUs7QUFBQTtBQUFBLElBTXBDLE1BQU0sZUFBZSxNQUFZO0FBQUEsTUFDL0IsTUFBTSxZQUFzQixDQUFDO0FBQUEsTUFDN0IsV0FBVyxRQUFRLFdBQVUsT0FBTyxLQUFLLEdBQUc7QUFBQSxRQUMxQyxVQUFVLFFBQVE7QUFBQSxNQUNwQjtBQUFBLE1BQ0EsY0FBYyxXQUFVLFFBQVEsV0FBVyxJQUFJO0FBQUEsTUFDL0MsTUFBTSxjQUFjLENBQUM7QUFBQSxNQUNyQixNQUFNLGNBQWMsQ0FBQztBQUFBLE1BQ3JCLE1BQU0sV0FBVztBQUFBLE1BRWpCLHdCQUF3QixLQUFLO0FBQUEsTUFFN0IsV0FBVSxPQUFPLFlBQVksY0FBYztBQUFBLFFBQ3pDLFVBQVU7QUFBQSxRQUNWLE9BQU8sV0FBVztBQUFBLE1BQ3BCLENBQUM7QUFBQSxNQUNELFdBQVUsT0FBTyxZQUFZLEtBQUs7QUFBQTtBQUFBLElBR3BDLE1BQU0sV0FBVztBQUFBLFNBQ1o7QUFBQSxNQUNIO0FBQUEsTUFLQSxPQUFPLEdBQWE7QUFBQSxRQUVsQixNQUFNLE9BQU8saUJBQWlCLFdBQVUsTUFBTTtBQUFBLFFBQzlDLE1BQU0sY0FBYztBQUFBLFFBQ3BCLFdBQVUsT0FBTyxZQUFZLFVBQVUsSUFBSTtBQUFBLFFBQzNDLE9BQU87QUFBQTtBQUFBLE1BWVQsT0FBTyxDQUFDLE1BQWdCLFNBQWtCLE9BQWE7QUFBQSxRQU1yRCxJQUFJLGNBQWMsbUJBQW1CLE1BQU0sWUFBWSxDQUFDLFFBQVE7QUFBQSxVQUU5RCxJQUFJLFlBQVk7QUFBQSxVQUNoQixJQUFJLFlBQVk7QUFBQSxVQUVoQixNQUFNLGdCQUFtQztBQUFBLFlBQ3ZDLGFBQWEsS0FBSyxNQUFNLFlBQVk7QUFBQSxZQUNwQyxTQUFTO0FBQUEsWUFDVCxXQUFXO0FBQUEsWUFDWCxRQUFRLE1BQU07QUFBQSxjQUNaLFlBQVk7QUFBQSxjQUNaLGNBQWMsWUFBWTtBQUFBO0FBQUEsWUFFNUIsU0FBUyxNQUFNO0FBQUEsY0FDYixZQUFZO0FBQUEsY0FDWixlQUFlLE1BQU0sTUFBTTtBQUFBO0FBQUEsVUFFL0I7QUFBQSxVQUdBLFdBQVUsT0FBTyxZQUFZLGVBQWUsYUFBYTtBQUFBLFVBR3pELElBQUksV0FBVztBQUFBLFlBQ2I7QUFBQSxVQUNGO0FBQUEsVUFHQSxJQUFJLFdBQVc7QUFBQSxZQUNiO0FBQUEsVUFDRjtBQUFBLFFBSUY7QUFBQSxRQUdBLGVBQWUsTUFBTSxNQUFNO0FBQUE7QUFBQSxNQU03QixhQUFhLENBQUMsTUFBMEI7QUFBQSxRQUN0QyxNQUFNLFFBQVEsV0FBVSxPQUFPLElBQUksSUFBSTtBQUFBLFFBQ3ZDLElBQUksT0FBTztBQUFBLFVBQ1QsT0FBTyxjQUFjLEtBQUs7QUFBQSxRQUM1QjtBQUFBLFFBQ0EsT0FBTyxNQUFNLFlBQVk7QUFBQTtBQUFBLE1BTTNCLGFBQWEsQ0FDWCxNQUNBLE9BQ0EsU0FBa0IsT0FDWjtBQUFBLFFBQ04sTUFBTSxRQUFRLFdBQVUsT0FBTyxJQUFJLElBQUk7QUFBQSxRQUN2QyxJQUFJLE9BQU87QUFBQSxVQUNULGNBQWMsT0FBTyxPQUFPLE1BQU07QUFBQSxVQUNsQyxNQUFNLFlBQVksUUFBUTtBQUFBLFVBQzFCLE1BQU0sV0FBVyxlQUFlLE1BQU0sYUFBYSxNQUFNLFdBQVc7QUFBQSxVQUdwRSx3QkFBd0IsTUFBTSxRQUFRO0FBQUEsVUFFdEMsSUFBSSxDQUFDLFFBQVE7QUFBQSxZQUNYLFdBQVUsT0FBTyxZQUFZLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUFBLFlBQzFELFdBQVUsT0FBTyxZQUFZLFFBQVEsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUFBLFVBQ3REO0FBQUEsUUFDRjtBQUFBO0FBQUEsTUFNRixVQUFVLEdBQVk7QUFBQSxRQUNwQixNQUFNLGNBQWMsaUJBQWlCLFdBQVUsTUFBTTtBQUFBLFFBQ3JELE1BQU0sV0FBVyxlQUFlLE1BQU0sYUFBYSxXQUFXO0FBQUEsUUFDOUQsT0FBTyxNQUFNO0FBQUE7QUFBQSxNQU1mLGVBQWUsR0FBYTtBQUFBLFFBQzFCLE1BQU0sY0FBYyxpQkFBaUIsV0FBVSxNQUFNO0FBQUEsUUFDckQsT0FBTyxrQkFBa0IsTUFBTSxhQUFhLFdBQVc7QUFBQTtBQUFBLE1BT3pELFFBQVEsR0FBUztBQUFBLFFBQ2YsTUFBTSxjQUFjLEtBQUssaUJBQWlCLFdBQVUsTUFBTSxFQUFFO0FBQUEsUUFDNUQsTUFBTSxjQUFjLEtBQUssTUFBTSxZQUFZO0FBQUEsUUFDM0MsTUFBTSxXQUFXO0FBQUEsUUFFakIsd0JBQXdCLEtBQUs7QUFBQSxRQUU3QixXQUFVLE9BQU8sWUFBWSxjQUFjO0FBQUEsVUFDekMsVUFBVTtBQUFBLFVBQ1YsT0FBTyxXQUFXO0FBQUEsUUFDcEIsQ0FBQztBQUFBO0FBQUEsTUFhSCxLQUFLLENBQUMsUUFBaUIsT0FBZ0I7QUFBQSxRQUNyQyxhQUFhO0FBQUEsUUFDYixPQUFPO0FBQUE7QUFBQSxNQWFULEtBQUssQ0FBQyxRQUFpQixPQUFnQjtBQUFBLFFBQ3JDLGFBQWE7QUFBQSxRQUNiLE9BQU87QUFBQTtBQUFBLElBRVg7QUFBQSxJQUlBLE1BQU0sb0JBQW9CLFdBQVU7QUFBQSxJQUNwQyxJQUFJLG1CQUFtQjtBQUFBLE1BQ3JCLE1BQU0sa0JBQWtCLGtCQUFrQjtBQUFBLE1BQzFDLGtCQUFrQixVQUFVLE1BQU07QUFBQSxRQUVoQyx1QkFBdUI7QUFBQSxRQUV2QixrQkFBa0I7QUFBQTtBQUFBLElBRXRCO0FBQUEsSUFFQSxPQUFPO0FBQUE7QUFBQTs7QUMvZVgsSUFBTSxtQkFBbUIsQ0FDdkIsU0FDQSxVQUNBLFFBQ0Esa0JBQ1M7QUFBQSxFQUNULE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxrQkFBa0IsYUFBYTtBQUFBLEVBQ2xFLFFBQVEsVUFBVSxPQUFPLGVBQWUsUUFBUTtBQUFBO0FBTWxELElBQU0sbUJBQW1CLENBQ3ZCLFFBQ0EsWUFDUztBQUFBLEVBQ1QsY0FBYyxVQUFVLFFBQVE7QUFBQSxJQUM5QixJQUFJLFdBQVcsT0FBTyxNQUFNLFdBQVcsWUFBWTtBQUFBLE1BQ2pELE1BQU0sT0FBTztBQUFBLElBQ2YsRUFBTyxTQUFJLENBQUMsV0FBVyxPQUFPLE1BQU0sWUFBWSxZQUFZO0FBQUEsTUFDMUQsTUFBTSxRQUFRO0FBQUEsSUFDaEI7QUFBQSxFQUNGO0FBQUE7QUFNRixJQUFNLG9CQUFvQixDQUN4QixJQUNBLGlCQUMyQjtBQUFBLEVBQzNCLE1BQU0sV0FBVyxJQUFJO0FBQUEsRUFFckIsV0FBVyxRQUFRLGNBQWM7QUFBQSxJQUMvQixNQUFNLFVBQVUsR0FBRztBQUFBLElBQ25CLElBQUksV0FBVyxPQUFPLFlBQVksWUFBWSxhQUFhLFNBQVM7QUFBQSxNQUNsRSxTQUFTLElBQUksTUFBTSxPQUFvQjtBQUFBLElBQ3pDO0FBQUEsRUFDRjtBQUFBLEVBRUEsT0FBTztBQUFBO0FBTVQsSUFBTSxxQkFBcUIsQ0FDekIsVUFDQSxZQUNTO0FBQUEsRUFDVCxjQUFjLFlBQVksVUFBVTtBQUFBLElBQ2xDLElBQUksV0FBVyxPQUFPLFFBQVEsV0FBVyxZQUFZO0FBQUEsTUFDbkQsUUFBUSxPQUFPO0FBQUEsSUFDakIsRUFBTyxTQUFJLENBQUMsV0FBVyxPQUFPLFFBQVEsWUFBWSxZQUFZO0FBQUEsTUFDNUQsUUFBUSxRQUFRO0FBQUEsSUFDbEI7QUFBQSxFQUNGO0FBQUE7QUFPSyxJQUFNLGlCQUFpQixDQUFDLFdBQXVCO0FBQUEsRUFDcEQsT0FBTyxDQVFMLGVBUUc7QUFBQSxJQUNILE1BQU0sU0FBUyxPQUFPLFVBQVUsY0FBYztBQUFBLElBQzlDLE1BQU0sZ0JBQWdCLE9BQU8saUJBQWlCLGNBQWM7QUFBQSxJQUM1RCxNQUFNLGVBQWUsT0FBTyxXQUN4QixDQUFDLEdBQUcsT0FBTyxRQUFRLElBQ25CLENBQUMsR0FBRyxjQUFjLFFBQVE7QUFBQSxJQUc5QixNQUFNLFdBQVcsZUFDYixrQkFBa0IsV0FBVSxNQUFNLENBQUMsR0FBRyxZQUFZLElBQ2xELElBQUk7QUFBQSxJQUdSLElBQUksU0FBUyxPQUFPLEdBQUc7QUFBQSxNQUNyQixtQkFBbUIsVUFBVSxLQUFLO0FBQUEsSUFDcEM7QUFBQSxJQUVBLE1BQU0sV0FBVztBQUFBLFNBQ1o7QUFBQSxNQUNIO0FBQUEsTUFLQSxZQUFZLEdBQVc7QUFBQSxRQUNyQixPQUFPLFdBQVUsTUFBTSxXQUNuQixXQUFXLFFBQ1gsV0FBVztBQUFBO0FBQUEsTUFNakIsY0FBYyxHQUFTO0FBQUEsUUFDckIsbUJBQW1CLFVBQVUsSUFBSTtBQUFBO0FBQUEsTUFNbkMsZUFBZSxHQUFTO0FBQUEsUUFDdEIsbUJBQW1CLFVBQVUsS0FBSztBQUFBO0FBQUEsTUFNcEMsWUFBWSxHQUFTO0FBQUEsUUFDbkIsaUJBQWlCLFdBQVUsUUFBUSxJQUFJO0FBQUEsUUFDdkMsV0FBVSxNQUFNLFdBQVc7QUFBQTtBQUFBLE1BTTdCLGFBQWEsR0FBUztBQUFBLFFBQ3BCLGlCQUFpQixXQUFVLFFBQVEsS0FBSztBQUFBLFFBQ3hDLFdBQVUsTUFBTSxXQUFXO0FBQUE7QUFBQSxJQUUvQjtBQUFBLElBR0EsSUFBSSxPQUFPLGVBQWUsU0FBUyxXQUFVLElBQUk7QUFBQSxNQUMvQyxXQUFVLEdBQ1IsWUFBWSxjQUNaLENBQUMsVUFBZ0Q7QUFBQSxRQUMvQyxJQUFJLE1BQU0sVUFBVTtBQUFBLFVBRWxCLG1CQUFtQixVQUFVLElBQUk7QUFBQSxRQUNuQyxFQUFPO0FBQUEsVUFFTCxtQkFBbUIsVUFBVSxLQUFLO0FBQUE7QUFBQSxRQUlwQyxJQUFJLFdBQVUsU0FBUztBQUFBLFVBQ3JCLGlCQUNFLFdBQVUsU0FDVixNQUFNLFVBQ04sUUFDQSxhQUNGO0FBQUEsUUFDRjtBQUFBLE9BRUo7QUFBQSxJQUNGO0FBQUEsSUFFQSxPQUFPO0FBQUE7QUFBQTs7QUN0S1gsSUFBTSxrQkFBMEM7QUFBQSxFQUM5QyxRQUFRO0FBQUEsRUFDUixnQkFBZ0I7QUFDbEI7QUFLQSxJQUFNLGVBQWUsQ0FDbkIsTUFDQSxVQUN5QjtBQUFBLEVBQ3pCLE1BQU0sU0FBaUMsQ0FBQztBQUFBLEVBQ3hDLElBQUksUUFBUTtBQUFBLEVBRVosV0FBVyxRQUFRLE9BQU87QUFBQSxJQUN4QixNQUFNLFFBQVEsS0FBSyxLQUFLO0FBQUEsSUFDeEIsTUFBTSxTQUFTLEtBQUssU0FBUyxPQUFPLElBQUk7QUFBQSxJQUV4QyxJQUFJLFdBQVcsT0FBTztBQUFBLE1BQ3BCLFFBQVE7QUFBQSxNQUNSLE9BQU8sS0FBSyxTQUFTLEtBQUssV0FBVyxHQUFHLEtBQUs7QUFBQSxJQUMvQyxFQUFPLFNBQUksT0FBTyxXQUFXLFVBQVU7QUFBQSxNQUNyQyxRQUFRO0FBQUEsTUFDUixPQUFPLEtBQUssU0FBUztBQUFBLElBQ3ZCO0FBQUEsRUFDRjtBQUFBLEVBRUEsT0FBTyxFQUFFLE9BQU8sT0FBTztBQUFBO0FBTXpCLElBQU0sZ0JBQWdCLENBQ3BCLFdBQ0EsTUFDQSxVQUN1QjtBQUFBLEVBQ3ZCLE1BQU0sYUFBYSxNQUFNLE9BQU8sQ0FBQyxTQUFTLEtBQUssVUFBVSxTQUFTO0FBQUEsRUFFbEUsV0FBVyxRQUFRLFlBQVk7QUFBQSxJQUM3QixNQUFNLFFBQVEsS0FBSyxLQUFLO0FBQUEsSUFDeEIsTUFBTSxTQUFTLEtBQUssU0FBUyxPQUFPLElBQUk7QUFBQSxJQUV4QyxJQUFJLFdBQVcsT0FBTztBQUFBLE1BQ3BCLE9BQU8sS0FBSyxXQUFXLEdBQUcsS0FBSztBQUFBLElBQ2pDLEVBQU8sU0FBSSxPQUFPLFdBQVcsVUFBVTtBQUFBLE1BQ3JDLE9BQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUFBLEVBRUE7QUFBQTtBQU1GLElBQU0saUJBQWlCLE9BQ3JCLEtBQ0EsTUFDQSxZQUNxQjtBQUFBLEVBQ3JCLE1BQU0sU0FBUyxRQUFRLFVBQVU7QUFBQSxFQUNqQyxNQUFNLFVBQVUsS0FBSyxvQkFBb0IsUUFBUSxRQUFRO0FBQUEsRUFFekQsTUFBTSxlQUE0QjtBQUFBLElBQ2hDO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFBQSxFQUdBLElBQUksV0FBVyxPQUFPO0FBQUEsSUFDcEIsYUFBYSxPQUFPLEtBQUssVUFBVSxJQUFJO0FBQUEsRUFDekM7QUFBQSxFQUVBLE1BQU0sV0FBVyxNQUFNLE1BQU0sS0FBSyxZQUFZO0FBQUEsRUFHOUMsTUFBTSxjQUFjLFNBQVMsUUFBUSxJQUFJLGNBQWM7QUFBQSxFQUN2RCxJQUFJO0FBQUEsRUFFSixJQUFJLGVBQWUsWUFBWSxTQUFTLGtCQUFrQixHQUFHO0FBQUEsSUFDM0QsU0FBUyxNQUFNLFNBQVMsS0FBSztBQUFBLEVBQy9CLEVBQU87QUFBQSxJQUNMLFNBQVMsTUFBTSxTQUFTLEtBQUs7QUFBQTtBQUFBLEVBSS9CLElBQUksQ0FBQyxTQUFTLElBQUk7QUFBQSxJQUVoQixJQUFJLGVBQWUsUUFBUSxTQUFTLFdBQVcsU0FBUztBQUFBLElBQ3hELElBQUksVUFBVSxPQUFPLFdBQVcsVUFBVTtBQUFBLE1BQ3hDLE1BQU0sY0FBZSxPQUFtQztBQUFBLE1BQ3hELElBQUksT0FBTyxnQkFBZ0IsVUFBVTtBQUFBLFFBQ25DLGVBQWU7QUFBQSxNQUNqQjtBQUFBLElBQ0Y7QUFBQSxJQUNBLE1BQU0sUUFBUSxJQUFJLE1BQU0sWUFBWTtBQUFBLElBQ25DLE1BQXdDLFdBQVc7QUFBQSxJQUNwRCxNQUFNO0FBQUEsRUFDUjtBQUFBLEVBRUEsT0FBTztBQUFBO0FBT0YsSUFBTSxhQUFhLENBQUMsV0FBdUI7QUFBQSxFQUNoRCxPQUFPLENBYUwsZUFVRztBQUFBLElBRUgsSUFBSSxrQkFBa0IsT0FBTyxjQUFjLENBQUM7QUFBQSxJQUc1QyxNQUFNLGVBQWUsT0FBTywyQkFBMkI7QUFBQSxJQUt2RCxNQUFNLGlCQUFpQixDQUNyQixXQUNBLFVBQ1M7QUFBQSxNQUNULE1BQU0sUUFBUSxXQUFVLE9BQU8sSUFBSSxTQUFTO0FBQUEsTUFDNUMsSUFBSSxTQUFTLE9BQU8sTUFBTSxhQUFhLFlBQVk7QUFBQSxRQUNqRCxJQUFJLE9BQU87QUFBQSxVQUVULE1BQU0sU0FBUyxNQUFNLGVBQWUsUUFBUSxTQUFTO0FBQUEsUUFDdkQsRUFBTztBQUFBLFVBRUwsTUFBTSxTQUFTLE9BQU8sRUFBRTtBQUFBO0FBQUEsTUFFNUI7QUFBQTtBQUFBLElBTUYsTUFBTSxxQkFBcUIsQ0FBQyxXQUF5QztBQUFBLE1BRW5FLFlBQVksY0FBYyxXQUFVLFFBQVE7QUFBQSxRQUMxQyxlQUFlLFdBQVcsU0FBUztBQUFBLE1BQ3JDO0FBQUEsTUFFQSxZQUFZLFdBQVcsVUFBVSxPQUFPLFFBQVEsTUFBTSxHQUFHO0FBQUEsUUFDdkQsZUFBZSxXQUFXLEtBQUs7QUFBQSxNQUNqQztBQUFBO0FBQUEsSUFJRixJQUFJLFdBQVUsSUFBSTtBQUFBLE1BRWhCLFdBQVUsR0FBRyxTQUFTLE1BQU07QUFBQSxRQUMxQixtQkFBbUIsQ0FBQyxDQUFDO0FBQUEsT0FDdEI7QUFBQSxNQUVELFdBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxVQUFtQjtBQUFBLFFBQy9DLFFBQVEsU0FBUztBQUFBLFFBR2pCLElBQUksV0FBVSxNQUFNLE9BQU8sT0FBTztBQUFBLFVBQ2hDLE1BQU0sT0FBTyxXQUFVLFFBQVE7QUFBQSxVQUMvQixNQUFNLFFBQVEsY0FBYyxNQUFNLE1BQU0sZUFBZTtBQUFBLFVBRXZELElBQUksT0FBTztBQUFBLFlBRVQsV0FBVSxNQUFNLE9BQU8sUUFBUTtBQUFBLFlBQy9CLGVBQWUsTUFBTSxLQUFLO0FBQUEsVUFDNUIsRUFBTztBQUFBLFlBRUwsT0FBTyxXQUFVLE1BQU0sT0FBTztBQUFBLFlBQzlCLGVBQWUsTUFBTSxTQUFTO0FBQUE7QUFBQSxRQUVsQztBQUFBLE9BQ0Q7QUFBQSxJQUNIO0FBQUEsSUFFQSxNQUFNLFdBQVc7QUFBQSxTQUNaO0FBQUEsTUFPSCxRQUFRLEdBQXlCO0FBQUEsUUFDL0IsTUFBTSxPQUFPLFdBQVUsUUFBUTtBQUFBLFFBQy9CLE1BQU0sU0FBUyxhQUFhLE1BQU0sZUFBZTtBQUFBLFFBR2pELFdBQVUsTUFBTSxTQUFTLE9BQU87QUFBQSxRQUdoQyxtQkFBbUIsT0FBTyxNQUFNO0FBQUEsUUFHaEMsSUFBSSxDQUFDLE9BQU8sT0FBTztBQUFBLFVBQ2pCLFdBQVUsT0FBTyxZQUFZLGtCQUFrQixPQUFPLE1BQU07QUFBQSxRQUM5RDtBQUFBLFFBRUEsT0FBTztBQUFBO0FBQUEsTUFPVCxhQUFhLENBQUMsV0FBdUM7QUFBQSxRQUNuRCxNQUFNLE9BQU8sV0FBVSxRQUFRO0FBQUEsUUFDL0IsTUFBTSxRQUFRLGNBQWMsV0FBVyxNQUFNLGVBQWU7QUFBQSxRQUU1RCxJQUFJLE9BQU87QUFBQSxVQUNULFdBQVUsTUFBTSxPQUFPLGFBQWE7QUFBQSxRQUN0QyxFQUFPO0FBQUEsVUFDTCxPQUFPLFdBQVUsTUFBTSxPQUFPO0FBQUE7QUFBQSxRQUdoQyxlQUFlLFdBQVcsS0FBSztBQUFBLFFBQy9CLE9BQU87QUFBQTtBQUFBLFdBUUgsT0FBTSxDQUFDLFVBQTZCLENBQUMsR0FBcUI7QUFBQSxRQUU5RCxJQUFJLFdBQVUsTUFBTSxZQUFZO0FBQUEsVUFDOUIsT0FBTyxRQUFRLE9BQU8sSUFBSSxNQUFNLDRCQUE0QixDQUFDO0FBQUEsUUFDL0Q7QUFBQSxRQUdBLElBQUksUUFBUSxhQUFhLFNBQVMsZ0JBQWdCLFNBQVMsR0FBRztBQUFBLFVBQzVELE1BQU0sYUFBYSxLQUFLLFNBQVM7QUFBQSxVQUNqQyxJQUFJLENBQUMsV0FBVyxPQUFPO0FBQUEsWUFDckIsT0FBTyxRQUFRLE9BQU8sSUFBSSxNQUFNLG1CQUFtQixDQUFDO0FBQUEsVUFDdEQ7QUFBQSxRQUNGO0FBQUEsUUFHQSxXQUFVLE1BQU0sYUFBYTtBQUFBLFFBRzdCLFdBQVUsZ0JBQWdCO0FBQUEsUUFHMUIsSUFBSSxXQUFVLFNBQVM7QUFBQSxVQUNyQixNQUFNLFNBQVMsT0FBTyxVQUFVO0FBQUEsVUFDaEMsTUFBTSxnQkFBZ0IsT0FBTyxpQkFBaUI7QUFBQSxVQUM5QyxXQUFVLFFBQVEsVUFBVSxJQUMxQixHQUFHLFVBQVUsa0JBQWtCLGFBQWEsWUFDOUM7QUFBQSxRQUNGO0FBQUEsUUFHQSxNQUFNLE9BQU8sV0FBVSxRQUFRO0FBQUEsUUFDL0IsV0FBVSxPQUFPLFlBQVksUUFBUSxJQUFJO0FBQUEsUUFFekMsSUFBSTtBQUFBLFVBQ0YsSUFBSTtBQUFBLFVBR0osSUFBSSxRQUFRLFNBQVM7QUFBQSxZQUNuQixTQUFTLE1BQU0sUUFBUSxRQUNyQixNQUNBLFVBQ0Y7QUFBQSxVQUNGLEVBQU8sU0FBSSxPQUFPLFFBQVE7QUFBQSxZQUV4QixTQUFTLE1BQU0sZUFBZSxPQUFPLFFBQVEsTUFBTTtBQUFBLGNBQ2pELFFBQVEsUUFBUSxVQUFVLE9BQU8sVUFBVTtBQUFBLGNBQzNDLFNBQVMsUUFBUTtBQUFBLFlBQ25CLENBQUM7QUFBQSxVQUNILEVBQU87QUFBQSxZQUVMLFNBQVM7QUFBQTtBQUFBLFVBSVgsV0FBVSxNQUFNLGFBQWE7QUFBQSxVQUM3QixXQUFVLE1BQU0sU0FBUyxDQUFDO0FBQUEsVUFHMUIsSUFBSSxXQUFVLFNBQVM7QUFBQSxZQUNyQixNQUFNLFNBQVMsT0FBTyxVQUFVO0FBQUEsWUFDaEMsTUFBTSxnQkFBZ0IsT0FBTyxpQkFBaUI7QUFBQSxZQUM5QyxXQUFVLFFBQVEsVUFBVSxPQUMxQixHQUFHLFVBQVUsa0JBQWtCLGFBQWEsWUFDOUM7QUFBQSxVQUNGO0FBQUEsVUFJQSxXQUFVLFNBQVM7QUFBQSxVQUduQixXQUFVLGdCQUFnQjtBQUFBLFVBRzFCLFdBQVUsT0FBTyxZQUFZLGdCQUFnQixNQUFNO0FBQUEsVUFFbkQsT0FBTztBQUFBLFVBQ1AsT0FBTyxPQUFPO0FBQUEsVUFFZCxXQUFVLE1BQU0sYUFBYTtBQUFBLFVBRzdCLElBQUksV0FBVSxTQUFTO0FBQUEsWUFDckIsTUFBTSxTQUFTLE9BQU8sVUFBVTtBQUFBLFlBQ2hDLE1BQU0sZ0JBQWdCLE9BQU8saUJBQWlCO0FBQUEsWUFDOUMsV0FBVSxRQUFRLFVBQVUsT0FDMUIsR0FBRyxVQUFVLGtCQUFrQixhQUFhLFlBQzlDO0FBQUEsVUFDRjtBQUFBLFVBR0EsV0FBVSxlQUFlO0FBQUEsVUFHekIsV0FBVSxPQUFPLFlBQVksY0FBYyxLQUFLO0FBQUEsVUFFaEQsTUFBTTtBQUFBO0FBQUE7QUFBQSxNQU9WLGtCQUFrQixDQUFDLE9BQW1DO0FBQUEsUUFDcEQsa0JBQWtCO0FBQUE7QUFBQSxNQU1wQixXQUFXLEdBQVM7QUFBQSxRQUNsQixXQUFVLE1BQU0sU0FBUyxDQUFDO0FBQUEsUUFDMUIsbUJBQW1CLENBQUMsQ0FBQztBQUFBO0FBQUEsTUFNdkIsZUFBZSxDQUFDLE9BQXFCO0FBQUEsUUFDbkMsT0FBTyxXQUFVLE1BQU0sT0FBTztBQUFBLFFBQzlCLGVBQWUsT0FBTyxTQUFTO0FBQUE7QUFBQSxNQU1qQyxhQUFhLENBQUMsT0FBZSxPQUFxQjtBQUFBLFFBQ2hELFdBQVUsTUFBTSxPQUFPLFNBQVM7QUFBQSxRQUNoQyxlQUFlLE9BQU8sS0FBSztBQUFBO0FBQUEsTUFNN0IsYUFBYSxDQUFDLE9BQW1DO0FBQUEsUUFDL0MsT0FBTyxXQUFVLE1BQU0sT0FBTztBQUFBO0FBQUEsSUFFbEM7QUFBQSxJQUVBLE9BQU87QUFBQTtBQUFBOztBQ3hZWCxJQUFNLDBCQUF5QixDQUM3QixXQUN5QjtBQUFBLEVBQ3pCLElBQUksQ0FBQyxRQUFRO0FBQUEsSUFDWCxPQUFPLEVBQUUsY0FBYyxPQUFPLGlCQUFpQixNQUFNO0FBQUEsRUFDdkQ7QUFBQSxFQUNBLElBQUksV0FBVyxNQUFNO0FBQUEsSUFDbkIsT0FBTyxFQUFFLGNBQWMsTUFBTSxpQkFBaUIsS0FBSztBQUFBLEVBQ3JEO0FBQUEsRUFDQSxPQUFPO0FBQUEsSUFDTCxjQUFjLE9BQU8sZ0JBQWdCO0FBQUEsSUFDckMsaUJBQWlCLE9BQU8sbUJBQW1CO0FBQUEsRUFDN0M7QUFBQTtBQU9LLElBQU0saUJBQWlCLENBQUMsV0FBdUI7QUFBQSxFQUNwRCxPQUFPLENBV0wsZUFDTTtBQUFBLElBRU4sTUFBTSxnQkFBZ0Isd0JBQXVCLE9BQU8sY0FBYztBQUFBLElBR2xFLElBQUksQ0FBQyxjQUFjLGlCQUFpQjtBQUFBLE1BQ2xDLE9BQU87QUFBQSxJQUNUO0FBQUEsSUFHQSxJQUFJLG1CQUFrQyxDQUFDO0FBQUEsSUFHdkMsSUFBSSxnQkFBcUM7QUFBQSxJQUl6QyxJQUFJLG9CQUFvQjtBQUFBLElBSXhCLElBQUksb0JBQW9CO0FBQUEsSUFHeEIsSUFBSSxnQkFBZ0I7QUFBQSxJQU1wQixNQUFNLHlCQUF5QixNQUFZO0FBQUEsTUFDekMsSUFBSSxpQkFBaUIsU0FBUztBQUFBLFFBQUc7QUFBQSxNQUVqQyxNQUFNLGNBQWMsV0FBVTtBQUFBLE1BQzlCLElBQUksQ0FBQztBQUFBLFFBQWE7QUFBQSxNQUdsQixNQUFNLE9BQU8sWUFBWSxzQkFBc0I7QUFBQSxNQUkvQyxNQUFNLGFBQWE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFRbkIsTUFBTSxhQUFhLFNBQVMsY0FBYyxLQUFLO0FBQUEsTUFDL0MsV0FBVyxZQUNUO0FBQUEsTUFDRixXQUFXLE1BQU0sVUFBVSxHQUFHO0FBQUE7QUFBQTtBQUFBO0FBQUEsa0JBSWxCLEtBQUs7QUFBQTtBQUFBLE1BSWpCLE1BQU0sZ0JBQWdCLFNBQVMsY0FBYyxLQUFLO0FBQUEsTUFDbEQsY0FBYyxZQUNaO0FBQUEsTUFDRixjQUFjLE1BQU0sVUFBVSxHQUFHO0FBQUEsZUFDeEIsS0FBSztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsTUFPZCxNQUFNLGNBQWMsU0FBUyxjQUFjLEtBQUs7QUFBQSxNQUNoRCxZQUFZLFlBQ1Y7QUFBQSxNQUNGLFlBQVksTUFBTSxVQUFVLEdBQUc7QUFBQSxlQUN0QixLQUFLO0FBQUE7QUFBQSxpQkFFSCxLQUFLO0FBQUEsa0JBQ0osS0FBSztBQUFBO0FBQUEsTUFJakIsTUFBTSxlQUFlLFNBQVMsY0FBYyxLQUFLO0FBQUEsTUFDakQsYUFBYSxZQUNYO0FBQUEsTUFDRixhQUFhLE1BQU0sVUFBVSxHQUFHO0FBQUEsZUFDdkIsS0FBSztBQUFBLGdCQUNKLEtBQUs7QUFBQTtBQUFBLGtCQUVILEtBQUs7QUFBQTtBQUFBLE1BSWpCLE1BQU0scUJBQXFCLENBQUMsTUFBd0I7QUFBQSxRQUNsRCxFQUFFLGVBQWU7QUFBQSxRQUNqQixFQUFFLGdCQUFnQjtBQUFBLFFBR2xCLE1BQU0sZ0JBQW1DO0FBQUEsVUFDdkMsYUFBYSxLQUFLLFdBQVUsTUFBTSxZQUFZO0FBQUEsVUFDOUMsU0FBUyxDQUFDO0FBQUEsVUFDVixXQUFXO0FBQUEsVUFDWCxRQUFRLE1BQU07QUFBQSxVQUdkLFNBQVMsTUFBTTtBQUFBLFlBR2Isb0JBQW9CO0FBQUEsWUFFcEIsV0FBVSxRQUFRLElBQUk7QUFBQSxZQUV0QixXQUFVLGNBQWM7QUFBQSxZQUV4QixXQUFVLGtCQUFrQjtBQUFBO0FBQUEsUUFFaEM7QUFBQSxRQUVBLFdBQVUsT0FBTyxZQUFZLGVBQWUsYUFBYTtBQUFBO0FBQUEsTUFHM0QsQ0FBQyxZQUFZLGVBQWUsYUFBYSxZQUFZLEVBQUUsUUFDckQsQ0FBQyxZQUFZO0FBQUEsUUFDWCxRQUFRLGlCQUFpQixTQUFTLGtCQUFrQjtBQUFBLFFBQ3BELFNBQVMsS0FBSyxZQUFZLE9BQU87QUFBQSxRQUNqQyxpQkFBaUIsS0FBSyxPQUFPO0FBQUEsT0FFakM7QUFBQTtBQUFBLElBTUYsTUFBTSx5QkFBeUIsTUFBWTtBQUFBLE1BQ3pDLElBQUksaUJBQWlCLFdBQVc7QUFBQSxRQUFHO0FBQUEsTUFFbkMsaUJBQWlCLFFBQVEsQ0FBQyxZQUFZO0FBQUEsUUFDcEMsUUFBUSxPQUFPO0FBQUEsT0FDaEI7QUFBQSxNQUNELG1CQUFtQixDQUFDO0FBQUE7QUFBQSxJQU10QixNQUFNLHlCQUF5QixNQUFZO0FBQUEsTUFDekMsSUFBSSxpQkFBaUIsV0FBVztBQUFBLFFBQUc7QUFBQSxNQUVuQyxNQUFNLGNBQWMsV0FBVTtBQUFBLE1BQzlCLElBQUksQ0FBQztBQUFBLFFBQWE7QUFBQSxNQUVsQixNQUFNLE9BQU8sWUFBWSxzQkFBc0I7QUFBQSxNQUcvQyxPQUFPLFlBQVksZUFBZSxhQUFhLGdCQUM3QztBQUFBLE1BRUYsSUFBSSxZQUFZO0FBQUEsUUFDZCxXQUFXLE1BQU0sU0FBUyxHQUFHLEtBQUs7QUFBQSxNQUNwQztBQUFBLE1BQ0EsSUFBSSxlQUFlO0FBQUEsUUFDakIsY0FBYyxNQUFNLE1BQU0sR0FBRyxLQUFLO0FBQUEsTUFDcEM7QUFBQSxNQUNBLElBQUksYUFBYTtBQUFBLFFBQ2YsWUFBWSxNQUFNLE1BQU0sR0FBRyxLQUFLO0FBQUEsUUFDaEMsWUFBWSxNQUFNLFFBQVEsR0FBRyxLQUFLO0FBQUEsUUFDbEMsWUFBWSxNQUFNLFNBQVMsR0FBRyxLQUFLO0FBQUEsTUFDckM7QUFBQSxNQUNBLElBQUksY0FBYztBQUFBLFFBQ2hCLGFBQWEsTUFBTSxNQUFNLEdBQUcsS0FBSztBQUFBLFFBQ2pDLGFBQWEsTUFBTSxPQUFPLEdBQUcsS0FBSztBQUFBLFFBQ2xDLGFBQWEsTUFBTSxTQUFTLEdBQUcsS0FBSztBQUFBLE1BQ3RDO0FBQUE7QUFBQSxJQU1GLE1BQU0sd0JBQXdCLENBQUMsYUFBNEI7QUFBQSxNQUN6RCxJQUFJLFlBQVksbUJBQW1CO0FBQUEsUUFDakMsdUJBQXVCO0FBQUEsUUFFdkIsSUFBSSxDQUFDLGVBQWU7QUFBQSxVQUNsQixnQkFBZ0I7QUFBQSxVQUNoQixPQUFPLGlCQUFpQixVQUFVLGFBQWE7QUFBQSxVQUMvQyxPQUFPLGlCQUFpQixVQUFVLGFBQWE7QUFBQSxRQUNqRDtBQUFBLE1BQ0YsRUFBTztBQUFBLFFBQ0wsdUJBQXVCO0FBQUEsUUFFdkIsSUFBSSxlQUFlO0FBQUEsVUFDakIsT0FBTyxvQkFBb0IsVUFBVSxhQUFhO0FBQUEsVUFDbEQsT0FBTyxvQkFBb0IsVUFBVSxhQUFhO0FBQUEsVUFDbEQsZ0JBQWdCO0FBQUEsUUFDbEI7QUFBQTtBQUFBO0FBQUEsSUFNSixXQUFVLEtBQUssZ0JBQWdCLE1BQU07QUFBQSxNQUduQyxJQUFJLGVBQWU7QUFBQSxRQUNqQjtBQUFBLE1BQ0Y7QUFBQSxNQUlBLElBQUkscUJBQXFCLENBQUMsbUJBQW1CO0FBQUEsUUFDM0Msb0JBQW9CO0FBQUEsUUFFcEIsSUFBSSxXQUFVLE1BQU0sVUFBVTtBQUFBLFVBQzVCLHNCQUFzQixJQUFJO0FBQUEsUUFDNUI7QUFBQSxNQUNGO0FBQUEsS0FDRDtBQUFBLElBR0QsV0FBVSxLQUFLLFlBQVksY0FBYyxDQUFDLFVBQWlDO0FBQUEsTUFHekUsSUFBSSxDQUFDLE1BQU0sVUFBVTtBQUFBLFFBQ25CLG9CQUFvQjtBQUFBLFFBQ3BCLG9CQUFvQjtBQUFBLFFBQ3BCLGdCQUFnQjtBQUFBLFFBSWhCLFdBQVcsTUFBTTtBQUFBLFVBQ2YsZ0JBQWdCO0FBQUEsV0FDZixHQUFHO0FBQUEsTUFDUjtBQUFBLE1BR0Esc0JBQXNCLE1BQU0sUUFBUTtBQUFBLEtBQ3JDO0FBQUEsSUFHRCxXQUFVLEtBQUssWUFBWSxPQUFPLE1BQU07QUFBQSxNQUN0QyxzQkFBc0IsS0FBSztBQUFBLEtBQzVCO0FBQUEsSUFHRCxNQUFNLG9CQUFvQixXQUFVO0FBQUEsSUFDcEMsSUFBSSxtQkFBbUI7QUFBQSxNQUNyQixNQUFNLGtCQUFrQixrQkFBa0I7QUFBQSxNQUMxQyxrQkFBa0IsVUFBVSxNQUFNO0FBQUEsUUFFaEMsdUJBQXVCO0FBQUEsUUFDdkIsSUFBSSxlQUFlO0FBQUEsVUFDakIsT0FBTyxvQkFBb0IsVUFBVSxhQUFhO0FBQUEsVUFDbEQsT0FBTyxvQkFBb0IsVUFBVSxhQUFhO0FBQUEsVUFDbEQsZ0JBQWdCO0FBQUEsUUFDbEI7QUFBQSxRQUVBLGtCQUFrQjtBQUFBO0FBQUEsSUFFdEI7QUFBQSxJQUVBLE9BQU87QUFBQTtBQUFBOztBQy9SWCxJQUFNLHFCQUFxQixDQUN6QixVQUNBLEtBQ0EsV0FDUztBQUFBLEVBRVQsTUFBTSxlQUFlLFNBQVMsSUFBSSxRQUFRO0FBQUEsRUFDMUMsSUFBSSxjQUFjLFNBQVM7QUFBQSxJQUN6QixhQUFhLFFBQVEsaUJBQWlCLFNBQVMsWUFBWTtBQUFBLE1BQ3pELElBQUksT0FBTyxVQUFVO0FBQUEsUUFLbkIsSUFBSTtBQUFBLFVBQ0YsTUFBTSxPQUFPLElBQUksUUFBUTtBQUFBLFVBQ3pCLE1BQU0sT0FBTyxTQUFTLE1BQU0sR0FBRztBQUFBLFVBQy9CLE9BQU8sT0FBTztBQUFBLFVBQ2QsUUFBUSxNQUFNLHNCQUFzQixLQUFLO0FBQUE7QUFBQSxNQUU3QyxFQUFPO0FBQUEsUUFFTCxNQUFNLElBQUksT0FBTztBQUFBO0FBQUEsS0FFcEI7QUFBQSxFQUNIO0FBQUEsRUFHQSxNQUFNLGVBQWUsU0FBUyxJQUFJLFFBQVE7QUFBQSxFQUMxQyxJQUFJLGNBQWMsU0FBUztBQUFBLElBQ3pCLGFBQWEsUUFBUSxpQkFBaUIsU0FBUyxNQUFNO0FBQUEsTUFDbkQsSUFBSSxPQUFPLFVBQVU7QUFBQSxRQUVuQixPQUFPLFNBQVMsR0FBRztBQUFBLE1BQ3JCLEVBQU87QUFBQSxRQUdMLElBQUksTUFBTSxJQUFJO0FBQUE7QUFBQSxNQUdoQixJQUFJLFlBQVk7QUFBQSxNQUVoQixJQUFJLGdCQUFnQjtBQUFBLEtBQ3JCO0FBQUEsRUFDSDtBQUFBO0FBOERLLElBQU0sV0FBVSxDQUFDLFdBQXVCO0FBQUEsRUFDN0MsT0FBTyxDQUFDLGVBQW9EO0FBQUEsSUFFMUQsSUFBSSxPQUFPLE1BQU0sV0FBVSxJQUFJO0FBQUEsTUFDN0IsWUFBWSxPQUFPLFlBQVksT0FBTyxRQUFRLE9BQU8sRUFBRSxHQUFHO0FBQUEsUUFDeEQsSUFBSSxPQUFPLFlBQVksWUFBWTtBQUFBLFVBQ2pDLFdBQVUsR0FBRyxPQUFPLE9BQU87QUFBQSxRQUM3QjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFHQSxNQUFNLE1BQXFCO0FBQUEsTUFFekIsU0FBUyxXQUFVO0FBQUEsTUFDbkIsTUFBTSxXQUFVO0FBQUEsTUFDaEIsSUFBSSxXQUFVO0FBQUEsTUFDZCxRQUFRLFdBQVU7QUFBQSxNQUNsQixPQUFPLFdBQVU7QUFBQSxNQVNqQixPQUFPLEdBQWE7QUFBQSxRQUNsQixPQUFPLFdBQVUsUUFBUTtBQUFBO0FBQUEsTUFRM0IsT0FBTyxDQUFDLE1BQWdCLFFBQWlDO0FBQUEsUUFDdkQsV0FBVSxRQUFRLE1BQU0sTUFBTTtBQUFBLFFBQzlCLE9BQU87QUFBQTtBQUFBLE1BT1QsYUFBYSxDQUFDLE1BQTBCO0FBQUEsUUFDdEMsT0FBTyxXQUFVLGNBQWMsSUFBSTtBQUFBO0FBQUEsTUFTckMsYUFBYSxDQUNYLE1BQ0EsT0FDQSxRQUNlO0FBQUEsUUFDZixXQUFVLGNBQWMsTUFBTSxPQUFPLE1BQU07QUFBQSxRQUMzQyxPQUFPO0FBQUE7QUFBQSxNQU9ULFFBQVEsQ0FBQyxNQUFxQztBQUFBLFFBQzVDLE9BQU8sV0FBVSxTQUFTLElBQUk7QUFBQTtBQUFBLE1BTWhDLGFBQWEsR0FBYTtBQUFBLFFBQ3hCLE9BQU8sV0FBVSxjQUFjO0FBQUE7QUFBQSxNQU1qQyxVQUFVLEdBQVk7QUFBQSxRQUNwQixPQUFPLFdBQVUsV0FBVztBQUFBO0FBQUEsTUFVOUIsWUFBWSxHQUFjO0FBQUEsUUFDeEIsT0FBTyxXQUFVLGFBQWE7QUFBQTtBQUFBLE1BWWhDLFFBQVEsR0FBeUI7QUFBQSxRQUMvQixPQUFPLFdBQVUsU0FBUztBQUFBO0FBQUEsTUFRNUIsYUFBYSxDQUFDLFdBQXVDO0FBQUEsUUFDbkQsT0FBTyxXQUFVLGNBQWMsU0FBUztBQUFBO0FBQUEsTUFNMUMsV0FBVyxHQUFrQjtBQUFBLFFBQzNCLFdBQVUsWUFBWTtBQUFBLFFBQ3RCLE9BQU87QUFBQTtBQUFBLE1BT1QsZUFBZSxDQUFDLE9BQThCO0FBQUEsUUFDNUMsV0FBVSxnQkFBZ0IsS0FBSztBQUFBLFFBQy9CLE9BQU87QUFBQTtBQUFBLE1BUVQsYUFBYSxDQUFDLE9BQWUsT0FBOEI7QUFBQSxRQUN6RCxXQUFVLGNBQWMsT0FBTyxLQUFLO0FBQUEsUUFDcEMsT0FBTztBQUFBO0FBQUEsTUFRVCxhQUFhLENBQUMsT0FBbUM7QUFBQSxRQUMvQyxPQUFPLFdBQVUsY0FBYyxLQUFLO0FBQUE7QUFBQSxXQVdoQyxPQUFNLENBQUMsU0FBK0M7QUFBQSxRQUMxRCxPQUFPLFdBQVUsT0FBTyxPQUFPO0FBQUE7QUFBQSxNQVlqQyxLQUFLLENBQUMsT0FBMEI7QUFBQSxRQUM5QixPQUFPLFdBQVUsTUFBTSxLQUFLO0FBQUE7QUFBQSxNQVE5QixLQUFLLENBQUMsT0FBMEI7QUFBQSxRQUM5QixPQUFPLFdBQVUsTUFBTSxLQUFLO0FBQUE7QUFBQSxNQVE5QixRQUFRLEdBQVM7QUFBQSxRQUNmLFdBQVUsU0FBUztBQUFBO0FBQUEsTUFNckIsTUFBTSxHQUFrQjtBQUFBLFFBQ3RCLFdBQVUsYUFBYTtBQUFBLFFBQ3ZCLE9BQU87QUFBQTtBQUFBLE1BTVQsT0FBTyxHQUFrQjtBQUFBLFFBQ3ZCLFdBQVUsY0FBYztBQUFBLFFBQ3hCLE9BQU87QUFBQTtBQUFBLE1BTVQsY0FBYyxHQUFrQjtBQUFBLFFBQzlCLFdBQVUsZUFBZTtBQUFBLFFBQ3pCLE9BQU87QUFBQTtBQUFBLE1BTVQsZUFBZSxHQUFrQjtBQUFBLFFBQy9CLFdBQVUsZ0JBQWdCO0FBQUEsUUFDMUIsT0FBTztBQUFBO0FBQUEsTUFZVCxFQUFFLENBQUMsT0FBZSxTQUFrQztBQUFBLFFBQ2xELFdBQVUsS0FBSyxPQUFPLE9BQU87QUFBQSxRQUM3QixPQUFPO0FBQUE7QUFBQSxNQVFULEdBQUcsQ0FBQyxPQUFlLFNBQWtDO0FBQUEsUUFDbkQsV0FBVSxNQUFNLE9BQU8sT0FBTztBQUFBLFFBQzlCLE9BQU87QUFBQTtBQUFBLE1BUVQsSUFBSSxDQUFDLE9BQWUsTUFBc0I7QUFBQSxRQUN4QyxXQUFVLE9BQU8sT0FBTyxJQUFJO0FBQUE7QUFBQSxNQVU5QixPQUFPLEdBQVM7QUFBQSxRQUVkLGNBQWMsVUFBVSxXQUFVLFFBQVE7QUFBQSxVQUN4QyxJQUFJLE9BQU8sTUFBTSxZQUFZLFlBQVk7QUFBQSxZQUN2QyxNQUFNLFFBQVE7QUFBQSxVQUNoQjtBQUFBLFFBQ0Y7QUFBQSxRQUdBLGNBQWMsWUFBWSxXQUFVLFVBQVU7QUFBQSxVQUM1QyxJQUFJLE9BQU8sUUFBUSxZQUFZLFlBQVk7QUFBQSxZQUN6QyxRQUFRLFFBQVE7QUFBQSxVQUNsQjtBQUFBLFFBQ0Y7QUFBQSxRQUdBLElBQUksV0FBVSxXQUFXLFNBQVM7QUFBQSxVQUNoQyxXQUFVLFVBQVUsUUFBUTtBQUFBLFFBQzlCO0FBQUEsUUFHQSxJQUFJLFdBQVUsU0FBUyxZQUFZO0FBQUEsVUFDakMsV0FBVSxRQUFRLFdBQVcsWUFBWSxXQUFVLE9BQU87QUFBQSxRQUM1RDtBQUFBLFFBR0EsV0FBVSxPQUFPLFlBQVksS0FBSztBQUFBO0FBQUEsSUFFdEM7QUFBQSxJQUdBLG1CQUFtQixXQUFVLFVBQVUsS0FBSyxNQUFNO0FBQUEsSUFFbEQsT0FBTztBQUFBO0FBQUE7O0FUOVZKLElBQU0sYUFBYSxDQUFDLFNBQXFCLENBQUMsTUFBcUI7QUFBQSxFQUNwRSxJQUFJO0FBQUEsSUFFRixNQUFNLGFBQWEsaUJBQWlCLE1BQU07QUFBQSxJQUkxQyxNQUFNLGFBQVksbUJBRWhCLDBCQUdBLHlCQUFXLEdBR1gsMEJBQVksaUJBQWlCLFVBQVUsQ0FBQyxHQUd4QyxXQUFXLFVBQVUsR0FHckIsV0FBVyxVQUFVLEdBR3JCLFNBQVMsVUFBVSxHQUduQixlQUFlLFVBQVUsR0FHekIsV0FBVyxVQUFVLEdBR3JCLGVBQWUsVUFBVSxHQUd6Qiw0QkFBYyxHQUdkLFNBQVEsVUFBVSxDQUNwQixFQUFFLFVBQVU7QUFBQSxJQUdaLElBQUksT0FBTyxhQUFhLFdBQVUsU0FBUztBQUFBLE1BQ3pDLE9BQU8sVUFBVSxZQUFZLFdBQVUsT0FBTztBQUFBLElBQ2hEO0FBQUEsSUFFQSxPQUFPO0FBQUEsSUFDUCxPQUFPLE9BQU87QUFBQSxJQUNkLFFBQVEsTUFBTSx3QkFBd0IsS0FBSztBQUFBLElBQzNDLE1BQU0sSUFBSSxNQUFNLDBCQUEyQixNQUFnQixTQUFTO0FBQUE7QUFBQTs7QVVySW5ELElBQXJCO0FBQ3dDLElBQXhDO0FBQ3dELElBQXhEOzs7QUNNTyxJQUFNLHFCQUFxQjtBQUFBLEVBRWhDLFFBQVE7QUFBQSxFQUVSLE9BQU87QUFBQSxFQUVQLGVBQWU7QUFBQSxFQUVmLGlCQUFpQjtBQUFBLEVBRWpCLE1BQU07QUFBQSxFQUVOLE9BQU87QUFDVDtBQUtPLElBQU0sdUJBQXVCO0FBQUEsRUFFbEMsUUFBUTtBQUFBLEVBRVIsVUFBVTtBQUFBLEVBRVYsUUFBUTtBQUNWO0FBS08sSUFBTSx3QkFBd0I7QUFBQSxFQUVuQyxTQUFTO0FBQUEsRUFFVCxTQUFTO0FBQ1g7QUFLTyxJQUFNLG9CQUFvQjtBQUFBLEVBRS9CLEdBQUc7QUFBQSxFQUVILEdBQUc7QUFBQSxFQUVILEdBQUc7QUFDTDtBQUtPLElBQU0sZUFBZTtBQUFBLEVBQzFCLEdBQUc7QUFBQSxFQUNILEdBQUc7QUFBQSxFQUNILEdBQUc7QUFDTDtBQUtPLElBQU0sc0JBQXNCO0FBQUEsRUFDakMsTUFBTTtBQUFBLEVBR04sTUFBTTtBQUFBLEVBQ04sZUFBZTtBQUFBLEVBQ2YsYUFBYTtBQUFBLEVBR2IsS0FBSztBQUFBLEVBQ0wsWUFBWTtBQUFBLEVBQ1osWUFBWTtBQUFBLEVBR1osVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsaUJBQWlCO0FBQUEsRUFDakIsWUFBWTtBQUFBLEVBR1osU0FBUztBQUFBLEVBQ1QsT0FBTztBQUFBLEVBQ1AsYUFBYTtBQUFBLEVBR2IsV0FBVztBQUFBLEVBQ1gsVUFBVTtBQUFBLEVBR1YsVUFBVTtBQUFBLEVBQ1YsVUFBVTtBQUFBLEVBQ1YsTUFBTTtBQUFBLEVBQ04sY0FBYztBQUFBLEVBQ2QsU0FBUztBQUFBLEVBR1QsUUFBUTtBQUFBLEVBQ1IsVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUNWO0FBS08sSUFBTSx1QkFBdUI7QUFBQSxFQUVsQyxPQUFPO0FBQUEsRUFFUCxNQUFNLGtCQUFrQjtBQUFBLEVBRXhCLGFBQWEsYUFBYTtBQUFBLEVBRTFCLFlBQVk7QUFBQSxFQUVaLGNBQWM7QUFBQSxFQUVkLGVBQWU7QUFBQSxFQUVmLGNBQWM7QUFBQSxFQUVkLFNBQVMscUJBQXFCO0FBQUEsRUFFOUIsaUJBQWlCO0FBQ25CO0FBS08sSUFBTSxrQkFBa0I7QUFBQSxHQUM1QixrQkFBa0IsSUFBSTtBQUFBLElBQ3JCLE9BQU87QUFBQSxJQUNQLFlBQVk7QUFBQSxJQUNaLFdBQVc7QUFBQSxFQUNiO0FBQUEsR0FDQyxrQkFBa0IsSUFBSTtBQUFBLElBQ3JCLE9BQU87QUFBQSxJQUNQLFlBQVk7QUFBQSxJQUNaLFdBQVc7QUFBQSxFQUNiO0FBQUEsR0FDQyxrQkFBa0IsSUFBSTtBQUFBLElBQ3JCLE9BQU87QUFBQSxJQUNQLFlBQVk7QUFBQSxJQUNaLFdBQVc7QUFBQSxFQUNiO0FBQ0Y7QUFLTyxJQUFNLHVCQUF1QjtBQUFBLEVBQ2xDO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRjs7O0FDNUpPLElBQU0sV0FBVyxDQUFDLElBQVcsR0FBVyxNQUF3QjtBQUFBLEVBQ3JFLE1BQU0sUUFBUSxJQUFJO0FBQUEsRUFDbEIsTUFBTSxRQUFRLElBQUk7QUFBQSxFQUVsQixNQUFNLElBQUksUUFBUTtBQUFBLEVBQ2xCLE1BQU0sSUFBSSxLQUFLLElBQUksS0FBSyxJQUFNLEtBQUksS0FBTSxJQUFLLENBQUM7QUFBQSxFQUM5QyxNQUFNLElBQUksUUFBUTtBQUFBLEVBRWxCLElBQUksU0FBUztBQUFBLEVBQ2IsSUFBSSxTQUFTO0FBQUEsRUFDYixJQUFJLFNBQVM7QUFBQSxFQUViLElBQUksTUFBSyxLQUFLLEtBQUksSUFBSTtBQUFBLElBQ3BCLFNBQVM7QUFBQSxJQUNULFNBQVM7QUFBQSxJQUNULFNBQVM7QUFBQSxFQUNYLEVBQU8sU0FBSSxNQUFLLE1BQU0sS0FBSSxLQUFLO0FBQUEsSUFDN0IsU0FBUztBQUFBLElBQ1QsU0FBUztBQUFBLElBQ1QsU0FBUztBQUFBLEVBQ1gsRUFBTyxTQUFJLE1BQUssT0FBTyxLQUFJLEtBQUs7QUFBQSxJQUM5QixTQUFTO0FBQUEsSUFDVCxTQUFTO0FBQUEsSUFDVCxTQUFTO0FBQUEsRUFDWCxFQUFPLFNBQUksTUFBSyxPQUFPLEtBQUksS0FBSztBQUFBLElBQzlCLFNBQVM7QUFBQSxJQUNULFNBQVM7QUFBQSxJQUNULFNBQVM7QUFBQSxFQUNYLEVBQU8sU0FBSSxNQUFLLE9BQU8sS0FBSSxLQUFLO0FBQUEsSUFDOUIsU0FBUztBQUFBLElBQ1QsU0FBUztBQUFBLElBQ1QsU0FBUztBQUFBLEVBQ1gsRUFBTztBQUFBLElBQ0wsU0FBUztBQUFBLElBQ1QsU0FBUztBQUFBLElBQ1QsU0FBUztBQUFBO0FBQUEsRUFHWCxPQUFPO0FBQUEsSUFDTCxHQUFHLEtBQUssT0FBTyxTQUFTLEtBQUssR0FBRztBQUFBLElBQ2hDLEdBQUcsS0FBSyxPQUFPLFNBQVMsS0FBSyxHQUFHO0FBQUEsSUFDaEMsR0FBRyxLQUFLLE9BQU8sU0FBUyxLQUFLLEdBQUc7QUFBQSxFQUNsQztBQUFBO0FBVUssSUFBTSxXQUFXLENBQUMsR0FBVyxHQUFXLE1BQXdCO0FBQUEsRUFDckUsTUFBTSxRQUFRLElBQUk7QUFBQSxFQUNsQixNQUFNLFFBQVEsSUFBSTtBQUFBLEVBQ2xCLE1BQU0sUUFBUSxJQUFJO0FBQUEsRUFFbEIsTUFBTSxNQUFNLEtBQUssSUFBSSxPQUFPLE9BQU8sS0FBSztBQUFBLEVBQ3hDLE1BQU0sTUFBTSxLQUFLLElBQUksT0FBTyxPQUFPLEtBQUs7QUFBQSxFQUN4QyxNQUFNLFFBQVEsTUFBTTtBQUFBLEVBRXBCLElBQUksS0FBSTtBQUFBLEVBQ1IsSUFBSSxJQUFJO0FBQUEsRUFDUixNQUFNLElBQUksTUFBTTtBQUFBLEVBRWhCLElBQUksVUFBVSxHQUFHO0FBQUEsSUFDZixJQUFLLFFBQVEsTUFBTztBQUFBLElBRXBCLElBQUksUUFBUSxPQUFPO0FBQUEsTUFDakIsS0FBSSxPQUFRLFFBQVEsU0FBUyxRQUFTO0FBQUEsSUFDeEMsRUFBTyxTQUFJLFFBQVEsT0FBTztBQUFBLE1BQ3hCLEtBQUksT0FBTyxRQUFRLFNBQVMsUUFBUTtBQUFBLElBQ3RDLEVBQU87QUFBQSxNQUNMLEtBQUksT0FBTyxRQUFRLFNBQVMsUUFBUTtBQUFBO0FBQUEsRUFFeEM7QUFBQSxFQUVBLElBQUksS0FBSSxHQUFHO0FBQUEsSUFDVCxNQUFLO0FBQUEsRUFDUDtBQUFBLEVBRUEsT0FBTztBQUFBLElBQ0wsR0FBRyxLQUFLLE1BQU0sRUFBQztBQUFBLElBQ2YsR0FBRyxLQUFLLE1BQU0sQ0FBQztBQUFBLElBQ2YsR0FBRyxLQUFLLE1BQU0sQ0FBQztBQUFBLEVBQ2pCO0FBQUE7QUFVSyxJQUFNLFdBQVcsQ0FBQyxHQUFXLEdBQVcsTUFBc0I7QUFBQSxFQUNuRSxNQUFNLFFBQVEsQ0FBQyxNQUFzQjtBQUFBLElBQ25DLE1BQU0sTUFBTSxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksS0FBSyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUU7QUFBQSxJQUNqRSxPQUFPLElBQUksV0FBVyxJQUFJLE1BQU0sTUFBTTtBQUFBO0FBQUEsRUFFeEMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLE1BQU0sQ0FBQztBQUFBO0FBUW5DLElBQU0sV0FBVyxDQUFDLFFBQWlDO0FBQUEsRUFFeEQsTUFBTSxXQUFXLElBQUksUUFBUSxNQUFNLEVBQUU7QUFBQSxFQUdyQyxJQUFJLFVBQVU7QUFBQSxFQUNkLElBQUksU0FBUyxXQUFXLEdBQUc7QUFBQSxJQUN6QixVQUFVLFNBQ1AsTUFBTSxFQUFFLEVBQ1IsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQ2hCLEtBQUssRUFBRTtBQUFBLEVBQ1o7QUFBQSxFQUdBLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxPQUFPLEdBQUc7QUFBQSxJQUNyQyxPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsTUFBTSxNQUFNLFNBQVMsU0FBUyxFQUFFO0FBQUEsRUFDaEMsT0FBTztBQUFBLElBQ0wsR0FBSSxPQUFPLEtBQU07QUFBQSxJQUNqQixHQUFJLE9BQU8sSUFBSztBQUFBLElBQ2hCLEdBQUcsTUFBTTtBQUFBLEVBQ1g7QUFBQTtBQVVLLElBQU0sV0FBVyxDQUFDLElBQVcsR0FBVyxNQUFzQjtBQUFBLEVBQ25FLE1BQU0sTUFBTSxTQUFTLElBQUcsR0FBRyxDQUFDO0FBQUEsRUFDNUIsT0FBTyxTQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQUE7QUFROUIsSUFBTSxXQUFXLENBQUMsUUFBaUM7QUFBQSxFQUN4RCxNQUFNLE1BQU0sU0FBUyxHQUFHO0FBQUEsRUFDeEIsSUFBSSxDQUFDO0FBQUEsSUFBSyxPQUFPO0FBQUEsRUFDakIsT0FBTyxTQUFTLElBQUksR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQUE7QUFROUIsSUFBTSxhQUFhLENBQUMsUUFBeUI7QUFBQSxFQUNsRCxPQUFPLHNDQUFzQyxLQUFLLEdBQUc7QUFBQTtBQVFoRCxJQUFNLGVBQWUsQ0FBQyxRQUF3QjtBQUFBLEVBQ25ELElBQUksQ0FBQyxXQUFXLEdBQUc7QUFBQSxJQUFHLE9BQU87QUFBQSxFQUU3QixJQUFJLFdBQVcsSUFBSSxRQUFRLE1BQU0sRUFBRTtBQUFBLEVBR25DLElBQUksU0FBUyxXQUFXLEdBQUc7QUFBQSxJQUN6QixXQUFXLFNBQ1IsTUFBTSxFQUFFLEVBQ1IsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQ2hCLEtBQUssRUFBRTtBQUFBLEVBQ1o7QUFBQSxFQUVBLE9BQU8sSUFBSSxTQUFTLFlBQVk7QUFBQTtBQVUzQixJQUFNLFNBQVEsQ0FBQyxPQUFlLEtBQWEsUUFBd0I7QUFBQSxFQUN4RSxPQUFPLEtBQUssSUFBSSxLQUFLLElBQUksT0FBTyxHQUFHLEdBQUcsR0FBRztBQUFBO0FBUXBDLElBQU0sbUJBQW1CLENBQUMsUUFBd0I7QUFBQSxFQUN2RCxNQUFNLE1BQU0sU0FBUyxHQUFHO0FBQUEsRUFDeEIsSUFBSSxDQUFDO0FBQUEsSUFBSyxPQUFPO0FBQUEsRUFHakIsTUFBTSxhQUFhLFFBQVEsSUFBSSxJQUFJLFFBQVEsSUFBSSxJQUFJLFFBQVEsSUFBSSxLQUFLO0FBQUEsRUFFcEUsT0FBTyxZQUFZLE1BQU0sWUFBWTtBQUFBOzs7QUMxTWhDLElBQU0sZ0JBQW1DO0FBQUEsRUFDOUMsT0FBTyxxQkFBcUI7QUFBQSxFQUM1QixTQUFTLHFCQUFxQjtBQUFBLEVBQzlCLE1BQU0sa0JBQWtCO0FBQUEsRUFDeEIsU0FBUyxzQkFBc0I7QUFBQSxFQUMvQixZQUFZLHFCQUFxQjtBQUFBLEVBQ2pDLFdBQVcscUJBQXFCO0FBQUEsRUFDaEMsYUFBYSxxQkFBcUI7QUFBQSxFQUNsQyxjQUFjLHFCQUFxQjtBQUFBLEVBQ25DLFNBQVM7QUFBQSxFQUNULFVBQVU7QUFBQSxFQUNWLGFBQWEscUJBQXFCO0FBQUEsRUFDbEMsZUFBZSxxQkFBcUI7QUFBQSxFQUNwQyxVQUFVO0FBQUEsRUFDVixRQUFRO0FBQUEsRUFDUixlQUFlO0FBQ2pCO0FBV08sSUFBTSxvQkFBbUIsQ0FDOUIsU0FBNEIsQ0FBQyxNQXFCUjtBQUFBLEVBQ3JCLE9BQU87QUFBQSxPQUNGO0FBQUEsT0FDQTtBQUFBLElBQ0gsT0FBTyxPQUFPLFNBQVMsY0FBYztBQUFBLElBQ3JDLFNBQVMsT0FBTyxXQUFXLGNBQWM7QUFBQSxJQUN6QyxNQUFNLE9BQU8sUUFBUSxjQUFjO0FBQUEsSUFDbkMsU0FBUyxPQUFPLFdBQVcsY0FBYztBQUFBLElBQ3pDLFlBQVksT0FBTyxjQUFjLGNBQWM7QUFBQSxJQUMvQyxXQUFXLE9BQU8sYUFBYSxjQUFjO0FBQUEsSUFDN0MsYUFBYSxPQUFPLGVBQWUsY0FBYztBQUFBLElBQ2pELGNBQWMsT0FBTyxnQkFBZ0IsY0FBYztBQUFBLElBQ25ELFNBQVMsT0FBTyxXQUFXO0FBQUEsSUFDM0IsVUFBVSxPQUFPLFlBQVk7QUFBQSxJQUM3QixhQUFhLE9BQU8sZUFBZSxjQUFjO0FBQUEsSUFDakQsZUFBZSxPQUFPLGlCQUFpQixjQUFjO0FBQUEsSUFDckQsVUFBVSxPQUFPLFlBQVk7QUFBQSxJQUM3QixRQUFRLE9BQU8sVUFBVSxjQUFjO0FBQUEsSUFDdkMsZUFBZSxjQUFjO0FBQUEsRUFDL0I7QUFBQTtBQVdLLElBQU0sb0JBQW1CLENBQUMsV0FBOEI7QUFBQSxFQUM3RCxNQUFNLGFBQWEsa0JBQWtCLE9BQU8sUUFBUSxHQUFHO0FBQUEsRUFDdkQsTUFBTSxVQUFVLE9BQU8sV0FBVyxxQkFBcUI7QUFBQSxFQUN2RCxNQUFNLFVBQVUsT0FBTyxXQUFXLHNCQUFzQjtBQUFBLEVBR3hELElBQUk7QUFBQSxFQUNKLElBQUksWUFBWSxxQkFBcUIsVUFBVTtBQUFBLElBQzdDLGVBQWUsR0FBRyxPQUFPLFVBQVUsb0JBQW9CO0FBQUEsRUFDekQsRUFBTyxTQUFJLFlBQVkscUJBQXFCLFFBQVE7QUFBQSxJQUNsRCxlQUFlLEdBQUcsT0FBTyxVQUFVLG9CQUFvQjtBQUFBLEVBQ3pELEVBQU87QUFBQSxJQUNMLGVBQWUsR0FBRyxPQUFPLFVBQVUsb0JBQW9CO0FBQUE7QUFBQSxFQUl6RCxNQUFNLGVBQ0osWUFBWSxzQkFBc0IsVUFDOUIsR0FBRyxPQUFPLFVBQVUsb0JBQW9CLFlBQ3hDO0FBQUEsRUFFTixPQUFPO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxlQUFlLE9BQU87QUFBQSxJQUN0QixXQUFXLENBQUMsY0FBYyxjQUFjLE9BQU8sS0FBSyxFQUFFLE9BQ3BELE9BQ0Y7QUFBQSxJQUNBLE9BQU8sVUFBVSxXQUFXO0FBQUEsRUFDOUI7QUFBQTtBQVdLLElBQU0sb0JBQW9CLENBQy9CLFNBQzZEO0FBQUEsRUFDN0QsT0FDRSxnQkFBZ0IsU0FDaEIsZ0JBQWdCLGtCQUFrQjtBQUFBO0FBWS9CLElBQU0sc0JBQXFCLENBQ2hDLFdBQ3FCO0FBQUEsRUFDckIsTUFBTSxhQUF1QixTQUMzQixPQUFPLFNBQVMscUJBQXFCLEtBQ3ZDLEtBQUs7QUFBQSxJQUNILEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxJQUNILEdBQUc7QUFBQSxFQUNMO0FBQUEsRUFFQSxPQUFPO0FBQUEsSUFDTCxLQUFLO0FBQUEsSUFDTCxLQUFLLGFBQWEsT0FBTyxTQUFTLHFCQUFxQixLQUFLO0FBQUEsSUFDNUQsU0FBUyxPQUFPLFdBQVc7QUFBQSxJQUMzQixZQUFZO0FBQUEsSUFDWixZQUFZO0FBQUEsSUFDWixVQUFVLENBQUM7QUFBQSxJQUNYLFFBQVE7QUFBQSxJQUNSLE1BQU0sQ0FBQztBQUFBLEVBQ1Q7QUFBQTtBQVlLLElBQU0sZUFBZSxDQUFDLFVBNkN0QjtBQUFBLEVBQ0wsU0FBUyxLQUFLO0FBQUEsRUFDZCxRQUFRLEtBQUs7QUFBQSxFQUNiLFVBQVUsS0FBSztBQUFBLEVBQ2YsTUFBTSxLQUFLO0FBQUEsRUFDWCxJQUFJLEtBQUs7QUFBQSxFQUNULEtBQUssS0FBSztBQUFBLEVBQ1YsVUFBVSxLQUFLO0FBQUEsRUFDZixXQUFXLEtBQUs7QUFBQSxFQUNoQixPQUFPLEtBQUs7QUFBQSxFQUNaLE1BQU0sS0FBSztBQUFBLEVBQ1gsS0FBSyxLQUFLO0FBQUEsRUFDVixTQUFTLEtBQUs7QUFBQSxFQUNkLFVBQVUsS0FBSztBQUFBLEVBQ2YsT0FBTyxLQUFLO0FBQUEsRUFDWixTQUFTLEtBQUs7QUFDaEI7OztBQ3pOTyxJQUFNLFdBQ1gsQ0FBQyxXQUNELENBZ0JFLGVBQ3VEO0FBQUEsRUFDdkQsUUFBUSxTQUFTLFVBQVUsU0FBUztBQUFBLEVBR3BDLE1BQU0sUUFDSixXQUFVLFNBQVMsb0JBQW1CLE1BQU07QUFBQSxFQUc5QyxNQUFNLGFBQWEsa0JBQWtCLE9BQU8sUUFBUSxHQUFHO0FBQUEsRUFHdkQsTUFBTSxZQUFZLFdBQVUsaUJBQWlCO0FBQUEsRUFHN0MsTUFBTSxPQUFPLFNBQVMsY0FBYyxLQUFLO0FBQUEsRUFDekMsS0FBSyxZQUFZLFNBQVMsb0JBQW9CLElBQUk7QUFBQSxFQUNsRCxLQUFLLE1BQU0sU0FBUyxHQUFHLFdBQVc7QUFBQSxFQUdsQyxNQUFNLFdBQVcsU0FBUyxjQUFjLEtBQUs7QUFBQSxFQUM3QyxTQUFTLFlBQVksU0FBUyxvQkFBb0IsYUFBYTtBQUFBLEVBRy9ELE1BQU0sU0FBUyxTQUFTLGNBQWMsS0FBSztBQUFBLEVBQzNDLE9BQU8sWUFBWSxTQUFTLG9CQUFvQixXQUFXO0FBQUEsRUFFM0QsS0FBSyxZQUFZLFFBQVE7QUFBQSxFQUN6QixLQUFLLFlBQVksTUFBTTtBQUFBLEVBQ3ZCLFVBQVUsWUFBWSxJQUFJO0FBQUEsRUFLMUIsTUFBTSxtQkFBbUIsTUFBWTtBQUFBLElBQ25DLE1BQU0sV0FBVyxTQUFTLE1BQU0sSUFBSSxHQUFHLEtBQUssR0FBRztBQUFBLElBQy9DLFNBQVMsTUFBTSxhQUFhO0FBQUE7QUFBQSwwQ0FFUTtBQUFBO0FBQUE7QUFBQSxFQU90QyxNQUFNLGVBQWUsTUFBWTtBQUFBLElBQy9CLE1BQU0sSUFBSyxNQUFNLElBQUksSUFBSSxNQUFPLEtBQUs7QUFBQSxJQUNyQyxNQUFNLEtBQU0sTUFBTSxNQUFNLElBQUksS0FBSyxNQUFPLEtBQUs7QUFBQSxJQUM3QyxPQUFPLE1BQU0sT0FBTyxHQUFHO0FBQUEsSUFDdkIsT0FBTyxNQUFNLE1BQU0sR0FBRztBQUFBLElBQ3RCLE9BQU8sTUFBTSxrQkFBa0IsTUFBTTtBQUFBLElBQ3JDLE9BQU8sTUFBTSxjQUFjLGlCQUFpQixNQUFNLEdBQUc7QUFBQTtBQUFBLEVBTXZELE1BQU0saUJBQWlCLENBQUMsU0FBaUIsWUFBMEI7QUFBQSxJQUNqRSxNQUFNLE9BQU8sS0FBSyxzQkFBc0I7QUFBQSxJQUN4QyxNQUFNLElBQUksT0FBTSxVQUFVLEtBQUssTUFBTSxHQUFHLEtBQUssS0FBSztBQUFBLElBQ2xELE1BQU0sSUFBSSxPQUFNLFVBQVUsS0FBSyxLQUFLLEdBQUcsS0FBSyxNQUFNO0FBQUEsSUFFbEQsTUFBTSxJQUFLLElBQUksS0FBSyxRQUFTO0FBQUEsSUFDN0IsTUFBTSxJQUFJLE1BQU8sSUFBSSxLQUFLLFNBQVU7QUFBQSxJQUVwQyxNQUFNLElBQUksSUFBSSxLQUFLLE1BQU0sQ0FBQztBQUFBLElBQzFCLE1BQU0sSUFBSSxJQUFJLEtBQUssTUFBTSxDQUFDO0FBQUEsSUFDMUIsTUFBTSxNQUFNLFNBQVMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUM7QUFBQSxJQUcxRCxhQUFhO0FBQUEsSUFHYixNQUFNLEtBQUssT0FBTyxTQUFTO0FBQUEsSUFDM0IsTUFBTSxLQUFLLFNBQVMsbUJBQW1CO0FBQUEsSUFDdkMsTUFBTSxLQUFLLFNBQVMsZUFBZTtBQUFBLElBRW5DLEtBQUssbUJBQW1CLE9BQU8sTUFBTSxHQUFHO0FBQUEsSUFDeEMsT0FBTyxVQUFVLE1BQU0sR0FBRztBQUFBO0FBQUEsRUFNNUIsTUFBTSxrQkFBa0IsQ0FBQyxNQUF3QjtBQUFBLElBQy9DLElBQUksT0FBTztBQUFBLE1BQVU7QUFBQSxJQUNyQixFQUFFLGVBQWU7QUFBQSxJQUVqQixNQUFNLGFBQWE7QUFBQSxJQUNuQixNQUFNLGFBQWE7QUFBQSxJQUNuQixRQUFRLFVBQVUsSUFBSSxTQUFTLG9CQUFvQixRQUFRLENBQUM7QUFBQSxJQUU1RCxlQUFlLEVBQUUsU0FBUyxFQUFFLE9BQU87QUFBQSxJQUVuQyxTQUFTLGlCQUFpQixhQUFhLGVBQWU7QUFBQSxJQUN0RCxTQUFTLGlCQUFpQixXQUFXLGFBQWE7QUFBQTtBQUFBLEVBTXBELE1BQU0sa0JBQWtCLENBQUMsTUFBd0I7QUFBQSxJQUMvQyxJQUFJLENBQUMsTUFBTSxjQUFjLE1BQU0sZUFBZTtBQUFBLE1BQVE7QUFBQSxJQUN0RCxlQUFlLEVBQUUsU0FBUyxFQUFFLE9BQU87QUFBQTtBQUFBLEVBTXJDLE1BQU0sZ0JBQWdCLE1BQVk7QUFBQSxJQUNoQyxJQUFJLE1BQU0sY0FBYyxNQUFNLGVBQWUsUUFBUTtBQUFBLE1BQ25ELE1BQU0sYUFBYTtBQUFBLE1BQ25CLE1BQU0sYUFBYTtBQUFBLE1BQ25CLFFBQVEsVUFBVSxPQUFPLFNBQVMsb0JBQW9CLFFBQVEsQ0FBQztBQUFBLE1BRS9ELEtBQUssbUJBQW1CLFFBQVEsTUFBTSxHQUFHO0FBQUEsTUFDekMsT0FBTyxXQUFXLE1BQU0sR0FBRztBQUFBLElBQzdCO0FBQUEsSUFFQSxTQUFTLG9CQUFvQixhQUFhLGVBQWU7QUFBQSxJQUN6RCxTQUFTLG9CQUFvQixXQUFXLGFBQWE7QUFBQTtBQUFBLEVBTXZELE1BQU0sbUJBQW1CLENBQUMsTUFBd0I7QUFBQSxJQUNoRCxJQUFJLE9BQU87QUFBQSxNQUFVO0FBQUEsSUFDckIsRUFBRSxlQUFlO0FBQUEsSUFFakIsTUFBTSxhQUFhO0FBQUEsSUFDbkIsTUFBTSxhQUFhO0FBQUEsSUFDbkIsUUFBUSxVQUFVLElBQUksU0FBUyxvQkFBb0IsUUFBUSxDQUFDO0FBQUEsSUFFNUQsTUFBTSxRQUFRLEVBQUUsUUFBUTtBQUFBLElBQ3hCLGVBQWUsTUFBTSxTQUFTLE1BQU0sT0FBTztBQUFBLElBRTNDLFNBQVMsaUJBQWlCLGFBQWEsaUJBQWlCO0FBQUEsTUFDdEQsU0FBUztBQUFBLElBQ1gsQ0FBQztBQUFBLElBQ0QsU0FBUyxpQkFBaUIsWUFBWSxjQUFjO0FBQUE7QUFBQSxFQU10RCxNQUFNLGtCQUFrQixDQUFDLE1BQXdCO0FBQUEsSUFDL0MsSUFBSSxDQUFDLE1BQU0sY0FBYyxNQUFNLGVBQWU7QUFBQSxNQUFRO0FBQUEsSUFDdEQsRUFBRSxlQUFlO0FBQUEsSUFDakIsTUFBTSxRQUFRLEVBQUUsUUFBUTtBQUFBLElBQ3hCLGVBQWUsTUFBTSxTQUFTLE1BQU0sT0FBTztBQUFBO0FBQUEsRUFNN0MsTUFBTSxpQkFBaUIsTUFBWTtBQUFBLElBQ2pDLElBQUksTUFBTSxjQUFjLE1BQU0sZUFBZSxRQUFRO0FBQUEsTUFDbkQsTUFBTSxhQUFhO0FBQUEsTUFDbkIsTUFBTSxhQUFhO0FBQUEsTUFDbkIsUUFBUSxVQUFVLE9BQU8sU0FBUyxvQkFBb0IsUUFBUSxDQUFDO0FBQUEsTUFFL0QsS0FBSyxtQkFBbUIsUUFBUSxNQUFNLEdBQUc7QUFBQSxNQUN6QyxPQUFPLFdBQVcsTUFBTSxHQUFHO0FBQUEsSUFDN0I7QUFBQSxJQUVBLFNBQVMsb0JBQW9CLGFBQWEsZUFBZTtBQUFBLElBQ3pELFNBQVMsb0JBQW9CLFlBQVksY0FBYztBQUFBO0FBQUEsRUFJekQsS0FBSyxpQkFBaUIsYUFBYSxlQUFlO0FBQUEsRUFDbEQsS0FBSyxpQkFBaUIsY0FBYyxrQkFBa0IsRUFBRSxTQUFTLE1BQU0sQ0FBQztBQUFBLEVBR3hFLGlCQUFpQjtBQUFBLEVBQ2pCLGFBQWE7QUFBQSxFQUdiLE1BQU0sY0FBMkI7QUFBQSxJQUMvQixTQUFTO0FBQUEsSUFDVDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFBQSxFQUdBLE1BQU0sa0JBQW1CLFdBQWtCLFdBQVc7QUFBQSxFQUN0RCxJQUFJLGlCQUFpQjtBQUFBLElBQ2xCLFdBQWtCLFVBQVUsVUFBVSxNQUFNO0FBQUEsTUFDM0MsS0FBSyxvQkFBb0IsYUFBYSxlQUFlO0FBQUEsTUFDckQsS0FBSyxvQkFBb0IsY0FBYyxnQkFBZ0I7QUFBQSxNQUN2RCxTQUFTLG9CQUFvQixhQUFhLGVBQWU7QUFBQSxNQUN6RCxTQUFTLG9CQUFvQixXQUFXLGFBQWE7QUFBQSxNQUNyRCxTQUFTLG9CQUFvQixhQUFhLGVBQWU7QUFBQSxNQUN6RCxTQUFTLG9CQUFvQixZQUFZLGNBQWM7QUFBQSxNQUN2RCxnQkFBZ0I7QUFBQTtBQUFBLEVBRXBCO0FBQUEsRUFFQSxPQUFPO0FBQUEsT0FDRjtBQUFBLElBQ0g7QUFBQSxJQUNBLE1BQU07QUFBQSxFQUNSO0FBQUE7OztBQ3ZPRyxJQUFNLFVBQ1gsQ0FBQyxXQUNELENBY0UsZUFDcUQ7QUFBQSxFQUNyRCxRQUFRLFNBQVMsVUFBVSxTQUFTO0FBQUEsRUFHcEMsTUFBTSxRQUNKLFdBQVUsU0FBUyxvQkFBbUIsTUFBTTtBQUFBLEVBRzlDLE1BQU0sWUFBWSxXQUFVLGlCQUFpQjtBQUFBLEVBRzdDLE1BQU0sU0FBUyxTQUFTLGNBQWMsS0FBSztBQUFBLEVBQzNDLE9BQU8sWUFBWSxTQUFTLG9CQUFvQixHQUFHO0FBQUEsRUFHbkQsTUFBTSxRQUFRLFNBQVMsY0FBYyxLQUFLO0FBQUEsRUFDMUMsTUFBTSxZQUFZLFNBQVMsb0JBQW9CLFVBQVU7QUFBQSxFQUN6RCxPQUFPLFlBQVksS0FBSztBQUFBLEVBR3hCLE1BQU0sU0FBUyxTQUFTLGNBQWMsS0FBSztBQUFBLEVBQzNDLE9BQU8sWUFBWSxTQUFTLG9CQUFvQixVQUFVO0FBQUEsRUFDMUQsT0FBTyxZQUFZLE1BQU07QUFBQSxFQUd6QixJQUFJLFdBQVUsTUFBTSxTQUFTO0FBQUEsSUFDM0IsV0FBVSxLQUFLLFFBQVEsc0JBQXNCLFlBQVksTUFBTTtBQUFBLEVBQ2pFLEVBQU87QUFBQSxJQUNMLFVBQVUsWUFBWSxNQUFNO0FBQUE7QUFBQSxFQUk5QixJQUFJLGFBQWE7QUFBQSxFQUtqQixNQUFNLGVBQWUsTUFBWTtBQUFBLElBQy9CLE1BQU0sVUFBVyxNQUFNLElBQUksSUFBSSxNQUFPO0FBQUEsSUFDdEMsT0FBTyxNQUFNLE9BQU8sR0FBRztBQUFBLElBRXZCLE9BQU8sTUFBTSxrQkFBa0IsU0FBUyxNQUFNLElBQUksR0FBRyxLQUFLLEdBQUc7QUFBQTtBQUFBLEVBTS9ELE1BQU0scUJBQXFCLENBQUMsWUFBNEI7QUFBQSxJQUN0RCxNQUFNLE9BQU8sT0FBTyxzQkFBc0I7QUFBQSxJQUMxQyxNQUFNLElBQUksS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLFVBQVUsS0FBSyxNQUFNLEtBQUssS0FBSyxDQUFDO0FBQUEsSUFDL0QsTUFBTSxVQUFVLElBQUksS0FBSztBQUFBLElBQ3pCLE9BQU8sS0FBSyxNQUFNLFVBQVUsR0FBRztBQUFBO0FBQUEsRUFNakMsTUFBTSxZQUFZLENBQUMsSUFBVyxhQUE0QjtBQUFBLElBQ3hELE1BQU0sSUFBSSxJQUFJO0FBQUEsSUFDZCxNQUFNLE1BQU0sU0FBUyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQztBQUFBLElBRTFELGFBQWE7QUFBQSxJQUdiLElBQUksV0FBVSxNQUFNO0FBQUEsTUFDbEIsV0FBVSxLQUFLLGlCQUFpQjtBQUFBLE1BQ2hDLFdBQVUsS0FBSyxhQUFhO0FBQUEsSUFDOUI7QUFBQSxJQUdBLE1BQU0sS0FBSyxPQUFPLFNBQVM7QUFBQSxJQUMzQixNQUFNLEtBQUssU0FBUyxtQkFBbUI7QUFBQSxJQUN2QyxNQUFNLEtBQUssU0FBUyxlQUFlO0FBQUEsSUFFbkMsSUFBSSxVQUFVO0FBQUEsTUFDWixLQUFLLG1CQUFtQixRQUFRLE1BQU0sR0FBRztBQUFBLE1BQ3pDLE9BQU8sV0FBVyxNQUFNLEdBQUc7QUFBQSxJQUM3QixFQUFPO0FBQUEsTUFDTCxLQUFLLG1CQUFtQixPQUFPLE1BQU0sR0FBRztBQUFBLE1BQ3hDLE9BQU8sVUFBVSxNQUFNLEdBQUc7QUFBQTtBQUFBO0FBQUEsRUFPOUIsTUFBTSxvQkFBb0IsQ0FBQyxNQUEwQjtBQUFBLElBQ25ELElBQUksT0FBTztBQUFBLE1BQVU7QUFBQSxJQUVyQixFQUFFLGVBQWU7QUFBQSxJQUNqQixhQUFhO0FBQUEsSUFDYixNQUFNLGFBQWE7QUFBQSxJQUNuQixNQUFNLGFBQWE7QUFBQSxJQUduQixPQUFPLGtCQUFrQixFQUFFLFNBQVM7QUFBQSxJQUdwQyxRQUFRLFVBQVUsSUFBSSxTQUFTLG9CQUFvQixRQUFRLENBQUM7QUFBQSxJQUc1RCxNQUFNLEtBQUksbUJBQW1CLEVBQUUsT0FBTztBQUFBLElBQ3RDLFVBQVUsSUFBRyxLQUFLO0FBQUE7QUFBQSxFQU1wQixNQUFNLG9CQUFvQixDQUFDLE1BQTBCO0FBQUEsSUFDbkQsSUFBSSxDQUFDO0FBQUEsTUFBWTtBQUFBLElBRWpCLEVBQUUsZUFBZTtBQUFBLElBQ2pCLE1BQU0sS0FBSSxtQkFBbUIsRUFBRSxPQUFPO0FBQUEsSUFDdEMsVUFBVSxJQUFHLEtBQUs7QUFBQTtBQUFBLEVBTXBCLE1BQU0sa0JBQWtCLENBQUMsTUFBMEI7QUFBQSxJQUNqRCxJQUFJLENBQUM7QUFBQSxNQUFZO0FBQUEsSUFFakIsRUFBRSxlQUFlO0FBQUEsSUFDakIsYUFBYTtBQUFBLElBQ2IsTUFBTSxhQUFhO0FBQUEsSUFDbkIsTUFBTSxhQUFhO0FBQUEsSUFHbkIsT0FBTyxzQkFBc0IsRUFBRSxTQUFTO0FBQUEsSUFHeEMsUUFBUSxVQUFVLE9BQU8sU0FBUyxvQkFBb0IsUUFBUSxDQUFDO0FBQUEsSUFHL0QsTUFBTSxLQUFJLG1CQUFtQixFQUFFLE9BQU87QUFBQSxJQUN0QyxVQUFVLElBQUcsSUFBSTtBQUFBO0FBQUEsRUFNbkIsTUFBTSxnQkFBZ0IsQ0FBQyxNQUEyQjtBQUFBLElBQ2hELElBQUksT0FBTztBQUFBLE1BQVU7QUFBQSxJQUVyQixJQUFJLEtBQUksTUFBTSxJQUFJO0FBQUEsSUFDbEIsTUFBTSxPQUFPLEVBQUUsV0FBVyxLQUFLO0FBQUEsSUFFL0IsUUFBUSxFQUFFO0FBQUEsV0FDSDtBQUFBLFdBQ0E7QUFBQSxRQUNILEVBQUUsZUFBZTtBQUFBLFFBQ2pCLE1BQUssS0FBSSxPQUFPLE9BQU87QUFBQSxRQUN2QjtBQUFBLFdBQ0c7QUFBQSxXQUNBO0FBQUEsUUFDSCxFQUFFLGVBQWU7QUFBQSxRQUNqQixNQUFLLEtBQUksUUFBUTtBQUFBLFFBQ2pCO0FBQUEsV0FDRztBQUFBLFFBQ0gsRUFBRSxlQUFlO0FBQUEsUUFDakIsS0FBSTtBQUFBLFFBQ0o7QUFBQSxXQUNHO0FBQUEsUUFDSCxFQUFFLGVBQWU7QUFBQSxRQUNqQixLQUFJO0FBQUEsUUFDSjtBQUFBO0FBQUEsUUFFQTtBQUFBO0FBQUEsSUFHSixVQUFVLElBQUcsSUFBSTtBQUFBO0FBQUEsRUFJbkIsT0FBTyxpQkFBaUIsZUFBZSxpQkFBaUI7QUFBQSxFQUN4RCxPQUFPLGlCQUFpQixlQUFlLGlCQUFpQjtBQUFBLEVBQ3hELE9BQU8saUJBQWlCLGFBQWEsZUFBZTtBQUFBLEVBQ3BELE9BQU8saUJBQWlCLGlCQUFpQixlQUFlO0FBQUEsRUFHeEQsT0FBTyxXQUFXO0FBQUEsRUFDbEIsT0FBTyxhQUFhLFFBQVEsUUFBUTtBQUFBLEVBQ3BDLE9BQU8sYUFBYSxjQUFjLEtBQUs7QUFBQSxFQUN2QyxPQUFPLGFBQWEsaUJBQWlCLEdBQUc7QUFBQSxFQUN4QyxPQUFPLGFBQWEsaUJBQWlCLEtBQUs7QUFBQSxFQUMxQyxPQUFPLGlCQUFpQixXQUFXLGFBQWE7QUFBQSxFQUdoRCxhQUFhO0FBQUEsRUFHYixNQUFNLGFBQXlCO0FBQUEsSUFDN0IsU0FBUztBQUFBLElBQ1Q7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUFBLEVBR0EsTUFBTSxrQkFBbUIsV0FBa0IsV0FBVztBQUFBLEVBQ3RELElBQUksaUJBQWlCO0FBQUEsSUFDbEIsV0FBa0IsVUFBVSxVQUFVLE1BQU07QUFBQSxNQUMzQyxPQUFPLG9CQUFvQixlQUFlLGlCQUFpQjtBQUFBLE1BQzNELE9BQU8sb0JBQW9CLGVBQWUsaUJBQWlCO0FBQUEsTUFDM0QsT0FBTyxvQkFBb0IsYUFBYSxlQUFlO0FBQUEsTUFDdkQsT0FBTyxvQkFBb0IsaUJBQWlCLGVBQWU7QUFBQSxNQUMzRCxPQUFPLG9CQUFvQixXQUFXLGFBQWE7QUFBQSxNQUNuRCxPQUFPLE9BQU87QUFBQSxNQUNkLGdCQUFnQjtBQUFBO0FBQUEsRUFFcEI7QUFBQSxFQUVBLE9BQU87QUFBQSxPQUNGO0FBQUEsSUFDSDtBQUFBLElBQ0EsS0FBSztBQUFBLEVBQ1A7QUFBQTs7O0FDdk9KLElBQU0sb0JBQW9CLENBQ3hCLFVBQ0EsZ0JBQ2tCO0FBQUEsRUFDbEIsT0FBTyxTQUFTLE1BQU0sR0FBRyxXQUFXLEVBQUUsSUFBSSxDQUFDLE1BQU07QUFBQSxJQUMvQyxJQUFJLE9BQU8sTUFBTSxVQUFVO0FBQUEsTUFDekIsT0FBTyxFQUFFLE9BQU8sYUFBYSxDQUFDLEdBQUcsVUFBVSxNQUFNO0FBQUEsSUFDbkQ7QUFBQSxJQUNBLE9BQU8sS0FBSyxHQUFHLE9BQU8sYUFBYSxFQUFFLEtBQUssRUFBRTtBQUFBLEdBQzdDO0FBQUE7QUFTSSxJQUFNLGVBQ1gsQ0FBQyxXQUNELENBc0JFLGVBQytEO0FBQUEsRUFDL0QsUUFBUSxTQUFTLFVBQVUsU0FBUztBQUFBLEVBR3BDLE1BQU0sUUFDSixXQUFVLFNBQVMsb0JBQW1CLE1BQU07QUFBQSxFQUc5QyxNQUFNLFlBQVksV0FBVSxpQkFBaUI7QUFBQSxFQUU3QyxNQUFNLGFBQWEsT0FBTyxjQUFjO0FBQUEsRUFDeEMsTUFBTSxjQUFjLE9BQU8sZUFBZTtBQUFBLEVBRzFDLElBQUksT0FBTyxVQUFVO0FBQUEsSUFDbkIsTUFBTSxXQUFXLGtCQUFrQixPQUFPLFVBQVUsV0FBVztBQUFBLEVBQ2pFO0FBQUEsRUFHQSxNQUFNLG9CQUFvQixTQUFTLGNBQWMsS0FBSztBQUFBLEVBQ3RELGtCQUFrQixZQUFZLFNBQVMsb0JBQW9CLFFBQVE7QUFBQSxFQUNuRSxVQUFVLFlBQVksaUJBQWlCO0FBQUEsRUFLdkMsTUFBTSxjQUFjLE1BQVk7QUFBQSxJQUM5QixXQUFVLE1BQU0sbUJBQW1CO0FBQUEsSUFDbkMsV0FBVSxNQUFNLGVBQWU7QUFBQSxJQUMvQixXQUFVLEtBQUssZUFBZTtBQUFBLElBQzlCLE1BQU0sS0FBSyxTQUFTLG1CQUFtQjtBQUFBLElBQ3ZDLE1BQU0sS0FBSyxTQUFTLGVBQWU7QUFBQSxJQUNuQyxNQUFNLEtBQUssT0FBTyxTQUFTO0FBQUEsSUFDM0IsT0FBTztBQUFBO0FBQUEsRUFNVCxNQUFNLG9CQUFvQixDQUFDLFdBQThCO0FBQUEsSUFDdkQsSUFBSSxPQUFPO0FBQUEsTUFBVTtBQUFBLElBR3JCLE1BQU0sTUFBTSxTQUFTLE9BQU8sS0FBSztBQUFBLElBQ2pDLElBQUksS0FBSztBQUFBLE1BQ1AsTUFBTSxNQUFNO0FBQUEsTUFDWixNQUFNLE1BQU0sYUFBYSxPQUFPLEtBQUs7QUFBQSxNQUdyQyxZQUFZO0FBQUEsTUFHWixLQUFLLG1CQUFtQixRQUFRLE1BQU0sR0FBRztBQUFBLE1BQ3pDLE9BQU8sV0FBVyxNQUFNLEdBQUc7QUFBQSxJQUM3QjtBQUFBLElBRUEsS0FBSyxtQkFBbUIsZUFBZSxPQUFPLEtBQUs7QUFBQSxJQUduRCxJQUFJLE9BQU8saUJBQWlCLFdBQVUsU0FBUztBQUFBLE1BQzdDLFdBQVUsUUFBUSxNQUFNO0FBQUEsSUFDMUI7QUFBQTtBQUFBLEVBTUYsTUFBTSxTQUFTLE1BQVk7QUFBQSxJQUN6QixrQkFBa0IsWUFBWTtBQUFBLElBRTlCLE1BQU0sU0FBUyxRQUFRLENBQUMsV0FBVztBQUFBLE1BQ2pDLE1BQU0sV0FBVyxTQUFTLGNBQWMsUUFBUTtBQUFBLE1BQ2hELFNBQVMsT0FBTztBQUFBLE1BQ2hCLFNBQVMsWUFBWSxTQUFTLG9CQUFvQixNQUFNO0FBQUEsTUFDeEQsU0FBUyxNQUFNLGtCQUFrQixPQUFPO0FBQUEsTUFHeEMsSUFBSSxPQUFPLE1BQU0sWUFBWSxNQUFNLE1BQU0sSUFBSSxZQUFZLEdBQUc7QUFBQSxRQUMxRCxTQUFTLFVBQVUsSUFBSSxTQUFTLG9CQUFvQixlQUFlLENBQUM7QUFBQSxNQUN0RTtBQUFBLE1BR0EsSUFBSSxPQUFPLE9BQU87QUFBQSxRQUNoQixTQUFTLFFBQVEsT0FBTztBQUFBLE1BQzFCO0FBQUEsTUFFQSxTQUFTLGlCQUFpQixTQUFTLENBQUMsTUFBTTtBQUFBLFFBQ3hDLEVBQUUsZ0JBQWdCO0FBQUEsUUFDbEIsa0JBQWtCLE1BQU07QUFBQSxPQUN6QjtBQUFBLE1BRUQsa0JBQWtCLFlBQVksUUFBUTtBQUFBLEtBQ3ZDO0FBQUE7QUFBQSxFQU1ILE1BQU0sTUFBTSxDQUFDLGFBQTZDO0FBQUEsSUFDeEQsTUFBTSxXQUFXLGtCQUFrQixVQUFVLFdBQVc7QUFBQSxJQUN4RCxPQUFPO0FBQUEsSUFDUCxLQUFLLG1CQUFtQixpQkFBaUIsTUFBTSxRQUFRO0FBQUE7QUFBQSxFQU16RCxNQUFNLE1BQU0sQ0FBQyxPQUFlLFVBQXlCO0FBQUEsSUFDbkQsSUFBSSxNQUFNLFNBQVMsVUFBVSxhQUFhO0FBQUEsTUFDeEMsTUFBTSxTQUFTLE1BQU07QUFBQSxJQUN2QjtBQUFBLElBQ0EsTUFBTSxTQUFTLEtBQUs7QUFBQSxNQUNsQixPQUFPLGFBQWEsS0FBSztBQUFBLE1BQ3pCO0FBQUEsTUFDQSxVQUFVO0FBQUEsSUFDWixDQUFDO0FBQUEsSUFDRCxPQUFPO0FBQUEsSUFDUCxLQUFLLG1CQUFtQixpQkFBaUIsTUFBTSxRQUFRO0FBQUE7QUFBQSxFQU16RCxNQUFNLFNBQVMsQ0FBQyxVQUF3QjtBQUFBLElBQ3RDLE1BQU0sa0JBQWtCLGFBQWEsS0FBSztBQUFBLElBQzFDLE1BQU0sV0FBVyxNQUFNLFNBQVMsT0FDOUIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxZQUFZLE1BQU0sZ0JBQWdCLFlBQVksQ0FDL0Q7QUFBQSxJQUNBLE9BQU87QUFBQSxJQUNQLEtBQUssbUJBQW1CLGlCQUFpQixNQUFNLFFBQVE7QUFBQTtBQUFBLEVBTXpELE1BQU0sUUFBUSxNQUFZO0FBQUEsSUFDeEIsTUFBTSxXQUFXLENBQUM7QUFBQSxJQUNsQixPQUFPO0FBQUEsSUFDUCxLQUFLLG1CQUFtQixpQkFBaUIsTUFBTSxRQUFRO0FBQUE7QUFBQSxFQU16RCxNQUFNLE1BQU0sTUFBcUI7QUFBQSxJQUMvQixPQUFPLENBQUMsR0FBRyxNQUFNLFFBQVE7QUFBQTtBQUFBLEVBSTNCLE9BQU87QUFBQSxFQUdQLE1BQU0sa0JBQW1DO0FBQUEsSUFDdkMsU0FBUztBQUFBLElBQ1Q7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLEVBQ0Y7QUFBQSxFQUVBLE9BQU87QUFBQSxPQUNGO0FBQUEsSUFDSDtBQUFBLElBQ0EsVUFBVTtBQUFBLEVBQ1o7QUFBQTs7O0FDdE80QixJQUFoQztBQXNCTyxJQUFNLFlBQ1gsQ0FBQyxXQUNELENBbUJFLGVBQ3lEO0FBQUEsRUFDekQsUUFBUSxTQUFTLFVBQVUsU0FBUztBQUFBLEVBR3BDLE1BQU0sUUFDSixXQUFVLFNBQVMsb0JBQW1CLE1BQU07QUFBQSxFQUc5QyxNQUFNLFlBQVksV0FBVSxpQkFBaUI7QUFBQSxFQUU3QyxNQUFNLFlBQVksT0FBTyxhQUFhO0FBQUEsRUFDdEMsTUFBTSxjQUFjLE9BQU8sZUFBZTtBQUFBLEVBRzFDLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYTtBQUFBLElBQzlCLE1BQU0sZUFBNkI7QUFBQSxNQUNqQyxTQUFTLFNBQVMsY0FBYyxLQUFLO0FBQUEsTUFDckMsV0FBVztBQUFBLE1BQ1gsU0FBUztBQUFBLE1BQ1QsUUFBUSxNQUFNO0FBQUEsSUFDaEI7QUFBQSxJQUNBLE9BQU87QUFBQSxTQUNGO0FBQUEsTUFDSDtBQUFBLE1BQ0EsT0FBTztBQUFBLElBQ1Q7QUFBQSxFQUNGO0FBQUEsRUFHQSxNQUFNLE1BQU0sU0FBUyxjQUFjLEtBQUs7QUFBQSxFQUN4QyxJQUFJLFlBQVksU0FBUyxvQkFBb0IsS0FBSztBQUFBLEVBRWxELElBQUksWUFBZ0M7QUFBQSxFQUNwQyxJQUFJLHFCQUFnRTtBQUFBLEVBQ3BFLElBQUksVUFBbUM7QUFBQSxFQUd2QyxJQUFJLGFBQWE7QUFBQSxJQUNmLFlBQVksU0FBUyxjQUFjLEtBQUs7QUFBQSxJQUN4QyxVQUFVLFlBQVksU0FBUyxvQkFBb0IsT0FBTztBQUFBLElBQzFELElBQUksWUFBWSxTQUFTO0FBQUEsRUFDM0I7QUFBQSxFQUdBLElBQUksV0FBVztBQUFBLElBQ2IscUJBQXFCLDhCQUFnQjtBQUFBLE1BQ25DLFNBQVM7QUFBQSxNQUNULFNBQVM7QUFBQSxNQUNULE9BQU8sT0FBTyxjQUFjO0FBQUEsTUFDNUIsT0FBTyxNQUFNLElBQUksWUFBWTtBQUFBLE1BQzdCLFdBQVc7QUFBQSxNQUNYLE9BQU8sU0FBUyx3QkFBd0I7QUFBQSxJQUMxQyxDQUFDO0FBQUEsSUFHRCxVQUFVLG1CQUFtQjtBQUFBLElBRzdCLElBQUksbUJBQW1CLFNBQVM7QUFBQSxNQUM5QixtQkFBbUIsUUFBUSxNQUFNLE9BQU87QUFBQSxNQUN4QyxJQUFJLFlBQVksbUJBQW1CLE9BQU87QUFBQSxNQUcxQyxJQUFJLFNBQVM7QUFBQSxRQUNYLFFBQVEsTUFBTSxhQUFhO0FBQUEsUUFDM0IsUUFBUSxNQUFNLGdCQUFnQjtBQUFBLFFBQzlCLFFBQVEsYUFBYTtBQUFBLFFBQ3JCLFFBQVEsZUFBZTtBQUFBLE1BQ3pCO0FBQUEsSUFDRjtBQUFBLElBR0EsbUJBQW1CLEdBQUcsVUFBVSxpQkFBaUI7QUFBQSxJQUNqRCxtQkFBbUIsR0FBRyxRQUFRLFVBQVU7QUFBQSxJQUd4QyxJQUFJLFNBQVM7QUFBQSxNQUNYLFFBQVEsaUJBQWlCLFdBQVcsYUFBYTtBQUFBLElBQ25EO0FBQUEsRUFDRjtBQUFBLEVBRUEsVUFBVSxZQUFZLEdBQUc7QUFBQSxFQUt6QixNQUFNLGNBQWMsTUFBWTtBQUFBLElBQzlCLFdBQVUsTUFBTSxtQkFBbUI7QUFBQSxJQUNuQyxXQUFVLE1BQU0sZUFBZTtBQUFBLElBQy9CLFdBQVUsS0FBSyxlQUFlO0FBQUEsSUFDOUIsT0FBTztBQUFBO0FBQUEsRUFNVCxNQUFNLGdCQUFnQixNQUFZO0FBQUEsSUFDaEMsSUFBSSxXQUFXO0FBQUEsTUFDYixVQUFVLE1BQU0sa0JBQWtCLE1BQU07QUFBQSxJQUMxQztBQUFBO0FBQUEsRUFNRixNQUFNLGNBQWMsTUFBWTtBQUFBLElBQzlCLElBQUksc0JBQXNCLFdBQVcsU0FBUyxrQkFBa0IsU0FBUztBQUFBLE1BQ3ZFLG1CQUFtQixTQUFTLE1BQU0sSUFBSSxZQUFZLENBQUM7QUFBQSxJQUNyRDtBQUFBO0FBQUEsRUFNRixNQUFNLFNBQVMsTUFBWTtBQUFBLElBQ3pCLGNBQWM7QUFBQSxJQUNkLFlBQVk7QUFBQTtBQUFBLEVBTWQsU0FBUyxpQkFBaUIsR0FBUztBQUFBLElBQ2pDLElBQUksQ0FBQztBQUFBLE1BQW9CO0FBQUEsSUFFekIsSUFBSSxRQUFRLG1CQUFtQixTQUFTLEVBQUUsS0FBSztBQUFBLElBRy9DLElBQUksU0FBUyxDQUFDLE1BQU0sV0FBVyxHQUFHLEdBQUc7QUFBQSxNQUNuQyxRQUFRLE1BQU07QUFBQSxJQUNoQjtBQUFBLElBRUEsSUFBSSxXQUFXLEtBQUssR0FBRztBQUFBLE1BQ3JCLE1BQU0sTUFBTSxTQUFTLEtBQUs7QUFBQSxNQUMxQixJQUFJLEtBQUs7QUFBQSxRQUNQLE1BQU0sTUFBTTtBQUFBLFFBQ1osTUFBTSxNQUFNLGFBQWEsS0FBSztBQUFBLFFBRzlCLFlBQVk7QUFBQSxRQUVaLEtBQUssbUJBQW1CLFFBQVEsTUFBTSxHQUFHO0FBQUEsUUFDekMsT0FBTyxXQUFXLE1BQU0sR0FBRztBQUFBLE1BQzdCO0FBQUEsSUFDRixFQUFPO0FBQUEsTUFFTCxtQkFBbUIsU0FBUyxNQUFNLElBQUksWUFBWSxDQUFDO0FBQUE7QUFBQTtBQUFBLEVBT3ZELFNBQVMsYUFBYSxDQUFDLEdBQXdCO0FBQUEsSUFDN0MsSUFBSSxFQUFFLFFBQVEsU0FBUztBQUFBLE1BQ3JCLGtCQUFrQjtBQUFBLE1BQ2xCLFNBQVMsS0FBSztBQUFBLElBQ2hCO0FBQUEsSUFDQSxJQUFJLEVBQUUsUUFBUSxVQUFVO0FBQUEsTUFFdEIsSUFBSSxvQkFBb0I7QUFBQSxRQUN0QixtQkFBbUIsU0FBUyxNQUFNLElBQUksWUFBWSxDQUFDO0FBQUEsTUFDckQ7QUFBQSxNQUNBLFNBQVMsS0FBSztBQUFBLE1BRWQsSUFBSSxXQUFVLFNBQVM7QUFBQSxRQUNyQixXQUFVLFFBQVEsTUFBTTtBQUFBLE1BQzFCO0FBQUEsSUFDRjtBQUFBO0FBQUEsRUFNRixTQUFTLFVBQVUsR0FBUztBQUFBLElBQzFCLGtCQUFrQjtBQUFBO0FBQUEsRUFJcEIsY0FBYztBQUFBLEVBR2QsTUFBTSxlQUE2QjtBQUFBLElBQ2pDLFNBQVM7QUFBQSxJQUNULFdBQVc7QUFBQSxJQUNYLFNBQVM7QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUFBLEVBR0EsTUFBTSxLQUFLLFFBQVEsRUFBRSxPQUFPO0FBQUEsRUFHNUIsTUFBTSxrQkFBbUIsV0FBa0IsV0FBVztBQUFBLEVBQ3RELElBQUksaUJBQWlCO0FBQUEsSUFDbEIsV0FBa0IsVUFBVSxVQUFVLE1BQU07QUFBQSxNQUMzQyxJQUFJLFNBQVM7QUFBQSxRQUNYLFFBQVEsb0JBQW9CLFdBQVcsYUFBYTtBQUFBLE1BQ3REO0FBQUEsTUFDQSxJQUFJLG9CQUFvQjtBQUFBLFFBQ3RCLG1CQUFtQixRQUFRO0FBQUEsTUFDN0I7QUFBQSxNQUNBLGdCQUFnQjtBQUFBO0FBQUEsRUFFcEI7QUFBQSxFQUVBLE9BQU87QUFBQSxPQUNGO0FBQUEsSUFDSDtBQUFBLElBQ0EsT0FBTztBQUFBLEVBQ1Q7QUFBQTs7O0FDbE9HLElBQU0sY0FDWCxDQUFDLFdBQ0QsQ0FRRSxlQUtHO0FBQUEsRUFDSCxRQUFRLFNBQVMsVUFBVSxTQUFTO0FBQUEsRUFHcEMsTUFBTSxRQUNKLFdBQVUsU0FBUyxvQkFBbUIsTUFBTTtBQUFBLEVBRzlDLElBQUksa0JBQWtCO0FBQUEsRUFHdEIsSUFBSSx3QkFBd0I7QUFBQSxFQUU1QixNQUFNLGNBQWMsT0FBTyxXQUFXLHFCQUFxQjtBQUFBLEVBRzNELE1BQU0sdUJBQ0osZ0JBQWdCLHFCQUFxQixZQUNyQyxnQkFBZ0IscUJBQXFCO0FBQUEsRUFFdkMsSUFBSSxDQUFDLHNCQUFzQjtBQUFBLElBRXpCLE1BQU0sY0FBOEI7QUFBQSxNQUNsQyxVQUFVO0FBQUEsTUFDVixXQUFXO0FBQUEsTUFDWCxNQUFNLE1BQU07QUFBQSxNQUNaLE9BQU8sTUFBTTtBQUFBLE1BQ2IsUUFBUSxNQUFNO0FBQUEsTUFDZCxRQUFRLE1BQU07QUFBQSxNQUNkLFVBQVUsTUFBTTtBQUFBLElBQ2xCO0FBQUEsSUFDQSxPQUFPO0FBQUEsU0FDRjtBQUFBLE1BQ0g7QUFBQSxNQUNBLGVBQWU7QUFBQSxNQUNmLFNBQVM7QUFBQSxJQUNYO0FBQUEsRUFDRjtBQUFBLEVBR0EsTUFBTSxXQUFXLFNBQVMsY0FBYyxLQUFLO0FBQUEsRUFDN0MsU0FBUyxZQUFZLFNBQVMsb0JBQW9CLFFBQVE7QUFBQSxFQUMxRCxRQUFRLGFBQWEsVUFBVSxRQUFRLFVBQVU7QUFBQSxFQUdqRCxNQUFNLFlBQVksU0FBUyxjQUFjLEtBQUs7QUFBQSxFQUM5QyxVQUFVLFlBQVksU0FBUyxvQkFBb0IsU0FBUztBQUFBLEVBRzVELFFBQVEsWUFBWSxTQUFTO0FBQUEsRUFHN0IsU0FBUyxLQUFLLFlBQVksT0FBTztBQUFBLEVBS2pDLE1BQU0sV0FBVyxNQUFZO0FBQUEsSUFDM0IsSUFBSSxDQUFDLE9BQU87QUFBQSxNQUFTO0FBQUEsSUFFckIsTUFBTSxjQUFjLE9BQU8sUUFBUSxzQkFBc0I7QUFBQSxJQUN6RCxNQUFNLGdCQUFnQixPQUFPO0FBQUEsSUFDN0IsTUFBTSxpQkFBaUIsT0FBTztBQUFBLElBQzlCLE1BQU0sU0FBUztBQUFBLElBRWYsSUFBSSxnQkFBZ0IscUJBQXFCLFFBQVE7QUFBQSxNQUUvQyxVQUFVLE1BQU0sV0FBVztBQUFBLE1BQzNCLE1BQU0sZ0JBQWdCLFVBQVUsc0JBQXNCO0FBQUEsTUFDdEQsVUFBVSxNQUFNLE9BQU8sSUFBSSxnQkFBZ0IsY0FBYyxTQUFTO0FBQUEsTUFDbEUsVUFBVSxNQUFNLE1BQU0sSUFBSSxpQkFBaUIsY0FBYyxVQUFVO0FBQUEsSUFDckUsRUFBTztBQUFBLE1BRUwsVUFBVSxNQUFNLFdBQVc7QUFBQSxNQUMzQixVQUFVLE1BQU0sUUFBUSxHQUFHLFlBQVk7QUFBQSxNQUN2QyxVQUFVLE1BQU0sV0FBVyxHQUFHLFlBQVk7QUFBQSxNQUcxQyxVQUFVLE1BQU0sT0FBTyxHQUFHLFlBQVk7QUFBQSxNQUd0QyxNQUFNLGdCQUFnQixVQUFVLHNCQUFzQjtBQUFBLE1BR3RELE1BQU0sYUFBYSxpQkFBaUIsWUFBWSxTQUFTO0FBQUEsTUFDekQsTUFBTSxhQUFhLFlBQVksTUFBTTtBQUFBLE1BR3JDLFFBQVEsVUFBVSxPQUFPLFNBQVMsMkJBQTJCLENBQUM7QUFBQSxNQUU5RCxJQUFJLGFBQWEsY0FBYyxVQUFVLGFBQWEsWUFBWTtBQUFBLFFBRWhFLE1BQU0sTUFBTSxZQUFZLE1BQU0sY0FBYyxTQUFTO0FBQUEsUUFDckQsVUFBVSxNQUFNLE1BQU0sR0FBRztBQUFBLFFBQ3pCLFFBQVEsVUFBVSxJQUFJLFNBQVMsMkJBQTJCLENBQUM7QUFBQSxNQUM3RCxFQUFPO0FBQUEsUUFFTCxNQUFNLE1BQU0sWUFBWSxTQUFTO0FBQUEsUUFDakMsVUFBVSxNQUFNLE1BQU0sR0FBRztBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUS9CLE1BQU0sT0FBTyxNQUFZO0FBQUEsSUFDdkIsSUFBSSxNQUFNLFVBQVUsT0FBTztBQUFBLE1BQVU7QUFBQSxJQUVyQyxNQUFNLFNBQVM7QUFBQSxJQUNmLFFBQVEsVUFBVSxJQUFJLFNBQVMsb0JBQW9CLElBQUksQ0FBQztBQUFBLElBR3hELHNCQUFzQixNQUFNO0FBQUEsTUFDMUIsU0FBUztBQUFBLEtBQ1Y7QUFBQSxJQUlELFdBQVcsTUFBTTtBQUFBLE1BQ2YsSUFBSSxNQUFNLFFBQVE7QUFBQSxRQUNoQixTQUFTLGlCQUFpQixTQUFTLG1CQUFtQjtBQUFBLE1BQ3hEO0FBQUEsT0FDQyxDQUFDO0FBQUEsSUFFSixLQUFLLG1CQUFtQixJQUFJO0FBQUE7QUFBQSxFQU05QixNQUFNLFFBQVEsTUFBWTtBQUFBLElBQ3hCLElBQUksQ0FBQyxNQUFNO0FBQUEsTUFBUTtBQUFBLElBRW5CLE1BQU0sU0FBUztBQUFBLElBQ2YsUUFBUSxVQUFVLE9BQU8sU0FBUyxvQkFBb0IsSUFBSSxDQUFDO0FBQUEsSUFHM0QsU0FBUyxvQkFBb0IsU0FBUyxtQkFBbUI7QUFBQSxJQUV6RCxLQUFLLG1CQUFtQixLQUFLO0FBQUE7QUFBQSxFQU0vQixNQUFNLFNBQVMsTUFBWTtBQUFBLElBQ3pCLElBQUksTUFBTSxRQUFRO0FBQUEsTUFDaEIsTUFBTTtBQUFBLElBQ1IsRUFBTztBQUFBLE1BQ0wsS0FBSztBQUFBO0FBQUE7QUFBQSxFQU9ULE1BQU0sU0FBUyxNQUFlLE1BQU07QUFBQSxFQUlwQyxNQUFNLHFCQUFxQixDQUFDLE1BQXdCO0FBQUEsSUFDbEQsRUFBRSxlQUFlO0FBQUEsSUFDakIsRUFBRSxnQkFBZ0I7QUFBQSxJQUNsQixPQUFPO0FBQUE7QUFBQSxFQUdULE1BQU0sc0JBQXNCLENBQUMsTUFBd0I7QUFBQSxJQUNuRCxJQUFJLEVBQUUsV0FBVyxVQUFVO0FBQUEsTUFDekIsTUFBTTtBQUFBLElBQ1I7QUFBQTtBQUFBLEVBR0YsTUFBTSxzQkFBc0IsQ0FBQyxNQUF3QjtBQUFBLElBRW5ELElBQUksTUFBTSxZQUFZO0FBQUEsTUFDcEI7QUFBQSxJQUNGO0FBQUEsSUFJQSxJQUFJLEtBQUssSUFBSSxJQUFJLGtCQUFrQixLQUFLO0FBQUEsTUFDdEM7QUFBQSxJQUNGO0FBQUEsSUFHQSxJQUFJLHVCQUF1QjtBQUFBLE1BQ3pCLHdCQUF3QjtBQUFBLE1BQ3hCO0FBQUEsSUFDRjtBQUFBLElBR0EsSUFBSSxVQUFVLFNBQVMsRUFBRSxNQUFjLEdBQUc7QUFBQSxNQUN4QztBQUFBLElBQ0Y7QUFBQSxJQUdBLElBQUksT0FBTyxXQUFXLE9BQU8sUUFBUSxTQUFTLEVBQUUsTUFBYyxHQUFHO0FBQUEsTUFDL0Q7QUFBQSxJQUNGO0FBQUEsSUFHQSxNQUFNO0FBQUE7QUFBQSxFQUdSLE1BQU0sZ0JBQWdCLENBQUMsTUFBMkI7QUFBQSxJQUNoRCxJQUFJLEVBQUUsUUFBUSxZQUFZLE1BQU0sUUFBUTtBQUFBLE1BQ3RDLE1BQU07QUFBQSxJQUNSO0FBQUE7QUFBQSxFQUdGLE1BQU0sZUFBZSxNQUFZO0FBQUEsSUFDL0IsSUFBSSxNQUFNLFFBQVE7QUFBQSxNQUNoQixTQUFTO0FBQUEsSUFDWDtBQUFBO0FBQUEsRUFHRixNQUFNLGVBQWUsTUFBWTtBQUFBLElBQy9CLElBQUksTUFBTSxVQUFVLGdCQUFnQixxQkFBcUIsVUFBVTtBQUFBLE1BQ2pFLFNBQVM7QUFBQSxJQUNYO0FBQUE7QUFBQSxFQUtGLE1BQU0sZ0JBQWdCLE1BQVk7QUFBQSxJQUVoQyxJQUFJLE1BQU0sWUFBWTtBQUFBLE1BQ3BCLGtCQUFrQixLQUFLLElBQUk7QUFBQSxJQUM3QjtBQUFBO0FBQUEsRUFLRixTQUFTLGlCQUFpQixXQUFXLGVBQWUsSUFBSTtBQUFBLEVBQ3hELFNBQVMsaUJBQWlCLGFBQWEsZUFBZSxJQUFJO0FBQUEsRUFJMUQsTUFBTSwwQkFBMEIsQ0FBQyxNQUF3QjtBQUFBLElBRXZELHdCQUF3QixVQUFVLFNBQVMsRUFBRSxNQUFjO0FBQUE7QUFBQSxFQUc3RCxTQUFTLGlCQUFpQixhQUFhLHlCQUF5QixJQUFJO0FBQUEsRUFJcEUsSUFBSSxPQUFPLFNBQVM7QUFBQSxJQUNsQixPQUFPLFFBQVEsaUJBQWlCLFNBQVMsa0JBQWtCO0FBQUEsRUFDN0Q7QUFBQSxFQUVBLFNBQVMsaUJBQWlCLFNBQVMsbUJBQW1CO0FBQUEsRUFDdEQsU0FBUyxpQkFBaUIsV0FBVyxhQUFhO0FBQUEsRUFDbEQsT0FBTyxpQkFBaUIsVUFBVSxZQUFZO0FBQUEsRUFDOUMsT0FBTyxpQkFBaUIsVUFBVSxjQUFjLElBQUk7QUFBQSxFQUdwRCxNQUFNLGlCQUFpQztBQUFBLElBQ3JDO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUFBLEVBR0EsTUFBTSxrQkFBbUIsV0FBa0IsV0FBVztBQUFBLEVBQ3RELElBQUksaUJBQWlCO0FBQUEsSUFDbEIsV0FBa0IsVUFBVSxVQUFVLE1BQU07QUFBQSxNQUMzQyxJQUFJLE9BQU8sU0FBUztBQUFBLFFBQ2xCLE9BQU8sUUFBUSxvQkFBb0IsU0FBUyxrQkFBa0I7QUFBQSxNQUNoRTtBQUFBLE1BQ0EsU0FBUyxvQkFBb0IsU0FBUyxtQkFBbUI7QUFBQSxNQUN6RCxTQUFTLG9CQUFvQixTQUFTLG1CQUFtQjtBQUFBLE1BQ3pELFNBQVMsb0JBQW9CLFdBQVcsYUFBYTtBQUFBLE1BQ3JELFNBQVMsb0JBQW9CLFdBQVcsZUFBZSxJQUFJO0FBQUEsTUFDM0QsU0FBUyxvQkFBb0IsYUFBYSxlQUFlLElBQUk7QUFBQSxNQUM3RCxTQUFTLG9CQUNQLGFBQ0EseUJBQ0EsSUFDRjtBQUFBLE1BQ0EsT0FBTyxvQkFBb0IsVUFBVSxZQUFZO0FBQUEsTUFDakQsT0FBTyxvQkFBb0IsVUFBVSxjQUFjLElBQUk7QUFBQSxNQUV2RCxJQUFJLFFBQVEsZUFBZSxTQUFTLE1BQU07QUFBQSxRQUN4QyxTQUFTLEtBQUssWUFBWSxPQUFPO0FBQUEsTUFDbkM7QUFBQSxNQUVBLGdCQUFnQjtBQUFBO0FBQUEsRUFFcEI7QUFBQSxFQUVBLE9BQU87QUFBQSxPQUNGO0FBQUEsSUFDSDtBQUFBLElBQ0EsZUFBZTtBQUFBLElBQ2YsU0FBUztBQUFBLEVBQ1g7QUFBQTs7O0FDeFY2QixJQUFqQztBQVNPLElBQU0sd0JBQXdCLE1BQWU7QUFBQSxFQUNsRCxPQUFPLGdCQUFnQjtBQUFBO0FBc0R6QixJQUFNLGVBQWU7QUFBQTtBQUFBO0FBQUE7QUFPckIsTUFBTSxjQUFjO0FBQUEsRUFDVjtBQUFBLEVBQ0E7QUFBQSxFQUNBLFFBQWlDO0FBQUEsRUFDakMsVUFBOEI7QUFBQSxFQUM5QixZQUFnQztBQUFBLEVBQ2hDLFlBQWdDO0FBQUEsRUFDaEMsZUFBbUM7QUFBQSxFQUNuQyxXQUFXO0FBQUEsRUFDWCxpQkFBMEQ7QUFBQSxFQUMxRDtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUVSLFdBQVcsR0FBRztBQUFBLElBQ1osS0FBSyxTQUFTLFNBQVMsY0FBYyxRQUFRO0FBQUEsSUFDN0MsS0FBSyxNQUFNLEtBQUssT0FBTyxXQUFXLE1BQU0sRUFBRSxvQkFBb0IsS0FBSyxDQUFDO0FBQUEsSUFFcEUsS0FBSyxpQkFBaUIsS0FBSyxnQkFBZ0IsS0FBSyxJQUFJO0FBQUEsSUFDcEQsS0FBSyxpQkFBaUIsS0FBSyxnQkFBZ0IsS0FBSyxJQUFJO0FBQUEsSUFDcEQsS0FBSyxlQUFlLEtBQUssY0FBYyxLQUFLLElBQUk7QUFBQSxJQUNoRCxLQUFLLGlCQUFpQixLQUFLLGdCQUFnQixLQUFLLElBQUk7QUFBQSxJQUNwRCxLQUFLLGdCQUFnQixLQUFLLGVBQWUsS0FBSyxJQUFJO0FBQUE7QUFBQSxFQU1wRCxRQUFRLENBQUMsUUFBa0Q7QUFBQSxJQUN6RCxPQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUFBLE1BQ3RDLElBQUksa0JBQWtCLGtCQUFrQjtBQUFBLFFBQ3RDLElBQUksT0FBTyxZQUFZLE9BQU8sZUFBZSxHQUFHO0FBQUEsVUFDOUMsS0FBSyxRQUFRO0FBQUEsVUFDYixLQUFLLGFBQWE7QUFBQSxVQUNsQixRQUFRO0FBQUEsUUFDVixFQUFPO0FBQUEsVUFDTCxPQUFPLFNBQVMsTUFBTTtBQUFBLFlBQ3BCLEtBQUssUUFBUTtBQUFBLFlBQ2IsS0FBSyxhQUFhO0FBQUEsWUFDbEIsUUFBUTtBQUFBO0FBQUEsVUFFVixPQUFPLFVBQVU7QUFBQTtBQUFBLE1BRXJCLEVBQU8sU0FBSSxPQUFPLFdBQVcsVUFBVTtBQUFBLFFBQ3JDLE1BQU0sTUFBTSxJQUFJO0FBQUEsUUFDaEIsSUFBSSxjQUFjO0FBQUEsUUFDbEIsSUFBSSxTQUFTLE1BQU07QUFBQSxVQUNqQixLQUFLLFFBQVE7QUFBQSxVQUNiLEtBQUssYUFBYTtBQUFBLFVBQ2xCLFFBQVE7QUFBQTtBQUFBLFFBRVYsSUFBSSxVQUFVO0FBQUEsUUFDZCxJQUFJLE1BQU07QUFBQSxNQUNaLEVBQU87QUFBQSxRQUNMLE9BQU8sSUFBSSxNQUFNLHNCQUFzQixDQUFDO0FBQUE7QUFBQSxLQUUzQztBQUFBO0FBQUEsRUFNSyxZQUFZLEdBQVM7QUFBQSxJQUMzQixJQUFJLENBQUMsS0FBSztBQUFBLE1BQU87QUFBQSxJQUNqQixLQUFLLE9BQU8sUUFBUSxLQUFLLE1BQU07QUFBQSxJQUMvQixLQUFLLE9BQU8sU0FBUyxLQUFLLE1BQU07QUFBQSxJQUNoQyxLQUFLLElBQUksVUFBVSxLQUFLLE9BQU8sR0FBRyxDQUFDO0FBQUE7QUFBQSxFQU1yQyxVQUFVLENBQUMsR0FBVyxHQUEwQjtBQUFBLElBQzlDLElBQUksQ0FBQyxLQUFLO0FBQUEsTUFBTyxPQUFPO0FBQUEsSUFHeEIsTUFBTSxXQUFXLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUssT0FBTyxRQUFRLENBQUMsQ0FBQztBQUFBLElBQy9ELE1BQU0sV0FBVyxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLLE9BQU8sU0FBUyxDQUFDLENBQUM7QUFBQSxJQUVoRSxJQUFJO0FBQUEsTUFDRixNQUFNLFFBQVEsS0FBSyxJQUFJLGFBQWEsVUFBVSxVQUFVLEdBQUcsQ0FBQyxFQUFFO0FBQUEsTUFDOUQsT0FBTyxTQUFTLE1BQU0sSUFBSSxNQUFNLElBQUksTUFBTSxFQUFFO0FBQUEsTUFDNUMsT0FBTyxHQUFHO0FBQUEsTUFDVixRQUFRLEtBQUssNENBQTRDLENBQUM7QUFBQSxNQUMxRCxPQUFPO0FBQUE7QUFBQTtBQUFBLEVBT0gsYUFBYSxHQUFTO0FBQUEsSUFFNUIsS0FBSyxVQUFVLFNBQVMsY0FBYyxLQUFLO0FBQUEsSUFDM0MsS0FBSyxRQUFRLFlBQVk7QUFBQSxJQUN6QixLQUFLLFFBQVEsTUFBTSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFlN0IsTUFBTSxpQkFBaUIsU0FBUyxjQUFjLEtBQUs7QUFBQSxJQUNuRCxlQUFlLE1BQU0sVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFVL0IsTUFBTSxlQUFlLEtBQUssTUFBTyxVQUFVLElBQUk7QUFBQSxJQUMvQyxhQUFhLE1BQU0sVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQU03QixhQUFhLFlBQVk7QUFBQSxJQUN6QixlQUFlLFlBQVksWUFBWTtBQUFBLElBR3ZDLEtBQUssWUFBWSxTQUFTLGNBQWMsS0FBSztBQUFBLElBQzdDLEtBQUssVUFBVSxNQUFNLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBVy9CLGVBQWUsWUFBWSxLQUFLLFNBQVM7QUFBQSxJQUd6QyxLQUFLLFlBQVksU0FBUyxjQUFjLEtBQUs7QUFBQSxJQUM3QyxLQUFLLFVBQVUsTUFBTSxVQUFVO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQWMvQixlQUFlLFlBQVksS0FBSyxTQUFTO0FBQUEsSUFHekMsS0FBSyxlQUFlLFNBQVMsY0FBYyxLQUFLO0FBQUEsSUFDaEQsS0FBSyxhQUFhLE1BQU0sVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQWdCbEMsTUFBTSxjQUFjLFNBQVMsY0FBYyxLQUFLO0FBQUEsSUFDaEQsWUFBWSxZQUFZO0FBQUEsSUFDeEIsWUFBWSxNQUFNLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsSUFPNUIsTUFBTSxZQUFZLFNBQVMsY0FBYyxNQUFNO0FBQUEsSUFDL0MsVUFBVSxZQUFZO0FBQUEsSUFDdEIsVUFBVSxjQUFjO0FBQUEsSUFDeEIsVUFBVSxNQUFNLFVBQVU7QUFBQTtBQUFBO0FBQUE7QUFBQSxJQUsxQixNQUFNLFdBQVcsU0FBUyxjQUFjLE1BQU07QUFBQSxJQUM5QyxTQUFTLGNBQWM7QUFBQSxJQUN2QixTQUFTLE1BQU0sVUFBVTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBS3pCLEtBQUssYUFBYSxZQUFZLFdBQVc7QUFBQSxJQUN6QyxLQUFLLGFBQWEsWUFBWSxTQUFTO0FBQUEsSUFDdkMsS0FBSyxhQUFhLFlBQVksUUFBUTtBQUFBLElBRXRDLEtBQUssUUFBUSxZQUFZLGNBQWM7QUFBQSxJQUN2QyxLQUFLLFFBQVEsWUFBWSxLQUFLLFlBQVk7QUFBQSxJQUd6QyxLQUFLLFFBQWdCLGtCQUFrQjtBQUFBLElBQ3ZDLEtBQUssUUFBZ0IsZ0JBQWdCO0FBQUEsSUFFdEMsU0FBUyxLQUFLLFlBQVksS0FBSyxPQUFPO0FBQUE7QUFBQSxFQU1oQyxhQUFhLEdBQVM7QUFBQSxJQUM1QixJQUFJLEtBQUssU0FBUztBQUFBLE1BQ2hCLEtBQUssUUFBUSxPQUFPO0FBQUEsTUFDcEIsS0FBSyxVQUFVO0FBQUEsTUFDZixLQUFLLFlBQVk7QUFBQSxNQUNqQixLQUFLLFlBQVk7QUFBQSxNQUNqQixLQUFLLGVBQWU7QUFBQSxJQUN0QjtBQUFBO0FBQUEsRUFNTSxtQkFBbUIsQ0FDekIsU0FDQSxTQUNpRTtBQUFBLElBQ2pFLElBQUksQ0FBQyxLQUFLLFdBQVcsQ0FBQyxLQUFLO0FBQUEsTUFBTyxPQUFPO0FBQUEsSUFFekMsTUFBTSxlQUFnQixLQUFLLFFBQ3hCO0FBQUEsSUFDSCxNQUFNLE9BQU8sYUFBYSxzQkFBc0I7QUFBQSxJQUdoRCxJQUNFLFVBQVUsS0FBSyxRQUNmLFVBQVUsS0FBSyxTQUNmLFVBQVUsS0FBSyxPQUNmLFVBQVUsS0FBSyxRQUNmO0FBQUEsTUFDQSxPQUFPO0FBQUEsSUFDVDtBQUFBLElBR0EsTUFBTSxJQUFJLFVBQVUsS0FBSztBQUFBLElBQ3pCLE1BQU0sSUFBSSxVQUFVLEtBQUs7QUFBQSxJQUd6QixNQUFNLFNBQVMsS0FBSyxNQUFNLGVBQWUsS0FBSztBQUFBLElBQzlDLE1BQU0sU0FBUyxLQUFLLE1BQU0sZ0JBQWdCLEtBQUs7QUFBQSxJQUMvQyxNQUFNLFNBQVMsS0FBSyxNQUFNLElBQUksTUFBTTtBQUFBLElBQ3BDLE1BQU0sU0FBUyxLQUFLLE1BQU0sSUFBSSxNQUFNO0FBQUEsSUFFcEMsT0FBTyxFQUFFLEdBQUcsR0FBRyxRQUFRLE9BQU87QUFBQTtBQUFBLEVBTXhCLGdCQUFnQixDQUFDLFNBQWlCLFNBQXVCO0FBQUEsSUFDL0QsTUFBTSxTQUFTLEtBQUssb0JBQW9CLFNBQVMsT0FBTztBQUFBLElBRXhELElBQUksQ0FBQyxRQUFRO0FBQUEsTUFDWCxJQUFJLEtBQUs7QUFBQSxRQUFXLEtBQUssVUFBVSxNQUFNLFVBQVU7QUFBQSxNQUNuRCxJQUFJLEtBQUs7QUFBQSxRQUFXLEtBQUssVUFBVSxNQUFNLFVBQVU7QUFBQSxNQUNuRDtBQUFBLElBQ0Y7QUFBQSxJQUVBLE1BQU0sUUFBUSxLQUFLLFdBQVcsT0FBTyxRQUFRLE9BQU8sTUFBTTtBQUFBLElBRzFELElBQUksS0FBSyxXQUFXO0FBQUEsTUFDbEIsS0FBSyxVQUFVLE1BQU0sVUFBVTtBQUFBLE1BQy9CLEtBQUssVUFBVSxNQUFNLE9BQU8sR0FBRyxPQUFPO0FBQUEsTUFDdEMsS0FBSyxVQUFVLE1BQU0sTUFBTSxHQUFHLE9BQU87QUFBQSxNQUNyQyxJQUFJLE9BQU87QUFBQSxRQUNULEtBQUssVUFBVSxNQUFNLGNBQWMsS0FBSyxhQUFhLEtBQUssSUFDdEQsU0FDQTtBQUFBLE1BQ047QUFBQSxJQUNGO0FBQUEsSUFHQSxJQUFJLEtBQUssYUFBYSxLQUFLLE9BQU87QUFBQSxNQUNoQyxLQUFLLFVBQVUsTUFBTSxVQUFVO0FBQUEsTUFFL0IsTUFBTSxVQUNKLE9BQU8sSUFBSSxNQUFPLEtBQUssUUFBZ0IsY0FBYyxRQUFRLE9BQU87QUFBQSxNQUN0RSxNQUFNLFVBQ0osT0FBTyxJQUFJLE1BQU8sS0FBSyxRQUFnQixjQUFjLFNBQVMsT0FBTztBQUFBLE1BQ3ZFLEtBQUssVUFBVSxNQUFNLE9BQU8sR0FBRyxPQUFPLElBQUk7QUFBQSxNQUMxQyxLQUFLLFVBQVUsTUFBTSxNQUFNLEdBQUcsT0FBTyxJQUFJO0FBQUEsTUFHekMsTUFBTSxNQUFPLE9BQU8sU0FBUyxLQUFLLE1BQU0sZUFBZ0I7QUFBQSxNQUN4RCxNQUFNLE1BQU8sT0FBTyxTQUFTLEtBQUssTUFBTSxnQkFBaUI7QUFBQSxNQUN6RCxLQUFLLFVBQVUsTUFBTSxrQkFBa0IsT0FBTyxLQUFLLE1BQU07QUFBQSxNQUN6RCxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsR0FBRyxRQUFRO0FBQUEsSUFDdkQ7QUFBQSxJQUdBLElBQUksS0FBSyxnQkFBZ0IsT0FBTztBQUFBLE1BQzlCLE1BQU0sU0FBUyxLQUFLLGFBQWEsY0FDL0IsaUJBQ0Y7QUFBQSxNQUNBLE1BQU0sT0FBTyxLQUFLLGFBQWEsY0FDN0IsZUFDRjtBQUFBLE1BQ0EsSUFBSTtBQUFBLFFBQVEsT0FBTyxNQUFNLGtCQUFrQjtBQUFBLE1BQzNDLElBQUk7QUFBQSxRQUFNLEtBQUssY0FBYyxNQUFNLFlBQVk7QUFBQSxJQUNqRDtBQUFBO0FBQUEsRUFNTSxZQUFZLENBQUMsS0FBc0I7QUFBQSxJQUN6QyxNQUFNLElBQUksU0FBUyxJQUFJLE1BQU0sR0FBRyxDQUFDLEdBQUcsRUFBRTtBQUFBLElBQ3RDLE1BQU0sSUFBSSxTQUFTLElBQUksTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFO0FBQUEsSUFDdEMsTUFBTSxJQUFJLFNBQVMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUU7QUFBQSxJQUN0QyxNQUFNLGFBQWEsUUFBUSxJQUFJLFFBQVEsSUFBSSxRQUFRLEtBQUs7QUFBQSxJQUN4RCxPQUFPLFlBQVk7QUFBQTtBQUFBLEVBTWIsZUFBZSxDQUFDLEdBQXFCO0FBQUEsSUFDM0MsSUFBSSxDQUFDLEtBQUs7QUFBQSxNQUFVO0FBQUEsSUFDcEIsS0FBSyxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsT0FBTztBQUFBO0FBQUEsRUFNcEMsZUFBZSxDQUFDLEdBQXFCO0FBQUEsSUFDM0MsSUFBSSxDQUFDLEtBQUs7QUFBQSxNQUFVO0FBQUEsSUFFcEIsTUFBTSxTQUFTLEtBQUssb0JBQW9CLEVBQUUsU0FBUyxFQUFFLE9BQU87QUFBQSxJQUM1RCxJQUFJLFFBQVE7QUFBQSxNQUNWLE1BQU0sUUFBUSxLQUFLLFdBQVcsT0FBTyxRQUFRLE9BQU8sTUFBTTtBQUFBLE1BQzFELEtBQUssWUFBWSxLQUFLO0FBQUEsSUFDeEI7QUFBQTtBQUFBLEVBTU0sZUFBZSxDQUFDLEdBQXFCO0FBQUEsSUFDM0MsSUFBSSxDQUFDLEtBQUssWUFBWSxDQUFDLEVBQUUsUUFBUTtBQUFBLE1BQVE7QUFBQSxJQUN6QyxFQUFFLGVBQWU7QUFBQSxJQUNqQixNQUFNLFFBQVEsRUFBRSxRQUFRO0FBQUEsSUFDeEIsS0FBSyxpQkFBaUIsTUFBTSxTQUFTLE1BQU0sT0FBTztBQUFBO0FBQUEsRUFNNUMsY0FBYyxDQUFDLEdBQXFCO0FBQUEsSUFDMUMsSUFBSSxDQUFDLEtBQUs7QUFBQSxNQUFVO0FBQUEsSUFFcEIsTUFBTSxRQUFRLEVBQUUsZUFBZTtBQUFBLElBQy9CLE1BQU0sU0FBUyxLQUFLLG9CQUFvQixNQUFNLFNBQVMsTUFBTSxPQUFPO0FBQUEsSUFDcEUsSUFBSSxRQUFRO0FBQUEsTUFDVixNQUFNLFFBQVEsS0FBSyxXQUFXLE9BQU8sUUFBUSxPQUFPLE1BQU07QUFBQSxNQUMxRCxLQUFLLFlBQVksS0FBSztBQUFBLElBQ3hCO0FBQUE7QUFBQSxFQU1NLGFBQWEsQ0FBQyxHQUF3QjtBQUFBLElBQzVDLElBQUksRUFBRSxRQUFRLFVBQVU7QUFBQSxNQUN0QixLQUFLLFlBQVksSUFBSTtBQUFBLElBQ3ZCO0FBQUE7QUFBQSxFQU1GLGFBQWEsR0FBMkI7QUFBQSxJQUN0QyxPQUFPLElBQUksUUFBUSxDQUFDLFlBQVk7QUFBQSxNQUM5QixJQUFJLENBQUMsS0FBSyxPQUFPO0FBQUEsUUFDZixRQUFRLElBQUk7QUFBQSxRQUNaO0FBQUEsTUFDRjtBQUFBLE1BRUEsS0FBSyxXQUFXO0FBQUEsTUFDaEIsS0FBSyxpQkFBaUI7QUFBQSxNQUV0QixLQUFLLGNBQWM7QUFBQSxNQUduQixTQUFTLGlCQUFpQixhQUFhLEtBQUssY0FBYztBQUFBLE1BQzFELFNBQVMsaUJBQWlCLGFBQWEsS0FBSyxjQUFjO0FBQUEsTUFDMUQsU0FBUyxpQkFBaUIsV0FBVyxLQUFLLFlBQVk7QUFBQSxNQUN0RCxTQUFTLGlCQUFpQixhQUFhLEtBQUssZ0JBQWdCO0FBQUEsUUFDMUQsU0FBUztBQUFBLE1BQ1gsQ0FBQztBQUFBLE1BQ0QsU0FBUyxpQkFBaUIsWUFBWSxLQUFLLGFBQWE7QUFBQSxLQUN6RDtBQUFBO0FBQUEsRUFNSyxXQUFXLENBQUMsT0FBNEI7QUFBQSxJQUM5QyxLQUFLLFdBQVc7QUFBQSxJQUdoQixTQUFTLG9CQUFvQixhQUFhLEtBQUssY0FBYztBQUFBLElBQzdELFNBQVMsb0JBQW9CLGFBQWEsS0FBSyxjQUFjO0FBQUEsSUFDN0QsU0FBUyxvQkFBb0IsV0FBVyxLQUFLLFlBQVk7QUFBQSxJQUN6RCxTQUFTLG9CQUFvQixhQUFhLEtBQUssY0FBYztBQUFBLElBQzdELFNBQVMsb0JBQW9CLFlBQVksS0FBSyxhQUFhO0FBQUEsSUFFM0QsS0FBSyxjQUFjO0FBQUEsSUFFbkIsSUFBSSxLQUFLLGdCQUFnQjtBQUFBLE1BQ3ZCLEtBQUssZUFBZSxLQUFLO0FBQUEsTUFDekIsS0FBSyxpQkFBaUI7QUFBQSxJQUN4QjtBQUFBO0FBQUEsRUFNRixVQUFVLEdBQVk7QUFBQSxJQUNwQixPQUFPLEtBQUs7QUFBQTtBQUFBLEVBTWQsT0FBTyxHQUFTO0FBQUEsSUFDZCxLQUFLLFlBQVksSUFBSTtBQUFBLElBQ3JCLEtBQUssUUFBUTtBQUFBO0FBRWpCO0FBS0EsZUFBZSxtQkFBbUIsR0FBMkI7QUFBQSxFQUMzRCxJQUFJLENBQUMsc0JBQXNCLEdBQUc7QUFBQSxJQUM1QixPQUFPO0FBQUEsRUFDVDtBQUFBLEVBRUEsSUFBSTtBQUFBLElBRUYsTUFBTSxhQUFhLElBQUksT0FBTztBQUFBLElBQzlCLE1BQU0sU0FBUyxNQUFNLFdBQVcsS0FBSztBQUFBLElBQ3JDLE9BQU8sT0FBTztBQUFBLElBQ2QsT0FBTyxHQUFHO0FBQUEsSUFFVixPQUFPO0FBQUE7QUFBQTtBQVVKLElBQU0sY0FDWCxDQUFDLFdBQ0QsQ0FZRSxlQUM2RDtBQUFBLEVBQzdELFFBQVEsU0FBUyxVQUFVLFNBQVM7QUFBQSxFQUdwQyxNQUFNLFFBQ0osV0FBVSxTQUFTLG9CQUFtQixNQUFNO0FBQUEsRUFHOUMsTUFBTSxZQUFZLFdBQVUsaUJBQWlCO0FBQUEsRUFHN0MsTUFBTSxpQkFBaUIsQ0FBQyxDQUFDLE9BQU87QUFBQSxFQUNoQyxNQUFNLG1CQUFtQixzQkFBc0I7QUFBQSxFQUMvQyxNQUFNLGNBQ0osT0FBTyxnQkFBZ0Isb0JBQW9CO0FBQUEsRUFFN0MsSUFBSSxDQUFDLGFBQWE7QUFBQSxJQUVoQixNQUFNLGVBQStCO0FBQUEsTUFDbkMsU0FBUyxTQUFTLGNBQWMsS0FBSztBQUFBLE1BQ3JDLE1BQU0sWUFBWTtBQUFBLE1BQ2xCLGdCQUFnQixNQUFNO0FBQUEsTUFDdEIsWUFBWSxNQUFNO0FBQUEsTUFDbEIsU0FBUyxNQUFNO0FBQUEsSUFDakI7QUFBQSxJQUNBLE9BQU87QUFBQSxTQUNGO0FBQUEsTUFDSDtBQUFBLE1BQ0EsU0FBUztBQUFBLElBQ1g7QUFBQSxFQUNGO0FBQUEsRUFHQSxNQUFNLGdCQUFnQixJQUFJO0FBQUEsRUFDMUIsSUFBSSxxQkFDRixPQUFPLGVBQWU7QUFBQSxFQUN4QixJQUFJLGFBQWE7QUFBQSxFQUdqQixJQUFJLG9CQUFvQjtBQUFBLElBQ3RCLGNBQWMsU0FBUyxrQkFBa0IsRUFBRSxNQUFNLENBQUMsTUFBTTtBQUFBLE1BQ3RELFFBQVEsS0FBSyx3Q0FBd0MsQ0FBQztBQUFBLEtBQ3ZEO0FBQUEsRUFDSDtBQUFBLEVBR0EsTUFBTSxTQUFTLCtCQUFpQjtBQUFBLElBQzlCLE1BQU07QUFBQSxJQUNOLFdBQVc7QUFBQSxJQUNYLFNBQVM7QUFBQSxJQUNULE9BQU8sU0FBUywwQkFBMEI7QUFBQSxFQUM1QyxDQUFDO0FBQUEsRUFHRCxJQUFJLFdBQVUsT0FBTyxTQUFTO0FBQUEsSUFDNUIsV0FBVSxNQUFNLFFBQVEsWUFBWSxPQUFPLE9BQU87QUFBQSxFQUNwRCxFQUFPO0FBQUEsSUFDTCxVQUFVLFlBQVksT0FBTyxPQUFPO0FBQUE7QUFBQSxFQU10QyxNQUFNLGNBQWMsTUFBWTtBQUFBLElBQzdCLFdBQWtCLE1BQU0sbUJBQW1CO0FBQUEsSUFDM0MsV0FBa0IsTUFBTSxlQUFlO0FBQUEsSUFDdkMsV0FBa0IsS0FBSyxlQUFlO0FBQUEsSUFDdEMsV0FBa0IsT0FBTyxTQUFTO0FBQUEsSUFDbEMsV0FBa0IsVUFBVSxTQUFTO0FBQUE7QUFBQSxFQU14QyxNQUFNLG9CQUFvQixDQUFDLFVBQStCO0FBQUEsSUFDeEQsYUFBYTtBQUFBLElBQ2IsT0FBTyxlQUFlLEtBQUs7QUFBQSxJQUUzQixJQUFJLE9BQU87QUFBQSxNQUNULE1BQU0sTUFBTSxTQUFTLEtBQUs7QUFBQSxNQUMxQixJQUFJLEtBQUs7QUFBQSxRQUNQLE1BQU0sTUFBTTtBQUFBLFFBQ1osTUFBTSxNQUFNLE1BQU0sWUFBWTtBQUFBLFFBQzlCLFlBQVk7QUFBQSxRQUVaLEtBQUssbUJBQW1CLE9BQU8sTUFBTSxHQUFHO0FBQUEsUUFDeEMsS0FBSyxtQkFBbUIsUUFBUSxNQUFNLEdBQUc7QUFBQSxRQUN6QyxPQUFPLFVBQVUsTUFBTSxHQUFHO0FBQUEsUUFDMUIsT0FBTyxXQUFXLE1BQU0sR0FBRztBQUFBLE1BQzdCO0FBQUEsSUFDRjtBQUFBO0FBQUEsRUFNRixNQUFNLE9BQU8sWUFBb0M7QUFBQSxJQUMvQyxJQUFJO0FBQUEsTUFBWSxPQUFPO0FBQUEsSUFFdkIsYUFBYTtBQUFBLElBQ2IsT0FBTyxpQkFBaUI7QUFBQSxJQUV4QixJQUFJLFFBQXVCO0FBQUEsSUFHM0IsSUFBSSxvQkFBb0IsQ0FBQyxvQkFBb0I7QUFBQSxNQUMzQyxRQUFRLE1BQU0sb0JBQW9CO0FBQUEsSUFDcEMsRUFBTyxTQUFJLG9CQUFvQjtBQUFBLE1BRTdCLFFBQVEsTUFBTSxjQUFjLGNBQWM7QUFBQSxJQUM1QyxFQUFPLFNBQUksa0JBQWtCO0FBQUEsTUFFM0IsUUFBUSxNQUFNLG9CQUFvQjtBQUFBLElBQ3BDO0FBQUEsSUFFQSxrQkFBa0IsS0FBSztBQUFBLElBQ3ZCLE9BQU87QUFBQTtBQUFBLEVBTVQsTUFBTSxpQkFBaUIsQ0FBQyxXQUFtRDtBQUFBLElBQ3pFLHFCQUFxQjtBQUFBLElBQ3JCLElBQUksUUFBUTtBQUFBLE1BQ1YsY0FBYyxTQUFTLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtBQUFBLFFBQzFDLFFBQVEsS0FBSyx3Q0FBd0MsQ0FBQztBQUFBLE9BQ3ZEO0FBQUEsSUFDSDtBQUFBO0FBQUEsRUFJRixPQUFPLEdBQUcsU0FBUyxNQUFNO0FBQUEsSUFDdkIsS0FBSztBQUFBLEdBQ047QUFBQSxFQUdELE1BQU0saUJBQWlDO0FBQUEsSUFDckMsU0FBUyxPQUFPO0FBQUEsSUFDaEI7QUFBQSxJQUNBO0FBQUEsSUFDQSxZQUFZLE1BQU0sY0FBYyxjQUFjLFdBQVc7QUFBQSxJQUN6RCxTQUFTLE1BQU07QUFBQSxNQUNiLGNBQWMsUUFBUTtBQUFBLE1BQ3RCLE9BQU8sVUFBVTtBQUFBLE1BQ2pCLE9BQU8sUUFBUSxPQUFPO0FBQUE7QUFBQSxFQUUxQjtBQUFBLEVBR0EsTUFBTSxrQkFBbUIsV0FBa0IsV0FBVztBQUFBLEVBQ3RELElBQUksaUJBQWlCO0FBQUEsSUFDbEIsV0FBa0IsVUFBVSxVQUFVLE1BQU07QUFBQSxNQUMzQyxlQUFlLFFBQVE7QUFBQSxNQUN2QixnQkFBZ0I7QUFBQTtBQUFBLEVBRXBCO0FBQUEsRUFFQSxPQUFPO0FBQUEsT0FDRjtBQUFBLElBQ0g7QUFBQSxJQUNBLFNBQVM7QUFBQSxFQUNYO0FBQUE7OztBQ3BzQkcsSUFBTSxjQUNYLENBQUMsV0FDRCxDQVlFLGVBQzZEO0FBQUEsRUFDN0QsUUFBUSxTQUFTLFVBQVUsU0FBUztBQUFBLEVBR3BDLE1BQU0sUUFDSixXQUFVLFNBQVMsb0JBQW1CLE1BQU07QUFBQSxFQUc5QyxJQUFJLE1BQU0sWUFBWSxXQUFXO0FBQUEsSUFDL0IsTUFBTSxVQUFVLE9BQU8sV0FBVztBQUFBLEVBQ3BDO0FBQUEsRUFHQSxNQUFNLFlBQVksV0FBVSxpQkFBaUI7QUFBQSxFQUc3QyxNQUFNLGFBQWEsU0FBUyxjQUFjLEtBQUs7QUFBQSxFQUMvQyxXQUFXLFlBQVksU0FBUyxzQkFBc0I7QUFBQSxFQUd0RCxNQUFNLGVBQWUsU0FBUyxjQUFjLEtBQUs7QUFBQSxFQUNqRCxhQUFhLFlBQVksU0FBUyxtQ0FBbUM7QUFBQSxFQUNyRSxXQUFXLFlBQVksWUFBWTtBQUFBLEVBR25DLE1BQU0sUUFBUSxTQUFTLGNBQWMsS0FBSztBQUFBLEVBQzFDLE1BQU0sWUFBWSxTQUFTLDRCQUE0QjtBQUFBLEVBQ3ZELFdBQVcsWUFBWSxLQUFLO0FBQUEsRUFHNUIsTUFBTSxTQUFTLFNBQVMsY0FBYyxLQUFLO0FBQUEsRUFDM0MsT0FBTyxZQUFZLFNBQVMsNkJBQTZCO0FBQUEsRUFDekQsV0FBVyxZQUFZLE1BQU07QUFBQSxFQUc3QixJQUFJLFdBQVUsS0FBSyxTQUFTO0FBQUEsSUFDMUIsV0FBVSxJQUFJLFFBQVEsc0JBQXNCLFlBQVksVUFBVTtBQUFBLEVBQ3BFLEVBQU87QUFBQSxJQUNMLFVBQVUsWUFBWSxVQUFVO0FBQUE7QUFBQSxFQUlsQyxJQUFJLGFBQWE7QUFBQSxFQUtqQixNQUFNLG1CQUFtQixNQUFZO0FBQUEsSUFDbkMsTUFBTSxhQUFhLFNBQVMsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUM7QUFBQSxJQUNqRSxNQUFNLE1BQU0sYUFBYSwwQ0FBMEM7QUFBQTtBQUFBLEVBTXJFLE1BQU0sZUFBZSxNQUFZO0FBQUEsSUFDL0IsTUFBTSxVQUFVLE1BQU0sVUFBVTtBQUFBLElBQ2hDLE9BQU8sTUFBTSxPQUFPLEdBQUc7QUFBQSxJQUV2QixNQUFNLGFBQWEsU0FBUyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQztBQUFBLElBQ2pFLE9BQU8sTUFBTSxrQkFBa0I7QUFBQSxJQUMvQixPQUFPLE1BQU0sVUFBVSxPQUFPLE1BQU0sT0FBTztBQUFBO0FBQUEsRUFNN0MsTUFBTSx5QkFBeUIsQ0FBQyxZQUE0QjtBQUFBLElBQzFELE1BQU0sT0FBTyxXQUFXLHNCQUFzQjtBQUFBLElBQzlDLE1BQU0sSUFBSSxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksVUFBVSxLQUFLLE1BQU0sS0FBSyxLQUFLLENBQUM7QUFBQSxJQUMvRCxNQUFNLFVBQVUsSUFBSSxLQUFLO0FBQUEsSUFDekIsT0FBTyxLQUFLLE1BQU0sVUFBVSxHQUFHLElBQUk7QUFBQTtBQUFBLEVBTXJDLE1BQU0sZ0JBQWdCLENBQUMsU0FBaUIsYUFBNEI7QUFBQSxJQUNsRSxNQUFNLFVBQVU7QUFBQSxJQUVoQixhQUFhO0FBQUEsSUFHYixXQUFXLGFBQ1QsaUJBQ0EsT0FBTyxLQUFLLE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FDbEM7QUFBQSxJQUdBLE1BQU0sS0FBSyxPQUFPLFNBQVM7QUFBQSxJQUUzQixJQUFJLFVBQVU7QUFBQSxNQUNaLEtBQUssbUJBQW1CLFFBQVEsTUFBTSxHQUFHO0FBQUEsTUFDekMsT0FBTyxXQUFXLE1BQU0sR0FBRztBQUFBLElBQzdCLEVBQU87QUFBQSxNQUNMLEtBQUssbUJBQW1CLE9BQU8sTUFBTSxHQUFHO0FBQUEsTUFDeEMsT0FBTyxVQUFVLE1BQU0sR0FBRztBQUFBO0FBQUE7QUFBQSxFQU85QixNQUFNLG9CQUFvQixDQUFDLE1BQTBCO0FBQUEsSUFDbkQsSUFBSSxPQUFPO0FBQUEsTUFBVTtBQUFBLElBRXJCLEVBQUUsZUFBZTtBQUFBLElBQ2pCLGFBQWE7QUFBQSxJQUNiLE1BQU0sYUFBYTtBQUFBLElBQ25CLE1BQU0sYUFBYTtBQUFBLElBR25CLFdBQVcsa0JBQWtCLEVBQUUsU0FBUztBQUFBLElBR3hDLFFBQVEsVUFBVSxJQUFJLFNBQVMsdUJBQXVCLENBQUM7QUFBQSxJQUd2RCxNQUFNLFVBQVUsdUJBQXVCLEVBQUUsT0FBTztBQUFBLElBQ2hELGNBQWMsU0FBUyxLQUFLO0FBQUE7QUFBQSxFQU05QixNQUFNLG9CQUFvQixDQUFDLE1BQTBCO0FBQUEsSUFDbkQsSUFBSSxDQUFDO0FBQUEsTUFBWTtBQUFBLElBRWpCLEVBQUUsZUFBZTtBQUFBLElBQ2pCLE1BQU0sVUFBVSx1QkFBdUIsRUFBRSxPQUFPO0FBQUEsSUFDaEQsY0FBYyxTQUFTLEtBQUs7QUFBQTtBQUFBLEVBTTlCLE1BQU0sa0JBQWtCLENBQUMsTUFBMEI7QUFBQSxJQUNqRCxJQUFJLENBQUM7QUFBQSxNQUFZO0FBQUEsSUFFakIsRUFBRSxlQUFlO0FBQUEsSUFDakIsYUFBYTtBQUFBLElBQ2IsTUFBTSxhQUFhO0FBQUEsSUFDbkIsTUFBTSxhQUFhO0FBQUEsSUFHbkIsV0FBVyxzQkFBc0IsRUFBRSxTQUFTO0FBQUEsSUFHNUMsUUFBUSxVQUFVLE9BQU8sU0FBUyx1QkFBdUIsQ0FBQztBQUFBLElBRzFELE1BQU0sVUFBVSx1QkFBdUIsRUFBRSxPQUFPO0FBQUEsSUFDaEQsY0FBYyxTQUFTLElBQUk7QUFBQTtBQUFBLEVBTTdCLE1BQU0sZ0JBQWdCLENBQUMsTUFBMkI7QUFBQSxJQUNoRCxJQUFJLE9BQU87QUFBQSxNQUFVO0FBQUEsSUFFckIsSUFBSSxVQUFVLE1BQU07QUFBQSxJQUNwQixNQUFNLE9BQU8sRUFBRSxXQUFXLE1BQU07QUFBQSxJQUVoQyxRQUFRLEVBQUU7QUFBQSxXQUNIO0FBQUEsV0FDQTtBQUFBLFFBQ0gsRUFBRSxlQUFlO0FBQUEsUUFDakIsVUFBVSxLQUFLLElBQUksR0FBRyxVQUFVLElBQUk7QUFBQSxRQUNwQztBQUFBLFdBQ0c7QUFBQSxXQUNBO0FBQUEsUUFDSCxFQUFFLGVBQWU7QUFBQSxRQUNqQixVQUFVLEtBQUssSUFBSSxHQUFHLFVBQVUsSUFBSTtBQUFBLFFBQ3BDO0FBQUEsV0FDRztBQUFBLFFBQ0gsRUFBRSxlQUFlO0FBQUEsUUFDakIsVUFBVTtBQUFBLFFBQ1Y7QUFBQSxXQUNHO0FBQUEsUUFDSCxFQUFFLGVBQWU7QUFBQSxRQUNqQixVQUFVO0FBQUEsUUFDVjtBQUFBO0FBQUEsUUFFQTtBQUFBO0FBQUEsSUFJSixVQUFVLEtBQUssTUFBTSxVQUFVLEdBQUcsSUFBSTtBQUFBLElBQ3RDLGNBQWMsU0FBUyxJQUFJO0FBQUE7QUFBQSxFQUk3QixXQUFXLGlCQUFpQixlQUFlLGlCQUFpQjtBQUFBLEVBQzVELFdBQVcsaUJBQWlCLGVBQWUsaUJBQWlCO0FBQUEsRUFDNUQsV0FBVyxpQkFBaUIsYUFBYSxlQUFlO0FBQUEsRUFDeEQsV0FBVyxpQkFBaUIsaUJBQWlCLGVBQWU7QUFBQSxFQUc1RCxXQUFXLFdBQVc7QUFBQSxFQUN0QixXQUFXLGFBQWEsUUFBUSxRQUFRO0FBQUEsRUFDeEMsV0FBVyxhQUFhLGNBQWMsU0FBUztBQUFBLEVBQy9DLFdBQVcsYUFBYSxpQkFBaUIsR0FBRztBQUFBLEVBQzVDLFdBQVcsYUFBYSxpQkFBaUIsS0FBSztBQUFBLEVBQzlDLFdBQVcsYUFDVCxpQkFDQSxPQUFPLEtBQUssTUFBTSxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQ3hDO0FBQUEsRUFDQSxXQUFXLGlCQUFpQixXQUFXLGFBQWE7QUFBQSxFQUdwRCxNQUFNLEtBQUssVUFBVSxFQUFFLGtCQUFrQixhQUFhO0FBQUEsRUFHdEQsaUJBQWlCO0FBQUEsRUFDakIsYUFBYTtBQUFBLEVBR2IsTUFBTSxpQkFBaUM7QUFBQSxJQUNyQyxTQUFTO0FBQUEsSUFDVDtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsRUFDRjtBQUFBLEVBR0EsTUFBTSxrQkFBbUIsV0FBa0IsV0FBVztBQUFBLEVBQ3RELElBQUksaUJBQWlCO0FBQUEsSUFDbEIsV0FBa0IsVUFBVSxVQUFVLE1BQU07QUFBQSxNQUMzQyxXQUFXLG9CQUFvQixlQUFlLGlCQUFpQjtBQUFBLE1BQy9ELFdBQVcsb0JBQW9CLGVBQWUsaUJBQWlCO0FBQUEsTUFDL0QsV0FBVyxvQkFBb0IsYUFBYSxlQUFlO0FBQUEsTUFDM0QsV0FBVyxvQkFBb0IsaUJBQWlCLGVBQWU7QUFBQSxNQUMvRCxXQUFXLG9CQUFvQixXQUFXLGFBQWE7QUFBQSxNQUN2RCxXQUFXLE9BQU87QUFBQSxNQUNsQixnQkFBZ0I7QUFBQTtBQUFBLEVBRXBCO0FBQUEsRUFFQSxPQUFPO0FBQUEsT0FDRjtBQUFBLElBQ0g7QUFBQSxJQUNBLFNBQVM7QUFBQSxFQUNYO0FBQUE7OztBQzVORyxJQUFNLFdBQ1gsQ0FBQyxZQUNELENBQUMsZUFBNkM7QUFBQSxFQUM1QztBQUFBLElBQ0U7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxNQUNFO0FBQUEsRUFHSixJQUFJLENBQUMsT0FBTztBQUFBLElBQ1YsTUFBTSxJQUFJLE1BQU0sZ0NBQWdDO0FBQUEsRUFDbEQ7QUFBQSxFQUtBLE1BQU0sV0FBVyxNQUFZO0FBQUEsSUFDM0IsTUFBTSxpQkFBaUI7QUFBQSxJQUN2QixNQUFNLGFBQWE7QUFBQSxJQUNuQixLQUFLLGFBQWE7QUFBQSxJQUNsQixTQUFTLGlCQUFpQjtBQUFBLElBQzFCLFNBQVMsYUFBYTtBQUFBLElBQ3RCLE9BQU8sT0FBTztBQUFBLElBQ2QsVUFBVSxPQUFPO0FBQUE7QUFBQSxFQU1uQixNQUFNLFdBQVcsQ0FBQyxLQUFhLGFBQXNCLFVBQWdCO0FBQUEsSUFDbkUsTUFBTSxNQUFNLFNBQVMsR0FBRztBQUFBLElBQ3hCLElBQUksQ0FBQztBQUFBLE1BQUs7QUFBQSxJQUVWLE1BQU0sTUFBTTtBQUFBLElBQ1osTUFBTSxNQUFNLGFBQWEsR0FBRztBQUFBLElBQzVCLFNBQVM7QUFBQSxJQUVULElBQUksWUFBWTtBQUFBLE1BQ2QsS0FBSyxtQkFBbUIsUUFBUSxNQUFNLEdBQUc7QUFBQSxNQUN6QyxPQUFPLFdBQVcsTUFBTSxHQUFHO0FBQUEsSUFDN0I7QUFBQTtBQUFBLEVBTUYsTUFBTSxpQkFBaUIsQ0FDckIsS0FDQSxhQUFzQixVQUNiO0FBQUEsSUFDVCxNQUFNLE1BQU07QUFBQSxNQUNWLEdBQUcsS0FBSyxJQUFJLEdBQUcsS0FBSyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7QUFBQSxNQUNuQyxHQUFHLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxLQUFLLElBQUksQ0FBQyxDQUFDO0FBQUEsTUFDbkMsR0FBRyxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztBQUFBLElBQ3JDO0FBQUEsSUFDQSxNQUFNLE1BQU0sU0FBUyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQztBQUFBLElBQzFELFNBQVM7QUFBQSxJQUVULElBQUksWUFBWTtBQUFBLE1BQ2QsS0FBSyxtQkFBbUIsUUFBUSxNQUFNLEdBQUc7QUFBQSxNQUN6QyxPQUFPLFdBQVcsTUFBTSxHQUFHO0FBQUEsSUFDN0I7QUFBQTtBQUFBLEVBSUYsTUFBTSx1QkFBNkM7QUFBQSxJQUNqRDtBQUFBLElBSUEsVUFBVSxNQUFNLE1BQU07QUFBQSxJQUV0QixVQUFVLENBQUMsVUFBa0I7QUFBQSxNQUMzQixTQUFTLE9BQU8sS0FBSztBQUFBLE1BQ3JCLE9BQU87QUFBQTtBQUFBLElBR1QsUUFBUSxPQUFPLEtBQUssTUFBTSxJQUFJO0FBQUEsSUFFOUIsUUFBUSxDQUFDLFFBQWtCO0FBQUEsTUFDekIsZUFBZSxLQUFLLEtBQUs7QUFBQSxNQUN6QixPQUFPO0FBQUE7QUFBQSxJQUdULFFBQVEsTUFBZ0I7QUFBQSxNQUN0QixNQUFNLE1BQU0sU0FBUyxNQUFNLEdBQUc7QUFBQSxNQUM5QixPQUFPLE9BQU8sRUFBRSxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsRUFBRTtBQUFBO0FBQUEsSUFHbkMsUUFBUSxDQUFDLFFBQWtCO0FBQUEsTUFDekIsTUFBTSxNQUFNLFNBQVMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLENBQUM7QUFBQSxNQUN4QyxTQUFTLEtBQUssS0FBSztBQUFBLE1BQ25CLE9BQU87QUFBQTtBQUFBLElBS1QsYUFBYSxDQUFDLGtCQUE0QztBQUFBLE1BQ3hELElBQUksVUFBVTtBQUFBLFFBQ1osU0FBUyxJQUFJLGFBQWE7QUFBQSxNQUM1QjtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsSUFHVCxhQUFhLE1BQU07QUFBQSxNQUNqQixPQUFPLFdBQVcsU0FBUyxJQUFJLElBQUksQ0FBQztBQUFBO0FBQUEsSUFHdEMsV0FBVyxDQUFDLE9BQWUsVUFBbUI7QUFBQSxNQUM1QyxJQUFJLFVBQVU7QUFBQSxRQUNaLFNBQVMsSUFBSSxPQUFPLEtBQUs7QUFBQSxNQUMzQjtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsSUFHVCxjQUFjLENBQUMsVUFBa0I7QUFBQSxNQUMvQixJQUFJLFVBQVU7QUFBQSxRQUNaLFNBQVMsT0FBTyxLQUFLO0FBQUEsTUFDdkI7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLElBR1QsZUFBZSxNQUFNO0FBQUEsTUFDbkIsSUFBSSxVQUFVO0FBQUEsUUFDWixTQUFTLE1BQU07QUFBQSxNQUNqQjtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsSUFLVCxRQUFRLE1BQU07QUFBQSxNQUNaLFNBQVMsT0FBTztBQUFBLE1BQ2hCLE9BQU87QUFBQTtBQUFBLElBR1QsU0FBUyxNQUFNO0FBQUEsTUFDYixTQUFTLFFBQVE7QUFBQSxNQUNqQixPQUFPO0FBQUE7QUFBQSxJQUdULFlBQVksTUFBTSxTQUFTLFdBQVc7QUFBQSxJQUl0QyxNQUFNLE1BQU07QUFBQSxNQUNWLElBQUksU0FBUztBQUFBLFFBQ1gsUUFBUSxLQUFLO0FBQUEsTUFDZjtBQUFBLE1BQ0EsT0FBTztBQUFBO0FBQUEsSUFHVCxPQUFPLE1BQU07QUFBQSxNQUNYLElBQUksU0FBUztBQUFBLFFBQ1gsUUFBUSxNQUFNO0FBQUEsTUFDaEI7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLElBR1QsUUFBUSxNQUFNO0FBQUEsTUFDWixJQUFJLFNBQVM7QUFBQSxRQUNYLFFBQVEsT0FBTztBQUFBLE1BQ2pCO0FBQUEsTUFDQSxPQUFPO0FBQUE7QUFBQSxJQUdULFFBQVEsTUFBTTtBQUFBLE1BQ1osT0FBTyxVQUFVLFFBQVEsT0FBTyxJQUFJO0FBQUE7QUFBQSxJQUt0QyxXQUFXLFlBQVk7QUFBQSxNQUNyQixJQUFJLFNBQVM7QUFBQSxRQUNYLE9BQU8sUUFBUSxLQUFLO0FBQUEsTUFDdEI7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLElBR1QsZ0JBQWdCLENBQUMsV0FBNkM7QUFBQSxNQUM1RCxJQUFJLFNBQVM7QUFBQSxRQUNYLFFBQVEsZUFBZSxNQUFNO0FBQUEsTUFDL0I7QUFBQSxNQUNBLE9BQU87QUFBQTtBQUFBLElBR1QsWUFBWSxNQUFNO0FBQUEsTUFDaEIsT0FBTyxVQUFVLFFBQVEsV0FBVyxJQUFJO0FBQUE7QUFBQSxJQUsxQyxZQUFZLE1BQU07QUFBQSxNQUNoQixPQUFPLE1BQU07QUFBQTtBQUFBLElBR2YsWUFBWSxDQUFDLGlCQUF5QjtBQUFBLE1BQ3BDLE1BQU0sVUFBVSxLQUFLLElBQUksR0FBRyxLQUFLLElBQUksR0FBRyxZQUFZLENBQUM7QUFBQSxNQUNyRCxTQUFTLGFBQWE7QUFBQSxNQUN0QixPQUFPO0FBQUE7QUFBQSxJQUtULElBQUksQ0FBQyxPQUFlLFlBQTBDO0FBQUEsTUFDNUQsR0FBRyxPQUFPLE9BQU87QUFBQSxNQUNqQixPQUFPO0FBQUE7QUFBQSxJQUdULEtBQUssQ0FBQyxPQUFlLFlBQTBDO0FBQUEsTUFDN0QsSUFBSSxPQUFPLE9BQU87QUFBQSxNQUNsQixPQUFPO0FBQUE7QUFBQSxJQUtULFNBQVMsTUFBTTtBQUFBLE1BQ2IsVUFBVSxRQUFRO0FBQUE7QUFBQSxFQUV0QjtBQUFBLEVBR0MscUJBQTZCLFdBQVc7QUFBQSxFQUN4QyxxQkFBNkIsV0FBVztBQUFBLEVBR3pDLElBQUksQ0FBQyxXQUFXLFFBQVEsT0FBTyxHQUFHO0FBQUEsSUFDaEMsU0FBUztBQUFBLEVBQ1g7QUFBQSxFQUVBLE9BQU87QUFBQTs7O0FYcFBYLElBQU0sb0JBQW9CLENBQ3hCLFNBQTRCLENBQUMsTUFDSjtBQUFBLEVBQ3pCLE1BQU0sYUFBYSxrQkFBaUIsTUFBTTtBQUFBLEVBRTFDLElBQUk7QUFBQSxJQUNGLE1BQU0sdUJBQ0osV0FBVyxZQUFZLHFCQUFxQixZQUM1QyxXQUFXLFlBQVkscUJBQXFCO0FBQUEsSUFFOUMsTUFBTSxjQUFjLG1CQUNsQiwwQkFDQSx5QkFBVyxHQUNYLDBCQUFZLGtCQUFpQixVQUFVLENBQUMsR0FDeEMsMkJBQWEsVUFBVSxHQUV2Qix1QkFBdUIsWUFBWSxVQUFVLElBQUksQ0FBQyxNQUFXLEdBRTdELFdBQVcsYUFBYSxRQUFRLFNBQVMsVUFBVSxJQUFJLENBQUMsTUFBVyxHQUNuRSxXQUFXLFlBQVksUUFBUSxRQUFRLFVBQVUsSUFBSSxDQUFDLE1BQVcsR0FDakUsV0FBVyxnQkFBZ0IsT0FBTyxZQUFZLFVBQVUsSUFBSSxDQUFDLE1BQVcsR0FDeEUsV0FBVyxjQUFjLFNBQVMsV0FBVyxnQkFBZ0IsUUFDekQsVUFBVSxVQUFVLElBQ3BCLENBQUMsTUFBVyxHQUNoQixXQUFXLGlCQUFpQixRQUN4QixhQUFhLFVBQVUsSUFDdkIsQ0FBQyxNQUFXLEdBRWhCLFdBQVcsZ0JBQWdCLFVBQ3hCLHNCQUFzQixLQUFLLFdBQVcsZUFDckMsWUFBWSxVQUFVLElBQ3RCLENBQUMsTUFBVyxHQUNoQiw0QkFBYyxHQUNkLENBQUMsU0FBYyxTQUFRLGFBQWEsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUNqRCxFQUFFLFVBQVU7QUFBQSxJQUVaLE9BQU87QUFBQSxJQUNQLE9BQU8sT0FBTztBQUFBLElBQ2QsUUFBUSxNQUFNLCtCQUErQixLQUFLO0FBQUEsSUFDbEQsTUFBTSxJQUFJLE1BQ1IsaUNBQWtDLE1BQWdCLFNBQ3BEO0FBQUE7QUFBQTtBQUlKLElBQWU7IiwKICAiZGVidWdJZCI6ICJBQjU3QzM1MzVFQUFDMDg5NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|