@ilamy/calendar 0.1.6 → 0.1.7
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.d.ts +161 -14
- package/dist/index.js +35 -11
- package/package.json +1 -5
- package/dist/index.cjs +0 -3570
- package/dist/index.d.cts +0 -200
package/dist/index.js
CHANGED
|
@@ -780,7 +780,7 @@ function DraggableEventUnmemoized({
|
|
|
780
780
|
});
|
|
781
781
|
}
|
|
782
782
|
var DraggableEvent = memo(DraggableEventUnmemoized, (prevProps, nextProps) => {
|
|
783
|
-
return prevProps.elementId === nextProps.elementId && prevProps.disableDrag === nextProps.disableDrag && prevProps.className === nextProps.className && prevProps.event.id === nextProps.event.id
|
|
783
|
+
return prevProps.elementId === nextProps.elementId && prevProps.disableDrag === nextProps.disableDrag && prevProps.className === nextProps.className && prevProps.event.id === nextProps.event.id;
|
|
784
784
|
});
|
|
785
785
|
|
|
786
786
|
// src/features/month-view/components/all-events-dialog.tsx
|
|
@@ -1023,7 +1023,6 @@ var WeekEventsLayer = ({ days }) => {
|
|
|
1023
1023
|
const weekStart = days[0];
|
|
1024
1024
|
const weekEnd = days[6];
|
|
1025
1025
|
const weekEvents = events.filter((e) => {
|
|
1026
|
-
console.log("Checking event:", e);
|
|
1027
1026
|
const startsInWeek = e.start.isSameOrAfter(weekStart.startOf("day")) && e.start.isSameOrBefore(weekEnd.endOf("day"));
|
|
1028
1027
|
const endsInWeek = e.end.isSameOrAfter(weekStart.startOf("day")) && e.end.isSameOrBefore(weekEnd.endOf("day"));
|
|
1029
1028
|
const spansWeek = e.start.isBefore(weekStart.startOf("day")) && e.end.isAfter(weekEnd.endOf("day"));
|
|
@@ -2582,7 +2581,8 @@ var Header2 = () => {
|
|
|
2582
2581
|
nextPeriod,
|
|
2583
2582
|
prevPeriod,
|
|
2584
2583
|
today,
|
|
2585
|
-
openEventForm
|
|
2584
|
+
openEventForm,
|
|
2585
|
+
headerComponent
|
|
2586
2586
|
} = useCalendarContext();
|
|
2587
2587
|
const [mobilePopoverOpen, setMobilePopoverOpen] = useState4(false);
|
|
2588
2588
|
const handleViewChange = (newView, closePopover = false) => {
|
|
@@ -2627,6 +2627,9 @@ var Header2 = () => {
|
|
|
2627
2627
|
]
|
|
2628
2628
|
})
|
|
2629
2629
|
}), [currentDate, openEventForm]);
|
|
2630
|
+
if (headerComponent) {
|
|
2631
|
+
return headerComponent;
|
|
2632
|
+
}
|
|
2630
2633
|
return /* @__PURE__ */ jsx44(Fragment4, {
|
|
2631
2634
|
children: /* @__PURE__ */ jsxs24("div", {
|
|
2632
2635
|
className: "@container grid grid-cols-12 items-center gap-2 border-b p-2 sm:p-4",
|
|
@@ -2995,7 +2998,8 @@ var CalendarProvider = ({
|
|
|
2995
2998
|
disableDragAndDrop,
|
|
2996
2999
|
dayMaxEvents,
|
|
2997
3000
|
stickyViewHeader,
|
|
2998
|
-
viewHeaderClassName
|
|
3001
|
+
viewHeaderClassName,
|
|
3002
|
+
headerComponent
|
|
2999
3003
|
}) => {
|
|
3000
3004
|
const [currentDate, setCurrentDate] = useState5(dayjs_config_default());
|
|
3001
3005
|
const [view, setView] = useState5("month");
|
|
@@ -3384,7 +3388,8 @@ var CalendarProvider = ({
|
|
|
3384
3388
|
disableDragAndDrop,
|
|
3385
3389
|
dayMaxEvents,
|
|
3386
3390
|
stickyViewHeader,
|
|
3387
|
-
viewHeaderClassName
|
|
3391
|
+
viewHeaderClassName,
|
|
3392
|
+
headerComponent
|
|
3388
3393
|
}), [
|
|
3389
3394
|
currentDate,
|
|
3390
3395
|
view,
|
|
@@ -3420,7 +3425,8 @@ var CalendarProvider = ({
|
|
|
3420
3425
|
disableDragAndDrop,
|
|
3421
3426
|
dayMaxEvents,
|
|
3422
3427
|
stickyViewHeader,
|
|
3423
|
-
viewHeaderClassName
|
|
3428
|
+
viewHeaderClassName,
|
|
3429
|
+
headerComponent
|
|
3424
3430
|
]);
|
|
3425
3431
|
return /* @__PURE__ */ jsx47(CalendarContext.Provider, {
|
|
3426
3432
|
value: contextValue,
|
|
@@ -3430,6 +3436,22 @@ var CalendarProvider = ({
|
|
|
3430
3436
|
|
|
3431
3437
|
// src/components/ilamy-calendar/ilamy-calendar.tsx
|
|
3432
3438
|
import { jsx as jsx48, jsxs as jsxs27 } from "react/jsx-runtime";
|
|
3439
|
+
function normalizeCalendarEvents(events) {
|
|
3440
|
+
return events.map((event) => {
|
|
3441
|
+
const recurrence = event.recurrence;
|
|
3442
|
+
if (recurrence) {
|
|
3443
|
+
recurrence.endDate = recurrence?.endDate ? dayjs_config_default.isDayjs(recurrence.endDate) ? recurrence.endDate : dayjs_config_default(recurrence.endDate) : undefined;
|
|
3444
|
+
}
|
|
3445
|
+
return {
|
|
3446
|
+
...event,
|
|
3447
|
+
start: dayjs_config_default.isDayjs(event.start) ? event.start : dayjs_config_default(event.start),
|
|
3448
|
+
end: dayjs_config_default.isDayjs(event.end) ? event.end : dayjs_config_default(event.end),
|
|
3449
|
+
originalStart: event.originalStart ? dayjs_config_default.isDayjs(event.originalStart) ? event.originalStart : dayjs_config_default(event.originalStart) : undefined,
|
|
3450
|
+
originalEnd: event.originalEnd ? dayjs_config_default.isDayjs(event.originalEnd) ? event.originalEnd : dayjs_config_default(event.originalEnd) : undefined,
|
|
3451
|
+
recurrence
|
|
3452
|
+
};
|
|
3453
|
+
});
|
|
3454
|
+
}
|
|
3433
3455
|
var CalendarContent = () => {
|
|
3434
3456
|
const {
|
|
3435
3457
|
view,
|
|
@@ -3493,7 +3515,7 @@ var dayNumberMap = {
|
|
|
3493
3515
|
friday: 5,
|
|
3494
3516
|
saturday: 6
|
|
3495
3517
|
};
|
|
3496
|
-
var DEFAULT_DAY_MAX_EVENTS =
|
|
3518
|
+
var DEFAULT_DAY_MAX_EVENTS = 4;
|
|
3497
3519
|
var IlamyCalendar = ({
|
|
3498
3520
|
events,
|
|
3499
3521
|
firstDayOfWeek = "sunday",
|
|
@@ -3508,10 +3530,11 @@ var IlamyCalendar = ({
|
|
|
3508
3530
|
disableDragAndDrop,
|
|
3509
3531
|
dayMaxEvents = DEFAULT_DAY_MAX_EVENTS,
|
|
3510
3532
|
stickyViewHeader = true,
|
|
3511
|
-
viewHeaderClassName = ""
|
|
3533
|
+
viewHeaderClassName = "",
|
|
3534
|
+
headerComponent
|
|
3512
3535
|
}) => {
|
|
3513
3536
|
return /* @__PURE__ */ jsx48(CalendarProvider, {
|
|
3514
|
-
events,
|
|
3537
|
+
events: normalizeCalendarEvents(events || []),
|
|
3515
3538
|
firstDayOfWeek: dayNumberMap[firstDayOfWeek],
|
|
3516
3539
|
renderEvent,
|
|
3517
3540
|
onEventClick,
|
|
@@ -3525,6 +3548,7 @@ var IlamyCalendar = ({
|
|
|
3525
3548
|
dayMaxEvents,
|
|
3526
3549
|
stickyViewHeader,
|
|
3527
3550
|
viewHeaderClassName,
|
|
3551
|
+
headerComponent,
|
|
3528
3552
|
children: /* @__PURE__ */ jsx48(CalendarContent, {})
|
|
3529
3553
|
});
|
|
3530
3554
|
};
|
|
@@ -3533,5 +3557,5 @@ export {
|
|
|
3533
3557
|
IlamyCalendar
|
|
3534
3558
|
};
|
|
3535
3559
|
|
|
3536
|
-
//# debugId=
|
|
3537
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2ZlYXR1cmVzL21vbnRoLXZpZXcvY29tcG9uZW50cy9tb250aC12aWV3LnRzeCIsICIuLi9zcmMvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL2FjY29yZGlvbi50c3giLCAiLi4vc3JjL2xpYi91dGlscy50cyIsICIuLi9zcmMvbGliL2RheWpzLWNvbmZpZy50cyIsICIuLi9zcmMvY29tcG9uZW50cy91aS9hbGVydC50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvYmFkZ2UudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL2J1dHRvbi50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvY2FsZW5kYXIudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL2NoZWNrYm94LnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy91aS9kYXRlLXBpY2tlci50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvcG9wb3Zlci50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvZGlhbG9nLnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy91aS9kcm9wZG93bi1tZW51LnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy91aS9mb3JtLnRzeCIsICIuLi9ub2RlX21vZHVsZXMvcmVhY3QtaG9vay1mb3JtL2Rpc3QvaW5kZXguZXNtLm1qcyIsICIuLi9zcmMvY29tcG9uZW50cy91aS9sYWJlbC50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvaW5wdXQudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL3Njcm9sbC1hcmVhLnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy91aS9zZWxlY3QudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL3NlcGFyYXRvci50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvc2hlZXQudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL3RhYnMudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL3Rvb2x0aXAudHN4IiwgIi4uL3NyYy9mZWF0dXJlcy9tb250aC12aWV3L2NvbXBvbmVudHMvYWxsLWV2ZW50cy1kaWFsb2cudHN4IiwgIi4uL3NyYy9mZWF0dXJlcy9kcmFnZ2FibGUtZXZlbnQvZHJhZ2dhYmxlLWV2ZW50LnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvbW9udGgtdmlldy9jb21wb25lbnRzL2RheS1jZWxsLnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvZHJvcHBhYmxlLWNlbGwvZHJvcHBhYmxlLWNlbGwudHN4IiwgIi4uL3NyYy9mZWF0dXJlcy9tb250aC12aWV3L2NvbXBvbmVudHMvbW9udGgtaGVhZGVyLnRzeCIsICIuLi9zcmMvbGliL2NvbnN0YW50cy50cyIsICIuLi9zcmMvZmVhdHVyZXMvbW9udGgtdmlldy9jb21wb25lbnRzL3dlZWstZXZlbnRzLWxheWVyLnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvd2Vlay12aWV3L3dlZWstdmlldy50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL3dlZWstdmlldy93ZWVrLWFsbC1kYXktcm93LnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvd2Vlay12aWV3L3dlZWstaGVhZGVyLnRzeCIsICIuLi9zcmMvaG9va3MvdXNlUHJvY2Vzc2VkRGF5RXZlbnRzLnRzIiwgIi4uL3NyYy9mZWF0dXJlcy9kYXktdmlldy9kYXktZXZlbnRzLWxheWVyLnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvd2Vlay12aWV3L3dlZWstZGF5LWNvbC50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL3dlZWstdmlldy93ZWVrLXRpbWUtZ3JpZC50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL2RheS12aWV3L2RheS12aWV3LnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvZGF5LXZpZXcvZGF5LWFsbC1kYXktcm93LnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvZGF5LXZpZXcvZGF5LWhlYWRlci50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL2RheS12aWV3L2RheS10aW1lLWNvbC50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvZXZlbnQtZm9ybS9ldmVudC1mb3JtLnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy9oZWFkZXIvYmFzZS1oZWFkZXIudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL2hlYWRlci90aXRsZS1jb250ZW50LnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy9oZWFkZXIvdmlldy1jb250cm9scy50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL3llYXItdmlldy95ZWFyLXZpZXcudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL2lsYW15LWNhbGVuZGFyL2lsYW15LWNhbGVuZGFyLnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvZHJhZy1hbmQtZHJvcC9jYWxlbmRhci1kbmQtY29udGV4dC50c3giLCAiLi4vc3JjL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvcHJvdmlkZXIudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IEFuaW1hdGVQcmVzZW5jZSwgbW90aW9uIH0gZnJvbSAnbW90aW9uL3JlYWN0J1xuaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgQWxsRXZlbnREaWFsb2cgfSBmcm9tICcuL2FsbC1ldmVudHMtZGlhbG9nJ1xuaW1wb3J0IHsgRGF5Q2VsbCB9IGZyb20gJy4vZGF5LWNlbGwnXG5pbXBvcnQgdHlwZSB7IE1vbnRoVmlld1Byb3BzLCBTZWxlY3RlZERheUV2ZW50cyB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgTW9udGhIZWFkZXIgfSBmcm9tICcuL21vbnRoLWhlYWRlcidcbmltcG9ydCB7IFdlZWtFdmVudHNMYXllciB9IGZyb20gJy4vd2Vlay1ldmVudHMtbGF5ZXInXG5cbmV4cG9ydCBjb25zdCBNb250aFZpZXc6IFJlYWN0LkZDPE1vbnRoVmlld1Byb3BzPiA9ICh7IGRheU1heEV2ZW50cyA9IDMgfSkgPT4ge1xuICBjb25zdCBhbGxFdmVudHNEaWFsb2dSZWYgPSBSZWFjdC51c2VSZWY8e1xuICAgIG9wZW46ICgpID0+IHZvaWRcbiAgICBjbG9zZTogKCkgPT4gdm9pZFxuICAgIHNldFNlbGVjdGVkRGF5RXZlbnRzOiAoZGF5RXZlbnRzOiBTZWxlY3RlZERheUV2ZW50cykgPT4gdm9pZFxuICB9PihudWxsKVxuICBjb25zdCB7IGN1cnJlbnREYXRlLCBmaXJzdERheU9mV2VlayB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICAvLyBHZXQgc3RhcnQgZGF0ZSBmb3IgdGhlIGN1cnJlbnQgbW9udGggdmlldyBiYXNlZCBvbiBmaXJzdERheU9mV2Vla1xuICBjb25zdCBmaXJzdERheU9mTW9udGggPSBjdXJyZW50RGF0ZS5zdGFydE9mKCdtb250aCcpXG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBmaXJzdCBkYXkgb2YgdGhlIGNhbGVuZGFyIGdyaWQgY29ycmVjdGx5XG4gIC8vIEZpbmQgdGhlIGZpcnN0IGRheSBvZiB3ZWVrIChlLmcuIFN1bmRheSBvciBNb25kYXkpIHRoYXQgY29tZXMgYmVmb3JlIG9yIG9uIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoXG4gIGxldCBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhciA9IGZpcnN0RGF5T2ZNb250aC5jbG9uZSgpXG4gIHdoaWxlIChhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhci5kYXkoKSAhPT0gZmlyc3REYXlPZldlZWspIHtcbiAgICBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhciA9IGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyLnN1YnRyYWN0KDEsICdkYXknKVxuICB9XG5cbiAgLy8gQWx3YXlzIGdlbmVyYXRlIDYgd2Vla3MgKDQyIGRheXMpIHJlZ2FyZGxlc3Mgb2YgdGhlIG1vbnRoIGxlbmd0aFxuICAvLyBUaGlzIGVuc3VyZXMgd2UgYWx3YXlzIGhhdmUgNiByb3dzIG9mIGRheXNcbiAgY29uc3QgY2FsZW5kYXJEYXlzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gNiB3ZWVrcyDDlyA3IGRheXMgPSA0MiBkYXlzXG4gICAgY29uc3QgZGF5czogZGF5anMuRGF5anNbXVtdID0gW1tdXVxuICAgIGxldCBkYXkgPSBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhci5jbG9uZSgpIC8vIENsb25lIHRvIGF2b2lkIG11dGF0aW9uXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0MjsgaSsrKSB7XG4gICAgICBpZiAoZGF5c1tkYXlzLmxlbmd0aCAtIDFdLmxlbmd0aCA9PT0gNykge1xuICAgICAgICBkYXlzLnB1c2goW10pIC8vIFN0YXJ0IGEgbmV3IHdlZWtcbiAgICAgIH1cbiAgICAgIGRheXNbZGF5cy5sZW5ndGggLSAxXS5wdXNoKGRheSlcbiAgICAgIGRheSA9IGRheS5hZGQoMSwgJ2RheScpIC8vIE1vdmUgdG8gdGhlIG5leHQgZGF5XG4gICAgfVxuICAgIHJldHVybiBkYXlzXG4gIH0sIFthZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhcl0pXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaC1mdWxsIGZsZXgtY29sXCIgZGF0YS10ZXN0aWQ9XCJtb250aC12aWV3XCI+XG4gICAgICB7LyogV2VlayBkYXlzIGhlYWRlciAqL31cbiAgICAgIDxNb250aEhlYWRlciAvPlxuXG4gICAgICB7LyogQ2FsZW5kYXIgZ3JpZCAtIGFkZGVkIGZpeGVkIGhlaWdodCAqL31cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LWF1dG8gaC1mdWxsXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJtb250aC1zY3JvbGwtYXJlYVwiXG4gICAgICA+XG4gICAgICAgIDxBbmltYXRlUHJlc2VuY2UgbW9kZT1cIndhaXRcIj5cbiAgICAgICAgICA8bW90aW9uLmRpdlxuICAgICAgICAgICAga2V5PXtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICAgIGluaXRpYWw9e3sgb3BhY2l0eTogMCB9fVxuICAgICAgICAgICAgYW5pbWF0ZT17eyBvcGFjaXR5OiAxIH19XG4gICAgICAgICAgICBleGl0PXt7IG9wYWNpdHk6IDAgfX1cbiAgICAgICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuMjUsIGVhc2U6ICdlYXNlSW5PdXQnIH19XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBncmlkIGgtZnVsbCBncmlkLWNvbHMtNyBncmlkLXJvd3MtNiBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibW9udGgtY2FsZW5kYXItZ3JpZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgey8qIERheSBjZWxscyAqL31cbiAgICAgICAgICAgIHtjYWxlbmRhckRheXMubWFwKChkYXlzLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGtleT17YHdlZWstJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgY29sLXNwYW4tNyBncmlkIGdyaWQtY29scy03XCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgd2Vlay1yb3ctJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtkYXlzLm1hcCgoZGF5LCBkYXlJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxEYXlDZWxsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleD17ZGF5SW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXk9e2RheX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRheU1heEV2ZW50cz17ZGF5TWF4RXZlbnRzfVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtkYXkuZm9ybWF0KCdZWVlZLU1NLUREJyl9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXItciBib3JkZXItYiBmaXJzdDpib3JkZXItbFwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgfSl9XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCB6LTEwIHBvaW50ZXItZXZlbnRzLW5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPFdlZWtFdmVudHNMYXllciBkYXlzPXtkYXlzfSAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvbW90aW9uLmRpdj5cbiAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIERpYWxvZyBmb3Igc2hvd2luZyBhbGwgZXZlbnRzICovfVxuICAgICAgPEFsbEV2ZW50RGlhbG9nIHJlZj17YWxsRXZlbnRzRGlhbG9nUmVmfSAvPlxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcbmltcG9ydCB0eXBlIGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCdcblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhckNvbnRleHRUeXBlIHtcbiAgY3VycmVudERhdGU6IGRheWpzLkRheWpzXG4gIHZpZXc6ICdtb250aCcgfCAnd2VlaycgfCAnZGF5JyB8ICd5ZWFyJ1xuICBldmVudHM6IENhbGVuZGFyRXZlbnRbXVxuICBpc0V2ZW50Rm9ybU9wZW46IGJvb2xlYW5cbiAgc2VsZWN0ZWRFdmVudDogQ2FsZW5kYXJFdmVudCB8IG51bGxcbiAgc2VsZWN0ZWREYXRlOiBkYXlqcy5EYXlqcyB8IG51bGxcbiAgZmlyc3REYXlPZldlZWs6IG51bWJlciAvLyAwIGZvciBTdW5kYXksIDEgZm9yIE1vbmRheSwgZXRjLlxuICBzZXRDdXJyZW50RGF0ZTogKGRhdGU6IGRheWpzLkRheWpzKSA9PiB2b2lkXG4gIHNlbGVjdERhdGU6IChkYXRlOiBkYXlqcy5EYXlqcykgPT4gdm9pZFxuICBzZXRWaWV3OiAodmlldzogJ21vbnRoJyB8ICd3ZWVrJyB8ICdkYXknIHwgJ3llYXInKSA9PiB2b2lkXG4gIG5leHRQZXJpb2Q6ICgpID0+IHZvaWRcbiAgcHJldlBlcmlvZDogKCkgPT4gdm9pZFxuICB0b2RheTogKCkgPT4gdm9pZFxuICBhZGRFdmVudDogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB2b2lkXG4gIHVwZGF0ZUV2ZW50OiAoZXZlbnRJZDogc3RyaW5nLCBldmVudDogUGFydGlhbDxDYWxlbmRhckV2ZW50PikgPT4gdm9pZFxuICBkZWxldGVFdmVudDogKGV2ZW50SWQ6IHN0cmluZykgPT4gdm9pZFxuICBvcGVuRXZlbnRGb3JtOiAoZGF0ZT86IGRheWpzLkRheWpzLCBldmVudD86IENhbGVuZGFyRXZlbnQpID0+IHZvaWRcbiAgY2xvc2VFdmVudEZvcm06ICgpID0+IHZvaWRcbiAgZ2V0RXZlbnRzRm9yRGF0ZTogKGRhdGU6IGRheWpzLkRheWpzKSA9PiBDYWxlbmRhckV2ZW50W11cbiAgZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlOiAoXG4gICAgc3RhcnQ6IGRheWpzLkRheWpzLFxuICAgIGVuZDogZGF5anMuRGF5anNcbiAgKSA9PiBDYWxlbmRhckV2ZW50W11cbiAgZXhwYW5kUmVjdXJyaW5nRXZlbnQ6IChcbiAgICBiYXNlRXZlbnQ6IENhbGVuZGFyRXZlbnQsXG4gICAgc3RhcnREYXRlOiBkYXlqcy5EYXlqcyxcbiAgICBlbmREYXRlOiBkYXlqcy5EYXlqc1xuICApID0+IENhbGVuZGFyRXZlbnRbXVxuICBhZGRSZWN1cnJpbmdFdmVudDogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB2b2lkXG4gIGRlbGV0ZVJlY3VycmluZ0V2ZW50OiAoZXZlbnRJZDogc3RyaW5nLCBkZWxldGVBbGw6IGJvb2xlYW4pID0+IHZvaWRcbiAgdXBkYXRlUmVjdXJyaW5nRXZlbnQ6IChcbiAgICBldmVudElkOiBzdHJpbmcsXG4gICAgdXBkYXRlZEV2ZW50OiBQYXJ0aWFsPENhbGVuZGFyRXZlbnQ+LFxuICAgIHVwZGF0ZUFsbDogYm9vbGVhblxuICApID0+IHZvaWRcbiAgY3JlYXRlRXhjZXB0aW9uRm9yUmVjdXJyaW5nRXZlbnQ6IChldmVudElkOiBzdHJpbmcsIGRhdGU6IGRheWpzLkRheWpzKSA9PiB2b2lkXG4gIHJlbmRlckV2ZW50PzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiBSZWFjdC5SZWFjdE5vZGVcbiAgb25FdmVudENsaWNrOiAoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHZvaWRcbiAgb25DZWxsQ2xpY2s6IChzdGFydERhdGU6IGRheWpzLkRheWpzLCBlbmREYXRlOiBkYXlqcy5EYXlqcykgPT4gdm9pZFxuICBjdXJyZW50TG9jYWxlPzogc3RyaW5nXG4gIGRpc2FibGVDZWxsQ2xpY2s/OiBib29sZWFuXG4gIGRpc2FibGVFdmVudENsaWNrPzogYm9vbGVhblxuICBkaXNhYmxlRHJhZ0FuZERyb3A/OiBib29sZWFuXG4gIGRheU1heEV2ZW50czogbnVtYmVyXG4gIHN0aWNreVZpZXdIZWFkZXI6IGJvb2xlYW5cbiAgdmlld0hlYWRlckNsYXNzTmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBDYWxlbmRhckNvbnRleHQgPSBjcmVhdGVDb250ZXh0PENhbGVuZGFyQ29udGV4dFR5cGUgfCB1bmRlZmluZWQ+KFxuICB1bmRlZmluZWRcbilcblxuZXhwb3J0IGNvbnN0IHVzZUNhbGVuZGFyQ29udGV4dCA9ICgpID0+IHtcbiAgY29uc3QgY29udGV4dCA9IHVzZUNvbnRleHQoQ2FsZW5kYXJDb250ZXh0KVxuICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VDYWxlbmRhckNvbnRleHQgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIENhbGVuZGFyUHJvdmlkZXInKVxuICB9XG4gIHJldHVybiBjb250ZXh0XG59XG5cbmV4cG9ydCBjb25zdCB1c2VQdWJsaWNDYWxlbmRhckNvbnRleHQgPSAoKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KENhbGVuZGFyQ29udGV4dClcbiAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlQ2FsZW5kYXJDb250ZXh0IG11c3QgYmUgdXNlZCB3aXRoaW4gaWxhbXkgY2FsZW5kYXInKVxuICB9XG4gIHJldHVybiB7XG4gICAgY3VycmVudERhdGU6IGNvbnRleHQuY3VycmVudERhdGUsXG4gICAgdmlldzogY29udGV4dC52aWV3LFxuICAgIGV2ZW50czogY29udGV4dC5ldmVudHMsXG4gICAgaXNFdmVudEZvcm1PcGVuOiBjb250ZXh0LmlzRXZlbnRGb3JtT3BlbixcbiAgICBzZWxlY3RlZEV2ZW50OiBjb250ZXh0LnNlbGVjdGVkRXZlbnQsXG4gICAgc2VsZWN0ZWREYXRlOiBjb250ZXh0LnNlbGVjdGVkRGF0ZSxcbiAgICBmaXJzdERheU9mV2VlazogY29udGV4dC5maXJzdERheU9mV2VlayxcbiAgICBzZXRDdXJyZW50RGF0ZTogY29udGV4dC5zZXRDdXJyZW50RGF0ZSxcbiAgICBzZWxlY3REYXRlOiBjb250ZXh0LnNlbGVjdERhdGUsXG4gICAgc2V0VmlldzogY29udGV4dC5zZXRWaWV3LFxuICAgIG5leHRQZXJpb2Q6IGNvbnRleHQubmV4dFBlcmlvZCxcbiAgICBwcmV2UGVyaW9kOiBjb250ZXh0LnByZXZQZXJpb2QsXG4gICAgdG9kYXk6IGNvbnRleHQudG9kYXksXG4gICAgYWRkRXZlbnQ6IGNvbnRleHQuYWRkRXZlbnQsXG4gICAgdXBkYXRlRXZlbnQ6IGNvbnRleHQudXBkYXRlRXZlbnQsXG4gICAgZGVsZXRlRXZlbnQ6IGNvbnRleHQuZGVsZXRlRXZlbnQsXG4gICAgb3BlbkV2ZW50Rm9ybTogY29udGV4dC5vcGVuRXZlbnRGb3JtLFxuICAgIGNsb3NlRXZlbnRGb3JtOiBjb250ZXh0LmNsb3NlRXZlbnRGb3JtLFxuICB9XG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgQWNjb3JkaW9uUHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1hY2NvcmRpb24nXG5pbXBvcnQgeyBDaGV2cm9uRG93bkljb24gfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmZ1bmN0aW9uIEFjY29yZGlvbih7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgQWNjb3JkaW9uUHJpbWl0aXZlLlJvb3Q+KSB7XG4gIHJldHVybiA8QWNjb3JkaW9uUHJpbWl0aXZlLlJvb3QgZGF0YS1zbG90PVwiYWNjb3JkaW9uXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBBY2NvcmRpb25JdGVtKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIEFjY29yZGlvblByaW1pdGl2ZS5JdGVtPikge1xuICByZXR1cm4gKFxuICAgIDxBY2NvcmRpb25QcmltaXRpdmUuSXRlbVxuICAgICAgZGF0YS1zbG90PVwiYWNjb3JkaW9uLWl0ZW1cIlxuICAgICAgY2xhc3NOYW1lPXtjbignYm9yZGVyLWIgbGFzdDpib3JkZXItYi0wJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIEFjY29yZGlvblRyaWdnZXIoe1xuICBjbGFzc05hbWUsXG4gIGNoaWxkcmVuLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIEFjY29yZGlvblByaW1pdGl2ZS5UcmlnZ2VyPikge1xuICByZXR1cm4gKFxuICAgIDxBY2NvcmRpb25QcmltaXRpdmUuSGVhZGVyIGNsYXNzTmFtZT1cImZsZXhcIj5cbiAgICAgIDxBY2NvcmRpb25QcmltaXRpdmUuVHJpZ2dlclxuICAgICAgICBkYXRhLXNsb3Q9XCJhY2NvcmRpb24tdHJpZ2dlclwiXG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ2ZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgZmxleCBmbGV4LTEgaXRlbXMtc3RhcnQganVzdGlmeS1iZXR3ZWVuIGdhcC00IHJvdW5kZWQtbWQgcHktNCB0ZXh0LWxlZnQgdGV4dC1zbSBmb250LW1lZGl1bSB0cmFuc2l0aW9uLWFsbCBvdXRsaW5lLW5vbmUgaG92ZXI6dW5kZXJsaW5lIGZvY3VzLXZpc2libGU6cmluZy1bM3B4XSBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAgWyZbZGF0YS1zdGF0ZT1vcGVuXT5zdmddOnJvdGF0ZS0xODAnLFxuICAgICAgICAgIGNsYXNzTmFtZVxuICAgICAgICApfVxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICA+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPENoZXZyb25Eb3duSWNvbiBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgcG9pbnRlci1ldmVudHMtbm9uZSBzaXplLTQgc2hyaW5rLTAgdHJhbnNsYXRlLXktMC41IHRyYW5zaXRpb24tdHJhbnNmb3JtIGR1cmF0aW9uLTIwMFwiIC8+XG4gICAgICA8L0FjY29yZGlvblByaW1pdGl2ZS5UcmlnZ2VyPlxuICAgIDwvQWNjb3JkaW9uUHJpbWl0aXZlLkhlYWRlcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBBY2NvcmRpb25Db250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBBY2NvcmRpb25QcmltaXRpdmUuQ29udGVudD4pIHtcbiAgcmV0dXJuIChcbiAgICA8QWNjb3JkaW9uUHJpbWl0aXZlLkNvbnRlbnRcbiAgICAgIGRhdGEtc2xvdD1cImFjY29yZGlvbi1jb250ZW50XCJcbiAgICAgIGNsYXNzTmFtZT1cImRhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1hY2NvcmRpb24tdXAgZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1hY2NvcmRpb24tZG93biBvdmVyZmxvdy1jbGlwIHRleHQtc21cIlxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxkaXYgY2xhc3NOYW1lPXtjbigncHQtMCBwYi00JywgY2xhc3NOYW1lKX0+e2NoaWxkcmVufTwvZGl2PlxuICAgIDwvQWNjb3JkaW9uUHJpbWl0aXZlLkNvbnRlbnQ+XG4gIClcbn1cblxuZXhwb3J0IHsgQWNjb3JkaW9uLCBBY2NvcmRpb25JdGVtLCBBY2NvcmRpb25UcmlnZ2VyLCBBY2NvcmRpb25Db250ZW50IH1cbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSAnQC9jb21wb25lbnRzJ1xuaW1wb3J0IHsgdHlwZSBDbGFzc1ZhbHVlLCBjbHN4IH0gZnJvbSAnY2xzeCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyB0d01lcmdlIH0gZnJvbSAndGFpbHdpbmQtbWVyZ2UnXG5cbmV4cG9ydCBmdW5jdGlvbiBjbiguLi5pbnB1dHM6IENsYXNzVmFsdWVbXSkge1xuICByZXR1cm4gdHdNZXJnZShjbHN4KGlucHV0cykpXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZU1vY2tFdmVudHMoeyBjb3VudCA9IDUgfSA9IHt9KSB7XG4gIGNvbnN0IGV2ZW50czogQ2FsZW5kYXJFdmVudFtdID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgZXZlbnRzLnB1c2goe1xuICAgICAgaWQ6IGkudG9TdHJpbmcoKSxcbiAgICAgIHRpdGxlOiBgTW9jayBFdmVudCAke2kgKyAxfWAsXG4gICAgICBzdGFydDogZGF5anMoKS5hZGQoaSwgJ2RheScpLnN0YXJ0T2YoJ2RheScpLFxuICAgICAgZW5kOiBkYXlqcygpLmFkZChpLCAnZGF5JykuZW5kT2YoJ2RheScpLFxuICAgICAgY29sb3I6ICdiZy1ncmF5LTEwMCB0ZXh0LWdyYXktODAwJyxcbiAgICB9KVxuICB9XG4gIHJldHVybiBldmVudHNcbn1cbiIsCiAgICAiaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xuaW1wb3J0IHdlZWtkYXkgZnJvbSAnZGF5anMvcGx1Z2luL3dlZWtkYXkuanMnXG5pbXBvcnQgd2Vla09mWWVhciBmcm9tICdkYXlqcy9wbHVnaW4vd2Vla09mWWVhci5qcydcbmltcG9ydCBpc1NhbWVPckFmdGVyIGZyb20gJ2RheWpzL3BsdWdpbi9pc1NhbWVPckFmdGVyLmpzJ1xuaW1wb3J0IGlzU2FtZU9yQmVmb3JlIGZyb20gJ2RheWpzL3BsdWdpbi9pc1NhbWVPckJlZm9yZS5qcydcbmltcG9ydCBpc0JldHdlZW4gZnJvbSAnZGF5anMvcGx1Z2luL2lzQmV0d2Vlbi5qcydcbmltcG9ydCBtaW5NYXggZnJvbSAnZGF5anMvcGx1Z2luL21pbk1heC5qcydcbmltcG9ydCB0aW1lem9uZSBmcm9tICdkYXlqcy9wbHVnaW4vdGltZXpvbmUuanMnXG5pbXBvcnQgdXRjIGZyb20gJ2RheWpzL3BsdWdpbi91dGMuanMnXG5pbXBvcnQgbG9jYWxlRGF0YSBmcm9tICdkYXlqcy9wbHVnaW4vbG9jYWxlRGF0YS5qcydcblxuLy8gSW1wb3J0IGFsbCBkYXlqcyBsb2NhbGVzIGFscGhhYmV0aWNhbGx5XG4vLyBsb2NhbGUuanNvbiBmaWxlOiBbe1wia2V5XCI6XCJhZlwiLFwibmFtZVwiOlwiQWZyaWthYW5zXCJ9LHtcImtleVwiOlwiYW1cIixcIm5hbWVcIjpcIkFtaGFyaWNcIn0se1wia2V5XCI6XCJhci1kelwiLFwibmFtZVwiOlwiQXJhYmljIChBbGdlcmlhKVwifSx7XCJrZXlcIjpcImFyLWlxXCIsXCJuYW1lXCI6XCIgQXJhYmljIChJcmFxKVwifSx7XCJrZXlcIjpcImFyLWt3XCIsXCJuYW1lXCI6XCJBcmFiaWMgKEt1d2FpdClcIn0se1wia2V5XCI6XCJhci1seVwiLFwibmFtZVwiOlwiQXJhYmljIChMeWJpYSlcIn0se1wia2V5XCI6XCJhci1tYVwiLFwibmFtZVwiOlwiQXJhYmljIChNb3JvY2NvKVwifSx7XCJrZXlcIjpcImFyLXNhXCIsXCJuYW1lXCI6XCJBcmFiaWMgKFNhdWRpIEFyYWJpYSlcIn0se1wia2V5XCI6XCJhci10blwiLFwibmFtZVwiOlwiIEFyYWJpYyAoVHVuaXNpYSlcIn0se1wia2V5XCI6XCJhclwiLFwibmFtZVwiOlwiQXJhYmljXCJ9LHtcImtleVwiOlwiYXpcIixcIm5hbWVcIjpcIkF6ZXJiYWlqYW5pXCJ9LHtcImtleVwiOlwiYmVcIixcIm5hbWVcIjpcIkJlbGFydXNpYW5cIn0se1wia2V5XCI6XCJiZ1wiLFwibmFtZVwiOlwiQnVsZ2FyaWFuXCJ9LHtcImtleVwiOlwiYmlcIixcIm5hbWVcIjpcIkJpc2xhbWFcIn0se1wia2V5XCI6XCJibVwiLFwibmFtZVwiOlwiQmFtYmFyYVwifSx7XCJrZXlcIjpcImJuLWJkXCIsXCJuYW1lXCI6XCJCZW5nYWxpIChCYW5nbGFkZXNoKVwifSx7XCJrZXlcIjpcImJuXCIsXCJuYW1lXCI6XCJCZW5nYWxpXCJ9LHtcImtleVwiOlwiYm9cIixcIm5hbWVcIjpcIlRpYmV0YW5cIn0se1wia2V5XCI6XCJiclwiLFwibmFtZVwiOlwiQnJldG9uXCJ9LHtcImtleVwiOlwiYnNcIixcIm5hbWVcIjpcIkJvc25pYW5cIn0se1wia2V5XCI6XCJjYVwiLFwibmFtZVwiOlwiQ2F0YWxhblwifSx7XCJrZXlcIjpcImNzXCIsXCJuYW1lXCI6XCJDemVjaFwifSx7XCJrZXlcIjpcImN2XCIsXCJuYW1lXCI6XCJDaHV2YXNoXCJ9LHtcImtleVwiOlwiY3lcIixcIm5hbWVcIjpcIldlbHNoXCJ9LHtcImtleVwiOlwiZGUtYXRcIixcIm5hbWVcIjpcIkdlcm1hbiAoQXVzdHJpYSlcIn0se1wia2V5XCI6XCJkYVwiLFwibmFtZVwiOlwiRGFuaXNoXCJ9LHtcImtleVwiOlwiZGUtY2hcIixcIm5hbWVcIjpcIkdlcm1hbiAoU3dpdHplcmxhbmQpXCJ9LHtcImtleVwiOlwiZGVcIixcIm5hbWVcIjpcIkdlcm1hblwifSx7XCJrZXlcIjpcImR2XCIsXCJuYW1lXCI6XCJNYWxkaXZpYW5cIn0se1wia2V5XCI6XCJlbFwiLFwibmFtZVwiOlwiR3JlZWtcIn0se1wia2V5XCI6XCJlbi1hdVwiLFwibmFtZVwiOlwiRW5nbGlzaCAoQXVzdHJhbGlhKVwifSx7XCJrZXlcIjpcImVuLWNhXCIsXCJuYW1lXCI6XCJFbmdsaXNoIChDYW5hZGEpXCJ9LHtcImtleVwiOlwiZW4tZ2JcIixcIm5hbWVcIjpcIkVuZ2xpc2ggKFVuaXRlZCBLaW5nZG9tKVwifSx7XCJrZXlcIjpcImVuLWllXCIsXCJuYW1lXCI6XCJFbmdsaXNoIChJcmVsYW5kKVwifSx7XCJrZXlcIjpcImVuLWlsXCIsXCJuYW1lXCI6XCJFbmdsaXNoIChJc3JhZWwpXCJ9LHtcImtleVwiOlwiZW4taW5cIixcIm5hbWVcIjpcIkVuZ2xpc2ggKEluZGlhKVwifSx7XCJrZXlcIjpcImVuLW56XCIsXCJuYW1lXCI6XCJFbmdsaXNoIChOZXcgWmVhbGFuZClcIn0se1wia2V5XCI6XCJlbi1zZ1wiLFwibmFtZVwiOlwiRW5nbGlzaCAoU2luZ2Fwb3JlKVwifSx7XCJrZXlcIjpcImVuLXR0XCIsXCJuYW1lXCI6XCJFbmdsaXNoIChUcmluaWRhZCAmIFRvYmFnbylcIn0se1wia2V5XCI6XCJlb1wiLFwibmFtZVwiOlwiRXNwZXJhbnRvXCJ9LHtcImtleVwiOlwiZW5cIixcIm5hbWVcIjpcIkVuZ2xpc2hcIn0se1wia2V5XCI6XCJlcy1kb1wiLFwibmFtZVwiOlwiU3BhbmlzaCAoRG9taW5pY2FuIFJlcHVibGljKVwifSx7XCJrZXlcIjpcImVzLW14XCIsXCJuYW1lXCI6XCJTcGFuaXNoIChNZXhpY28pXCJ9LHtcImtleVwiOlwiZXMtcHJcIixcIm5hbWVcIjpcIlNwYW5pc2ggKFB1ZXJ0byBSaWNvKVwifSx7XCJrZXlcIjpcImVzLXVzXCIsXCJuYW1lXCI6XCJTcGFuaXNoIChVbml0ZWQgU3RhdGVzKVwifSx7XCJrZXlcIjpcImV0XCIsXCJuYW1lXCI6XCJFc3RvbmlhblwifSx7XCJrZXlcIjpcImVzXCIsXCJuYW1lXCI6XCJTcGFuaXNoXCJ9LHtcImtleVwiOlwiZXVcIixcIm5hbWVcIjpcIkJhc3F1ZVwifSx7XCJrZXlcIjpcImZhXCIsXCJuYW1lXCI6XCJQZXJzaWFuXCJ9LHtcImtleVwiOlwiZm9cIixcIm5hbWVcIjpcIkZhcm9lc2VcIn0se1wia2V5XCI6XCJmaVwiLFwibmFtZVwiOlwiRmlubmlzaFwifSx7XCJrZXlcIjpcImZyLWNhXCIsXCJuYW1lXCI6XCJGcmVuY2ggKENhbmFkYSlcIn0se1wia2V5XCI6XCJmci1jaFwiLFwibmFtZVwiOlwiRnJlbmNoIChTd2l0emVybGFuZClcIn0se1wia2V5XCI6XCJmclwiLFwibmFtZVwiOlwiRnJlbmNoXCJ9LHtcImtleVwiOlwiZnlcIixcIm5hbWVcIjpcIkZyaXNpYW5cIn0se1wia2V5XCI6XCJnYVwiLFwibmFtZVwiOlwiSXJpc2ggb3IgSXJpc2ggR2FlbGljXCJ9LHtcImtleVwiOlwiZ2RcIixcIm5hbWVcIjpcIlNjb3R0aXNoIEdhZWxpY1wifSx7XCJrZXlcIjpcImdvbS1sYXRuXCIsXCJuYW1lXCI6XCJLb25rYW5pIExhdGluIHNjcmlwdFwifSx7XCJrZXlcIjpcImdsXCIsXCJuYW1lXCI6XCJHYWxpY2lhblwifSx7XCJrZXlcIjpcImd1XCIsXCJuYW1lXCI6XCJHdWphcmF0aVwifSx7XCJrZXlcIjpcImhlXCIsXCJuYW1lXCI6XCJIZWJyZXdcIn0se1wia2V5XCI6XCJoaVwiLFwibmFtZVwiOlwiSGluZGlcIn0se1wia2V5XCI6XCJoclwiLFwibmFtZVwiOlwiQ3JvYXRpYW5cIn0se1wia2V5XCI6XCJodVwiLFwibmFtZVwiOlwiSHVuZ2FyaWFuXCJ9LHtcImtleVwiOlwiaHRcIixcIm5hbWVcIjpcIkhhaXRpYW4gQ3Jlb2xlIChIYWl0aSlcIn0se1wia2V5XCI6XCJoeS1hbVwiLFwibmFtZVwiOlwiQXJtZW5pYW5cIn0se1wia2V5XCI6XCJpZFwiLFwibmFtZVwiOlwiSW5kb25lc2lhblwifSx7XCJrZXlcIjpcImlzXCIsXCJuYW1lXCI6XCJJY2VsYW5kaWNcIn0se1wia2V5XCI6XCJpdC1jaFwiLFwibmFtZVwiOlwiSXRhbGlhbiAoU3dpdHplcmxhbmQpXCJ9LHtcImtleVwiOlwiaXRcIixcIm5hbWVcIjpcIkl0YWxpYW5cIn0se1wia2V5XCI6XCJqYVwiLFwibmFtZVwiOlwiSmFwYW5lc2VcIn0se1wia2V5XCI6XCJqdlwiLFwibmFtZVwiOlwiSmF2YW5lc2VcIn0se1wia2V5XCI6XCJrYVwiLFwibmFtZVwiOlwiR2VvcmdpYW5cIn0se1wia2V5XCI6XCJra1wiLFwibmFtZVwiOlwiS2F6YWtoXCJ9LHtcImtleVwiOlwia21cIixcIm5hbWVcIjpcIkNhbWJvZGlhblwifSx7XCJrZXlcIjpcImtuXCIsXCJuYW1lXCI6XCJLYW5uYWRhXCJ9LHtcImtleVwiOlwia29cIixcIm5hbWVcIjpcIktvcmVhblwifSx7XCJrZXlcIjpcImt1XCIsXCJuYW1lXCI6XCJLdXJkaXNoXCJ9LHtcImtleVwiOlwia3lcIixcIm5hbWVcIjpcIkt5cmd5elwifSx7XCJrZXlcIjpcImxiXCIsXCJuYW1lXCI6XCJMdXhlbWJvdXJnaXNoXCJ9LHtcImtleVwiOlwibG9cIixcIm5hbWVcIjpcIkxhb1wifSx7XCJrZXlcIjpcImx0XCIsXCJuYW1lXCI6XCJMaXRodWFuaWFuXCJ9LHtcImtleVwiOlwibHZcIixcIm5hbWVcIjpcIkxhdHZpYW5cIn0se1wia2V5XCI6XCJtZVwiLFwibmFtZVwiOlwiTW9udGVuZWdyaW5cIn0se1wia2V5XCI6XCJtaVwiLFwibmFtZVwiOlwiTWFvcmlcIn0se1wia2V5XCI6XCJta1wiLFwibmFtZVwiOlwiTWFjZWRvbmlhblwifSx7XCJrZXlcIjpcIm1sXCIsXCJuYW1lXCI6XCJNYWxheWFsYW1cIn0se1wia2V5XCI6XCJtblwiLFwibmFtZVwiOlwiTW9uZ29saWFuXCJ9LHtcImtleVwiOlwibXJcIixcIm5hbWVcIjpcIk1hcmF0aGlcIn0se1wia2V5XCI6XCJtcy1teVwiLFwibmFtZVwiOlwiTWFsYXlcIn0se1wia2V5XCI6XCJtc1wiLFwibmFtZVwiOlwiTWFsYXlcIn0se1wia2V5XCI6XCJtdFwiLFwibmFtZVwiOlwiTWFsdGVzZSAoTWFsdGEpXCJ9LHtcImtleVwiOlwibXlcIixcIm5hbWVcIjpcIkJ1cm1lc2VcIn0se1wia2V5XCI6XCJuYlwiLFwibmFtZVwiOlwiTm9yd2VnaWFuIEJva23DpWxcIn0se1wia2V5XCI6XCJuZVwiLFwibmFtZVwiOlwiTmVwYWxlc2VcIn0se1wia2V5XCI6XCJubC1iZVwiLFwibmFtZVwiOlwiRHV0Y2ggKEJlbGdpdW0pXCJ9LHtcImtleVwiOlwibmxcIixcIm5hbWVcIjpcIkR1dGNoXCJ9LHtcImtleVwiOlwicGxcIixcIm5hbWVcIjpcIlBvbGlzaFwifSx7XCJrZXlcIjpcInB0LWJyXCIsXCJuYW1lXCI6XCJQb3J0dWd1ZXNlIChCcmF6aWwpXCJ9LHtcImtleVwiOlwicHRcIixcIm5hbWVcIjpcIlBvcnR1Z3Vlc2VcIn0se1wia2V5XCI6XCJyblwiLFwibmFtZVwiOlwiS2lydW5kaVwifSx7XCJrZXlcIjpcInJvXCIsXCJuYW1lXCI6XCJSb21hbmlhblwifSx7XCJrZXlcIjpcInJ1XCIsXCJuYW1lXCI6XCJSdXNzaWFuXCJ9LHtcImtleVwiOlwicndcIixcIm5hbWVcIjpcIktpbnlhcndhbmRhIChSd2FuZGEpXCJ9LHtcImtleVwiOlwic2RcIixcIm5hbWVcIjpcIlNpbmRoaVwifSx7XCJrZXlcIjpcInNlXCIsXCJuYW1lXCI6XCJOb3J0aGVybiBTYW1pXCJ9LHtcImtleVwiOlwic2lcIixcIm5hbWVcIjpcIlNpbmhhbGVzZVwifSx7XCJrZXlcIjpcInNrXCIsXCJuYW1lXCI6XCJTbG92YWtcIn0se1wia2V5XCI6XCJzbFwiLFwibmFtZVwiOlwiU2xvdmVuaWFuXCJ9LHtcImtleVwiOlwic3FcIixcIm5hbWVcIjpcIkFsYmFuaWFuXCJ9LHtcImtleVwiOlwic3ItY3lybFwiLFwibmFtZVwiOlwiU2VyYmlhbiBDeXJpbGxpY1wifSx7XCJrZXlcIjpcInNzXCIsXCJuYW1lXCI6XCJzaVN3YXRpXCJ9LHtcImtleVwiOlwic3YtZmlcIixcIm5hbWVcIjpcIkZpbmxhbmQgU3dlZGlzaFwifSx7XCJrZXlcIjpcInNyXCIsXCJuYW1lXCI6XCJTZXJiaWFuXCJ9LHtcImtleVwiOlwic3ZcIixcIm5hbWVcIjpcIlN3ZWRpc2hcIn0se1wia2V5XCI6XCJzd1wiLFwibmFtZVwiOlwiU3dhaGlsaVwifSx7XCJrZXlcIjpcInRhXCIsXCJuYW1lXCI6XCJUYW1pbFwifSx7XCJrZXlcIjpcInRlXCIsXCJuYW1lXCI6XCJUZWx1Z3VcIn0se1wia2V5XCI6XCJ0ZXRcIixcIm5hbWVcIjpcIlRldHVuIERpbGkgKEVhc3QgVGltb3IpXCJ9LHtcImtleVwiOlwidGdcIixcIm5hbWVcIjpcIlRhamlrXCJ9LHtcImtleVwiOlwidGhcIixcIm5hbWVcIjpcIlRoYWlcIn0se1wia2V5XCI6XCJ0a1wiLFwibmFtZVwiOlwiVHVya21lblwifSx7XCJrZXlcIjpcInRsLXBoXCIsXCJuYW1lXCI6XCJUYWdhbG9nIChQaGlsaXBwaW5lcylcIn0se1wia2V5XCI6XCJ0bGhcIixcIm5hbWVcIjpcIktsaW5nb25cIn0se1wia2V5XCI6XCJ0clwiLFwibmFtZVwiOlwiVHVya2lzaFwifSx7XCJrZXlcIjpcInR6bFwiLFwibmFtZVwiOlwiVGFsb3NzYW5cIn0se1wia2V5XCI6XCJ0em0tbGF0blwiLFwibmFtZVwiOlwiQ2VudHJhbCBBdGxhcyBUYW1hemlnaHQgTGF0aW5cIn0se1wia2V5XCI6XCJ0em1cIixcIm5hbWVcIjpcIkNlbnRyYWwgQXRsYXMgVGFtYXppZ2h0XCJ9LHtcImtleVwiOlwidWctY25cIixcIm5hbWVcIjpcIlV5Z2h1ciAoQ2hpbmEpXCJ9LHtcImtleVwiOlwidWtcIixcIm5hbWVcIjpcIlVrcmFpbmlhblwifSx7XCJrZXlcIjpcInVyXCIsXCJuYW1lXCI6XCJVcmR1XCJ9LHtcImtleVwiOlwidXotbGF0blwiLFwibmFtZVwiOlwiVXpiZWsgTGF0aW5cIn0se1wia2V5XCI6XCJ1elwiLFwibmFtZVwiOlwiVXpiZWtcIn0se1wia2V5XCI6XCJ2aVwiLFwibmFtZVwiOlwiVmlldG5hbWVzZVwifSx7XCJrZXlcIjpcIngtcHNldWRvXCIsXCJuYW1lXCI6XCJQc2V1ZG9cIn0se1wia2V5XCI6XCJ5b1wiLFwibmFtZVwiOlwiWW9ydWJhIE5pZ2VyaWFcIn0se1wia2V5XCI6XCJ6aC1jblwiLFwibmFtZVwiOlwiQ2hpbmVzZSAoQ2hpbmEpXCJ9LHtcImtleVwiOlwiemgtaGtcIixcIm5hbWVcIjpcIkNoaW5lc2UgKEhvbmcgS29uZylcIn0se1wia2V5XCI6XCJ6aC10d1wiLFwibmFtZVwiOlwiQ2hpbmVzZSAoVGFpd2FuKVwifSx7XCJrZXlcIjpcInpoXCIsXCJuYW1lXCI6XCJDaGluZXNlXCJ9LHtcImtleVwiOlwib2MtbG5jXCIsXCJuYW1lXCI6XCJPY2NpdGFuLCBsZW5nYWRvY2lhbiBkaWFsZWN0ZVwifSx7XCJrZXlcIjpcIm5uXCIsXCJuYW1lXCI6XCJOeW5vcnNrXCJ9LHtcImtleVwiOlwicGEtaW5cIixcIm5hbWVcIjpcIlB1bmphYmkgKEluZGlhKVwifV1cbmltcG9ydCAnZGF5anMvbG9jYWxlL2FmLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYW0uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9hci1kei5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2FyLWlxLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYXIta3cuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9hci1seS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2FyLW1hLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYXItc2EuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9hci10bi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2FyLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYXouanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9iZS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2JnLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYmkuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ibS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2JuLWJkLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYm4uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9iby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2JyLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYnMuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9jYS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2NzLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvY3YuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9jeS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2RhLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZGUtYXQuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9kZS1jaC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2RlLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZHYuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VuLWF1LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZW4tY2EuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbi1nYi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VuLWllLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZW4taWwuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbi1pbi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VuLW56LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZW4tc2cuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbi10dC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VuLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZW8uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lcy1kby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VzLW14LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZXMtcHIuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lcy11cy5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VzLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZXQuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ldS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2ZhLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZmkuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9mby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2ZyLWNhLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZnItY2guanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9mci5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2Z5LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZ2EuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9nZC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2dsLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZ29tLWxhdG4uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ndS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2hlLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvaGkuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9oci5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2h0LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvaHUuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9oeS1hbS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2lkLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvaXMuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9pdC1jaC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2l0LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvamEuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9qdi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2thLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUva2suanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9rbS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2tuLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUva28uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9rdS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2t5LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbGIuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9sby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2x0LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbHYuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9tZS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL21pLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbWsuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9tbC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL21uLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbXIuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9tcy1teS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL21zLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbXQuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9teS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL25iLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbmUuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ubC1iZS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL25sLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbm4uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9vYy1sbmMuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9wYS1pbi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3BsLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvcHQtYnIuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9wdC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3JuLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvcm8uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ydS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3J3LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc2QuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9zZS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3NpLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc2suanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9zbC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3NxLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc3ItY3lybC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3NyLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc3MuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9zdi1maS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3N2LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc3cuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS90YS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3RlLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdGV0LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdGcuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS90aC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3RrLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdGwtcGguanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS90bGguanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS90ci5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3R6bC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3R6bS1sYXRuLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdHptLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdWctY24uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS91ay5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3VyLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdXotbGF0bi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3V6LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdmkuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS94LXBzZXVkby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3lvLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvemgtY24uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS96aC1oay5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3poLXR3LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvemguanMnXG5cbi8vIEV4dGVuZCBkYXlqcyB3aXRoIHBsdWdpbnNcbmRheWpzLmV4dGVuZCh3ZWVrZGF5KVxuZGF5anMuZXh0ZW5kKHdlZWtPZlllYXIpXG5kYXlqcy5leHRlbmQoaXNTYW1lT3JBZnRlcilcbmRheWpzLmV4dGVuZChpc1NhbWVPckJlZm9yZSlcbmRheWpzLmV4dGVuZChpc0JldHdlZW4pXG5kYXlqcy5leHRlbmQobWluTWF4KVxuZGF5anMuZXh0ZW5kKHRpbWV6b25lKVxuZGF5anMuZXh0ZW5kKHV0YylcbmRheWpzLmV4dGVuZChsb2NhbGVEYXRhKVxuXG5leHBvcnQgZGVmYXVsdCBkYXlqc1xuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmNvbnN0IGFsZXJ0VmFyaWFudHMgPSBjdmEoXG4gICdyZWxhdGl2ZSB3LWZ1bGwgcm91bmRlZC1sZyBib3JkZXIgcHgtNCBweS0zIHRleHQtc20gZ3JpZCBoYXMtWz5zdmddOmdyaWQtY29scy1bY2FsYyh2YXIoLS1zcGFjaW5nKSo0KV8xZnJdIGdyaWQtY29scy1bMF8xZnJdIGhhcy1bPnN2Z106Z2FwLXgtMyBnYXAteS0wLjUgaXRlbXMtc3RhcnQgWyY+c3ZnXTpzaXplLTQgWyY+c3ZnXTp0cmFuc2xhdGUteS0wLjUgWyY+c3ZnXTp0ZXh0LWN1cnJlbnQnLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHZhcmlhbnQ6IHtcbiAgICAgICAgZGVmYXVsdDogJ2JnLWNhcmQgdGV4dC1jYXJkLWZvcmVncm91bmQnLFxuICAgICAgICBkZXN0cnVjdGl2ZTpcbiAgICAgICAgICAndGV4dC1kZXN0cnVjdGl2ZSBiZy1jYXJkIFsmPnN2Z106dGV4dC1jdXJyZW50ICo6ZGF0YS1bc2xvdD1hbGVydC1kZXNjcmlwdGlvbl06dGV4dC1kZXN0cnVjdGl2ZS85MCcsXG4gICAgICAgIHByaW1hcnk6XG4gICAgICAgICAgJ2JnLWJsdWUtNTAgZGFyazpiZy1ibHVlLTk1MC8yMCBib3JkZXItYmx1ZS0yMDAgZGFyazpib3JkZXItYmx1ZS04MDAgdGV4dC1ibHVlLTkwMCBkYXJrOnRleHQtYmx1ZS0xMDAgWyY+c3ZnXTp0ZXh0LWJsdWUtNjAwIGRhcms6WyY+c3ZnXTp0ZXh0LWJsdWUtNDAwICo6ZGF0YS1bc2xvdD1hbGVydC1kZXNjcmlwdGlvbl06dGV4dC1ibHVlLTgwMCBkYXJrOio6ZGF0YS1bc2xvdD1hbGVydC1kZXNjcmlwdGlvbl06dGV4dC1ibHVlLTIwMCcsXG4gICAgICAgIHNlY29uZGFyeTpcbiAgICAgICAgICAnYmctZ3JheS01MCBkYXJrOmJnLWdyYXktOTUwLzIwIGJvcmRlci1ncmF5LTIwMCBkYXJrOmJvcmRlci1ncmF5LTgwMCB0ZXh0LWdyYXktOTAwIGRhcms6dGV4dC1ncmF5LTEwMCBbJj5zdmddOnRleHQtZ3JheS02MDAgZGFyazpbJj5zdmddOnRleHQtZ3JheS00MDAgKjpkYXRhLVtzbG90PWFsZXJ0LWRlc2NyaXB0aW9uXTp0ZXh0LWdyYXktODAwIGRhcms6KjpkYXRhLVtzbG90PWFsZXJ0LWRlc2NyaXB0aW9uXTp0ZXh0LWdyYXktMjAwJyxcbiAgICAgICAgc3VjY2VzczpcbiAgICAgICAgICAnYmctZ3JlZW4tNTAgZGFyazpiZy1ncmVlbi05NTAvMjAgYm9yZGVyLWdyZWVuLTIwMCBkYXJrOmJvcmRlci1ncmVlbi04MDAgdGV4dC1ncmVlbi05MDAgZGFyazp0ZXh0LWdyZWVuLTEwMCBbJj5zdmddOnRleHQtZ3JlZW4tNjAwIGRhcms6WyY+c3ZnXTp0ZXh0LWdyZWVuLTQwMCAqOmRhdGEtW3Nsb3Q9YWxlcnQtZGVzY3JpcHRpb25dOnRleHQtZ3JlZW4tODAwIGRhcms6KjpkYXRhLVtzbG90PWFsZXJ0LWRlc2NyaXB0aW9uXTp0ZXh0LWdyZWVuLTIwMCcsXG4gICAgICAgIHdhcm5pbmc6XG4gICAgICAgICAgJ2JnLXllbGxvdy01MCBkYXJrOmJnLXllbGxvdy05NTAvMjAgYm9yZGVyLXllbGxvdy0yMDAgZGFyazpib3JkZXIteWVsbG93LTgwMCB0ZXh0LXllbGxvdy05MDAgZGFyazp0ZXh0LXllbGxvdy0xMDAgWyY+c3ZnXTp0ZXh0LXllbGxvdy02MDAgZGFyazpbJj5zdmddOnRleHQteWVsbG93LTQwMCAqOmRhdGEtW3Nsb3Q9YWxlcnQtZGVzY3JpcHRpb25dOnRleHQteWVsbG93LTgwMCBkYXJrOio6ZGF0YS1bc2xvdD1hbGVydC1kZXNjcmlwdGlvbl06dGV4dC15ZWxsb3ctMjAwJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkZWZhdWx0VmFyaWFudHM6IHtcbiAgICAgIHZhcmlhbnQ6ICdkZWZhdWx0JyxcbiAgICB9LFxuICB9XG4pXG5cbmZ1bmN0aW9uIEFsZXJ0KHtcbiAgY2xhc3NOYW1lLFxuICB2YXJpYW50LFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2Rpdic+ICYgVmFyaWFudFByb3BzPHR5cGVvZiBhbGVydFZhcmlhbnRzPikge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtc2xvdD1cImFsZXJ0XCJcbiAgICAgIHJvbGU9XCJhbGVydFwiXG4gICAgICBjbGFzc05hbWU9e2NuKGFsZXJ0VmFyaWFudHMoeyB2YXJpYW50IH0pLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gQWxlcnRUaXRsZSh7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2Rpdic+KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgZGF0YS1zbG90PVwiYWxlcnQtdGl0bGVcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2NvbC1zdGFydC0yIGxpbmUtY2xhbXAtMSBtaW4taC00IGZvbnQtbWVkaXVtIHRyYWNraW5nLXRpZ2h0JyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gQWxlcnREZXNjcmlwdGlvbih7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdkaXYnPikge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtc2xvdD1cImFsZXJ0LWRlc2NyaXB0aW9uXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICd0ZXh0LW11dGVkLWZvcmVncm91bmQgY29sLXN0YXJ0LTIgZ3JpZCBqdXN0aWZ5LWl0ZW1zLXN0YXJ0IGdhcC0xIHRleHQtc20gWyZfcF06bGVhZGluZy1yZWxheGVkJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IHsgQWxlcnQsIEFsZXJ0VGl0bGUsIEFsZXJ0RGVzY3JpcHRpb24gfVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFNsb3QgfSBmcm9tICdAcmFkaXgtdWkvcmVhY3Qtc2xvdCdcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmNvbnN0IGJhZGdlVmFyaWFudHMgPSBjdmEoXG4gICdpbmxpbmUtZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcm91bmRlZC1tZCBib3JkZXIgcHgtMiBweS0wLjUgdGV4dC14cyBmb250LW1lZGl1bSB3LWZpdCB3aGl0ZXNwYWNlLW5vd3JhcCBzaHJpbmstMCBbJj5zdmddOnNpemUtMyBnYXAtMSBbJj5zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBmb2N1cy12aXNpYmxlOnJpbmctWzNweF0gYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazphcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS80MCBhcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlIHRyYW5zaXRpb24tW2NvbG9yLGJveC1zaGFkb3ddIG92ZXJmbG93LWNsaXAnLFxuICB7XG4gICAgdmFyaWFudHM6IHtcbiAgICAgIHZhcmlhbnQ6IHtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAnYm9yZGVyLXRyYW5zcGFyZW50IGJnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgW2EmXTpob3ZlcjpiZy1wcmltYXJ5LzkwJyxcbiAgICAgICAgc2Vjb25kYXJ5OlxuICAgICAgICAgICdib3JkZXItdHJhbnNwYXJlbnQgYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQgW2EmXTpob3ZlcjpiZy1zZWNvbmRhcnkvOTAnLFxuICAgICAgICBkZXN0cnVjdGl2ZTpcbiAgICAgICAgICAnYm9yZGVyLXRyYW5zcGFyZW50IGJnLWRlc3RydWN0aXZlIHRleHQtd2hpdGUgW2EmXTpob3ZlcjpiZy1kZXN0cnVjdGl2ZS85MCBmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazpmb2N1cy12aXNpYmxlOnJpbmctZGVzdHJ1Y3RpdmUvNDAgZGFyazpiZy1kZXN0cnVjdGl2ZS82MCcsXG4gICAgICAgIG91dGxpbmU6XG4gICAgICAgICAgJ3RleHQtZm9yZWdyb3VuZCBbYSZdOmhvdmVyOmJnLWFjY2VudCBbYSZdOmhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGRlZmF1bHRWYXJpYW50czoge1xuICAgICAgdmFyaWFudDogJ2RlZmF1bHQnLFxuICAgIH0sXG4gIH1cbilcblxuZnVuY3Rpb24gQmFkZ2Uoe1xuICBjbGFzc05hbWUsXG4gIHZhcmlhbnQsXG4gIGFzQ2hpbGQgPSBmYWxzZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdzcGFuJz4gJlxuICBWYXJpYW50UHJvcHM8dHlwZW9mIGJhZGdlVmFyaWFudHM+ICYgeyBhc0NoaWxkPzogYm9vbGVhbiB9KSB7XG4gIGNvbnN0IENvbXAgPSBhc0NoaWxkID8gU2xvdCA6ICdzcGFuJ1xuXG4gIHJldHVybiAoXG4gICAgPENvbXBcbiAgICAgIGRhdGEtc2xvdD1cImJhZGdlXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oYmFkZ2VWYXJpYW50cyh7IHZhcmlhbnQgfSksIGNsYXNzTmFtZSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgeyBCYWRnZSwgYmFkZ2VWYXJpYW50cyB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgU2xvdCB9IGZyb20gJ0ByYWRpeC11aS9yZWFjdC1zbG90J1xuaW1wb3J0IHsgY3ZhLCB0eXBlIFZhcmlhbnRQcm9wcyB9IGZyb20gJ2NsYXNzLXZhcmlhbmNlLWF1dGhvcml0eSdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuY29uc3QgYnV0dG9uVmFyaWFudHMgPSBjdmEoXG4gIFwiaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGdhcC0yIHdoaXRlc3BhY2Utbm93cmFwIHJvdW5kZWQtbWQgdGV4dC1zbSBmb250LW1lZGl1bSB0cmFuc2l0aW9uLWFsbCBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lIGRpc2FibGVkOm9wYWNpdHktNTAgWyZfc3ZnXTpwb2ludGVyLWV2ZW50cy1ub25lIFsmX3N2Zzpub3QoW2NsYXNzKj0nc2l6ZS0nXSldOnNpemUtNCBzaHJpbmstMCBbJl9zdmddOnNocmluay0wIG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGZvY3VzLXZpc2libGU6cmluZy1bM3B4XSBhcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS8yMCBkYXJrOmFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzQwIGFyaWEtaW52YWxpZDpib3JkZXItZGVzdHJ1Y3RpdmVcIixcbiAge1xuICAgIHZhcmlhbnRzOiB7XG4gICAgICB2YXJpYW50OiB7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgc2hhZG93LXhzIGhvdmVyOmJnLXByaW1hcnkvOTAnLFxuICAgICAgICBkZXN0cnVjdGl2ZTpcbiAgICAgICAgICAnYmctZGVzdHJ1Y3RpdmUgdGV4dC13aGl0ZSBzaGFkb3cteHMgaG92ZXI6YmctZGVzdHJ1Y3RpdmUvOTAgZm9jdXMtdmlzaWJsZTpyaW5nLWRlc3RydWN0aXZlLzIwIGRhcms6Zm9jdXMtdmlzaWJsZTpyaW5nLWRlc3RydWN0aXZlLzQwIGRhcms6YmctZGVzdHJ1Y3RpdmUvNjAnLFxuICAgICAgICBvdXRsaW5lOlxuICAgICAgICAgICdib3JkZXIgYmctYmFja2dyb3VuZCBzaGFkb3cteHMgaG92ZXI6YmctYWNjZW50IGhvdmVyOnRleHQtYWNjZW50LWZvcmVncm91bmQgZGFyazpiZy1pbnB1dC8zMCBkYXJrOmJvcmRlci1pbnB1dCBkYXJrOmhvdmVyOmJnLWlucHV0LzUwJyxcbiAgICAgICAgc2Vjb25kYXJ5OlxuICAgICAgICAgICdiZy1zZWNvbmRhcnkgdGV4dC1zZWNvbmRhcnktZm9yZWdyb3VuZCBzaGFkb3cteHMgaG92ZXI6Ymctc2Vjb25kYXJ5LzgwJyxcbiAgICAgICAgZ2hvc3Q6XG4gICAgICAgICAgJ2hvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIGRhcms6aG92ZXI6YmctYWNjZW50LzUwJyxcbiAgICAgICAgbGluazogJ3RleHQtcHJpbWFyeSB1bmRlcmxpbmUtb2Zmc2V0LTQgaG92ZXI6dW5kZXJsaW5lJyxcbiAgICAgIH0sXG4gICAgICBzaXplOiB7XG4gICAgICAgIGRlZmF1bHQ6ICdoLTkgcHgtNCBweS0yIGhhcy1bPnN2Z106cHgtMycsXG4gICAgICAgIHNtOiAnaC04IHJvdW5kZWQtbWQgZ2FwLTEuNSBweC0zIGhhcy1bPnN2Z106cHgtMi41JyxcbiAgICAgICAgbGc6ICdoLTEwIHJvdW5kZWQtbWQgcHgtNiBoYXMtWz5zdmddOnB4LTQnLFxuICAgICAgICBpY29uOiAnc2l6ZS05JyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkZWZhdWx0VmFyaWFudHM6IHtcbiAgICAgIHZhcmlhbnQ6ICdkZWZhdWx0JyxcbiAgICAgIHNpemU6ICdkZWZhdWx0JyxcbiAgICB9LFxuICB9XG4pXG5cbmZ1bmN0aW9uIEJ1dHRvbih7XG4gIGNsYXNzTmFtZSxcbiAgdmFyaWFudCxcbiAgc2l6ZSxcbiAgYXNDaGlsZCA9IGZhbHNlLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2J1dHRvbic+ICZcbiAgVmFyaWFudFByb3BzPHR5cGVvZiBidXR0b25WYXJpYW50cz4gJiB7XG4gICAgYXNDaGlsZD86IGJvb2xlYW5cbiAgfSkge1xuICBjb25zdCBDb21wID0gYXNDaGlsZCA/IFNsb3QgOiAnYnV0dG9uJ1xuXG4gIHJldHVybiAoXG4gICAgPENvbXBcbiAgICAgIGRhdGEtc2xvdD1cImJ1dHRvblwiXG4gICAgICBjbGFzc05hbWU9e2NuKGJ1dHRvblZhcmlhbnRzKHsgdmFyaWFudCwgc2l6ZSwgY2xhc3NOYW1lIH0pKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmV4cG9ydCB7IEJ1dHRvbiwgYnV0dG9uVmFyaWFudHMgfVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IENoZXZyb25MZWZ0LCBDaGV2cm9uUmlnaHQgfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5pbXBvcnQgeyBEYXlQaWNrZXIgfSBmcm9tICdyZWFjdC1kYXktcGlja2VyJ1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHsgYnV0dG9uVmFyaWFudHMgfSBmcm9tICdAL2NvbXBvbmVudHMvdWkvYnV0dG9uJ1xuXG5mdW5jdGlvbiBDYWxlbmRhcih7XG4gIGNsYXNzTmFtZSxcbiAgY2xhc3NOYW1lcyxcbiAgc2hvd091dHNpZGVEYXlzID0gdHJ1ZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEYXlQaWNrZXI+KSB7XG4gIHJldHVybiAoXG4gICAgPERheVBpY2tlclxuICAgICAgc2hvd091dHNpZGVEYXlzPXtzaG93T3V0c2lkZURheXN9XG4gICAgICBjbGFzc05hbWU9e2NuKCdwLTMnLCBjbGFzc05hbWUpfVxuICAgICAgY2xhc3NOYW1lcz17e1xuICAgICAgICBtb250aHM6ICdmbGV4IGZsZXgtY29sIHNtOmZsZXgtcm93IGdhcC0yJyxcbiAgICAgICAgbW9udGg6ICdmbGV4IGZsZXgtY29sIGdhcC00JyxcbiAgICAgICAgY2FwdGlvbjogJ2ZsZXgganVzdGlmeS1jZW50ZXIgcHQtMSByZWxhdGl2ZSBpdGVtcy1jZW50ZXIgdy1mdWxsJyxcbiAgICAgICAgY2FwdGlvbl9sYWJlbDogJ3RleHQtc20gZm9udC1tZWRpdW0nLFxuICAgICAgICBuYXY6ICdmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMScsXG4gICAgICAgIG5hdl9idXR0b246IGNuKFxuICAgICAgICAgIGJ1dHRvblZhcmlhbnRzKHsgdmFyaWFudDogJ291dGxpbmUnIH0pLFxuICAgICAgICAgICdzaXplLTcgYmctdHJhbnNwYXJlbnQgcC0wIG9wYWNpdHktNTAgaG92ZXI6b3BhY2l0eS0xMDAnXG4gICAgICAgICksXG4gICAgICAgIG5hdl9idXR0b25fcHJldmlvdXM6ICdhYnNvbHV0ZSBsZWZ0LTEnLFxuICAgICAgICBuYXZfYnV0dG9uX25leHQ6ICdhYnNvbHV0ZSByaWdodC0xJyxcbiAgICAgICAgdGFibGU6ICd3LWZ1bGwgYm9yZGVyLWNvbGxhcHNlIHNwYWNlLXgtMScsXG4gICAgICAgIGhlYWRfcm93OiAnZmxleCcsXG4gICAgICAgIGhlYWRfY2VsbDpcbiAgICAgICAgICAndGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHJvdW5kZWQtbWQgdy04IGZvbnQtbm9ybWFsIHRleHQtWzAuOHJlbV0nLFxuICAgICAgICByb3c6ICdmbGV4IHctZnVsbCBtdC0yJyxcbiAgICAgICAgY2VsbDogY24oXG4gICAgICAgICAgJ3JlbGF0aXZlIHAtMCB0ZXh0LWNlbnRlciB0ZXh0LXNtIGZvY3VzLXdpdGhpbjpyZWxhdGl2ZSBmb2N1cy13aXRoaW46ei0yMCBbJjpoYXMoW2FyaWEtc2VsZWN0ZWRdKV06YmctYWNjZW50IFsmOmhhcyhbYXJpYS1zZWxlY3RlZF0uZGF5LXJhbmdlLWVuZCldOnJvdW5kZWQtci1tZCcsXG4gICAgICAgICAgcHJvcHMubW9kZSA9PT0gJ3JhbmdlJ1xuICAgICAgICAgICAgPyAnWyY6aGFzKD4uZGF5LXJhbmdlLWVuZCldOnJvdW5kZWQtci1tZCBbJjpoYXMoPi5kYXktcmFuZ2Utc3RhcnQpXTpyb3VuZGVkLWwtbWQgZmlyc3Q6WyY6aGFzKFthcmlhLXNlbGVjdGVkXSldOnJvdW5kZWQtbC1tZCBsYXN0OlsmOmhhcyhbYXJpYS1zZWxlY3RlZF0pXTpyb3VuZGVkLXItbWQnXG4gICAgICAgICAgICA6ICdbJjpoYXMoW2FyaWEtc2VsZWN0ZWRdKV06cm91bmRlZC1tZCdcbiAgICAgICAgKSxcbiAgICAgICAgZGF5OiBjbihcbiAgICAgICAgICBidXR0b25WYXJpYW50cyh7IHZhcmlhbnQ6ICdnaG9zdCcgfSksXG4gICAgICAgICAgJ3NpemUtOCBwLTAgZm9udC1ub3JtYWwgYXJpYS1zZWxlY3RlZDpvcGFjaXR5LTEwMCdcbiAgICAgICAgKSxcbiAgICAgICAgZGF5X3JhbmdlX3N0YXJ0OlxuICAgICAgICAgICdkYXktcmFuZ2Utc3RhcnQgYXJpYS1zZWxlY3RlZDpiZy1wcmltYXJ5IGFyaWEtc2VsZWN0ZWQ6dGV4dC1wcmltYXJ5LWZvcmVncm91bmQnLFxuICAgICAgICBkYXlfcmFuZ2VfZW5kOlxuICAgICAgICAgICdkYXktcmFuZ2UtZW5kIGFyaWEtc2VsZWN0ZWQ6YmctcHJpbWFyeSBhcmlhLXNlbGVjdGVkOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kJyxcbiAgICAgICAgZGF5X3NlbGVjdGVkOlxuICAgICAgICAgICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGhvdmVyOmJnLXByaW1hcnkgaG92ZXI6dGV4dC1wcmltYXJ5LWZvcmVncm91bmQgZm9jdXM6YmctcHJpbWFyeSBmb2N1czp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCcsXG4gICAgICAgIGRheV90b2RheTogJ2JnLWFjY2VudCB0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJyxcbiAgICAgICAgZGF5X291dHNpZGU6XG4gICAgICAgICAgJ2RheS1vdXRzaWRlIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBhcmlhLXNlbGVjdGVkOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCcsXG4gICAgICAgIGRheV9kaXNhYmxlZDogJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCBvcGFjaXR5LTUwJyxcbiAgICAgICAgZGF5X3JhbmdlX21pZGRsZTpcbiAgICAgICAgICAnYXJpYS1zZWxlY3RlZDpiZy1hY2NlbnQgYXJpYS1zZWxlY3RlZDp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJyxcbiAgICAgICAgZGF5X2hpZGRlbjogJ2ludmlzaWJsZScsXG4gICAgICAgIC4uLmNsYXNzTmFtZXMsXG4gICAgICB9fVxuICAgICAgY29tcG9uZW50cz17e1xuICAgICAgICBJY29uTGVmdDogKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9KSA9PiAoXG4gICAgICAgICAgPENoZXZyb25MZWZ0IGNsYXNzTmFtZT17Y24oJ3NpemUtNCcsIGNsYXNzTmFtZSl9IHsuLi5wcm9wc30gLz5cbiAgICAgICAgKSxcbiAgICAgICAgSWNvblJpZ2h0OiAoeyBjbGFzc05hbWUsIC4uLnByb3BzIH0pID0+IChcbiAgICAgICAgICA8Q2hldnJvblJpZ2h0IGNsYXNzTmFtZT17Y24oJ3NpemUtNCcsIGNsYXNzTmFtZSl9IHsuLi5wcm9wc30gLz5cbiAgICAgICAgKSxcbiAgICAgIH19XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgeyBDYWxlbmRhciB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgQ2hlY2tib3hQcmltaXRpdmUgZnJvbSAnQHJhZGl4LXVpL3JlYWN0LWNoZWNrYm94J1xuaW1wb3J0IHsgQ2hlY2tJY29uIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5mdW5jdGlvbiBDaGVja2JveCh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBDaGVja2JveFByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gKFxuICAgIDxDaGVja2JveFByaW1pdGl2ZS5Sb290XG4gICAgICBkYXRhLXNsb3Q9XCJjaGVja2JveFwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAncGVlciBib3JkZXItaW5wdXQgZGFyazpiZy1pbnB1dC8zMCBkYXRhLVtzdGF0ZT1jaGVja2VkXTpiZy1wcmltYXJ5IGRhdGEtW3N0YXRlPWNoZWNrZWRdOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGRhcms6ZGF0YS1bc3RhdGU9Y2hlY2tlZF06YmctcHJpbWFyeSBkYXRhLVtzdGF0ZT1jaGVja2VkXTpib3JkZXItcHJpbWFyeSBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzIwIGRhcms6YXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvNDAgYXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZSBzaXplLTQgc2hyaW5rLTAgcm91bmRlZC1bNHB4XSBib3JkZXIgc2hhZG93LXhzIHRyYW5zaXRpb24tc2hhZG93IG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctWzNweF0gZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgPlxuICAgICAgPENoZWNrYm94UHJpbWl0aXZlLkluZGljYXRvclxuICAgICAgICBkYXRhLXNsb3Q9XCJjaGVja2JveC1pbmRpY2F0b3JcIlxuICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciB0ZXh0LWN1cnJlbnQgdHJhbnNpdGlvbi1ub25lXCJcbiAgICAgID5cbiAgICAgICAgPENoZWNrSWNvbiBjbGFzc05hbWU9XCJzaXplLTMuNVwiIC8+XG4gICAgICA8L0NoZWNrYm94UHJpbWl0aXZlLkluZGljYXRvcj5cbiAgICA8L0NoZWNrYm94UHJpbWl0aXZlLlJvb3Q+XG4gIClcbn1cblxuZXhwb3J0IHsgQ2hlY2tib3ggfVxuIiwKICAgICJpbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IHsgQ2FsZW5kYXIgYXMgQ2FsZW5kYXJJY29uIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCB7IEJ1dHRvbiB9IGZyb20gJ0AvY29tcG9uZW50cy91aS9idXR0b24nXG5pbXBvcnQgeyBDYWxlbmRhciB9IGZyb20gJ0AvY29tcG9uZW50cy91aS9jYWxlbmRhcidcbmltcG9ydCB7XG4gIFBvcG92ZXIsXG4gIFBvcG92ZXJDb250ZW50LFxuICBQb3BvdmVyVHJpZ2dlcixcbn0gZnJvbSAnQC9jb21wb25lbnRzL3VpL3BvcG92ZXInXG5pbXBvcnQgeyB1c2VSZWYgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFBvcG92ZXJDbG9zZSB9IGZyb20gJ0ByYWRpeC11aS9yZWFjdC1wb3BvdmVyJ1xuXG5pbnRlcmZhY2UgRGF0ZVBpY2tlclByb3BzIHtcbiAgZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZFxuICBzZXREYXRlOiAoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICBsYWJlbD86IHN0cmluZ1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgY2xvc2VPblNlbGVjdD86IGJvb2xlYW5cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIERhdGVQaWNrZXIoe1xuICBkYXRlLFxuICBjbG9zZU9uU2VsZWN0LFxuICBzZXREYXRlLFxuICBsYWJlbCA9ICdQaWNrIGEgZGF0ZScsXG4gIGNsYXNzTmFtZSxcbn06IERhdGVQaWNrZXJQcm9wcykge1xuICBjb25zdCBwb3BPdmVyUmVmID0gdXNlUmVmPEhUTUxCdXR0b25FbGVtZW50IHwgbnVsbD4obnVsbClcblxuICBjb25zdCBvblNlbGVjdCA9IChkYXRlOiBEYXRlIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgc2V0RGF0ZShkYXRlKVxuICAgIGlmIChjbG9zZU9uU2VsZWN0KSB7XG4gICAgICBwb3BPdmVyUmVmLmN1cnJlbnQ/LmNsaWNrKClcbiAgICB9XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPXtjbGFzc05hbWV9PlxuICAgICAgPFBvcG92ZXI+XG4gICAgICAgIDxQb3BvdmVyVHJpZ2dlciBhc0NoaWxkPlxuICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICd3LWZ1bGwganVzdGlmeS1zdGFydCB0ZXh0LWxlZnQgZm9udC1ub3JtYWwnLFxuICAgICAgICAgICAgICAhZGF0ZSAmJiAndGV4dC1tdXRlZC1mb3JlZ3JvdW5kJ1xuICAgICAgICAgICAgKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8Q2FsZW5kYXJJY29uIGNsYXNzTmFtZT1cIm1yLTIgaC00IHctNFwiIC8+XG4gICAgICAgICAgICB7ZGF0ZSA/IGRheWpzKGRhdGUpLmZvcm1hdCgnTU1NIEQsIFlZWVknKSA6IDxzcGFuPntsYWJlbH08L3NwYW4+fVxuICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICA8L1BvcG92ZXJUcmlnZ2VyPlxuICAgICAgICA8UG9wb3ZlckNvbnRlbnQgY2xhc3NOYW1lPVwidy1hdXRvIHAtMFwiIGFsaWduPVwic3RhcnRcIj5cbiAgICAgICAgICA8UG9wb3ZlckNsb3NlIHJlZj17cG9wT3ZlclJlZn0gLz5cbiAgICAgICAgICA8Q2FsZW5kYXJcbiAgICAgICAgICAgIG1vZGU9XCJzaW5nbGVcIlxuICAgICAgICAgICAgc2VsZWN0ZWQ9e2RhdGV9XG4gICAgICAgICAgICBvblNlbGVjdD17b25TZWxlY3R9XG4gICAgICAgICAgICBpbml0aWFsRm9jdXNcbiAgICAgICAgICAvPlxuICAgICAgICA8L1BvcG92ZXJDb250ZW50PlxuICAgICAgPC9Qb3BvdmVyPlxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgUG9wb3ZlclByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtcG9wb3ZlcidcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gUG9wb3Zlcih7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgUG9wb3ZlclByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gPFBvcG92ZXJQcmltaXRpdmUuUm9vdCBkYXRhLXNsb3Q9XCJwb3BvdmVyXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBQb3BvdmVyVHJpZ2dlcih7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgUG9wb3ZlclByaW1pdGl2ZS5UcmlnZ2VyPikge1xuICByZXR1cm4gPFBvcG92ZXJQcmltaXRpdmUuVHJpZ2dlciBkYXRhLXNsb3Q9XCJwb3BvdmVyLXRyaWdnZXJcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIFBvcG92ZXJDb250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICBhbGlnbiA9ICdjZW50ZXInLFxuICBzaWRlT2Zmc2V0ID0gNCxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBQb3BvdmVyUHJpbWl0aXZlLkNvbnRlbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPFBvcG92ZXJQcmltaXRpdmUuUG9ydGFsPlxuICAgICAgPFBvcG92ZXJQcmltaXRpdmUuQ29udGVudFxuICAgICAgICBkYXRhLXNsb3Q9XCJwb3BvdmVyLWNvbnRlbnRcIlxuICAgICAgICBhbGlnbj17YWxpZ259XG4gICAgICAgIHNpZGVPZmZzZXQ9e3NpZGVPZmZzZXR9XG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ2JnLXBvcG92ZXIgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQgZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1pbiBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1vcGVuXTpmYWRlLWluLTAgZGF0YS1bc3RhdGU9Y2xvc2VkXTp6b29tLW91dC05NSBkYXRhLVtzdGF0ZT1vcGVuXTp6b29tLWluLTk1IGRhdGEtW3NpZGU9Ym90dG9tXTpzbGlkZS1pbi1mcm9tLXRvcC0yIGRhdGEtW3NpZGU9bGVmdF06c2xpZGUtaW4tZnJvbS1yaWdodC0yIGRhdGEtW3NpZGU9cmlnaHRdOnNsaWRlLWluLWZyb20tbGVmdC0yIGRhdGEtW3NpZGU9dG9wXTpzbGlkZS1pbi1mcm9tLWJvdHRvbS0yIHotNTAgdy03MiBvcmlnaW4tKC0tcmFkaXgtcG9wb3Zlci1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW4pIHJvdW5kZWQtbWQgYm9yZGVyIHAtNCBzaGFkb3ctbWQgb3V0bGluZS1oaWRkZW4nLFxuICAgICAgICAgIGNsYXNzTmFtZVxuICAgICAgICApfVxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAvPlxuICAgIDwvUG9wb3ZlclByaW1pdGl2ZS5Qb3J0YWw+XG4gIClcbn1cblxuZnVuY3Rpb24gUG9wb3ZlckFuY2hvcih7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgUG9wb3ZlclByaW1pdGl2ZS5BbmNob3I+KSB7XG4gIHJldHVybiA8UG9wb3ZlclByaW1pdGl2ZS5BbmNob3IgZGF0YS1zbG90PVwicG9wb3Zlci1hbmNob3JcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmV4cG9ydCB7IFBvcG92ZXIsIFBvcG92ZXJUcmlnZ2VyLCBQb3BvdmVyQ29udGVudCwgUG9wb3ZlckFuY2hvciB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgRGlhbG9nUHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1kaWFsb2cnXG5pbXBvcnQgeyBYSWNvbiB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gRGlhbG9nKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEaWFsb2dQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIDxEaWFsb2dQcmltaXRpdmUuUm9vdCBkYXRhLXNsb3Q9XCJkaWFsb2dcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIERpYWxvZ1RyaWdnZXIoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERpYWxvZ1ByaW1pdGl2ZS5UcmlnZ2VyPikge1xuICByZXR1cm4gPERpYWxvZ1ByaW1pdGl2ZS5UcmlnZ2VyIGRhdGEtc2xvdD1cImRpYWxvZy10cmlnZ2VyXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBEaWFsb2dQb3J0YWwoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERpYWxvZ1ByaW1pdGl2ZS5Qb3J0YWw+KSB7XG4gIHJldHVybiA8RGlhbG9nUHJpbWl0aXZlLlBvcnRhbCBkYXRhLXNsb3Q9XCJkaWFsb2ctcG9ydGFsXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBEaWFsb2dDbG9zZSh7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRGlhbG9nUHJpbWl0aXZlLkNsb3NlPikge1xuICByZXR1cm4gPERpYWxvZ1ByaW1pdGl2ZS5DbG9zZSBkYXRhLXNsb3Q9XCJkaWFsb2ctY2xvc2VcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIERpYWxvZ092ZXJsYXkoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRGlhbG9nUHJpbWl0aXZlLk92ZXJsYXk+KSB7XG4gIHJldHVybiAoXG4gICAgPERpYWxvZ1ByaW1pdGl2ZS5PdmVybGF5XG4gICAgICBkYXRhLXNsb3Q9XCJkaWFsb2ctb3ZlcmxheVwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1pbiBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1vcGVuXTpmYWRlLWluLTAgZml4ZWQgaW5zZXQtMCB6LTUwIGJnLWJsYWNrLzUwJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRGlhbG9nQ29udGVudCh7XG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRGlhbG9nUHJpbWl0aXZlLkNvbnRlbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPERpYWxvZ1BvcnRhbCBkYXRhLXNsb3Q9XCJkaWFsb2ctcG9ydGFsXCI+XG4gICAgICA8RGlhbG9nT3ZlcmxheSAvPlxuICAgICAgPERpYWxvZ1ByaW1pdGl2ZS5Db250ZW50XG4gICAgICAgIGRhdGEtc2xvdD1cImRpYWxvZy1jb250ZW50XCJcbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAnYmctYmFja2dyb3VuZCBkYXRhLVtzdGF0ZT1vcGVuXTphbmltYXRlLWluIGRhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1vdXQgZGF0YS1bc3RhdGU9Y2xvc2VkXTpmYWRlLW91dC0wIGRhdGEtW3N0YXRlPW9wZW5dOmZhZGUtaW4tMCBkYXRhLVtzdGF0ZT1jbG9zZWRdOnpvb20tb3V0LTk1IGRhdGEtW3N0YXRlPW9wZW5dOnpvb20taW4tOTUgZml4ZWQgdG9wLVs1MCVdIGxlZnQtWzUwJV0gei01MCBncmlkIHctZnVsbCBtYXgtdy1bY2FsYygxMDAlLTJyZW0pXSB0cmFuc2xhdGUteC1bLTUwJV0gdHJhbnNsYXRlLXktWy01MCVdIGdhcC00IHJvdW5kZWQtbGcgYm9yZGVyIHAtNiBzaGFkb3ctbGcgZHVyYXRpb24tMjAwIHNtOm1heC13LWxnJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgPlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDxEaWFsb2dQcmltaXRpdmUuQ2xvc2UgY2xhc3NOYW1lPVwicmluZy1vZmZzZXQtYmFja2dyb3VuZCBmb2N1czpyaW5nLXJpbmcgZGF0YS1bc3RhdGU9b3Blbl06YmctYWNjZW50IGRhdGEtW3N0YXRlPW9wZW5dOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBhYnNvbHV0ZSB0b3AtNCByaWdodC00IHJvdW5kZWQteHMgb3BhY2l0eS03MCB0cmFuc2l0aW9uLW9wYWNpdHkgaG92ZXI6b3BhY2l0eS0xMDAgZm9jdXM6cmluZy0yIGZvY3VzOnJpbmctb2Zmc2V0LTIgZm9jdXM6b3V0bGluZS1oaWRkZW4gZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTRcIj5cbiAgICAgICAgICA8WEljb24gLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XG4gICAgICAgIDwvRGlhbG9nUHJpbWl0aXZlLkNsb3NlPlxuICAgICAgPC9EaWFsb2dQcmltaXRpdmUuQ29udGVudD5cbiAgICA8L0RpYWxvZ1BvcnRhbD5cbiAgKVxufVxuXG5mdW5jdGlvbiBEaWFsb2dIZWFkZXIoeyBjbGFzc05hbWUsIC4uLnByb3BzIH06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdkaXYnPikge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtc2xvdD1cImRpYWxvZy1oZWFkZXJcIlxuICAgICAgY2xhc3NOYW1lPXtjbignZmxleCBmbGV4LWNvbCBnYXAtMiB0ZXh0LWNlbnRlciBzbTp0ZXh0LWxlZnQnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRGlhbG9nRm9vdGVyKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczwnZGl2Jz4pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBkYXRhLXNsb3Q9XCJkaWFsb2ctZm9vdGVyXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdmbGV4IGZsZXgtY29sLXJldmVyc2UgZ2FwLTIgc206ZmxleC1yb3cgc206anVzdGlmeS1lbmQnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBEaWFsb2dUaXRsZSh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEaWFsb2dQcmltaXRpdmUuVGl0bGU+KSB7XG4gIHJldHVybiAoXG4gICAgPERpYWxvZ1ByaW1pdGl2ZS5UaXRsZVxuICAgICAgZGF0YS1zbG90PVwiZGlhbG9nLXRpdGxlXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ3RleHQtbGcgbGVhZGluZy1ub25lIGZvbnQtc2VtaWJvbGQnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRGlhbG9nRGVzY3JpcHRpb24oe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRGlhbG9nUHJpbWl0aXZlLkRlc2NyaXB0aW9uPikge1xuICByZXR1cm4gKFxuICAgIDxEaWFsb2dQcmltaXRpdmUuRGVzY3JpcHRpb25cbiAgICAgIGRhdGEtc2xvdD1cImRpYWxvZy1kZXNjcmlwdGlvblwiXG4gICAgICBjbGFzc05hbWU9e2NuKCd0ZXh0LW11dGVkLWZvcmVncm91bmQgdGV4dC1zbScsIGNsYXNzTmFtZSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQge1xuICBEaWFsb2csXG4gIERpYWxvZ0Nsb3NlLFxuICBEaWFsb2dDb250ZW50LFxuICBEaWFsb2dEZXNjcmlwdGlvbixcbiAgRGlhbG9nRm9vdGVyLFxuICBEaWFsb2dIZWFkZXIsXG4gIERpYWxvZ092ZXJsYXksXG4gIERpYWxvZ1BvcnRhbCxcbiAgRGlhbG9nVGl0bGUsXG4gIERpYWxvZ1RyaWdnZXIsXG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgRHJvcGRvd25NZW51UHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1kcm9wZG93bi1tZW51J1xuaW1wb3J0IHsgQ2hlY2tJY29uLCBDaGV2cm9uUmlnaHRJY29uLCBDaXJjbGVJY29uIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnUoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERyb3Bkb3duTWVudVByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gPERyb3Bkb3duTWVudVByaW1pdGl2ZS5Sb290IGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnVcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudVBvcnRhbCh7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLlBvcnRhbD4pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlBvcnRhbCBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXBvcnRhbFwiIHsuLi5wcm9wc30gLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVUcmlnZ2VyKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuVHJpZ2dlcj4pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlRyaWdnZXJcbiAgICAgIGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnUtdHJpZ2dlclwiXG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVDb250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICBzaWRlT2Zmc2V0ID0gNCxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuQ29udGVudD4pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlBvcnRhbD5cbiAgICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuQ29udGVudFxuICAgICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LWNvbnRlbnRcIlxuICAgICAgICBzaWRlT2Zmc2V0PXtzaWRlT2Zmc2V0fVxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdiZy1wb3BvdmVyIHRleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmZhZGUtb3V0LTAgZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wIGRhdGEtW3N0YXRlPWNsb3NlZF06em9vbS1vdXQtOTUgZGF0YS1bc3RhdGU9b3Blbl06em9vbS1pbi05NSBkYXRhLVtzaWRlPWJvdHRvbV06c2xpZGUtaW4tZnJvbS10b3AtMiBkYXRhLVtzaWRlPWxlZnRdOnNsaWRlLWluLWZyb20tcmlnaHQtMiBkYXRhLVtzaWRlPXJpZ2h0XTpzbGlkZS1pbi1mcm9tLWxlZnQtMiBkYXRhLVtzaWRlPXRvcF06c2xpZGUtaW4tZnJvbS1ib3R0b20tMiB6LTUwIG1heC1oLSgtLXJhZGl4LWRyb3Bkb3duLW1lbnUtY29udGVudC1hdmFpbGFibGUtaGVpZ2h0KSBtaW4tdy1bOHJlbV0gb3JpZ2luLSgtLXJhZGl4LWRyb3Bkb3duLW1lbnUtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luKSBvdmVyZmxvdy14LWhpZGRlbiBvdmVyZmxvdy15LWF1dG8gcm91bmRlZC1tZCBib3JkZXIgcC0xIHNoYWRvdy1tZCcsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgIC8+XG4gICAgPC9Ecm9wZG93bk1lbnVQcmltaXRpdmUuUG9ydGFsPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudUdyb3VwKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuR3JvdXA+KSB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duTWVudVByaW1pdGl2ZS5Hcm91cCBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LWdyb3VwXCIgey4uLnByb3BzfSAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudUl0ZW0oe1xuICBjbGFzc05hbWUsXG4gIGluc2V0LFxuICB2YXJpYW50ID0gJ2RlZmF1bHQnLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERyb3Bkb3duTWVudVByaW1pdGl2ZS5JdGVtPiAmIHtcbiAgaW5zZXQ/OiBib29sZWFuXG4gIHZhcmlhbnQ/OiAnZGVmYXVsdCcgfCAnZGVzdHJ1Y3RpdmUnXG59KSB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duTWVudVByaW1pdGl2ZS5JdGVtXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LWl0ZW1cIlxuICAgICAgZGF0YS1pbnNldD17aW5zZXR9XG4gICAgICBkYXRhLXZhcmlhbnQ9e3ZhcmlhbnR9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICBcImZvY3VzOmJnLWFjY2VudCBmb2N1czp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIGRhdGEtW3ZhcmlhbnQ9ZGVzdHJ1Y3RpdmVdOnRleHQtZGVzdHJ1Y3RpdmUgZGF0YS1bdmFyaWFudD1kZXN0cnVjdGl2ZV06Zm9jdXM6YmctZGVzdHJ1Y3RpdmUvMTAgZGFyazpkYXRhLVt2YXJpYW50PWRlc3RydWN0aXZlXTpmb2N1czpiZy1kZXN0cnVjdGl2ZS8yMCBkYXRhLVt2YXJpYW50PWRlc3RydWN0aXZlXTpmb2N1czp0ZXh0LWRlc3RydWN0aXZlIGRhdGEtW3ZhcmlhbnQ9ZGVzdHJ1Y3RpdmVdOio6W3N2Z106IXRleHQtZGVzdHJ1Y3RpdmUgWyZfc3ZnOm5vdChbY2xhc3MqPSd0ZXh0LSddKV06dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHJlbGF0aXZlIGZsZXggY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtc20gcHgtMiBweS0xLjUgdGV4dC1zbSBvdXRsaW5lLWhpZGRlbiBzZWxlY3Qtbm9uZSBkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCBkYXRhLVtpbnNldF06cGwtOCBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTRcIixcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRHJvcGRvd25NZW51Q2hlY2tib3hJdGVtKHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgY2hlY2tlZCxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuQ2hlY2tib3hJdGVtPikge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuQ2hlY2tib3hJdGVtXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LWNoZWNrYm94LWl0ZW1cIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgXCJmb2N1czpiZy1hY2NlbnQgZm9jdXM6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCByZWxhdGl2ZSBmbGV4IGN1cnNvci1kZWZhdWx0IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLXNtIHB5LTEuNSBwci0yIHBsLTggdGV4dC1zbSBvdXRsaW5lLWhpZGRlbiBzZWxlY3Qtbm9uZSBkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTRcIixcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgY2hlY2tlZD17Y2hlY2tlZH1cbiAgICAgIHsuLi5wcm9wc31cbiAgICA+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIGxlZnQtMiBmbGV4IHNpemUtMy41IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLkl0ZW1JbmRpY2F0b3I+XG4gICAgICAgICAgPENoZWNrSWNvbiBjbGFzc05hbWU9XCJzaXplLTRcIiAvPlxuICAgICAgICA8L0Ryb3Bkb3duTWVudVByaW1pdGl2ZS5JdGVtSW5kaWNhdG9yPlxuICAgICAgPC9zcGFuPlxuICAgICAge2NoaWxkcmVufVxuICAgIDwvRHJvcGRvd25NZW51UHJpbWl0aXZlLkNoZWNrYm94SXRlbT5cbiAgKVxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVSYWRpb0dyb3VwKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuUmFkaW9Hcm91cD4pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlJhZGlvR3JvdXBcbiAgICAgIGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnUtcmFkaW8tZ3JvdXBcIlxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRHJvcGRvd25NZW51UmFkaW9JdGVtKHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuUmFkaW9JdGVtPikge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuUmFkaW9JdGVtXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXJhZGlvLWl0ZW1cIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgXCJmb2N1czpiZy1hY2NlbnQgZm9jdXM6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCByZWxhdGl2ZSBmbGV4IGN1cnNvci1kZWZhdWx0IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLXNtIHB5LTEuNSBwci0yIHBsLTggdGV4dC1zbSBvdXRsaW5lLWhpZGRlbiBzZWxlY3Qtbm9uZSBkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTRcIixcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgbGVmdC0yIGZsZXggc2l6ZS0zLjUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuSXRlbUluZGljYXRvcj5cbiAgICAgICAgICA8Q2lyY2xlSWNvbiBjbGFzc05hbWU9XCJzaXplLTIgZmlsbC1jdXJyZW50XCIgLz5cbiAgICAgICAgPC9Ecm9wZG93bk1lbnVQcmltaXRpdmUuSXRlbUluZGljYXRvcj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0Ryb3Bkb3duTWVudVByaW1pdGl2ZS5SYWRpb0l0ZW0+XG4gIClcbn1cblxuZnVuY3Rpb24gRHJvcGRvd25NZW51TGFiZWwoe1xuICBjbGFzc05hbWUsXG4gIGluc2V0LFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERyb3Bkb3duTWVudVByaW1pdGl2ZS5MYWJlbD4gJiB7XG4gIGluc2V0PzogYm9vbGVhblxufSkge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuTGFiZWxcbiAgICAgIGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnUtbGFiZWxcIlxuICAgICAgZGF0YS1pbnNldD17aW5zZXR9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAncHgtMiBweS0xLjUgdGV4dC1zbSBmb250LW1lZGl1bSBkYXRhLVtpbnNldF06cGwtOCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudVNlcGFyYXRvcih7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuU2VwYXJhdG9yPikge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuU2VwYXJhdG9yXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXNlcGFyYXRvclwiXG4gICAgICBjbGFzc05hbWU9e2NuKCdiZy1ib3JkZXIgLW14LTEgbXktMSBoLXB4JywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudVNob3J0Y3V0KHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J3NwYW4nPikge1xuICByZXR1cm4gKFxuICAgIDxzcGFuXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXNob3J0Y3V0XCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICd0ZXh0LW11dGVkLWZvcmVncm91bmQgbWwtYXV0byB0ZXh0LXhzIHRyYWNraW5nLXdpZGVzdCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudVN1Yih7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLlN1Yj4pIHtcbiAgcmV0dXJuIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuU3ViIGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnUtc3ViXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVTdWJUcmlnZ2VyKHtcbiAgY2xhc3NOYW1lLFxuICBpbnNldCxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLlN1YlRyaWdnZXI+ICYge1xuICBpbnNldD86IGJvb2xlYW5cbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlN1YlRyaWdnZXJcbiAgICAgIGRhdGEtc2xvdD1cImRyb3Bkb3duLW1lbnUtc3ViLXRyaWdnZXJcIlxuICAgICAgZGF0YS1pbnNldD17aW5zZXR9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZm9jdXM6YmctYWNjZW50IGZvY3VzOnRleHQtYWNjZW50LWZvcmVncm91bmQgZGF0YS1bc3RhdGU9b3Blbl06YmctYWNjZW50IGRhdGEtW3N0YXRlPW9wZW5dOnRleHQtYWNjZW50LWZvcmVncm91bmQgZmxleCBjdXJzb3ItZGVmYXVsdCBpdGVtcy1jZW50ZXIgcm91bmRlZC1zbSBweC0yIHB5LTEuNSB0ZXh0LXNtIG91dGxpbmUtaGlkZGVuIHNlbGVjdC1ub25lIGRhdGEtW2luc2V0XTpwbC04JyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDxDaGV2cm9uUmlnaHRJY29uIGNsYXNzTmFtZT1cIm1sLWF1dG8gc2l6ZS00XCIgLz5cbiAgICA8L0Ryb3Bkb3duTWVudVByaW1pdGl2ZS5TdWJUcmlnZ2VyPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudVN1YkNvbnRlbnQoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLlN1YkNvbnRlbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duTWVudVByaW1pdGl2ZS5TdWJDb250ZW50XG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXN1Yi1jb250ZW50XCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdiZy1wb3BvdmVyIHRleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmZhZGUtb3V0LTAgZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wIGRhdGEtW3N0YXRlPWNsb3NlZF06em9vbS1vdXQtOTUgZGF0YS1bc3RhdGU9b3Blbl06em9vbS1pbi05NSBkYXRhLVtzaWRlPWJvdHRvbV06c2xpZGUtaW4tZnJvbS10b3AtMiBkYXRhLVtzaWRlPWxlZnRdOnNsaWRlLWluLWZyb20tcmlnaHQtMiBkYXRhLVtzaWRlPXJpZ2h0XTpzbGlkZS1pbi1mcm9tLWxlZnQtMiBkYXRhLVtzaWRlPXRvcF06c2xpZGUtaW4tZnJvbS1ib3R0b20tMiB6LTUwIG1pbi13LVs4cmVtXSBvcmlnaW4tKC0tcmFkaXgtZHJvcGRvd24tbWVudS1jb250ZW50LXRyYW5zZm9ybS1vcmlnaW4pIG92ZXJmbG93LWNsaXAgcm91bmRlZC1tZCBib3JkZXIgcC0xIHNoYWRvdy1sZycsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmV4cG9ydCB7XG4gIERyb3Bkb3duTWVudSxcbiAgRHJvcGRvd25NZW51UG9ydGFsLFxuICBEcm9wZG93bk1lbnVUcmlnZ2VyLFxuICBEcm9wZG93bk1lbnVDb250ZW50LFxuICBEcm9wZG93bk1lbnVHcm91cCxcbiAgRHJvcGRvd25NZW51TGFiZWwsXG4gIERyb3Bkb3duTWVudUl0ZW0sXG4gIERyb3Bkb3duTWVudUNoZWNrYm94SXRlbSxcbiAgRHJvcGRvd25NZW51UmFkaW9Hcm91cCxcbiAgRHJvcGRvd25NZW51UmFkaW9JdGVtLFxuICBEcm9wZG93bk1lbnVTZXBhcmF0b3IsXG4gIERyb3Bkb3duTWVudVNob3J0Y3V0LFxuICBEcm9wZG93bk1lbnVTdWIsXG4gIERyb3Bkb3duTWVudVN1YlRyaWdnZXIsXG4gIERyb3Bkb3duTWVudVN1YkNvbnRlbnQsXG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHR5cGUgKiBhcyBMYWJlbFByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtbGFiZWwnXG5pbXBvcnQgeyBTbG90IH0gZnJvbSAnQHJhZGl4LXVpL3JlYWN0LXNsb3QnXG5pbXBvcnQge1xuICBDb250cm9sbGVyLFxuICBGb3JtUHJvdmlkZXIsXG4gIHVzZUZvcm1Db250ZXh0LFxuICB1c2VGb3JtU3RhdGUsXG4gIHR5cGUgQ29udHJvbGxlclByb3BzLFxuICB0eXBlIEZpZWxkUGF0aCxcbiAgdHlwZSBGaWVsZFZhbHVlcyxcbn0gZnJvbSAncmVhY3QtaG9vay1mb3JtJ1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHsgTGFiZWwgfSBmcm9tICdAL2NvbXBvbmVudHMvdWkvbGFiZWwnXG5cbmNvbnN0IEZvcm0gPSBGb3JtUHJvdmlkZXJcblxudHlwZSBGb3JtRmllbGRDb250ZXh0VmFsdWU8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4gPSB7XG4gIG5hbWU6IFROYW1lXG59XG5cbmNvbnN0IEZvcm1GaWVsZENvbnRleHQgPSBSZWFjdC5jcmVhdGVDb250ZXh0PEZvcm1GaWVsZENvbnRleHRWYWx1ZT4oXG4gIHt9IGFzIEZvcm1GaWVsZENvbnRleHRWYWx1ZVxuKVxuXG5jb25zdCBGb3JtRmllbGQgPSA8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oe1xuICAuLi5wcm9wc1xufTogQ29udHJvbGxlclByb3BzPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPEZvcm1GaWVsZENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3sgbmFtZTogcHJvcHMubmFtZSB9fT5cbiAgICAgIDxDb250cm9sbGVyIHsuLi5wcm9wc30gLz5cbiAgICA8L0Zvcm1GaWVsZENvbnRleHQuUHJvdmlkZXI+XG4gIClcbn1cblxuY29uc3QgdXNlRm9ybUZpZWxkID0gKCkgPT4ge1xuICBjb25zdCBmaWVsZENvbnRleHQgPSBSZWFjdC51c2VDb250ZXh0KEZvcm1GaWVsZENvbnRleHQpXG4gIGNvbnN0IGl0ZW1Db250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChGb3JtSXRlbUNvbnRleHQpXG4gIGNvbnN0IHsgZ2V0RmllbGRTdGF0ZSB9ID0gdXNlRm9ybUNvbnRleHQoKVxuICBjb25zdCBmb3JtU3RhdGUgPSB1c2VGb3JtU3RhdGUoeyBuYW1lOiBmaWVsZENvbnRleHQubmFtZSB9KVxuICBjb25zdCBmaWVsZFN0YXRlID0gZ2V0RmllbGRTdGF0ZShmaWVsZENvbnRleHQubmFtZSwgZm9ybVN0YXRlKVxuXG4gIGlmICghZmllbGRDb250ZXh0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VGb3JtRmllbGQgc2hvdWxkIGJlIHVzZWQgd2l0aGluIDxGb3JtRmllbGQ+JylcbiAgfVxuXG4gIGNvbnN0IHsgaWQgfSA9IGl0ZW1Db250ZXh0XG5cbiAgcmV0dXJuIHtcbiAgICBpZCxcbiAgICBuYW1lOiBmaWVsZENvbnRleHQubmFtZSxcbiAgICBmb3JtSXRlbUlkOiBgJHtpZH0tZm9ybS1pdGVtYCxcbiAgICBmb3JtRGVzY3JpcHRpb25JZDogYCR7aWR9LWZvcm0taXRlbS1kZXNjcmlwdGlvbmAsXG4gICAgZm9ybU1lc3NhZ2VJZDogYCR7aWR9LWZvcm0taXRlbS1tZXNzYWdlYCxcbiAgICAuLi5maWVsZFN0YXRlLFxuICB9XG59XG5cbnR5cGUgRm9ybUl0ZW1Db250ZXh0VmFsdWUgPSB7XG4gIGlkOiBzdHJpbmdcbn1cblxuY29uc3QgRm9ybUl0ZW1Db250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dDxGb3JtSXRlbUNvbnRleHRWYWx1ZT4oXG4gIHt9IGFzIEZvcm1JdGVtQ29udGV4dFZhbHVlXG4pXG5cbmZ1bmN0aW9uIEZvcm1JdGVtKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczwnZGl2Jz4pIHtcbiAgY29uc3QgaWQgPSBSZWFjdC51c2VJZCgpXG5cbiAgcmV0dXJuIChcbiAgICA8Rm9ybUl0ZW1Db250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7IGlkIH19PlxuICAgICAgPGRpdlxuICAgICAgICBkYXRhLXNsb3Q9XCJmb3JtLWl0ZW1cIlxuICAgICAgICBjbGFzc05hbWU9e2NuKCdncmlkIGdhcC0yJywgY2xhc3NOYW1lKX1cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgLz5cbiAgICA8L0Zvcm1JdGVtQ29udGV4dC5Qcm92aWRlcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBGb3JtTGFiZWwoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgTGFiZWxQcmltaXRpdmUuUm9vdD4pIHtcbiAgY29uc3QgeyBlcnJvciwgZm9ybUl0ZW1JZCB9ID0gdXNlRm9ybUZpZWxkKClcblxuICByZXR1cm4gKFxuICAgIDxMYWJlbFxuICAgICAgZGF0YS1zbG90PVwiZm9ybS1sYWJlbFwiXG4gICAgICBkYXRhLWVycm9yPXshIWVycm9yfVxuICAgICAgY2xhc3NOYW1lPXtjbignZGF0YS1bZXJyb3I9dHJ1ZV06dGV4dC1kZXN0cnVjdGl2ZScsIGNsYXNzTmFtZSl9XG4gICAgICBodG1sRm9yPXtmb3JtSXRlbUlkfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRm9ybUNvbnRyb2woeyAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2xvdD4pIHtcbiAgY29uc3QgeyBlcnJvciwgZm9ybUl0ZW1JZCwgZm9ybURlc2NyaXB0aW9uSWQsIGZvcm1NZXNzYWdlSWQgfSA9IHVzZUZvcm1GaWVsZCgpXG5cbiAgcmV0dXJuIChcbiAgICA8U2xvdFxuICAgICAgZGF0YS1zbG90PVwiZm9ybS1jb250cm9sXCJcbiAgICAgIGlkPXtmb3JtSXRlbUlkfVxuICAgICAgYXJpYS1kZXNjcmliZWRieT17XG4gICAgICAgICFlcnJvclxuICAgICAgICAgID8gYCR7Zm9ybURlc2NyaXB0aW9uSWR9YFxuICAgICAgICAgIDogYCR7Zm9ybURlc2NyaXB0aW9uSWR9ICR7Zm9ybU1lc3NhZ2VJZH1gXG4gICAgICB9XG4gICAgICBhcmlhLWludmFsaWQ9eyEhZXJyb3J9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBGb3JtRGVzY3JpcHRpb24oeyBjbGFzc05hbWUsIC4uLnByb3BzIH06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdwJz4pIHtcbiAgY29uc3QgeyBmb3JtRGVzY3JpcHRpb25JZCB9ID0gdXNlRm9ybUZpZWxkKClcblxuICByZXR1cm4gKFxuICAgIDxwXG4gICAgICBkYXRhLXNsb3Q9XCJmb3JtLWRlc2NyaXB0aW9uXCJcbiAgICAgIGlkPXtmb3JtRGVzY3JpcHRpb25JZH1cbiAgICAgIGNsYXNzTmFtZT17Y24oJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCB0ZXh0LXNtJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIEZvcm1NZXNzYWdlKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczwncCc+KSB7XG4gIGNvbnN0IHsgZXJyb3IsIGZvcm1NZXNzYWdlSWQgfSA9IHVzZUZvcm1GaWVsZCgpXG4gIGNvbnN0IGJvZHkgPSBlcnJvciA/IFN0cmluZyhlcnJvcj8ubWVzc2FnZSA/PyAnJykgOiBwcm9wcy5jaGlsZHJlblxuXG4gIGlmICghYm9keSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxwXG4gICAgICBkYXRhLXNsb3Q9XCJmb3JtLW1lc3NhZ2VcIlxuICAgICAgaWQ9e2Zvcm1NZXNzYWdlSWR9XG4gICAgICBjbGFzc05hbWU9e2NuKCd0ZXh0LWRlc3RydWN0aXZlIHRleHQtc20nLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIHtib2R5fVxuICAgIDwvcD5cbiAgKVxufVxuXG5leHBvcnQge1xuICB1c2VGb3JtRmllbGQsXG4gIEZvcm0sXG4gIEZvcm1JdGVtLFxuICBGb3JtTGFiZWwsXG4gIEZvcm1Db250cm9sLFxuICBGb3JtRGVzY3JpcHRpb24sXG4gIEZvcm1NZXNzYWdlLFxuICBGb3JtRmllbGQsXG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBSZWFjdF9fZGVmYXVsdCBmcm9tICdyZWFjdCc7XG5cbnZhciBpc0NoZWNrQm94SW5wdXQgPSAoZWxlbWVudCkgPT4gZWxlbWVudC50eXBlID09PSAnY2hlY2tib3gnO1xuXG52YXIgaXNEYXRlT2JqZWN0ID0gKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIERhdGU7XG5cbnZhciBpc051bGxPclVuZGVmaW5lZCA9ICh2YWx1ZSkgPT4gdmFsdWUgPT0gbnVsbDtcblxuY29uc3QgaXNPYmplY3RUeXBlID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xudmFyIGlzT2JqZWN0ID0gKHZhbHVlKSA9PiAhaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpICYmXG4gICAgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmXG4gICAgaXNPYmplY3RUeXBlKHZhbHVlKSAmJlxuICAgICFpc0RhdGVPYmplY3QodmFsdWUpO1xuXG52YXIgZ2V0RXZlbnRWYWx1ZSA9IChldmVudCkgPT4gaXNPYmplY3QoZXZlbnQpICYmIGV2ZW50LnRhcmdldFxuICAgID8gaXNDaGVja0JveElucHV0KGV2ZW50LnRhcmdldClcbiAgICAgICAgPyBldmVudC50YXJnZXQuY2hlY2tlZFxuICAgICAgICA6IGV2ZW50LnRhcmdldC52YWx1ZVxuICAgIDogZXZlbnQ7XG5cbnZhciBnZXROb2RlUGFyZW50TmFtZSA9IChuYW1lKSA9PiBuYW1lLnN1YnN0cmluZygwLCBuYW1lLnNlYXJjaCgvXFwuXFxkKyhcXC58JCkvKSkgfHwgbmFtZTtcblxudmFyIGlzTmFtZUluRmllbGRBcnJheSA9IChuYW1lcywgbmFtZSkgPT4gbmFtZXMuaGFzKGdldE5vZGVQYXJlbnROYW1lKG5hbWUpKTtcblxudmFyIGlzUGxhaW5PYmplY3QgPSAodGVtcE9iamVjdCkgPT4ge1xuICAgIGNvbnN0IHByb3RvdHlwZUNvcHkgPSB0ZW1wT2JqZWN0LmNvbnN0cnVjdG9yICYmIHRlbXBPYmplY3QuY29uc3RydWN0b3IucHJvdG90eXBlO1xuICAgIHJldHVybiAoaXNPYmplY3QocHJvdG90eXBlQ29weSkgJiYgcHJvdG90eXBlQ29weS5oYXNPd25Qcm9wZXJ0eSgnaXNQcm90b3R5cGVPZicpKTtcbn07XG5cbnZhciBpc1dlYiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIHdpbmRvdy5IVE1MRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnO1xuXG5mdW5jdGlvbiBjbG9uZU9iamVjdChkYXRhKSB7XG4gICAgbGV0IGNvcHk7XG4gICAgY29uc3QgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkoZGF0YSk7XG4gICAgY29uc3QgaXNGaWxlTGlzdEluc3RhbmNlID0gdHlwZW9mIEZpbGVMaXN0ICE9PSAndW5kZWZpbmVkJyA/IGRhdGEgaW5zdGFuY2VvZiBGaWxlTGlzdCA6IGZhbHNlO1xuICAgIGlmIChkYXRhIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICBjb3B5ID0gbmV3IERhdGUoZGF0YSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKCEoaXNXZWIgJiYgKGRhdGEgaW5zdGFuY2VvZiBCbG9iIHx8IGlzRmlsZUxpc3RJbnN0YW5jZSkpICYmXG4gICAgICAgIChpc0FycmF5IHx8IGlzT2JqZWN0KGRhdGEpKSkge1xuICAgICAgICBjb3B5ID0gaXNBcnJheSA/IFtdIDoge307XG4gICAgICAgIGlmICghaXNBcnJheSAmJiAhaXNQbGFpbk9iamVjdChkYXRhKSkge1xuICAgICAgICAgICAgY29weSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAgICAgICAgICAgICBjb3B5W2tleV0gPSBjbG9uZU9iamVjdChkYXRhW2tleV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIHJldHVybiBjb3B5O1xufVxuXG52YXIgaXNLZXkgPSAodmFsdWUpID0+IC9eXFx3KiQvLnRlc3QodmFsdWUpO1xuXG52YXIgaXNVbmRlZmluZWQgPSAodmFsKSA9PiB2YWwgPT09IHVuZGVmaW5lZDtcblxudmFyIGNvbXBhY3QgPSAodmFsdWUpID0+IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuZmlsdGVyKEJvb2xlYW4pIDogW107XG5cbnZhciBzdHJpbmdUb1BhdGggPSAoaW5wdXQpID0+IGNvbXBhY3QoaW5wdXQucmVwbGFjZSgvW1wifCddfFxcXS9nLCAnJykuc3BsaXQoL1xcLnxcXFsvKSk7XG5cbnZhciBnZXQgPSAob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgICBpZiAoIXBhdGggfHwgIWlzT2JqZWN0KG9iamVjdCkpIHtcbiAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gKGlzS2V5KHBhdGgpID8gW3BhdGhdIDogc3RyaW5nVG9QYXRoKHBhdGgpKS5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiBpc051bGxPclVuZGVmaW5lZChyZXN1bHQpID8gcmVzdWx0IDogcmVzdWx0W2tleV0sIG9iamVjdCk7XG4gICAgcmV0dXJuIGlzVW5kZWZpbmVkKHJlc3VsdCkgfHwgcmVzdWx0ID09PSBvYmplY3RcbiAgICAgICAgPyBpc1VuZGVmaW5lZChvYmplY3RbcGF0aF0pXG4gICAgICAgICAgICA/IGRlZmF1bHRWYWx1ZVxuICAgICAgICAgICAgOiBvYmplY3RbcGF0aF1cbiAgICAgICAgOiByZXN1bHQ7XG59O1xuXG52YXIgaXNCb29sZWFuID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdib29sZWFuJztcblxudmFyIHNldCA9IChvYmplY3QsIHBhdGgsIHZhbHVlKSA9PiB7XG4gICAgbGV0IGluZGV4ID0gLTE7XG4gICAgY29uc3QgdGVtcFBhdGggPSBpc0tleShwYXRoKSA/IFtwYXRoXSA6IHN0cmluZ1RvUGF0aChwYXRoKTtcbiAgICBjb25zdCBsZW5ndGggPSB0ZW1wUGF0aC5sZW5ndGg7XG4gICAgY29uc3QgbGFzdEluZGV4ID0gbGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBjb25zdCBrZXkgPSB0ZW1wUGF0aFtpbmRleF07XG4gICAgICAgIGxldCBuZXdWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBpZiAoaW5kZXggIT09IGxhc3RJbmRleCkge1xuICAgICAgICAgICAgY29uc3Qgb2JqVmFsdWUgPSBvYmplY3Rba2V5XTtcbiAgICAgICAgICAgIG5ld1ZhbHVlID1cbiAgICAgICAgICAgICAgICBpc09iamVjdChvYmpWYWx1ZSkgfHwgQXJyYXkuaXNBcnJheShvYmpWYWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyBvYmpWYWx1ZVxuICAgICAgICAgICAgICAgICAgICA6ICFpc05hTigrdGVtcFBhdGhbaW5kZXggKyAxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gW11cbiAgICAgICAgICAgICAgICAgICAgICAgIDoge307XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSA9PT0gJ19fcHJvdG9fXycgfHwga2V5ID09PSAnY29uc3RydWN0b3InIHx8IGtleSA9PT0gJ3Byb3RvdHlwZScpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBvYmplY3Rba2V5XSA9IG5ld1ZhbHVlO1xuICAgICAgICBvYmplY3QgPSBvYmplY3Rba2V5XTtcbiAgICB9XG59O1xuXG5jb25zdCBFVkVOVFMgPSB7XG4gICAgQkxVUjogJ2JsdXInLFxuICAgIEZPQ1VTX09VVDogJ2ZvY3Vzb3V0JyxcbiAgICBDSEFOR0U6ICdjaGFuZ2UnLFxufTtcbmNvbnN0IFZBTElEQVRJT05fTU9ERSA9IHtcbiAgICBvbkJsdXI6ICdvbkJsdXInLFxuICAgIG9uQ2hhbmdlOiAnb25DaGFuZ2UnLFxuICAgIG9uU3VibWl0OiAnb25TdWJtaXQnLFxuICAgIG9uVG91Y2hlZDogJ29uVG91Y2hlZCcsXG4gICAgYWxsOiAnYWxsJyxcbn07XG5jb25zdCBJTlBVVF9WQUxJREFUSU9OX1JVTEVTID0ge1xuICAgIG1heDogJ21heCcsXG4gICAgbWluOiAnbWluJyxcbiAgICBtYXhMZW5ndGg6ICdtYXhMZW5ndGgnLFxuICAgIG1pbkxlbmd0aDogJ21pbkxlbmd0aCcsXG4gICAgcGF0dGVybjogJ3BhdHRlcm4nLFxuICAgIHJlcXVpcmVkOiAncmVxdWlyZWQnLFxuICAgIHZhbGlkYXRlOiAndmFsaWRhdGUnLFxufTtcblxuY29uc3QgSG9va0Zvcm1Db250ZXh0ID0gUmVhY3RfX2RlZmF1bHQuY3JlYXRlQ29udGV4dChudWxsKTtcbkhvb2tGb3JtQ29udGV4dC5kaXNwbGF5TmFtZSA9ICdIb29rRm9ybUNvbnRleHQnO1xuLyoqXG4gKiBUaGlzIGN1c3RvbSBob29rIGFsbG93cyB5b3UgdG8gYWNjZXNzIHRoZSBmb3JtIGNvbnRleHQuIHVzZUZvcm1Db250ZXh0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gZGVlcGx5IG5lc3RlZCBzdHJ1Y3R1cmVzLCB3aGVyZSBpdCB3b3VsZCBiZWNvbWUgaW5jb252ZW5pZW50IHRvIHBhc3MgdGhlIGNvbnRleHQgYXMgYSBwcm9wLiBUbyBiZSB1c2VkIHdpdGgge0BsaW5rIEZvcm1Qcm92aWRlcn0uXG4gKlxuICogQHJlbWFya3NcbiAqIFtBUEldKGh0dHBzOi8vcmVhY3QtaG9vay1mb3JtLmNvbS9kb2NzL3VzZWZvcm1jb250ZXh0KSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy9yZWFjdC1ob29rLWZvcm0tdjctZm9ybS1jb250ZXh0LXl0dWRpKVxuICpcbiAqIEByZXR1cm5zIHJldHVybiBhbGwgdXNlRm9ybSBtZXRob2RzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQXBwKCkge1xuICogICBjb25zdCBtZXRob2RzID0gdXNlRm9ybSgpO1xuICogICBjb25zdCBvblN1Ym1pdCA9IGRhdGEgPT4gY29uc29sZS5sb2coZGF0YSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxGb3JtUHJvdmlkZXIgey4uLm1ldGhvZHN9ID5cbiAqICAgICAgIDxmb3JtIG9uU3VibWl0PXttZXRob2RzLmhhbmRsZVN1Ym1pdChvblN1Ym1pdCl9PlxuICogICAgICAgICA8TmVzdGVkSW5wdXQgLz5cbiAqICAgICAgICAgPGlucHV0IHR5cGU9XCJzdWJtaXRcIiAvPlxuICogICAgICAgPC9mb3JtPlxuICogICAgIDwvRm9ybVByb3ZpZGVyPlxuICogICApO1xuICogfVxuICpcbiAqICBmdW5jdGlvbiBOZXN0ZWRJbnB1dCgpIHtcbiAqICAgY29uc3QgeyByZWdpc3RlciB9ID0gdXNlRm9ybUNvbnRleHQoKTsgLy8gcmV0cmlldmUgYWxsIGhvb2sgbWV0aG9kc1xuICogICByZXR1cm4gPGlucHV0IHsuLi5yZWdpc3RlcihcInRlc3RcIil9IC8+O1xuICogfVxuICogYGBgXG4gKi9cbmNvbnN0IHVzZUZvcm1Db250ZXh0ID0gKCkgPT4gUmVhY3RfX2RlZmF1bHQudXNlQ29udGV4dChIb29rRm9ybUNvbnRleHQpO1xuLyoqXG4gKiBBIHByb3ZpZGVyIGNvbXBvbmVudCB0aGF0IHByb3BhZ2F0ZXMgdGhlIGB1c2VGb3JtYCBtZXRob2RzIHRvIGFsbCBjaGlsZHJlbiBjb21wb25lbnRzIHZpYSBbUmVhY3QgQ29udGV4dF0oaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2NvbnRleHQuaHRtbCkgQVBJLiBUbyBiZSB1c2VkIHdpdGgge0BsaW5rIHVzZUZvcm1Db250ZXh0fS5cbiAqXG4gKiBAcmVtYXJrc1xuICogW0FQSV0oaHR0cHM6Ly9yZWFjdC1ob29rLWZvcm0uY29tL2RvY3MvdXNlZm9ybWNvbnRleHQpIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3JlYWN0LWhvb2stZm9ybS12Ny1mb3JtLWNvbnRleHQteXR1ZGkpXG4gKlxuICogQHBhcmFtIHByb3BzIC0gYWxsIHVzZUZvcm0gbWV0aG9kc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFwcCgpIHtcbiAqICAgY29uc3QgbWV0aG9kcyA9IHVzZUZvcm0oKTtcbiAqICAgY29uc3Qgb25TdWJtaXQgPSBkYXRhID0+IGNvbnNvbGUubG9nKGRhdGEpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8Rm9ybVByb3ZpZGVyIHsuLi5tZXRob2RzfSA+XG4gKiAgICAgICA8Zm9ybSBvblN1Ym1pdD17bWV0aG9kcy5oYW5kbGVTdWJtaXQob25TdWJtaXQpfT5cbiAqICAgICAgICAgPE5lc3RlZElucHV0IC8+XG4gKiAgICAgICAgIDxpbnB1dCB0eXBlPVwic3VibWl0XCIgLz5cbiAqICAgICAgIDwvZm9ybT5cbiAqICAgICA8L0Zvcm1Qcm92aWRlcj5cbiAqICAgKTtcbiAqIH1cbiAqXG4gKiAgZnVuY3Rpb24gTmVzdGVkSW5wdXQoKSB7XG4gKiAgIGNvbnN0IHsgcmVnaXN0ZXIgfSA9IHVzZUZvcm1Db250ZXh0KCk7IC8vIHJldHJpZXZlIGFsbCBob29rIG1ldGhvZHNcbiAqICAgcmV0dXJuIDxpbnB1dCB7Li4ucmVnaXN0ZXIoXCJ0ZXN0XCIpfSAvPjtcbiAqIH1cbiAqIGBgYFxuICovXG5jb25zdCBGb3JtUHJvdmlkZXIgPSAocHJvcHMpID0+IHtcbiAgICBjb25zdCB7IGNoaWxkcmVuLCAuLi5kYXRhIH0gPSBwcm9wcztcbiAgICByZXR1cm4gKFJlYWN0X19kZWZhdWx0LmNyZWF0ZUVsZW1lbnQoSG9va0Zvcm1Db250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBkYXRhIH0sIGNoaWxkcmVuKSk7XG59O1xuXG52YXIgZ2V0UHJveHlGb3JtU3RhdGUgPSAoZm9ybVN0YXRlLCBjb250cm9sLCBsb2NhbFByb3h5Rm9ybVN0YXRlLCBpc1Jvb3QgPSB0cnVlKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICBkZWZhdWx0VmFsdWVzOiBjb250cm9sLl9kZWZhdWx0VmFsdWVzLFxuICAgIH07XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZm9ybVN0YXRlKSB7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXN1bHQsIGtleSwge1xuICAgICAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2tleSA9IGtleTtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbC5fcHJveHlGb3JtU3RhdGVbX2tleV0gIT09IFZBTElEQVRJT05fTU9ERS5hbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udHJvbC5fcHJveHlGb3JtU3RhdGVbX2tleV0gPSAhaXNSb290IHx8IFZBTElEQVRJT05fTU9ERS5hbGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvY2FsUHJveHlGb3JtU3RhdGUgJiYgKGxvY2FsUHJveHlGb3JtU3RhdGVbX2tleV0gPSB0cnVlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybVN0YXRlW19rZXldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyBSZWFjdC51c2VMYXlvdXRFZmZlY3QgOiBSZWFjdC51c2VFZmZlY3Q7XG5cbi8qKlxuICogVGhpcyBjdXN0b20gaG9vayBhbGxvd3MgeW91IHRvIHN1YnNjcmliZSB0byBlYWNoIGZvcm0gc3RhdGUsIGFuZCBpc29sYXRlIHRoZSByZS1yZW5kZXIgYXQgdGhlIGN1c3RvbSBob29rIGxldmVsLiBJdCBoYXMgaXRzIHNjb3BlIGluIHRlcm1zIG9mIGZvcm0gc3RhdGUgc3Vic2NyaXB0aW9uLCBzbyBpdCB3b3VsZCBub3QgYWZmZWN0IG90aGVyIHVzZUZvcm1TdGF0ZSBhbmQgdXNlRm9ybS4gVXNpbmcgdGhpcyBob29rIGNhbiByZWR1Y2UgdGhlIHJlLXJlbmRlciBpbXBhY3Qgb24gbGFyZ2UgYW5kIGNvbXBsZXggZm9ybSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBAcmVtYXJrc1xuICogW0FQSV0oaHR0cHM6Ly9yZWFjdC1ob29rLWZvcm0uY29tL2RvY3MvdXNlZm9ybXN0YXRlKSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy91c2Vmb3Jtc3RhdGUtNzV4bHkpXG4gKlxuICogQHBhcmFtIHByb3BzIC0gaW5jbHVkZSBvcHRpb25zIG9uIHNwZWNpZnkgZmllbGRzIHRvIHN1YnNjcmliZS4ge0BsaW5rIFVzZUZvcm1TdGF0ZVJldHVybn1cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBBcHAoKSB7XG4gKiAgIGNvbnN0IHsgcmVnaXN0ZXIsIGhhbmRsZVN1Ym1pdCwgY29udHJvbCB9ID0gdXNlRm9ybSh7XG4gKiAgICAgZGVmYXVsdFZhbHVlczoge1xuICogICAgIGZpcnN0TmFtZTogXCJmaXJzdE5hbWVcIlxuICogICB9fSk7XG4gKiAgIGNvbnN0IHsgZGlydHlGaWVsZHMgfSA9IHVzZUZvcm1TdGF0ZSh7XG4gKiAgICAgY29udHJvbFxuICogICB9KTtcbiAqICAgY29uc3Qgb25TdWJtaXQgPSAoZGF0YSkgPT4gY29uc29sZS5sb2coZGF0YSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVTdWJtaXQob25TdWJtaXQpfT5cbiAqICAgICAgIDxpbnB1dCB7Li4ucmVnaXN0ZXIoXCJmaXJzdE5hbWVcIil9IHBsYWNlaG9sZGVyPVwiRmlyc3QgTmFtZVwiIC8+XG4gKiAgICAgICB7ZGlydHlGaWVsZHMuZmlyc3ROYW1lICYmIDxwPkZpZWxkIGlzIGRpcnR5LjwvcD59XG4gKiAgICAgICA8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIC8+XG4gKiAgICAgPC9mb3JtPlxuICogICApO1xuICogfVxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIHVzZUZvcm1TdGF0ZShwcm9wcykge1xuICAgIGNvbnN0IG1ldGhvZHMgPSB1c2VGb3JtQ29udGV4dCgpO1xuICAgIGNvbnN0IHsgY29udHJvbCA9IG1ldGhvZHMuY29udHJvbCwgZGlzYWJsZWQsIG5hbWUsIGV4YWN0IH0gPSBwcm9wcyB8fCB7fTtcbiAgICBjb25zdCBbZm9ybVN0YXRlLCB1cGRhdGVGb3JtU3RhdGVdID0gUmVhY3RfX2RlZmF1bHQudXNlU3RhdGUoY29udHJvbC5fZm9ybVN0YXRlKTtcbiAgICBjb25zdCBfbG9jYWxQcm94eUZvcm1TdGF0ZSA9IFJlYWN0X19kZWZhdWx0LnVzZVJlZih7XG4gICAgICAgIGlzRGlydHk6IGZhbHNlLFxuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBkaXJ0eUZpZWxkczogZmFsc2UsXG4gICAgICAgIHRvdWNoZWRGaWVsZHM6IGZhbHNlLFxuICAgICAgICB2YWxpZGF0aW5nRmllbGRzOiBmYWxzZSxcbiAgICAgICAgaXNWYWxpZGF0aW5nOiBmYWxzZSxcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yczogZmFsc2UsXG4gICAgfSk7XG4gICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiBjb250cm9sLl9zdWJzY3JpYmUoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBmb3JtU3RhdGU6IF9sb2NhbFByb3h5Rm9ybVN0YXRlLmN1cnJlbnQsXG4gICAgICAgIGV4YWN0LFxuICAgICAgICBjYWxsYmFjazogKGZvcm1TdGF0ZSkgPT4ge1xuICAgICAgICAgICAgIWRpc2FibGVkICYmXG4gICAgICAgICAgICAgICAgdXBkYXRlRm9ybVN0YXRlKHtcbiAgICAgICAgICAgICAgICAgICAgLi4uY29udHJvbC5fZm9ybVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAuLi5mb3JtU3RhdGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgfSksIFtuYW1lLCBkaXNhYmxlZCwgZXhhY3RdKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBfbG9jYWxQcm94eUZvcm1TdGF0ZS5jdXJyZW50LmlzVmFsaWQgJiYgY29udHJvbC5fc2V0VmFsaWQodHJ1ZSk7XG4gICAgfSwgW2NvbnRyb2xdKTtcbiAgICByZXR1cm4gUmVhY3RfX2RlZmF1bHQudXNlTWVtbygoKSA9PiBnZXRQcm94eUZvcm1TdGF0ZShmb3JtU3RhdGUsIGNvbnRyb2wsIF9sb2NhbFByb3h5Rm9ybVN0YXRlLmN1cnJlbnQsIGZhbHNlKSwgW2Zvcm1TdGF0ZSwgY29udHJvbF0pO1xufVxuXG52YXIgaXNTdHJpbmcgPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG5cbnZhciBnZW5lcmF0ZVdhdGNoT3V0cHV0ID0gKG5hbWVzLCBfbmFtZXMsIGZvcm1WYWx1ZXMsIGlzR2xvYmFsLCBkZWZhdWx0VmFsdWUpID0+IHtcbiAgICBpZiAoaXNTdHJpbmcobmFtZXMpKSB7XG4gICAgICAgIGlzR2xvYmFsICYmIF9uYW1lcy53YXRjaC5hZGQobmFtZXMpO1xuICAgICAgICByZXR1cm4gZ2V0KGZvcm1WYWx1ZXMsIG5hbWVzLCBkZWZhdWx0VmFsdWUpO1xuICAgIH1cbiAgICBpZiAoQXJyYXkuaXNBcnJheShuYW1lcykpIHtcbiAgICAgICAgcmV0dXJuIG5hbWVzLm1hcCgoZmllbGROYW1lKSA9PiAoaXNHbG9iYWwgJiYgX25hbWVzLndhdGNoLmFkZChmaWVsZE5hbWUpLFxuICAgICAgICAgICAgZ2V0KGZvcm1WYWx1ZXMsIGZpZWxkTmFtZSkpKTtcbiAgICB9XG4gICAgaXNHbG9iYWwgJiYgKF9uYW1lcy53YXRjaEFsbCA9IHRydWUpO1xuICAgIHJldHVybiBmb3JtVmFsdWVzO1xufTtcblxuLyoqXG4gKiBDdXN0b20gaG9vayB0byBzdWJzY3JpYmUgdG8gZmllbGQgY2hhbmdlIGFuZCBpc29sYXRlIHJlLXJlbmRlcmluZyBhdCB0aGUgY29tcG9uZW50IGxldmVsLlxuICpcbiAqIEByZW1hcmtzXG4gKlxuICogW0FQSV0oaHR0cHM6Ly9yZWFjdC1ob29rLWZvcm0uY29tL2RvY3MvdXNld2F0Y2gpIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3JlYWN0LWhvb2stZm9ybS12Ny10cy11c2V3YXRjaC1oOWk1ZSlcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBjb25zdCB7IGNvbnRyb2wgfSA9IHVzZUZvcm0oKTtcbiAqIGNvbnN0IHZhbHVlcyA9IHVzZVdhdGNoKHtcbiAqICAgbmFtZTogXCJmaWVsZE5hbWVcIlxuICogICBjb250cm9sLFxuICogfSlcbiAqIGBgYFxuICovXG5mdW5jdGlvbiB1c2VXYXRjaChwcm9wcykge1xuICAgIGNvbnN0IG1ldGhvZHMgPSB1c2VGb3JtQ29udGV4dCgpO1xuICAgIGNvbnN0IHsgY29udHJvbCA9IG1ldGhvZHMuY29udHJvbCwgbmFtZSwgZGVmYXVsdFZhbHVlLCBkaXNhYmxlZCwgZXhhY3QsIH0gPSBwcm9wcyB8fCB7fTtcbiAgICBjb25zdCBfZGVmYXVsdFZhbHVlID0gUmVhY3RfX2RlZmF1bHQudXNlUmVmKGRlZmF1bHRWYWx1ZSk7XG4gICAgY29uc3QgW3ZhbHVlLCB1cGRhdGVWYWx1ZV0gPSBSZWFjdF9fZGVmYXVsdC51c2VTdGF0ZShjb250cm9sLl9nZXRXYXRjaChuYW1lLCBfZGVmYXVsdFZhbHVlLmN1cnJlbnQpKTtcbiAgICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IGNvbnRyb2wuX3N1YnNjcmliZSh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGZvcm1TdGF0ZToge1xuICAgICAgICAgICAgdmFsdWVzOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBleGFjdCxcbiAgICAgICAgY2FsbGJhY2s6IChmb3JtU3RhdGUpID0+ICFkaXNhYmxlZCAmJlxuICAgICAgICAgICAgdXBkYXRlVmFsdWUoZ2VuZXJhdGVXYXRjaE91dHB1dChuYW1lLCBjb250cm9sLl9uYW1lcywgZm9ybVN0YXRlLnZhbHVlcyB8fCBjb250cm9sLl9mb3JtVmFsdWVzLCBmYWxzZSwgX2RlZmF1bHRWYWx1ZS5jdXJyZW50KSksXG4gICAgfSksIFtuYW1lLCBjb250cm9sLCBkaXNhYmxlZCwgZXhhY3RdKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4gY29udHJvbC5fcmVtb3ZlVW5tb3VudGVkKCkpO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBDdXN0b20gaG9vayB0byB3b3JrIHdpdGggY29udHJvbGxlZCBjb21wb25lbnQsIHRoaXMgZnVuY3Rpb24gcHJvdmlkZSB5b3Ugd2l0aCBib3RoIGZvcm0gYW5kIGZpZWxkIGxldmVsIHN0YXRlLiBSZS1yZW5kZXIgaXMgaXNvbGF0ZWQgYXQgdGhlIGhvb2sgbGV2ZWwuXG4gKlxuICogQHJlbWFya3NcbiAqIFtBUEldKGh0dHBzOi8vcmVhY3QtaG9vay1mb3JtLmNvbS9kb2NzL3VzZWNvbnRyb2xsZXIpIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3VzZWNvbnRyb2xsZXItMG84cHgpXG4gKlxuICogQHBhcmFtIHByb3BzIC0gdGhlIHBhdGggbmFtZSB0byB0aGUgZm9ybSBmaWVsZCB2YWx1ZSwgYW5kIHZhbGlkYXRpb24gcnVsZXMuXG4gKlxuICogQHJldHVybnMgZmllbGQgcHJvcGVydGllcywgZmllbGQgYW5kIGZvcm0gc3RhdGUuIHtAbGluayBVc2VDb250cm9sbGVyUmV0dXJufVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIElucHV0KHByb3BzKSB7XG4gKiAgIGNvbnN0IHsgZmllbGQsIGZpZWxkU3RhdGUsIGZvcm1TdGF0ZSB9ID0gdXNlQ29udHJvbGxlcihwcm9wcyk7XG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGRpdj5cbiAqICAgICAgIDxpbnB1dCB7Li4uZmllbGR9IHBsYWNlaG9sZGVyPXtwcm9wcy5uYW1lfSAvPlxuICogICAgICAgPHA+e2ZpZWxkU3RhdGUuaXNUb3VjaGVkICYmIFwiVG91Y2hlZFwifTwvcD5cbiAqICAgICAgIDxwPntmb3JtU3RhdGUuaXNTdWJtaXR0ZWQgPyBcInN1Ym1pdHRlZFwiIDogXCJcIn08L3A+XG4gKiAgICAgPC9kaXY+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gdXNlQ29udHJvbGxlcihwcm9wcykge1xuICAgIGNvbnN0IG1ldGhvZHMgPSB1c2VGb3JtQ29udGV4dCgpO1xuICAgIGNvbnN0IHsgbmFtZSwgZGlzYWJsZWQsIGNvbnRyb2wgPSBtZXRob2RzLmNvbnRyb2wsIHNob3VsZFVucmVnaXN0ZXIgfSA9IHByb3BzO1xuICAgIGNvbnN0IGlzQXJyYXlGaWVsZCA9IGlzTmFtZUluRmllbGRBcnJheShjb250cm9sLl9uYW1lcy5hcnJheSwgbmFtZSk7XG4gICAgY29uc3QgdmFsdWUgPSB1c2VXYXRjaCh7XG4gICAgICAgIGNvbnRyb2wsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZTogZ2V0KGNvbnRyb2wuX2Zvcm1WYWx1ZXMsIG5hbWUsIGdldChjb250cm9sLl9kZWZhdWx0VmFsdWVzLCBuYW1lLCBwcm9wcy5kZWZhdWx0VmFsdWUpKSxcbiAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgZm9ybVN0YXRlID0gdXNlRm9ybVN0YXRlKHtcbiAgICAgICAgY29udHJvbCxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZXhhY3Q6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgX3Byb3BzID0gUmVhY3RfX2RlZmF1bHQudXNlUmVmKHByb3BzKTtcbiAgICBjb25zdCBfcmVnaXN0ZXJQcm9wcyA9IFJlYWN0X19kZWZhdWx0LnVzZVJlZihjb250cm9sLnJlZ2lzdGVyKG5hbWUsIHtcbiAgICAgICAgLi4ucHJvcHMucnVsZXMsXG4gICAgICAgIHZhbHVlLFxuICAgICAgICAuLi4oaXNCb29sZWFuKHByb3BzLmRpc2FibGVkKSA/IHsgZGlzYWJsZWQ6IHByb3BzLmRpc2FibGVkIH0gOiB7fSksXG4gICAgfSkpO1xuICAgIGNvbnN0IGZpZWxkU3RhdGUgPSBSZWFjdF9fZGVmYXVsdC51c2VNZW1vKCgpID0+IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHt9LCB7XG4gICAgICAgIGludmFsaWQ6IHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6ICgpID0+ICEhZ2V0KGZvcm1TdGF0ZS5lcnJvcnMsIG5hbWUpLFxuICAgICAgICB9LFxuICAgICAgICBpc0RpcnR5OiB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiAoKSA9PiAhIWdldChmb3JtU3RhdGUuZGlydHlGaWVsZHMsIG5hbWUpLFxuICAgICAgICB9LFxuICAgICAgICBpc1RvdWNoZWQ6IHtcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6ICgpID0+ICEhZ2V0KGZvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKSxcbiAgICAgICAgfSxcbiAgICAgICAgaXNWYWxpZGF0aW5nOiB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiAoKSA9PiAhIWdldChmb3JtU3RhdGUudmFsaWRhdGluZ0ZpZWxkcywgbmFtZSksXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiAoKSA9PiBnZXQoZm9ybVN0YXRlLmVycm9ycywgbmFtZSksXG4gICAgICAgIH0sXG4gICAgfSksIFtmb3JtU3RhdGUsIG5hbWVdKTtcbiAgICBjb25zdCBvbkNoYW5nZSA9IFJlYWN0X19kZWZhdWx0LnVzZUNhbGxiYWNrKChldmVudCkgPT4gX3JlZ2lzdGVyUHJvcHMuY3VycmVudC5vbkNoYW5nZSh7XG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgdmFsdWU6IGdldEV2ZW50VmFsdWUoZXZlbnQpLFxuICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgfSxcbiAgICAgICAgdHlwZTogRVZFTlRTLkNIQU5HRSxcbiAgICB9KSwgW25hbWVdKTtcbiAgICBjb25zdCBvbkJsdXIgPSBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjaygoKSA9PiBfcmVnaXN0ZXJQcm9wcy5jdXJyZW50Lm9uQmx1cih7XG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgdmFsdWU6IGdldChjb250cm9sLl9mb3JtVmFsdWVzLCBuYW1lKSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IEVWRU5UUy5CTFVSLFxuICAgIH0pLCBbbmFtZSwgY29udHJvbC5fZm9ybVZhbHVlc10pO1xuICAgIGNvbnN0IHJlZiA9IFJlYWN0X19kZWZhdWx0LnVzZUNhbGxiYWNrKChlbG0pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoY29udHJvbC5fZmllbGRzLCBuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkICYmIGVsbSkge1xuICAgICAgICAgICAgZmllbGQuX2YucmVmID0ge1xuICAgICAgICAgICAgICAgIGZvY3VzOiAoKSA9PiBlbG0uZm9jdXMgJiYgZWxtLmZvY3VzKCksXG4gICAgICAgICAgICAgICAgc2VsZWN0OiAoKSA9PiBlbG0uc2VsZWN0ICYmIGVsbS5zZWxlY3QoKSxcbiAgICAgICAgICAgICAgICBzZXRDdXN0b21WYWxpZGl0eTogKG1lc3NhZ2UpID0+IGVsbS5zZXRDdXN0b21WYWxpZGl0eShtZXNzYWdlKSxcbiAgICAgICAgICAgICAgICByZXBvcnRWYWxpZGl0eTogKCkgPT4gZWxtLnJlcG9ydFZhbGlkaXR5KCksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSwgW2NvbnRyb2wuX2ZpZWxkcywgbmFtZV0pO1xuICAgIGNvbnN0IGZpZWxkID0gUmVhY3RfX2RlZmF1bHQudXNlTWVtbygoKSA9PiAoe1xuICAgICAgICBuYW1lLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgLi4uKGlzQm9vbGVhbihkaXNhYmxlZCkgfHwgZm9ybVN0YXRlLmRpc2FibGVkXG4gICAgICAgICAgICA/IHsgZGlzYWJsZWQ6IGZvcm1TdGF0ZS5kaXNhYmxlZCB8fCBkaXNhYmxlZCB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgb25DaGFuZ2UsXG4gICAgICAgIG9uQmx1cixcbiAgICAgICAgcmVmLFxuICAgIH0pLCBbbmFtZSwgZGlzYWJsZWQsIGZvcm1TdGF0ZS5kaXNhYmxlZCwgb25DaGFuZ2UsIG9uQmx1ciwgcmVmLCB2YWx1ZV0pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IF9zaG91bGRVbnJlZ2lzdGVyRmllbGQgPSBjb250cm9sLl9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXIgfHwgc2hvdWxkVW5yZWdpc3RlcjtcbiAgICAgICAgY29udHJvbC5yZWdpc3RlcihuYW1lLCB7XG4gICAgICAgICAgICAuLi5fcHJvcHMuY3VycmVudC5ydWxlcyxcbiAgICAgICAgICAgIC4uLihpc0Jvb2xlYW4oX3Byb3BzLmN1cnJlbnQuZGlzYWJsZWQpXG4gICAgICAgICAgICAgICAgPyB7IGRpc2FibGVkOiBfcHJvcHMuY3VycmVudC5kaXNhYmxlZCB9XG4gICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB1cGRhdGVNb3VudGVkID0gKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldChjb250cm9sLl9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLl9mKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuX2YubW91bnQgPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdXBkYXRlTW91bnRlZChuYW1lLCB0cnVlKTtcbiAgICAgICAgaWYgKF9zaG91bGRVbnJlZ2lzdGVyRmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY2xvbmVPYmplY3QoZ2V0KGNvbnRyb2wuX29wdGlvbnMuZGVmYXVsdFZhbHVlcywgbmFtZSkpO1xuICAgICAgICAgICAgc2V0KGNvbnRyb2wuX2RlZmF1bHRWYWx1ZXMsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChnZXQoY29udHJvbC5fZm9ybVZhbHVlcywgbmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgc2V0KGNvbnRyb2wuX2Zvcm1WYWx1ZXMsIG5hbWUsIHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAhaXNBcnJheUZpZWxkICYmIGNvbnRyb2wucmVnaXN0ZXIobmFtZSk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAoaXNBcnJheUZpZWxkXG4gICAgICAgICAgICAgICAgPyBfc2hvdWxkVW5yZWdpc3RlckZpZWxkICYmICFjb250cm9sLl9zdGF0ZS5hY3Rpb25cbiAgICAgICAgICAgICAgICA6IF9zaG91bGRVbnJlZ2lzdGVyRmllbGQpXG4gICAgICAgICAgICAgICAgPyBjb250cm9sLnVucmVnaXN0ZXIobmFtZSlcbiAgICAgICAgICAgICAgICA6IHVwZGF0ZU1vdW50ZWQobmFtZSwgZmFsc2UpO1xuICAgICAgICB9O1xuICAgIH0sIFtuYW1lLCBjb250cm9sLCBpc0FycmF5RmllbGQsIHNob3VsZFVucmVnaXN0ZXJdKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb250cm9sLl9zZXREaXNhYmxlZEZpZWxkKHtcbiAgICAgICAgICAgIGRpc2FibGVkLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgfSk7XG4gICAgfSwgW2Rpc2FibGVkLCBuYW1lLCBjb250cm9sXSk7XG4gICAgcmV0dXJuIFJlYWN0X19kZWZhdWx0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAgICAgZmllbGQsXG4gICAgICAgIGZvcm1TdGF0ZSxcbiAgICAgICAgZmllbGRTdGF0ZSxcbiAgICB9KSwgW2ZpZWxkLCBmb3JtU3RhdGUsIGZpZWxkU3RhdGVdKTtcbn1cblxuLyoqXG4gKiBDb21wb25lbnQgYmFzZWQgb24gYHVzZUNvbnRyb2xsZXJgIGhvb2sgdG8gd29yayB3aXRoIGNvbnRyb2xsZWQgY29tcG9uZW50LlxuICpcbiAqIEByZW1hcmtzXG4gKiBbQVBJXShodHRwczovL3JlYWN0LWhvb2stZm9ybS5jb20vZG9jcy91c2Vjb250cm9sbGVyL2NvbnRyb2xsZXIpIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3JlYWN0LWhvb2stZm9ybS12Ni1jb250cm9sbGVyLXRzLWp3eXp3KSDigKIgW1ZpZGVvXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PU4yVU5rX1VDVnlBKVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIHRoZSBwYXRoIG5hbWUgdG8gdGhlIGZvcm0gZmllbGQgdmFsdWUsIGFuZCB2YWxpZGF0aW9uIHJ1bGVzLlxuICpcbiAqIEByZXR1cm5zIHByb3ZpZGUgZmllbGQgaGFuZGxlciBmdW5jdGlvbnMsIGZpZWxkIGFuZCBmb3JtIHN0YXRlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFwcCgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtPEZvcm1WYWx1ZXM+KHtcbiAqICAgICBkZWZhdWx0VmFsdWVzOiB7XG4gKiAgICAgICB0ZXN0OiBcIlwiXG4gKiAgICAgfVxuICogICB9KTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGZvcm0+XG4gKiAgICAgICA8Q29udHJvbGxlclxuICogICAgICAgICBjb250cm9sPXtjb250cm9sfVxuICogICAgICAgICBuYW1lPVwidGVzdFwiXG4gKiAgICAgICAgIHJlbmRlcj17KHsgZmllbGQ6IHsgb25DaGFuZ2UsIG9uQmx1ciwgdmFsdWUsIHJlZiB9LCBmb3JtU3RhdGUsIGZpZWxkU3RhdGUgfSkgPT4gKFxuICogICAgICAgICAgIDw+XG4gKiAgICAgICAgICAgICA8aW5wdXRcbiAqICAgICAgICAgICAgICAgb25DaGFuZ2U9e29uQ2hhbmdlfSAvLyBzZW5kIHZhbHVlIHRvIGhvb2sgZm9ybVxuICogICAgICAgICAgICAgICBvbkJsdXI9e29uQmx1cn0gLy8gbm90aWZ5IHdoZW4gaW5wdXQgaXMgdG91Y2hlZFxuICogICAgICAgICAgICAgICB2YWx1ZT17dmFsdWV9IC8vIHJldHVybiB1cGRhdGVkIHZhbHVlXG4gKiAgICAgICAgICAgICAgIHJlZj17cmVmfSAvLyBzZXQgcmVmIGZvciBmb2N1cyBtYW5hZ2VtZW50XG4gKiAgICAgICAgICAgICAvPlxuICogICAgICAgICAgICAgPHA+e2Zvcm1TdGF0ZS5pc1N1Ym1pdHRlZCA/IFwic3VibWl0dGVkXCIgOiBcIlwifTwvcD5cbiAqICAgICAgICAgICAgIDxwPntmaWVsZFN0YXRlLmlzVG91Y2hlZCA/IFwidG91Y2hlZFwiIDogXCJcIn08L3A+XG4gKiAgICAgICAgICAgPC8+XG4gKiAgICAgICAgICl9XG4gKiAgICAgICAvPlxuICogICAgIDwvZm9ybT5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICovXG5jb25zdCBDb250cm9sbGVyID0gKHByb3BzKSA9PiBwcm9wcy5yZW5kZXIodXNlQ29udHJvbGxlcihwcm9wcykpO1xuXG5jb25zdCBmbGF0dGVuID0gKG9iaikgPT4ge1xuICAgIGNvbnN0IG91dHB1dCA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iaikpIHtcbiAgICAgICAgaWYgKGlzT2JqZWN0VHlwZShvYmpba2V5XSkgJiYgb2JqW2tleV0gIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IG5lc3RlZCA9IGZsYXR0ZW4ob2JqW2tleV0pO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuZXN0ZWRLZXkgb2YgT2JqZWN0LmtleXMobmVzdGVkKSkge1xuICAgICAgICAgICAgICAgIG91dHB1dFtgJHtrZXl9LiR7bmVzdGVkS2V5fWBdID0gbmVzdGVkW25lc3RlZEtleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvdXRwdXRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG59O1xuXG5jb25zdCBQT1NUX1JFUVVFU1QgPSAncG9zdCc7XG4vKipcbiAqIEZvcm0gY29tcG9uZW50IHRvIG1hbmFnZSBzdWJtaXNzaW9uLlxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIHRvIHNldHVwIHN1Ym1pc3Npb24gZGV0YWlsLiB7QGxpbmsgRm9ybVByb3BzfVxuICpcbiAqIEByZXR1cm5zIGZvcm0gY29tcG9uZW50IG9yIGhlYWRsZXNzIHJlbmRlciBwcm9wLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFwcCgpIHtcbiAqICAgY29uc3QgeyBjb250cm9sLCBmb3JtU3RhdGU6IHsgZXJyb3JzIH0gfSA9IHVzZUZvcm0oKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPEZvcm0gYWN0aW9uPVwiL2FwaVwiIGNvbnRyb2w9e2NvbnRyb2x9PlxuICogICAgICAgPGlucHV0IHsuLi5yZWdpc3RlcihcIm5hbWVcIil9IC8+XG4gKiAgICAgICA8cD57ZXJyb3JzPy5yb290Py5zZXJ2ZXIgJiYgJ1NlcnZlciBlcnJvcid9PC9wPlxuICogICAgICAgPGJ1dHRvbj5TdWJtaXQ8L2J1dHRvbj5cbiAqICAgICA8L0Zvcm0+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gRm9ybShwcm9wcykge1xuICAgIGNvbnN0IG1ldGhvZHMgPSB1c2VGb3JtQ29udGV4dCgpO1xuICAgIGNvbnN0IFttb3VudGVkLCBzZXRNb3VudGVkXSA9IFJlYWN0X19kZWZhdWx0LnVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCB7IGNvbnRyb2wgPSBtZXRob2RzLmNvbnRyb2wsIG9uU3VibWl0LCBjaGlsZHJlbiwgYWN0aW9uLCBtZXRob2QgPSBQT1NUX1JFUVVFU1QsIGhlYWRlcnMsIGVuY1R5cGUsIG9uRXJyb3IsIHJlbmRlciwgb25TdWNjZXNzLCB2YWxpZGF0ZVN0YXR1cywgLi4ucmVzdCB9ID0gcHJvcHM7XG4gICAgY29uc3Qgc3VibWl0ID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgIGxldCBoYXNFcnJvciA9IGZhbHNlO1xuICAgICAgICBsZXQgdHlwZSA9ICcnO1xuICAgICAgICBhd2FpdCBjb250cm9sLmhhbmRsZVN1Ym1pdChhc3luYyAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICAgICAgICAgIGxldCBmb3JtRGF0YUpzb24gPSAnJztcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgZm9ybURhdGFKc29uID0gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoX2EpIHsgfVxuICAgICAgICAgICAgY29uc3QgZmxhdHRlbkZvcm1WYWx1ZXMgPSBmbGF0dGVuKGNvbnRyb2wuX2Zvcm1WYWx1ZXMpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZmxhdHRlbkZvcm1WYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBmbGF0dGVuRm9ybVZhbHVlc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvblN1Ym1pdCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG9uU3VibWl0KHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhSnNvbixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRTdHJpbmdpZnlTdWJtaXNzaW9uRGF0YSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgJiYgaGVhZGVyc1snQ29udGVudC1UeXBlJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmNUeXBlLFxuICAgICAgICAgICAgICAgICAgICBdLnNvbWUoKHZhbHVlKSA9PiB2YWx1ZSAmJiB2YWx1ZS5pbmNsdWRlcygnanNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChTdHJpbmcoYWN0aW9uKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKGVuY1R5cGUgPyB7ICdDb250ZW50LVR5cGUnOiBlbmNUeXBlIH0gOiB7fSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgYm9keTogc2hvdWxkU3RyaW5naWZ5U3VibWlzc2lvbkRhdGEgPyBmb3JtRGF0YUpzb24gOiBmb3JtRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKHZhbGlkYXRlU3RhdHVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAhdmFsaWRhdGVTdGF0dXMocmVzcG9uc2Uuc3RhdHVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogcmVzcG9uc2Uuc3RhdHVzIDwgMjAwIHx8IHJlc3BvbnNlLnN0YXR1cyA+PSAzMDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkVycm9yICYmIG9uRXJyb3IoeyByZXNwb25zZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBTdHJpbmcocmVzcG9uc2Uuc3RhdHVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uU3VjY2VzcyAmJiBvblN1Y2Nlc3MoeyByZXNwb25zZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBvbkVycm9yICYmIG9uRXJyb3IoeyBlcnJvciB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKGV2ZW50KTtcbiAgICAgICAgaWYgKGhhc0Vycm9yICYmIHByb3BzLmNvbnRyb2wpIHtcbiAgICAgICAgICAgIHByb3BzLmNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgIGlzU3VibWl0U3VjY2Vzc2Z1bDogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHByb3BzLmNvbnRyb2wuc2V0RXJyb3IoJ3Jvb3Quc2VydmVyJywge1xuICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgc2V0TW91bnRlZCh0cnVlKTtcbiAgICB9LCBbXSk7XG4gICAgcmV0dXJuIHJlbmRlciA/IChSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFJlYWN0X19kZWZhdWx0LkZyYWdtZW50LCBudWxsLCByZW5kZXIoe1xuICAgICAgICBzdWJtaXQsXG4gICAgfSkpKSA6IChSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiLCB7IG5vVmFsaWRhdGU6IG1vdW50ZWQsIGFjdGlvbjogYWN0aW9uLCBtZXRob2Q6IG1ldGhvZCwgZW5jVHlwZTogZW5jVHlwZSwgb25TdWJtaXQ6IHN1Ym1pdCwgLi4ucmVzdCB9LCBjaGlsZHJlbikpO1xufVxuXG52YXIgYXBwZW5kRXJyb3JzID0gKG5hbWUsIHZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSwgZXJyb3JzLCB0eXBlLCBtZXNzYWdlKSA9PiB2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWFcbiAgICA/IHtcbiAgICAgICAgLi4uZXJyb3JzW25hbWVdLFxuICAgICAgICB0eXBlczoge1xuICAgICAgICAgICAgLi4uKGVycm9yc1tuYW1lXSAmJiBlcnJvcnNbbmFtZV0udHlwZXMgPyBlcnJvcnNbbmFtZV0udHlwZXMgOiB7fSksXG4gICAgICAgICAgICBbdHlwZV06IG1lc3NhZ2UgfHwgdHJ1ZSxcbiAgICAgICAgfSxcbiAgICB9XG4gICAgOiB7fTtcblxudmFyIGNvbnZlcnRUb0FycmF5UGF5bG9hZCA9ICh2YWx1ZSkgPT4gKEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdKTtcblxudmFyIGNyZWF0ZVN1YmplY3QgPSAoKSA9PiB7XG4gICAgbGV0IF9vYnNlcnZlcnMgPSBbXTtcbiAgICBjb25zdCBuZXh0ID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3Qgb2JzZXJ2ZXIgb2YgX29ic2VydmVycykge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCAmJiBvYnNlcnZlci5uZXh0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgc3Vic2NyaWJlID0gKG9ic2VydmVyKSA9PiB7XG4gICAgICAgIF9vYnNlcnZlcnMucHVzaChvYnNlcnZlcik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB1bnN1YnNjcmliZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIF9vYnNlcnZlcnMgPSBfb2JzZXJ2ZXJzLmZpbHRlcigobykgPT4gbyAhPT0gb2JzZXJ2ZXIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gKCkgPT4ge1xuICAgICAgICBfb2JzZXJ2ZXJzID0gW107XG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICBnZXQgb2JzZXJ2ZXJzKCkge1xuICAgICAgICAgICAgcmV0dXJuIF9vYnNlcnZlcnM7XG4gICAgICAgIH0sXG4gICAgICAgIG5leHQsXG4gICAgICAgIHN1YnNjcmliZSxcbiAgICAgICAgdW5zdWJzY3JpYmUsXG4gICAgfTtcbn07XG5cbnZhciBpc1ByaW1pdGl2ZSA9ICh2YWx1ZSkgPT4gaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpIHx8ICFpc09iamVjdFR5cGUodmFsdWUpO1xuXG5mdW5jdGlvbiBkZWVwRXF1YWwob2JqZWN0MSwgb2JqZWN0MiwgX2ludGVybmFsX3Zpc2l0ZWQgPSBuZXcgV2Vha1NldCgpKSB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKG9iamVjdDEpIHx8IGlzUHJpbWl0aXZlKG9iamVjdDIpKSB7XG4gICAgICAgIHJldHVybiBvYmplY3QxID09PSBvYmplY3QyO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlT2JqZWN0KG9iamVjdDEpICYmIGlzRGF0ZU9iamVjdChvYmplY3QyKSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0MS5nZXRUaW1lKCkgPT09IG9iamVjdDIuZ2V0VGltZSgpO1xuICAgIH1cbiAgICBjb25zdCBrZXlzMSA9IE9iamVjdC5rZXlzKG9iamVjdDEpO1xuICAgIGNvbnN0IGtleXMyID0gT2JqZWN0LmtleXMob2JqZWN0Mik7XG4gICAgaWYgKGtleXMxLmxlbmd0aCAhPT0ga2V5czIubGVuZ3RoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKF9pbnRlcm5hbF92aXNpdGVkLmhhcyhvYmplY3QxKSB8fCBfaW50ZXJuYWxfdmlzaXRlZC5oYXMob2JqZWN0MikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIF9pbnRlcm5hbF92aXNpdGVkLmFkZChvYmplY3QxKTtcbiAgICBfaW50ZXJuYWxfdmlzaXRlZC5hZGQob2JqZWN0Mik7XG4gICAgZm9yIChjb25zdCBrZXkgb2Yga2V5czEpIHtcbiAgICAgICAgY29uc3QgdmFsMSA9IG9iamVjdDFba2V5XTtcbiAgICAgICAgaWYgKCFrZXlzMi5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGtleSAhPT0gJ3JlZicpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbDIgPSBvYmplY3QyW2tleV07XG4gICAgICAgICAgICBpZiAoKGlzRGF0ZU9iamVjdCh2YWwxKSAmJiBpc0RhdGVPYmplY3QodmFsMikpIHx8XG4gICAgICAgICAgICAgICAgKGlzT2JqZWN0KHZhbDEpICYmIGlzT2JqZWN0KHZhbDIpKSB8fFxuICAgICAgICAgICAgICAgIChBcnJheS5pc0FycmF5KHZhbDEpICYmIEFycmF5LmlzQXJyYXkodmFsMikpXG4gICAgICAgICAgICAgICAgPyAhZGVlcEVxdWFsKHZhbDEsIHZhbDIsIF9pbnRlcm5hbF92aXNpdGVkKVxuICAgICAgICAgICAgICAgIDogdmFsMSAhPT0gdmFsMikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxudmFyIGlzRW1wdHlPYmplY3QgPSAodmFsdWUpID0+IGlzT2JqZWN0KHZhbHVlKSAmJiAhT2JqZWN0LmtleXModmFsdWUpLmxlbmd0aDtcblxudmFyIGlzRmlsZUlucHV0ID0gKGVsZW1lbnQpID0+IGVsZW1lbnQudHlwZSA9PT0gJ2ZpbGUnO1xuXG52YXIgaXNGdW5jdGlvbiA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nO1xuXG52YXIgaXNIVE1MRWxlbWVudCA9ICh2YWx1ZSkgPT4ge1xuICAgIGlmICghaXNXZWIpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBvd25lciA9IHZhbHVlID8gdmFsdWUub3duZXJEb2N1bWVudCA6IDA7XG4gICAgcmV0dXJuICh2YWx1ZSBpbnN0YW5jZW9mXG4gICAgICAgIChvd25lciAmJiBvd25lci5kZWZhdWx0VmlldyA/IG93bmVyLmRlZmF1bHRWaWV3LkhUTUxFbGVtZW50IDogSFRNTEVsZW1lbnQpKTtcbn07XG5cbnZhciBpc011bHRpcGxlU2VsZWN0ID0gKGVsZW1lbnQpID0+IGVsZW1lbnQudHlwZSA9PT0gYHNlbGVjdC1tdWx0aXBsZWA7XG5cbnZhciBpc1JhZGlvSW5wdXQgPSAoZWxlbWVudCkgPT4gZWxlbWVudC50eXBlID09PSAncmFkaW8nO1xuXG52YXIgaXNSYWRpb09yQ2hlY2tib3ggPSAocmVmKSA9PiBpc1JhZGlvSW5wdXQocmVmKSB8fCBpc0NoZWNrQm94SW5wdXQocmVmKTtcblxudmFyIGxpdmUgPSAocmVmKSA9PiBpc0hUTUxFbGVtZW50KHJlZikgJiYgcmVmLmlzQ29ubmVjdGVkO1xuXG5mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCwgdXBkYXRlUGF0aCkge1xuICAgIGNvbnN0IGxlbmd0aCA9IHVwZGF0ZVBhdGguc2xpY2UoMCwgLTEpLmxlbmd0aDtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIHdoaWxlIChpbmRleCA8IGxlbmd0aCkge1xuICAgICAgICBvYmplY3QgPSBpc1VuZGVmaW5lZChvYmplY3QpID8gaW5kZXgrKyA6IG9iamVjdFt1cGRhdGVQYXRoW2luZGV4KytdXTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdDtcbn1cbmZ1bmN0aW9uIGlzRW1wdHlBcnJheShvYmopIHtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICFpc1VuZGVmaW5lZChvYmpba2V5XSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbmZ1bmN0aW9uIHVuc2V0KG9iamVjdCwgcGF0aCkge1xuICAgIGNvbnN0IHBhdGhzID0gQXJyYXkuaXNBcnJheShwYXRoKVxuICAgICAgICA/IHBhdGhcbiAgICAgICAgOiBpc0tleShwYXRoKVxuICAgICAgICAgICAgPyBbcGF0aF1cbiAgICAgICAgICAgIDogc3RyaW5nVG9QYXRoKHBhdGgpO1xuICAgIGNvbnN0IGNoaWxkT2JqZWN0ID0gcGF0aHMubGVuZ3RoID09PSAxID8gb2JqZWN0IDogYmFzZUdldChvYmplY3QsIHBhdGhzKTtcbiAgICBjb25zdCBpbmRleCA9IHBhdGhzLmxlbmd0aCAtIDE7XG4gICAgY29uc3Qga2V5ID0gcGF0aHNbaW5kZXhdO1xuICAgIGlmIChjaGlsZE9iamVjdCkge1xuICAgICAgICBkZWxldGUgY2hpbGRPYmplY3Rba2V5XTtcbiAgICB9XG4gICAgaWYgKGluZGV4ICE9PSAwICYmXG4gICAgICAgICgoaXNPYmplY3QoY2hpbGRPYmplY3QpICYmIGlzRW1wdHlPYmplY3QoY2hpbGRPYmplY3QpKSB8fFxuICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkoY2hpbGRPYmplY3QpICYmIGlzRW1wdHlBcnJheShjaGlsZE9iamVjdCkpKSkge1xuICAgICAgICB1bnNldChvYmplY3QsIHBhdGhzLnNsaWNlKDAsIC0xKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG59XG5cbnZhciBvYmplY3RIYXNGdW5jdGlvbiA9IChkYXRhKSA9PiB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihkYXRhW2tleV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiBtYXJrRmllbGRzRGlydHkoZGF0YSwgZmllbGRzID0ge30pIHtcbiAgICBjb25zdCBpc1BhcmVudE5vZGVBcnJheSA9IEFycmF5LmlzQXJyYXkoZGF0YSk7XG4gICAgaWYgKGlzT2JqZWN0KGRhdGEpIHx8IGlzUGFyZW50Tm9kZUFycmF5KSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGFba2V5XSkgfHxcbiAgICAgICAgICAgICAgICAoaXNPYmplY3QoZGF0YVtrZXldKSAmJiAhb2JqZWN0SGFzRnVuY3Rpb24oZGF0YVtrZXldKSkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZHNba2V5XSA9IEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKSA/IFtdIDoge307XG4gICAgICAgICAgICAgICAgbWFya0ZpZWxkc0RpcnR5KGRhdGFba2V5XSwgZmllbGRzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKGRhdGFba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBmaWVsZHNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZpZWxkcztcbn1cbmZ1bmN0aW9uIGdldERpcnR5RmllbGRzRnJvbURlZmF1bHRWYWx1ZXMoZGF0YSwgZm9ybVZhbHVlcywgZGlydHlGaWVsZHNGcm9tVmFsdWVzKSB7XG4gICAgY29uc3QgaXNQYXJlbnROb2RlQXJyYXkgPSBBcnJheS5pc0FycmF5KGRhdGEpO1xuICAgIGlmIChpc09iamVjdChkYXRhKSB8fCBpc1BhcmVudE5vZGVBcnJheSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhW2tleV0pIHx8XG4gICAgICAgICAgICAgICAgKGlzT2JqZWN0KGRhdGFba2V5XSkgJiYgIW9iamVjdEhhc0Z1bmN0aW9uKGRhdGFba2V5XSkpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzVW5kZWZpbmVkKGZvcm1WYWx1ZXMpIHx8XG4gICAgICAgICAgICAgICAgICAgIGlzUHJpbWl0aXZlKGRpcnR5RmllbGRzRnJvbVZhbHVlc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXJ0eUZpZWxkc0Zyb21WYWx1ZXNba2V5XSA9IEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBtYXJrRmllbGRzRGlydHkoZGF0YVtrZXldLCBbXSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogeyAuLi5tYXJrRmllbGRzRGlydHkoZGF0YVtrZXldKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0RGlydHlGaWVsZHNGcm9tRGVmYXVsdFZhbHVlcyhkYXRhW2tleV0sIGlzTnVsbE9yVW5kZWZpbmVkKGZvcm1WYWx1ZXMpID8ge30gOiBmb3JtVmFsdWVzW2tleV0sIGRpcnR5RmllbGRzRnJvbVZhbHVlc1trZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaXJ0eUZpZWxkc0Zyb21WYWx1ZXNba2V5XSA9ICFkZWVwRXF1YWwoZGF0YVtrZXldLCBmb3JtVmFsdWVzW2tleV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkaXJ0eUZpZWxkc0Zyb21WYWx1ZXM7XG59XG52YXIgZ2V0RGlydHlGaWVsZHMgPSAoZGVmYXVsdFZhbHVlcywgZm9ybVZhbHVlcykgPT4gZ2V0RGlydHlGaWVsZHNGcm9tRGVmYXVsdFZhbHVlcyhkZWZhdWx0VmFsdWVzLCBmb3JtVmFsdWVzLCBtYXJrRmllbGRzRGlydHkoZm9ybVZhbHVlcykpO1xuXG5jb25zdCBkZWZhdWx0UmVzdWx0ID0ge1xuICAgIHZhbHVlOiBmYWxzZSxcbiAgICBpc1ZhbGlkOiBmYWxzZSxcbn07XG5jb25zdCB2YWxpZFJlc3VsdCA9IHsgdmFsdWU6IHRydWUsIGlzVmFsaWQ6IHRydWUgfTtcbnZhciBnZXRDaGVja2JveFZhbHVlID0gKG9wdGlvbnMpID0+IHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkge1xuICAgICAgICBpZiAob3B0aW9ucy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBvcHRpb25zXG4gICAgICAgICAgICAgICAgLmZpbHRlcigob3B0aW9uKSA9PiBvcHRpb24gJiYgb3B0aW9uLmNoZWNrZWQgJiYgIW9wdGlvbi5kaXNhYmxlZClcbiAgICAgICAgICAgICAgICAubWFwKChvcHRpb24pID0+IG9wdGlvbi52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdmFsdWVzLCBpc1ZhbGlkOiAhIXZhbHVlcy5sZW5ndGggfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW9uc1swXS5jaGVja2VkICYmICFvcHRpb25zWzBdLmRpc2FibGVkXG4gICAgICAgICAgICA/IC8vIEB0cy1leHBlY3QtZXJyb3IgZXhwZWN0ZWQgdG8gd29yayBpbiB0aGUgYnJvd3NlclxuICAgICAgICAgICAgICAgIG9wdGlvbnNbMF0uYXR0cmlidXRlcyAmJiAhaXNVbmRlZmluZWQob3B0aW9uc1swXS5hdHRyaWJ1dGVzLnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA/IGlzVW5kZWZpbmVkKG9wdGlvbnNbMF0udmFsdWUpIHx8IG9wdGlvbnNbMF0udmFsdWUgPT09ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHZhbGlkUmVzdWx0XG4gICAgICAgICAgICAgICAgICAgICAgICA6IHsgdmFsdWU6IG9wdGlvbnNbMF0udmFsdWUsIGlzVmFsaWQ6IHRydWUgfVxuICAgICAgICAgICAgICAgICAgICA6IHZhbGlkUmVzdWx0XG4gICAgICAgICAgICA6IGRlZmF1bHRSZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBkZWZhdWx0UmVzdWx0O1xufTtcblxudmFyIGdldEZpZWxkVmFsdWVBcyA9ICh2YWx1ZSwgeyB2YWx1ZUFzTnVtYmVyLCB2YWx1ZUFzRGF0ZSwgc2V0VmFsdWVBcyB9KSA9PiBpc1VuZGVmaW5lZCh2YWx1ZSlcbiAgICA/IHZhbHVlXG4gICAgOiB2YWx1ZUFzTnVtYmVyXG4gICAgICAgID8gdmFsdWUgPT09ICcnXG4gICAgICAgICAgICA/IE5hTlxuICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICAgICAgICAgID8gK3ZhbHVlXG4gICAgICAgICAgICAgICAgOiB2YWx1ZVxuICAgICAgICA6IHZhbHVlQXNEYXRlICYmIGlzU3RyaW5nKHZhbHVlKVxuICAgICAgICAgICAgPyBuZXcgRGF0ZSh2YWx1ZSlcbiAgICAgICAgICAgIDogc2V0VmFsdWVBc1xuICAgICAgICAgICAgICAgID8gc2V0VmFsdWVBcyh2YWx1ZSlcbiAgICAgICAgICAgICAgICA6IHZhbHVlO1xuXG5jb25zdCBkZWZhdWx0UmV0dXJuID0ge1xuICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgIHZhbHVlOiBudWxsLFxufTtcbnZhciBnZXRSYWRpb1ZhbHVlID0gKG9wdGlvbnMpID0+IEFycmF5LmlzQXJyYXkob3B0aW9ucylcbiAgICA/IG9wdGlvbnMucmVkdWNlKChwcmV2aW91cywgb3B0aW9uKSA9PiBvcHRpb24gJiYgb3B0aW9uLmNoZWNrZWQgJiYgIW9wdGlvbi5kaXNhYmxlZFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIGlzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogb3B0aW9uLnZhbHVlLFxuICAgICAgICB9XG4gICAgICAgIDogcHJldmlvdXMsIGRlZmF1bHRSZXR1cm4pXG4gICAgOiBkZWZhdWx0UmV0dXJuO1xuXG5mdW5jdGlvbiBnZXRGaWVsZFZhbHVlKF9mKSB7XG4gICAgY29uc3QgcmVmID0gX2YucmVmO1xuICAgIGlmIChpc0ZpbGVJbnB1dChyZWYpKSB7XG4gICAgICAgIHJldHVybiByZWYuZmlsZXM7XG4gICAgfVxuICAgIGlmIChpc1JhZGlvSW5wdXQocmVmKSkge1xuICAgICAgICByZXR1cm4gZ2V0UmFkaW9WYWx1ZShfZi5yZWZzKS52YWx1ZTtcbiAgICB9XG4gICAgaWYgKGlzTXVsdGlwbGVTZWxlY3QocmVmKSkge1xuICAgICAgICByZXR1cm4gWy4uLnJlZi5zZWxlY3RlZE9wdGlvbnNdLm1hcCgoeyB2YWx1ZSB9KSA9PiB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpc0NoZWNrQm94SW5wdXQocmVmKSkge1xuICAgICAgICByZXR1cm4gZ2V0Q2hlY2tib3hWYWx1ZShfZi5yZWZzKS52YWx1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGdldEZpZWxkVmFsdWVBcyhpc1VuZGVmaW5lZChyZWYudmFsdWUpID8gX2YucmVmLnZhbHVlIDogcmVmLnZhbHVlLCBfZik7XG59XG5cbnZhciBnZXRSZXNvbHZlck9wdGlvbnMgPSAoZmllbGRzTmFtZXMsIF9maWVsZHMsIGNyaXRlcmlhTW9kZSwgc2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbikgPT4ge1xuICAgIGNvbnN0IGZpZWxkcyA9IHt9O1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBmaWVsZHNOYW1lcykge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgZmllbGQgJiYgc2V0KGZpZWxkcywgbmFtZSwgZmllbGQuX2YpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgICBjcml0ZXJpYU1vZGUsXG4gICAgICAgIG5hbWVzOiBbLi4uZmllbGRzTmFtZXNdLFxuICAgICAgICBmaWVsZHMsXG4gICAgICAgIHNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24sXG4gICAgfTtcbn07XG5cbnZhciBpc1JlZ2V4ID0gKHZhbHVlKSA9PiB2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cDtcblxudmFyIGdldFJ1bGVWYWx1ZSA9IChydWxlKSA9PiBpc1VuZGVmaW5lZChydWxlKVxuICAgID8gcnVsZVxuICAgIDogaXNSZWdleChydWxlKVxuICAgICAgICA/IHJ1bGUuc291cmNlXG4gICAgICAgIDogaXNPYmplY3QocnVsZSlcbiAgICAgICAgICAgID8gaXNSZWdleChydWxlLnZhbHVlKVxuICAgICAgICAgICAgICAgID8gcnVsZS52YWx1ZS5zb3VyY2VcbiAgICAgICAgICAgICAgICA6IHJ1bGUudmFsdWVcbiAgICAgICAgICAgIDogcnVsZTtcblxudmFyIGdldFZhbGlkYXRpb25Nb2RlcyA9IChtb2RlKSA9PiAoe1xuICAgIGlzT25TdWJtaXQ6ICFtb2RlIHx8IG1vZGUgPT09IFZBTElEQVRJT05fTU9ERS5vblN1Ym1pdCxcbiAgICBpc09uQmx1cjogbW9kZSA9PT0gVkFMSURBVElPTl9NT0RFLm9uQmx1cixcbiAgICBpc09uQ2hhbmdlOiBtb2RlID09PSBWQUxJREFUSU9OX01PREUub25DaGFuZ2UsXG4gICAgaXNPbkFsbDogbW9kZSA9PT0gVkFMSURBVElPTl9NT0RFLmFsbCxcbiAgICBpc09uVG91Y2g6IG1vZGUgPT09IFZBTElEQVRJT05fTU9ERS5vblRvdWNoZWQsXG59KTtcblxuY29uc3QgQVNZTkNfRlVOQ1RJT04gPSAnQXN5bmNGdW5jdGlvbic7XG52YXIgaGFzUHJvbWlzZVZhbGlkYXRpb24gPSAoZmllbGRSZWZlcmVuY2UpID0+ICEhZmllbGRSZWZlcmVuY2UgJiZcbiAgICAhIWZpZWxkUmVmZXJlbmNlLnZhbGlkYXRlICYmXG4gICAgISEoKGlzRnVuY3Rpb24oZmllbGRSZWZlcmVuY2UudmFsaWRhdGUpICYmXG4gICAgICAgIGZpZWxkUmVmZXJlbmNlLnZhbGlkYXRlLmNvbnN0cnVjdG9yLm5hbWUgPT09IEFTWU5DX0ZVTkNUSU9OKSB8fFxuICAgICAgICAoaXNPYmplY3QoZmllbGRSZWZlcmVuY2UudmFsaWRhdGUpICYmXG4gICAgICAgICAgICBPYmplY3QudmFsdWVzKGZpZWxkUmVmZXJlbmNlLnZhbGlkYXRlKS5maW5kKCh2YWxpZGF0ZUZ1bmN0aW9uKSA9PiB2YWxpZGF0ZUZ1bmN0aW9uLmNvbnN0cnVjdG9yLm5hbWUgPT09IEFTWU5DX0ZVTkNUSU9OKSkpO1xuXG52YXIgaGFzVmFsaWRhdGlvbiA9IChvcHRpb25zKSA9PiBvcHRpb25zLm1vdW50ICYmXG4gICAgKG9wdGlvbnMucmVxdWlyZWQgfHxcbiAgICAgICAgb3B0aW9ucy5taW4gfHxcbiAgICAgICAgb3B0aW9ucy5tYXggfHxcbiAgICAgICAgb3B0aW9ucy5tYXhMZW5ndGggfHxcbiAgICAgICAgb3B0aW9ucy5taW5MZW5ndGggfHxcbiAgICAgICAgb3B0aW9ucy5wYXR0ZXJuIHx8XG4gICAgICAgIG9wdGlvbnMudmFsaWRhdGUpO1xuXG52YXIgaXNXYXRjaGVkID0gKG5hbWUsIF9uYW1lcywgaXNCbHVyRXZlbnQpID0+ICFpc0JsdXJFdmVudCAmJlxuICAgIChfbmFtZXMud2F0Y2hBbGwgfHxcbiAgICAgICAgX25hbWVzLndhdGNoLmhhcyhuYW1lKSB8fFxuICAgICAgICBbLi4uX25hbWVzLndhdGNoXS5zb21lKCh3YXRjaE5hbWUpID0+IG5hbWUuc3RhcnRzV2l0aCh3YXRjaE5hbWUpICYmXG4gICAgICAgICAgICAvXlxcLlxcdysvLnRlc3QobmFtZS5zbGljZSh3YXRjaE5hbWUubGVuZ3RoKSkpKTtcblxuY29uc3QgaXRlcmF0ZUZpZWxkc0J5QWN0aW9uID0gKGZpZWxkcywgYWN0aW9uLCBmaWVsZHNOYW1lcywgYWJvcnRFYXJseSkgPT4ge1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGZpZWxkc05hbWVzIHx8IE9iamVjdC5rZXlzKGZpZWxkcykpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoZmllbGRzLCBrZXkpO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgX2YsIC4uLmN1cnJlbnRGaWVsZCB9ID0gZmllbGQ7XG4gICAgICAgICAgICBpZiAoX2YpIHtcbiAgICAgICAgICAgICAgICBpZiAoX2YucmVmcyAmJiBfZi5yZWZzWzBdICYmIGFjdGlvbihfZi5yZWZzWzBdLCBrZXkpICYmICFhYm9ydEVhcmx5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChfZi5yZWYgJiYgYWN0aW9uKF9mLnJlZiwgX2YubmFtZSkgJiYgIWFib3J0RWFybHkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlcmF0ZUZpZWxkc0J5QWN0aW9uKGN1cnJlbnRGaWVsZCwgYWN0aW9uKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChpc09iamVjdChjdXJyZW50RmllbGQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZXJhdGVGaWVsZHNCeUFjdGlvbihjdXJyZW50RmllbGQsIGFjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybjtcbn07XG5cbmZ1bmN0aW9uIHNjaGVtYUVycm9yTG9va3VwKGVycm9ycywgX2ZpZWxkcywgbmFtZSkge1xuICAgIGNvbnN0IGVycm9yID0gZ2V0KGVycm9ycywgbmFtZSk7XG4gICAgaWYgKGVycm9yIHx8IGlzS2V5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcixcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH07XG4gICAgfVxuICAgIGNvbnN0IG5hbWVzID0gbmFtZS5zcGxpdCgnLicpO1xuICAgIHdoaWxlIChuYW1lcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgZmllbGROYW1lID0gbmFtZXMuam9pbignLicpO1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBmaWVsZE5hbWUpO1xuICAgICAgICBjb25zdCBmb3VuZEVycm9yID0gZ2V0KGVycm9ycywgZmllbGROYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkICYmICFBcnJheS5pc0FycmF5KGZpZWxkKSAmJiBuYW1lICE9PSBmaWVsZE5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWUgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRFcnJvciAmJiBmb3VuZEVycm9yLnR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogZmllbGROYW1lLFxuICAgICAgICAgICAgICAgIGVycm9yOiBmb3VuZEVycm9yLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRFcnJvciAmJiBmb3VuZEVycm9yLnJvb3QgJiYgZm91bmRFcnJvci5yb290LnR5cGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgbmFtZTogYCR7ZmllbGROYW1lfS5yb290YCxcbiAgICAgICAgICAgICAgICBlcnJvcjogZm91bmRFcnJvci5yb290LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBuYW1lcy5wb3AoKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICB9O1xufVxuXG52YXIgc2hvdWxkUmVuZGVyRm9ybVN0YXRlID0gKGZvcm1TdGF0ZURhdGEsIF9wcm94eUZvcm1TdGF0ZSwgdXBkYXRlRm9ybVN0YXRlLCBpc1Jvb3QpID0+IHtcbiAgICB1cGRhdGVGb3JtU3RhdGUoZm9ybVN0YXRlRGF0YSk7XG4gICAgY29uc3QgeyBuYW1lLCAuLi5mb3JtU3RhdGUgfSA9IGZvcm1TdGF0ZURhdGE7XG4gICAgcmV0dXJuIChpc0VtcHR5T2JqZWN0KGZvcm1TdGF0ZSkgfHxcbiAgICAgICAgT2JqZWN0LmtleXMoZm9ybVN0YXRlKS5sZW5ndGggPj0gT2JqZWN0LmtleXMoX3Byb3h5Rm9ybVN0YXRlKS5sZW5ndGggfHxcbiAgICAgICAgT2JqZWN0LmtleXMoZm9ybVN0YXRlKS5maW5kKChrZXkpID0+IF9wcm94eUZvcm1TdGF0ZVtrZXldID09PVxuICAgICAgICAgICAgKCFpc1Jvb3QgfHwgVkFMSURBVElPTl9NT0RFLmFsbCkpKTtcbn07XG5cbnZhciBzaG91bGRTdWJzY3JpYmVCeU5hbWUgPSAobmFtZSwgc2lnbmFsTmFtZSwgZXhhY3QpID0+ICFuYW1lIHx8XG4gICAgIXNpZ25hbE5hbWUgfHxcbiAgICBuYW1lID09PSBzaWduYWxOYW1lIHx8XG4gICAgY29udmVydFRvQXJyYXlQYXlsb2FkKG5hbWUpLnNvbWUoKGN1cnJlbnROYW1lKSA9PiBjdXJyZW50TmFtZSAmJlxuICAgICAgICAoZXhhY3RcbiAgICAgICAgICAgID8gY3VycmVudE5hbWUgPT09IHNpZ25hbE5hbWVcbiAgICAgICAgICAgIDogY3VycmVudE5hbWUuc3RhcnRzV2l0aChzaWduYWxOYW1lKSB8fFxuICAgICAgICAgICAgICAgIHNpZ25hbE5hbWUuc3RhcnRzV2l0aChjdXJyZW50TmFtZSkpKTtcblxudmFyIHNraXBWYWxpZGF0aW9uID0gKGlzQmx1ckV2ZW50LCBpc1RvdWNoZWQsIGlzU3VibWl0dGVkLCByZVZhbGlkYXRlTW9kZSwgbW9kZSkgPT4ge1xuICAgIGlmIChtb2RlLmlzT25BbGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBlbHNlIGlmICghaXNTdWJtaXR0ZWQgJiYgbW9kZS5pc09uVG91Y2gpIHtcbiAgICAgICAgcmV0dXJuICEoaXNUb3VjaGVkIHx8IGlzQmx1ckV2ZW50KTtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTdWJtaXR0ZWQgPyByZVZhbGlkYXRlTW9kZS5pc09uQmx1ciA6IG1vZGUuaXNPbkJsdXIpIHtcbiAgICAgICAgcmV0dXJuICFpc0JsdXJFdmVudDtcbiAgICB9XG4gICAgZWxzZSBpZiAoaXNTdWJtaXR0ZWQgPyByZVZhbGlkYXRlTW9kZS5pc09uQ2hhbmdlIDogbW9kZS5pc09uQ2hhbmdlKSB7XG4gICAgICAgIHJldHVybiBpc0JsdXJFdmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG52YXIgdW5zZXRFbXB0eUFycmF5ID0gKHJlZiwgbmFtZSkgPT4gIWNvbXBhY3QoZ2V0KHJlZiwgbmFtZSkpLmxlbmd0aCAmJiB1bnNldChyZWYsIG5hbWUpO1xuXG52YXIgdXBkYXRlRmllbGRBcnJheVJvb3RFcnJvciA9IChlcnJvcnMsIGVycm9yLCBuYW1lKSA9PiB7XG4gICAgY29uc3QgZmllbGRBcnJheUVycm9ycyA9IGNvbnZlcnRUb0FycmF5UGF5bG9hZChnZXQoZXJyb3JzLCBuYW1lKSk7XG4gICAgc2V0KGZpZWxkQXJyYXlFcnJvcnMsICdyb290JywgZXJyb3JbbmFtZV0pO1xuICAgIHNldChlcnJvcnMsIG5hbWUsIGZpZWxkQXJyYXlFcnJvcnMpO1xuICAgIHJldHVybiBlcnJvcnM7XG59O1xuXG52YXIgaXNNZXNzYWdlID0gKHZhbHVlKSA9PiBpc1N0cmluZyh2YWx1ZSk7XG5cbmZ1bmN0aW9uIGdldFZhbGlkYXRlRXJyb3IocmVzdWx0LCByZWYsIHR5cGUgPSAndmFsaWRhdGUnKSB7XG4gICAgaWYgKGlzTWVzc2FnZShyZXN1bHQpIHx8XG4gICAgICAgIChBcnJheS5pc0FycmF5KHJlc3VsdCkgJiYgcmVzdWx0LmV2ZXJ5KGlzTWVzc2FnZSkpIHx8XG4gICAgICAgIChpc0Jvb2xlYW4ocmVzdWx0KSAmJiAhcmVzdWx0KSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGlzTWVzc2FnZShyZXN1bHQpID8gcmVzdWx0IDogJycsXG4gICAgICAgICAgICByZWYsXG4gICAgICAgIH07XG4gICAgfVxufVxuXG52YXIgZ2V0VmFsdWVBbmRNZXNzYWdlID0gKHZhbGlkYXRpb25EYXRhKSA9PiBpc09iamVjdCh2YWxpZGF0aW9uRGF0YSkgJiYgIWlzUmVnZXgodmFsaWRhdGlvbkRhdGEpXG4gICAgPyB2YWxpZGF0aW9uRGF0YVxuICAgIDoge1xuICAgICAgICB2YWx1ZTogdmFsaWRhdGlvbkRhdGEsXG4gICAgICAgIG1lc3NhZ2U6ICcnLFxuICAgIH07XG5cbnZhciB2YWxpZGF0ZUZpZWxkID0gYXN5bmMgKGZpZWxkLCBkaXNhYmxlZEZpZWxkTmFtZXMsIGZvcm1WYWx1ZXMsIHZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSwgc2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbiwgaXNGaWVsZEFycmF5KSA9PiB7XG4gICAgY29uc3QgeyByZWYsIHJlZnMsIHJlcXVpcmVkLCBtYXhMZW5ndGgsIG1pbkxlbmd0aCwgbWluLCBtYXgsIHBhdHRlcm4sIHZhbGlkYXRlLCBuYW1lLCB2YWx1ZUFzTnVtYmVyLCBtb3VudCwgfSA9IGZpZWxkLl9mO1xuICAgIGNvbnN0IGlucHV0VmFsdWUgPSBnZXQoZm9ybVZhbHVlcywgbmFtZSk7XG4gICAgaWYgKCFtb3VudCB8fCBkaXNhYmxlZEZpZWxkTmFtZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRSZWYgPSByZWZzID8gcmVmc1swXSA6IHJlZjtcbiAgICBjb25zdCBzZXRDdXN0b21WYWxpZGl0eSA9IChtZXNzYWdlKSA9PiB7XG4gICAgICAgIGlmIChzaG91bGRVc2VOYXRpdmVWYWxpZGF0aW9uICYmIGlucHV0UmVmLnJlcG9ydFZhbGlkaXR5KSB7XG4gICAgICAgICAgICBpbnB1dFJlZi5zZXRDdXN0b21WYWxpZGl0eShpc0Jvb2xlYW4obWVzc2FnZSkgPyAnJyA6IG1lc3NhZ2UgfHwgJycpO1xuICAgICAgICAgICAgaW5wdXRSZWYucmVwb3J0VmFsaWRpdHkoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgZXJyb3IgPSB7fTtcbiAgICBjb25zdCBpc1JhZGlvID0gaXNSYWRpb0lucHV0KHJlZik7XG4gICAgY29uc3QgaXNDaGVja0JveCA9IGlzQ2hlY2tCb3hJbnB1dChyZWYpO1xuICAgIGNvbnN0IGlzUmFkaW9PckNoZWNrYm94ID0gaXNSYWRpbyB8fCBpc0NoZWNrQm94O1xuICAgIGNvbnN0IGlzRW1wdHkgPSAoKHZhbHVlQXNOdW1iZXIgfHwgaXNGaWxlSW5wdXQocmVmKSkgJiZcbiAgICAgICAgaXNVbmRlZmluZWQocmVmLnZhbHVlKSAmJlxuICAgICAgICBpc1VuZGVmaW5lZChpbnB1dFZhbHVlKSkgfHxcbiAgICAgICAgKGlzSFRNTEVsZW1lbnQocmVmKSAmJiByZWYudmFsdWUgPT09ICcnKSB8fFxuICAgICAgICBpbnB1dFZhbHVlID09PSAnJyB8fFxuICAgICAgICAoQXJyYXkuaXNBcnJheShpbnB1dFZhbHVlKSAmJiAhaW5wdXRWYWx1ZS5sZW5ndGgpO1xuICAgIGNvbnN0IGFwcGVuZEVycm9yc0N1cnJ5ID0gYXBwZW5kRXJyb3JzLmJpbmQobnVsbCwgbmFtZSwgdmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhLCBlcnJvcik7XG4gICAgY29uc3QgZ2V0TWluTWF4TWVzc2FnZSA9IChleGNlZWRNYXgsIG1heExlbmd0aE1lc3NhZ2UsIG1pbkxlbmd0aE1lc3NhZ2UsIG1heFR5cGUgPSBJTlBVVF9WQUxJREFUSU9OX1JVTEVTLm1heExlbmd0aCwgbWluVHlwZSA9IElOUFVUX1ZBTElEQVRJT05fUlVMRVMubWluTGVuZ3RoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBleGNlZWRNYXggPyBtYXhMZW5ndGhNZXNzYWdlIDogbWluTGVuZ3RoTWVzc2FnZTtcbiAgICAgICAgZXJyb3JbbmFtZV0gPSB7XG4gICAgICAgICAgICB0eXBlOiBleGNlZWRNYXggPyBtYXhUeXBlIDogbWluVHlwZSxcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICByZWYsXG4gICAgICAgICAgICAuLi5hcHBlbmRFcnJvcnNDdXJyeShleGNlZWRNYXggPyBtYXhUeXBlIDogbWluVHlwZSwgbWVzc2FnZSksXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBpZiAoaXNGaWVsZEFycmF5XG4gICAgICAgID8gIUFycmF5LmlzQXJyYXkoaW5wdXRWYWx1ZSkgfHwgIWlucHV0VmFsdWUubGVuZ3RoXG4gICAgICAgIDogcmVxdWlyZWQgJiZcbiAgICAgICAgICAgICgoIWlzUmFkaW9PckNoZWNrYm94ICYmIChpc0VtcHR5IHx8IGlzTnVsbE9yVW5kZWZpbmVkKGlucHV0VmFsdWUpKSkgfHxcbiAgICAgICAgICAgICAgICAoaXNCb29sZWFuKGlucHV0VmFsdWUpICYmICFpbnB1dFZhbHVlKSB8fFxuICAgICAgICAgICAgICAgIChpc0NoZWNrQm94ICYmICFnZXRDaGVja2JveFZhbHVlKHJlZnMpLmlzVmFsaWQpIHx8XG4gICAgICAgICAgICAgICAgKGlzUmFkaW8gJiYgIWdldFJhZGlvVmFsdWUocmVmcykuaXNWYWxpZCkpKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUsIG1lc3NhZ2UgfSA9IGlzTWVzc2FnZShyZXF1aXJlZClcbiAgICAgICAgICAgID8geyB2YWx1ZTogISFyZXF1aXJlZCwgbWVzc2FnZTogcmVxdWlyZWQgfVxuICAgICAgICAgICAgOiBnZXRWYWx1ZUFuZE1lc3NhZ2UocmVxdWlyZWQpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIGVycm9yW25hbWVdID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6IElOUFVUX1ZBTElEQVRJT05fUlVMRVMucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICByZWY6IGlucHV0UmVmLFxuICAgICAgICAgICAgICAgIC4uLmFwcGVuZEVycm9yc0N1cnJ5KElOUFVUX1ZBTElEQVRJT05fUlVMRVMucmVxdWlyZWQsIG1lc3NhZ2UpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmICghdmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhKSB7XG4gICAgICAgICAgICAgICAgc2V0Q3VzdG9tVmFsaWRpdHkobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmICghaXNFbXB0eSAmJiAoIWlzTnVsbE9yVW5kZWZpbmVkKG1pbikgfHwgIWlzTnVsbE9yVW5kZWZpbmVkKG1heCkpKSB7XG4gICAgICAgIGxldCBleGNlZWRNYXg7XG4gICAgICAgIGxldCBleGNlZWRNaW47XG4gICAgICAgIGNvbnN0IG1heE91dHB1dCA9IGdldFZhbHVlQW5kTWVzc2FnZShtYXgpO1xuICAgICAgICBjb25zdCBtaW5PdXRwdXQgPSBnZXRWYWx1ZUFuZE1lc3NhZ2UobWluKTtcbiAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChpbnB1dFZhbHVlKSAmJiAhaXNOYU4oaW5wdXRWYWx1ZSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlTnVtYmVyID0gcmVmLnZhbHVlQXNOdW1iZXIgfHxcbiAgICAgICAgICAgICAgICAoaW5wdXRWYWx1ZSA/ICtpbnB1dFZhbHVlIDogaW5wdXRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKG1heE91dHB1dC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBleGNlZWRNYXggPSB2YWx1ZU51bWJlciA+IG1heE91dHB1dC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQobWluT3V0cHV0LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGV4Y2VlZE1pbiA9IHZhbHVlTnVtYmVyIDwgbWluT3V0cHV0LnZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVEYXRlID0gcmVmLnZhbHVlQXNEYXRlIHx8IG5ldyBEYXRlKGlucHV0VmFsdWUpO1xuICAgICAgICAgICAgY29uc3QgY29udmVydFRpbWVUb0RhdGUgPSAodGltZSkgPT4gbmV3IERhdGUobmV3IERhdGUoKS50b0RhdGVTdHJpbmcoKSArICcgJyArIHRpbWUpO1xuICAgICAgICAgICAgY29uc3QgaXNUaW1lID0gcmVmLnR5cGUgPT0gJ3RpbWUnO1xuICAgICAgICAgICAgY29uc3QgaXNXZWVrID0gcmVmLnR5cGUgPT0gJ3dlZWsnO1xuICAgICAgICAgICAgaWYgKGlzU3RyaW5nKG1heE91dHB1dC52YWx1ZSkgJiYgaW5wdXRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGV4Y2VlZE1heCA9IGlzVGltZVxuICAgICAgICAgICAgICAgICAgICA/IGNvbnZlcnRUaW1lVG9EYXRlKGlucHV0VmFsdWUpID4gY29udmVydFRpbWVUb0RhdGUobWF4T3V0cHV0LnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA6IGlzV2Vla1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnB1dFZhbHVlID4gbWF4T3V0cHV0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHZhbHVlRGF0ZSA+IG5ldyBEYXRlKG1heE91dHB1dC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpbmcobWluT3V0cHV0LnZhbHVlKSAmJiBpbnB1dFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgZXhjZWVkTWluID0gaXNUaW1lXG4gICAgICAgICAgICAgICAgICAgID8gY29udmVydFRpbWVUb0RhdGUoaW5wdXRWYWx1ZSkgPCBjb252ZXJ0VGltZVRvRGF0ZShtaW5PdXRwdXQudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgIDogaXNXZWVrXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGlucHV0VmFsdWUgPCBtaW5PdXRwdXQudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdmFsdWVEYXRlIDwgbmV3IERhdGUobWluT3V0cHV0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhjZWVkTWF4IHx8IGV4Y2VlZE1pbikge1xuICAgICAgICAgICAgZ2V0TWluTWF4TWVzc2FnZSghIWV4Y2VlZE1heCwgbWF4T3V0cHV0Lm1lc3NhZ2UsIG1pbk91dHB1dC5tZXNzYWdlLCBJTlBVVF9WQUxJREFUSU9OX1JVTEVTLm1heCwgSU5QVVRfVkFMSURBVElPTl9SVUxFUy5taW4pO1xuICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICBzZXRDdXN0b21WYWxpZGl0eShlcnJvcltuYW1lXS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKChtYXhMZW5ndGggfHwgbWluTGVuZ3RoKSAmJlxuICAgICAgICAhaXNFbXB0eSAmJlxuICAgICAgICAoaXNTdHJpbmcoaW5wdXRWYWx1ZSkgfHwgKGlzRmllbGRBcnJheSAmJiBBcnJheS5pc0FycmF5KGlucHV0VmFsdWUpKSkpIHtcbiAgICAgICAgY29uc3QgbWF4TGVuZ3RoT3V0cHV0ID0gZ2V0VmFsdWVBbmRNZXNzYWdlKG1heExlbmd0aCk7XG4gICAgICAgIGNvbnN0IG1pbkxlbmd0aE91dHB1dCA9IGdldFZhbHVlQW5kTWVzc2FnZShtaW5MZW5ndGgpO1xuICAgICAgICBjb25zdCBleGNlZWRNYXggPSAhaXNOdWxsT3JVbmRlZmluZWQobWF4TGVuZ3RoT3V0cHV0LnZhbHVlKSAmJlxuICAgICAgICAgICAgaW5wdXRWYWx1ZS5sZW5ndGggPiArbWF4TGVuZ3RoT3V0cHV0LnZhbHVlO1xuICAgICAgICBjb25zdCBleGNlZWRNaW4gPSAhaXNOdWxsT3JVbmRlZmluZWQobWluTGVuZ3RoT3V0cHV0LnZhbHVlKSAmJlxuICAgICAgICAgICAgaW5wdXRWYWx1ZS5sZW5ndGggPCArbWluTGVuZ3RoT3V0cHV0LnZhbHVlO1xuICAgICAgICBpZiAoZXhjZWVkTWF4IHx8IGV4Y2VlZE1pbikge1xuICAgICAgICAgICAgZ2V0TWluTWF4TWVzc2FnZShleGNlZWRNYXgsIG1heExlbmd0aE91dHB1dC5tZXNzYWdlLCBtaW5MZW5ndGhPdXRwdXQubWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAoIXZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSkge1xuICAgICAgICAgICAgICAgIHNldEN1c3RvbVZhbGlkaXR5KGVycm9yW25hbWVdLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAocGF0dGVybiAmJiAhaXNFbXB0eSAmJiBpc1N0cmluZyhpbnB1dFZhbHVlKSkge1xuICAgICAgICBjb25zdCB7IHZhbHVlOiBwYXR0ZXJuVmFsdWUsIG1lc3NhZ2UgfSA9IGdldFZhbHVlQW5kTWVzc2FnZShwYXR0ZXJuKTtcbiAgICAgICAgaWYgKGlzUmVnZXgocGF0dGVyblZhbHVlKSAmJiAhaW5wdXRWYWx1ZS5tYXRjaChwYXR0ZXJuVmFsdWUpKSB7XG4gICAgICAgICAgICBlcnJvcltuYW1lXSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBJTlBVVF9WQUxJREFUSU9OX1JVTEVTLnBhdHRlcm4sXG4gICAgICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgICAgICByZWYsXG4gICAgICAgICAgICAgICAgLi4uYXBwZW5kRXJyb3JzQ3VycnkoSU5QVVRfVkFMSURBVElPTl9SVUxFUy5wYXR0ZXJuLCBtZXNzYWdlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoIXZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSkge1xuICAgICAgICAgICAgICAgIHNldEN1c3RvbVZhbGlkaXR5KG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24odmFsaWRhdGUpKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB2YWxpZGF0ZShpbnB1dFZhbHVlLCBmb3JtVmFsdWVzKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlRXJyb3IgPSBnZXRWYWxpZGF0ZUVycm9yKHJlc3VsdCwgaW5wdXRSZWYpO1xuICAgICAgICAgICAgaWYgKHZhbGlkYXRlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnJvcltuYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4udmFsaWRhdGVFcnJvcixcbiAgICAgICAgICAgICAgICAgICAgLi4uYXBwZW5kRXJyb3JzQ3VycnkoSU5QVVRfVkFMSURBVElPTl9SVUxFUy52YWxpZGF0ZSwgdmFsaWRhdGVFcnJvci5tZXNzYWdlKSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmICghdmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEN1c3RvbVZhbGlkaXR5KHZhbGlkYXRlRXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXNPYmplY3QodmFsaWRhdGUpKSB7XG4gICAgICAgICAgICBsZXQgdmFsaWRhdGlvblJlc3VsdCA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdmFsaWRhdGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzRW1wdHlPYmplY3QodmFsaWRhdGlvblJlc3VsdCkgJiYgIXZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsaWRhdGVFcnJvciA9IGdldFZhbGlkYXRlRXJyb3IoYXdhaXQgdmFsaWRhdGVba2V5XShpbnB1dFZhbHVlLCBmb3JtVmFsdWVzKSwgaW5wdXRSZWYsIGtleSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnZhbGlkYXRlRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5hcHBlbmRFcnJvcnNDdXJyeShrZXksIHZhbGlkYXRlRXJyb3IubWVzc2FnZSksXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHNldEN1c3RvbVZhbGlkaXR5KHZhbGlkYXRlRXJyb3IubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yW25hbWVdID0gdmFsaWRhdGlvblJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNFbXB0eU9iamVjdCh2YWxpZGF0aW9uUmVzdWx0KSkge1xuICAgICAgICAgICAgICAgIGVycm9yW25hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICByZWY6IGlucHV0UmVmLFxuICAgICAgICAgICAgICAgICAgICAuLi52YWxpZGF0aW9uUmVzdWx0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRDdXN0b21WYWxpZGl0eSh0cnVlKTtcbiAgICByZXR1cm4gZXJyb3I7XG59O1xuXG5jb25zdCBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBtb2RlOiBWQUxJREFUSU9OX01PREUub25TdWJtaXQsXG4gICAgcmVWYWxpZGF0ZU1vZGU6IFZBTElEQVRJT05fTU9ERS5vbkNoYW5nZSxcbiAgICBzaG91bGRGb2N1c0Vycm9yOiB0cnVlLFxufTtcbmZ1bmN0aW9uIGNyZWF0ZUZvcm1Db250cm9sKHByb3BzID0ge30pIHtcbiAgICBsZXQgX29wdGlvbnMgPSB7XG4gICAgICAgIC4uLmRlZmF1bHRPcHRpb25zLFxuICAgICAgICAuLi5wcm9wcyxcbiAgICB9O1xuICAgIGxldCBfZm9ybVN0YXRlID0ge1xuICAgICAgICBzdWJtaXRDb3VudDogMCxcbiAgICAgICAgaXNEaXJ0eTogZmFsc2UsXG4gICAgICAgIGlzUmVhZHk6IGZhbHNlLFxuICAgICAgICBpc0xvYWRpbmc6IGlzRnVuY3Rpb24oX29wdGlvbnMuZGVmYXVsdFZhbHVlcyksXG4gICAgICAgIGlzVmFsaWRhdGluZzogZmFsc2UsXG4gICAgICAgIGlzU3VibWl0dGVkOiBmYWxzZSxcbiAgICAgICAgaXNTdWJtaXR0aW5nOiBmYWxzZSxcbiAgICAgICAgaXNTdWJtaXRTdWNjZXNzZnVsOiBmYWxzZSxcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIHRvdWNoZWRGaWVsZHM6IHt9LFxuICAgICAgICBkaXJ0eUZpZWxkczoge30sXG4gICAgICAgIHZhbGlkYXRpbmdGaWVsZHM6IHt9LFxuICAgICAgICBlcnJvcnM6IF9vcHRpb25zLmVycm9ycyB8fCB7fSxcbiAgICAgICAgZGlzYWJsZWQ6IF9vcHRpb25zLmRpc2FibGVkIHx8IGZhbHNlLFxuICAgIH07XG4gICAgbGV0IF9maWVsZHMgPSB7fTtcbiAgICBsZXQgX2RlZmF1bHRWYWx1ZXMgPSBpc09iamVjdChfb3B0aW9ucy5kZWZhdWx0VmFsdWVzKSB8fCBpc09iamVjdChfb3B0aW9ucy52YWx1ZXMpXG4gICAgICAgID8gY2xvbmVPYmplY3QoX29wdGlvbnMuZGVmYXVsdFZhbHVlcyB8fCBfb3B0aW9ucy52YWx1ZXMpIHx8IHt9XG4gICAgICAgIDoge307XG4gICAgbGV0IF9mb3JtVmFsdWVzID0gX29wdGlvbnMuc2hvdWxkVW5yZWdpc3RlclxuICAgICAgICA/IHt9XG4gICAgICAgIDogY2xvbmVPYmplY3QoX2RlZmF1bHRWYWx1ZXMpO1xuICAgIGxldCBfc3RhdGUgPSB7XG4gICAgICAgIGFjdGlvbjogZmFsc2UsXG4gICAgICAgIG1vdW50OiBmYWxzZSxcbiAgICAgICAgd2F0Y2g6IGZhbHNlLFxuICAgIH07XG4gICAgbGV0IF9uYW1lcyA9IHtcbiAgICAgICAgbW91bnQ6IG5ldyBTZXQoKSxcbiAgICAgICAgZGlzYWJsZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgdW5Nb3VudDogbmV3IFNldCgpLFxuICAgICAgICBhcnJheTogbmV3IFNldCgpLFxuICAgICAgICB3YXRjaDogbmV3IFNldCgpLFxuICAgIH07XG4gICAgbGV0IGRlbGF5RXJyb3JDYWxsYmFjaztcbiAgICBsZXQgdGltZXIgPSAwO1xuICAgIGNvbnN0IF9wcm94eUZvcm1TdGF0ZSA9IHtcbiAgICAgICAgaXNEaXJ0eTogZmFsc2UsXG4gICAgICAgIGRpcnR5RmllbGRzOiBmYWxzZSxcbiAgICAgICAgdmFsaWRhdGluZ0ZpZWxkczogZmFsc2UsXG4gICAgICAgIHRvdWNoZWRGaWVsZHM6IGZhbHNlLFxuICAgICAgICBpc1ZhbGlkYXRpbmc6IGZhbHNlLFxuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgZXJyb3JzOiBmYWxzZSxcbiAgICB9O1xuICAgIGxldCBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUgPSB7XG4gICAgICAgIC4uLl9wcm94eUZvcm1TdGF0ZSxcbiAgICB9O1xuICAgIGNvbnN0IF9zdWJqZWN0cyA9IHtcbiAgICAgICAgYXJyYXk6IGNyZWF0ZVN1YmplY3QoKSxcbiAgICAgICAgc3RhdGU6IGNyZWF0ZVN1YmplY3QoKSxcbiAgICB9O1xuICAgIGNvbnN0IHNob3VsZERpc3BsYXlBbGxBc3NvY2lhdGVkRXJyb3JzID0gX29wdGlvbnMuY3JpdGVyaWFNb2RlID09PSBWQUxJREFUSU9OX01PREUuYWxsO1xuICAgIGNvbnN0IGRlYm91bmNlID0gKGNhbGxiYWNrKSA9PiAod2FpdCkgPT4ge1xuICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIHdhaXQpO1xuICAgIH07XG4gICAgY29uc3QgX3NldFZhbGlkID0gYXN5bmMgKHNob3VsZFVwZGF0ZVZhbGlkKSA9PiB7XG4gICAgICAgIGlmICghX29wdGlvbnMuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgIChfcHJveHlGb3JtU3RhdGUuaXNWYWxpZCB8fFxuICAgICAgICAgICAgICAgIF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZS5pc1ZhbGlkIHx8XG4gICAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlVmFsaWQpKSB7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkID0gX29wdGlvbnMucmVzb2x2ZXJcbiAgICAgICAgICAgICAgICA/IGlzRW1wdHlPYmplY3QoKGF3YWl0IF9ydW5TY2hlbWEoKSkuZXJyb3JzKVxuICAgICAgICAgICAgICAgIDogYXdhaXQgZXhlY3V0ZUJ1aWx0SW5WYWxpZGF0aW9uKF9maWVsZHMsIHRydWUpO1xuICAgICAgICAgICAgaWYgKGlzVmFsaWQgIT09IF9mb3JtU3RhdGUuaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgX3VwZGF0ZUlzVmFsaWRhdGluZyA9IChuYW1lcywgaXNWYWxpZGF0aW5nKSA9PiB7XG4gICAgICAgIGlmICghX29wdGlvbnMuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgIChfcHJveHlGb3JtU3RhdGUuaXNWYWxpZGF0aW5nIHx8XG4gICAgICAgICAgICAgICAgX3Byb3h5Rm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMgfHxcbiAgICAgICAgICAgICAgICBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuaXNWYWxpZGF0aW5nIHx8XG4gICAgICAgICAgICAgICAgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMpKSB7XG4gICAgICAgICAgICAobmFtZXMgfHwgQXJyYXkuZnJvbShfbmFtZXMubW91bnQpKS5mb3JFYWNoKChuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZGF0aW5nXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHNldChfZm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMsIG5hbWUsIGlzVmFsaWRhdGluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5zZXQoX2Zvcm1TdGF0ZS52YWxpZGF0aW5nRmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0aW5nRmllbGRzOiBfZm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMsXG4gICAgICAgICAgICAgICAgaXNWYWxpZGF0aW5nOiAhaXNFbXB0eU9iamVjdChfZm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IF9zZXRGaWVsZEFycmF5ID0gKG5hbWUsIHZhbHVlcyA9IFtdLCBtZXRob2QsIGFyZ3MsIHNob3VsZFNldFZhbHVlcyA9IHRydWUsIHNob3VsZFVwZGF0ZUZpZWxkc0FuZFN0YXRlID0gdHJ1ZSkgPT4ge1xuICAgICAgICBpZiAoYXJncyAmJiBtZXRob2QgJiYgIV9vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBfc3RhdGUuYWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChzaG91bGRVcGRhdGVGaWVsZHNBbmRTdGF0ZSAmJiBBcnJheS5pc0FycmF5KGdldChfZmllbGRzLCBuYW1lKSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlcyA9IG1ldGhvZChnZXQoX2ZpZWxkcywgbmFtZSksIGFyZ3MuYXJnQSwgYXJncy5hcmdCKTtcbiAgICAgICAgICAgICAgICBzaG91bGRTZXRWYWx1ZXMgJiYgc2V0KF9maWVsZHMsIG5hbWUsIGZpZWxkVmFsdWVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzaG91bGRVcGRhdGVGaWVsZHNBbmRTdGF0ZSAmJlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoZ2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKSkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBtZXRob2QoZ2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKSwgYXJncy5hcmdBLCBhcmdzLmFyZ0IpO1xuICAgICAgICAgICAgICAgIHNob3VsZFNldFZhbHVlcyAmJiBzZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUsIGVycm9ycyk7XG4gICAgICAgICAgICAgICAgdW5zZXRFbXB0eUFycmF5KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICgoX3Byb3h5Rm9ybVN0YXRlLnRvdWNoZWRGaWVsZHMgfHxcbiAgICAgICAgICAgICAgICBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUudG91Y2hlZEZpZWxkcykgJiZcbiAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWVsZHNBbmRTdGF0ZSAmJlxuICAgICAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoZ2V0KF9mb3JtU3RhdGUudG91Y2hlZEZpZWxkcywgbmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdG91Y2hlZEZpZWxkcyA9IG1ldGhvZChnZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKSwgYXJncy5hcmdBLCBhcmdzLmFyZ0IpO1xuICAgICAgICAgICAgICAgIHNob3VsZFNldFZhbHVlcyAmJiBzZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lLCB0b3VjaGVkRmllbGRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChfcHJveHlGb3JtU3RhdGUuZGlydHlGaWVsZHMgfHwgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLmRpcnR5RmllbGRzKSB7XG4gICAgICAgICAgICAgICAgX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkcyA9IGdldERpcnR5RmllbGRzKF9kZWZhdWx0VmFsdWVzLCBfZm9ybVZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBpc0RpcnR5OiBfZ2V0RGlydHkobmFtZSwgdmFsdWVzKSxcbiAgICAgICAgICAgICAgICBkaXJ0eUZpZWxkczogX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkcyxcbiAgICAgICAgICAgICAgICBlcnJvcnM6IF9mb3JtU3RhdGUuZXJyb3JzLFxuICAgICAgICAgICAgICAgIGlzVmFsaWQ6IF9mb3JtU3RhdGUuaXNWYWxpZCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc2V0KF9mb3JtVmFsdWVzLCBuYW1lLCB2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCB1cGRhdGVFcnJvcnMgPSAobmFtZSwgZXJyb3IpID0+IHtcbiAgICAgICAgc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lLCBlcnJvcik7XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIGVycm9yczogX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgX3NldEVycm9ycyA9IChlcnJvcnMpID0+IHtcbiAgICAgICAgX2Zvcm1TdGF0ZS5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIGVycm9yczogX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCB1cGRhdGVWYWxpZEFuZFZhbHVlID0gKG5hbWUsIHNob3VsZFNraXBTZXRWYWx1ZUFzLCB2YWx1ZSwgcmVmKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IGdldChfZm9ybVZhbHVlcywgbmFtZSwgaXNVbmRlZmluZWQodmFsdWUpID8gZ2V0KF9kZWZhdWx0VmFsdWVzLCBuYW1lKSA6IHZhbHVlKTtcbiAgICAgICAgICAgIGlzVW5kZWZpbmVkKGRlZmF1bHRWYWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAocmVmICYmIHJlZi5kZWZhdWx0Q2hlY2tlZCkgfHxcbiAgICAgICAgICAgICAgICBzaG91bGRTa2lwU2V0VmFsdWVBc1xuICAgICAgICAgICAgICAgID8gc2V0KF9mb3JtVmFsdWVzLCBuYW1lLCBzaG91bGRTa2lwU2V0VmFsdWVBcyA/IGRlZmF1bHRWYWx1ZSA6IGdldEZpZWxkVmFsdWUoZmllbGQuX2YpKVxuICAgICAgICAgICAgICAgIDogc2V0RmllbGRWYWx1ZShuYW1lLCBkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgICAgX3N0YXRlLm1vdW50ICYmIF9zZXRWYWxpZCgpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCB1cGRhdGVUb3VjaEFuZERpcnR5ID0gKG5hbWUsIGZpZWxkVmFsdWUsIGlzQmx1ckV2ZW50LCBzaG91bGREaXJ0eSwgc2hvdWxkUmVuZGVyKSA9PiB7XG4gICAgICAgIGxldCBzaG91bGRVcGRhdGVGaWVsZCA9IGZhbHNlO1xuICAgICAgICBsZXQgaXNQcmV2aW91c0RpcnR5ID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH07XG4gICAgICAgIGlmICghX29wdGlvbnMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGlmICghaXNCbHVyRXZlbnQgfHwgc2hvdWxkRGlydHkpIHtcbiAgICAgICAgICAgICAgICBpZiAoX3Byb3h5Rm9ybVN0YXRlLmlzRGlydHkgfHwgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLmlzRGlydHkpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNQcmV2aW91c0RpcnR5ID0gX2Zvcm1TdGF0ZS5pc0RpcnR5O1xuICAgICAgICAgICAgICAgICAgICBfZm9ybVN0YXRlLmlzRGlydHkgPSBvdXRwdXQuaXNEaXJ0eSA9IF9nZXREaXJ0eSgpO1xuICAgICAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWVsZCA9IGlzUHJldmlvdXNEaXJ0eSAhPT0gb3V0cHV0LmlzRGlydHk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudEZpZWxkUHJpc3RpbmUgPSBkZWVwRXF1YWwoZ2V0KF9kZWZhdWx0VmFsdWVzLCBuYW1lKSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgaXNQcmV2aW91c0RpcnR5ID0gISFnZXQoX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgaXNDdXJyZW50RmllbGRQcmlzdGluZVxuICAgICAgICAgICAgICAgICAgICA/IHVuc2V0KF9mb3JtU3RhdGUuZGlydHlGaWVsZHMsIG5hbWUpXG4gICAgICAgICAgICAgICAgICAgIDogc2V0KF9mb3JtU3RhdGUuZGlydHlGaWVsZHMsIG5hbWUsIHRydWUpO1xuICAgICAgICAgICAgICAgIG91dHB1dC5kaXJ0eUZpZWxkcyA9IF9mb3JtU3RhdGUuZGlydHlGaWVsZHM7XG4gICAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlRmllbGQgPVxuICAgICAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgKChfcHJveHlGb3JtU3RhdGUuZGlydHlGaWVsZHMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuZGlydHlGaWVsZHMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmV2aW91c0RpcnR5ICE9PSAhaXNDdXJyZW50RmllbGRQcmlzdGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNCbHVyRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpc1ByZXZpb3VzRmllbGRUb3VjaGVkID0gZ2V0KF9mb3JtU3RhdGUudG91Y2hlZEZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ByZXZpb3VzRmllbGRUb3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldChfZm9ybVN0YXRlLnRvdWNoZWRGaWVsZHMsIG5hbWUsIGlzQmx1ckV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnRvdWNoZWRGaWVsZHMgPSBfZm9ybVN0YXRlLnRvdWNoZWRGaWVsZHM7XG4gICAgICAgICAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpZWxkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpZWxkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChfcHJveHlGb3JtU3RhdGUudG91Y2hlZEZpZWxkcyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUudG91Y2hlZEZpZWxkcykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQcmV2aW91c0ZpZWxkVG91Y2hlZCAhPT0gaXNCbHVyRXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpZWxkICYmIHNob3VsZFJlbmRlciAmJiBfc3ViamVjdHMuc3RhdGUubmV4dChvdXRwdXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzaG91bGRVcGRhdGVGaWVsZCA/IG91dHB1dCA6IHt9O1xuICAgIH07XG4gICAgY29uc3Qgc2hvdWxkUmVuZGVyQnlFcnJvciA9IChuYW1lLCBpc1ZhbGlkLCBlcnJvciwgZmllbGRTdGF0ZSkgPT4ge1xuICAgICAgICBjb25zdCBwcmV2aW91c0ZpZWxkRXJyb3IgPSBnZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUpO1xuICAgICAgICBjb25zdCBzaG91bGRVcGRhdGVWYWxpZCA9IChfcHJveHlGb3JtU3RhdGUuaXNWYWxpZCB8fCBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuaXNWYWxpZCkgJiZcbiAgICAgICAgICAgIGlzQm9vbGVhbihpc1ZhbGlkKSAmJlxuICAgICAgICAgICAgX2Zvcm1TdGF0ZS5pc1ZhbGlkICE9PSBpc1ZhbGlkO1xuICAgICAgICBpZiAoX29wdGlvbnMuZGVsYXlFcnJvciAmJiBlcnJvcikge1xuICAgICAgICAgICAgZGVsYXlFcnJvckNhbGxiYWNrID0gZGVib3VuY2UoKCkgPT4gdXBkYXRlRXJyb3JzKG5hbWUsIGVycm9yKSk7XG4gICAgICAgICAgICBkZWxheUVycm9yQ2FsbGJhY2soX29wdGlvbnMuZGVsYXlFcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgZGVsYXlFcnJvckNhbGxiYWNrID0gbnVsbDtcbiAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICAgPyBzZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUsIGVycm9yKVxuICAgICAgICAgICAgICAgIDogdW5zZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmICgoZXJyb3IgPyAhZGVlcEVxdWFsKHByZXZpb3VzRmllbGRFcnJvciwgZXJyb3IpIDogcHJldmlvdXNGaWVsZEVycm9yKSB8fFxuICAgICAgICAgICAgIWlzRW1wdHlPYmplY3QoZmllbGRTdGF0ZSkgfHxcbiAgICAgICAgICAgIHNob3VsZFVwZGF0ZVZhbGlkKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkRm9ybVN0YXRlID0ge1xuICAgICAgICAgICAgICAgIC4uLmZpZWxkU3RhdGUsXG4gICAgICAgICAgICAgICAgLi4uKHNob3VsZFVwZGF0ZVZhbGlkICYmIGlzQm9vbGVhbihpc1ZhbGlkKSA/IHsgaXNWYWxpZCB9IDoge30pLFxuICAgICAgICAgICAgICAgIGVycm9yczogX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBfZm9ybVN0YXRlID0ge1xuICAgICAgICAgICAgICAgIC4uLl9mb3JtU3RhdGUsXG4gICAgICAgICAgICAgICAgLi4udXBkYXRlZEZvcm1TdGF0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh1cGRhdGVkRm9ybVN0YXRlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgX3J1blNjaGVtYSA9IGFzeW5jIChuYW1lKSA9PiB7XG4gICAgICAgIF91cGRhdGVJc1ZhbGlkYXRpbmcobmFtZSwgdHJ1ZSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF9vcHRpb25zLnJlc29sdmVyKF9mb3JtVmFsdWVzLCBfb3B0aW9ucy5jb250ZXh0LCBnZXRSZXNvbHZlck9wdGlvbnMobmFtZSB8fCBfbmFtZXMubW91bnQsIF9maWVsZHMsIF9vcHRpb25zLmNyaXRlcmlhTW9kZSwgX29wdGlvbnMuc2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbikpO1xuICAgICAgICBfdXBkYXRlSXNWYWxpZGF0aW5nKG5hbWUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gICAgY29uc3QgZXhlY3V0ZVNjaGVtYUFuZFVwZGF0ZVN0YXRlID0gYXN5bmMgKG5hbWVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgZXJyb3JzIH0gPSBhd2FpdCBfcnVuU2NoZW1hKG5hbWVzKTtcbiAgICAgICAgaWYgKG5hbWVzKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IGdldChlcnJvcnMsIG5hbWUpO1xuICAgICAgICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICAgICAgICAgID8gc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lLCBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgOiB1bnNldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBfZm9ybVN0YXRlLmVycm9ycyA9IGVycm9ycztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXJyb3JzO1xuICAgIH07XG4gICAgY29uc3QgZXhlY3V0ZUJ1aWx0SW5WYWxpZGF0aW9uID0gYXN5bmMgKGZpZWxkcywgc2hvdWxkT25seUNoZWNrVmFsaWQsIGNvbnRleHQgPSB7XG4gICAgICAgIHZhbGlkOiB0cnVlLFxuICAgIH0pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIGZpZWxkcykge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBmaWVsZHNbbmFtZV07XG4gICAgICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IF9mLCAuLi5maWVsZFZhbHVlIH0gPSBmaWVsZDtcbiAgICAgICAgICAgICAgICBpZiAoX2YpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNGaWVsZEFycmF5Um9vdCA9IF9uYW1lcy5hcnJheS5oYXMoX2YubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzUHJvbWlzZUZ1bmN0aW9uID0gZmllbGQuX2YgJiYgaGFzUHJvbWlzZVZhbGlkYXRpb24oZmllbGQuX2YpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcm9taXNlRnVuY3Rpb24gJiYgX3Byb3h5Rm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF91cGRhdGVJc1ZhbGlkYXRpbmcoW25hbWVdLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZEVycm9yID0gYXdhaXQgdmFsaWRhdGVGaWVsZChmaWVsZCwgX25hbWVzLmRpc2FibGVkLCBfZm9ybVZhbHVlcywgc2hvdWxkRGlzcGxheUFsbEFzc29jaWF0ZWRFcnJvcnMsIF9vcHRpb25zLnNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24gJiYgIXNob3VsZE9ubHlDaGVja1ZhbGlkLCBpc0ZpZWxkQXJyYXlSb290KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJvbWlzZUZ1bmN0aW9uICYmIF9wcm94eUZvcm1TdGF0ZS52YWxpZGF0aW5nRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdXBkYXRlSXNWYWxpZGF0aW5nKFtuYW1lXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkRXJyb3JbX2YubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRPbmx5Q2hlY2tWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICFzaG91bGRPbmx5Q2hlY2tWYWxpZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGdldChmaWVsZEVycm9yLCBfZi5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gaXNGaWVsZEFycmF5Um9vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHVwZGF0ZUZpZWxkQXJyYXlSb290RXJyb3IoX2Zvcm1TdGF0ZS5lcnJvcnMsIGZpZWxkRXJyb3IsIF9mLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBfZi5uYW1lLCBmaWVsZEVycm9yW19mLm5hbWVdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5zZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIF9mLm5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgIWlzRW1wdHlPYmplY3QoZmllbGRWYWx1ZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgKGF3YWl0IGV4ZWN1dGVCdWlsdEluVmFsaWRhdGlvbihmaWVsZFZhbHVlLCBzaG91bGRPbmx5Q2hlY2tWYWxpZCwgY29udGV4dCkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb250ZXh0LnZhbGlkO1xuICAgIH07XG4gICAgY29uc3QgX3JlbW92ZVVubW91bnRlZCA9ICgpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIF9uYW1lcy51bk1vdW50KSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgIGZpZWxkICYmXG4gICAgICAgICAgICAgICAgKGZpZWxkLl9mLnJlZnNcbiAgICAgICAgICAgICAgICAgICAgPyBmaWVsZC5fZi5yZWZzLmV2ZXJ5KChyZWYpID0+ICFsaXZlKHJlZikpXG4gICAgICAgICAgICAgICAgICAgIDogIWxpdmUoZmllbGQuX2YucmVmKSkgJiZcbiAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIF9uYW1lcy51bk1vdW50ID0gbmV3IFNldCgpO1xuICAgIH07XG4gICAgY29uc3QgX2dldERpcnR5ID0gKG5hbWUsIGRhdGEpID0+ICFfb3B0aW9ucy5kaXNhYmxlZCAmJlxuICAgICAgICAobmFtZSAmJiBkYXRhICYmIHNldChfZm9ybVZhbHVlcywgbmFtZSwgZGF0YSksXG4gICAgICAgICAgICAhZGVlcEVxdWFsKGdldFZhbHVlcygpLCBfZGVmYXVsdFZhbHVlcykpO1xuICAgIGNvbnN0IF9nZXRXYXRjaCA9IChuYW1lcywgZGVmYXVsdFZhbHVlLCBpc0dsb2JhbCkgPT4gZ2VuZXJhdGVXYXRjaE91dHB1dChuYW1lcywgX25hbWVzLCB7XG4gICAgICAgIC4uLihfc3RhdGUubW91bnRcbiAgICAgICAgICAgID8gX2Zvcm1WYWx1ZXNcbiAgICAgICAgICAgIDogaXNVbmRlZmluZWQoZGVmYXVsdFZhbHVlKVxuICAgICAgICAgICAgICAgID8gX2RlZmF1bHRWYWx1ZXNcbiAgICAgICAgICAgICAgICA6IGlzU3RyaW5nKG5hbWVzKVxuICAgICAgICAgICAgICAgICAgICA/IHsgW25hbWVzXTogZGVmYXVsdFZhbHVlIH1cbiAgICAgICAgICAgICAgICAgICAgOiBkZWZhdWx0VmFsdWUpLFxuICAgIH0sIGlzR2xvYmFsLCBkZWZhdWx0VmFsdWUpO1xuICAgIGNvbnN0IF9nZXRGaWVsZEFycmF5ID0gKG5hbWUpID0+IGNvbXBhY3QoZ2V0KF9zdGF0ZS5tb3VudCA/IF9mb3JtVmFsdWVzIDogX2RlZmF1bHRWYWx1ZXMsIG5hbWUsIF9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXIgPyBnZXQoX2RlZmF1bHRWYWx1ZXMsIG5hbWUsIFtdKSA6IFtdKSk7XG4gICAgY29uc3Qgc2V0RmllbGRWYWx1ZSA9IChuYW1lLCB2YWx1ZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICBsZXQgZmllbGRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkUmVmZXJlbmNlID0gZmllbGQuX2Y7XG4gICAgICAgICAgICBpZiAoZmllbGRSZWZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICAhZmllbGRSZWZlcmVuY2UuZGlzYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgc2V0KF9mb3JtVmFsdWVzLCBuYW1lLCBnZXRGaWVsZFZhbHVlQXModmFsdWUsIGZpZWxkUmVmZXJlbmNlKSk7XG4gICAgICAgICAgICAgICAgZmllbGRWYWx1ZSA9XG4gICAgICAgICAgICAgICAgICAgIGlzSFRNTEVsZW1lbnQoZmllbGRSZWZlcmVuY2UucmVmKSAmJiBpc051bGxPclVuZGVmaW5lZCh2YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gJydcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdmFsdWU7XG4gICAgICAgICAgICAgICAgaWYgKGlzTXVsdGlwbGVTZWxlY3QoZmllbGRSZWZlcmVuY2UucmVmKSkge1xuICAgICAgICAgICAgICAgICAgICBbLi4uZmllbGRSZWZlcmVuY2UucmVmLm9wdGlvbnNdLmZvckVhY2goKG9wdGlvblJlZikgPT4gKG9wdGlvblJlZi5zZWxlY3RlZCA9IGZpZWxkVmFsdWUuaW5jbHVkZXMob3B0aW9uUmVmLnZhbHVlKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZFJlZmVyZW5jZS5yZWZzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc0NoZWNrQm94SW5wdXQoZmllbGRSZWZlcmVuY2UucmVmKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2UucmVmcy5mb3JFYWNoKChjaGVja2JveFJlZikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tib3hSZWYuZGVmYXVsdENoZWNrZWQgfHwgIWNoZWNrYm94UmVmLmRpc2FibGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveFJlZi5jaGVja2VkID0gISFmaWVsZFZhbHVlLmZpbmQoKGRhdGEpID0+IGRhdGEgPT09IGNoZWNrYm94UmVmLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrYm94UmVmLmNoZWNrZWQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPT09IGNoZWNrYm94UmVmLnZhbHVlIHx8ICEhZmllbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2UucmVmcy5mb3JFYWNoKChyYWRpb1JlZikgPT4gKHJhZGlvUmVmLmNoZWNrZWQgPSByYWRpb1JlZi52YWx1ZSA9PT0gZmllbGRWYWx1ZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzRmlsZUlucHV0KGZpZWxkUmVmZXJlbmNlLnJlZikpIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2UucmVmLnZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZFJlZmVyZW5jZS5yZWYudmFsdWUgPSBmaWVsZFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWZpZWxkUmVmZXJlbmNlLnJlZi50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGNsb25lT2JqZWN0KF9mb3JtVmFsdWVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIChvcHRpb25zLnNob3VsZERpcnR5IHx8IG9wdGlvbnMuc2hvdWxkVG91Y2gpICYmXG4gICAgICAgICAgICB1cGRhdGVUb3VjaEFuZERpcnR5KG5hbWUsIGZpZWxkVmFsdWUsIG9wdGlvbnMuc2hvdWxkVG91Y2gsIG9wdGlvbnMuc2hvdWxkRGlydHksIHRydWUpO1xuICAgICAgICBvcHRpb25zLnNob3VsZFZhbGlkYXRlICYmIHRyaWdnZXIobmFtZSk7XG4gICAgfTtcbiAgICBjb25zdCBzZXRWYWx1ZXMgPSAobmFtZSwgdmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZEtleSBpbiB2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKCF2YWx1ZS5oYXNPd25Qcm9wZXJ0eShmaWVsZEtleSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlID0gdmFsdWVbZmllbGRLZXldO1xuICAgICAgICAgICAgY29uc3QgZmllbGROYW1lID0gbmFtZSArICcuJyArIGZpZWxkS2V5O1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoX2ZpZWxkcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgIChfbmFtZXMuYXJyYXkuaGFzKG5hbWUpIHx8XG4gICAgICAgICAgICAgICAgaXNPYmplY3QoZmllbGRWYWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAoZmllbGQgJiYgIWZpZWxkLl9mKSkgJiZcbiAgICAgICAgICAgICAgICAhaXNEYXRlT2JqZWN0KGZpZWxkVmFsdWUpXG4gICAgICAgICAgICAgICAgPyBzZXRWYWx1ZXMoZmllbGROYW1lLCBmaWVsZFZhbHVlLCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIDogc2V0RmllbGRWYWx1ZShmaWVsZE5hbWUsIGZpZWxkVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBzZXRWYWx1ZSA9IChuYW1lLCB2YWx1ZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICBjb25zdCBpc0ZpZWxkQXJyYXkgPSBfbmFtZXMuYXJyYXkuaGFzKG5hbWUpO1xuICAgICAgICBjb25zdCBjbG9uZVZhbHVlID0gY2xvbmVPYmplY3QodmFsdWUpO1xuICAgICAgICBzZXQoX2Zvcm1WYWx1ZXMsIG5hbWUsIGNsb25lVmFsdWUpO1xuICAgICAgICBpZiAoaXNGaWVsZEFycmF5KSB7XG4gICAgICAgICAgICBfc3ViamVjdHMuYXJyYXkubmV4dCh7XG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IGNsb25lT2JqZWN0KF9mb3JtVmFsdWVzKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKChfcHJveHlGb3JtU3RhdGUuaXNEaXJ0eSB8fFxuICAgICAgICAgICAgICAgIF9wcm94eUZvcm1TdGF0ZS5kaXJ0eUZpZWxkcyB8fFxuICAgICAgICAgICAgICAgIF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZS5pc0RpcnR5IHx8XG4gICAgICAgICAgICAgICAgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLmRpcnR5RmllbGRzKSAmJlxuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2hvdWxkRGlydHkpIHtcbiAgICAgICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGRpcnR5RmllbGRzOiBnZXREaXJ0eUZpZWxkcyhfZGVmYXVsdFZhbHVlcywgX2Zvcm1WYWx1ZXMpLFxuICAgICAgICAgICAgICAgICAgICBpc0RpcnR5OiBfZ2V0RGlydHkobmFtZSwgY2xvbmVWYWx1ZSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmaWVsZCAmJiAhZmllbGQuX2YgJiYgIWlzTnVsbE9yVW5kZWZpbmVkKGNsb25lVmFsdWUpXG4gICAgICAgICAgICAgICAgPyBzZXRWYWx1ZXMobmFtZSwgY2xvbmVWYWx1ZSwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICA6IHNldEZpZWxkVmFsdWUobmFtZSwgY2xvbmVWYWx1ZSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgaXNXYXRjaGVkKG5hbWUsIF9uYW1lcykgJiYgX3N1YmplY3RzLnN0YXRlLm5leHQoeyAuLi5fZm9ybVN0YXRlIH0pO1xuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICBuYW1lOiBfc3RhdGUubW91bnQgPyBuYW1lIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgdmFsdWVzOiBjbG9uZU9iamVjdChfZm9ybVZhbHVlcyksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3Qgb25DaGFuZ2UgPSBhc3luYyAoZXZlbnQpID0+IHtcbiAgICAgICAgX3N0YXRlLm1vdW50ID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICBsZXQgbmFtZSA9IHRhcmdldC5uYW1lO1xuICAgICAgICBsZXQgaXNGaWVsZFZhbHVlVXBkYXRlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICBjb25zdCBfdXBkYXRlSXNGaWVsZFZhbHVlVXBkYXRlZCA9IChmaWVsZFZhbHVlKSA9PiB7XG4gICAgICAgICAgICBpc0ZpZWxkVmFsdWVVcGRhdGVkID1cbiAgICAgICAgICAgICAgICBOdW1iZXIuaXNOYU4oZmllbGRWYWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGlzRGF0ZU9iamVjdChmaWVsZFZhbHVlKSAmJiBpc05hTihmaWVsZFZhbHVlLmdldFRpbWUoKSkpIHx8XG4gICAgICAgICAgICAgICAgICAgIGRlZXBFcXVhbChmaWVsZFZhbHVlLCBnZXQoX2Zvcm1WYWx1ZXMsIG5hbWUsIGZpZWxkVmFsdWUpKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgdmFsaWRhdGlvbk1vZGVCZWZvcmVTdWJtaXQgPSBnZXRWYWxpZGF0aW9uTW9kZXMoX29wdGlvbnMubW9kZSk7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25Nb2RlQWZ0ZXJTdWJtaXQgPSBnZXRWYWxpZGF0aW9uTW9kZXMoX29wdGlvbnMucmVWYWxpZGF0ZU1vZGUpO1xuICAgICAgICBpZiAoZmllbGQpIHtcbiAgICAgICAgICAgIGxldCBlcnJvcjtcbiAgICAgICAgICAgIGxldCBpc1ZhbGlkO1xuICAgICAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHRhcmdldC50eXBlXG4gICAgICAgICAgICAgICAgPyBnZXRGaWVsZFZhbHVlKGZpZWxkLl9mKVxuICAgICAgICAgICAgICAgIDogZ2V0RXZlbnRWYWx1ZShldmVudCk7XG4gICAgICAgICAgICBjb25zdCBpc0JsdXJFdmVudCA9IGV2ZW50LnR5cGUgPT09IEVWRU5UUy5CTFVSIHx8IGV2ZW50LnR5cGUgPT09IEVWRU5UUy5GT0NVU19PVVQ7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRTa2lwVmFsaWRhdGlvbiA9ICghaGFzVmFsaWRhdGlvbihmaWVsZC5fZikgJiZcbiAgICAgICAgICAgICAgICAhX29wdGlvbnMucmVzb2x2ZXIgJiZcbiAgICAgICAgICAgICAgICAhZ2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAgICFmaWVsZC5fZi5kZXBzKSB8fFxuICAgICAgICAgICAgICAgIHNraXBWYWxpZGF0aW9uKGlzQmx1ckV2ZW50LCBnZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKSwgX2Zvcm1TdGF0ZS5pc1N1Ym1pdHRlZCwgdmFsaWRhdGlvbk1vZGVBZnRlclN1Ym1pdCwgdmFsaWRhdGlvbk1vZGVCZWZvcmVTdWJtaXQpO1xuICAgICAgICAgICAgY29uc3Qgd2F0Y2hlZCA9IGlzV2F0Y2hlZChuYW1lLCBfbmFtZXMsIGlzQmx1ckV2ZW50KTtcbiAgICAgICAgICAgIHNldChfZm9ybVZhbHVlcywgbmFtZSwgZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAoaXNCbHVyRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5fZi5vbkJsdXIgJiYgZmllbGQuX2Yub25CbHVyKGV2ZW50KTtcbiAgICAgICAgICAgICAgICBkZWxheUVycm9yQ2FsbGJhY2sgJiYgZGVsYXlFcnJvckNhbGxiYWNrKDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmllbGQuX2Yub25DaGFuZ2UpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5fZi5vbkNoYW5nZShldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaWVsZFN0YXRlID0gdXBkYXRlVG91Y2hBbmREaXJ0eShuYW1lLCBmaWVsZFZhbHVlLCBpc0JsdXJFdmVudCk7XG4gICAgICAgICAgICBjb25zdCBzaG91bGRSZW5kZXIgPSAhaXNFbXB0eU9iamVjdChmaWVsZFN0YXRlKSB8fCB3YXRjaGVkO1xuICAgICAgICAgICAgIWlzQmx1ckV2ZW50ICYmXG4gICAgICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBldmVudC50eXBlLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGNsb25lT2JqZWN0KF9mb3JtVmFsdWVzKSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChzaG91bGRTa2lwVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgICAgIGlmIChfcHJveHlGb3JtU3RhdGUuaXNWYWxpZCB8fCBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoX29wdGlvbnMubW9kZSA9PT0gJ29uQmx1cicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0JsdXJFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9zZXRWYWxpZCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc0JsdXJFdmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3NldFZhbGlkKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIChzaG91bGRSZW5kZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoeyBuYW1lLCAuLi4od2F0Y2hlZCA/IHt9IDogZmllbGRTdGF0ZSkgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgIWlzQmx1ckV2ZW50ICYmIHdhdGNoZWQgJiYgX3N1YmplY3RzLnN0YXRlLm5leHQoeyAuLi5fZm9ybVN0YXRlIH0pO1xuICAgICAgICAgICAgaWYgKF9vcHRpb25zLnJlc29sdmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBlcnJvcnMgfSA9IGF3YWl0IF9ydW5TY2hlbWEoW25hbWVdKTtcbiAgICAgICAgICAgICAgICBfdXBkYXRlSXNGaWVsZFZhbHVlVXBkYXRlZChmaWVsZFZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNGaWVsZFZhbHVlVXBkYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0Vycm9yTG9va3VwUmVzdWx0ID0gc2NoZW1hRXJyb3JMb29rdXAoX2Zvcm1TdGF0ZS5lcnJvcnMsIF9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvckxvb2t1cFJlc3VsdCA9IHNjaGVtYUVycm9yTG9va3VwKGVycm9ycywgX2ZpZWxkcywgcHJldmlvdXNFcnJvckxvb2t1cFJlc3VsdC5uYW1lIHx8IG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGVycm9yTG9va3VwUmVzdWx0LmVycm9yO1xuICAgICAgICAgICAgICAgICAgICBuYW1lID0gZXJyb3JMb29rdXBSZXN1bHQubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGlzRW1wdHlPYmplY3QoZXJyb3JzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBfdXBkYXRlSXNWYWxpZGF0aW5nKFtuYW1lXSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZXJyb3IgPSAoYXdhaXQgdmFsaWRhdGVGaWVsZChmaWVsZCwgX25hbWVzLmRpc2FibGVkLCBfZm9ybVZhbHVlcywgc2hvdWxkRGlzcGxheUFsbEFzc29jaWF0ZWRFcnJvcnMsIF9vcHRpb25zLnNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24pKVtuYW1lXTtcbiAgICAgICAgICAgICAgICBfdXBkYXRlSXNWYWxpZGF0aW5nKFtuYW1lXSk7XG4gICAgICAgICAgICAgICAgX3VwZGF0ZUlzRmllbGRWYWx1ZVVwZGF0ZWQoZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRmllbGRWYWx1ZVVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZS5pc1ZhbGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1ZhbGlkID0gYXdhaXQgZXhlY3V0ZUJ1aWx0SW5WYWxpZGF0aW9uKF9maWVsZHMsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzRmllbGRWYWx1ZVVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5fZi5kZXBzICYmXG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXIoZmllbGQuX2YuZGVwcyk7XG4gICAgICAgICAgICAgICAgc2hvdWxkUmVuZGVyQnlFcnJvcihuYW1lLCBpc1ZhbGlkLCBlcnJvciwgZmllbGRTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IF9mb2N1c0lucHV0ID0gKHJlZiwga2V5KSA9PiB7XG4gICAgICAgIGlmIChnZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIGtleSkgJiYgcmVmLmZvY3VzKSB7XG4gICAgICAgICAgICByZWYuZm9jdXMoKTtcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9O1xuICAgIGNvbnN0IHRyaWdnZXIgPSBhc3luYyAobmFtZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGxldCBpc1ZhbGlkO1xuICAgICAgICBsZXQgdmFsaWRhdGlvblJlc3VsdDtcbiAgICAgICAgY29uc3QgZmllbGROYW1lcyA9IGNvbnZlcnRUb0FycmF5UGF5bG9hZChuYW1lKTtcbiAgICAgICAgaWYgKF9vcHRpb25zLnJlc29sdmVyKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBhd2FpdCBleGVjdXRlU2NoZW1hQW5kVXBkYXRlU3RhdGUoaXNVbmRlZmluZWQobmFtZSkgPyBuYW1lIDogZmllbGROYW1lcyk7XG4gICAgICAgICAgICBpc1ZhbGlkID0gaXNFbXB0eU9iamVjdChlcnJvcnMpO1xuICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdCA9IG5hbWVcbiAgICAgICAgICAgICAgICA/ICFmaWVsZE5hbWVzLnNvbWUoKG5hbWUpID0+IGdldChlcnJvcnMsIG5hbWUpKVxuICAgICAgICAgICAgICAgIDogaXNWYWxpZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChuYW1lKSB7XG4gICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0ID0gKGF3YWl0IFByb21pc2UuYWxsKGZpZWxkTmFtZXMubWFwKGFzeW5jIChmaWVsZE5hbWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCBleGVjdXRlQnVpbHRJblZhbGlkYXRpb24oZmllbGQgJiYgZmllbGQuX2YgPyB7IFtmaWVsZE5hbWVdOiBmaWVsZCB9IDogZmllbGQpO1xuICAgICAgICAgICAgfSkpKS5ldmVyeShCb29sZWFuKTtcbiAgICAgICAgICAgICEoIXZhbGlkYXRpb25SZXN1bHQgJiYgIV9mb3JtU3RhdGUuaXNWYWxpZCkgJiYgX3NldFZhbGlkKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0ID0gaXNWYWxpZCA9IGF3YWl0IGV4ZWN1dGVCdWlsdEluVmFsaWRhdGlvbihfZmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAuLi4oIWlzU3RyaW5nKG5hbWUpIHx8XG4gICAgICAgICAgICAgICAgKChfcHJveHlGb3JtU3RhdGUuaXNWYWxpZCB8fCBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuaXNWYWxpZCkgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCAhPT0gX2Zvcm1TdGF0ZS5pc1ZhbGlkKVxuICAgICAgICAgICAgICAgID8ge31cbiAgICAgICAgICAgICAgICA6IHsgbmFtZSB9KSxcbiAgICAgICAgICAgIC4uLihfb3B0aW9ucy5yZXNvbHZlciB8fCAhbmFtZSA/IHsgaXNWYWxpZCB9IDoge30pLFxuICAgICAgICAgICAgZXJyb3JzOiBfZm9ybVN0YXRlLmVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICAgIG9wdGlvbnMuc2hvdWxkRm9jdXMgJiZcbiAgICAgICAgICAgICF2YWxpZGF0aW9uUmVzdWx0ICYmXG4gICAgICAgICAgICBpdGVyYXRlRmllbGRzQnlBY3Rpb24oX2ZpZWxkcywgX2ZvY3VzSW5wdXQsIG5hbWUgPyBmaWVsZE5hbWVzIDogX25hbWVzLm1vdW50KTtcbiAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQ7XG4gICAgfTtcbiAgICBjb25zdCBnZXRWYWx1ZXMgPSAoZmllbGROYW1lcykgPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB7XG4gICAgICAgICAgICAuLi4oX3N0YXRlLm1vdW50ID8gX2Zvcm1WYWx1ZXMgOiBfZGVmYXVsdFZhbHVlcyksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpc1VuZGVmaW5lZChmaWVsZE5hbWVzKVxuICAgICAgICAgICAgPyB2YWx1ZXNcbiAgICAgICAgICAgIDogaXNTdHJpbmcoZmllbGROYW1lcylcbiAgICAgICAgICAgICAgICA/IGdldCh2YWx1ZXMsIGZpZWxkTmFtZXMpXG4gICAgICAgICAgICAgICAgOiBmaWVsZE5hbWVzLm1hcCgobmFtZSkgPT4gZ2V0KHZhbHVlcywgbmFtZSkpO1xuICAgIH07XG4gICAgY29uc3QgZ2V0RmllbGRTdGF0ZSA9IChuYW1lLCBmb3JtU3RhdGUpID0+ICh7XG4gICAgICAgIGludmFsaWQ6ICEhZ2V0KChmb3JtU3RhdGUgfHwgX2Zvcm1TdGF0ZSkuZXJyb3JzLCBuYW1lKSxcbiAgICAgICAgaXNEaXJ0eTogISFnZXQoKGZvcm1TdGF0ZSB8fCBfZm9ybVN0YXRlKS5kaXJ0eUZpZWxkcywgbmFtZSksXG4gICAgICAgIGVycm9yOiBnZXQoKGZvcm1TdGF0ZSB8fCBfZm9ybVN0YXRlKS5lcnJvcnMsIG5hbWUpLFxuICAgICAgICBpc1ZhbGlkYXRpbmc6ICEhZ2V0KF9mb3JtU3RhdGUudmFsaWRhdGluZ0ZpZWxkcywgbmFtZSksXG4gICAgICAgIGlzVG91Y2hlZDogISFnZXQoKGZvcm1TdGF0ZSB8fCBfZm9ybVN0YXRlKS50b3VjaGVkRmllbGRzLCBuYW1lKSxcbiAgICB9KTtcbiAgICBjb25zdCBjbGVhckVycm9ycyA9IChuYW1lKSA9PiB7XG4gICAgICAgIG5hbWUgJiZcbiAgICAgICAgICAgIGNvbnZlcnRUb0FycmF5UGF5bG9hZChuYW1lKS5mb3JFYWNoKChpbnB1dE5hbWUpID0+IHVuc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBpbnB1dE5hbWUpKTtcbiAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgZXJyb3JzOiBuYW1lID8gX2Zvcm1TdGF0ZS5lcnJvcnMgOiB7fSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBzZXRFcnJvciA9IChuYW1lLCBlcnJvciwgb3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCByZWYgPSAoZ2V0KF9maWVsZHMsIG5hbWUsIHsgX2Y6IHt9IH0pLl9mIHx8IHt9KS5yZWY7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFcnJvciA9IGdldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSkgfHwge307XG4gICAgICAgIC8vIERvbid0IG92ZXJyaWRlIGV4aXN0aW5nIGVycm9yIG1lc3NhZ2VzIGVsc2V3aGVyZSBpbiB0aGUgb2JqZWN0IHRyZWUuXG4gICAgICAgIGNvbnN0IHsgcmVmOiBjdXJyZW50UmVmLCBtZXNzYWdlLCB0eXBlLCAuLi5yZXN0T2ZFcnJvclRyZWUgfSA9IGN1cnJlbnRFcnJvcjtcbiAgICAgICAgc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lLCB7XG4gICAgICAgICAgICAuLi5yZXN0T2ZFcnJvclRyZWUsXG4gICAgICAgICAgICAuLi5lcnJvcixcbiAgICAgICAgICAgIHJlZixcbiAgICAgICAgfSk7XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBlcnJvcnM6IF9mb3JtU3RhdGUuZXJyb3JzLFxuICAgICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgICAgICBvcHRpb25zICYmIG9wdGlvbnMuc2hvdWxkRm9jdXMgJiYgcmVmICYmIHJlZi5mb2N1cyAmJiByZWYuZm9jdXMoKTtcbiAgICB9O1xuICAgIGNvbnN0IHdhdGNoID0gKG5hbWUsIGRlZmF1bHRWYWx1ZSkgPT4gaXNGdW5jdGlvbihuYW1lKVxuICAgICAgICA/IF9zdWJqZWN0cy5zdGF0ZS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgbmV4dDogKHBheWxvYWQpID0+IG5hbWUoX2dldFdhdGNoKHVuZGVmaW5lZCwgZGVmYXVsdFZhbHVlKSwgcGF5bG9hZCksXG4gICAgICAgIH0pXG4gICAgICAgIDogX2dldFdhdGNoKG5hbWUsIGRlZmF1bHRWYWx1ZSwgdHJ1ZSk7XG4gICAgY29uc3QgX3N1YnNjcmliZSA9IChwcm9wcykgPT4gX3N1YmplY3RzLnN0YXRlLnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6IChmb3JtU3RhdGUpID0+IHtcbiAgICAgICAgICAgIGlmIChzaG91bGRTdWJzY3JpYmVCeU5hbWUocHJvcHMubmFtZSwgZm9ybVN0YXRlLm5hbWUsIHByb3BzLmV4YWN0KSAmJlxuICAgICAgICAgICAgICAgIHNob3VsZFJlbmRlckZvcm1TdGF0ZShmb3JtU3RhdGUsIHByb3BzLmZvcm1TdGF0ZSB8fCBfcHJveHlGb3JtU3RhdGUsIF9zZXRGb3JtU3RhdGUsIHByb3BzLnJlUmVuZGVyUm9vdCkpIHtcbiAgICAgICAgICAgICAgICBwcm9wcy5jYWxsYmFjayh7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczogeyAuLi5fZm9ybVZhbHVlcyB9LFxuICAgICAgICAgICAgICAgICAgICAuLi5fZm9ybVN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAuLi5mb3JtU3RhdGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSkudW5zdWJzY3JpYmU7XG4gICAgY29uc3Qgc3Vic2NyaWJlID0gKHByb3BzKSA9PiB7XG4gICAgICAgIF9zdGF0ZS5tb3VudCA9IHRydWU7XG4gICAgICAgIF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZSA9IHtcbiAgICAgICAgICAgIC4uLl9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZSxcbiAgICAgICAgICAgIC4uLnByb3BzLmZvcm1TdGF0ZSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIF9zdWJzY3JpYmUoe1xuICAgICAgICAgICAgLi4ucHJvcHMsXG4gICAgICAgICAgICBmb3JtU3RhdGU6IF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCB1bnJlZ2lzdGVyID0gKG5hbWUsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBvZiBuYW1lID8gY29udmVydFRvQXJyYXlQYXlsb2FkKG5hbWUpIDogX25hbWVzLm1vdW50KSB7XG4gICAgICAgICAgICBfbmFtZXMubW91bnQuZGVsZXRlKGZpZWxkTmFtZSk7XG4gICAgICAgICAgICBfbmFtZXMuYXJyYXkuZGVsZXRlKGZpZWxkTmFtZSk7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMua2VlcFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdW5zZXQoX2ZpZWxkcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgICAgICB1bnNldChfZm9ybVZhbHVlcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICFvcHRpb25zLmtlZXBFcnJvciAmJiB1bnNldChfZm9ybVN0YXRlLmVycm9ycywgZmllbGROYW1lKTtcbiAgICAgICAgICAgICFvcHRpb25zLmtlZXBEaXJ0eSAmJiB1bnNldChfZm9ybVN0YXRlLmRpcnR5RmllbGRzLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgIW9wdGlvbnMua2VlcFRvdWNoZWQgJiYgdW5zZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBmaWVsZE5hbWUpO1xuICAgICAgICAgICAgIW9wdGlvbnMua2VlcElzVmFsaWRhdGluZyAmJlxuICAgICAgICAgICAgICAgIHVuc2V0KF9mb3JtU3RhdGUudmFsaWRhdGluZ0ZpZWxkcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgICFfb3B0aW9ucy5zaG91bGRVbnJlZ2lzdGVyICYmXG4gICAgICAgICAgICAgICAgIW9wdGlvbnMua2VlcERlZmF1bHRWYWx1ZSAmJlxuICAgICAgICAgICAgICAgIHVuc2V0KF9kZWZhdWx0VmFsdWVzLCBmaWVsZE5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIHZhbHVlczogY2xvbmVPYmplY3QoX2Zvcm1WYWx1ZXMpLFxuICAgICAgICB9KTtcbiAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgLi4uX2Zvcm1TdGF0ZSxcbiAgICAgICAgICAgIC4uLighb3B0aW9ucy5rZWVwRGlydHkgPyB7fSA6IHsgaXNEaXJ0eTogX2dldERpcnR5KCkgfSksXG4gICAgICAgIH0pO1xuICAgICAgICAhb3B0aW9ucy5rZWVwSXNWYWxpZCAmJiBfc2V0VmFsaWQoKTtcbiAgICB9O1xuICAgIGNvbnN0IF9zZXREaXNhYmxlZEZpZWxkID0gKHsgZGlzYWJsZWQsIG5hbWUsIH0pID0+IHtcbiAgICAgICAgaWYgKChpc0Jvb2xlYW4oZGlzYWJsZWQpICYmIF9zdGF0ZS5tb3VudCkgfHxcbiAgICAgICAgICAgICEhZGlzYWJsZWQgfHxcbiAgICAgICAgICAgIF9uYW1lcy5kaXNhYmxlZC5oYXMobmFtZSkpIHtcbiAgICAgICAgICAgIGRpc2FibGVkID8gX25hbWVzLmRpc2FibGVkLmFkZChuYW1lKSA6IF9uYW1lcy5kaXNhYmxlZC5kZWxldGUobmFtZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHJlZ2lzdGVyID0gKG5hbWUsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBsZXQgZmllbGQgPSBnZXQoX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgIGNvbnN0IGRpc2FibGVkSXNEZWZpbmVkID0gaXNCb29sZWFuKG9wdGlvbnMuZGlzYWJsZWQpIHx8IGlzQm9vbGVhbihfb3B0aW9ucy5kaXNhYmxlZCk7XG4gICAgICAgIHNldChfZmllbGRzLCBuYW1lLCB7XG4gICAgICAgICAgICAuLi4oZmllbGQgfHwge30pLFxuICAgICAgICAgICAgX2Y6IHtcbiAgICAgICAgICAgICAgICAuLi4oZmllbGQgJiYgZmllbGQuX2YgPyBmaWVsZC5fZiA6IHsgcmVmOiB7IG5hbWUgfSB9KSxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgIG1vdW50OiB0cnVlLFxuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgX25hbWVzLm1vdW50LmFkZChuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICBfc2V0RGlzYWJsZWRGaWVsZCh7XG4gICAgICAgICAgICAgICAgZGlzYWJsZWQ6IGlzQm9vbGVhbihvcHRpb25zLmRpc2FibGVkKVxuICAgICAgICAgICAgICAgICAgICA/IG9wdGlvbnMuZGlzYWJsZWRcbiAgICAgICAgICAgICAgICAgICAgOiBfb3B0aW9ucy5kaXNhYmxlZCxcbiAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1cGRhdGVWYWxpZEFuZFZhbHVlKG5hbWUsIHRydWUsIG9wdGlvbnMudmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi4oZGlzYWJsZWRJc0RlZmluZWRcbiAgICAgICAgICAgICAgICA/IHsgZGlzYWJsZWQ6IG9wdGlvbnMuZGlzYWJsZWQgfHwgX29wdGlvbnMuZGlzYWJsZWQgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgLi4uKF9vcHRpb25zLnByb2dyZXNzaXZlXG4gICAgICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkOiAhIW9wdGlvbnMucmVxdWlyZWQsXG4gICAgICAgICAgICAgICAgICAgIG1pbjogZ2V0UnVsZVZhbHVlKG9wdGlvbnMubWluKSxcbiAgICAgICAgICAgICAgICAgICAgbWF4OiBnZXRSdWxlVmFsdWUob3B0aW9ucy5tYXgpLFxuICAgICAgICAgICAgICAgICAgICBtaW5MZW5ndGg6IGdldFJ1bGVWYWx1ZShvcHRpb25zLm1pbkxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgIG1heExlbmd0aDogZ2V0UnVsZVZhbHVlKG9wdGlvbnMubWF4TGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybjogZ2V0UnVsZVZhbHVlKG9wdGlvbnMucGF0dGVybiksXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIG9uQ2hhbmdlLFxuICAgICAgICAgICAgb25CbHVyOiBvbkNoYW5nZSxcbiAgICAgICAgICAgIHJlZjogKHJlZikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIobmFtZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZFJlZiA9IGlzVW5kZWZpbmVkKHJlZi52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcmVmLnF1ZXJ5U2VsZWN0b3JBbGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHJlZi5xdWVyeVNlbGVjdG9yQWxsKCdpbnB1dCxzZWxlY3QsdGV4dGFyZWEnKVswXSB8fCByZWZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlZlxuICAgICAgICAgICAgICAgICAgICAgICAgOiByZWY7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhZGlvT3JDaGVja2JveCA9IGlzUmFkaW9PckNoZWNrYm94KGZpZWxkUmVmKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVmcyA9IGZpZWxkLl9mLnJlZnMgfHwgW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChyYWRpb09yQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgID8gcmVmcy5maW5kKChvcHRpb24pID0+IG9wdGlvbiA9PT0gZmllbGRSZWYpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGZpZWxkUmVmID09PSBmaWVsZC5fZi5yZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXQoX2ZpZWxkcywgbmFtZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgX2Y6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5maWVsZC5fZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4ocmFkaW9PckNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmczogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlZnMuZmlsdGVyKGxpdmUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkUmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihBcnJheS5pc0FycmF5KGdldChfZGVmYXVsdFZhbHVlcywgbmFtZSkpID8gW3t9XSA6IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY6IHsgdHlwZTogZmllbGRSZWYudHlwZSwgbmFtZSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogeyByZWY6IGZpZWxkUmVmIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVZhbGlkQW5kVmFsdWUobmFtZSwgZmFsc2UsIHVuZGVmaW5lZCwgZmllbGRSZWYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBnZXQoX2ZpZWxkcywgbmFtZSwge30pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQuX2YpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLl9mLm1vdW50ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKF9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXIgfHwgb3B0aW9ucy5zaG91bGRVbnJlZ2lzdGVyKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIShpc05hbWVJbkZpZWxkQXJyYXkoX25hbWVzLmFycmF5LCBuYW1lKSAmJiBfc3RhdGUuYWN0aW9uKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgX25hbWVzLnVuTW91bnQuYWRkKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCBfZm9jdXNFcnJvciA9ICgpID0+IF9vcHRpb25zLnNob3VsZEZvY3VzRXJyb3IgJiZcbiAgICAgICAgaXRlcmF0ZUZpZWxkc0J5QWN0aW9uKF9maWVsZHMsIF9mb2N1c0lucHV0LCBfbmFtZXMubW91bnQpO1xuICAgIGNvbnN0IF9kaXNhYmxlRm9ybSA9IChkaXNhYmxlZCkgPT4ge1xuICAgICAgICBpZiAoaXNCb29sZWFuKGRpc2FibGVkKSkge1xuICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoeyBkaXNhYmxlZCB9KTtcbiAgICAgICAgICAgIGl0ZXJhdGVGaWVsZHNCeUFjdGlvbihfZmllbGRzLCAocmVmLCBuYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmLmRpc2FibGVkID0gY3VycmVudEZpZWxkLl9mLmRpc2FibGVkIHx8IGRpc2FibGVkO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50RmllbGQuX2YucmVmcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGaWVsZC5fZi5yZWZzLmZvckVhY2goKGlucHV0UmVmKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRSZWYuZGlzYWJsZWQgPSBjdXJyZW50RmllbGQuX2YuZGlzYWJsZWQgfHwgZGlzYWJsZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIDAsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgaGFuZGxlU3VibWl0ID0gKG9uVmFsaWQsIG9uSW52YWxpZCkgPT4gYXN5bmMgKGUpID0+IHtcbiAgICAgICAgbGV0IG9uVmFsaWRFcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGUpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQgJiYgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5wZXJzaXN0ICYmXG4gICAgICAgICAgICAgICAgZS5wZXJzaXN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpZWxkVmFsdWVzID0gY2xvbmVPYmplY3QoX2Zvcm1WYWx1ZXMpO1xuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICBpc1N1Ym1pdHRpbmc6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoX29wdGlvbnMucmVzb2x2ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZXJyb3JzLCB2YWx1ZXMgfSA9IGF3YWl0IF9ydW5TY2hlbWEoKTtcbiAgICAgICAgICAgIF9mb3JtU3RhdGUuZXJyb3JzID0gZXJyb3JzO1xuICAgICAgICAgICAgZmllbGRWYWx1ZXMgPSBjbG9uZU9iamVjdCh2YWx1ZXMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYXdhaXQgZXhlY3V0ZUJ1aWx0SW5WYWxpZGF0aW9uKF9maWVsZHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfbmFtZXMuZGlzYWJsZWQuc2l6ZSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIF9uYW1lcy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIHVuc2V0KGZpZWxkVmFsdWVzLCBuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB1bnNldChfZm9ybVN0YXRlLmVycm9ycywgJ3Jvb3QnKTtcbiAgICAgICAgaWYgKGlzRW1wdHlPYmplY3QoX2Zvcm1TdGF0ZS5lcnJvcnMpKSB7XG4gICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgZXJyb3JzOiB7fSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhd2FpdCBvblZhbGlkKGZpZWxkVmFsdWVzLCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIG9uVmFsaWRFcnJvciA9IGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKG9uSW52YWxpZCkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG9uSW52YWxpZCh7IC4uLl9mb3JtU3RhdGUuZXJyb3JzIH0sIGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2ZvY3VzRXJyb3IoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoX2ZvY3VzRXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIGlzU3VibWl0dGVkOiB0cnVlLFxuICAgICAgICAgICAgaXNTdWJtaXR0aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlzU3VibWl0U3VjY2Vzc2Z1bDogaXNFbXB0eU9iamVjdChfZm9ybVN0YXRlLmVycm9ycykgJiYgIW9uVmFsaWRFcnJvcixcbiAgICAgICAgICAgIHN1Ym1pdENvdW50OiBfZm9ybVN0YXRlLnN1Ym1pdENvdW50ICsgMSxcbiAgICAgICAgICAgIGVycm9yczogX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAob25WYWxpZEVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBvblZhbGlkRXJyb3I7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHJlc2V0RmllbGQgPSAobmFtZSwgb3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGlmIChnZXQoX2ZpZWxkcywgbmFtZSkpIHtcbiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChvcHRpb25zLmRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBzZXRWYWx1ZShuYW1lLCBjbG9uZU9iamVjdChnZXQoX2RlZmF1bHRWYWx1ZXMsIG5hbWUpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZXRWYWx1ZShuYW1lLCBvcHRpb25zLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgc2V0KF9kZWZhdWx0VmFsdWVzLCBuYW1lLCBjbG9uZU9iamVjdChvcHRpb25zLmRlZmF1bHRWYWx1ZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmtlZXBUb3VjaGVkKSB7XG4gICAgICAgICAgICAgICAgdW5zZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5rZWVwRGlydHkpIHtcbiAgICAgICAgICAgICAgICB1bnNldChfZm9ybVN0YXRlLmRpcnR5RmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICBfZm9ybVN0YXRlLmlzRGlydHkgPSBvcHRpb25zLmRlZmF1bHRWYWx1ZVxuICAgICAgICAgICAgICAgICAgICA/IF9nZXREaXJ0eShuYW1lLCBjbG9uZU9iamVjdChnZXQoX2RlZmF1bHRWYWx1ZXMsIG5hbWUpKSlcbiAgICAgICAgICAgICAgICAgICAgOiBfZ2V0RGlydHkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5rZWVwRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB1bnNldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICAgICAgX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWQgJiYgX3NldFZhbGlkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7IC4uLl9mb3JtU3RhdGUgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IF9yZXNldCA9IChmb3JtVmFsdWVzLCBrZWVwU3RhdGVPcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZFZhbHVlcyA9IGZvcm1WYWx1ZXMgPyBjbG9uZU9iamVjdChmb3JtVmFsdWVzKSA6IF9kZWZhdWx0VmFsdWVzO1xuICAgICAgICBjb25zdCBjbG9uZVVwZGF0ZWRWYWx1ZXMgPSBjbG9uZU9iamVjdCh1cGRhdGVkVmFsdWVzKTtcbiAgICAgICAgY29uc3QgaXNFbXB0eVJlc2V0VmFsdWVzID0gaXNFbXB0eU9iamVjdChmb3JtVmFsdWVzKTtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gaXNFbXB0eVJlc2V0VmFsdWVzID8gX2RlZmF1bHRWYWx1ZXMgOiBjbG9uZVVwZGF0ZWRWYWx1ZXM7XG4gICAgICAgIGlmICgha2VlcFN0YXRlT3B0aW9ucy5rZWVwRGVmYXVsdFZhbHVlcykge1xuICAgICAgICAgICAgX2RlZmF1bHRWYWx1ZXMgPSB1cGRhdGVkVmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIGlmICgha2VlcFN0YXRlT3B0aW9ucy5rZWVwVmFsdWVzKSB7XG4gICAgICAgICAgICBpZiAoa2VlcFN0YXRlT3B0aW9ucy5rZWVwRGlydHlWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZHNUb0NoZWNrID0gbmV3IFNldChbXG4gICAgICAgICAgICAgICAgICAgIC4uLl9uYW1lcy5tb3VudCxcbiAgICAgICAgICAgICAgICAgICAgLi4uT2JqZWN0LmtleXMoZ2V0RGlydHlGaWVsZHMoX2RlZmF1bHRWYWx1ZXMsIF9mb3JtVmFsdWVzKSksXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZE5hbWUgb2YgQXJyYXkuZnJvbShmaWVsZHNUb0NoZWNrKSkge1xuICAgICAgICAgICAgICAgICAgICBnZXQoX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkcywgZmllbGROYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBzZXQodmFsdWVzLCBmaWVsZE5hbWUsIGdldChfZm9ybVZhbHVlcywgZmllbGROYW1lKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogc2V0VmFsdWUoZmllbGROYW1lLCBnZXQodmFsdWVzLCBmaWVsZE5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNXZWIgJiYgaXNVbmRlZmluZWQoZm9ybVZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIF9uYW1lcy5tb3VudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGQgJiYgZmllbGQuX2YpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZFJlZmVyZW5jZSA9IEFycmF5LmlzQXJyYXkoZmllbGQuX2YucmVmcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBmaWVsZC5fZi5yZWZzWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmllbGQuX2YucmVmO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0hUTUxFbGVtZW50KGZpZWxkUmVmZXJlbmNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtID0gZmllbGRSZWZlcmVuY2UuY2xvc2VzdCgnZm9ybScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGtlZXBTdGF0ZU9wdGlvbnMua2VlcEZpZWxkc1JlZikge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpZWxkTmFtZSBvZiBfbmFtZXMubW91bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlKGZpZWxkTmFtZSwgZ2V0KHZhbHVlcywgZmllbGROYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9maWVsZHMgPSB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfZm9ybVZhbHVlcyA9IF9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXJcbiAgICAgICAgICAgICAgICA/IGtlZXBTdGF0ZU9wdGlvbnMua2VlcERlZmF1bHRWYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgPyBjbG9uZU9iamVjdChfZGVmYXVsdFZhbHVlcylcbiAgICAgICAgICAgICAgICAgICAgOiB7fVxuICAgICAgICAgICAgICAgIDogY2xvbmVPYmplY3QodmFsdWVzKTtcbiAgICAgICAgICAgIF9zdWJqZWN0cy5hcnJheS5uZXh0KHtcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IHsgLi4udmFsdWVzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICB2YWx1ZXM6IHsgLi4udmFsdWVzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBfbmFtZXMgPSB7XG4gICAgICAgICAgICBtb3VudDoga2VlcFN0YXRlT3B0aW9ucy5rZWVwRGlydHlWYWx1ZXMgPyBfbmFtZXMubW91bnQgOiBuZXcgU2V0KCksXG4gICAgICAgICAgICB1bk1vdW50OiBuZXcgU2V0KCksXG4gICAgICAgICAgICBhcnJheTogbmV3IFNldCgpLFxuICAgICAgICAgICAgZGlzYWJsZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgICAgIHdhdGNoOiBuZXcgU2V0KCksXG4gICAgICAgICAgICB3YXRjaEFsbDogZmFsc2UsXG4gICAgICAgICAgICBmb2N1czogJycsXG4gICAgICAgIH07XG4gICAgICAgIF9zdGF0ZS5tb3VudCA9XG4gICAgICAgICAgICAhX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWQgfHxcbiAgICAgICAgICAgICAgICAhIWtlZXBTdGF0ZU9wdGlvbnMua2VlcElzVmFsaWQgfHxcbiAgICAgICAgICAgICAgICAhIWtlZXBTdGF0ZU9wdGlvbnMua2VlcERpcnR5VmFsdWVzO1xuICAgICAgICBfc3RhdGUud2F0Y2ggPSAhIV9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXI7XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIHN1Ym1pdENvdW50OiBrZWVwU3RhdGVPcHRpb25zLmtlZXBTdWJtaXRDb3VudFxuICAgICAgICAgICAgICAgID8gX2Zvcm1TdGF0ZS5zdWJtaXRDb3VudFxuICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgIGlzRGlydHk6IGlzRW1wdHlSZXNldFZhbHVlc1xuICAgICAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgICAgICA6IGtlZXBTdGF0ZU9wdGlvbnMua2VlcERpcnR5XG4gICAgICAgICAgICAgICAgICAgID8gX2Zvcm1TdGF0ZS5pc0RpcnR5XG4gICAgICAgICAgICAgICAgICAgIDogISEoa2VlcFN0YXRlT3B0aW9ucy5rZWVwRGVmYXVsdFZhbHVlcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgIWRlZXBFcXVhbChmb3JtVmFsdWVzLCBfZGVmYXVsdFZhbHVlcykpLFxuICAgICAgICAgICAgaXNTdWJtaXR0ZWQ6IGtlZXBTdGF0ZU9wdGlvbnMua2VlcElzU3VibWl0dGVkXG4gICAgICAgICAgICAgICAgPyBfZm9ybVN0YXRlLmlzU3VibWl0dGVkXG4gICAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIGRpcnR5RmllbGRzOiBpc0VtcHR5UmVzZXRWYWx1ZXNcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBEaXJ0eVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICA/IGtlZXBTdGF0ZU9wdGlvbnMua2VlcERlZmF1bHRWYWx1ZXMgJiYgX2Zvcm1WYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgID8gZ2V0RGlydHlGaWVsZHMoX2RlZmF1bHRWYWx1ZXMsIF9mb3JtVmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBfZm9ybVN0YXRlLmRpcnR5RmllbGRzXG4gICAgICAgICAgICAgICAgICAgIDoga2VlcFN0YXRlT3B0aW9ucy5rZWVwRGVmYXVsdFZhbHVlcyAmJiBmb3JtVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGdldERpcnR5RmllbGRzKF9kZWZhdWx0VmFsdWVzLCBmb3JtVmFsdWVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBEaXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoge30sXG4gICAgICAgICAgICB0b3VjaGVkRmllbGRzOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBUb3VjaGVkXG4gICAgICAgICAgICAgICAgPyBfZm9ybVN0YXRlLnRvdWNoZWRGaWVsZHNcbiAgICAgICAgICAgICAgICA6IHt9LFxuICAgICAgICAgICAgZXJyb3JzOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBFcnJvcnMgPyBfZm9ybVN0YXRlLmVycm9ycyA6IHt9LFxuICAgICAgICAgICAgaXNTdWJtaXRTdWNjZXNzZnVsOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBJc1N1Ym1pdFN1Y2Nlc3NmdWxcbiAgICAgICAgICAgICAgICA/IF9mb3JtU3RhdGUuaXNTdWJtaXRTdWNjZXNzZnVsXG4gICAgICAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIGlzU3VibWl0dGluZzogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgcmVzZXQgPSAoZm9ybVZhbHVlcywga2VlcFN0YXRlT3B0aW9ucykgPT4gX3Jlc2V0KGlzRnVuY3Rpb24oZm9ybVZhbHVlcylcbiAgICAgICAgPyBmb3JtVmFsdWVzKF9mb3JtVmFsdWVzKVxuICAgICAgICA6IGZvcm1WYWx1ZXMsIGtlZXBTdGF0ZU9wdGlvbnMpO1xuICAgIGNvbnN0IHNldEZvY3VzID0gKG5hbWUsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgY29uc3QgZmllbGRSZWZlcmVuY2UgPSBmaWVsZCAmJiBmaWVsZC5fZjtcbiAgICAgICAgaWYgKGZpZWxkUmVmZXJlbmNlKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFJlZiA9IGZpZWxkUmVmZXJlbmNlLnJlZnNcbiAgICAgICAgICAgICAgICA/IGZpZWxkUmVmZXJlbmNlLnJlZnNbMF1cbiAgICAgICAgICAgICAgICA6IGZpZWxkUmVmZXJlbmNlLnJlZjtcbiAgICAgICAgICAgIGlmIChmaWVsZFJlZi5mb2N1cykge1xuICAgICAgICAgICAgICAgIGZpZWxkUmVmLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5zaG91bGRTZWxlY3QgJiZcbiAgICAgICAgICAgICAgICAgICAgaXNGdW5jdGlvbihmaWVsZFJlZi5zZWxlY3QpICYmXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkUmVmLnNlbGVjdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBfc2V0Rm9ybVN0YXRlID0gKHVwZGF0ZWRGb3JtU3RhdGUpID0+IHtcbiAgICAgICAgX2Zvcm1TdGF0ZSA9IHtcbiAgICAgICAgICAgIC4uLl9mb3JtU3RhdGUsXG4gICAgICAgICAgICAuLi51cGRhdGVkRm9ybVN0YXRlLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgX3Jlc2V0RGVmYXVsdFZhbHVlcyA9ICgpID0+IGlzRnVuY3Rpb24oX29wdGlvbnMuZGVmYXVsdFZhbHVlcykgJiZcbiAgICAgICAgX29wdGlvbnMuZGVmYXVsdFZhbHVlcygpLnRoZW4oKHZhbHVlcykgPT4ge1xuICAgICAgICAgICAgcmVzZXQodmFsdWVzLCBfb3B0aW9ucy5yZXNldE9wdGlvbnMpO1xuICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgY29uc3QgbWV0aG9kcyA9IHtcbiAgICAgICAgY29udHJvbDoge1xuICAgICAgICAgICAgcmVnaXN0ZXIsXG4gICAgICAgICAgICB1bnJlZ2lzdGVyLFxuICAgICAgICAgICAgZ2V0RmllbGRTdGF0ZSxcbiAgICAgICAgICAgIGhhbmRsZVN1Ym1pdCxcbiAgICAgICAgICAgIHNldEVycm9yLFxuICAgICAgICAgICAgX3N1YnNjcmliZSxcbiAgICAgICAgICAgIF9ydW5TY2hlbWEsXG4gICAgICAgICAgICBfZm9jdXNFcnJvcixcbiAgICAgICAgICAgIF9nZXRXYXRjaCxcbiAgICAgICAgICAgIF9nZXREaXJ0eSxcbiAgICAgICAgICAgIF9zZXRWYWxpZCxcbiAgICAgICAgICAgIF9zZXRGaWVsZEFycmF5LFxuICAgICAgICAgICAgX3NldERpc2FibGVkRmllbGQsXG4gICAgICAgICAgICBfc2V0RXJyb3JzLFxuICAgICAgICAgICAgX2dldEZpZWxkQXJyYXksXG4gICAgICAgICAgICBfcmVzZXQsXG4gICAgICAgICAgICBfcmVzZXREZWZhdWx0VmFsdWVzLFxuICAgICAgICAgICAgX3JlbW92ZVVubW91bnRlZCxcbiAgICAgICAgICAgIF9kaXNhYmxlRm9ybSxcbiAgICAgICAgICAgIF9zdWJqZWN0cyxcbiAgICAgICAgICAgIF9wcm94eUZvcm1TdGF0ZSxcbiAgICAgICAgICAgIGdldCBfZmllbGRzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZmllbGRzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBfZm9ybVZhbHVlcygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2Zvcm1WYWx1ZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IF9zdGF0ZSgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX3N0YXRlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldCBfc3RhdGUodmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfc3RhdGUgPSB2YWx1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgX2RlZmF1bHRWYWx1ZXMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0VmFsdWVzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBfbmFtZXMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9uYW1lcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQgX25hbWVzKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX25hbWVzID0gdmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IF9mb3JtU3RhdGUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mb3JtU3RhdGU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IF9vcHRpb25zKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfb3B0aW9ucztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQgX29wdGlvbnModmFsdWUpIHtcbiAgICAgICAgICAgICAgICBfb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgLi4uX29wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIC4uLnZhbHVlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIHRyaWdnZXIsXG4gICAgICAgIHJlZ2lzdGVyLFxuICAgICAgICBoYW5kbGVTdWJtaXQsXG4gICAgICAgIHdhdGNoLFxuICAgICAgICBzZXRWYWx1ZSxcbiAgICAgICAgZ2V0VmFsdWVzLFxuICAgICAgICByZXNldCxcbiAgICAgICAgcmVzZXRGaWVsZCxcbiAgICAgICAgY2xlYXJFcnJvcnMsXG4gICAgICAgIHVucmVnaXN0ZXIsXG4gICAgICAgIHNldEVycm9yLFxuICAgICAgICBzZXRGb2N1cyxcbiAgICAgICAgZ2V0RmllbGRTdGF0ZSxcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIC4uLm1ldGhvZHMsXG4gICAgICAgIGZvcm1Db250cm9sOiBtZXRob2RzLFxuICAgIH07XG59XG5cbnZhciBnZW5lcmF0ZUlkID0gKCkgPT4ge1xuICAgIGlmICh0eXBlb2YgY3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiBjcnlwdG8ucmFuZG9tVVVJRCkge1xuICAgICAgICByZXR1cm4gY3J5cHRvLnJhbmRvbVVVSUQoKTtcbiAgICB9XG4gICAgY29uc3QgZCA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ3VuZGVmaW5lZCcgPyBEYXRlLm5vdygpIDogcGVyZm9ybWFuY2Uubm93KCkgKiAxMDAwO1xuICAgIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIChjKSA9PiB7XG4gICAgICAgIGNvbnN0IHIgPSAoTWF0aC5yYW5kb20oKSAqIDE2ICsgZCkgJSAxNiB8IDA7XG4gICAgICAgIHJldHVybiAoYyA9PSAneCcgPyByIDogKHIgJiAweDMpIHwgMHg4KS50b1N0cmluZygxNik7XG4gICAgfSk7XG59O1xuXG52YXIgZ2V0Rm9jdXNGaWVsZE5hbWUgPSAobmFtZSwgaW5kZXgsIG9wdGlvbnMgPSB7fSkgPT4gb3B0aW9ucy5zaG91bGRGb2N1cyB8fCBpc1VuZGVmaW5lZChvcHRpb25zLnNob3VsZEZvY3VzKVxuICAgID8gb3B0aW9ucy5mb2N1c05hbWUgfHxcbiAgICAgICAgYCR7bmFtZX0uJHtpc1VuZGVmaW5lZChvcHRpb25zLmZvY3VzSW5kZXgpID8gaW5kZXggOiBvcHRpb25zLmZvY3VzSW5kZXh9LmBcbiAgICA6ICcnO1xuXG52YXIgYXBwZW5kQXQgPSAoZGF0YSwgdmFsdWUpID0+IFtcbiAgICAuLi5kYXRhLFxuICAgIC4uLmNvbnZlcnRUb0FycmF5UGF5bG9hZCh2YWx1ZSksXG5dO1xuXG52YXIgZmlsbEVtcHR5QXJyYXkgPSAodmFsdWUpID0+IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUubWFwKCgpID0+IHVuZGVmaW5lZCkgOiB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGluc2VydChkYXRhLCBpbmRleCwgdmFsdWUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICAuLi5kYXRhLnNsaWNlKDAsIGluZGV4KSxcbiAgICAgICAgLi4uY29udmVydFRvQXJyYXlQYXlsb2FkKHZhbHVlKSxcbiAgICAgICAgLi4uZGF0YS5zbGljZShpbmRleCksXG4gICAgXTtcbn1cblxudmFyIG1vdmVBcnJheUF0ID0gKGRhdGEsIGZyb20sIHRvKSA9PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGRhdGEpKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKGlzVW5kZWZpbmVkKGRhdGFbdG9dKSkge1xuICAgICAgICBkYXRhW3RvXSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZGF0YS5zcGxpY2UodG8sIDAsIGRhdGEuc3BsaWNlKGZyb20sIDEpWzBdKTtcbiAgICByZXR1cm4gZGF0YTtcbn07XG5cbnZhciBwcmVwZW5kQXQgPSAoZGF0YSwgdmFsdWUpID0+IFtcbiAgICAuLi5jb252ZXJ0VG9BcnJheVBheWxvYWQodmFsdWUpLFxuICAgIC4uLmNvbnZlcnRUb0FycmF5UGF5bG9hZChkYXRhKSxcbl07XG5cbmZ1bmN0aW9uIHJlbW92ZUF0SW5kZXhlcyhkYXRhLCBpbmRleGVzKSB7XG4gICAgbGV0IGkgPSAwO1xuICAgIGNvbnN0IHRlbXAgPSBbLi4uZGF0YV07XG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICAgIHRlbXAuc3BsaWNlKGluZGV4IC0gaSwgMSk7XG4gICAgICAgIGkrKztcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBhY3QodGVtcCkubGVuZ3RoID8gdGVtcCA6IFtdO1xufVxudmFyIHJlbW92ZUFycmF5QXQgPSAoZGF0YSwgaW5kZXgpID0+IGlzVW5kZWZpbmVkKGluZGV4KVxuICAgID8gW11cbiAgICA6IHJlbW92ZUF0SW5kZXhlcyhkYXRhLCBjb252ZXJ0VG9BcnJheVBheWxvYWQoaW5kZXgpLnNvcnQoKGEsIGIpID0+IGEgLSBiKSk7XG5cbnZhciBzd2FwQXJyYXlBdCA9IChkYXRhLCBpbmRleEEsIGluZGV4QikgPT4ge1xuICAgIFtkYXRhW2luZGV4QV0sIGRhdGFbaW5kZXhCXV0gPSBbZGF0YVtpbmRleEJdLCBkYXRhW2luZGV4QV1dO1xufTtcblxudmFyIHVwZGF0ZUF0ID0gKGZpZWxkVmFsdWVzLCBpbmRleCwgdmFsdWUpID0+IHtcbiAgICBmaWVsZFZhbHVlc1tpbmRleF0gPSB2YWx1ZTtcbiAgICByZXR1cm4gZmllbGRWYWx1ZXM7XG59O1xuXG4vKipcbiAqIEEgY3VzdG9tIGhvb2sgdGhhdCBleHBvc2VzIGNvbnZlbmllbnQgbWV0aG9kcyB0byBwZXJmb3JtIG9wZXJhdGlvbnMgd2l0aCBhIGxpc3Qgb2YgZHluYW1pYyBpbnB1dHMgdGhhdCBuZWVkIHRvIGJlIGFwcGVuZGVkLCB1cGRhdGVkLCByZW1vdmVkIGV0Yy4g4oCiIFtEZW1vXShodHRwczovL2NvZGVzYW5kYm94LmlvL3MvcmVhY3QtaG9vay1mb3JtLXVzZWZpZWxkYXJyYXktc3N1Z24pIOKAoiBbVmlkZW9dKGh0dHBzOi8veW91dHUuYmUvNE1yYmZHU0ZZMkEpXG4gKlxuICogQHJlbWFya3NcbiAqIFtBUEldKGh0dHBzOi8vcmVhY3QtaG9vay1mb3JtLmNvbS9kb2NzL3VzZWZpZWxkYXJyYXkpIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3JlYWN0LWhvb2stZm9ybS11c2VmaWVsZGFycmF5LXNzdWduKVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIHVzZUZpZWxkQXJyYXkgcHJvcHNcbiAqXG4gKiBAcmV0dXJucyBtZXRob2RzIC0gZnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgd2l0aCB0aGUgRmllbGQgQXJyYXlzIChkeW5hbWljIGlucHV0cykge0BsaW5rIFVzZUZpZWxkQXJyYXlSZXR1cm59XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQXBwKCkge1xuICogICBjb25zdCB7IHJlZ2lzdGVyLCBjb250cm9sLCBoYW5kbGVTdWJtaXQsIHJlc2V0LCB0cmlnZ2VyLCBzZXRFcnJvciB9ID0gdXNlRm9ybSh7XG4gKiAgICAgZGVmYXVsdFZhbHVlczoge1xuICogICAgICAgdGVzdDogW11cbiAqICAgICB9XG4gKiAgIH0pO1xuICogICBjb25zdCB7IGZpZWxkcywgYXBwZW5kIH0gPSB1c2VGaWVsZEFycmF5KHtcbiAqICAgICBjb250cm9sLFxuICogICAgIG5hbWU6IFwidGVzdFwiXG4gKiAgIH0pO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8Zm9ybSBvblN1Ym1pdD17aGFuZGxlU3VibWl0KGRhdGEgPT4gY29uc29sZS5sb2coZGF0YSkpfT5cbiAqICAgICAgIHtmaWVsZHMubWFwKChpdGVtLCBpbmRleCkgPT4gKFxuICogICAgICAgICAgPGlucHV0IGtleT17aXRlbS5pZH0gey4uLnJlZ2lzdGVyKGB0ZXN0LiR7aW5kZXh9LmZpcnN0TmFtZWApfSAgLz5cbiAqICAgICAgICkpfVxuICogICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgb25DbGljaz17KCkgPT4gYXBwZW5kKHsgZmlyc3ROYW1lOiBcImJpbGxcIiB9KX0+XG4gKiAgICAgICAgIGFwcGVuZFxuICogICAgICAgPC9idXR0b24+XG4gKiAgICAgICA8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIC8+XG4gKiAgICAgPC9mb3JtPlxuICogICApO1xuICogfVxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIHVzZUZpZWxkQXJyYXkocHJvcHMpIHtcbiAgICBjb25zdCBtZXRob2RzID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgICBjb25zdCB7IGNvbnRyb2wgPSBtZXRob2RzLmNvbnRyb2wsIG5hbWUsIGtleU5hbWUgPSAnaWQnLCBzaG91bGRVbnJlZ2lzdGVyLCBydWxlcywgfSA9IHByb3BzO1xuICAgIGNvbnN0IFtmaWVsZHMsIHNldEZpZWxkc10gPSBSZWFjdF9fZGVmYXVsdC51c2VTdGF0ZShjb250cm9sLl9nZXRGaWVsZEFycmF5KG5hbWUpKTtcbiAgICBjb25zdCBpZHMgPSBSZWFjdF9fZGVmYXVsdC51c2VSZWYoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKS5tYXAoZ2VuZXJhdGVJZCkpO1xuICAgIGNvbnN0IF9maWVsZElkcyA9IFJlYWN0X19kZWZhdWx0LnVzZVJlZihmaWVsZHMpO1xuICAgIGNvbnN0IF9uYW1lID0gUmVhY3RfX2RlZmF1bHQudXNlUmVmKG5hbWUpO1xuICAgIGNvbnN0IF9hY3Rpb25lZCA9IFJlYWN0X19kZWZhdWx0LnVzZVJlZihmYWxzZSk7XG4gICAgX25hbWUuY3VycmVudCA9IG5hbWU7XG4gICAgX2ZpZWxkSWRzLmN1cnJlbnQgPSBmaWVsZHM7XG4gICAgY29udHJvbC5fbmFtZXMuYXJyYXkuYWRkKG5hbWUpO1xuICAgIHJ1bGVzICYmXG4gICAgICAgIGNvbnRyb2wucmVnaXN0ZXIobmFtZSwgcnVsZXMpO1xuICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4gY29udHJvbC5fc3ViamVjdHMuYXJyYXkuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHsgdmFsdWVzLCBuYW1lOiBmaWVsZEFycmF5TmFtZSwgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKGZpZWxkQXJyYXlOYW1lID09PSBfbmFtZS5jdXJyZW50IHx8ICFmaWVsZEFycmF5TmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkVmFsdWVzID0gZ2V0KHZhbHVlcywgX25hbWUuY3VycmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIHNldEZpZWxkcyhmaWVsZFZhbHVlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlkcy5jdXJyZW50ID0gZmllbGRWYWx1ZXMubWFwKGdlbmVyYXRlSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KS51bnN1YnNjcmliZSwgW2NvbnRyb2xdKTtcbiAgICBjb25zdCB1cGRhdGVWYWx1ZXMgPSBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjaygodXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMpID0+IHtcbiAgICAgICAgX2FjdGlvbmVkLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgICBjb250cm9sLl9zZXRGaWVsZEFycmF5KG5hbWUsIHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICB9LCBbY29udHJvbCwgbmFtZV0pO1xuICAgIGNvbnN0IGFwcGVuZCA9ICh2YWx1ZSwgb3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCBhcHBlbmRWYWx1ZSA9IGNvbnZlcnRUb0FycmF5UGF5bG9hZChjbG9uZU9iamVjdCh2YWx1ZSkpO1xuICAgICAgICBjb25zdCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcyA9IGFwcGVuZEF0KGNvbnRyb2wuX2dldEZpZWxkQXJyYXkobmFtZSksIGFwcGVuZFZhbHVlKTtcbiAgICAgICAgY29udHJvbC5fbmFtZXMuZm9jdXMgPSBnZXRGb2N1c0ZpZWxkTmFtZShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcy5sZW5ndGggLSAxLCBvcHRpb25zKTtcbiAgICAgICAgaWRzLmN1cnJlbnQgPSBhcHBlbmRBdChpZHMuY3VycmVudCwgYXBwZW5kVmFsdWUubWFwKGdlbmVyYXRlSWQpKTtcbiAgICAgICAgdXBkYXRlVmFsdWVzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgc2V0RmllbGRzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgY29udHJvbC5fc2V0RmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgYXBwZW5kQXQsIHtcbiAgICAgICAgICAgIGFyZ0E6IGZpbGxFbXB0eUFycmF5KHZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBwcmVwZW5kID0gKHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IHByZXBlbmRWYWx1ZSA9IGNvbnZlcnRUb0FycmF5UGF5bG9hZChjbG9uZU9iamVjdCh2YWx1ZSkpO1xuICAgICAgICBjb25zdCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcyA9IHByZXBlbmRBdChjb250cm9sLl9nZXRGaWVsZEFycmF5KG5hbWUpLCBwcmVwZW5kVmFsdWUpO1xuICAgICAgICBjb250cm9sLl9uYW1lcy5mb2N1cyA9IGdldEZvY3VzRmllbGROYW1lKG5hbWUsIDAsIG9wdGlvbnMpO1xuICAgICAgICBpZHMuY3VycmVudCA9IHByZXBlbmRBdChpZHMuY3VycmVudCwgcHJlcGVuZFZhbHVlLm1hcChnZW5lcmF0ZUlkKSk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIHNldEZpZWxkcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIGNvbnRyb2wuX3NldEZpZWxkQXJyYXkobmFtZSwgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMsIHByZXBlbmRBdCwge1xuICAgICAgICAgICAgYXJnQTogZmlsbEVtcHR5QXJyYXkodmFsdWUpLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IHJlbW92ZSA9IChpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcyA9IHJlbW92ZUFycmF5QXQoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKSwgaW5kZXgpO1xuICAgICAgICBpZHMuY3VycmVudCA9IHJlbW92ZUFycmF5QXQoaWRzLmN1cnJlbnQsIGluZGV4KTtcbiAgICAgICAgdXBkYXRlVmFsdWVzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgc2V0RmllbGRzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoZ2V0KGNvbnRyb2wuX2ZpZWxkcywgbmFtZSkpICYmXG4gICAgICAgICAgICBzZXQoY29udHJvbC5fZmllbGRzLCBuYW1lLCB1bmRlZmluZWQpO1xuICAgICAgICBjb250cm9sLl9zZXRGaWVsZEFycmF5KG5hbWUsIHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzLCByZW1vdmVBcnJheUF0LCB7XG4gICAgICAgICAgICBhcmdBOiBpbmRleCxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBpbnNlcnQkMSA9IChpbmRleCwgdmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgY29uc3QgaW5zZXJ0VmFsdWUgPSBjb252ZXJ0VG9BcnJheVBheWxvYWQoY2xvbmVPYmplY3QodmFsdWUpKTtcbiAgICAgICAgY29uc3QgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMgPSBpbnNlcnQoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKSwgaW5kZXgsIGluc2VydFZhbHVlKTtcbiAgICAgICAgY29udHJvbC5fbmFtZXMuZm9jdXMgPSBnZXRGb2N1c0ZpZWxkTmFtZShuYW1lLCBpbmRleCwgb3B0aW9ucyk7XG4gICAgICAgIGlkcy5jdXJyZW50ID0gaW5zZXJ0KGlkcy5jdXJyZW50LCBpbmRleCwgaW5zZXJ0VmFsdWUubWFwKGdlbmVyYXRlSWQpKTtcbiAgICAgICAgdXBkYXRlVmFsdWVzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgc2V0RmllbGRzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgY29udHJvbC5fc2V0RmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgaW5zZXJ0LCB7XG4gICAgICAgICAgICBhcmdBOiBpbmRleCxcbiAgICAgICAgICAgIGFyZ0I6IGZpbGxFbXB0eUFycmF5KHZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCBzd2FwID0gKGluZGV4QSwgaW5kZXhCKSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzID0gY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKTtcbiAgICAgICAgc3dhcEFycmF5QXQodXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMsIGluZGV4QSwgaW5kZXhCKTtcbiAgICAgICAgc3dhcEFycmF5QXQoaWRzLmN1cnJlbnQsIGluZGV4QSwgaW5kZXhCKTtcbiAgICAgICAgdXBkYXRlVmFsdWVzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgc2V0RmllbGRzKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKTtcbiAgICAgICAgY29udHJvbC5fc2V0RmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgc3dhcEFycmF5QXQsIHtcbiAgICAgICAgICAgIGFyZ0E6IGluZGV4QSxcbiAgICAgICAgICAgIGFyZ0I6IGluZGV4QixcbiAgICAgICAgfSwgZmFsc2UpO1xuICAgIH07XG4gICAgY29uc3QgbW92ZSA9IChmcm9tLCB0bykgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcyA9IGNvbnRyb2wuX2dldEZpZWxkQXJyYXkobmFtZSk7XG4gICAgICAgIG1vdmVBcnJheUF0KHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzLCBmcm9tLCB0byk7XG4gICAgICAgIG1vdmVBcnJheUF0KGlkcy5jdXJyZW50LCBmcm9tLCB0byk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIHNldEZpZWxkcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIGNvbnRyb2wuX3NldEZpZWxkQXJyYXkobmFtZSwgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMsIG1vdmVBcnJheUF0LCB7XG4gICAgICAgICAgICBhcmdBOiBmcm9tLFxuICAgICAgICAgICAgYXJnQjogdG8sXG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICB9O1xuICAgIGNvbnN0IHVwZGF0ZSA9IChpbmRleCwgdmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlVmFsdWUgPSBjbG9uZU9iamVjdCh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzID0gdXBkYXRlQXQoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKSwgaW5kZXgsIHVwZGF0ZVZhbHVlKTtcbiAgICAgICAgaWRzLmN1cnJlbnQgPSBbLi4udXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXNdLm1hcCgoaXRlbSwgaSkgPT4gIWl0ZW0gfHwgaSA9PT0gaW5kZXggPyBnZW5lcmF0ZUlkKCkgOiBpZHMuY3VycmVudFtpXSk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIHNldEZpZWxkcyhbLi4udXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXNdKTtcbiAgICAgICAgY29udHJvbC5fc2V0RmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgdXBkYXRlQXQsIHtcbiAgICAgICAgICAgIGFyZ0E6IGluZGV4LFxuICAgICAgICAgICAgYXJnQjogdXBkYXRlVmFsdWUsXG4gICAgICAgIH0sIHRydWUsIGZhbHNlKTtcbiAgICB9O1xuICAgIGNvbnN0IHJlcGxhY2UgPSAodmFsdWUpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMgPSBjb252ZXJ0VG9BcnJheVBheWxvYWQoY2xvbmVPYmplY3QodmFsdWUpKTtcbiAgICAgICAgaWRzLmN1cnJlbnQgPSB1cGRhdGVkRmllbGRBcnJheVZhbHVlcy5tYXAoZ2VuZXJhdGVJZCk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyhbLi4udXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXNdKTtcbiAgICAgICAgc2V0RmllbGRzKFsuLi51cGRhdGVkRmllbGRBcnJheVZhbHVlc10pO1xuICAgICAgICBjb250cm9sLl9zZXRGaWVsZEFycmF5KG5hbWUsIFsuLi51cGRhdGVkRmllbGRBcnJheVZhbHVlc10sIChkYXRhKSA9PiBkYXRhLCB7fSwgdHJ1ZSwgZmFsc2UpO1xuICAgIH07XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29udHJvbC5fc3RhdGUuYWN0aW9uID0gZmFsc2U7XG4gICAgICAgIGlzV2F0Y2hlZChuYW1lLCBjb250cm9sLl9uYW1lcykgJiZcbiAgICAgICAgICAgIGNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgIC4uLmNvbnRyb2wuX2Zvcm1TdGF0ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoX2FjdGlvbmVkLmN1cnJlbnQgJiZcbiAgICAgICAgICAgICghZ2V0VmFsaWRhdGlvbk1vZGVzKGNvbnRyb2wuX29wdGlvbnMubW9kZSkuaXNPblN1Ym1pdCB8fFxuICAgICAgICAgICAgICAgIGNvbnRyb2wuX2Zvcm1TdGF0ZS5pc1N1Ym1pdHRlZCkgJiZcbiAgICAgICAgICAgICFnZXRWYWxpZGF0aW9uTW9kZXMoY29udHJvbC5fb3B0aW9ucy5yZVZhbGlkYXRlTW9kZSkuaXNPblN1Ym1pdCkge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2wuX29wdGlvbnMucmVzb2x2ZXIpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLl9ydW5TY2hlbWEoW25hbWVdKS50aGVuKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBnZXQocmVzdWx0LmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nRXJyb3IgPSBnZXQoY29udHJvbC5fZm9ybVN0YXRlLmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ0Vycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICghZXJyb3IgJiYgZXhpc3RpbmdFcnJvci50eXBlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhpc3RpbmdFcnJvci50eXBlICE9PSBlcnJvci50eXBlIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0Vycm9yLm1lc3NhZ2UgIT09IGVycm9yLm1lc3NhZ2UpKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBlcnJvciAmJiBlcnJvci50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2V0KGNvbnRyb2wuX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUsIGVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5zZXQoY29udHJvbC5fZm9ybVN0YXRlLmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLl9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IGNvbnRyb2wuX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoY29udHJvbC5fZmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoZmllbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgZmllbGQuX2YgJiZcbiAgICAgICAgICAgICAgICAgICAgIShnZXRWYWxpZGF0aW9uTW9kZXMoY29udHJvbC5fb3B0aW9ucy5yZVZhbGlkYXRlTW9kZSkuaXNPblN1Ym1pdCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsaWRhdGlvbk1vZGVzKGNvbnRyb2wuX29wdGlvbnMubW9kZSkuaXNPblN1Ym1pdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVGaWVsZChmaWVsZCwgY29udHJvbC5fbmFtZXMuZGlzYWJsZWQsIGNvbnRyb2wuX2Zvcm1WYWx1ZXMsIGNvbnRyb2wuX29wdGlvbnMuY3JpdGVyaWFNb2RlID09PSBWQUxJREFUSU9OX01PREUuYWxsLCBjb250cm9sLl9vcHRpb25zLnNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24sIHRydWUpLnRoZW4oKGVycm9yKSA9PiAhaXNFbXB0eU9iamVjdChlcnJvcikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yczogdXBkYXRlRmllbGRBcnJheVJvb3RFcnJvcihjb250cm9sLl9mb3JtU3RhdGUuZXJyb3JzLCBlcnJvciwgbmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIHZhbHVlczogY2xvbmVPYmplY3QoY29udHJvbC5fZm9ybVZhbHVlcyksXG4gICAgICAgIH0pO1xuICAgICAgICBjb250cm9sLl9uYW1lcy5mb2N1cyAmJlxuICAgICAgICAgICAgaXRlcmF0ZUZpZWxkc0J5QWN0aW9uKGNvbnRyb2wuX2ZpZWxkcywgKHJlZiwga2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuX25hbWVzLmZvY3VzICYmXG4gICAgICAgICAgICAgICAgICAgIGtleS5zdGFydHNXaXRoKGNvbnRyb2wuX25hbWVzLmZvY3VzKSAmJlxuICAgICAgICAgICAgICAgICAgICByZWYuZm9jdXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVmLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY29udHJvbC5fbmFtZXMuZm9jdXMgPSAnJztcbiAgICAgICAgY29udHJvbC5fc2V0VmFsaWQoKTtcbiAgICAgICAgX2FjdGlvbmVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9LCBbZmllbGRzLCBuYW1lLCBjb250cm9sXSk7XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgIWdldChjb250cm9sLl9mb3JtVmFsdWVzLCBuYW1lKSAmJiBjb250cm9sLl9zZXRGaWVsZEFycmF5KG5hbWUpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlTW91bnRlZCA9IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KGNvbnRyb2wuX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLl9mKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLl9mLm1vdW50ID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnRyb2wuX29wdGlvbnMuc2hvdWxkVW5yZWdpc3RlciB8fCBzaG91bGRVbnJlZ2lzdGVyXG4gICAgICAgICAgICAgICAgPyBjb250cm9sLnVucmVnaXN0ZXIobmFtZSlcbiAgICAgICAgICAgICAgICA6IHVwZGF0ZU1vdW50ZWQobmFtZSwgZmFsc2UpO1xuICAgICAgICB9O1xuICAgIH0sIFtuYW1lLCBjb250cm9sLCBrZXlOYW1lLCBzaG91bGRVbnJlZ2lzdGVyXSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3dhcDogUmVhY3RfX2RlZmF1bHQudXNlQ2FsbGJhY2soc3dhcCwgW3VwZGF0ZVZhbHVlcywgbmFtZSwgY29udHJvbF0pLFxuICAgICAgICBtb3ZlOiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayhtb3ZlLCBbdXBkYXRlVmFsdWVzLCBuYW1lLCBjb250cm9sXSksXG4gICAgICAgIHByZXBlbmQ6IFJlYWN0X19kZWZhdWx0LnVzZUNhbGxiYWNrKHByZXBlbmQsIFt1cGRhdGVWYWx1ZXMsIG5hbWUsIGNvbnRyb2xdKSxcbiAgICAgICAgYXBwZW5kOiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayhhcHBlbmQsIFt1cGRhdGVWYWx1ZXMsIG5hbWUsIGNvbnRyb2xdKSxcbiAgICAgICAgcmVtb3ZlOiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayhyZW1vdmUsIFt1cGRhdGVWYWx1ZXMsIG5hbWUsIGNvbnRyb2xdKSxcbiAgICAgICAgaW5zZXJ0OiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayhpbnNlcnQkMSwgW3VwZGF0ZVZhbHVlcywgbmFtZSwgY29udHJvbF0pLFxuICAgICAgICB1cGRhdGU6IFJlYWN0X19kZWZhdWx0LnVzZUNhbGxiYWNrKHVwZGF0ZSwgW3VwZGF0ZVZhbHVlcywgbmFtZSwgY29udHJvbF0pLFxuICAgICAgICByZXBsYWNlOiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayhyZXBsYWNlLCBbdXBkYXRlVmFsdWVzLCBuYW1lLCBjb250cm9sXSksXG4gICAgICAgIGZpZWxkczogUmVhY3RfX2RlZmF1bHQudXNlTWVtbygoKSA9PiBmaWVsZHMubWFwKChmaWVsZCwgaW5kZXgpID0+ICh7XG4gICAgICAgICAgICAuLi5maWVsZCxcbiAgICAgICAgICAgIFtrZXlOYW1lXTogaWRzLmN1cnJlbnRbaW5kZXhdIHx8IGdlbmVyYXRlSWQoKSxcbiAgICAgICAgfSkpLCBbZmllbGRzLCBrZXlOYW1lXSksXG4gICAgfTtcbn1cblxuLyoqXG4gKiBDdXN0b20gaG9vayB0byBtYW5hZ2UgdGhlIGVudGlyZSBmb3JtLlxuICpcbiAqIEByZW1hcmtzXG4gKiBbQVBJXShodHRwczovL3JlYWN0LWhvb2stZm9ybS5jb20vZG9jcy91c2Vmb3JtKSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy9yZWFjdC1ob29rLWZvcm0tZ2V0LXN0YXJ0ZWQtdHMtNWtzbW0pIOKAoiBbVmlkZW9dKGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9UmtYdjRBWFhDXzQpXG4gKlxuICogQHBhcmFtIHByb3BzIC0gZm9ybSBjb25maWd1cmF0aW9uIGFuZCB2YWxpZGF0aW9uIHBhcmFtZXRlcnMuXG4gKlxuICogQHJldHVybnMgbWV0aG9kcyAtIGluZGl2aWR1YWwgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9ybSBzdGF0ZS4ge0BsaW5rIFVzZUZvcm1SZXR1cm59XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQXBwKCkge1xuICogICBjb25zdCB7IHJlZ2lzdGVyLCBoYW5kbGVTdWJtaXQsIHdhdGNoLCBmb3JtU3RhdGU6IHsgZXJyb3JzIH0gfSA9IHVzZUZvcm0oKTtcbiAqICAgY29uc3Qgb25TdWJtaXQgPSBkYXRhID0+IGNvbnNvbGUubG9nKGRhdGEpO1xuICpcbiAqICAgY29uc29sZS5sb2cod2F0Y2goXCJleGFtcGxlXCIpKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGZvcm0gb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdChvblN1Ym1pdCl9PlxuICogICAgICAgPGlucHV0IGRlZmF1bHRWYWx1ZT1cInRlc3RcIiB7Li4ucmVnaXN0ZXIoXCJleGFtcGxlXCIpfSAvPlxuICogICAgICAgPGlucHV0IHsuLi5yZWdpc3RlcihcImV4YW1wbGVSZXF1aXJlZFwiLCB7IHJlcXVpcmVkOiB0cnVlIH0pfSAvPlxuICogICAgICAge2Vycm9ycy5leGFtcGxlUmVxdWlyZWQgJiYgPHNwYW4+VGhpcyBmaWVsZCBpcyByZXF1aXJlZDwvc3Bhbj59XG4gKiAgICAgICA8YnV0dG9uPlN1Ym1pdDwvYnV0dG9uPlxuICogICAgIDwvZm9ybT5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICovXG5mdW5jdGlvbiB1c2VGb3JtKHByb3BzID0ge30pIHtcbiAgICBjb25zdCBfZm9ybUNvbnRyb2wgPSBSZWFjdF9fZGVmYXVsdC51c2VSZWYodW5kZWZpbmVkKTtcbiAgICBjb25zdCBfdmFsdWVzID0gUmVhY3RfX2RlZmF1bHQudXNlUmVmKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgW2Zvcm1TdGF0ZSwgdXBkYXRlRm9ybVN0YXRlXSA9IFJlYWN0X19kZWZhdWx0LnVzZVN0YXRlKHtcbiAgICAgICAgaXNEaXJ0eTogZmFsc2UsXG4gICAgICAgIGlzVmFsaWRhdGluZzogZmFsc2UsXG4gICAgICAgIGlzTG9hZGluZzogaXNGdW5jdGlvbihwcm9wcy5kZWZhdWx0VmFsdWVzKSxcbiAgICAgICAgaXNTdWJtaXR0ZWQ6IGZhbHNlLFxuICAgICAgICBpc1N1Ym1pdHRpbmc6IGZhbHNlLFxuICAgICAgICBpc1N1Ym1pdFN1Y2Nlc3NmdWw6IGZhbHNlLFxuICAgICAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgc3VibWl0Q291bnQ6IDAsXG4gICAgICAgIGRpcnR5RmllbGRzOiB7fSxcbiAgICAgICAgdG91Y2hlZEZpZWxkczoge30sXG4gICAgICAgIHZhbGlkYXRpbmdGaWVsZHM6IHt9LFxuICAgICAgICBlcnJvcnM6IHByb3BzLmVycm9ycyB8fCB7fSxcbiAgICAgICAgZGlzYWJsZWQ6IHByb3BzLmRpc2FibGVkIHx8IGZhbHNlLFxuICAgICAgICBpc1JlYWR5OiBmYWxzZSxcbiAgICAgICAgZGVmYXVsdFZhbHVlczogaXNGdW5jdGlvbihwcm9wcy5kZWZhdWx0VmFsdWVzKVxuICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgIDogcHJvcHMuZGVmYXVsdFZhbHVlcyxcbiAgICB9KTtcbiAgICBpZiAoIV9mb3JtQ29udHJvbC5jdXJyZW50KSB7XG4gICAgICAgIGlmIChwcm9wcy5mb3JtQ29udHJvbCkge1xuICAgICAgICAgICAgX2Zvcm1Db250cm9sLmN1cnJlbnQgPSB7XG4gICAgICAgICAgICAgICAgLi4ucHJvcHMuZm9ybUNvbnRyb2wsXG4gICAgICAgICAgICAgICAgZm9ybVN0YXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChwcm9wcy5kZWZhdWx0VmFsdWVzICYmICFpc0Z1bmN0aW9uKHByb3BzLmRlZmF1bHRWYWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgcHJvcHMuZm9ybUNvbnRyb2wucmVzZXQocHJvcHMuZGVmYXVsdFZhbHVlcywgcHJvcHMucmVzZXRPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgZm9ybUNvbnRyb2wsIC4uLnJlc3QgfSA9IGNyZWF0ZUZvcm1Db250cm9sKHByb3BzKTtcbiAgICAgICAgICAgIF9mb3JtQ29udHJvbC5jdXJyZW50ID0ge1xuICAgICAgICAgICAgICAgIC4uLnJlc3QsXG4gICAgICAgICAgICAgICAgZm9ybVN0YXRlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBjb250cm9sID0gX2Zvcm1Db250cm9sLmN1cnJlbnQuY29udHJvbDtcbiAgICBjb250cm9sLl9vcHRpb25zID0gcHJvcHM7XG4gICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1YiA9IGNvbnRyb2wuX3N1YnNjcmliZSh7XG4gICAgICAgICAgICBmb3JtU3RhdGU6IGNvbnRyb2wuX3Byb3h5Rm9ybVN0YXRlLFxuICAgICAgICAgICAgY2FsbGJhY2s6ICgpID0+IHVwZGF0ZUZvcm1TdGF0ZSh7IC4uLmNvbnRyb2wuX2Zvcm1TdGF0ZSB9KSxcbiAgICAgICAgICAgIHJlUmVuZGVyUm9vdDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHVwZGF0ZUZvcm1TdGF0ZSgoZGF0YSkgPT4gKHtcbiAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICBpc1JlYWR5OiB0cnVlLFxuICAgICAgICB9KSk7XG4gICAgICAgIGNvbnRyb2wuX2Zvcm1TdGF0ZS5pc1JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHN1YjtcbiAgICB9LCBbY29udHJvbF0pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiBjb250cm9sLl9kaXNhYmxlRm9ybShwcm9wcy5kaXNhYmxlZCksIFtjb250cm9sLCBwcm9wcy5kaXNhYmxlZF0pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChwcm9wcy5tb2RlKSB7XG4gICAgICAgICAgICBjb250cm9sLl9vcHRpb25zLm1vZGUgPSBwcm9wcy5tb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wcy5yZVZhbGlkYXRlTW9kZSkge1xuICAgICAgICAgICAgY29udHJvbC5fb3B0aW9ucy5yZVZhbGlkYXRlTW9kZSA9IHByb3BzLnJlVmFsaWRhdGVNb2RlO1xuICAgICAgICB9XG4gICAgfSwgW2NvbnRyb2wsIHByb3BzLm1vZGUsIHByb3BzLnJlVmFsaWRhdGVNb2RlXSk7XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKHByb3BzLmVycm9ycykge1xuICAgICAgICAgICAgY29udHJvbC5fc2V0RXJyb3JzKHByb3BzLmVycm9ycyk7XG4gICAgICAgICAgICBjb250cm9sLl9mb2N1c0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICB9LCBbY29udHJvbCwgcHJvcHMuZXJyb3JzXSk7XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgcHJvcHMuc2hvdWxkVW5yZWdpc3RlciAmJlxuICAgICAgICAgICAgY29udHJvbC5fc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiBjb250cm9sLl9nZXRXYXRjaCgpLFxuICAgICAgICAgICAgfSk7XG4gICAgfSwgW2NvbnRyb2wsIHByb3BzLnNob3VsZFVucmVnaXN0ZXJdKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoY29udHJvbC5fcHJveHlGb3JtU3RhdGUuaXNEaXJ0eSkge1xuICAgICAgICAgICAgY29uc3QgaXNEaXJ0eSA9IGNvbnRyb2wuX2dldERpcnR5KCk7XG4gICAgICAgICAgICBpZiAoaXNEaXJ0eSAhPT0gZm9ybVN0YXRlLmlzRGlydHkpIHtcbiAgICAgICAgICAgICAgICBjb250cm9sLl9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgaXNEaXJ0eSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIFtjb250cm9sLCBmb3JtU3RhdGUuaXNEaXJ0eV0pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChwcm9wcy52YWx1ZXMgJiYgIWRlZXBFcXVhbChwcm9wcy52YWx1ZXMsIF92YWx1ZXMuY3VycmVudCkpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuX3Jlc2V0KHByb3BzLnZhbHVlcywge1xuICAgICAgICAgICAgICAgIGtlZXBGaWVsZHNSZWY6IHRydWUsXG4gICAgICAgICAgICAgICAgLi4uY29udHJvbC5fb3B0aW9ucy5yZXNldE9wdGlvbnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIF92YWx1ZXMuY3VycmVudCA9IHByb3BzLnZhbHVlcztcbiAgICAgICAgICAgIHVwZGF0ZUZvcm1TdGF0ZSgoc3RhdGUpID0+ICh7IC4uLnN0YXRlIH0pKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnRyb2wuX3Jlc2V0RGVmYXVsdFZhbHVlcygpO1xuICAgICAgICB9XG4gICAgfSwgW2NvbnRyb2wsIHByb3BzLnZhbHVlc10pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmICghY29udHJvbC5fc3RhdGUubW91bnQpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuX3NldFZhbGlkKCk7XG4gICAgICAgICAgICBjb250cm9sLl9zdGF0ZS5tb3VudCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRyb2wuX3N0YXRlLndhdGNoKSB7XG4gICAgICAgICAgICBjb250cm9sLl9zdGF0ZS53YXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgY29udHJvbC5fc3ViamVjdHMuc3RhdGUubmV4dCh7IC4uLmNvbnRyb2wuX2Zvcm1TdGF0ZSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb250cm9sLl9yZW1vdmVVbm1vdW50ZWQoKTtcbiAgICB9KTtcbiAgICBfZm9ybUNvbnRyb2wuY3VycmVudC5mb3JtU3RhdGUgPSBnZXRQcm94eUZvcm1TdGF0ZShmb3JtU3RhdGUsIGNvbnRyb2wpO1xuICAgIHJldHVybiBfZm9ybUNvbnRyb2wuY3VycmVudDtcbn1cblxuZXhwb3J0IHsgQ29udHJvbGxlciwgRm9ybSwgRm9ybVByb3ZpZGVyLCBhcHBlbmRFcnJvcnMsIGNyZWF0ZUZvcm1Db250cm9sLCBnZXQsIHNldCwgdXNlQ29udHJvbGxlciwgdXNlRmllbGRBcnJheSwgdXNlRm9ybSwgdXNlRm9ybUNvbnRleHQsIHVzZUZvcm1TdGF0ZSwgdXNlV2F0Y2ggfTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmVzbS5tanMubWFwXG4iLAogICAgIid1c2UgY2xpZW50J1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIExhYmVsUHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1sYWJlbCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gTGFiZWwoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgTGFiZWxQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIChcbiAgICA8TGFiZWxQcmltaXRpdmUuUm9vdFxuICAgICAgZGF0YS1zbG90PVwibGFiZWxcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2ZsZXggaXRlbXMtY2VudGVyIGdhcC0yIHRleHQtc20gbGVhZGluZy1ub25lIGZvbnQtbWVkaXVtIHNlbGVjdC1ub25lIGdyb3VwLWRhdGEtW2Rpc2FibGVkPXRydWVdOnBvaW50ZXItZXZlbnRzLW5vbmUgZ3JvdXAtZGF0YS1bZGlzYWJsZWQ9dHJ1ZV06b3BhY2l0eS01MCBwZWVyLWRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBwZWVyLWRpc2FibGVkOm9wYWNpdHktNTAnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgeyBMYWJlbCB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5mdW5jdGlvbiBJbnB1dCh7IGNsYXNzTmFtZSwgdHlwZSwgLi4ucHJvcHMgfTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2lucHV0Jz4pIHtcbiAgcmV0dXJuIChcbiAgICA8aW5wdXRcbiAgICAgIHR5cGU9e3R5cGV9XG4gICAgICBkYXRhLXNsb3Q9XCJpbnB1dFwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZmlsZTp0ZXh0LWZvcmVncm91bmQgcGxhY2Vob2xkZXI6dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHNlbGVjdGlvbjpiZy1wcmltYXJ5IHNlbGVjdGlvbjp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBkYXJrOmJnLWlucHV0LzMwIGJvcmRlci1pbnB1dCBmbGV4IGgtOSB3LWZ1bGwgbWluLXctMCByb3VuZGVkLW1kIGJvcmRlciBiZy10cmFuc3BhcmVudCBweC0zIHB5LTEgdGV4dC1iYXNlIHNoYWRvdy14cyB0cmFuc2l0aW9uLVtjb2xvcixib3gtc2hhZG93XSBvdXRsaW5lLW5vbmUgZmlsZTppbmxpbmUtZmxleCBmaWxlOmgtNyBmaWxlOmJvcmRlci0wIGZpbGU6YmctdHJhbnNwYXJlbnQgZmlsZTp0ZXh0LXNtIGZpbGU6Zm9udC1tZWRpdW0gZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBkaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgZGlzYWJsZWQ6b3BhY2l0eS01MCBtZDp0ZXh0LXNtJyxcbiAgICAgICAgJ2ZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgZm9jdXMtdmlzaWJsZTpyaW5nLVszcHhdJyxcbiAgICAgICAgJ2FyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzIwIGRhcms6YXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvNDAgYXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZScsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmV4cG9ydCB7IElucHV0IH1cbiIsCiAgICAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgKiBhcyBTY3JvbGxBcmVhUHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1zY3JvbGwtYXJlYSdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gU2Nyb2xsQXJlYSh7XG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2Nyb2xsQXJlYVByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gKFxuICAgIDxTY3JvbGxBcmVhUHJpbWl0aXZlLlJvb3RcbiAgICAgIGRhdGEtc2xvdD1cInNjcm9sbC1hcmVhXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ3JlbGF0aXZlJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICA+XG4gICAgICA8U2Nyb2xsQXJlYVByaW1pdGl2ZS5WaWV3cG9ydFxuICAgICAgICBkYXRhLXNsb3Q9XCJzY3JvbGwtYXJlYS12aWV3cG9ydFwiXG4gICAgICAgIGNsYXNzTmFtZT1cImZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIHNpemUtZnVsbCByb3VuZGVkLVtpbmhlcml0XSB0cmFuc2l0aW9uLVtjb2xvcixib3gtc2hhZG93XSBvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLVszcHhdIGZvY3VzLXZpc2libGU6b3V0bGluZS0xXCJcbiAgICAgID5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgPC9TY3JvbGxBcmVhUHJpbWl0aXZlLlZpZXdwb3J0PlxuICAgICAgPFNjcm9sbEJhciAvPlxuICAgICAgPFNjcm9sbEFyZWFQcmltaXRpdmUuQ29ybmVyIC8+XG4gICAgPC9TY3JvbGxBcmVhUHJpbWl0aXZlLlJvb3Q+XG4gIClcbn1cblxuZnVuY3Rpb24gU2Nyb2xsQmFyKHtcbiAgY2xhc3NOYW1lLFxuICBvcmllbnRhdGlvbiA9ICd2ZXJ0aWNhbCcsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2Nyb2xsQXJlYVByaW1pdGl2ZS5TY3JvbGxBcmVhU2Nyb2xsYmFyPikge1xuICByZXR1cm4gKFxuICAgIDxTY3JvbGxBcmVhUHJpbWl0aXZlLlNjcm9sbEFyZWFTY3JvbGxiYXJcbiAgICAgIGRhdGEtc2xvdD1cInNjcm9sbC1hcmVhLXNjcm9sbGJhclwiXG4gICAgICBvcmllbnRhdGlvbj17b3JpZW50YXRpb259XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZmxleCB0b3VjaC1ub25lIHAtcHggdHJhbnNpdGlvbi1jb2xvcnMgc2VsZWN0LW5vbmUnLFxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyAmJlxuICAgICAgICAgICdoLWZ1bGwgdy0yLjUgYm9yZGVyLWwgYm9yZGVyLWwtdHJhbnNwYXJlbnQnLFxuICAgICAgICBvcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnICYmXG4gICAgICAgICAgJ2gtMi41IGZsZXgtY29sIGJvcmRlci10IGJvcmRlci10LXRyYW5zcGFyZW50JyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxTY3JvbGxBcmVhUHJpbWl0aXZlLlNjcm9sbEFyZWFUaHVtYlxuICAgICAgICBkYXRhLXNsb3Q9XCJzY3JvbGwtYXJlYS10aHVtYlwiXG4gICAgICAgIGNsYXNzTmFtZT1cImJnLWJvcmRlciByZWxhdGl2ZSBmbGV4LTEgcm91bmRlZC1mdWxsXCJcbiAgICAgIC8+XG4gICAgPC9TY3JvbGxBcmVhUHJpbWl0aXZlLlNjcm9sbEFyZWFTY3JvbGxiYXI+XG4gIClcbn1cblxuZXhwb3J0IHsgU2Nyb2xsQXJlYSwgU2Nyb2xsQmFyIH1cbiIsCiAgICAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgKiBhcyBTZWxlY3RQcmltaXRpdmUgZnJvbSAnQHJhZGl4LXVpL3JlYWN0LXNlbGVjdCdcbmltcG9ydCB7IENoZWNrSWNvbiwgQ2hldnJvbkRvd25JY29uLCBDaGV2cm9uVXBJY29uIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5mdW5jdGlvbiBTZWxlY3Qoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNlbGVjdFByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gPFNlbGVjdFByaW1pdGl2ZS5Sb290IGRhdGEtc2xvdD1cInNlbGVjdFwiIHsuLi5wcm9wc30gLz5cbn1cblxuZnVuY3Rpb24gU2VsZWN0R3JvdXAoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNlbGVjdFByaW1pdGl2ZS5Hcm91cD4pIHtcbiAgcmV0dXJuIDxTZWxlY3RQcmltaXRpdmUuR3JvdXAgZGF0YS1zbG90PVwic2VsZWN0LWdyb3VwXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBTZWxlY3RWYWx1ZSh7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2VsZWN0UHJpbWl0aXZlLlZhbHVlPikge1xuICByZXR1cm4gPFNlbGVjdFByaW1pdGl2ZS5WYWx1ZSBkYXRhLXNsb3Q9XCJzZWxlY3QtdmFsdWVcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIFNlbGVjdFRyaWdnZXIoe1xuICBjbGFzc05hbWUsXG4gIHNpemUgPSAnZGVmYXVsdCcsXG4gIGNoaWxkcmVuLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNlbGVjdFByaW1pdGl2ZS5UcmlnZ2VyPiAmIHtcbiAgc2l6ZT86ICdzbScgfCAnZGVmYXVsdCdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0UHJpbWl0aXZlLlRyaWdnZXJcbiAgICAgIGRhdGEtc2xvdD1cInNlbGVjdC10cmlnZ2VyXCJcbiAgICAgIGRhdGEtc2l6ZT17c2l6ZX1cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgIFwiYm9yZGVyLWlucHV0IGRhdGEtW3BsYWNlaG9sZGVyXTp0ZXh0LW11dGVkLWZvcmVncm91bmQgWyZfc3ZnOm5vdChbY2xhc3MqPSd0ZXh0LSddKV06dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazphcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS80MCBhcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlIGRhcms6YmctaW5wdXQvMzAgZGFyazpob3ZlcjpiZy1pbnB1dC81MCBmbGV4IHctZml0IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW4gZ2FwLTIgcm91bmRlZC1tZCBib3JkZXIgYmctdHJhbnNwYXJlbnQgcHgtMyBweS0yIHRleHQtc20gd2hpdGVzcGFjZS1ub3dyYXAgc2hhZG93LXhzIHRyYW5zaXRpb24tW2NvbG9yLGJveC1zaGFkb3ddIG91dGxpbmUtbm9uZSBmb2N1cy12aXNpYmxlOnJpbmctWzNweF0gZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAgZGF0YS1bc2l6ZT1kZWZhdWx0XTpoLTkgZGF0YS1bc2l6ZT1zbV06aC04ICo6ZGF0YS1bc2xvdD1zZWxlY3QtdmFsdWVdOmxpbmUtY2xhbXAtMSAqOmRhdGEtW3Nsb3Q9c2VsZWN0LXZhbHVlXTpmbGV4ICo6ZGF0YS1bc2xvdD1zZWxlY3QtdmFsdWVdOml0ZW1zLWNlbnRlciAqOmRhdGEtW3Nsb3Q9c2VsZWN0LXZhbHVlXTpnYXAtMiBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTRcIixcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDxTZWxlY3RQcmltaXRpdmUuSWNvbiBhc0NoaWxkPlxuICAgICAgICA8Q2hldnJvbkRvd25JY29uIGNsYXNzTmFtZT1cInNpemUtNCBvcGFjaXR5LTUwXCIgLz5cbiAgICAgIDwvU2VsZWN0UHJpbWl0aXZlLkljb24+XG4gICAgPC9TZWxlY3RQcmltaXRpdmUuVHJpZ2dlcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBTZWxlY3RDb250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgcG9zaXRpb24gPSAncG9wcGVyJyxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTZWxlY3RQcmltaXRpdmUuQ29udGVudD4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0UHJpbWl0aXZlLlBvcnRhbD5cbiAgICAgIDxTZWxlY3RQcmltaXRpdmUuQ29udGVudFxuICAgICAgICBkYXRhLXNsb3Q9XCJzZWxlY3QtY29udGVudFwiXG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ2JnLXBvcG92ZXIgdGV4dC1wb3BvdmVyLWZvcmVncm91bmQgZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1pbiBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1vcGVuXTpmYWRlLWluLTAgZGF0YS1bc3RhdGU9Y2xvc2VkXTp6b29tLW91dC05NSBkYXRhLVtzdGF0ZT1vcGVuXTp6b29tLWluLTk1IGRhdGEtW3NpZGU9Ym90dG9tXTpzbGlkZS1pbi1mcm9tLXRvcC0yIGRhdGEtW3NpZGU9bGVmdF06c2xpZGUtaW4tZnJvbS1yaWdodC0yIGRhdGEtW3NpZGU9cmlnaHRdOnNsaWRlLWluLWZyb20tbGVmdC0yIGRhdGEtW3NpZGU9dG9wXTpzbGlkZS1pbi1mcm9tLWJvdHRvbS0yIHJlbGF0aXZlIHotNTAgbWF4LWgtKC0tcmFkaXgtc2VsZWN0LWNvbnRlbnQtYXZhaWxhYmxlLWhlaWdodCkgbWluLXctWzhyZW1dIG9yaWdpbi0oLS1yYWRpeC1zZWxlY3QtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luKSBvdmVyZmxvdy14LWhpZGRlbiBvdmVyZmxvdy15LWF1dG8gcm91bmRlZC1tZCBib3JkZXIgc2hhZG93LW1kJyxcbiAgICAgICAgICBwb3NpdGlvbiA9PT0gJ3BvcHBlcicgJiZcbiAgICAgICAgICAgICdkYXRhLVtzaWRlPWJvdHRvbV06dHJhbnNsYXRlLXktMSBkYXRhLVtzaWRlPWxlZnRdOi10cmFuc2xhdGUteC0xIGRhdGEtW3NpZGU9cmlnaHRdOnRyYW5zbGF0ZS14LTEgZGF0YS1bc2lkZT10b3BdOi10cmFuc2xhdGUteS0xJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgcG9zaXRpb249e3Bvc2l0aW9ufVxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICA+XG4gICAgICAgIDxTZWxlY3RTY3JvbGxVcEJ1dHRvbiAvPlxuICAgICAgICA8U2VsZWN0UHJpbWl0aXZlLlZpZXdwb3J0XG4gICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICdwLTEnLFxuICAgICAgICAgICAgcG9zaXRpb24gPT09ICdwb3BwZXInICYmXG4gICAgICAgICAgICAgICdoLVt2YXIoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci1oZWlnaHQpXSB3LWZ1bGwgbWluLXctW3ZhcigtLXJhZGl4LXNlbGVjdC10cmlnZ2VyLXdpZHRoKV0gc2Nyb2xsLW15LTEnXG4gICAgICAgICAgKX1cbiAgICAgICAgPlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9TZWxlY3RQcmltaXRpdmUuVmlld3BvcnQ+XG4gICAgICAgIDxTZWxlY3RTY3JvbGxEb3duQnV0dG9uIC8+XG4gICAgICA8L1NlbGVjdFByaW1pdGl2ZS5Db250ZW50PlxuICAgIDwvU2VsZWN0UHJpbWl0aXZlLlBvcnRhbD5cbiAgKVxufVxuXG5mdW5jdGlvbiBTZWxlY3RMYWJlbCh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTZWxlY3RQcmltaXRpdmUuTGFiZWw+KSB7XG4gIHJldHVybiAoXG4gICAgPFNlbGVjdFByaW1pdGl2ZS5MYWJlbFxuICAgICAgZGF0YS1zbG90PVwic2VsZWN0LWxhYmVsXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCBweC0yIHB5LTEuNSB0ZXh0LXhzJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFNlbGVjdEl0ZW0oe1xuICBjbGFzc05hbWUsXG4gIGNoaWxkcmVuLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNlbGVjdFByaW1pdGl2ZS5JdGVtPikge1xuICByZXR1cm4gKFxuICAgIDxTZWxlY3RQcmltaXRpdmUuSXRlbVxuICAgICAgZGF0YS1zbG90PVwic2VsZWN0LWl0ZW1cIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgXCJmb2N1czpiZy1hY2NlbnQgZm9jdXM6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCBbJl9zdmc6bm90KFtjbGFzcyo9J3RleHQtJ10pXTp0ZXh0LW11dGVkLWZvcmVncm91bmQgcmVsYXRpdmUgZmxleCB3LWZ1bGwgY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGdhcC0yIHJvdW5kZWQtc20gcHktMS41IHByLTggcGwtMiB0ZXh0LXNtIG91dGxpbmUtaGlkZGVuIHNlbGVjdC1ub25lIGRhdGEtW2Rpc2FibGVkXTpwb2ludGVyLWV2ZW50cy1ub25lIGRhdGEtW2Rpc2FibGVkXTpvcGFjaXR5LTUwIFsmX3N2Z106cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnNocmluay0wIFsmX3N2Zzpub3QoW2NsYXNzKj0nc2l6ZS0nXSldOnNpemUtNCAqOltzcGFuXTpsYXN0OmZsZXggKjpbc3Bhbl06bGFzdDppdGVtcy1jZW50ZXIgKjpbc3Bhbl06bGFzdDpnYXAtMlwiLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMiBmbGV4IHNpemUtMy41IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICA8U2VsZWN0UHJpbWl0aXZlLkl0ZW1JbmRpY2F0b3I+XG4gICAgICAgICAgPENoZWNrSWNvbiBjbGFzc05hbWU9XCJzaXplLTRcIiAvPlxuICAgICAgICA8L1NlbGVjdFByaW1pdGl2ZS5JdGVtSW5kaWNhdG9yPlxuICAgICAgPC9zcGFuPlxuICAgICAgPFNlbGVjdFByaW1pdGl2ZS5JdGVtVGV4dD57Y2hpbGRyZW59PC9TZWxlY3RQcmltaXRpdmUuSXRlbVRleHQ+XG4gICAgPC9TZWxlY3RQcmltaXRpdmUuSXRlbT5cbiAgKVxufVxuXG5mdW5jdGlvbiBTZWxlY3RTZXBhcmF0b3Ioe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2VsZWN0UHJpbWl0aXZlLlNlcGFyYXRvcj4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0UHJpbWl0aXZlLlNlcGFyYXRvclxuICAgICAgZGF0YS1zbG90PVwic2VsZWN0LXNlcGFyYXRvclwiXG4gICAgICBjbGFzc05hbWU9e2NuKCdiZy1ib3JkZXIgcG9pbnRlci1ldmVudHMtbm9uZSAtbXgtMSBteS0xIGgtcHgnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gU2VsZWN0U2Nyb2xsVXBCdXR0b24oe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2VsZWN0UHJpbWl0aXZlLlNjcm9sbFVwQnV0dG9uPikge1xuICByZXR1cm4gKFxuICAgIDxTZWxlY3RQcmltaXRpdmUuU2Nyb2xsVXBCdXR0b25cbiAgICAgIGRhdGEtc2xvdD1cInNlbGVjdC1zY3JvbGwtdXAtYnV0dG9uXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdmbGV4IGN1cnNvci1kZWZhdWx0IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweS0xJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxDaGV2cm9uVXBJY29uIGNsYXNzTmFtZT1cInNpemUtNFwiIC8+XG4gICAgPC9TZWxlY3RQcmltaXRpdmUuU2Nyb2xsVXBCdXR0b24+XG4gIClcbn1cblxuZnVuY3Rpb24gU2VsZWN0U2Nyb2xsRG93bkJ1dHRvbih7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTZWxlY3RQcmltaXRpdmUuU2Nyb2xsRG93bkJ1dHRvbj4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0UHJpbWl0aXZlLlNjcm9sbERvd25CdXR0b25cbiAgICAgIGRhdGEtc2xvdD1cInNlbGVjdC1zY3JvbGwtZG93bi1idXR0b25cIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2ZsZXggY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHB5LTEnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgPlxuICAgICAgPENoZXZyb25Eb3duSWNvbiBjbGFzc05hbWU9XCJzaXplLTRcIiAvPlxuICAgIDwvU2VsZWN0UHJpbWl0aXZlLlNjcm9sbERvd25CdXR0b24+XG4gIClcbn1cblxuZXhwb3J0IHtcbiAgU2VsZWN0LFxuICBTZWxlY3RDb250ZW50LFxuICBTZWxlY3RHcm91cCxcbiAgU2VsZWN0SXRlbSxcbiAgU2VsZWN0TGFiZWwsXG4gIFNlbGVjdFNjcm9sbERvd25CdXR0b24sXG4gIFNlbGVjdFNjcm9sbFVwQnV0dG9uLFxuICBTZWxlY3RTZXBhcmF0b3IsXG4gIFNlbGVjdFRyaWdnZXIsXG4gIFNlbGVjdFZhbHVlLFxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIFNlcGFyYXRvclByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3Qtc2VwYXJhdG9yJ1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5mdW5jdGlvbiBTZXBhcmF0b3Ioe1xuICBjbGFzc05hbWUsXG4gIG9yaWVudGF0aW9uID0gJ2hvcml6b250YWwnLFxuICBkZWNvcmF0aXZlID0gdHJ1ZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTZXBhcmF0b3JQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VwYXJhdG9yUHJpbWl0aXZlLlJvb3RcbiAgICAgIGRhdGEtc2xvdD1cInNlcGFyYXRvci1yb290XCJcbiAgICAgIGRlY29yYXRpdmU9e2RlY29yYXRpdmV9XG4gICAgICBvcmllbnRhdGlvbj17b3JpZW50YXRpb259XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnYmctYm9yZGVyIHNocmluay0wIGRhdGEtW29yaWVudGF0aW9uPWhvcml6b250YWxdOmgtcHggZGF0YS1bb3JpZW50YXRpb249aG9yaXpvbnRhbF06dy1mdWxsIGRhdGEtW29yaWVudGF0aW9uPXZlcnRpY2FsXTpoLWZ1bGwgZGF0YS1bb3JpZW50YXRpb249dmVydGljYWxdOnctcHgnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgeyBTZXBhcmF0b3IgfVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIFNoZWV0UHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1kaWFsb2cnXG5pbXBvcnQgeyBYSWNvbiB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gU2hlZXQoeyAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2hlZXRQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIDxTaGVldFByaW1pdGl2ZS5Sb290IGRhdGEtc2xvdD1cInNoZWV0XCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBTaGVldFRyaWdnZXIoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNoZWV0UHJpbWl0aXZlLlRyaWdnZXI+KSB7XG4gIHJldHVybiA8U2hlZXRQcmltaXRpdmUuVHJpZ2dlciBkYXRhLXNsb3Q9XCJzaGVldC10cmlnZ2VyXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBTaGVldENsb3NlKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTaGVldFByaW1pdGl2ZS5DbG9zZT4pIHtcbiAgcmV0dXJuIDxTaGVldFByaW1pdGl2ZS5DbG9zZSBkYXRhLXNsb3Q9XCJzaGVldC1jbG9zZVwiIHsuLi5wcm9wc30gLz5cbn1cblxuZnVuY3Rpb24gU2hlZXRQb3J0YWwoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNoZWV0UHJpbWl0aXZlLlBvcnRhbD4pIHtcbiAgcmV0dXJuIDxTaGVldFByaW1pdGl2ZS5Qb3J0YWwgZGF0YS1zbG90PVwic2hlZXQtcG9ydGFsXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBTaGVldE92ZXJsYXkoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2hlZXRQcmltaXRpdmUuT3ZlcmxheT4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2hlZXRQcmltaXRpdmUuT3ZlcmxheVxuICAgICAgZGF0YS1zbG90PVwic2hlZXQtb3ZlcmxheVwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1pbiBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1vcGVuXTpmYWRlLWluLTAgZml4ZWQgaW5zZXQtMCB6LTUwIGJnLWJsYWNrLzUwJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gU2hlZXRDb250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgc2lkZSA9ICdyaWdodCcsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2hlZXRQcmltaXRpdmUuQ29udGVudD4gJiB7XG4gIHNpZGU/OiAndG9wJyB8ICdyaWdodCcgfCAnYm90dG9tJyB8ICdsZWZ0J1xufSkge1xuICByZXR1cm4gKFxuICAgIDxTaGVldFBvcnRhbD5cbiAgICAgIDxTaGVldE92ZXJsYXkgLz5cbiAgICAgIDxTaGVldFByaW1pdGl2ZS5Db250ZW50XG4gICAgICAgIGRhdGEtc2xvdD1cInNoZWV0LWNvbnRlbnRcIlxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdiZy1iYWNrZ3JvdW5kIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBmaXhlZCB6LTUwIGZsZXggZmxleC1jb2wgZ2FwLTQgc2hhZG93LWxnIHRyYW5zaXRpb24gZWFzZS1pbi1vdXQgZGF0YS1bc3RhdGU9Y2xvc2VkXTpkdXJhdGlvbi0zMDAgZGF0YS1bc3RhdGU9b3Blbl06ZHVyYXRpb24tNTAwJyxcbiAgICAgICAgICBzaWRlID09PSAncmlnaHQnICYmXG4gICAgICAgICAgICAnZGF0YS1bc3RhdGU9Y2xvc2VkXTpzbGlkZS1vdXQtdG8tcmlnaHQgZGF0YS1bc3RhdGU9b3Blbl06c2xpZGUtaW4tZnJvbS1yaWdodCBpbnNldC15LTAgcmlnaHQtMCBoLWZ1bGwgdy0zLzQgYm9yZGVyLWwgc206bWF4LXctc20nLFxuICAgICAgICAgIHNpZGUgPT09ICdsZWZ0JyAmJlxuICAgICAgICAgICAgJ2RhdGEtW3N0YXRlPWNsb3NlZF06c2xpZGUtb3V0LXRvLWxlZnQgZGF0YS1bc3RhdGU9b3Blbl06c2xpZGUtaW4tZnJvbS1sZWZ0IGluc2V0LXktMCBsZWZ0LTAgaC1mdWxsIHctMy80IGJvcmRlci1yIHNtOm1heC13LXNtJyxcbiAgICAgICAgICBzaWRlID09PSAndG9wJyAmJlxuICAgICAgICAgICAgJ2RhdGEtW3N0YXRlPWNsb3NlZF06c2xpZGUtb3V0LXRvLXRvcCBkYXRhLVtzdGF0ZT1vcGVuXTpzbGlkZS1pbi1mcm9tLXRvcCBpbnNldC14LTAgdG9wLTAgaC1hdXRvIGJvcmRlci1iJyxcbiAgICAgICAgICBzaWRlID09PSAnYm90dG9tJyAmJlxuICAgICAgICAgICAgJ2RhdGEtW3N0YXRlPWNsb3NlZF06c2xpZGUtb3V0LXRvLWJvdHRvbSBkYXRhLVtzdGF0ZT1vcGVuXTpzbGlkZS1pbi1mcm9tLWJvdHRvbSBpbnNldC14LTAgYm90dG9tLTAgaC1hdXRvIGJvcmRlci10JyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgPlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDxTaGVldFByaW1pdGl2ZS5DbG9zZSBjbGFzc05hbWU9XCJyaW5nLW9mZnNldC1iYWNrZ3JvdW5kIGZvY3VzOnJpbmctcmluZyBkYXRhLVtzdGF0ZT1vcGVuXTpiZy1zZWNvbmRhcnkgYWJzb2x1dGUgdG9wLTQgcmlnaHQtNCByb3VuZGVkLXhzIG9wYWNpdHktNzAgdHJhbnNpdGlvbi1vcGFjaXR5IGhvdmVyOm9wYWNpdHktMTAwIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLW9mZnNldC0yIGZvY3VzOm91dGxpbmUtaGlkZGVuIGRpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmVcIj5cbiAgICAgICAgICA8WEljb24gY2xhc3NOYW1lPVwic2l6ZS00XCIgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XG4gICAgICAgIDwvU2hlZXRQcmltaXRpdmUuQ2xvc2U+XG4gICAgICA8L1NoZWV0UHJpbWl0aXZlLkNvbnRlbnQ+XG4gICAgPC9TaGVldFBvcnRhbD5cbiAgKVxufVxuXG5mdW5jdGlvbiBTaGVldEhlYWRlcih7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2Rpdic+KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgZGF0YS1zbG90PVwic2hlZXQtaGVhZGVyXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ2ZsZXggZmxleC1jb2wgZ2FwLTEuNSBwLTQnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gU2hlZXRGb290ZXIoeyBjbGFzc05hbWUsIC4uLnByb3BzIH06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdkaXYnPikge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtc2xvdD1cInNoZWV0LWZvb3RlclwiXG4gICAgICBjbGFzc05hbWU9e2NuKCdtdC1hdXRvIGZsZXggZmxleC1jb2wgZ2FwLTIgcC00JywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFNoZWV0VGl0bGUoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2hlZXRQcmltaXRpdmUuVGl0bGU+KSB7XG4gIHJldHVybiAoXG4gICAgPFNoZWV0UHJpbWl0aXZlLlRpdGxlXG4gICAgICBkYXRhLXNsb3Q9XCJzaGVldC10aXRsZVwiXG4gICAgICBjbGFzc05hbWU9e2NuKCd0ZXh0LWZvcmVncm91bmQgZm9udC1zZW1pYm9sZCcsIGNsYXNzTmFtZSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBTaGVldERlc2NyaXB0aW9uKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNoZWV0UHJpbWl0aXZlLkRlc2NyaXB0aW9uPikge1xuICByZXR1cm4gKFxuICAgIDxTaGVldFByaW1pdGl2ZS5EZXNjcmlwdGlvblxuICAgICAgZGF0YS1zbG90PVwic2hlZXQtZGVzY3JpcHRpb25cIlxuICAgICAgY2xhc3NOYW1lPXtjbigndGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRleHQtc20nLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IHtcbiAgU2hlZXQsXG4gIFNoZWV0VHJpZ2dlcixcbiAgU2hlZXRDbG9zZSxcbiAgU2hlZXRDb250ZW50LFxuICBTaGVldEhlYWRlcixcbiAgU2hlZXRGb290ZXIsXG4gIFNoZWV0VGl0bGUsXG4gIFNoZWV0RGVzY3JpcHRpb24sXG59XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgVGFic1ByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtdGFicydcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gVGFicyh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBUYWJzUHJpbWl0aXZlLlJvb3Q+KSB7XG4gIHJldHVybiAoXG4gICAgPFRhYnNQcmltaXRpdmUuUm9vdFxuICAgICAgZGF0YS1zbG90PVwidGFic1wiXG4gICAgICBjbGFzc05hbWU9e2NuKCdmbGV4IGZsZXgtY29sIGdhcC0yJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFRhYnNMaXN0KHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFRhYnNQcmltaXRpdmUuTGlzdD4pIHtcbiAgcmV0dXJuIChcbiAgICA8VGFic1ByaW1pdGl2ZS5MaXN0XG4gICAgICBkYXRhLXNsb3Q9XCJ0YWJzLWxpc3RcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2JnLW11dGVkIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCBpbmxpbmUtZmxleCBoLTkgdy1maXQgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtbGcgcC1bM3B4XScsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFRhYnNUcmlnZ2VyKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFRhYnNQcmltaXRpdmUuVHJpZ2dlcj4pIHtcbiAgcmV0dXJuIChcbiAgICA8VGFic1ByaW1pdGl2ZS5UcmlnZ2VyXG4gICAgICBkYXRhLXNsb3Q9XCJ0YWJzLXRyaWdnZXJcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgXCJkYXRhLVtzdGF0ZT1hY3RpdmVdOmJnLWJhY2tncm91bmQgZGFyazpkYXRhLVtzdGF0ZT1hY3RpdmVdOnRleHQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGZvY3VzLXZpc2libGU6b3V0bGluZS1yaW5nIGRhcms6ZGF0YS1bc3RhdGU9YWN0aXZlXTpib3JkZXItaW5wdXQgZGFyazpkYXRhLVtzdGF0ZT1hY3RpdmVdOmJnLWlucHV0LzMwIHRleHQtZm9yZWdyb3VuZCBkYXJrOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBpbmxpbmUtZmxleCBoLVtjYWxjKDEwMCUtMXB4KV0gZmxleC0xIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMS41IHJvdW5kZWQtbWQgYm9yZGVyIGJvcmRlci10cmFuc3BhcmVudCBweC0yIHB5LTEgdGV4dC1zbSBmb250LW1lZGl1bSB3aGl0ZXNwYWNlLW5vd3JhcCB0cmFuc2l0aW9uLVtjb2xvcixib3gtc2hhZG93XSBmb2N1cy12aXNpYmxlOnJpbmctWzNweF0gZm9jdXMtdmlzaWJsZTpvdXRsaW5lLTEgZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBkaXNhYmxlZDpvcGFjaXR5LTUwIGRhdGEtW3N0YXRlPWFjdGl2ZV06c2hhZG93LXNtIFsmX3N2Z106cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmddOnNocmluay0wIFsmX3N2Zzpub3QoW2NsYXNzKj0nc2l6ZS0nXSldOnNpemUtNFwiLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBUYWJzQ29udGVudCh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBUYWJzUHJpbWl0aXZlLkNvbnRlbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPFRhYnNQcmltaXRpdmUuQ29udGVudFxuICAgICAgZGF0YS1zbG90PVwidGFicy1jb250ZW50XCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ2ZsZXgtMSBvdXRsaW5lLW5vbmUnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IHsgVGFicywgVGFic0xpc3QsIFRhYnNUcmlnZ2VyLCBUYWJzQ29udGVudCB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgVG9vbHRpcFByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtdG9vbHRpcCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gVG9vbHRpcFByb3ZpZGVyKHtcbiAgZGVsYXlEdXJhdGlvbiA9IDAsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgVG9vbHRpcFByaW1pdGl2ZS5Qcm92aWRlcj4pIHtcbiAgcmV0dXJuIChcbiAgICA8VG9vbHRpcFByaW1pdGl2ZS5Qcm92aWRlclxuICAgICAgZGF0YS1zbG90PVwidG9vbHRpcC1wcm92aWRlclwiXG4gICAgICBkZWxheUR1cmF0aW9uPXtkZWxheUR1cmF0aW9ufVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gVG9vbHRpcCh7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgVG9vbHRpcFByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gKFxuICAgIDxUb29sdGlwUHJvdmlkZXI+XG4gICAgICA8VG9vbHRpcFByaW1pdGl2ZS5Sb290IGRhdGEtc2xvdD1cInRvb2x0aXBcIiB7Li4ucHJvcHN9IC8+XG4gICAgPC9Ub29sdGlwUHJvdmlkZXI+XG4gIClcbn1cblxuZnVuY3Rpb24gVG9vbHRpcFRyaWdnZXIoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFRvb2x0aXBQcmltaXRpdmUuVHJpZ2dlcj4pIHtcbiAgcmV0dXJuIDxUb29sdGlwUHJpbWl0aXZlLlRyaWdnZXIgZGF0YS1zbG90PVwidG9vbHRpcC10cmlnZ2VyXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBUb29sdGlwQ29udGVudCh7XG4gIGNsYXNzTmFtZSxcbiAgc2lkZU9mZnNldCA9IDAsXG4gIGNoaWxkcmVuLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFRvb2x0aXBQcmltaXRpdmUuQ29udGVudD4pIHtcbiAgcmV0dXJuIChcbiAgICA8VG9vbHRpcFByaW1pdGl2ZS5Qb3J0YWw+XG4gICAgICA8VG9vbHRpcFByaW1pdGl2ZS5Db250ZW50XG4gICAgICAgIGRhdGEtc2xvdD1cInRvb2x0aXAtY29udGVudFwiXG4gICAgICAgIHNpZGVPZmZzZXQ9e3NpZGVPZmZzZXR9XG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgYW5pbWF0ZS1pbiBmYWRlLWluLTAgem9vbS1pbi05NSBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1jbG9zZWRdOnpvb20tb3V0LTk1IGRhdGEtW3NpZGU9Ym90dG9tXTpzbGlkZS1pbi1mcm9tLXRvcC0yIGRhdGEtW3NpZGU9bGVmdF06c2xpZGUtaW4tZnJvbS1yaWdodC0yIGRhdGEtW3NpZGU9cmlnaHRdOnNsaWRlLWluLWZyb20tbGVmdC0yIGRhdGEtW3NpZGU9dG9wXTpzbGlkZS1pbi1mcm9tLWJvdHRvbS0yIHotNTAgdy1maXQgb3JpZ2luLSgtLXJhZGl4LXRvb2x0aXAtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luKSByb3VuZGVkLW1kIHB4LTMgcHktMS41IHRleHQteHMgdGV4dC1iYWxhbmNlJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgPlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDxUb29sdGlwUHJpbWl0aXZlLkFycm93IGNsYXNzTmFtZT1cImJnLXByaW1hcnkgZmlsbC1wcmltYXJ5IHotNTAgc2l6ZS0yLjUgdHJhbnNsYXRlLXktW2NhbGMoLTUwJV8tXzJweCldIHJvdGF0ZS00NSByb3VuZGVkLVsycHhdXCIgLz5cbiAgICAgIDwvVG9vbHRpcFByaW1pdGl2ZS5Db250ZW50PlxuICAgIDwvVG9vbHRpcFByaW1pdGl2ZS5Qb3J0YWw+XG4gIClcbn1cblxuZXhwb3J0IHsgVG9vbHRpcCwgVG9vbHRpcFRyaWdnZXIsIFRvb2x0aXBDb250ZW50LCBUb29sdGlwUHJvdmlkZXIgfVxuIiwKICAgICJpbXBvcnQge1xuICBEaWFsb2csXG4gIERpYWxvZ0NvbnRlbnQsXG4gIERpYWxvZ0hlYWRlcixcbiAgRGlhbG9nVGl0bGUsXG59IGZyb20gJ0AvY29tcG9uZW50cy91aSdcbmltcG9ydCBSZWFjdCwgeyB1c2VJbXBlcmF0aXZlSGFuZGxlLCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRHJhZ2dhYmxlRXZlbnQgfSBmcm9tICdAL2ZlYXR1cmVzL2RyYWdnYWJsZS1ldmVudC9kcmFnZ2FibGUtZXZlbnQnXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB0eXBlIHsgU2VsZWN0ZWREYXlFdmVudHMgfSBmcm9tICcuLi90eXBlcydcblxuaW50ZXJmYWNlIEFsbEV2ZW50RGlhbG9nUHJvcHMge1xuICByZWY6IFJlYWN0LlJlZjx7XG4gICAgb3BlbjogKCkgPT4gdm9pZFxuICAgIGNsb3NlOiAoKSA9PiB2b2lkXG4gICAgc2V0U2VsZWN0ZWREYXlFdmVudHM6IChkYXlFdmVudHM6IFNlbGVjdGVkRGF5RXZlbnRzKSA9PiB2b2lkXG4gIH0+XG59XG5cbmV4cG9ydCBjb25zdCBBbGxFdmVudERpYWxvZzogUmVhY3QuRkM8QWxsRXZlbnREaWFsb2dQcm9wcz4gPSAoeyByZWYgfSkgPT4ge1xuICBjb25zdCBbZGlhbG9nT3Blbiwgc2V0RGlhbG9nT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW3NlbGVjdGVkRGF5RXZlbnRzLCBzZXRTZWxlY3RlZERheUV2ZW50c10gPVxuICAgIHVzZVN0YXRlPFNlbGVjdGVkRGF5RXZlbnRzIHwgbnVsbD4obnVsbClcbiAgY29uc3QgeyBjdXJyZW50RGF0ZSwgZmlyc3REYXlPZldlZWsgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgdXNlSW1wZXJhdGl2ZUhhbmRsZShyZWYsICgpID0+ICh7XG4gICAgb3BlbjogKCkgPT4gc2V0RGlhbG9nT3Blbih0cnVlKSxcbiAgICBjbG9zZTogKCkgPT4gc2V0RGlhbG9nT3BlbihmYWxzZSksXG4gICAgc2V0U2VsZWN0ZWREYXlFdmVudHM6IChkYXlFdmVudHM6IFNlbGVjdGVkRGF5RXZlbnRzKSA9PlxuICAgICAgc2V0U2VsZWN0ZWREYXlFdmVudHMoZGF5RXZlbnRzKSxcbiAgfSkpXG5cbiAgLy8gR2V0IHN0YXJ0IGRhdGUgZm9yIHRoZSBjdXJyZW50IG1vbnRoIHZpZXcgYmFzZWQgb24gZmlyc3REYXlPZldlZWtcbiAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gY3VycmVudERhdGUuc3RhcnRPZignbW9udGgnKVxuXG4gIC8vIENhbGN1bGF0ZSB0aGUgZmlyc3QgZGF5IG9mIHRoZSBjYWxlbmRhciBncmlkIGNvcnJlY3RseVxuICAvLyBGaW5kIHRoZSBmaXJzdCBkYXkgb2Ygd2VlayAoZS5nLiBTdW5kYXkgb3IgTW9uZGF5KSB0aGF0IGNvbWVzIGJlZm9yZSBvciBvbiB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aFxuICBsZXQgYWRqdXN0ZWRGaXJzdERheU9mQ2FsZW5kYXIgPSBmaXJzdERheU9mTW9udGguY2xvbmUoKVxuICB3aGlsZSAoYWRqdXN0ZWRGaXJzdERheU9mQ2FsZW5kYXIuZGF5KCkgIT09IGZpcnN0RGF5T2ZXZWVrKSB7XG4gICAgYWRqdXN0ZWRGaXJzdERheU9mQ2FsZW5kYXIgPSBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhci5zdWJ0cmFjdCgxLCAnZGF5JylcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPERpYWxvZyBvcGVuPXtkaWFsb2dPcGVufSBvbk9wZW5DaGFuZ2U9e3NldERpYWxvZ09wZW59PlxuICAgICAgPERpYWxvZ0NvbnRlbnQgY2xhc3NOYW1lPVwibWF4LWgtWzgwdmhdIG1heC13LW1kIG92ZXJmbG93LXktYXV0b1wiPlxuICAgICAgICA8RGlhbG9nSGVhZGVyPlxuICAgICAgICAgIDxEaWFsb2dUaXRsZT5cbiAgICAgICAgICAgIHtzZWxlY3RlZERheUV2ZW50cyAmJiBzZWxlY3RlZERheUV2ZW50cy5kYXkuZm9ybWF0KCdNTU1NIEQsIFlZWVknKX1cbiAgICAgICAgICA8L0RpYWxvZ1RpdGxlPlxuICAgICAgICA8L0RpYWxvZ0hlYWRlcj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJtdC00IHNwYWNlLXktM1wiPlxuICAgICAgICAgIHtzZWxlY3RlZERheUV2ZW50cyAmJlxuICAgICAgICAgICAgc2VsZWN0ZWREYXlFdmVudHMuZXZlbnRzLm1hcCgoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8RHJhZ2dhYmxlRXZlbnRcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZD17ZXZlbnQuaWR9IC8vIFVzZSBldmVudCBJRCBmb3IgdW5pcXVlIGlkZW50aWZpY2F0aW9uXG4gICAgICAgICAgICAgICAgICBrZXk9e2V2ZW50LmlkfVxuICAgICAgICAgICAgICAgICAgZXZlbnQ9e2V2ZW50fVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgbXktMSBoLVszMHB4XVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9EaWFsb2dDb250ZW50PlxuICAgIDwvRGlhbG9nPlxuICApXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCB7IHVzZURyYWdnYWJsZSB9IGZyb20gJ0BkbmQta2l0L2NvcmUnXG5pbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCB0eXBlIHsgQ1NTUHJvcGVydGllcyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgbWVtbyB9IGZyb20gJ3JlYWN0J1xuXG5mdW5jdGlvbiBEcmFnZ2FibGVFdmVudFVubWVtb2l6ZWQoe1xuICBlbGVtZW50SWQsXG4gIGV2ZW50LFxuICBjbGFzc05hbWUsXG4gIHN0eWxlLFxuICBkaXNhYmxlRHJhZyA9IGZhbHNlLFxufToge1xuICBlbGVtZW50SWQ6IHN0cmluZ1xuICBjbGFzc05hbWU/OiBzdHJpbmdcbiAgc3R5bGU/OiBDU1NQcm9wZXJ0aWVzXG4gIGV2ZW50OiBDYWxlbmRhckV2ZW50XG4gIGRpc2FibGVEcmFnPzogYm9vbGVhblxufSkge1xuICBjb25zdCB7IG9uRXZlbnRDbGljaywgcmVuZGVyRXZlbnQsIGRpc2FibGVFdmVudENsaWNrLCBkaXNhYmxlRHJhZ0FuZERyb3AgfSA9XG4gICAgdXNlQ2FsZW5kYXJDb250ZXh0KClcbiAgY29uc3QgeyBhdHRyaWJ1dGVzLCBsaXN0ZW5lcnMsIHNldE5vZGVSZWYsIGlzRHJhZ2dpbmcgfSA9IHVzZURyYWdnYWJsZSh7XG4gICAgaWQ6IGVsZW1lbnRJZCxcbiAgICBkYXRhOiB7XG4gICAgICBldmVudCxcbiAgICAgIHR5cGU6ICdjYWxlbmRhci1ldmVudCcsXG4gICAgfSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZURyYWcgfHwgZGlzYWJsZURyYWdBbmREcm9wLFxuICB9KVxuXG4gIC8vIERlZmF1bHQgZXZlbnQgY29udGVudCB0byByZW5kZXIgaWYgY3VzdG9tIHJlbmRlckV2ZW50IGlzIG5vdCBwcm92aWRlZFxuICBjb25zdCBEZWZhdWx0RXZlbnRDb250ZW50ID0gKCkgPT4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgIGV2ZW50LmJhY2tncm91bmRDb2xvciB8fCAnYmctYmx1ZS01MDAnLFxuICAgICAgICBldmVudC5jb2xvciB8fCAndGV4dC13aGl0ZScsXG4gICAgICAgICdoLWZ1bGwgdy1mdWxsIHB4LTEgYm9yZGVyLVsxLjVweF0gYm9yZGVyLWNhcmQgcm91bmRlZC1tZCB0ZXh0LWxlZnQgb3ZlcmZsb3ctY2xpcCdcbiAgICAgICl9XG4gICAgICBzdHlsZT17eyBiYWNrZ3JvdW5kQ29sb3I6IGV2ZW50LmJhY2tncm91bmRDb2xvciwgY29sb3I6IGV2ZW50LmNvbG9yIH19XG4gICAgPlxuICAgICAgPHAgY2xhc3NOYW1lPVwidGV4dC1bMTBweF0gZm9udC1zZW1pYm9sZCBzbTp0ZXh0LXhzIG10LTAuNVwiPlxuICAgICAgICB7ZXZlbnQudGl0bGV9XG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG4gIClcblxuICByZXR1cm4gKFxuICAgIDxBbmltYXRlUHJlc2VuY2UgbW9kZT1cIndhaXRcIj5cbiAgICAgIDxtb3Rpb24uZGl2XG4gICAgICAgIGtleT17ZWxlbWVudElkfVxuICAgICAgICByZWY9e3NldE5vZGVSZWZ9XG4gICAgICAgIHsuLi5hdHRyaWJ1dGVzfVxuICAgICAgICB7Li4ubGlzdGVuZXJzfVxuICAgICAgICBpbml0aWFsPXt7IG9wYWNpdHk6IDAsIHk6IC01MCB9fVxuICAgICAgICBhbmltYXRlPXt7IG9wYWNpdHk6IDEsIHk6IDAgfX1cbiAgICAgICAgZXhpdD17eyBvcGFjaXR5OiAwLCB5OiAtNTAgfX1cbiAgICAgICAgbGF5b3V0XG4gICAgICAgIGxheW91dElkPXtlbGVtZW50SWR9XG4gICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuNCwgZWFzZTogJ2Vhc2VJbk91dCcgfX1cbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAndHJ1bmNhdGUgaC1mdWxsIHctZnVsbCcsXG4gICAgICAgICAgZGlzYWJsZURyYWcgfHwgZGlzYWJsZURyYWdBbmREcm9wXG4gICAgICAgICAgICA/IGRpc2FibGVFdmVudENsaWNrXG4gICAgICAgICAgICAgID8gJ2N1cnNvci1kZWZhdWx0J1xuICAgICAgICAgICAgICA6ICdjdXJzb3ItcG9pbnRlcidcbiAgICAgICAgICAgIDogJ2N1cnNvci1ncmFiJyxcbiAgICAgICAgICBpc0RyYWdnaW5nICYmXG4gICAgICAgICAgICAhKGRpc2FibGVEcmFnIHx8IGRpc2FibGVEcmFnQW5kRHJvcCkgJiZcbiAgICAgICAgICAgICdjdXJzb3ItZ3JhYmJpbmcgc2hhZG93LWxnJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgc3R5bGU9e3N0eWxlfVxuICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICBvbkV2ZW50Q2xpY2soZXZlbnQpXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIHsvKiBVc2UgY3VzdG9tIHJlbmRlckV2ZW50IGZyb20gY29udGV4dCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgZGVmYXVsdCAqL31cbiAgICAgICAge3JlbmRlckV2ZW50ID8gcmVuZGVyRXZlbnQoZXZlbnQpIDogPERlZmF1bHRFdmVudENvbnRlbnQgLz59XG4gICAgICA8L21vdGlvbi5kaXY+XG4gICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gIClcbn1cblxuZXhwb3J0IGNvbnN0IERyYWdnYWJsZUV2ZW50ID0gbWVtbyhcbiAgRHJhZ2dhYmxlRXZlbnRVbm1lbW9pemVkLFxuICAocHJldlByb3BzLCBuZXh0UHJvcHMpID0+IHtcbiAgICAvLyBDb21wYXJlIHRoZSBlc3NlbnRpYWwgcHJvcHMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gICAgcmV0dXJuIChcbiAgICAgIHByZXZQcm9wcy5lbGVtZW50SWQgPT09IG5leHRQcm9wcy5lbGVtZW50SWQgJiZcbiAgICAgIHByZXZQcm9wcy5kaXNhYmxlRHJhZyA9PT0gbmV4dFByb3BzLmRpc2FibGVEcmFnICYmXG4gICAgICBwcmV2UHJvcHMuY2xhc3NOYW1lID09PSBuZXh0UHJvcHMuY2xhc3NOYW1lICYmXG4gICAgICBwcmV2UHJvcHMuZXZlbnQuaWQgPT09IG5leHRQcm9wcy5ldmVudC5pZCAmJlxuICAgICAgcHJldlByb3BzLmV2ZW50LmhlaWdodCA9PT0gbmV4dFByb3BzLmV2ZW50LmhlaWdodFxuICAgIClcbiAgfVxuKVxuIiwKICAgICJpbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgRHJvcHBhYmxlQ2VsbCB9IGZyb20gJ0AvZmVhdHVyZXMvZHJvcHBhYmxlLWNlbGwvZHJvcHBhYmxlLWNlbGwnXG5pbXBvcnQgeyBBbGxFdmVudERpYWxvZyB9IGZyb20gJy4vYWxsLWV2ZW50cy1kaWFsb2cnXG5pbXBvcnQgdHlwZSB7IFNlbGVjdGVkRGF5RXZlbnRzIH0gZnJvbSAnLi4vdHlwZXMnXG5pbXBvcnQgdHlwZSB7IENhbGVuZGFyRXZlbnQgfSBmcm9tICdAL2NvbXBvbmVudHMvdHlwZXMnXG5cbmludGVyZmFjZSBEYXlDZWxsUHJvcHMge1xuICBpbmRleDogbnVtYmVyIC8vIEluZGV4IG9mIHRoZSBkYXkgaW4gdGhlIHdlZWsgKDAtNilcbiAgZGF5OiBkYXlqcy5EYXlqc1xuICBkYXlNYXhFdmVudHM/OiBudW1iZXJcbiAgY2xhc3NOYW1lPzogc3RyaW5nIC8vIE9wdGlvbmFsIGNsYXNzTmFtZSBmb3IgY3VzdG9tIHN0eWxpbmdcbn1cblxuZXhwb3J0IGNvbnN0IERheUNlbGw6IFJlYWN0LkZDPERheUNlbGxQcm9wcz4gPSAoe1xuICBpbmRleCxcbiAgZGF5LFxuICBjbGFzc05hbWUgPSAnJyxcbn0pID0+IHtcbiAgY29uc3QgYWxsRXZlbnRzRGlhbG9nUmVmID0gUmVhY3QudXNlUmVmPHtcbiAgICBvcGVuOiAoKSA9PiB2b2lkXG4gICAgY2xvc2U6ICgpID0+IHZvaWRcbiAgICBzZXRTZWxlY3RlZERheUV2ZW50czogKGRheUV2ZW50czogU2VsZWN0ZWREYXlFdmVudHMpID0+IHZvaWRcbiAgfT4obnVsbClcbiAgY29uc3Qge1xuICAgIGV2ZW50cyxcbiAgICBjdXJyZW50RGF0ZSxcbiAgICBmaXJzdERheU9mV2VlayxcbiAgICBkYXlNYXhFdmVudHMgPSAwLFxuICB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcbiAgY29uc3QgdG9kYXlFdmVudHMgPSBldmVudHMuZmlsdGVyKChlKSA9PiB7XG4gICAgY29uc3Qgc3RhcnRzVG9kYXkgPSBlLnN0YXJ0LmlzU2FtZShkYXksICdkYXknKVxuICAgIGNvbnN0IGVuZHNUb2RheSA9IGUuZW5kLmlzU2FtZShkYXksICdkYXknKVxuICAgIGNvbnN0IHNwYW5zVG9kYXkgPSBlLnN0YXJ0LmlzQmVmb3JlKGRheSwgJ2RheScpICYmIGUuZW5kLmlzQWZ0ZXIoZGF5LCAnZGF5JylcblxuICAgIHJldHVybiBzdGFydHNUb2RheSB8fCBlbmRzVG9kYXkgfHwgc3BhbnNUb2RheVxuICB9KVxuXG4gIC8vIEdldCBzdGFydCBkYXRlIGZvciB0aGUgY3VycmVudCBtb250aCB2aWV3IGJhc2VkIG9uIGZpcnN0RGF5T2ZXZWVrXG4gIGNvbnN0IGZpcnN0RGF5T2ZNb250aCA9IGN1cnJlbnREYXRlLnN0YXJ0T2YoJ21vbnRoJylcblxuICAvLyBDYWxjdWxhdGUgdGhlIGZpcnN0IGRheSBvZiB0aGUgY2FsZW5kYXIgZ3JpZCBjb3JyZWN0bHlcbiAgLy8gRmluZCB0aGUgZmlyc3QgZGF5IG9mIHdlZWsgKGUuZy4gU3VuZGF5IG9yIE1vbmRheSkgdGhhdCBjb21lcyBiZWZvcmUgb3Igb24gdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGhcbiAgbGV0IGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyID0gZmlyc3REYXlPZk1vbnRoLmNsb25lKClcbiAgd2hpbGUgKGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyLmRheSgpICE9PSBmaXJzdERheU9mV2Vlaykge1xuICAgIGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyID0gYWRqdXN0ZWRGaXJzdERheU9mQ2FsZW5kYXIuc3VidHJhY3QoMSwgJ2RheScpXG4gIH1cblxuICAvLyBIYW5kbGVyIGZvciBzaG93aW5nIGFsbCBldmVudHMgaW4gYSBkaWFsb2dcbiAgY29uc3Qgc2hvd0FsbEV2ZW50cyA9IChkYXk6IGRheWpzLkRheWpzLCBldmVudHM6IENhbGVuZGFyRXZlbnRbXSkgPT4ge1xuICAgIGFsbEV2ZW50c0RpYWxvZ1JlZi5jdXJyZW50Py5zZXRTZWxlY3RlZERheUV2ZW50cyh7XG4gICAgICBkYXksXG4gICAgICBldmVudHMsXG4gICAgfSlcbiAgICBhbGxFdmVudHNEaWFsb2dSZWYuY3VycmVudD8ub3BlbigpXG4gIH1cblxuICBjb25zdCBpc1RvZGF5ID0gZGF5LmlzU2FtZShkYXlqcygpLCAnZGF5JylcbiAgY29uc3QgaXNDdXJyZW50TW9udGggPSBkYXkubW9udGgoKSA9PT0gY3VycmVudERhdGUubW9udGgoKVxuICBjb25zdCBpc0xhc3RDb2x1bW4gPSBpbmRleCA9PT0gNiAvLyBTYXR1cmRheSBpcyB0aGUgbGFzdCBjb2x1bW4gaW4gYSB3ZWVrXG5cbiAgY29uc3QgaGlkZGVuRXZlbnRzQ291bnQgPSB0b2RheUV2ZW50cy5sZW5ndGggLSBkYXlNYXhFdmVudHNcbiAgY29uc3QgaGFzSGlkZGVuRXZlbnRzID0gaGlkZGVuRXZlbnRzQ291bnQgPiAwXG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAgPERyb3BwYWJsZUNlbGxcbiAgICAgICAgaWQ9e2BkYXktY2VsbC0ke2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgICB0eXBlPVwiZGF5LWNlbGxcIlxuICAgICAgICBkYXRhLXRlc3RpZD17YGRheS1jZWxsLSR7ZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgIGRhdGU9e2RheX1cbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAnY3Vyc29yLXBvaW50ZXIgb3ZlcmZsb3ctY2xpcCBwLTEgaG92ZXI6YmctYWNjZW50JyxcbiAgICAgICAgICAhaXNDdXJyZW50TW9udGggJiYgJ2JnLXNlY29uZGFyeSB0ZXh0LW11dGVkLWZvcmVncm91bmQnLFxuICAgICAgICAgIGlzTGFzdENvbHVtbiAmJiAnYm9yZGVyLXItMCcsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICA+XG4gICAgICAgIHsvKiBBYnNvbHV0ZWx5IHBvc2l0aW9uZWQgbXVsdGktZGF5IGJhcnMgKEdvb2dsZSBDYWxlbmRhciBzdHlsZSkgKi99XG5cbiAgICAgICAgey8qIFNpbmdsZS1kYXkgZXZlbnRzIGNvbnRhaW5lciBwb3NpdGlvbmVkIGJlbG93IG11bHRpLWRheSBldmVudHMgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LWNvbCBnYXAtMVwiPlxuICAgICAgICAgIHsvKiBEYXkgbnVtYmVyICovfVxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICdmbGV4IGgtNSB3LTUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtZnVsbCB0ZXh0LXhzIHNtOmgtNiBzbTp3LTYgc206dGV4dC1zbScsXG4gICAgICAgICAgICAgIGlzVG9kYXkgJiYgJ2JnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgZm9udC1tZWRpdW0nXG4gICAgICAgICAgICApfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIHtkYXkuZGF0ZSgpfVxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgey8qIFJlbmRlciBwbGFjZWhvbGRlcnMgZm9yIGV2ZW50cyB0aGF0IG9jY3VyIHRvZGF5IHNvIHRoYXQgdGhlIGNlbGwgaGVpZ2h0IGlzIGFjY29yZGluZyB0byBkYXlNYXhFdmVudHMuICovfVxuICAgICAgICAgIHt0b2RheUV2ZW50cy5zbGljZSgwLCBkYXlNYXhFdmVudHMpLm1hcCgoZXZlbnQsIHJvd0luZGV4KSA9PiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGtleT17YGVtcHR5LSR7cm93SW5kZXh9YH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC1bMjBweF0gdy1mdWxsXCJcbiAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2V2ZW50Py50aXRsZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKSl9XG5cbiAgICAgICAgICB7LyogU2hvdyBtb3JlIGV2ZW50cyBidXR0b24gd2l0aCBhY2N1cmF0ZSBjb3VudCAqL31cbiAgICAgICAgICB7aGFzSGlkZGVuRXZlbnRzICYmIChcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGhvdmVyOnRleHQtZm9yZWdyb3VuZCBjdXJzb3ItcG9pbnRlciB0ZXh0LVsxMHB4XSB3aGl0ZXNwYWNlLW5vd3JhcCBzbTp0ZXh0LXhzIG10LTFcIlxuICAgICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKClcblxuICAgICAgICAgICAgICAgIHNob3dBbGxFdmVudHMoZGF5LCB0b2RheUV2ZW50cylcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgK3toaWRkZW5FdmVudHNDb3VudH0gbW9yZVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L0Ryb3BwYWJsZUNlbGw+XG5cbiAgICAgIHsvKiBEaWFsb2cgZm9yIHNob3dpbmcgYWxsIGV2ZW50cyAqL31cbiAgICAgIDxBbGxFdmVudERpYWxvZyByZWY9e2FsbEV2ZW50c0RpYWxvZ1JlZn0gLz5cbiAgICA8Lz5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VEcm9wcGFibGUgfSBmcm9tICdAZG5kLWtpdC9jb3JlJ1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHR5cGUgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuXG5pbnRlcmZhY2UgRHJvcHBhYmxlQ2VsbFByb3BzIHtcbiAgaWQ6IHN0cmluZ1xuICB0eXBlOiAnZGF5LWNlbGwnIHwgJ3RpbWUtY2VsbCdcbiAgZGF0ZTogZGF5anMuRGF5anNcbiAgaG91cj86IG51bWJlclxuICBtaW51dGU/OiBudW1iZXJcbiAgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGVcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIHN0eWxlPzogUmVhY3QuQ1NTUHJvcGVydGllc1xuICAnZGF0YS10ZXN0aWQnPzogc3RyaW5nXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEcm9wcGFibGVDZWxsKHtcbiAgaWQsXG4gIHR5cGUsXG4gIGRhdGUsXG4gIGhvdXIsXG4gIG1pbnV0ZSxcbiAgY2hpbGRyZW4sXG4gIGNsYXNzTmFtZSxcbiAgc3R5bGUsXG4gICdkYXRhLXRlc3RpZCc6IGRhdGFUZXN0SWQsXG59OiBEcm9wcGFibGVDZWxsUHJvcHMpIHtcbiAgY29uc3QgeyBvbkNlbGxDbGljaywgZGlzYWJsZURyYWdBbmREcm9wLCBkaXNhYmxlQ2VsbENsaWNrIH0gPVxuICAgIHVzZUNhbGVuZGFyQ29udGV4dCgpXG4gIGNvbnN0IHsgaXNPdmVyLCBzZXROb2RlUmVmIH0gPSB1c2VEcm9wcGFibGUoe1xuICAgIGlkLFxuICAgIGRhdGE6IHtcbiAgICAgIHR5cGUsXG4gICAgICBkYXRlLFxuICAgICAgaG91cixcbiAgICAgIG1pbnV0ZSxcbiAgICB9LFxuICAgIGRpc2FibGVkOiBkaXNhYmxlRHJhZ0FuZERyb3AsXG4gIH0pXG5cbiAgY29uc3QgaGFuZGxlQ2VsbENsaWNrID0gKGU6IFJlYWN0Lk1vdXNlRXZlbnQpID0+IHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgaWYgKGRpc2FibGVDZWxsQ2xpY2spIHJldHVyblxuXG4gICAgY29uc3Qgc3RhcnREYXRlID0gZGF0ZS5ob3VyKGhvdXIgPz8gMCkubWludXRlKG1pbnV0ZSA/PyAwKVxuICAgIGxldCBlbmREYXRlID0gc3RhcnREYXRlLmNsb25lKClcbiAgICBpZiAoaG91ciAhPT0gdW5kZWZpbmVkICYmIG1pbnV0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmREYXRlID0gZW5kRGF0ZS5ob3VyKGhvdXIpLm1pbnV0ZShtaW51dGUgKyAxNSkgLy8gZGF5IHZpZXcgdGltZSBzbG90cyBhcmUgMTUgbWludXRlc1xuICAgIH0gZWxzZSBpZiAoaG91ciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBlbmREYXRlID0gZW5kRGF0ZS5ob3VyKGhvdXIgKyAxKS5taW51dGUoMCkgLy8gd2VlayB2aWV3IHRpbWUgc2xvdHMgYXJlIDEgaG91clxuICAgIH0gZWxzZSB7XG4gICAgICBlbmREYXRlID0gZW5kRGF0ZS5ob3VyKDIzKS5taW51dGUoNTkpIC8vIG1vbnRoIHZpZXcgZnVsbCBkYXlcbiAgICB9XG5cbiAgICBvbkNlbGxDbGljayhzdGFydERhdGUsIGVuZERhdGUpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIHJlZj17c2V0Tm9kZVJlZn1cbiAgICAgIGRhdGEtdGVzdGlkPXtkYXRhVGVzdElkfVxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICBpc092ZXIgJiYgIWRpc2FibGVEcmFnQW5kRHJvcCAmJiAnYmctYWNjZW50JyxcbiAgICAgICAgZGlzYWJsZUNlbGxDbGljayA/ICdjdXJzb3ItZGVmYXVsdCcgOiAnY3Vyc29yLXBvaW50ZXInXG4gICAgICApfVxuICAgICAgb25DbGljaz17aGFuZGxlQ2VsbENsaWNrfVxuICAgICAgc3R5bGU9e3N0eWxlfVxuICAgID5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCBSZWFjdCwgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5leHBvcnQgY29uc3QgTW9udGhIZWFkZXI6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCB7XG4gICAgZmlyc3REYXlPZldlZWssXG4gICAgY3VycmVudExvY2FsZSxcbiAgICBzdGlja3lWaWV3SGVhZGVyLFxuICAgIHZpZXdIZWFkZXJDbGFzc05hbWUsXG4gIH0gPSB1c2VDYWxlbmRhckNvbnRleHQoKVxuXG4gIC8vIFJlb3JkZXIgd2VlayBkYXlzIGJhc2VkIG9uIGZpcnN0RGF5T2ZXZWVrXG4gIGNvbnN0IHdlZWtEYXlzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgY29uc3QgZGF5cyA9IGRheWpzLndlZWtkYXlzKCkubWFwKChkYXkpID0+IGRheS50b0xvd2VyQ2FzZSgpKVxuICAgIGNvbnN0IHNob3J0RGF5cyA9IGRheWpzLndlZWtkYXlzU2hvcnQoKS5tYXAoKGRheSkgPT4gZGF5LnRvTG93ZXJDYXNlKCkpXG5cbiAgICAvLyBSb3RhdGUgdGhlIGFycmF5IGJhc2VkIG9uIGZpcnN0RGF5T2ZXZWVrXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXJzdERheU9mV2VlazsgaSsrKSB7XG4gICAgICBjb25zdCBkYXlUb01vdmUgPSBkYXlzLnNoaWZ0KClcbiAgICAgIGNvbnN0IHNob3J0RGF5VG9Nb3ZlID0gc2hvcnREYXlzLnNoaWZ0KClcbiAgICAgIGlmIChkYXlUb01vdmUpIGRheXMucHVzaChkYXlUb01vdmUpXG4gICAgICBpZiAoc2hvcnREYXlUb01vdmUpIHNob3J0RGF5cy5wdXNoKHNob3J0RGF5VG9Nb3ZlKVxuICAgIH1cblxuICAgIHJldHVybiB7IGRheXMsIHNob3J0RGF5cyB9XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlYWN0LWhvb2tzL2V4aGF1c3RpdmUtZGVwc1xuICB9LCBbZmlyc3REYXlPZldlZWssIGN1cnJlbnRMb2NhbGVdKVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2dyaWQgZ3JpZC1jb2xzLTcgYm9yZGVyLWInLFxuICAgICAgICBzdGlja3lWaWV3SGVhZGVyICYmICdzdGlja3kgdG9wLTAgei0xMDAnLFxuICAgICAgICB2aWV3SGVhZGVyQ2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgZGF0YS10ZXN0aWQ9XCJtb250aC1oZWFkZXJcIlxuICAgID5cbiAgICAgIHt3ZWVrRGF5cy5kYXlzLm1hcCgod2Vla0RheSwgaW5kZXgpID0+IChcbiAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBrZXk9e3dlZWtEYXl9IG1vZGU9XCJ3YWl0XCI+XG4gICAgICAgICAgPG1vdGlvbi5kaXZcbiAgICAgICAgICAgIGtleT17d2Vla0RheX1cbiAgICAgICAgICAgIGluaXRpYWw9e3sgb3BhY2l0eTogMCwgeTogLTEwIH19XG4gICAgICAgICAgICBhbmltYXRlPXt7IG9wYWNpdHk6IDEsIHk6IDAgfX1cbiAgICAgICAgICAgIGV4aXQ9e3sgb3BhY2l0eTogMCwgeTogLTEwIH19XG4gICAgICAgICAgICB0cmFuc2l0aW9uPXt7XG4gICAgICAgICAgICAgIGR1cmF0aW9uOiAwLjI1LFxuICAgICAgICAgICAgICBlYXNlOiAnZWFzZUluT3V0JyxcbiAgICAgICAgICAgICAgZGVsYXk6IGluZGV4ICogMC4wNSxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJweS0yIHRleHQtY2VudGVyIGZvbnQtbWVkaXVtIGJvcmRlci1yIGZpcnN0OmJvcmRlci1sXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgd2Vla2RheS1oZWFkZXItJHt3ZWVrRGF5fWB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiaGlkZGVuIHRleHQtc20gc206aW5saW5lXCI+e3dlZWtEYXl9PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC14cyBzbTpoaWRkZW5cIj5cbiAgICAgICAgICAgICAge3dlZWtEYXlzLnNob3J0RGF5c1tpbmRleF19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9tb3Rpb24uZGl2PlxuICAgICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cbiAgICAgICkpfVxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImV4cG9ydCBjb25zdCBHQVBfQkVUV0VFTl9FTEVNRU5UUyA9IDEgLy8gcHggKGdhcC0xKVxuZXhwb3J0IGNvbnN0IERBWV9OVU1CRVJfSEVJR0hUID0gMjggLy8gcHggKGgtNylcbmV4cG9ydCBjb25zdCBFVkVOVF9CQVJfSEVJR0hUID0gMjQgLy8gcHggKGgtWzI0cHhdKVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENhbGVuZGFyRXZlbnQgfSBmcm9tICdAL2NvbXBvbmVudHMvdHlwZXMnXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyBEcmFnZ2FibGVFdmVudCB9IGZyb20gJ0AvZmVhdHVyZXMvZHJhZ2dhYmxlLWV2ZW50L2RyYWdnYWJsZS1ldmVudCdcbmltcG9ydCB7XG4gIERBWV9OVU1CRVJfSEVJR0hULFxuICBFVkVOVF9CQVJfSEVJR0hULFxuICBHQVBfQkVUV0VFTl9FTEVNRU5UUyxcbn0gZnJvbSAnQC9saWIvY29uc3RhbnRzJ1xuXG5pbnRlcmZhY2UgUHJvY2Vzc2VkRXZlbnQgZXh0ZW5kcyBDYWxlbmRhckV2ZW50IHtcbiAgbGVmdDogbnVtYmVyIC8vIExlZnQgcG9zaXRpb24gaW4gcGVyY2VudGFnZVxuICB3aWR0aDogbnVtYmVyIC8vIFdpZHRoIGluIHBlcmNlbnRhZ2VcbiAgdG9wOiBudW1iZXIgLy8gVG9wIHBvc2l0aW9uIGluIHBlcmNlbnRhZ2VcbiAgaGVpZ2h0OiBudW1iZXIgLy8gSGVpZ2h0IGluIHBlcmNlbnRhZ2VcbiAgcG9zaXRpb246IG51bWJlciAvLyBQb3NpdGlvbiBpbiB0aGUgcm93ICgwIGZvciBmaXJzdCwgMSBmb3Igc2Vjb25kLCBldGMuKVxufVxuXG5pbnRlcmZhY2UgV2Vla0V2ZW50c0xheWVyUHJvcHMge1xuICBkYXlzOiBkYXlqcy5EYXlqc1tdXG59XG5cbmV4cG9ydCBjb25zdCBXZWVrRXZlbnRzTGF5ZXI6IFJlYWN0LkZDPFdlZWtFdmVudHNMYXllclByb3BzPiA9ICh7IGRheXMgfSkgPT4ge1xuICBjb25zdCB7IGV2ZW50cywgZGF5TWF4RXZlbnRzIH0gPSB1c2VDYWxlbmRhckNvbnRleHQoKVxuXG4gIGNvbnN0IHdlZWtTdGFydCA9IGRheXNbMF1cbiAgY29uc3Qgd2Vla0VuZCA9IGRheXNbNl1cblxuICAvLyBHZXQgYWxsIGV2ZW50cyB0aGF0IGludGVyc2VjdCB3aXRoIHRoaXMgd2Vla1xuICBjb25zdCB3ZWVrRXZlbnRzID0gZXZlbnRzLmZpbHRlcigoZSkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCdDaGVja2luZyBldmVudDonLCBlKVxuICAgIGNvbnN0IHN0YXJ0c0luV2VlayA9XG4gICAgICBlLnN0YXJ0LmlzU2FtZU9yQWZ0ZXIod2Vla1N0YXJ0LnN0YXJ0T2YoJ2RheScpKSAmJlxuICAgICAgZS5zdGFydC5pc1NhbWVPckJlZm9yZSh3ZWVrRW5kLmVuZE9mKCdkYXknKSlcbiAgICBjb25zdCBlbmRzSW5XZWVrID1cbiAgICAgIGUuZW5kLmlzU2FtZU9yQWZ0ZXIod2Vla1N0YXJ0LnN0YXJ0T2YoJ2RheScpKSAmJlxuICAgICAgZS5lbmQuaXNTYW1lT3JCZWZvcmUod2Vla0VuZC5lbmRPZignZGF5JykpXG4gICAgY29uc3Qgc3BhbnNXZWVrID1cbiAgICAgIGUuc3RhcnQuaXNCZWZvcmUod2Vla1N0YXJ0LnN0YXJ0T2YoJ2RheScpKSAmJlxuICAgICAgZS5lbmQuaXNBZnRlcih3ZWVrRW5kLmVuZE9mKCdkYXknKSlcbiAgICByZXR1cm4gc3RhcnRzSW5XZWVrIHx8IGVuZHNJbldlZWsgfHwgc3BhbnNXZWVrXG4gIH0pXG5cbiAgLy8gU2VwYXJhdGUgbXVsdGktZGF5IGFuZCBzaW5nbGUtZGF5IGV2ZW50c1xuICBjb25zdCBtdWx0aURheUV2ZW50cyA9IHdlZWtFdmVudHMuZmlsdGVyKFxuICAgIChlKSA9PiBlLmVuZC5kaWZmKGUuc3RhcnQsICdkYXknKSA+IDBcbiAgKVxuICBjb25zdCBzaW5nbGVEYXlFdmVudHMgPSB3ZWVrRXZlbnRzLmZpbHRlcihcbiAgICAoZSkgPT4gZS5lbmQuZGlmZihlLnN0YXJ0LCAnZGF5JykgPT09IDBcbiAgKVxuXG4gIC8vIFNvcnQgbXVsdGktZGF5IGV2ZW50cyBieSBzdGFydCBkYXRlLCB0aGVuIGJ5IGR1cmF0aW9uXG4gIGNvbnN0IHNvcnRlZE11bHRpRGF5ID0gWy4uLm11bHRpRGF5RXZlbnRzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgY29uc3Qgc3RhcnREaWZmID0gYS5zdGFydC5kaWZmKGIuc3RhcnQpXG4gICAgaWYgKHN0YXJ0RGlmZiAhPT0gMCkgcmV0dXJuIHN0YXJ0RGlmZlxuICAgIHJldHVybiBiLmVuZC5kaWZmKGIuc3RhcnQpIC0gYS5lbmQuZGlmZihhLnN0YXJ0KSAvLyBMb25nZXIgZXZlbnRzIGZpcnN0XG4gIH0pXG5cbiAgLy8gU29ydCBzaW5nbGUtZGF5IGV2ZW50cyBieSBzdGFydCB0aW1lXG4gIGNvbnN0IHNvcnRlZFNpbmdsZURheSA9IFsuLi5zaW5nbGVEYXlFdmVudHNdLnNvcnQoKGEsIGIpID0+XG4gICAgYS5zdGFydC5kaWZmKGIuc3RhcnQpXG4gIClcblxuICAvLyBDcmVhdGUgNyB4IGRheU1heEV2ZW50cyBncmlkIHdpdGggZmxhZ3NcbiAgY29uc3QgZ3JpZDogQXJyYXk8QXJyYXk8eyB0YWtlbjogYm9vbGVhbjsgZXZlbnQ6IENhbGVuZGFyRXZlbnQgfCBudWxsIH0+PiA9IFtdXG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGRheU1heEV2ZW50czsgcm93KyspIHtcbiAgICBncmlkW3Jvd10gPSBbXVxuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IDc7IGNvbCsrKSB7XG4gICAgICBncmlkW3Jvd11bY29sXSA9IHsgdGFrZW46IGZhbHNlLCBldmVudDogbnVsbCB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZXZlbnRQb3NpdGlvbnM6IFByb2Nlc3NlZEV2ZW50W10gPSBbXVxuXG4gIC8vIFN0ZXAgMTogQXNzaWduIHBvc2l0aW9ucyB0byBtdWx0aS1kYXkgZXZlbnRzIGZpcnN0XG4gIGZvciAoY29uc3QgZXZlbnQgb2Ygc29ydGVkTXVsdGlEYXkpIHtcbiAgICBjb25zdCBldmVudFN0YXJ0ID0gZGF5anMubWF4KGV2ZW50LnN0YXJ0LnN0YXJ0T2YoJ2RheScpLCB3ZWVrU3RhcnQpXG4gICAgY29uc3QgZXZlbnRFbmQgPSBkYXlqcy5taW4oZXZlbnQuZW5kLnN0YXJ0T2YoJ2RheScpLCB3ZWVrRW5kKVxuICAgIGNvbnN0IHN0YXJ0Q29sID0gTWF0aC5tYXgoMCwgZXZlbnRTdGFydC5kaWZmKHdlZWtTdGFydCwgJ2RheScpKVxuICAgIGNvbnN0IGVuZENvbCA9IE1hdGgubWluKDYsIGV2ZW50RW5kLmRpZmYod2Vla1N0YXJ0LCAnZGF5JykpXG5cbiAgICAvLyBUcnkgdG8gcGxhY2UgdGhlIGV2ZW50IHN0YXJ0aW5nIGZyb20gaXRzIG9yaWdpbmFsIHN0YXJ0IGNvbHVtblxuICAgIGxldCBwbGFjZWRTdWNjZXNzZnVsbHkgPSBmYWxzZVxuXG4gICAgLy8gRmlyc3QgdHJ5OiBwbGFjZSBmcm9tIG9yaWdpbmFsIHN0YXJ0IHBvc2l0aW9uXG4gICAgbGV0IGFzc2lnbmVkUm93ID0gLTFcbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBkYXlNYXhFdmVudHM7IHJvdysrKSB7XG4gICAgICBsZXQgY2FuUGxhY2UgPSB0cnVlXG4gICAgICBmb3IgKGxldCBjb2wgPSBzdGFydENvbDsgY29sIDw9IGVuZENvbDsgY29sKyspIHtcbiAgICAgICAgaWYgKGdyaWRbcm93XVtjb2xdLnRha2VuKSB7XG4gICAgICAgICAgY2FuUGxhY2UgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChjYW5QbGFjZSkge1xuICAgICAgICBhc3NpZ25lZFJvdyA9IHJvd1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGZvdW5kIGEgcm93LCBhc3NpZ24gdGhlIGV2ZW50IHRvIGFsbCBpdHMgY29sdW1uc1xuICAgIGlmIChhc3NpZ25lZFJvdyAhPT0gLTEpIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IHN0YXJ0Q29sOyBjb2wgPD0gZW5kQ29sOyBjb2wrKykge1xuICAgICAgICBncmlkW2Fzc2lnbmVkUm93XVtjb2xdID0geyB0YWtlbjogdHJ1ZSwgZXZlbnQgfVxuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgcG9zaXRpb24gZGF0YSBmb3IgcmVuZGVyaW5nXG4gICAgICBjb25zdCBzcGFuRGF5cyA9IGVuZENvbCAtIHN0YXJ0Q29sICsgMVxuICAgICAgZXZlbnRQb3NpdGlvbnMucHVzaCh7XG4gICAgICAgIGxlZnQ6IChzdGFydENvbCAvIDcpICogMTAwLFxuICAgICAgICB3aWR0aDogKHNwYW5EYXlzIC8gNykgKiAxMDAsXG4gICAgICAgIHRvcDpcbiAgICAgICAgICBEQVlfTlVNQkVSX0hFSUdIVCArXG4gICAgICAgICAgR0FQX0JFVFdFRU5fRUxFTUVOVFMgK1xuICAgICAgICAgIGFzc2lnbmVkUm93ICogKEVWRU5UX0JBUl9IRUlHSFQgKyBHQVBfQkVUV0VFTl9FTEVNRU5UUyksXG4gICAgICAgIGhlaWdodDogRVZFTlRfQkFSX0hFSUdIVCxcbiAgICAgICAgcG9zaXRpb246IGFzc2lnbmVkUm93LFxuICAgICAgICAuLi5ldmVudCxcbiAgICAgIH0pXG4gICAgICBwbGFjZWRTdWNjZXNzZnVsbHkgPSB0cnVlXG4gICAgfVxuXG4gICAgLy8gSWYgY291bGRuJ3QgcGxhY2UgYXQgb3JpZ2luYWwgcG9zaXRpb24sIHRyeSB0cnVuY2F0ZWQgdmVyc2lvbnMgc3RhcnRpbmcgZnJvbSBsYXRlciBkYXlzXG4gICAgaWYgKCFwbGFjZWRTdWNjZXNzZnVsbHkpIHtcbiAgICAgIGZvciAoXG4gICAgICAgIGxldCB0cnlTdGFydENvbCA9IHN0YXJ0Q29sICsgMTtcbiAgICAgICAgdHJ5U3RhcnRDb2wgPD0gZW5kQ29sO1xuICAgICAgICB0cnlTdGFydENvbCsrXG4gICAgICApIHtcbiAgICAgICAgLy8gVHJ5IHRvIHBsYWNlIHRoZSB0cnVuY2F0ZWQgZXZlbnQgc3RhcnRpbmcgZnJvbSB0aGlzIGNvbHVtblxuICAgICAgICBsZXQgdHJ1bmNhdGVkQXNzaWduZWRSb3cgPSAtMVxuICAgICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBkYXlNYXhFdmVudHM7IHJvdysrKSB7XG4gICAgICAgICAgbGV0IGNhblBsYWNlID0gdHJ1ZVxuICAgICAgICAgIGZvciAobGV0IGNvbCA9IHRyeVN0YXJ0Q29sOyBjb2wgPD0gZW5kQ29sOyBjb2wrKykge1xuICAgICAgICAgICAgaWYgKGdyaWRbcm93XVtjb2xdLnRha2VuKSB7XG4gICAgICAgICAgICAgIGNhblBsYWNlID0gZmFsc2VcbiAgICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNhblBsYWNlKSB7XG4gICAgICAgICAgICB0cnVuY2F0ZWRBc3NpZ25lZFJvdyA9IHJvd1xuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB3ZSBmb3VuZCBhIHJvdyBmb3IgdGhlIHRydW5jYXRlZCB2ZXJzaW9uLCBwbGFjZSBpdFxuICAgICAgICBpZiAodHJ1bmNhdGVkQXNzaWduZWRSb3cgIT09IC0xKSB7XG4gICAgICAgICAgZm9yIChsZXQgY29sID0gdHJ5U3RhcnRDb2w7IGNvbCA8PSBlbmRDb2w7IGNvbCsrKSB7XG4gICAgICAgICAgICBncmlkW3RydW5jYXRlZEFzc2lnbmVkUm93XVtjb2xdID0geyB0YWtlbjogdHJ1ZSwgZXZlbnQgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIENyZWF0ZSBwb3NpdGlvbiBkYXRhIGZvciB0aGUgdHJ1bmNhdGVkIHJlbmRlcmluZ1xuICAgICAgICAgIGNvbnN0IHRydW5jYXRlZFNwYW5EYXlzID0gZW5kQ29sIC0gdHJ5U3RhcnRDb2wgKyAxXG4gICAgICAgICAgZXZlbnRQb3NpdGlvbnMucHVzaCh7XG4gICAgICAgICAgICBsZWZ0OiAodHJ5U3RhcnRDb2wgLyA3KSAqIDEwMCxcbiAgICAgICAgICAgIHdpZHRoOiAodHJ1bmNhdGVkU3BhbkRheXMgLyA3KSAqIDEwMCxcbiAgICAgICAgICAgIHRvcDpcbiAgICAgICAgICAgICAgREFZX05VTUJFUl9IRUlHSFQgK1xuICAgICAgICAgICAgICBHQVBfQkVUV0VFTl9FTEVNRU5UUyArXG4gICAgICAgICAgICAgIHRydW5jYXRlZEFzc2lnbmVkUm93ICogKEVWRU5UX0JBUl9IRUlHSFQgKyBHQVBfQkVUV0VFTl9FTEVNRU5UUyksXG4gICAgICAgICAgICBoZWlnaHQ6IEVWRU5UX0JBUl9IRUlHSFQsXG4gICAgICAgICAgICBwb3NpdGlvbjogdHJ1bmNhdGVkQXNzaWduZWRSb3csXG4gICAgICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgICB9KVxuICAgICAgICAgIHBsYWNlZFN1Y2Nlc3NmdWxseSA9IHRydWVcbiAgICAgICAgICBicmVhayAvLyBTdWNjZXNzZnVsbHkgcGxhY2VkLCBzdG9wIHRyeWluZyBvdGhlciBzdGFydCBwb3NpdGlvbnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFN0ZXAgMjogRmlsbCBnYXBzIHdpdGggc2luZ2xlLWRheSBldmVudHNcbiAgZm9yIChjb25zdCBldmVudCBvZiBzb3J0ZWRTaW5nbGVEYXkpIHtcbiAgICBjb25zdCBldmVudFN0YXJ0ID0gZGF5anMubWF4KGV2ZW50LnN0YXJ0LnN0YXJ0T2YoJ2RheScpLCB3ZWVrU3RhcnQpXG4gICAgY29uc3QgY29sID0gTWF0aC5tYXgoMCwgZXZlbnRTdGFydC5kaWZmKHdlZWtTdGFydCwgJ2RheScpKVxuXG4gICAgLy8gRmluZCB0aGUgZmlyc3QgYXZhaWxhYmxlIHJvdyBpbiB0aGlzIGNvbHVtblxuICAgIGxldCBhc3NpZ25lZFJvdyA9IC0xXG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgZGF5TWF4RXZlbnRzOyByb3crKykge1xuICAgICAgaWYgKCFncmlkW3Jvd11bY29sXS50YWtlbikge1xuICAgICAgICBhc3NpZ25lZFJvdyA9IHJvd1xuICAgICAgICBicmVha1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHdlIGZvdW5kIGEgcm93LCBhc3NpZ24gdGhlIGV2ZW50XG4gICAgaWYgKGFzc2lnbmVkUm93ICE9PSAtMSkge1xuICAgICAgZ3JpZFthc3NpZ25lZFJvd11bY29sXSA9IHsgdGFrZW46IHRydWUsIGV2ZW50IH1cblxuICAgICAgLy8gQ3JlYXRlIHBvc2l0aW9uIGRhdGEgZm9yIHJlbmRlcmluZ1xuICAgICAgZXZlbnRQb3NpdGlvbnMucHVzaCh7XG4gICAgICAgIGxlZnQ6IChjb2wgLyA3KSAqIDEwMCxcbiAgICAgICAgd2lkdGg6ICgxIC8gNykgKiAxMDAsXG4gICAgICAgIHRvcDpcbiAgICAgICAgICBEQVlfTlVNQkVSX0hFSUdIVCArXG4gICAgICAgICAgR0FQX0JFVFdFRU5fRUxFTUVOVFMgK1xuICAgICAgICAgIGFzc2lnbmVkUm93ICogKEVWRU5UX0JBUl9IRUlHSFQgKyBHQVBfQkVUV0VFTl9FTEVNRU5UUyksXG4gICAgICAgIGhlaWdodDogRVZFTlRfQkFSX0hFSUdIVCxcbiAgICAgICAgcG9zaXRpb246IGFzc2lnbmVkUm93LFxuICAgICAgICAuLi5ldmVudCxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIHctZnVsbCBoLWZ1bGwgcG9pbnRlci1ldmVudHMtbm9uZSB6LTIwIG92ZXJmbG93LWNsaXBcIj5cbiAgICAgIHtldmVudFBvc2l0aW9ucy5tYXAoKGV2ZW50KSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtgZXZlbnQtJHtldmVudC5pZH0tJHtldmVudC5wb3NpdGlvbn0tJHt3ZWVrU3RhcnQuZm9ybWF0KFxuICAgICAgICAgICAgICAnWVlZWS1NTS1ERCdcbiAgICAgICAgICAgICl9YH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHotMTAgcG9pbnRlci1ldmVudHMtYXV0byBvdmVyZmxvdy1jbGlwXCJcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGxlZnQ6IGBjYWxjKCR7ZXZlbnQubGVmdH0lICsgdmFyKC0tc3BhY2luZykgKiAwLjI1KWAsXG4gICAgICAgICAgICAgIHdpZHRoOiBgY2FsYygke2V2ZW50LndpZHRofSUgLSB2YXIoLS1zcGFjaW5nKSAqIDEpYCxcbiAgICAgICAgICAgICAgdG9wOiBgJHtldmVudC50b3B9cHhgLFxuICAgICAgICAgICAgICBoZWlnaHQ6IGAke0VWRU5UX0JBUl9IRUlHSFR9cHhgLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8RHJhZ2dhYmxlRXZlbnRcbiAgICAgICAgICAgICAgZWxlbWVudElkPXtgZXZlbnQtJHtldmVudC5pZH0tJHtcbiAgICAgICAgICAgICAgICBldmVudC5wb3NpdGlvblxuICAgICAgICAgICAgICB9LSR7d2Vla1N0YXJ0LmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgICAgIGV2ZW50PXtldmVudH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC1mdWxsIHctZnVsbCBzaGFkb3dcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKVxuICAgICAgfSl9XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsCiAgICAiaW1wb3J0IHsgU2Nyb2xsQXJlYSB9IGZyb20gJ0AvY29tcG9uZW50cy91aSdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgd2Vla09mWWVhciBmcm9tICdkYXlqcy9wbHVnaW4vd2Vla09mWWVhcidcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFdlZWtBbGxEYXlSb3cgfSBmcm9tICcuL3dlZWstYWxsLWRheS1yb3cnXG5pbXBvcnQgeyBXZWVrSGVhZGVyIH0gZnJvbSAnLi93ZWVrLWhlYWRlcidcbmltcG9ydCB7IFdlZWtUaW1lR3JpZCB9IGZyb20gJy4vd2Vlay10aW1lLWdyaWQnXG4vLyBBZGQgd2Vla09mWWVhciBwbHVnaW4gdG8gZGF5anNcbmRheWpzLmV4dGVuZCh3ZWVrT2ZZZWFyKVxuXG5jb25zdCBXZWVrVmlldzogUmVhY3QuRkMgPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGgtZnVsbCBmbGV4LWNvbFwiIGRhdGEtdGVzdGlkPVwid2Vlay12aWV3XCI+XG4gICAgICB7LyogV2VlayBoZWFkZXIgcm93IC0gZml4ZWQgKi99XG4gICAgICA8V2Vla0hlYWRlciAvPlxuXG4gICAgICB7LyogU2Nyb2xsYWJsZSB0aW1lIGdyaWQgKi99XG4gICAgICA8U2Nyb2xsQXJlYVxuICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGZsZXgtMSBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJ3ZWVrLXNjcm9sbC1hcmVhXCJcbiAgICAgID5cbiAgICAgICAgey8qIEFsbC1kYXkgZXZlbnRzIHJvdyAtIGR5bmFtaWMgaGVpZ2h0IGJhc2VkIG9uIGNvbnRlbnQgKi99XG4gICAgICAgIDxXZWVrQWxsRGF5Um93IC8+XG4gICAgICAgIDxXZWVrVGltZUdyaWQgLz5cbiAgICAgIDwvU2Nyb2xsQXJlYT5cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBXZWVrVmlld1xuIiwKICAgICJpbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB0eXBlIGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCBSZWFjdCwgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBEcmFnZ2FibGVFdmVudCB9IGZyb20gJy4uL2RyYWdnYWJsZS1ldmVudC9kcmFnZ2FibGUtZXZlbnQnXG5pbXBvcnQgeyBEcm9wcGFibGVDZWxsIH0gZnJvbSAnLi4vZHJvcHBhYmxlLWNlbGwvZHJvcHBhYmxlLWNlbGwnXG5pbXBvcnQgdHlwZSB7IENhbGVuZGFyRXZlbnQsIFByb2Nlc3NlZENhbGVuZGFyRXZlbnQgfSBmcm9tICdAL2NvbXBvbmVudHMvdHlwZXMnXG5pbXBvcnQgeyBFVkVOVF9CQVJfSEVJR0hULCBHQVBfQkVUV0VFTl9FTEVNRU5UUyB9IGZyb20gJ0AvbGliL2NvbnN0YW50cydcblxuZXhwb3J0IGNvbnN0IFdlZWtBbGxEYXlSb3c6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREYXRlLCBnZXRFdmVudHNGb3JEYXRlUmFuZ2UsIGZpcnN0RGF5T2ZXZWVrIH0gPVxuICAgIHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgLy8gR2V0IHN0YXJ0IGFuZCBlbmQgb2YgY3VycmVudCB3ZWVrIGJhc2VkIG9uIGZpcnN0RGF5T2ZXZWVrIHNldHRpbmdcbiAgY29uc3Qgc3RhcnRPZldlZWsgPSBjdXJyZW50RGF0ZS5zdGFydE9mKCd3ZWVrJykuZGF5KGZpcnN0RGF5T2ZXZWVrKVxuICAvLyBJZiBjdXJyZW50IGRhdGUgaXMgYmVmb3JlIHRoZSBzdGFydCBvZiB3ZWVrLCBtb3ZlIGJhY2sgb25lIHdlZWtcbiAgY29uc3QgYWRqdXN0ZWRTdGFydE9mV2VlayA9IGN1cnJlbnREYXRlLmlzQmVmb3JlKHN0YXJ0T2ZXZWVrKVxuICAgID8gc3RhcnRPZldlZWsuc3VidHJhY3QoMSwgJ3dlZWsnKVxuICAgIDogc3RhcnRPZldlZWtcbiAgY29uc3QgZW5kT2ZXZWVrID0gYWRqdXN0ZWRTdGFydE9mV2Vlay5hZGQoNiwgJ2RheScpXG5cbiAgLy8gQ3JlYXRlIGFuIGFycmF5IG9mIGRheXMgZm9yIHRoZSBjdXJyZW50IHdlZWtcbiAgY29uc3Qgd2Vla0RheXMgPSBbXVxuICBmb3IgKGxldCBpID0gMDsgaSA8IDc7IGkrKykge1xuICAgIHdlZWtEYXlzLnB1c2goYWRqdXN0ZWRTdGFydE9mV2Vlay5hZGQoaSwgJ2RheScpKVxuICB9XG5cbiAgLy8gR2V0IGV2ZW50cyB0aGF0IG1pZ2h0IG92ZXJsYXAgd2l0aCB0aGlzIHdlZWsgKGV4cGFuZCBzZWFyY2ggcmFuZ2UpXG4gIGNvbnN0IGV4cGFuZGVkU3RhcnREYXRlID0gYWRqdXN0ZWRTdGFydE9mV2Vlay5zdWJ0cmFjdCg2LCAnZGF5JykgLy8gTG9vayA2IGRheXMgYmVmb3JlIHdlZWsgc3RhcnRcbiAgY29uc3QgZXhwYW5kZWRFbmREYXRlID0gZW5kT2ZXZWVrLmFkZCg2LCAnZGF5JykgLy8gTG9vayA2IGRheXMgYWZ0ZXIgd2VlayBlbmRcbiAgY29uc3QgYWxsRXZlbnRzID0gZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlKGV4cGFuZGVkU3RhcnREYXRlLCBleHBhbmRlZEVuZERhdGUpXG5cbiAgLy8gRmlsdGVyIGV2ZW50cyB0aGF0IGFjdHVhbGx5IG92ZXJsYXAgd2l0aCB0aGUgY3VycmVudCB3ZWVrXG4gIGNvbnN0IHdlZWtFdmVudHMgPSBhbGxFdmVudHMuZmlsdGVyKChldmVudCkgPT4ge1xuICAgIC8vIEZpeGVkIGxvZ2ljOiBBbiBldmVudCBvdmVybGFwcyB3aXRoIHRoaXMgd2VlayBpZjpcbiAgICByZXR1cm4gKFxuICAgICAgLy8gRWl0aGVyIHRoZSBldmVudCBzdGFydHMgZHVyaW5nIHRoaXMgd2Vla1xuICAgICAgKGV2ZW50LnN0YXJ0LmlzU2FtZU9yQWZ0ZXIoYWRqdXN0ZWRTdGFydE9mV2VlaykgJiZcbiAgICAgICAgZXZlbnQuc3RhcnQuaXNTYW1lT3JCZWZvcmUoZW5kT2ZXZWVrKSkgfHxcbiAgICAgIC8vIE9yIHRoZSBldmVudCBlbmRzIGR1cmluZyB0aGlzIHdlZWtcbiAgICAgIChldmVudC5lbmQuaXNTYW1lT3JBZnRlcihhZGp1c3RlZFN0YXJ0T2ZXZWVrKSAmJlxuICAgICAgICBldmVudC5lbmQuaXNTYW1lT3JCZWZvcmUoZW5kT2ZXZWVrKSkgfHxcbiAgICAgIC8vIE9yIHRoZSBldmVudCBzcGFucyB0aGUgZW50aXJlIHdlZWsgKHN0YXJ0cyBiZWZvcmUgYW5kIGVuZHMgYWZ0ZXIpXG4gICAgICAoZXZlbnQuc3RhcnQuaXNCZWZvcmUoYWRqdXN0ZWRTdGFydE9mV2VlaykgJiZcbiAgICAgICAgZXZlbnQuZW5kLmlzQWZ0ZXIoZW5kT2ZXZWVrKSlcbiAgICApXG4gIH0pXG5cbiAgLy8gU2VwYXJhdGUgYWxsLWRheSBldmVudHMgZnJvbSByZWd1bGFyIGV2ZW50cyAoaW5jbHVkaW5nIG11bHRpLWRheSBldmVudHMpXG4gIGNvbnN0IGFsbERheUV2ZW50cyA9IHdlZWtFdmVudHMuZmlsdGVyKChldmVudCkgPT4gZXZlbnQuYWxsRGF5KVxuXG4gIC8vIFByb2Nlc3MgYW5kIGxheW91dCBhbGwtZGF5IGV2ZW50cyB0byBhdm9pZCBvdmVybGFwcGluZ1xuICBjb25zdCB7IHByb2Nlc3NlZEFsbERheUV2ZW50cyB9ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gU29ydCBhbGwtZGF5IGV2ZW50cyBieSBzdGFydCBkYXRlIGFuZCB0aGVuIGJ5IGR1cmF0aW9uIChsb25nZXIgZXZlbnRzIGZpcnN0KVxuICAgIGNvbnN0IHNvcnRlZEV2ZW50cyA9IFsuLi5hbGxEYXlFdmVudHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIC8vIEZpcnN0IGNvbXBhcmUgYnkgc3RhcnQgZGF0ZVxuICAgICAgY29uc3Qgc3RhcnREaWZmID0gYS5zdGFydC5kaWZmKGIuc3RhcnQpXG4gICAgICBpZiAoc3RhcnREaWZmICE9PSAwKSByZXR1cm4gc3RhcnREaWZmXG5cbiAgICAgIC8vIElmIHN0YXJ0IGRhdGVzIGFyZSB0aGUgc2FtZSwgbG9uZ2VyIGV2ZW50cyBjb21lIGZpcnN0XG4gICAgICBjb25zdCBhRHVyYXRpb24gPSBhLmVuZC5kaWZmKGEuc3RhcnQpXG4gICAgICBjb25zdCBiRHVyYXRpb24gPSBiLmVuZC5kaWZmKGIuc3RhcnQpXG4gICAgICByZXR1cm4gYkR1cmF0aW9uIC0gYUR1cmF0aW9uXG4gICAgfSlcblxuICAgIC8vIFRyYWNrIHBvc2l0aW9ucyBpbiByb3dzXG4gICAgY29uc3Qgcm93czogeyBlbmQ6IGRheWpzLkRheWpzOyBldmVudDogQ2FsZW5kYXJFdmVudCB9W11bXSA9IFtdXG4gICAgY29uc3QgcHJvY2Vzc2VkRXZlbnRzOiBQcm9jZXNzZWRDYWxlbmRhckV2ZW50W10gPSBbXVxuXG4gICAgc29ydGVkRXZlbnRzLmZvckVhY2goKGV2ZW50KSA9PiB7XG4gICAgICAvLyBDYWxjdWxhdGUgd2hpY2ggZGF5cyB0aGlzIGV2ZW50IHNwYW5zXG4gICAgICBjb25zdCBldmVudFN0YXJ0ID0gZXZlbnQuc3RhcnQuaXNCZWZvcmUoYWRqdXN0ZWRTdGFydE9mV2VlaylcbiAgICAgICAgPyBhZGp1c3RlZFN0YXJ0T2ZXZWVrXG4gICAgICAgIDogZXZlbnQuc3RhcnRcbiAgICAgIGNvbnN0IGV2ZW50RW5kID0gZXZlbnQuZW5kLmlzQWZ0ZXIoZW5kT2ZXZWVrKSA/IGVuZE9mV2VlayA6IGV2ZW50LmVuZFxuXG4gICAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gYXMgcGVyY2VudGFnZSBvZiB0aGUgd2VlayB3aWR0aFxuICAgICAgY29uc3Qgc3RhcnREYXlJbmRleCA9IE1hdGgubWF4KFxuICAgICAgICAwLFxuICAgICAgICBldmVudFN0YXJ0LmRpZmYoYWRqdXN0ZWRTdGFydE9mV2VlaywgJ2RheScpXG4gICAgICApXG4gICAgICBjb25zdCBlbmREYXlJbmRleCA9IE1hdGgubWluKDYsIGV2ZW50RW5kLmRpZmYoYWRqdXN0ZWRTdGFydE9mV2VlaywgJ2RheScpKVxuXG4gICAgICBjb25zdCBsZWZ0ID0gKHN0YXJ0RGF5SW5kZXggLyA3KSAqIDEwMFxuICAgICAgY29uc3Qgd2lkdGggPSAoKGVuZERheUluZGV4IC0gc3RhcnREYXlJbmRleCArIDEpIC8gNykgKiAxMDBcblxuICAgICAgLy8gRmluZCBhIHJvdyB3aGVyZSB0aGlzIGV2ZW50IGNhbiBmaXRcbiAgICAgIGxldCByb3dJbmRleCA9IDBcbiAgICAgIGxldCBwbGFjZWQgPSBmYWxzZVxuXG4gICAgICB3aGlsZSAoIXBsYWNlZCkge1xuICAgICAgICBpZiAocm93SW5kZXggPj0gcm93cy5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcm93IGlmIG5lZWRlZFxuICAgICAgICAgIHJvd3MucHVzaChbXSlcbiAgICAgICAgICBwbGFjZWQgPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBldmVudCBjYW4gZml0IGluIHRoZSBjdXJyZW50IHJvd1xuICAgICAgICAgIGNvbnN0IHJvdyA9IHJvd3Nbcm93SW5kZXhdXG4gICAgICAgICAgY29uc3QgY2FuRml0ID0gcm93LmV2ZXJ5KChpdGVtKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICBldmVudFN0YXJ0LmlzQWZ0ZXIoaXRlbS5lbmQpIHx8XG4gICAgICAgICAgICAgIGV2ZW50RW5kLmlzQmVmb3JlKGl0ZW0uZXZlbnQuc3RhcnQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIGlmIChjYW5GaXQpIHtcbiAgICAgICAgICAgIHBsYWNlZCA9IHRydWVcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcm93SW5kZXgrK1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgZXZlbnQgdG8gdGhlIHJvd1xuICAgICAgcm93c1tyb3dJbmRleF0ucHVzaCh7IGVuZDogZXZlbnRFbmQsIGV2ZW50IH0pXG5cbiAgICAgIC8vIEFkZCBwcm9jZXNzZWQgZXZlbnQgd2l0aCBjb3JyZWN0IHBvc2l0aW9uaW5nXG4gICAgICBwcm9jZXNzZWRFdmVudHMucHVzaCh7XG4gICAgICAgIC4uLmV2ZW50LFxuICAgICAgICBsZWZ0LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgdG9wOiByb3dJbmRleCAqIChFVkVOVF9CQVJfSEVJR0hUICsgR0FQX0JFVFdFRU5fRUxFTUVOVFMpLFxuICAgICAgICBoZWlnaHQ6IEVWRU5UX0JBUl9IRUlHSFQsXG4gICAgICAgIGFsbERheTogdHJ1ZSxcbiAgICAgIH0pXG4gICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICBwcm9jZXNzZWRBbGxEYXlFdmVudHM6IHByb2Nlc3NlZEV2ZW50cyxcbiAgICAgIGFsbERheVJvd3NDb3VudDogTWF0aC5tYXgoMSwgcm93cy5sZW5ndGgpLCAvLyBBdCBsZWFzdCAxIHJvdywgZXZlbiBpZiBlbXB0eVxuICAgIH1cbiAgfSwgW2FsbERheUV2ZW50cywgYWRqdXN0ZWRTdGFydE9mV2VlaywgZW5kT2ZXZWVrXSlcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLVthdXRvXzFmcl8xZnJfMWZyXzFmcl8xZnJfMWZyXzFmcl0gZ3JpZC1yb3dzLTEgcmVsYXRpdmVcIlxuICAgICAgZGF0YS10ZXN0aWQ9XCJ3ZWVrLWFsbC1kYXktcm93XCJcbiAgICA+XG4gICAgICB7LyogTGVmdCBsYWJlbCBmb3IgYWxsLWRheSBldmVudHMgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInctMTQgZmxleCBzaHJpbmstMCBpdGVtcy1jZW50ZXIganVzdGlmeS1lbmQgYm9yZGVyLXggYm9yZGVyLWIgcHItMiBtaW4taC0xNlwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgdGV4dC1bMTBweF0gd2hpdGVzcGFjZS1ub3dyYXAgc206dGV4dC14c1wiPlxuICAgICAgICAgIEFsbC1kYXlcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBEcm9wcGFibGUgY2VsbHMgZm9yIGVhY2ggZGF5ICovfVxuICAgICAge3dlZWtEYXlzLm1hcCgoZGF5KSA9PiAoXG4gICAgICAgIDxEcm9wcGFibGVDZWxsXG4gICAgICAgICAga2V5PXtgYWxsLWRheS0ke2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgICAgIGlkPXtgYWxsLWRheS1jZWxsLSR7ZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgdHlwZT1cImRheS1jZWxsXCJcbiAgICAgICAgICBkYXRlPXtkYXl9XG4gICAgICAgICAgY2xhc3NOYW1lPVwiaG92ZXI6YmctYWNjZW50IGgtZnVsbCBmbGV4LTEgY3Vyc29yLXBvaW50ZXIgYm9yZGVyLXIgYm9yZGVyLWJcIlxuICAgICAgICAvPlxuICAgICAgKSl9XG5cbiAgICAgIHsvKiBBbGwtZGF5IGV2ZW50IGJsb2NrcyAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCB6LTEwIHAtMSBjb2wtc3Bhbi03IGNvbC1zdGFydC0yXCI+XG4gICAgICAgIHtwcm9jZXNzZWRBbGxEYXlFdmVudHMubWFwKChldmVudCwgaW5kZXgpID0+IChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBrZXk9e2BhbGwtZGF5LWNvbnRhaW5lci0ke2V2ZW50LmlkfWB9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZVwiXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBsZWZ0OiBgJHtldmVudC5sZWZ0fSVgLFxuICAgICAgICAgICAgICB3aWR0aDogYGNhbGMoJHtldmVudC53aWR0aH0lIC0gdmFyKC0tc3BhY2luZykgKiAyKWAsXG4gICAgICAgICAgICAgIHRvcDogYCR7ZXZlbnQudG9wfXB4YCxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBgJHtldmVudC5oZWlnaHR9cHhgLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8RHJhZ2dhYmxlRXZlbnRcbiAgICAgICAgICAgICAgZWxlbWVudElkPXtgYWxsLWRheS0ke2V2ZW50LmlkfS0ke2luZGV4fWB9XG4gICAgICAgICAgICAgIGV2ZW50PXtldmVudH1cbiAgICAgICAgICAgICAga2V5PXtgYWxsLWRheS0ke2V2ZW50LmlkfS0ke2luZGV4fWB9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtZnVsbCB3LWZ1bGwgb3ZlcmZsb3ctY2xpcCB0ZXh0LXhzIGFic29sdXRlXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsCiAgICAiaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IEFuaW1hdGVQcmVzZW5jZSwgbW90aW9uIH0gZnJvbSAnbW90aW9uL3JlYWN0J1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuXG5leHBvcnQgY29uc3QgV2Vla0hlYWRlcjogUmVhY3QuRkMgPSAoKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjdXJyZW50RGF0ZSxcbiAgICBzZWxlY3REYXRlLFxuICAgIG9wZW5FdmVudEZvcm0sXG4gICAgZmlyc3REYXlPZldlZWssXG4gICAgc3RpY2t5Vmlld0hlYWRlcixcbiAgICB2aWV3SGVhZGVyQ2xhc3NOYW1lLFxuICB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICAvLyBHZXQgc3RhcnQgYW5kIGVuZCBvZiBjdXJyZW50IHdlZWsgYmFzZWQgb24gZmlyc3REYXlPZldlZWsgc2V0dGluZ1xuICBjb25zdCBzdGFydE9mV2VlayA9IGN1cnJlbnREYXRlLnN0YXJ0T2YoJ3dlZWsnKS5kYXkoZmlyc3REYXlPZldlZWspXG4gIC8vIElmIGN1cnJlbnQgZGF0ZSBpcyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHdlZWssIG1vdmUgYmFjayBvbmUgd2Vla1xuICBjb25zdCBhZGp1c3RlZFN0YXJ0T2ZXZWVrID0gY3VycmVudERhdGUuaXNCZWZvcmUoc3RhcnRPZldlZWspXG4gICAgPyBzdGFydE9mV2Vlay5zdWJ0cmFjdCgxLCAnd2VlaycpXG4gICAgOiBzdGFydE9mV2Vla1xuXG4gIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBkYXlzIGZvciB0aGUgY3VycmVudCB3ZWVrXG4gIGNvbnN0IHdlZWtEYXlzID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICB3ZWVrRGF5cy5wdXNoKGFkanVzdGVkU3RhcnRPZldlZWsuYWRkKGksICdkYXknKSlcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgLy8gY3NzIGdyaWQgaGVhZGVyIHdpdGggbGVmIGNvcm5lciBjZWxsIHNob3J0ZXIgdGhhbiB0aGUgcmVzdFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdncmlkIGdyaWQtY29scy1bYXV0b18xZnJfMWZyXzFmcl8xZnJfMWZyXzFmcl8xZnJdIGdyaWQtcm93cy0xJyxcbiAgICAgICAgc3RpY2t5Vmlld0hlYWRlciAmJiAnc3RpY2t5IHRvcC0wIHotMTAwJyxcbiAgICAgICAgdmlld0hlYWRlckNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIGRhdGEtdGVzdGlkPVwid2Vlay1oZWFkZXJcIlxuICAgID5cbiAgICAgIHsvKiBDb3JuZXIgY2VsbCB3aXRoIHdlZWsgbnVtYmVyICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc3Bhbi0xIHctMTQgc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJvcmRlci14IGJvcmRlci1iIHAtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRleHQteHNcIj5XZWVrPC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImZvbnQtbWVkaXVtXCI+e2N1cnJlbnREYXRlLndlZWsoKX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBEYXkgaGVhZGVyIGNlbGxzICovfVxuICAgICAge3dlZWtEYXlzLm1hcCgoZGF5LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBpc1RvZGF5ID0gZGF5LmlzU2FtZShkYXlqcygpLCAnZGF5JylcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxBbmltYXRlUHJlc2VuY2Uga2V5PXtkYXkuZm9ybWF0KCdZWVlZLU1NLUREJyl9IG1vZGU9XCJ3YWl0XCI+XG4gICAgICAgICAgICA8bW90aW9uLmRpdlxuICAgICAgICAgICAgICBrZXk9e2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICAgICAgaW5pdGlhbD17eyBvcGFjaXR5OiAwLCB5OiAtMTAgfX1cbiAgICAgICAgICAgICAgYW5pbWF0ZT17eyBvcGFjaXR5OiAxLCB5OiAwIH19XG4gICAgICAgICAgICAgIGV4aXQ9e3sgb3BhY2l0eTogMCwgeTogLTEwIH19XG4gICAgICAgICAgICAgIHRyYW5zaXRpb249e3tcbiAgICAgICAgICAgICAgICBkdXJhdGlvbjogMC4yNSxcbiAgICAgICAgICAgICAgICBlYXNlOiAnZWFzZUluT3V0JyxcbiAgICAgICAgICAgICAgICBkZWxheTogaW5kZXggKiAwLjA1LFxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAgICdob3ZlcjpiZy1hY2NlbnQgZmxleC0xIGN1cnNvci1wb2ludGVyIHAtMSB0ZXh0LWNlbnRlciBzbTpwLTIgYm9yZGVyLXIgYm9yZGVyLWInLFxuICAgICAgICAgICAgICAgIGlzVG9kYXkgJiYgJ2JnLXByaW1hcnkvMTAgZm9udC1ib2xkJ1xuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0RGF0ZShkYXkpXG4gICAgICAgICAgICAgICAgb3BlbkV2ZW50Rm9ybShkYXkpXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgd2Vlay1kYXktaGVhZGVyLSR7ZGF5LmZvcm1hdCgnZGRkZCcpLnRvTG93ZXJDYXNlKCl9YH1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj57ZGF5LmZvcm1hdCgnZGRkJyl9PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAgICAgJ214LWF1dG8gbXQtMSBmbGV4IGgtNSB3LTUgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtZnVsbCB0ZXh0LXhzIHNtOmgtNyBzbTp3LTcgc206dGV4dC1zbScsXG4gICAgICAgICAgICAgICAgICBpc1RvZGF5ICYmICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kJ1xuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7ZGF5LmRhdGUoKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L21vdGlvbi5kaXY+XG4gICAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICAgIClcbiAgICAgIH0pfVxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcblxuaW50ZXJmYWNlIFByb2Nlc3NlZEV2ZW50IGV4dGVuZHMgQ2FsZW5kYXJFdmVudCB7XG4gIGxlZnQ6IG51bWJlciAvLyBMZWZ0IHBvc2l0aW9uIGluIHBlcmNlbnRhZ2VcbiAgd2lkdGg6IG51bWJlciAvLyBXaWR0aCBpbiBwZXJjZW50YWdlXG4gIHRvcDogbnVtYmVyIC8vIFRvcCBwb3NpdGlvbiBpbiBwZXJjZW50YWdlXG4gIGhlaWdodDogbnVtYmVyIC8vIEhlaWdodCBpbiBwZXJjZW50YWdlXG4gIHpJbmRleD86IG51bWJlciAvLyBaLWluZGV4IGZvciBsYXllcmluZyBvdmVybGFwcGluZyBldmVudHNcbn1cblxuaW50ZXJmYWNlIFVzZVByb2Nlc3NlZERheUV2ZW50c1Byb3BzIHtcbiAgZGF5OiBkYXlqcy5EYXlqcyAvLyBUaGUgc3BlY2lmaWMgZGF5IHRoaXMgY29sdW1uIHJlcHJlc2VudHNcbn1cblxuZXhwb3J0IGNvbnN0IHVzZVByb2Nlc3NlZERheUV2ZW50cyA9ICh7IGRheSB9OiBVc2VQcm9jZXNzZWREYXlFdmVudHNQcm9wcykgPT4ge1xuICBjb25zdCB7IGdldEV2ZW50c0ZvckRhdGVSYW5nZSB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICBjb25zdCB0b2RheUV2ZW50cyA9IHVzZU1lbW88UHJvY2Vzc2VkRXZlbnRbXT4oKCkgPT4ge1xuICAgIGxldCBldmVudHNGb3JEYXkgPSBnZXRFdmVudHNGb3JEYXRlUmFuZ2UoXG4gICAgICBkYXkuc3RhcnRPZignZGF5JyksXG4gICAgICBkYXkuZW5kT2YoJ2RheScpXG4gICAgKVxuXG4gICAgLy8gRmlsdGVyIG91dCBhbGwtZGF5IGV2ZW50cyBhbmQgc29ydCBieSBzdGFydCB0aW1lXG4gICAgZXZlbnRzRm9yRGF5ID0gZXZlbnRzRm9yRGF5XG4gICAgICAuZmlsdGVyKChlKSA9PiAhZS5hbGxEYXkpXG4gICAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEuc3RhcnQuZGlmZihiLnN0YXJ0KSlcblxuICAgIGlmIChldmVudHNGb3JEYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG5cbiAgICAvLyBTdGVwIDE6IEdyb3VwIGV2ZW50cyBpbnRvIGNsdXN0ZXJzIG9mIG92ZXJsYXBwaW5nIGV2ZW50c1xuICAgIGNvbnN0IGNsdXN0ZXJzOiBDYWxlbmRhckV2ZW50W11bXSA9IFtdXG4gICAgbGV0IGN1cnJlbnRDbHVzdGVyOiBDYWxlbmRhckV2ZW50W10gPSBbXVxuICAgIGxldCBsYXN0RXZlbnRFbmQ6IGRheWpzLkRheWpzIHwgbnVsbCA9IG51bGxcbiAgICBmb3IgKGNvbnN0IGV2ZW50IG9mIGV2ZW50c0ZvckRheSkge1xuICAgICAgaWYgKGxhc3RFdmVudEVuZCAmJiBldmVudC5zdGFydC5pc1NhbWVPckFmdGVyKGxhc3RFdmVudEVuZCkpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRDbHVzdGVyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjbHVzdGVycy5wdXNoKGN1cnJlbnRDbHVzdGVyKVxuICAgICAgICB9XG4gICAgICAgIGN1cnJlbnRDbHVzdGVyID0gW11cbiAgICAgIH1cbiAgICAgIGN1cnJlbnRDbHVzdGVyLnB1c2goZXZlbnQpXG4gICAgICBsYXN0RXZlbnRFbmQgPSBsYXN0RXZlbnRFbmRcbiAgICAgICAgPyBkYXlqcy5tYXgobGFzdEV2ZW50RW5kLCBldmVudC5lbmQpXG4gICAgICAgIDogZXZlbnQuZW5kXG4gICAgfVxuICAgIGlmIChjdXJyZW50Q2x1c3Rlci5sZW5ndGggPiAwKSB7XG4gICAgICBjbHVzdGVycy5wdXNoKGN1cnJlbnRDbHVzdGVyKVxuICAgIH1cblxuICAgIC8vIFN0ZXAgMjogRm9yIGVhY2ggY2x1c3RlciwgdXNlIGEgbW9yZSBpbnRlbGxpZ2VudCBjb2x1bW4gYXNzaWdubWVudFxuICAgIGNvbnN0IHByb2Nlc3NlZEV2ZW50czogUHJvY2Vzc2VkRXZlbnRbXSA9IFtdXG4gICAgZm9yIChjb25zdCBjbHVzdGVyIG9mIGNsdXN0ZXJzKSB7XG4gICAgICBpZiAoY2x1c3Rlci5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgLy8gU2luZ2xlIGV2ZW50IHRha2VzIGZ1bGwgd2lkdGhcbiAgICAgICAgY29uc3QgZXZlbnQgPSBjbHVzdGVyWzBdXG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IGV2ZW50LnN0YXJ0LmhvdXIoKSArIGV2ZW50LnN0YXJ0Lm1pbnV0ZSgpIC8gNjBcbiAgICAgICAgbGV0IGVuZFRpbWUgPSBldmVudC5lbmQuaG91cigpICsgZXZlbnQuZW5kLm1pbnV0ZSgpIC8gNjBcbiAgICAgICAgaWYgKGVuZFRpbWUgPCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZXZlbnQgZW5kcyBvbiB0aGUgbmV4dCBkYXksIHNldCBlbmQgdGltZSB0byAyNCBob3Vyc1xuICAgICAgICAgIGVuZFRpbWUgPSAyNFxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsRHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lXG4gICAgICAgIGNvbnN0IHRvcCA9IChzdGFydFRpbWUgLyAyNCkgKiAxMDBcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gKHRvdGFsRHVyYXRpb24gLyAyNCkgKiAxMDBcbiAgICAgICAgcHJvY2Vzc2VkRXZlbnRzLnB1c2goeyAuLi5ldmVudCwgbGVmdDogMCwgd2lkdGg6IDEwMCwgdG9wLCBoZWlnaHQgfSlcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gTXVsdGlwbGUgZXZlbnRzIC0gdXNlIGxheWVyZWQgcG9zaXRpb25pbmcgYXBwcm9hY2hcbiAgICAgIC8vIFNvcnQgYnkgZHVyYXRpb24gKGxvbmdlc3QgZmlyc3QpLCB0aGVuIGJ5IHN0YXJ0IHRpbWVcbiAgICAgIGNvbnN0IHNvcnRlZEV2ZW50cyA9IFsuLi5jbHVzdGVyXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgIGNvbnN0IGFEdXJhdGlvbiA9IGEuZW5kLmRpZmYoYS5zdGFydCwgJ21pbnV0ZScpXG4gICAgICAgIGNvbnN0IGJEdXJhdGlvbiA9IGIuZW5kLmRpZmYoYi5zdGFydCwgJ21pbnV0ZScpXG5cbiAgICAgICAgLy8gTG9uZ2VyIGV2ZW50cyBmaXJzdFxuICAgICAgICBpZiAoYUR1cmF0aW9uICE9PSBiRHVyYXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gYkR1cmF0aW9uIC0gYUR1cmF0aW9uXG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBzYW1lIGR1cmF0aW9uLCBlYXJsaWVyIHN0YXJ0IHRpbWUgZmlyc3RcbiAgICAgICAgcmV0dXJuIGEuc3RhcnQuZGlmZihiLnN0YXJ0KVxuICAgICAgfSlcblxuICAgICAgLy8gUHJvY2VzcyBldmVudHMgd2l0aCBsYXllcmVkIHBvc2l0aW9uaW5nXG4gICAgICBjb25zdCB0b3RhbEV2ZW50cyA9IHNvcnRlZEV2ZW50cy5sZW5ndGhcblxuICAgICAgLy8gQ2FsY3VsYXRlIGR5bmFtaWMgb2Zmc2V0IGJhc2VkIG9uIG51bWJlciBvZiBvdmVybGFwcGluZyBldmVudHNcbiAgICAgIC8vIEZld2VyIGV2ZW50cyA9IGxhcmdlciBpbmRpdmlkdWFsIG9mZnNldHMsIG1vcmUgZXZlbnRzID0gc21hbGxlciBvZmZzZXRzXG4gICAgICBsZXQgbWF4T2Zmc2V0OiBudW1iZXJcbiAgICAgIGlmICh0b3RhbEV2ZW50cyA9PT0gMikge1xuICAgICAgICBtYXhPZmZzZXQgPSAyNSAvLyAyNSUgb2Zmc2V0IGZvciAyIGV2ZW50c1xuICAgICAgfSBlbHNlIGlmICh0b3RhbEV2ZW50cyA9PT0gMykge1xuICAgICAgICBtYXhPZmZzZXQgPSA1MCAvLyA1MCUgdG90YWwgZm9yIDMgZXZlbnRzICgyNSUgZWFjaClcbiAgICAgIH0gZWxzZSBpZiAodG90YWxFdmVudHMgPT09IDQpIHtcbiAgICAgICAgbWF4T2Zmc2V0ID0gNjAgLy8gNjAlIHRvdGFsIGZvciA0IGV2ZW50cyAoMjAlIGVhY2gpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXhPZmZzZXQgPSA3MCAvLyA3MCUgdG90YWwgZm9yIDUrIGV2ZW50c1xuICAgICAgfVxuXG4gICAgICBjb25zdCBvZmZzZXRQZXJFdmVudCA9IHRvdGFsRXZlbnRzID4gMSA/IG1heE9mZnNldCAvICh0b3RhbEV2ZW50cyAtIDEpIDogMFxuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZEV2ZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBldmVudCA9IHNvcnRlZEV2ZW50c1tpXVxuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBldmVudC5zdGFydC5ob3VyKCkgKyBldmVudC5zdGFydC5taW51dGUoKSAvIDYwXG4gICAgICAgIGxldCBlbmRUaW1lID0gZXZlbnQuZW5kLmhvdXIoKSArIGV2ZW50LmVuZC5taW51dGUoKSAvIDYwXG5cbiAgICAgICAgaWYgKGVuZFRpbWUgPCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZXZlbnQgZW5kcyBvbiB0aGUgbmV4dCBkYXksIHNldCBlbmQgdGltZSB0byAyNCBob3Vyc1xuICAgICAgICAgIGVuZFRpbWUgPSAyNFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWxEdXJhdGlvbiA9IGVuZFRpbWUgLSBzdGFydFRpbWVcbiAgICAgICAgY29uc3QgdG9wID0gKHN0YXJ0VGltZSAvIDI0KSAqIDEwMFxuICAgICAgICBjb25zdCBoZWlnaHQgPSAodG90YWxEdXJhdGlvbiAvIDI0KSAqIDEwMFxuXG4gICAgICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbmluZyBiYXNlZCBvbiBsYXllciBhbmQgdG90YWwgZXZlbnRzXG4gICAgICAgIGxldCBsZWZ0OiBudW1iZXJcbiAgICAgICAgbGV0IHdpZHRoOiBudW1iZXJcbiAgICAgICAgbGV0IHpJbmRleDogbnVtYmVyXG5cbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAvLyBGaXJzdCBldmVudCAobG9uZ2VzdCkgdGFrZXMgZnVsbCB3aWR0aCBhdCBib3R0b21cbiAgICAgICAgICBsZWZ0ID0gMFxuICAgICAgICAgIHdpZHRoID0gMTAwXG4gICAgICAgICAgekluZGV4ID0gMVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFN1YnNlcXVlbnQgZXZlbnRzIGFyZSBvZmZzZXQgZHluYW1pY2FsbHkgYmFzZWQgb24gdG90YWwgZXZlbnQgY291bnRcbiAgICAgICAgICBsZWZ0ID0gb2Zmc2V0UGVyRXZlbnQgKiBpXG4gICAgICAgICAgd2lkdGggPSAxMDAgLSBsZWZ0IC8vIFJlbWFpbmluZyB3aWR0aFxuICAgICAgICAgIHpJbmRleCA9IGkgKyAxIC8vIEhpZ2hlciB6LWluZGV4IGZvciBldmVudHMgb24gdG9wXG4gICAgICAgIH1cblxuICAgICAgICBwcm9jZXNzZWRFdmVudHMucHVzaCh7XG4gICAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIHpJbmRleCxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcHJvY2Vzc2VkRXZlbnRzXG4gIH0sIFtkYXksIGdldEV2ZW50c0ZvckRhdGVSYW5nZV0pXG5cbiAgcmV0dXJuIHRvZGF5RXZlbnRzXG59XG4iLAogICAgImltcG9ydCB7IHVzZVByb2Nlc3NlZERheUV2ZW50cyB9IGZyb20gJ0AvaG9va3MvdXNlUHJvY2Vzc2VkRGF5RXZlbnRzJ1xuaW1wb3J0IHsgRHJhZ2dhYmxlRXZlbnQgfSBmcm9tICcuLi9kcmFnZ2FibGUtZXZlbnQvZHJhZ2dhYmxlLWV2ZW50J1xuaW1wb3J0IHR5cGUgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuaW50ZXJmYWNlIERheUV2ZW50c0xheWVyUHJvcHMge1xuICBkYXk6IGRheWpzLkRheWpzIC8vIFRoZSBzcGVjaWZpYyBkYXkgdGhpcyBsYXllciByZXByZXNlbnRzXG4gICdkYXRhLXRlc3RpZCc/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNvbnN0IERheUV2ZW50c0xheWVyOiBSZWFjdC5GQzxEYXlFdmVudHNMYXllclByb3BzPiA9ICh7XG4gIGRheSxcbiAgJ2RhdGEtdGVzdGlkJzogZGF0YVRlc3RJZCxcbn0pID0+IHtcbiAgY29uc3QgdG9kYXlFdmVudHMgPSB1c2VQcm9jZXNzZWREYXlFdmVudHMoeyBkYXkgfSlcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdGVzdGlkPXtkYXRhVGVzdElkfVxuICAgICAgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSBpbnNldC0wIHotMzBcIlxuICAgID5cbiAgICAgIHt0b2RheUV2ZW50cy5tYXAoKGV2ZW50LCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCB2ZXJ5VmVyeVVuaXF1ZUtleSA9IGBldmVudC0ke2V2ZW50LmlkfS0ke2luZGV4fS0ke2RheS5mb3JtYXQoXG4gICAgICAgICAgJ1lZWVktTU0tREQnXG4gICAgICAgICl9YFxuICAgICAgICBjb25zdCBpc1Nob3J0RXZlbnQgPSBldmVudC5lbmQuZGlmZihldmVudC5zdGFydCwgJ21pbnV0ZScpIDw9IDE1XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtgY29udGFpbmVyLSR7dmVyeVZlcnlVbmlxdWVLZXl9YH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlXCJcbiAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgIGxlZnQ6IGAke2V2ZW50LmxlZnR9JWAsXG4gICAgICAgICAgICAgIHdpZHRoOiBgY2FsYygke2V2ZW50LndpZHRofSUgLSB2YXIoLS1zcGFjaW5nKSAqIDIpYCxcbiAgICAgICAgICAgICAgdG9wOiBgJHtldmVudC50b3B9JWAsXG4gICAgICAgICAgICAgIGhlaWdodDogYCR7ZXZlbnQuaGVpZ2h0fSVgLFxuICAgICAgICAgICAgfX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICA8RHJhZ2dhYmxlRXZlbnRcbiAgICAgICAgICAgICAgZWxlbWVudElkPXtgZHJhZ2dhYmxlLSR7dmVyeVZlcnlVbmlxdWVLZXl9YH1cbiAgICAgICAgICAgICAgZXZlbnQ9e2V2ZW50fVxuICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKCdwb2ludGVyLWV2ZW50cy1hdXRvIGFic29sdXRlJywge1xuICAgICAgICAgICAgICAgICdbJl9wXTp0ZXh0LVsxMHB4XSBbJl9wXTptdC0wJzogaXNTaG9ydEV2ZW50LFxuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIClcbiAgICAgIH0pfVxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5pbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRGF5RXZlbnRzTGF5ZXIgfSBmcm9tICcuLi9kYXktdmlldy9kYXktZXZlbnRzLWxheWVyJ1xuaW1wb3J0IHsgRHJvcHBhYmxlQ2VsbCB9IGZyb20gJy4uL2Ryb3BwYWJsZS1jZWxsL2Ryb3BwYWJsZS1jZWxsJ1xuXG5jb25zdCBob3VycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDI0IH0sIChfLCBpKSA9PiBpKS5tYXAoKGhvdXIpID0+XG4gIGRheWpzKCkuaG91cihob3VyKS5taW51dGUoMClcbilcblxuaW50ZXJmYWNlIFdlZWtEYXlDb2xQcm9wcyB7XG4gIGRheTogZGF5anMuRGF5anMgLy8gVGhlIHNwZWNpZmljIGRheSB0aGlzIGNvbHVtbiByZXByZXNlbnRzXG59XG5cbmV4cG9ydCBjb25zdCBXZWVrRGF5Q29sOiBSZWFjdC5GQzxXZWVrRGF5Q29sUHJvcHM+ID0gKHsgZGF5IH0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBkYXRhLXRlc3RpZD17YHdlZWstZGF5LWNvbC0ke2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgY2xhc3NOYW1lPVwiY29sLXNwYW4tMSByZWxhdGl2ZSBncmlkIGdyaWQtcm93cy0yNCBib3JkZXItclwiXG4gICAgPlxuICAgICAge2hvdXJzLm1hcCgodGltZSkgPT4ge1xuICAgICAgICBjb25zdCBob3VyID0gdGltZS5ob3VyKClcbiAgICAgICAgY29uc3QgY2VsbERhdGUgPSBkYXkuZm9ybWF0KCdZWVlZLU1NLUREJylcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxEcm9wcGFibGVDZWxsXG4gICAgICAgICAgICBrZXk9e2Ake2NlbGxEYXRlfS0ke3RpbWUuZm9ybWF0KCdISCcpfWB9XG4gICAgICAgICAgICBpZD17YHRpbWUtY2VsbC0ke2NlbGxEYXRlfS0ke3RpbWUuZm9ybWF0KCdISCcpfWB9XG4gICAgICAgICAgICB0eXBlPVwidGltZS1jZWxsXCJcbiAgICAgICAgICAgIGRhdGU9e2RheX1cbiAgICAgICAgICAgIGhvdXI9e2hvdXJ9XG4gICAgICAgICAgICBkYXRhLXRlc3RpZD17YHdlZWstdGltZS1jZWxsLSR7Y2VsbERhdGV9LSR7dGltZS5mb3JtYXQoJ0hIJyl9YH1cbiAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICdob3ZlcjpiZy1hY2NlbnQgcmVsYXRpdmUgei0yMCBoLVs2MHB4XSBjdXJzb3ItcG9pbnRlciBib3JkZXItYidcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgLz5cbiAgICAgICAgKVxuICAgICAgfSl9XG5cbiAgICAgIHsvKiBFdmVudCBibG9ja3MgbGF5ZXIgKi99XG4gICAgICA8RGF5RXZlbnRzTGF5ZXJcbiAgICAgICAgZGF0YS10ZXN0aWQ9e2B3ZWVrLWRheS1ldmVudHMtJHtkYXkuZm9ybWF0KCdZWVlZLU1NLUREJyl9YH1cbiAgICAgICAgZGF5PXtkYXl9XG4gICAgICAvPlxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFdlZWtEYXlDb2wgfSBmcm9tICcuL3dlZWstZGF5LWNvbCdcblxuY29uc3QgaG91cnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyNCB9LCAoXywgaSkgPT4gaSkubWFwKChob3VyKSA9PlxuICBkYXlqcygpLmhvdXIoaG91cikubWludXRlKDApXG4pXG5cbmV4cG9ydCBjb25zdCBXZWVrVGltZUdyaWQ6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREYXRlLCBmaXJzdERheU9mV2VlayB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICAvLyBHZXQgc3RhcnQgYW5kIGVuZCBvZiBjdXJyZW50IHdlZWsgYmFzZWQgb24gZmlyc3REYXlPZldlZWsgc2V0dGluZ1xuICBjb25zdCBzdGFydE9mV2VlayA9IGN1cnJlbnREYXRlLnN0YXJ0T2YoJ3dlZWsnKS5kYXkoZmlyc3REYXlPZldlZWspXG4gIC8vIElmIGN1cnJlbnQgZGF0ZSBpcyBiZWZvcmUgdGhlIHN0YXJ0IG9mIHdlZWssIG1vdmUgYmFjayBvbmUgd2Vla1xuICBjb25zdCBhZGp1c3RlZFN0YXJ0T2ZXZWVrID0gY3VycmVudERhdGUuaXNCZWZvcmUoc3RhcnRPZldlZWspXG4gICAgPyBzdGFydE9mV2Vlay5zdWJ0cmFjdCgxLCAnd2VlaycpXG4gICAgOiBzdGFydE9mV2Vla1xuXG4gIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBkYXlzIGZvciB0aGUgY3VycmVudCB3ZWVrXG4gIGNvbnN0IHdlZWtEYXlzID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICB3ZWVrRGF5cy5wdXNoKGFkanVzdGVkU3RhcnRPZldlZWsuYWRkKGksICdkYXknKSlcbiAgfVxuXG4gIC8vIFNlcGFyYXRlIGFsbC1kYXkgZXZlbnRzIGZyb20gcmVndWxhciBldmVudHMgKGluY2x1ZGluZyBtdWx0aS1kYXkgZXZlbnRzKVxuXG4gIC8vIEZpbmQgaWYgY3VycmVudCBkYXkgaXMgaW4gdGhlIGRpc3BsYXllZCB3ZWVrXG4gIGNvbnN0IHRvZGF5SW5kZXggPSB3ZWVrRGF5cy5maW5kSW5kZXgoKGRheSkgPT4gZGF5LmlzU2FtZShkYXlqcygpLCAnZGF5JykpXG4gIGNvbnN0IGlzQ3VycmVudFdlZWsgPSB0b2RheUluZGV4ICE9PSAtMVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgZGF0YS10ZXN0aWQ9XCJ3ZWVrLXRpbWUtZ3JpZFwiXG4gICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBoLWZ1bGwgZ3JpZCBncmlkLWNvbHMtW2F1dG9fcmVwZWF0KDcsMWZyKV0gZ3JpZC1yb3dzLVtyZXBlYXQoMjQsbWlubWF4KDYwcHgsIDFmcikpXVwiXG4gICAgPlxuICAgICAgey8qIFRpbWUgbGFiZWxzIGNvbHVtbiAtIGZpeGVkICovfVxuICAgICAgPGRpdlxuICAgICAgICBkYXRhLXRlc3RpZD1cIndlZWstdGltZS1sYWJlbHNcIlxuICAgICAgICBjbGFzc05hbWU9XCJ6LTEwIGNvbC1zcGFuLTEgdy0xNCBncmlkIGdyaWQtcm93cy0yNCBib3JkZXIteFwiXG4gICAgICA+XG4gICAgICAgIHtob3Vycy5tYXAoKHRpbWUpID0+IChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBrZXk9e3RpbWUuZm9ybWF0KCdISDptbScpfVxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2B3ZWVrLXRpbWUtaG91ci0ke3RpbWUuZm9ybWF0KCdISCcpfWB9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJoLVs2MHB4XSBib3JkZXItYiB0ZXh0LXJpZ2h0XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgcHItMiB0ZXh0LXJpZ2h0IHRleHQtWzEwcHhdIHNtOnRleHQteHNcIj5cbiAgICAgICAgICAgICAge3RpbWUuZm9ybWF0KCdoIEEnKX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSl9XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIERheSBjb2x1bW5zIHdpdGggdGltZSBzbG90cyAqL31cbiAgICAgIHt3ZWVrRGF5cy5tYXAoKGRheSkgPT4gKFxuICAgICAgICA8V2Vla0RheUNvbCBrZXk9e2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX0gZGF5PXtkYXl9IC8+XG4gICAgICApKX1cblxuICAgICAgey8qIEN1cnJlbnQgdGltZSBpbmRpY2F0b3IgKi99XG4gICAgICB7aXNDdXJyZW50V2VlayAmJiAoXG4gICAgICAgIDxkaXZcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cIndlZWstY3VycmVudC10aW1lLWluZGljYXRvclwiXG4gICAgICAgICAgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSB6LTIwXCJcbiAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgdG9wOiBgJHsoZGF5anMoKS5ob3VyKCkgKyBkYXlqcygpLm1pbnV0ZSgpIC8gNjApICogNjB9cHhgLFxuICAgICAgICAgICAgbGVmdDogYCR7dG9kYXlJbmRleCAqICgxMDAgLyA3KX0lYCxcbiAgICAgICAgICAgIHdpZHRoOiBgJHsxMDAgLyA3fSVgLFxuICAgICAgICAgIH19XG4gICAgICAgID5cbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInctZnVsbCBib3JkZXItdCBib3JkZXItcmVkLTUwMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCItbXQtMSBtbC0xIGgtMiB3LTIgcm91bmRlZC1mdWxsIGJnLXJlZC01MDBcIj48L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApfVxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB7IFNjcm9sbEFyZWEgfSBmcm9tICdAL2NvbXBvbmVudHMvdWknXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5pbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IHsgRnJhZ21lbnQgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IERyb3BwYWJsZUNlbGwgfSBmcm9tICcuLi9kcm9wcGFibGUtY2VsbC9kcm9wcGFibGUtY2VsbCdcbmltcG9ydCB7IERheUFsbERheVJvdyB9IGZyb20gJy4vZGF5LWFsbC1kYXktcm93J1xuaW1wb3J0IHsgRGF5RXZlbnRzTGF5ZXIgfSBmcm9tICcuL2RheS1ldmVudHMtbGF5ZXInXG5pbXBvcnQgeyBEYXlIZWFkZXIgfSBmcm9tICcuL2RheS1oZWFkZXInXG5pbXBvcnQgeyBEYXlUaW1lQ29sIH0gZnJvbSAnLi9kYXktdGltZS1jb2wnXG5cbmNvbnN0IERheVZpZXcgPSAoKSA9PiB7XG4gIGNvbnN0IHsgY3VycmVudERhdGUgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgLy8gSG91cnMgdG8gZGlzcGxheSAoYWxsIDI0IGhvdXJzIG9mIHRoZSBkYXkpXG4gIGNvbnN0IGhvdXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjQgfSwgKF8sIGkpID0+IGkpLm1hcCgoaG91cikgPT4ge1xuICAgIHJldHVybiBkYXlqcygpLmhvdXIoaG91cikubWludXRlKDApXG4gIH0pXG5cbiAgLy8gRm9yIG1vcmUgZ3JhbnVsYXIgdGltZSBzbG90cywgd2UnbGwgZGl2aWRlIGVhY2ggaG91ciBpbnRvIDE1LW1pbnV0ZSBzZWdtZW50c1xuICBjb25zdCB0aW1lU2VnbWVudHMgPSBbMCwgMTUsIDMwLCA0NV1cblxuICAvLyBHZXQgY3VycmVudCBkYXkncyBldmVudHMgLSB0aGlzIHdpbGwgcmVmcmVzaCBhdXRvbWF0aWNhbGx5IHdoZW4gc3RvcmUgdXBkYXRlc1xuICAvLyBiZWNhdXNlIGdldEV2ZW50c0ZvckRhdGUgaXMgYSBzZWxlY3RvciBmdW5jdGlvbiBmcm9tIHRoZSBzdG9yZSB0aGF0IHJ1bnMgd2hlbmV2ZXIgZXZlbnRzIGNoYW5nZVxuXG4gIGNvbnN0IGlzVG9kYXkgPSBjdXJyZW50RGF0ZS5pc1NhbWUoZGF5anMoKSwgJ2RheScpXG4gIGNvbnN0IGNlbGxEYXRlID0gY3VycmVudERhdGUuZm9ybWF0KCdZWVlZLU1NLUREJylcblxuICByZXR1cm4gKFxuICAgIDxkaXYgZGF0YS10ZXN0aWQ9XCJkYXktdmlld1wiIGNsYXNzTmFtZT1cImZsZXggaC1mdWxsIGZsZXgtY29sXCI+XG4gICAgICB7LyogRGF5IGhlYWRlciAqL31cbiAgICAgIDxEYXlIZWFkZXIgLz5cblxuICAgICAgey8qIFRpbWUgZ3JpZCB3aXRob3V0IHNjcm9sbGJhciAqL31cbiAgICAgIDxTY3JvbGxBcmVhXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LXNjcm9sbC1hcmVhXCJcbiAgICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgZmxleC0xIG92ZXJmbG93LXktYXV0b1wiXG4gICAgICA+XG4gICAgICAgIHsvKiBBbGwtZGF5IGV2ZW50cyByb3cgKi99XG4gICAgICAgIDxEYXlBbGxEYXlSb3cgLz5cblxuICAgICAgICB7LyogU2V0IGEgZml4ZWQgaGVpZ2h0IGNvbnRhaW5lciB0aGF0IG1hdGNoZXMgZXhhY3RseSB0aGUgdG90YWwgaGVpZ2h0IG9mIGFsbCBob3VyIGJsb2NrcyAqL31cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LXRpbWUtZ3JpZFwiXG4gICAgICAgICAgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtOCBkaXZpZGUteCBib3JkZXIteFwiXG4gICAgICAgICAgc3R5bGU9e3sgaGVpZ2h0OiBgJHtob3Vycy5sZW5ndGggKiA2MH1weGAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIHsvKiBUaW1lIGxhYmVscyBjb2x1bW4gKi99XG4gICAgICAgICAgPERheVRpbWVDb2wgY2xhc3NOYW1lPVwiY29sLXNwYW4tMiBoLWZ1bGwgbWQ6Y29sLXNwYW4tMVwiIC8+XG5cbiAgICAgICAgICB7LyogRGF5IGNvbHVtbiB3aXRoIGV2ZW50cyAqL31cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBkYXRhLXRlc3RpZD1cImRheS1ldmVudHMtY29sdW1uXCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIGNvbC1zcGFuLTYgaC1mdWxsIG1kOmNvbC1zcGFuLTdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHsvKiBCYWNrZ3JvdW5kIGdyaWQgZm9yIHRpbWUgc2xvdHMgLSBsb3dlc3QgbGF5ZXIgKi99XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LWJhY2tncm91bmQtZ3JpZFwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LTAgei0wXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2hvdXJzLm1hcCgoaG91ciwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBrZXk9e2BiZy0ke2N1cnJlbnREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpfS0ke2hvdXIuZm9ybWF0KFxuICAgICAgICAgICAgICAgICAgICAnSEgnXG4gICAgICAgICAgICAgICAgICApfWB9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLVs2MHB4XSBib3JkZXItYlwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgey8qIDE1LW1pbnV0ZSBtYXJrZXIgbGluZXMgKi99XG4gICAgICAgICAgICAgICAgICB7dGltZVNlZ21lbnRzLnNsaWNlKDEpLm1hcCgobWludXRlcykgPT4gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAga2V5PXtgYmctJHtob3VyLmZvcm1hdCgnSEgnKX0tJHttaW51dGVzfWB9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYm9yZGVyLWJvcmRlciBhYnNvbHV0ZSB3LWZ1bGwgYm9yZGVyLXQgYm9yZGVyLWRhc2hlZFwiXG4gICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgdG9wOiBgJHtpbmRleCAqIDYwICsgbWludXRlc31weGAgfX1cbiAgICAgICAgICAgICAgICAgICAgPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBJbnRlcmFjdGl2ZSBsYXllciBmb3IgdGltZSBzbG90cyAtIG1pZGRsZSBsYXllciB3aXRoIG5vIGJvcmRlcnMgKi99XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LWludGVyYWN0aXZlLWxheWVyXCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtYXV0byBhYnNvbHV0ZSBpbnNldC0wIHotMjBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICB7aG91cnMubWFwKCh0aW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaG91ciA9IHRpbWUuaG91cigpXG5cbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgPEZyYWdtZW50IGtleT17YCR7Y2VsbERhdGV9LSR7dGltZS5mb3JtYXQoJ0hIJyl9YH0+XG4gICAgICAgICAgICAgICAgICAgIDxEcm9wcGFibGVDZWxsXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9e2B0aW1lLWNlbGwtJHtjZWxsRGF0ZX0tJHt0aW1lLmZvcm1hdCgnSEgnKX0tMDBgfVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0aW1lLWNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgIGRhdGU9e2N1cnJlbnREYXRlfVxuICAgICAgICAgICAgICAgICAgICAgIGhvdXI9e2hvdXJ9XG4gICAgICAgICAgICAgICAgICAgICAgbWludXRlPXswfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oJ2hvdmVyOmJnLWFjY2VudCBoLVsxNXB4XSBjdXJzb3ItcG9pbnRlcicpfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8RHJvcHBhYmxlQ2VsbFxuICAgICAgICAgICAgICAgICAgICAgIGlkPXtgdGltZS1jZWxsLSR7Y2VsbERhdGV9LSR7dGltZS5mb3JtYXQoJ0hIJyl9LTE1YH1cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGltZS1jZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRlPXtjdXJyZW50RGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgICBob3VyPXtob3VyfVxuICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZT17MTV9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaG92ZXI6YmctYWNjZW50IGgtWzE1cHhdIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPERyb3BwYWJsZUNlbGxcbiAgICAgICAgICAgICAgICAgICAgICBpZD17YHRpbWUtY2VsbC0ke2NlbGxEYXRlfS0ke3RpbWUuZm9ybWF0KCdISCcpfS0zMGB9XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRpbWUtY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0ZT17Y3VycmVudERhdGV9XG4gICAgICAgICAgICAgICAgICAgICAgaG91cj17aG91cn1cbiAgICAgICAgICAgICAgICAgICAgICBtaW51dGU9ezMwfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImhvdmVyOmJnLWFjY2VudCBoLVsxNXB4XSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxEcm9wcGFibGVDZWxsXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9e2B0aW1lLWNlbGwtJHtjZWxsRGF0ZX0tJHt0aW1lLmZvcm1hdCgnSEgnKX0tNDVgfVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0aW1lLWNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgIGRhdGU9e2N1cnJlbnREYXRlfVxuICAgICAgICAgICAgICAgICAgICAgIGhvdXI9e2hvdXJ9XG4gICAgICAgICAgICAgICAgICAgICAgbWludXRlPXs0NX1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJob3ZlcjpiZy1hY2NlbnQgaC1bMTVweF0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHsvKiBFdmVudHMgbGF5ZXIgLSBtaWRkbGUtdG9wIGxheWVyICovfVxuICAgICAgICAgICAgPERheUV2ZW50c0xheWVyIGRheT17Y3VycmVudERhdGV9IC8+XG5cbiAgICAgICAgICAgIHsvKiBDdXJyZW50IHRpbWUgaW5kaWNhdG9yIC0gdG9wIGxheWVyICovfVxuICAgICAgICAgICAge2lzVG9kYXkgJiYgKFxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJkYXktY3VycmVudC10aW1lLWluZGljYXRvclwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGUgcmlnaHQtMCBsZWZ0LTAgei00MCBib3JkZXItdCBib3JkZXItcmVkLTUwMFwiXG4gICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgIHRvcDogYCR7KGRheWpzKCkuaG91cigpICsgZGF5anMoKS5taW51dGUoKSAvIDYwKSAqIDYwfXB4YCxcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCItbXQtMSAtbWwtMSBoLTIgdy0yIHJvdW5kZWQtZnVsbCBiZy1yZWQtNTAwXCI+PC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L1Njcm9sbEFyZWE+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgRGF5Vmlld1xuIiwKICAgICJpbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IERyYWdnYWJsZUV2ZW50IH0gZnJvbSAnLi4vZHJhZ2dhYmxlLWV2ZW50L2RyYWdnYWJsZS1ldmVudCdcbmltcG9ydCB7IERyb3BwYWJsZUNlbGwgfSBmcm9tICcuLi9kcm9wcGFibGUtY2VsbC9kcm9wcGFibGUtY2VsbCdcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCwgUHJvY2Vzc2VkQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcbmltcG9ydCB7IEVWRU5UX0JBUl9IRUlHSFQgfSBmcm9tICdAL2xpYi9jb25zdGFudHMnXG5cbmV4cG9ydCBjb25zdCBEYXlBbGxEYXlSb3cgPSAoKSA9PiB7XG4gIGNvbnN0IHsgY3VycmVudERhdGUsIGdldEV2ZW50c0ZvckRhdGUgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgLy8gR2V0IGN1cnJlbnQgZGF5J3MgZXZlbnRzIC0gdGhpcyB3aWxsIHJlZnJlc2ggYXV0b21hdGljYWxseSB3aGVuIHN0b3JlIHVwZGF0ZXNcbiAgLy8gYmVjYXVzZSBnZXRFdmVudHNGb3JEYXRlIGlzIGEgc2VsZWN0b3IgZnVuY3Rpb24gZnJvbSB0aGUgc3RvcmUgdGhhdCBydW5zIHdoZW5ldmVyIGV2ZW50cyBjaGFuZ2VcbiAgY29uc3QgZGF5RXZlbnRzID0gZ2V0RXZlbnRzRm9yRGF0ZShjdXJyZW50RGF0ZSlcblxuICAvLyBTZXBhcmF0ZSBhbGwtZGF5IGV2ZW50cyBmcm9tIHJlZ3VsYXIgZXZlbnRzXG4gIGNvbnN0IHsgYWxsRGF5RXZlbnRzIH0gPSB1c2VNZW1vKCgpID0+IHtcbiAgICAvLyBPbmx5IGV2ZW50cyBleHBsaWNpdGx5IG1hcmtlZCBhcyBhbGxEYXkgc2hvdWxkIGJlIGluIHRoZSBhbGwtZGF5IHNlY3Rpb25cbiAgICBjb25zdCBhbGxEYXlFdnRzID0gZGF5RXZlbnRzLmZpbHRlcigoZXZlbnQpID0+IGV2ZW50LmFsbERheSlcblxuICAgIC8vIFJlZ3VsYXIgZXZlbnRzIChpbmNsdWRpbmcgbXVsdGktZGF5IGV2ZW50cylcbiAgICBjb25zdCByZWd1bGFyRXZ0cyA9IGRheUV2ZW50cy5maWx0ZXIoKGV2ZW50KSA9PiAhZXZlbnQuYWxsRGF5KVxuXG4gICAgcmV0dXJuIHsgYWxsRGF5RXZlbnRzOiBhbGxEYXlFdnRzLCByZWd1bGFyRXZlbnRzOiByZWd1bGFyRXZ0cyB9XG4gIH0sIFtkYXlFdmVudHNdKSAvLyBPbmx5IGRlcGVuZCBvbiB0aGUgZGF5RXZlbnRzIHdoaWNoIGlzIHJlZnJlc2hlZCBhdXRvbWF0aWNhbGx5XG5cbiAgLy8gUHJvY2VzcyBhbGwtZGF5IGV2ZW50cyBmb3IgZGlzcGxheVxuICBjb25zdCB7IHByb2Nlc3NlZEFsbERheUV2ZW50cyB9ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gU29ydCBhbGwtZGF5IGV2ZW50cyAoaWYgbmVlZGVkKVxuICAgIGNvbnN0IHNvcnRlZEV2ZW50cyA9IFsuLi5hbGxEYXlFdmVudHNdLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgIHJldHVybiBhLnN0YXJ0LmRpZmYoYi5zdGFydClcbiAgICB9KVxuXG4gICAgLy8gVHJhY2sgcG9zaXRpb25zIGluIHJvd3MgZm9yIHN0YWNraW5nXG4gICAgY29uc3Qgcm93czogeyBldmVudDogQ2FsZW5kYXJFdmVudCB9W11bXSA9IFtdXG4gICAgY29uc3QgcHJvY2Vzc2VkRXZlbnRzOiBQcm9jZXNzZWRDYWxlbmRhckV2ZW50W10gPSBbXVxuXG4gICAgc29ydGVkRXZlbnRzLmZvckVhY2goKGV2ZW50LCByb3dJbmRleCkgPT4ge1xuICAgICAgbGV0IHBsYWNlZCA9IGZhbHNlXG5cbiAgICAgIHdoaWxlICghcGxhY2VkKSB7XG4gICAgICAgIGlmIChyb3dJbmRleCA+PSByb3dzLmxlbmd0aCkge1xuICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyByb3cgaWYgbmVlZGVkXG4gICAgICAgICAgcm93cy5wdXNoKFtdKVxuICAgICAgICAgIHBsYWNlZCA9IHRydWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBJbiBkYXkgdmlldywgd2UgY2FuIHBsYWNlIG9uZSBldmVudCBwZXIgcm93IGFzIHRoZXkgZG9uJ3Qgb3ZlcmxhcCBob3Jpem9udGFsbHlcbiAgICAgICAgICAvLyBUaGlzIGlzIHNpbXBsZXIgdGhhbiB3ZWVrIHZpZXcgd2hlcmUgd2UgbmVlZGVkIHRvIGNoZWNrIGZvciBvdmVybGFwc1xuICAgICAgICAgIHBsYWNlZCA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBBZGQgZXZlbnQgdG8gdGhlIHJvd1xuICAgICAgcm93c1tyb3dJbmRleF0ucHVzaCh7IGV2ZW50IH0pXG5cbiAgICAgIC8vIEFkZCBwcm9jZXNzZWQgZXZlbnQgd2l0aCBjb3JyZWN0IHBvc2l0aW9uaW5nXG4gICAgICBwcm9jZXNzZWRFdmVudHMucHVzaCh7XG4gICAgICAgIC4uLmV2ZW50LFxuICAgICAgICBsZWZ0OiAwLFxuICAgICAgICB3aWR0aDogMTAwLFxuICAgICAgICB0b3A6IHJvd0luZGV4ICogRVZFTlRfQkFSX0hFSUdIVCxcbiAgICAgICAgaGVpZ2h0OiBFVkVOVF9CQVJfSEVJR0hULFxuICAgICAgICBhbGxEYXk6IHRydWUsXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvY2Vzc2VkQWxsRGF5RXZlbnRzOiBwcm9jZXNzZWRFdmVudHMsXG4gICAgICBhbGxEYXlSb3dzQ291bnQ6IE1hdGgubWF4KDEsIHJvd3MubGVuZ3RoKSwgLy8gQXQgbGVhc3QgMSByb3csIGV2ZW4gaWYgZW1wdHlcbiAgICB9XG4gIH0sIFthbGxEYXlFdmVudHNdKVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgZGF0YS10ZXN0aWQ9XCJkYXktYWxsLWRheS1yb3dcIlxuICAgICAgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtOCBib3JkZXItYiBib3JkZXIteFwiXG4gICAgPlxuICAgICAgey8qIExlZnQgbGFiZWwgZm9yIGFsbC1kYXkgZXZlbnRzICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc3Bhbi0yIGZsZXggc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kIGJvcmRlci1yIHByLTIgbWQ6Y29sLXNwYW4tMVwiPlxuICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgdGV4dC1bMTBweF0gd2hpdGVzcGFjZS1ub3dyYXAgc206dGV4dC14c1wiPlxuICAgICAgICAgIEFsbC1kYXlcbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBBbGwtZGF5IGV2ZW50cyBjb250YWluZXIgd2l0aCBkeW5hbWljIGhlaWdodCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmUgY29sLXNwYW4tNiBtZDpjb2wtc3Bhbi03IFwiPlxuICAgICAgICA8RHJvcHBhYmxlQ2VsbFxuICAgICAgICAgIGlkPXtgYWxsLWRheS0ke2N1cnJlbnREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgdHlwZT1cImRheS1jZWxsXCJcbiAgICAgICAgICBkYXRlPXtjdXJyZW50RGF0ZX1cbiAgICAgICAgICBjbGFzc05hbWU9XCJob3ZlcjpiZy1hY2NlbnQgdy1mdWxsIGN1cnNvci1wb2ludGVyIG1pbi1oLTEwIGZsZXggZmxleC1jb2xcIlxuICAgICAgICA+XG4gICAgICAgICAge3Byb2Nlc3NlZEFsbERheUV2ZW50cy5tYXAoKGV2ZW50LCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGtleT17YGFsbC1kYXktJHtldmVudC5pZH0tJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgIHN0eWxlPXt7IGhlaWdodDogRVZFTlRfQkFSX0hFSUdIVCArICdweCcgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxEcmFnZ2FibGVFdmVudFxuICAgICAgICAgICAgICAgICAgZWxlbWVudElkPXtgYWxsLWRheS0ke2V2ZW50LmlkfS0ke2luZGV4fWB9XG4gICAgICAgICAgICAgICAgICBldmVudD17ZXZlbnR9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJvdmVyZmxvdy1jbGlwIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgc3R5bGU9e3sgd2lkdGg6IGBjYWxjKDEwMCUgLSB2YXIoLS1zcGFjaW5nKSAqIDIpYCB9fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pfVxuICAgICAgICA8L0Ryb3BwYWJsZUNlbGw+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5pbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5cbmV4cG9ydCBjb25zdCBEYXlIZWFkZXIgPSAoKSA9PiB7XG4gIGNvbnN0IHsgY3VycmVudERhdGUsIHN0aWNreVZpZXdIZWFkZXIsIHZpZXdIZWFkZXJDbGFzc05hbWUgfSA9XG4gICAgdXNlQ2FsZW5kYXJDb250ZXh0KClcbiAgY29uc3QgaXNUb2RheSA9IGN1cnJlbnREYXRlLmlzU2FtZShkYXlqcygpLCAnZGF5JylcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LWhlYWRlclwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgYm9yZGVyLWIgcC0yIGJvcmRlci14JyxcbiAgICAgICAgc3RpY2t5Vmlld0hlYWRlciAmJiAnc3RpY2t5IHRvcC0wIHotMTAwJyxcbiAgICAgICAgdmlld0hlYWRlckNsYXNzTmFtZVxuICAgICAgKX1cbiAgICA+XG4gICAgICA8QW5pbWF0ZVByZXNlbmNlIG1vZGU9XCJ3YWl0XCI+XG4gICAgICAgIDxtb3Rpb24uZGl2XG4gICAgICAgICAga2V5PXtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICBpbml0aWFsPXt7IG9wYWNpdHk6IDAsIHk6IC0xMCB9fVxuICAgICAgICAgIGFuaW1hdGU9e3sgb3BhY2l0eTogMSwgeTogMCB9fVxuICAgICAgICAgIGV4aXQ9e3sgb3BhY2l0eTogMCwgeTogLTEwIH19XG4gICAgICAgICAgdHJhbnNpdGlvbj17eyBkdXJhdGlvbjogMC4yNSwgZWFzZTogJ2Vhc2VJbk91dCcgfX1cbiAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgJ2ZsZXggaXRlbXMtY2VudGVyIHRleHQtY2VudGVyIHRleHQtYmFzZSBmb250LXNlbWlib2xkIHNtOnRleHQteGwnLFxuICAgICAgICAgICAgaXNUb2RheSAmJiAndGV4dC1wcmltYXJ5J1xuICAgICAgICAgICl9XG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ4czppbmxpbmUgaGlkZGVuXCI+XG4gICAgICAgICAgICB7Y3VycmVudERhdGUuZm9ybWF0KCdkZGRkLCAnKX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAge2N1cnJlbnREYXRlLmZvcm1hdCgnTU1NTSBELCBZWVlZJyl9XG4gICAgICAgICAge2lzVG9kYXkgJiYgKFxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBtbC0yIHJvdW5kZWQtZnVsbCBweC0xIHB5LTAuNSB0ZXh0LXhzIHNtOnB4LTIgc206dGV4dC1zbVwiPlxuICAgICAgICAgICAgICBUb2RheVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICl9XG4gICAgICAgIDwvbW90aW9uLmRpdj5cbiAgICAgIDwvQW5pbWF0ZVByZXNlbmNlPlxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5cbi8vIEhvdXJzIHRvIGRpc3BsYXkgKGFsbCAyNCBob3VycyBvZiB0aGUgZGF5KVxuY29uc3QgaG91cnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyNCB9LCAoXywgaSkgPT4gaSkubWFwKChob3VyKSA9PiB7XG4gIHJldHVybiBkYXlqcygpLmhvdXIoaG91cikubWludXRlKDApXG59KVxuXG5pbnRlcmZhY2UgRGF5VGltZUNvbFByb3BzIHtcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBEYXlUaW1lQ29sOiBSZWFjdC5GQzxEYXlUaW1lQ29sUHJvcHM+ID0gKHsgY2xhc3NOYW1lIH0pID0+IHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBkYXRhLXRlc3RpZD1cImRheS10aW1lLWNvbFwiXG4gICAgICBjbGFzc05hbWU9e2Bjb2wtc3Bhbi0yIGgtZnVsbCBtZDpjb2wtc3Bhbi0xICR7Y2xhc3NOYW1lfWB9XG4gICAgPlxuICAgICAge2hvdXJzLm1hcCgodGltZSkgPT4gKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAga2V5PXt0aW1lLmZvcm1hdCgnSEg6bW0nKX1cbiAgICAgICAgICBkYXRhLXRlc3RpZD17YGRheS10aW1lLWhvdXItJHt0aW1lLmZvcm1hdCgnSEgnKX1gfVxuICAgICAgICAgIGNsYXNzTmFtZT1cImgtWzYwcHhdIGJvcmRlci1iIHRleHQtcmlnaHRcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHByLTIgdGV4dC1yaWdodCB0ZXh0LVsxMHB4XSBzbTp0ZXh0LXhzXCI+XG4gICAgICAgICAgICB7dGltZS5mb3JtYXQoJ2ggQScpfVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICApKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHtcbiAgQnV0dG9uLFxuICBDaGVja2JveCxcbiAgRGF0ZVBpY2tlcixcbiAgRGlhbG9nLFxuICBEaWFsb2dDb250ZW50LFxuICBEaWFsb2dEZXNjcmlwdGlvbixcbiAgRGlhbG9nRm9vdGVyLFxuICBEaWFsb2dIZWFkZXIsXG4gIERpYWxvZ1RpdGxlLFxuICBJbnB1dCxcbiAgTGFiZWwsXG4gIFRvb2x0aXAsXG4gIFRvb2x0aXBDb250ZW50LFxuICBUb29sdGlwUHJvdmlkZXIsXG4gIFRvb2x0aXBUcmlnZ2VyLFxufSBmcm9tICdAL2NvbXBvbmVudHMvdWknXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHR5cGUgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSAnQC9jb21wb25lbnRzL3R5cGVzJ1xuXG5jb25zdCBjb2xvck9wdGlvbnMgPSBbXG4gIHsgdmFsdWU6ICdiZy1ibHVlLTEwMCB0ZXh0LWJsdWUtODAwJywgbGFiZWw6ICdCbHVlJyB9LFxuICB7IHZhbHVlOiAnYmctZ3JlZW4tMTAwIHRleHQtZ3JlZW4tODAwJywgbGFiZWw6ICdHcmVlbicgfSxcbiAgeyB2YWx1ZTogJ2JnLXB1cnBsZS0xMDAgdGV4dC1wdXJwbGUtODAwJywgbGFiZWw6ICdQdXJwbGUnIH0sXG4gIHsgdmFsdWU6ICdiZy1yZWQtMTAwIHRleHQtcmVkLTgwMCcsIGxhYmVsOiAnUmVkJyB9LFxuICB7IHZhbHVlOiAnYmcteWVsbG93LTEwMCB0ZXh0LXllbGxvdy04MDAnLCBsYWJlbDogJ1llbGxvdycgfSxcbiAgeyB2YWx1ZTogJ2JnLXBpbmstMTAwIHRleHQtcGluay04MDAnLCBsYWJlbDogJ1BpbmsnIH0sXG4gIHsgdmFsdWU6ICdiZy1pbmRpZ28tMTAwIHRleHQtaW5kaWdvLTgwMCcsIGxhYmVsOiAnSW5kaWdvJyB9LFxuICB7IHZhbHVlOiAnYmctYW1iZXItMTAwIHRleHQtYW1iZXItODAwJywgbGFiZWw6ICdBbWJlcicgfSxcbiAgeyB2YWx1ZTogJ2JnLWVtZXJhbGQtMTAwIHRleHQtZW1lcmFsZC04MDAnLCBsYWJlbDogJ0VtZXJhbGQnIH0sXG4gIHsgdmFsdWU6ICdiZy1za3ktMTAwIHRleHQtc2t5LTgwMCcsIGxhYmVsOiAnU2t5JyB9LFxuICB7IHZhbHVlOiAnYmctdmlvbGV0LTEwMCB0ZXh0LXZpb2xldC04MDAnLCBsYWJlbDogJ1Zpb2xldCcgfSxcbiAgeyB2YWx1ZTogJ2JnLXJvc2UtMTAwIHRleHQtcm9zZS04MDAnLCBsYWJlbDogJ1Jvc2UnIH0sXG4gIHsgdmFsdWU6ICdiZy10ZWFsLTEwMCB0ZXh0LXRlYWwtODAwJywgbGFiZWw6ICdUZWFsJyB9LFxuICB7IHZhbHVlOiAnYmctb3JhbmdlLTEwMCB0ZXh0LW9yYW5nZS04MDAnLCBsYWJlbDogJ09yYW5nZScgfSxcbl1cblxuaW50ZXJmYWNlIEV2ZW50Rm9ybVByb3BzIHtcbiAgc2VsZWN0ZWRFdmVudD86IENhbGVuZGFyRXZlbnQgfCBudWxsXG4gIHNlbGVjdGVkRGF0ZT86IGRheWpzLkRheWpzIHwgbnVsbFxuICBvbkFkZD86IChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gdm9pZFxuICBvblVwZGF0ZT86IChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gdm9pZFxuICBvbkRlbGV0ZT86IChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gdm9pZFxuICBvbkNsb3NlOiAoKSA9PiB2b2lkXG59XG5cbmV4cG9ydCBjb25zdCBFdmVudEZvcm06IFJlYWN0LkZDPEV2ZW50Rm9ybVByb3BzPiA9ICh7XG4gIHNlbGVjdGVkRXZlbnQsXG4gIHNlbGVjdGVkRGF0ZSxcbiAgb25DbG9zZSxcbiAgb25VcGRhdGUsXG4gIG9uRGVsZXRlLFxuICBvbkFkZCxcbn0pID0+IHtcbiAgY29uc3Qgc3RhcnQgPSBzZWxlY3RlZEV2ZW50Py5vcmlnaW5hbFN0YXJ0ID8/IHNlbGVjdGVkRXZlbnQ/LnN0YXJ0XG4gIGNvbnN0IGVuZCA9IHNlbGVjdGVkRXZlbnQ/Lm9yaWdpbmFsRW5kID8/IHNlbGVjdGVkRXZlbnQ/LmVuZFxuXG4gIC8vIEZvcm0gZGVmYXVsdCB2YWx1ZXNcbiAgY29uc3QgZGVmYXVsdFN0YXJ0RGF0ZSA9IHNlbGVjdGVkRGF0ZT8udG9EYXRlKCkgfHwgbmV3IERhdGUoKVxuICBjb25zdCBkZWZhdWx0RW5kRGF0ZSA9XG4gICAgc2VsZWN0ZWREYXRlPy5hZGQoMSwgJ2hvdXInKS50b0RhdGUoKSB8fCBkYXlqcygpLmFkZCgxLCAnaG91cicpLnRvRGF0ZSgpXG5cbiAgLy8gRm9ybSBzdGF0ZVxuICBjb25zdCBbc3RhcnREYXRlLCBzZXRTdGFydERhdGVdID0gdXNlU3RhdGUoXG4gICAgc3RhcnQ/LnRvRGF0ZSgpIHx8IGRlZmF1bHRTdGFydERhdGVcbiAgKVxuICBjb25zdCBbZW5kRGF0ZSwgc2V0RW5kRGF0ZV0gPSB1c2VTdGF0ZShlbmQ/LnRvRGF0ZSgpIHx8IGRlZmF1bHRFbmREYXRlKVxuICBjb25zdCBbaXNBbGxEYXksIHNldElzQWxsRGF5XSA9IHVzZVN0YXRlKHNlbGVjdGVkRXZlbnQ/LmFsbERheSB8fCBmYWxzZSlcbiAgY29uc3QgW3NlbGVjdGVkQ29sb3IsIHNldFNlbGVjdGVkQ29sb3JdID0gdXNlU3RhdGUoXG4gICAgc2VsZWN0ZWRFdmVudD8uY29sb3IgfHwgY29sb3JPcHRpb25zWzBdLnZhbHVlXG4gIClcblxuICAvLyBUaW1lIHN0YXRlXG4gIGNvbnN0IFtzdGFydFRpbWUsIHNldFN0YXJ0VGltZV0gPSB1c2VTdGF0ZShcbiAgICBzZWxlY3RlZEV2ZW50XG4gICAgICA/IHNlbGVjdGVkRXZlbnQuc3RhcnQuZm9ybWF0KCdISDptbScpXG4gICAgICA6IGRheWpzKGRlZmF1bHRTdGFydERhdGUpLmZvcm1hdCgnSEg6bW0nKVxuICApXG4gIGNvbnN0IFtlbmRUaW1lLCBzZXRFbmRUaW1lXSA9IHVzZVN0YXRlKFxuICAgIHNlbGVjdGVkRXZlbnRcbiAgICAgID8gc2VsZWN0ZWRFdmVudC5lbmQuZm9ybWF0KCdISDptbScpXG4gICAgICA6IGRheWpzKGRlZmF1bHRFbmREYXRlKS5mb3JtYXQoJ0hIOm1tJylcbiAgKVxuXG4gIC8vIEluaXRpYWxpemUgZm9ybSB2YWx1ZXMgZnJvbSBzZWxlY3RlZCBldmVudCBvciBkZWZhdWx0c1xuICBjb25zdCBbZm9ybVZhbHVlcywgc2V0Rm9ybVZhbHVlc10gPSB1c2VTdGF0ZSh7XG4gICAgdGl0bGU6IHNlbGVjdGVkRXZlbnQ/LnRpdGxlIHx8ICcnLFxuICAgIGRlc2NyaXB0aW9uOiBzZWxlY3RlZEV2ZW50Py5kZXNjcmlwdGlvbiB8fCAnJyxcbiAgICBsb2NhdGlvbjogc2VsZWN0ZWRFdmVudD8ubG9jYXRpb24gfHwgJycsXG4gIH0pXG5cbiAgLy8gQ3JlYXRlIHdyYXBwZXIgZnVuY3Rpb25zIHRvIGZpeCBUeXBlU2NyaXB0IGVycm9ycyB3aXRoIERhdGVQaWNrZXJcbiAgY29uc3QgaGFuZGxlU3RhcnREYXRlQ2hhbmdlID0gKGRhdGU6IERhdGUgfCB1bmRlZmluZWQpID0+IHtcbiAgICBpZiAoZGF0ZSkgc2V0U3RhcnREYXRlKGRhdGUpXG4gIH1cblxuICBjb25zdCBoYW5kbGVFbmREYXRlQ2hhbmdlID0gKGRhdGU6IERhdGUgfCB1bmRlZmluZWQpID0+IHtcbiAgICBpZiAoZGF0ZSkgc2V0RW5kRGF0ZShkYXRlKVxuICB9XG5cbiAgLy8gVXBkYXRlIGZvcm0gdmFsdWVzIHdoZW4gaW5wdXQgY2hhbmdlc1xuICBjb25zdCBoYW5kbGVJbnB1dENoYW5nZSA9IChcbiAgICBlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudD5cbiAgKSA9PiB7XG4gICAgY29uc3QgeyBuYW1lLCB2YWx1ZSB9ID0gZS50YXJnZXRcbiAgICBzZXRGb3JtVmFsdWVzKChwcmV2KSA9PiAoeyAuLi5wcmV2LCBbbmFtZV06IHZhbHVlIH0pKVxuICB9XG5cbiAgLy8gSGFuZGxlIHRpbWUgY2hhbmdlc1xuICBjb25zdCBoYW5kbGVUaW1lQ2hhbmdlID0gKFxuICAgIGU6IFJlYWN0LkNoYW5nZUV2ZW50PEhUTUxJbnB1dEVsZW1lbnQ+LFxuICAgIGlzU3RhcnQ6IGJvb2xlYW5cbiAgKSA9PiB7XG4gICAgY29uc3QgdGltZVZhbHVlID0gZS50YXJnZXQudmFsdWVcbiAgICBpZiAoaXNTdGFydCkge1xuICAgICAgc2V0U3RhcnRUaW1lKHRpbWVWYWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgc2V0RW5kVGltZSh0aW1lVmFsdWUpXG4gICAgfVxuICB9XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAvLyBSZXNldCBlbmQgdGltZSB3aGVuIGFsbCBkYXkgaXMgdG9nZ2xlZCB0byBvblxuICAgIGlmIChpc0FsbERheSkge1xuICAgICAgc2V0RW5kVGltZSgnMjM6NTknKVxuICAgIH1cbiAgfSwgW2lzQWxsRGF5XSlcblxuICAvLyBIYW5kbGUgZm9ybSBzdWJtaXNzaW9uXG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9IChlOiBSZWFjdC5Gb3JtRXZlbnQpID0+IHtcbiAgICBlLnByZXZlbnREZWZhdWx0KClcblxuICAgIC8vIENyZWF0ZSBmdWxsIGRhdGV0aW1lIG9iamVjdHMgYnkgY29tYmluaW5nIGRhdGUgYW5kIHRpbWVcbiAgICBjb25zdCBbc3RhcnRIb3Vycywgc3RhcnRNaW51dGVzXSA9IHN0YXJ0VGltZS5zcGxpdCgnOicpLm1hcChOdW1iZXIpXG4gICAgY29uc3QgW2VuZEhvdXJzLCBlbmRNaW51dGVzXSA9IGVuZFRpbWUuc3BsaXQoJzonKS5tYXAoTnVtYmVyKVxuXG4gICAgbGV0IHN0YXJ0RGF0ZVRpbWUgPSBkYXlqcyhzdGFydERhdGUpLmhvdXIoc3RhcnRIb3VycykubWludXRlKHN0YXJ0TWludXRlcylcblxuICAgIGxldCBlbmREYXRlVGltZSA9IGRheWpzKGVuZERhdGUpLmhvdXIoZW5kSG91cnMpLm1pbnV0ZShlbmRNaW51dGVzKVxuXG4gICAgLy8gRm9yIGFsbC1kYXkgZXZlbnRzLCBzZXQgYXBwcm9wcmlhdGUgdGltZXNcbiAgICBpZiAoaXNBbGxEYXkpIHtcbiAgICAgIHN0YXJ0RGF0ZVRpbWUgPSBzdGFydERhdGVUaW1lLmhvdXIoMCkubWludXRlKDApXG4gICAgICBlbmREYXRlVGltZSA9IGVuZERhdGVUaW1lLmhvdXIoMjMpLm1pbnV0ZSg1OSlcbiAgICB9XG5cbiAgICBjb25zdCBldmVudERhdGE6IENhbGVuZGFyRXZlbnQgPSB7XG4gICAgICBpZDogc2VsZWN0ZWRFdmVudD8uaWQgfHwgZGF5anMoKS5mb3JtYXQoJ1lZWVlNTURESEhtbXNzJyksXG4gICAgICB0aXRsZTogZm9ybVZhbHVlcy50aXRsZSxcbiAgICAgIHN0YXJ0OiBzdGFydERhdGVUaW1lLFxuICAgICAgZW5kOiBlbmREYXRlVGltZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBmb3JtVmFsdWVzLmRlc2NyaXB0aW9uLFxuICAgICAgbG9jYXRpb246IGZvcm1WYWx1ZXMubG9jYXRpb24sXG4gICAgICBhbGxEYXk6IGlzQWxsRGF5LFxuICAgICAgY29sb3I6IHNlbGVjdGVkQ29sb3IsXG4gICAgfVxuXG4gICAgaWYgKHNlbGVjdGVkRXZlbnQuaWQpIHtcbiAgICAgIG9uVXBkYXRlPy4oZXZlbnREYXRhKVxuICAgIH0gZWxzZSB7XG4gICAgICBvbkFkZD8uKGV2ZW50RGF0YSlcbiAgICB9XG5cbiAgICBvbkNsb3NlKClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURlbGV0ZSA9ICgpID0+IHtcbiAgICBpZiAoc2VsZWN0ZWRFdmVudC5pZCkge1xuICAgICAgb25EZWxldGU/LihzZWxlY3RlZEV2ZW50KVxuICAgICAgb25DbG9zZSgpXG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGUgZW5kIGRhdGUgaXMgbm90IGJlZm9yZSBzdGFydCBkYXRlXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGRheWpzKHN0YXJ0RGF0ZSkuaXNBZnRlcihkYXlqcyhlbmREYXRlKSkpIHtcbiAgICAgIHNldEVuZERhdGUoc3RhcnREYXRlKVxuICAgIH1cbiAgfSwgW3N0YXJ0RGF0ZSwgZW5kRGF0ZV0pXG5cbiAgcmV0dXJuIChcbiAgICA8RGlhbG9nIG9wZW49e3RydWV9IG9uT3BlbkNoYW5nZT17b25DbG9zZX0+XG4gICAgICA8RGlhbG9nQ29udGVudCBjbGFzc05hbWU9XCJ3LVs5MHZ3XSBtYXgtdy1bNTAwcHhdIHAtNCBzbTpwLTZcIj5cbiAgICAgICAgPGZvcm0gb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdH0+XG4gICAgICAgICAgPERpYWxvZ0hlYWRlciBjbGFzc05hbWU9XCJtYi0yIHNtOm1iLTRcIj5cbiAgICAgICAgICAgIDxEaWFsb2dUaXRsZSBjbGFzc05hbWU9XCJ0ZXh0LWJhc2Ugc206dGV4dC1sZ1wiPlxuICAgICAgICAgICAgICB7c2VsZWN0ZWRFdmVudC5pZCA/ICdFZGl0IEV2ZW50JyA6ICdDcmVhdGUgRXZlbnQnfVxuICAgICAgICAgICAgPC9EaWFsb2dUaXRsZT5cbiAgICAgICAgICAgIDxEaWFsb2dEZXNjcmlwdGlvbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj5cbiAgICAgICAgICAgICAge3NlbGVjdGVkRXZlbnQuaWRcbiAgICAgICAgICAgICAgICA/ICdFZGl0IHlvdXIgZXZlbnQgZGV0YWlscydcbiAgICAgICAgICAgICAgICA6ICdBZGQgYSBuZXcgZXZlbnQgdG8geW91ciBjYWxlbmRhcid9XG4gICAgICAgICAgICA8L0RpYWxvZ0Rlc2NyaXB0aW9uPlxuICAgICAgICAgIDwvRGlhbG9nSGVhZGVyPlxuXG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0zIHB5LTIgc206Z2FwLTQgc206cHktNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0yXCI+XG4gICAgICAgICAgICAgIDxMYWJlbCBodG1sRm9yPVwidGl0bGVcIiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj5cbiAgICAgICAgICAgICAgICBUaXRsZVxuICAgICAgICAgICAgICA8L0xhYmVsPlxuICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICBpZD1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICBuYW1lPVwidGl0bGVcIlxuICAgICAgICAgICAgICAgIHZhbHVlPXtmb3JtVmFsdWVzLnRpdGxlfVxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtoYW5kbGVJbnB1dENoYW5nZX1cbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkV2ZW50IHRpdGxlXCJcbiAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgIGF1dG9Gb2N1c1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtOCB0ZXh0LXNtIHNtOmgtOVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBzcGFjZS14LTJcIj5cbiAgICAgICAgICAgICAgPENoZWNrYm94XG4gICAgICAgICAgICAgICAgaWQ9XCJhbGxEYXlcIlxuICAgICAgICAgICAgICAgIGNoZWNrZWQ9e2lzQWxsRGF5fVxuICAgICAgICAgICAgICAgIG9uQ2hlY2tlZENoYW5nZT17KGNoZWNrZWQpID0+IHNldElzQWxsRGF5KGNoZWNrZWQgPT09IHRydWUpfVxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8TGFiZWwgaHRtbEZvcj1cImFsbERheVwiIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgIEFsbCBkYXlcbiAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTIgc206Z2FwLTRcIj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8TGFiZWwgY2xhc3NOYW1lPVwidGV4dC14cyBzbTp0ZXh0LXNtXCI+U3RhcnQgRGF0ZTwvTGFiZWw+XG4gICAgICAgICAgICAgICAgPERhdGVQaWNrZXJcbiAgICAgICAgICAgICAgICAgIGRhdGU9e3N0YXJ0RGF0ZX1cbiAgICAgICAgICAgICAgICAgIHNldERhdGU9e2hhbmRsZVN0YXJ0RGF0ZUNoYW5nZX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTFcIlxuICAgICAgICAgICAgICAgICAgY2xvc2VPblNlbGVjdFxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxMYWJlbCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj5FbmQgRGF0ZTwvTGFiZWw+XG4gICAgICAgICAgICAgICAgPERhdGVQaWNrZXJcbiAgICAgICAgICAgICAgICAgIGRhdGU9e2VuZERhdGV9XG4gICAgICAgICAgICAgICAgICBzZXREYXRlPXtoYW5kbGVFbmREYXRlQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXQtMVwiXG4gICAgICAgICAgICAgICAgICBjbG9zZU9uU2VsZWN0XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgeyFpc0FsbERheSAmJiAoXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtMiBnYXAtMiBzbTpnYXAtNFwiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICA8TGFiZWwgaHRtbEZvcj1cInN0YXJ0LXRpbWVcIiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgU3RhcnQgVGltZVxuICAgICAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICBpZD1cInN0YXJ0LXRpbWVcIlxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGltZVwiXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzdGFydFRpbWV9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gaGFuZGxlVGltZUNoYW5nZShlLCB0cnVlKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXQtMSBoLTggdGV4dC1zbSBzbTpoLTlcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPExhYmVsIGh0bWxGb3I9XCJlbmQtdGltZVwiIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgICAgICBFbmQgVGltZVxuICAgICAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgICAgICBpZD1cImVuZC10aW1lXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRpbWVcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17ZW5kVGltZX1cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiBoYW5kbGVUaW1lQ2hhbmdlKGUsIGZhbHNlKX1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXQtMSBoLTggdGV4dC1zbSBzbTpoLTlcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApfVxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTEgc206Z2FwLTJcIj5cbiAgICAgICAgICAgICAgPExhYmVsIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbVwiPkNvbG9yPC9MYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtd3JhcCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxUb29sdGlwUHJvdmlkZXI+XG4gICAgICAgICAgICAgICAgICB7Y29sb3JPcHRpb25zLm1hcCgoY29sb3IpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPFRvb2x0aXAga2V5PXtjb2xvci52YWx1ZX0+XG4gICAgICAgICAgICAgICAgICAgICAgPFRvb2x0aXBUcmlnZ2VyIGFzQ2hpbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJnaG9zdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleT17Y29sb3IudmFsdWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAke2NvbG9yLnZhbHVlfSBoLTYgdy02IHJvdW5kZWQtZnVsbCBzbTpoLTggc206dy04YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbG9yID09PSBjb2xvci52YWx1ZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JpbmctMiByaW5nLWJsYWNrIHJpbmctb2Zmc2V0LTEgc206cmluZy1vZmZzZXQtMidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gc2V0U2VsZWN0ZWRDb2xvcihjb2xvci52YWx1ZSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e2NvbG9yLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L1Rvb2x0aXBUcmlnZ2VyPlxuICAgICAgICAgICAgICAgICAgICAgIDxUb29sdGlwQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbVwiPntjb2xvci5sYWJlbH08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwQ29udGVudD5cbiAgICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwPlxuICAgICAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICAgICAgPC9Ub29sdGlwUHJvdmlkZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtMSBzbTpnYXAtMlwiPlxuICAgICAgICAgICAgICA8TGFiZWwgaHRtbEZvcj1cImxvY2F0aW9uXCIgY2xhc3NOYW1lPVwidGV4dC14cyBzbTp0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgTG9jYXRpb25cbiAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgaWQ9XCJsb2NhdGlvblwiXG4gICAgICAgICAgICAgICAgbmFtZT1cImxvY2F0aW9uXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT17Zm9ybVZhbHVlcy5sb2NhdGlvbn1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFdmVudCBsb2NhdGlvbiAob3B0aW9uYWwpXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggdGV4dC1zbSBzbTpoLTlcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtMSBzbTpnYXAtMlwiPlxuICAgICAgICAgICAgICA8TGFiZWwgaHRtbEZvcj1cImRlc2NyaXB0aW9uXCIgY2xhc3NOYW1lPVwidGV4dC14cyBzbTp0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgRGVzY3JpcHRpb25cbiAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgaWQ9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgbmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT17Zm9ybVZhbHVlcy5kZXNjcmlwdGlvbn1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFdmVudCBkZXNjcmlwdGlvbiAob3B0aW9uYWwpXCJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggdGV4dC1zbSBzbTpoLTlcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICA8RGlhbG9nRm9vdGVyIGNsYXNzTmFtZT1cIm10LTIgZmxleCBmbGV4LWNvbC1yZXZlcnNlIGdhcC0yIHNtOm10LTQgc206ZmxleC1yb3cgc206Z2FwLTBcIj5cbiAgICAgICAgICAgIHtzZWxlY3RlZEV2ZW50LmlkICYmIChcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJkZXN0cnVjdGl2ZVwiXG4gICAgICAgICAgICAgICAgb25DbGljaz17aGFuZGxlRGVsZXRlfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInctZnVsbCBzbTptci1hdXRvIHNtOnctYXV0b1wiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIERlbGV0ZVxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggdy1mdWxsIGdhcC0yIHNtOnctYXV0b1wiPlxuICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgdmFyaWFudD1cIm91dGxpbmVcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xvc2V9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIHNtOmZsZXgtbm9uZVwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIENhbmNlbFxuICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgPEJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3NOYW1lPVwiZmxleC0xIHNtOmZsZXgtbm9uZVwiIHNpemU9XCJzbVwiPlxuICAgICAgICAgICAgICAgIHtzZWxlY3RlZEV2ZW50LmlkID8gJ1VwZGF0ZScgOiAnQ3JlYXRlJ31cbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L0RpYWxvZ0Zvb3Rlcj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgPC9EaWFsb2dDb250ZW50PlxuICAgIDwvRGlhbG9nPlxuICApXG59XG4iLAogICAgImltcG9ydCB7XG4gIEJ1dHRvbixcbiAgUG9wb3ZlcixcbiAgUG9wb3ZlckNvbnRlbnQsXG4gIFBvcG92ZXJUcmlnZ2VyLFxufSBmcm9tICdAL2NvbXBvbmVudHMvdWknXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB7IENhbGVuZGFyIGFzIENhbGVuZGFySWNvbiwgTWVudSwgUGx1cyB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCBUaXRsZUNvbnRlbnQgZnJvbSAnLi90aXRsZS1jb250ZW50J1xuaW1wb3J0IFZpZXdDb250cm9scyBmcm9tICcuL3ZpZXctY29udHJvbHMnXG5cbnR5cGUgSGVhZGVyUHJvcHMgPSBvYmplY3RcblxuY29uc3QgSGVhZGVyOiBSZWFjdC5GQzxIZWFkZXJQcm9wcz4gPSAoKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjdXJyZW50RGF0ZSxcbiAgICB2aWV3LFxuICAgIHNldFZpZXcsXG4gICAgbmV4dFBlcmlvZCxcbiAgICBwcmV2UGVyaW9kLFxuICAgIHRvZGF5LFxuICAgIG9wZW5FdmVudEZvcm0sXG4gIH0gPSB1c2VDYWxlbmRhckNvbnRleHQoKVxuXG4gIC8vIFN0YXRlIGZvciBtb2JpbGUgbWVudSBwb3BvdmVyXG4gIGNvbnN0IFttb2JpbGVQb3BvdmVyT3Blbiwgc2V0TW9iaWxlUG9wb3Zlck9wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG5cbiAgLy8gSGFuZGxlIHZpZXcgY2hhbmdlIHdpdGggb3B0aW9uYWwgcG9wb3ZlciBjbG9zaW5nXG4gIGNvbnN0IGhhbmRsZVZpZXdDaGFuZ2UgPSAoXG4gICAgbmV3VmlldzogJ2RheScgfCAnd2VlaycgfCAnbW9udGgnIHwgJ3llYXInLFxuICAgIGNsb3NlUG9wb3ZlciA9IGZhbHNlXG4gICkgPT4ge1xuICAgIHNldFZpZXcobmV3VmlldylcbiAgICBpZiAoY2xvc2VQb3BvdmVyKSB7XG4gICAgICBzZXRNb2JpbGVQb3BvdmVyT3BlbihmYWxzZSlcbiAgICB9XG4gIH1cblxuICAvLyBDYWxsYmFjayBmb3IgbmF2aWdhdGlvbiB0aGF0IGFsc28gY2xvc2VzIHRoZSBtb2JpbGUgcG9wb3ZlclxuICBjb25zdCBoYW5kbGVOYXZpZ2F0aW9uID0ge1xuICAgIHRvZGF5OiAoKSA9PiB7XG4gICAgICB0b2RheSgpXG4gICAgICBzZXRNb2JpbGVQb3BvdmVyT3BlbihmYWxzZSlcbiAgICB9LFxuICAgIHByZXZpb3VzOiAoKSA9PiB7XG4gICAgICBwcmV2UGVyaW9kKClcbiAgICAgIHNldE1vYmlsZVBvcG92ZXJPcGVuKGZhbHNlKVxuICAgIH0sXG4gICAgbmV4dDogKCkgPT4ge1xuICAgICAgbmV4dFBlcmlvZCgpXG4gICAgICBzZXRNb2JpbGVQb3BvdmVyT3BlbihmYWxzZSlcbiAgICB9LFxuICB9XG5cbiAgY29uc3QgTmV3RXZlbnRCdXR0b24gPSB1c2VDYWxsYmFjayhcbiAgICAoKSA9PiAoXG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgIDxCdXR0b25cbiAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBvcGVuRXZlbnRGb3JtKGN1cnJlbnREYXRlKX1cbiAgICAgICAgICB2YXJpYW50PVwiZGVmYXVsdFwiXG4gICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMVwiXG4gICAgICAgID5cbiAgICAgICAgICA8UGx1cyBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJoaWRkZW4gbWQ6aW5saW5lXCI+TmV3IEV2ZW50PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm1kOmhpZGRlblwiPk5ldzwvc3Bhbj5cbiAgICAgICAgPC9CdXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICApLFxuICAgIFtjdXJyZW50RGF0ZSwgb3BlbkV2ZW50Rm9ybV1cbiAgKVxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHsvKiBDYWxlbmRhciBIZWFkZXIgd2l0aCBncmlkIGxheW91dCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiQGNvbnRhaW5lciBncmlkIGdyaWQtY29scy0xMiBpdGVtcy1jZW50ZXIgZ2FwLTIgYm9yZGVyLWIgcC0yIHNtOnAtNFwiPlxuICAgICAgICB7LyogVGl0bGUgYXJlYSAtIExlZnQgc2VjdGlvbiAqL31cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc3Bhbi0xMiBmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIgQDR4bDpjb2wtc3Bhbi01IEA0eGw6anVzdGlmeS1zdGFydFwiPlxuICAgICAgICAgIDxDYWxlbmRhckljb24gY2xhc3NOYW1lPVwiaC01IHctNVwiIC8+XG4gICAgICAgICAgPFRpdGxlQ29udGVudCAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogTmV3IGV2ZW50IGJ1dHRvbiAtIE1vYmlsZSAmIERlc2t0b3AgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNwYW4tMTIgZmxleCBmbGV4LXdyYXAganVzdGlmeS1jZW50ZXIgZ2FwLTEgQDR4bDpjb2wtc3Bhbi03IEA0eGw6anVzdGlmeS1lbmRcIj5cbiAgICAgICAgICB7LyogRGVza3RvcCBjb250cm9scyAtIGNlbnRyYWxpemVkICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZCBnYXAtMSBzbTpmbGV4XCI+XG4gICAgICAgICAgICA8Vmlld0NvbnRyb2xzXG4gICAgICAgICAgICAgIGN1cnJlbnRWaWV3PXt2aWV3fVxuICAgICAgICAgICAgICBvbkNoYW5nZT17c2V0Vmlld31cbiAgICAgICAgICAgICAgb25Ub2RheT17dG9kYXl9XG4gICAgICAgICAgICAgIG9uTmV4dD17bmV4dFBlcmlvZH1cbiAgICAgICAgICAgICAgb25QcmV2aW91cz17cHJldlBlcmlvZH1cbiAgICAgICAgICAgICAgdmFyaWFudD1cImRlZmF1bHRcIlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJqdXN0aWZ5LWVuZFwiXG4gICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICB7LyogTmV3IGV2ZW50IGJ1dHRvbiAtIERlc2t0b3AgKi99XG4gICAgICAgICAgICA8TmV3RXZlbnRCdXR0b24gLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIHsvKiBNb2JpbGUgbmF2aWdhdGlvbiBtZW51IGJ1dHRvbiAtIFJpZ2h0IGFsaWduZWQgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZCBnYXAtMSBzbTpoaWRkZW5cIj5cbiAgICAgICAgICAgIHsvKiBOZXcgZXZlbnQgYnV0dG9uIC0gTW9iaWxlICovfVxuICAgICAgICAgICAgPE5ld0V2ZW50QnV0dG9uIC8+XG5cbiAgICAgICAgICAgIDxQb3BvdmVyXG4gICAgICAgICAgICAgIG9wZW49e21vYmlsZVBvcG92ZXJPcGVufVxuICAgICAgICAgICAgICBvbk9wZW5DaGFuZ2U9e3NldE1vYmlsZVBvcG92ZXJPcGVufVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lXCIgc2l6ZT1cInNtXCI+XG4gICAgICAgICAgICAgICAgICA8TWVudSBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgPC9Qb3BvdmVyVHJpZ2dlcj5cbiAgICAgICAgICAgICAgPFBvcG92ZXJDb250ZW50IGFsaWduPVwiZW5kXCIgY2xhc3NOYW1lPVwidy1bMjQwcHhdIHAtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwibWItMSB0ZXh0LXNtIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICAgIFZpZXcgJiBOYXZpZ2F0aW9uXG4gICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgPFZpZXdDb250cm9sc1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Vmlldz17dmlld31cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhuZXdWaWV3KSA9PiBoYW5kbGVWaWV3Q2hhbmdlKG5ld1ZpZXcsIHRydWUpfVxuICAgICAgICAgICAgICAgICAgICBvblRvZGF5PXtoYW5kbGVOYXZpZ2F0aW9uLnRvZGF5fVxuICAgICAgICAgICAgICAgICAgICBvbk5leHQ9e2hhbmRsZU5hdmlnYXRpb24ubmV4dH1cbiAgICAgICAgICAgICAgICAgICAgb25QcmV2aW91cz17aGFuZGxlTmF2aWdhdGlvbi5wcmV2aW91c31cbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImdyaWRcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9Qb3BvdmVyQ29udGVudD5cbiAgICAgICAgICAgIDwvUG9wb3Zlcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBIZWFkZXJcbiIsCiAgICAiaW1wb3J0IHtcbiAgQnV0dG9uLFxuICBQb3BvdmVyLFxuICBQb3BvdmVyQ29udGVudCxcbiAgUG9wb3ZlclRyaWdnZXIsXG59IGZyb20gJ0AvY29tcG9uZW50cy91aSdcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCB7IENoZXZyb25Eb3duIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcblxuLy8gQ3JlYXRlIGFycmF5cyBmb3IgbW9udGggYW5kIHllYXIgb3B0aW9uc1xuY29uc3QgbW9udGhzID0gW1xuICAnSmFudWFyeScsXG4gICdGZWJydWFyeScsXG4gICdNYXJjaCcsXG4gICdBcHJpbCcsXG4gICdNYXknLFxuICAnSnVuZScsXG4gICdKdWx5JyxcbiAgJ0F1Z3VzdCcsXG4gICdTZXB0ZW1iZXInLFxuICAnT2N0b2JlcicsXG4gICdOb3ZlbWJlcicsXG4gICdEZWNlbWJlcicsXG5dXG5cbi8vIEFuaW1hdGlvbiB2YXJpYW50cyBmb3IgbnVtYmVyIHRyYW5zaXRpb25zXG5jb25zdCBhbmltYXRpb25WYXJpYW50cyA9IHtcbiAgaW5pdGlhbDogeyBvcGFjaXR5OiAwLCB5OiAxMCB9LFxuICBhbmltYXRlOiB7IG9wYWNpdHk6IDEsIHk6IDAgfSxcbiAgZXhpdDogeyBvcGFjaXR5OiAwLCB5OiAtMTAgfSxcbn1cblxuY29uc3QgVGl0bGVDb250ZW50ID0gKCkgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREYXRlLCB2aWV3LCBzZXRDdXJyZW50RGF0ZSB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICAvLyBTdGF0ZSBmb3IgbW9iaWxlIG1lbnUgYW5kIHBvcG92ZXJzXG4gIGNvbnN0IFttb250aFBvcG92ZXJPcGVuLCBzZXRNb250aFBvcG92ZXJPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbeWVhclBvcG92ZXJPcGVuLCBzZXRZZWFyUG9wb3Zlck9wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFt3ZWVrUG9wb3Zlck9wZW4sIHNldFdlZWtQb3BvdmVyT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2RheVBvcG92ZXJPcGVuLCBzZXREYXlQb3BvdmVyT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcblxuICBjb25zdCBjdXJyZW50WWVhciA9IGN1cnJlbnREYXRlLnllYXIoKVxuICBjb25zdCB5ZWFycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDExIH0sIChfLCBpKSA9PiBjdXJyZW50WWVhciAtIDUgKyBpKVxuXG4gIC8vIEhhbmRsZSBtb250aCBhbmQgeWVhciBzZWxlY3Rpb25cbiAgY29uc3QgaGFuZGxlTW9udGhDaGFuZ2UgPSAobW9udGg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG5ld0RhdGUgPSBjdXJyZW50RGF0ZS5tb250aChtb250aClcbiAgICBzZXRDdXJyZW50RGF0ZShuZXdEYXRlKVxuICAgIHNldE1vbnRoUG9wb3Zlck9wZW4oZmFsc2UpXG4gIH1cblxuICBjb25zdCBoYW5kbGVZZWFyQ2hhbmdlID0gKHllYXI6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG5ld0RhdGUgPSBjdXJyZW50RGF0ZS55ZWFyKHllYXIpXG4gICAgc2V0Q3VycmVudERhdGUobmV3RGF0ZSlcbiAgICBzZXRZZWFyUG9wb3Zlck9wZW4oZmFsc2UpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7dmlldyAhPT0gJ3llYXInICYmIChcbiAgICAgICAgPFBvcG92ZXIgb3Blbj17bW9udGhQb3BvdmVyT3Blbn0gb25PcGVuQ2hhbmdlPXtzZXRNb250aFBvcG92ZXJPcGVufT5cbiAgICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcHgtMiBmb250LXNlbWlib2xkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgICAgIDxtb3Rpb24uc3BhblxuICAgICAgICAgICAgICAgICAga2V5PXtgbW9udGgtJHtjdXJyZW50RGF0ZS5tb250aCgpfWB9XG4gICAgICAgICAgICAgICAgICBpbml0aWFsPVwiaW5pdGlhbFwiXG4gICAgICAgICAgICAgICAgICBhbmltYXRlPVwiYW5pbWF0ZVwiXG4gICAgICAgICAgICAgICAgICBleGl0PVwiZXhpdFwiXG4gICAgICAgICAgICAgICAgICB2YXJpYW50cz17YW5pbWF0aW9uVmFyaWFudHN9XG4gICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uPXt7IGR1cmF0aW9uOiAwLjI1LCBlYXNlOiAnZWFzZUluT3V0JyB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtjdXJyZW50RGF0ZS5mb3JtYXQoJ01NTU0nKX1cbiAgICAgICAgICAgICAgICA8L21vdGlvbi5zcGFuPlxuICAgICAgICAgICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cbiAgICAgICAgICAgICAgPENoZXZyb25Eb3duIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPC9Qb3BvdmVyVHJpZ2dlcj5cbiAgICAgICAgICA8UG9wb3ZlckNvbnRlbnQgY2xhc3NOYW1lPVwidy00MCBwLTBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBtYXgtaC02MCBmbGV4LWNvbCBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICAgICAgICAgIHttb250aHMubWFwKChtb250aCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICBrZXk9e21vbnRofVxuICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgICdqdXN0aWZ5LXN0YXJ0IGZvbnQtbm9ybWFsJyxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudERhdGUubW9udGgoKSA9PT0gaW5kZXggJiYgJ2JnLXByaW1hcnkvMTAnXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlTW9udGhDaGFuZ2UoaW5kZXgpfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHttb250aH1cbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L1BvcG92ZXJDb250ZW50PlxuICAgICAgICA8L1BvcG92ZXI+XG4gICAgICApfVxuXG4gICAgICA8UG9wb3ZlciBvcGVuPXt5ZWFyUG9wb3Zlck9wZW59IG9uT3BlbkNoYW5nZT17c2V0WWVhclBvcG92ZXJPcGVufT5cbiAgICAgICAgPFBvcG92ZXJUcmlnZ2VyIGFzQ2hpbGQ+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHB4LTIgZm9udC1zZW1pYm9sZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgICA8bW90aW9uLnNwYW5cbiAgICAgICAgICAgICAgICBrZXk9e2B5ZWFyLSR7Y3VycmVudERhdGUueWVhcigpfWB9XG4gICAgICAgICAgICAgICAgaW5pdGlhbD1cImluaXRpYWxcIlxuICAgICAgICAgICAgICAgIGFuaW1hdGU9XCJhbmltYXRlXCJcbiAgICAgICAgICAgICAgICBleGl0PVwiZXhpdFwiXG4gICAgICAgICAgICAgICAgdmFyaWFudHM9e2FuaW1hdGlvblZhcmlhbnRzfVxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuMjUsIGVhc2U6ICdlYXNlSW5PdXQnIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7Y3VycmVudERhdGUuZm9ybWF0KCdZWVlZJyl9XG4gICAgICAgICAgICAgIDwvbW90aW9uLnNwYW4+XG4gICAgICAgICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cbiAgICAgICAgICAgIDxDaGV2cm9uRG93biBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgPC9Qb3BvdmVyVHJpZ2dlcj5cbiAgICAgICAgPFBvcG92ZXJDb250ZW50IGNsYXNzTmFtZT1cInctMjQgcC0wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG1heC1oLTYwIGZsZXgtY29sIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgICAgIHt5ZWFycy5tYXAoKHllYXIpID0+IChcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIGtleT17eWVhcn1cbiAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAnanVzdGlmeS1zdGFydCBmb250LW5vcm1hbCcsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS55ZWFyKCkgPT09IHllYXIgJiYgJ2JnLXByaW1hcnkvMTAnXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVZZWFyQ2hhbmdlKHllYXIpfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3llYXJ9XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvUG9wb3ZlckNvbnRlbnQ+XG4gICAgICA8L1BvcG92ZXI+XG5cbiAgICAgIHsvKiBEaXNwbGF5IGFkZGl0aW9uYWwgdmlldy1zcGVjaWZpYyBpbmZvcm1hdGlvbiAqL31cbiAgICAgIHt2aWV3ID09PSAnd2VlaycgJiYgKFxuICAgICAgICA8UG9wb3ZlciBvcGVuPXt3ZWVrUG9wb3Zlck9wZW59IG9uT3BlbkNoYW5nZT17c2V0V2Vla1BvcG92ZXJPcGVufT5cbiAgICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcHgtMiBmb250LXNlbWlib2xkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgICAgIDxtb3Rpb24uc3BhblxuICAgICAgICAgICAgICAgICAga2V5PXtgd2Vlay1yYW5nZS0ke2N1cnJlbnREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgICAgICAgICBpbml0aWFsPVwiaW5pdGlhbFwiXG4gICAgICAgICAgICAgICAgICBhbmltYXRlPVwiYW5pbWF0ZVwiXG4gICAgICAgICAgICAgICAgICBleGl0PVwiZXhpdFwiXG4gICAgICAgICAgICAgICAgICB2YXJpYW50cz17YW5pbWF0aW9uVmFyaWFudHN9XG4gICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uPXt7IGR1cmF0aW9uOiAwLjI1LCBlYXNlOiAnZWFzZUluT3V0JyB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtgJHtjdXJyZW50RGF0ZVxuICAgICAgICAgICAgICAgICAgICAuc3RhcnRPZignd2VlaycpXG4gICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoJ01NTSBEJyl9IC0gJHtjdXJyZW50RGF0ZVxuICAgICAgICAgICAgICAgICAgICAuZW5kT2YoJ3dlZWsnKVxuICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KCdNTU0gRCcpfWB9XG4gICAgICAgICAgICAgICAgPC9tb3Rpb24uc3Bhbj5cbiAgICAgICAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICAgICAgICAgIDxDaGV2cm9uRG93biBjbGFzc05hbWU9XCJtbC0xIGgtMyB3LTMgb3BhY2l0eS03MFwiIC8+XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8L1BvcG92ZXJUcmlnZ2VyPlxuICAgICAgICAgIDxQb3BvdmVyQ29udGVudCBjbGFzc05hbWU9XCJ3LTU2IHAtMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG1heC1oLTYwIGZsZXgtY29sIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgICAgICAgey8qIFNob3cgNyB3ZWVrcyAoMyBwYXN0LCBjdXJyZW50LCAzIGZ1dHVyZSkgKi99XG4gICAgICAgICAgICAgIHtBcnJheS5mcm9tKHsgbGVuZ3RoOiA3IH0sIChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2Vla0RhdGUgPSBjdXJyZW50RGF0ZS5zdWJ0cmFjdCgzLCAnd2VlaycpLmFkZChpLCAnd2VlaycpXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRPZldlZWsgPSB3ZWVrRGF0ZS5zdGFydE9mKCd3ZWVrJylcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRPZldlZWsgPSB3ZWVrRGF0ZS5lbmRPZignd2VlaycpXG4gICAgICAgICAgICAgICAgY29uc3QgaXNDdXJyZW50V2VlayA9IHdlZWtEYXRlLmlzU2FtZShjdXJyZW50RGF0ZSwgJ3dlZWsnKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAga2V5PXtzdGFydE9mV2Vlay5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAnanVzdGlmeS1zdGFydCBmb250LW5vcm1hbCcsXG4gICAgICAgICAgICAgICAgICAgICAgaXNDdXJyZW50V2VlayAmJiAnYmctcHJpbWFyeS8xMCdcbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJlbnREYXRlKHN0YXJ0T2ZXZWVrKVxuICAgICAgICAgICAgICAgICAgICAgIHNldFdlZWtQb3BvdmVyT3BlbihmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2Ake3N0YXJ0T2ZXZWVrLmZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgICAgICdNTU0gRCdcbiAgICAgICAgICAgICAgICAgICAgICApfSAtICR7ZW5kT2ZXZWVrLmZvcm1hdCgnRCcpfWB9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIHtzdGFydE9mV2Vlay5tb250aCgpICE9PSBlbmRPZldlZWsubW9udGgoKSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG9wYWNpdHktNzBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2Ake3N0YXJ0T2ZXZWVrLmZvcm1hdCgnTU1NJyl9LSR7ZW5kT2ZXZWVrLmZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTU1NJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9Qb3BvdmVyQ29udGVudD5cbiAgICAgICAgPC9Qb3BvdmVyPlxuICAgICAgKX1cbiAgICAgIHt2aWV3ID09PSAnZGF5JyAmJiAoXG4gICAgICAgIDxQb3BvdmVyIG9wZW49e2RheVBvcG92ZXJPcGVufSBvbk9wZW5DaGFuZ2U9e3NldERheVBvcG92ZXJPcGVufT5cbiAgICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcHgtMiBmb250LXNlbWlib2xkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgICAgIDxtb3Rpb24uc3BhblxuICAgICAgICAgICAgICAgICAga2V5PXtgZGF5LWluZm8tJHtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgICAgICAgICAgICAgaW5pdGlhbD1cImluaXRpYWxcIlxuICAgICAgICAgICAgICAgICAgYW5pbWF0ZT1cImFuaW1hdGVcIlxuICAgICAgICAgICAgICAgICAgZXhpdD1cImV4aXRcIlxuICAgICAgICAgICAgICAgICAgdmFyaWFudHM9e2FuaW1hdGlvblZhcmlhbnRzfVxuICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbj17eyBkdXJhdGlvbjogMC4yNSwgZWFzZTogJ2Vhc2VJbk91dCcgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7Y3VycmVudERhdGUuZm9ybWF0KCdkZGRkLCBEJyl9XG4gICAgICAgICAgICAgICAgPC9tb3Rpb24uc3Bhbj5cbiAgICAgICAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICAgICAgICAgIDxDaGV2cm9uRG93biBjbGFzc05hbWU9XCJtbC0xIGgtMyB3LTMgb3BhY2l0eS03MFwiIC8+XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8L1BvcG92ZXJUcmlnZ2VyPlxuICAgICAgICAgIDxQb3BvdmVyQ29udGVudCBjbGFzc05hbWU9XCJ3LTU2IHAtMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG1heC1oLTYwIGZsZXgtY29sIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgICAgICAgey8qIFNob3cgYWxsIGRheXMgb2YgdGhlIGN1cnJlbnQgbW9udGggKi99XG4gICAgICAgICAgICAgIHsoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEdldCBmaXJzdCBkYXkgb2YgbW9udGggYW5kIGxhc3QgZGF5IG9mIG1vbnRoXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gY3VycmVudERhdGUuc3RhcnRPZignbW9udGgnKVxuICAgICAgICAgICAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gY3VycmVudERhdGUuZGF5c0luTW9udGgoKVxuXG4gICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgYXJyYXkgb2YgZGF5cyBpbiB0aGUgbW9udGhcbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogZGF5c0luTW9udGggfSwgKF8sIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRheURhdGUgPSBmaXJzdERheU9mTW9udGguZGF0ZShpICsgMSkgLy8gaSArIDEgYmVjYXVzZSBkYXlzIHN0YXJ0IGF0IDFcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudERheSA9IGRheURhdGUuaXNTYW1lKGN1cnJlbnREYXRlLCAnZGF5JylcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzVG9kYXkgPSBkYXlEYXRlLmlzU2FtZShkYXlqcygpLCAnZGF5JylcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGtleT17ZGF5RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgICAgICAnanVzdGlmeS1zdGFydCBmb250LW5vcm1hbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0N1cnJlbnREYXkgJiYgJ2JnLXByaW1hcnkvMTAnXG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyZW50RGF0ZShkYXlEYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGF5UG9wb3Zlck9wZW4oZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2RheURhdGUuZm9ybWF0KCdkZGRkLCBNTU0gRCcpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtpc1RvZGF5ICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCByb3VuZGVkLXNtIHB4LTEgdGV4dC14c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvZGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH0pKCl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L1BvcG92ZXJDb250ZW50PlxuICAgICAgICA8L1BvcG92ZXI+XG4gICAgICApfVxuICAgIDwvPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IFRpdGxlQ29udGVudFxuIiwKICAgICJpbXBvcnQgeyBCdXR0b24gfSBmcm9tICdAL2NvbXBvbmVudHMvdWknXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHsgQ2hldnJvbkxlZnQsIENoZXZyb25SaWdodCB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcblxudHlwZSBWaWV3Q29udHJvbHNQcm9wcyA9IHtcbiAgY3VycmVudFZpZXc6ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICd5ZWFyJ1xuICBvbkNoYW5nZTogKHZpZXc6ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICd5ZWFyJykgPT4gdm9pZFxuICBvblRvZGF5PzogKCkgPT4gdm9pZFxuICBvbk5leHQ/OiAoKSA9PiB2b2lkXG4gIG9uUHJldmlvdXM/OiAoKSA9PiB2b2lkXG4gIHZhcmlhbnQ/OiAnZGVmYXVsdCcgfCAnZ3JpZCdcbiAgc2l6ZT86ICdzbScgfCAnZGVmYXVsdCdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmNvbnN0IFZpZXdDb250cm9sczogUmVhY3QuRkM8Vmlld0NvbnRyb2xzUHJvcHM+ID0gKHtcbiAgY3VycmVudFZpZXcsXG4gIG9uQ2hhbmdlLFxuICB2YXJpYW50ID0gJ2RlZmF1bHQnLFxuICBzaXplID0gJ3NtJyxcbiAgY2xhc3NOYW1lLFxuICBvblRvZGF5LFxuICBvbk5leHQsXG4gIG9uUHJldmlvdXMsXG59KSA9PiB7XG4gIGNvbnN0IGlzR3JpZCA9IHZhcmlhbnQgPT09ICdncmlkJ1xuXG4gIC8vIEV4dHJhY3QgY29tbW9uIGJ1dHRvbiBjbGFzc05hbWUgbG9naWMgdG8gYSBmdW5jdGlvblxuICBjb25zdCBnZXRCdXR0b25DbGFzc05hbWUgPSAodmlld1R5cGU6ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICd5ZWFyJykgPT4ge1xuICAgIHJldHVybiBjbihcbiAgICAgIC8vIEJhc2Ugd2lkdGggZm9yIGdyaWQgbGF5b3V0XG4gICAgICBpc0dyaWQgPyAndy1mdWxsJyA6ICcnLFxuICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciB5ZWFyIGJ1dHRvbiB2aXNpYmlsaXR5IG9uIG1vYmlsZVxuICAgICAgdmlld1R5cGUgPT09ICd5ZWFyJyA/IChpc0dyaWQgPyAndy1mdWxsJyA6ICdoaWRkZW4gbWQ6aW5saW5lLWZsZXgnKSA6ICcnLFxuICAgICAgLy8gQWN0aXZlIHZpZXcgc3R5bGluZ1xuICAgICAgY3VycmVudFZpZXcgPT09IHZpZXdUeXBlICYmICdiZy1wcmltYXJ5LzgwJ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IGdldEJ0blZhcmlhbnQgPSAodmlld1R5cGU6ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICd5ZWFyJykgPT4ge1xuICAgIHJldHVybiBjdXJyZW50VmlldyA9PT0gdmlld1R5cGUgPyAnZGVmYXVsdCcgOiAnb3V0bGluZSdcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgaXNHcmlkID8gJ2dyaWQgZ3JpZC1jb2xzLTIgZ2FwLTInIDogJ2ZsZXggZ2FwLTEnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgPlxuICAgICAgPEJ1dHRvbiBvbkNsaWNrPXtvblByZXZpb3VzfSB2YXJpYW50PVwib3V0bGluZVwiIHNpemU9e3NpemV9PlxuICAgICAgICA8Q2hldnJvbkxlZnQgY2xhc3NOYW1lPVwiaC00IHctNFwiIC8+XG4gICAgICA8L0J1dHRvbj5cbiAgICAgIDxCdXR0b24gb25DbGljaz17b25OZXh0fSB2YXJpYW50PVwib3V0bGluZVwiIHNpemU9e3NpemV9PlxuICAgICAgICA8Q2hldnJvblJpZ2h0IGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgPC9CdXR0b24+XG5cbiAgICAgIDxCdXR0b25cbiAgICAgICAgb25DbGljaz17KCkgPT4gb25DaGFuZ2UoJ2RheScpfVxuICAgICAgICB2YXJpYW50PXtnZXRCdG5WYXJpYW50KCdkYXknKX1cbiAgICAgICAgc2l6ZT17c2l6ZX1cbiAgICAgICAgY2xhc3NOYW1lPXtnZXRCdXR0b25DbGFzc05hbWUoJ2RheScpfVxuICAgICAgPlxuICAgICAgICBEYXlcbiAgICAgIDwvQnV0dG9uPlxuICAgICAgPEJ1dHRvblxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBvbkNoYW5nZSgnd2VlaycpfVxuICAgICAgICB2YXJpYW50PXtnZXRCdG5WYXJpYW50KCd3ZWVrJyl9XG4gICAgICAgIHNpemU9e3NpemV9XG4gICAgICAgIGNsYXNzTmFtZT17Z2V0QnV0dG9uQ2xhc3NOYW1lKCd3ZWVrJyl9XG4gICAgICA+XG4gICAgICAgIFdlZWtcbiAgICAgIDwvQnV0dG9uPlxuICAgICAgPEJ1dHRvblxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBvbkNoYW5nZSgnbW9udGgnKX1cbiAgICAgICAgdmFyaWFudD17Z2V0QnRuVmFyaWFudCgnbW9udGgnKX1cbiAgICAgICAgc2l6ZT17c2l6ZX1cbiAgICAgICAgY2xhc3NOYW1lPXtnZXRCdXR0b25DbGFzc05hbWUoJ21vbnRoJyl9XG4gICAgICA+XG4gICAgICAgIE1vbnRoXG4gICAgICA8L0J1dHRvbj5cbiAgICAgIDxCdXR0b25cbiAgICAgICAgb25DbGljaz17KCkgPT4gb25DaGFuZ2UoJ3llYXInKX1cbiAgICAgICAgdmFyaWFudD17Z2V0QnRuVmFyaWFudCgneWVhcicpfVxuICAgICAgICBzaXplPXtzaXplfVxuICAgICAgICBjbGFzc05hbWU9e2dldEJ1dHRvbkNsYXNzTmFtZSgneWVhcicpfVxuICAgICAgPlxuICAgICAgICBZZWFyXG4gICAgICA8L0J1dHRvbj5cblxuICAgICAgPEJ1dHRvbiBvbkNsaWNrPXtvblRvZGF5fSB2YXJpYW50PVwib3V0bGluZVwiIHNpemU9e3NpemV9PlxuICAgICAgICBUb2RheVxuICAgICAgPC9CdXR0b24+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgVmlld0NvbnRyb2xzXG4iLAogICAgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHsgU2Nyb2xsQXJlYSB9IGZyb20gJ0AvY29tcG9uZW50cy91aSdcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgQW5pbWF0ZVByZXNlbmNlLCBtb3Rpb24gfSBmcm9tICdtb3Rpb24vcmVhY3QnXG5cbmNvbnN0IFllYXJWaWV3OiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3QgeyBjdXJyZW50RGF0ZSwgc2VsZWN0RGF0ZSwgZXZlbnRzLCBzZXRWaWV3LCBnZXRFdmVudHNGb3JEYXRlIH0gPVxuICAgIHVzZUNhbGVuZGFyQ29udGV4dCgpXG4gIGNvbnN0IHllYXIgPSBjdXJyZW50RGF0ZS55ZWFyKClcblxuICAvLyBHZW5lcmF0ZSBhbiBhcnJheSBvZiAxMiBtb250aHMgZm9yIHRoZSBjdXJyZW50IHllYXJcbiAgY29uc3QgbW9udGhzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTIgfSwgKF8sIGkpID0+IHtcbiAgICBjb25zdCBtb250aERhdGUgPSBkYXlqcygpLnllYXIoeWVhcikubW9udGgoaSkuc3RhcnRPZignbW9udGgnKVxuICAgIHJldHVybiB7XG4gICAgICBkYXRlOiBtb250aERhdGUsXG4gICAgICBuYW1lOiBtb250aERhdGUuZm9ybWF0KCdNTU1NJyksXG4gICAgICBkYXlzSW5Nb250aDogbW9udGhEYXRlLmRheXNJbk1vbnRoKCksXG4gICAgICBmaXJzdERheU9mTW9udGg6IG1vbnRoRGF0ZS5zdGFydE9mKCdtb250aCcpLmRheSgpLCAvLyAwLTYsIDAgaXMgU3VuZGF5XG4gICAgfVxuICB9KVxuXG4gIC8vIENhbGN1bGF0ZSBldmVudHMgZm9yIGVhY2ggbW9udGhcbiAgY29uc3QgbW9udGhzV2l0aEV2ZW50Q291bnQgPSBtb250aHMubWFwKChtb250aCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50c0luTW9udGggPSBldmVudHMuZmlsdGVyKFxuICAgICAgKGV2ZW50KSA9PlxuICAgICAgICBldmVudC5zdGFydC55ZWFyKCkgPT09IHllYXIgJiZcbiAgICAgICAgZXZlbnQuc3RhcnQubW9udGgoKSA9PT0gbW9udGguZGF0ZS5tb250aCgpXG4gICAgKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1vbnRoLFxuICAgICAgZXZlbnRDb3VudDogZXZlbnRzSW5Nb250aC5sZW5ndGgsXG4gICAgfVxuICB9KVxuXG4gIC8vIEhhbmRsZSBtb250aCBjbGljayB0byBuYXZpZ2F0ZSB0byBtb250aCB2aWV3XG4gIGNvbnN0IGhhbmRsZU1vbnRoQ2xpY2sgPSAoZGF0ZTogZGF5anMuRGF5anMpID0+IHtcbiAgICBzZWxlY3REYXRlKGRhdGUpXG4gICAgc2V0VmlldygnbW9udGgnKVxuICB9XG5cbiAgLy8gSGFuZGxlIGRheSBjbGljayB3aXRoaW4gdGhlIG1pbmkgY2FsZW5kYXJcbiAgY29uc3QgaGFuZGxlRGF5Q2xpY2sgPSAoZGF0ZTogZGF5anMuRGF5anMsIGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkgLy8gUHJldmVudCB0cmlnZ2VyaW5nIHRoZSBtb250aCBjbGlja1xuICAgIHNlbGVjdERhdGUoZGF0ZSlcbiAgICBzZXRWaWV3KCdkYXknKSAvLyBOYXZpZ2F0ZSBkaXJlY3RseSB0byBkYXkgdmlldyB3aGVuIGNsaWNraW5nIG9uIGEgc3BlY2lmaWMgZGF5XG4gIH1cblxuICAvLyBHZW5lcmF0ZSBkYXlzIGZvciBtaW5pIGNhbGVuZGFyIGluIGVhY2ggbW9udGhcbiAgY29uc3QgcmVuZGVyTWluaUNhbGVuZGFyID0gKG1vbnRoOiAodHlwZW9mIG1vbnRoc1dpdGhFdmVudENvdW50KVswXSkgPT4ge1xuICAgIC8vIEdldCB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aCdzIGNhbGVuZGFyICh3aGljaCBjb3VsZCBiZSBpbiB0aGUgcHJldmlvdXMgbW9udGgpXG4gICAgY29uc3QgZmlyc3REYXlPZkNhbGVuZGFyID0gbW9udGguZGF0ZS5zdGFydE9mKCdtb250aCcpLnN0YXJ0T2YoJ3dlZWsnKVxuXG4gICAgLy8gQ3JlYXRlIDQyIGRheXMgKDYgcm93cyBvZiA3IGRheXMpIGZvciBjb25zaXN0ZW5jeVxuICAgIGNvbnN0IGRheXNBcnJheSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDQyIH0sIChfLCBpKSA9PiB7XG4gICAgICBjb25zdCBkYXkgPSBmaXJzdERheU9mQ2FsZW5kYXIuYWRkKGksICdkYXknKVxuICAgICAgY29uc3QgaXNDdXJyZW50TW9udGggPSBkYXkubW9udGgoKSA9PT0gbW9udGguZGF0ZS5tb250aCgpXG4gICAgICBjb25zdCBpc1RvZGF5ID0gZGF5LmlzU2FtZShkYXlqcygpLCAnZGF5JylcbiAgICAgIGNvbnN0IGlzQ3VycmVudERhdGUgPSBkYXkuaXNTYW1lKGN1cnJlbnREYXRlLCAnZGF5JylcblxuICAgICAgLy8gR2V0IGV2ZW50cyBmb3IgdGhpcyBkYXlcbiAgICAgIGNvbnN0IGRheUV2ZW50cyA9IGdldEV2ZW50c0ZvckRhdGUoZGF5KVxuICAgICAgY29uc3QgaGFzRXZlbnRzID0gZGF5RXZlbnRzLmxlbmd0aCA+IDBcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF5LFxuICAgICAgICBpc0N1cnJlbnRNb250aCxcbiAgICAgICAgaXNUb2RheSxcbiAgICAgICAgaXNDdXJyZW50RGF0ZSxcbiAgICAgICAgaGFzRXZlbnRzLFxuICAgICAgICBldmVudENvdW50OiBkYXlFdmVudHMubGVuZ3RoLFxuICAgICAgICAvLyBHcm91cCBldmVudHMgYnkgdGhlaXIgY2F0ZWdvcmllcyB0byBzaG93IGRpZmZlcmVudCBjb2xvcnNcbiAgICAgICAgZXZlbnRzOiBkYXlFdmVudHMsXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGRhdGEtdGVzdGlkPXtgeWVhci1taW5pLWNhbGVuZGFyLSR7bW9udGguZGF0ZS5mb3JtYXQoJ01NJyl9YH1cbiAgICAgICAgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtNyBnYXAtWzFweF0gdGV4dC1bMC42cmVtXVwiXG4gICAgICA+XG4gICAgICAgIHsvKiBEYXkgbmFtZXMgKi99XG4gICAgICAgIHtbJ1MnLCAnTScsICdUJywgJ1cnLCAnVCcsICdGJywgJ1MnXS5tYXAoKGRheU5hbWUsIGkpID0+IChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBrZXk9e2BoZWFkZXItJHtpfWB9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgaC0zIHRleHQtY2VudGVyXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7ZGF5TmFtZX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSl9XG5cbiAgICAgICAgey8qIENhbGVuZGFyIGRheXMgKi99XG4gICAgICAgIHtkYXlzQXJyYXkubWFwKChkYXlJbmZvLCBpKSA9PiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtgZGF5LSR7aX1gfVxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2B5ZWFyLWRheS0ke2RheUluZm8uZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gaGFuZGxlRGF5Q2xpY2soZGF5SW5mby5kYXksIGUpfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgJ3JlbGF0aXZlIGZsZXggYXNwZWN0LXNxdWFyZSB3LWZ1bGwgY3Vyc29yLXBvaW50ZXIgZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyJyxcbiAgICAgICAgICAgICAgJ2hvdmVyOmJnLWFjY2VudCByb3VuZGVkLXNtIHRyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTIwMCcsXG4gICAgICAgICAgICAgICFkYXlJbmZvLmlzQ3VycmVudE1vbnRoICYmICd0ZXh0LW11dGVkLWZvcmVncm91bmQgb3BhY2l0eS01MCcsXG4gICAgICAgICAgICAgIGRheUluZm8uaXNUb2RheSAmJlxuICAgICAgICAgICAgICAgICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICAgICAgIGRheUluZm8uaXNDdXJyZW50RGF0ZSAmJlxuICAgICAgICAgICAgICAgICFkYXlJbmZvLmlzVG9kYXkgJiZcbiAgICAgICAgICAgICAgICAnYmctbXV0ZWQgcm91bmRlZC1mdWxsIGZvbnQtYm9sZCcsXG4gICAgICAgICAgICAgIGRheUluZm8uaGFzRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgIWRheUluZm8uaXNUb2RheSAmJlxuICAgICAgICAgICAgICAgICFkYXlJbmZvLmlzQ3VycmVudERhdGUgJiZcbiAgICAgICAgICAgICAgICAnZm9udC1tZWRpdW0nXG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgdGl0bGU9e1xuICAgICAgICAgICAgICBkYXlJbmZvLmhhc0V2ZW50c1xuICAgICAgICAgICAgICAgID8gYCR7ZGF5SW5mby5ldmVudENvdW50fSBldmVudCR7XG4gICAgICAgICAgICAgICAgICAgIGRheUluZm8uZXZlbnRDb3VudCA+IDEgPyAncycgOiAnJ1xuICAgICAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1jZW50ZXIgbGVhZGluZy1ub25lXCI+XG4gICAgICAgICAgICAgIHtkYXlJbmZvLmRheS5kYXRlKCl9XG4gICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgIHsvKiBFbmhhbmNlZCBldmVudCBpbmRpY2F0b3IgLSBzaG93IG11bHRpcGxlIGNvbG9yZWQgZG90cyBmb3IgZGlmZmVyZW50IGV2ZW50IHR5cGVzICovfVxuICAgICAgICAgICAge2RheUluZm8uaGFzRXZlbnRzICYmIChcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAnYWJzb2x1dGUgYm90dG9tLTAgZmxleCB3LWZ1bGwganVzdGlmeS1jZW50ZXIgc3BhY2UteC1bMXB4XScsXG4gICAgICAgICAgICAgICAgICBkYXlJbmZvLmlzVG9kYXkgPyAnYm90dG9tLVsxcHhdJyA6ICcnXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHsvKiBTaG93IHVwIHRvIDMgZXZlbnQgZG90cyB3aXRoIGRpZmZlcmVudCBjb2xvcnMgaWYgYXZhaWxhYmxlICovfVxuICAgICAgICAgICAgICAgIHtkYXlJbmZvLmV2ZW50Q291bnQgPiAwICYmIChcbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgICAgJ2gtWzNweF0gdy1bM3B4XSByb3VuZGVkLWZ1bGwnLFxuICAgICAgICAgICAgICAgICAgICAgIGRheUluZm8uaXNUb2RheSA/ICdiZy1wcmltYXJ5LWZvcmVncm91bmQnIDogJ2JnLXByaW1hcnknXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge2RheUluZm8uZXZlbnRDb3VudCA+IDEgJiYgKFxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAnaC1bM3B4XSB3LVszcHhdIHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgZGF5SW5mby5pc1RvZGF5ID8gJ2JnLXByaW1hcnktZm9yZWdyb3VuZCcgOiAnYmctYmx1ZS01MDAnXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge2RheUluZm8uZXZlbnRDb3VudCA+IDIgJiYgKFxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAnaC1bM3B4XSB3LVszcHhdIHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgZGF5SW5mby5pc1RvZGF5ID8gJ2JnLXByaW1hcnktZm9yZWdyb3VuZCcgOiAnYmctZ3JlZW4tNTAwJ1xuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8U2Nyb2xsQXJlYSBkYXRhLXRlc3RpZD1cInllYXItdmlld1wiIGNsYXNzTmFtZT1cImgtZnVsbFwiPlxuICAgICAgPGRpdlxuICAgICAgICBkYXRhLXRlc3RpZD1cInllYXItZ3JpZFwiXG4gICAgICAgIGNsYXNzTmFtZT1cImdyaWQgYXV0by1yb3dzLWZyIGdyaWQtY29scy0xIGdhcC00IHAtNCBzbTpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtM1wiXG4gICAgICA+XG4gICAgICAgIHttb250aHNXaXRoRXZlbnRDb3VudC5tYXAoKG1vbnRoLCBpbmRleCkgPT4gKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGtleT17bW9udGgubmFtZX1cbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgeWVhci1tb250aC0ke21vbnRoLmRhdGUuZm9ybWF0KCdNTScpfWB9XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVNb250aENsaWNrKG1vbnRoLmRhdGUpfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiaG92ZXI6Ym9yZGVyLXByaW1hcnkgZmxleCBjdXJzb3ItcG9pbnRlciBmbGV4LWNvbCByb3VuZGVkLWxnIGJvcmRlciBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGhvdmVyOnNjYWxlLVsxLjAxXSBob3ZlcjpzaGFkb3ctbWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxBbmltYXRlUHJlc2VuY2UgbW9kZT1cIndhaXRcIj5cbiAgICAgICAgICAgICAgPG1vdGlvbi5kaXZcbiAgICAgICAgICAgICAgICBrZXk9e2Btb250aC0ke2luZGV4fWB9XG4gICAgICAgICAgICAgICAgaW5pdGlhbD17eyBvcGFjaXR5OiAwLCB5OiAtMTAgfX1cbiAgICAgICAgICAgICAgICBhbmltYXRlPXt7IG9wYWNpdHk6IDEsIHk6IDAgfX1cbiAgICAgICAgICAgICAgICBleGl0PXt7IG9wYWNpdHk6IDAsIHk6IC0xMCB9fVxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb249e3tcbiAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAwLjI1LFxuICAgICAgICAgICAgICAgICAgZWFzZTogJ2Vhc2VJbk91dCcsXG4gICAgICAgICAgICAgICAgICBkZWxheTogaW5kZXggKiAwLjA1LFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWItMiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGgzXG4gICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD17YHllYXItbW9udGgtdGl0bGUtJHttb250aC5kYXRlLmZvcm1hdCgnTU0nKX1gfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LW1lZGl1bVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge21vbnRoLm5hbWV9XG4gICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICB7bW9udGguZXZlbnRDb3VudCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2B5ZWFyLW1vbnRoLWV2ZW50LWNvdW50LSR7bW9udGguZGF0ZS5mb3JtYXQoJ01NJyl9YH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCByb3VuZGVkLWZ1bGwgcHgtMiBweS0xIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7bW9udGguZXZlbnRDb3VudH17JyAnfVxuICAgICAgICAgICAgICAgICAgICB7bW9udGguZXZlbnRDb3VudCA9PT0gMSA/ICdldmVudCcgOiAnZXZlbnRzJ31cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L21vdGlvbi5kaXY+XG4gICAgICAgICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cblxuICAgICAgICAgICAge3JlbmRlck1pbmlDYWxlbmRhcihtb250aCl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgPC9TY3JvbGxBcmVhPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IFllYXJWaWV3XG4iLAogICAgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IE1vbnRoVmlldyB9IGZyb20gJ0AvZmVhdHVyZXMvbW9udGgtdmlldy9jb21wb25lbnRzL21vbnRoLXZpZXcnXG5pbXBvcnQgV2Vla1ZpZXcgZnJvbSAnQC9mZWF0dXJlcy93ZWVrLXZpZXcvd2Vlay12aWV3J1xuaW1wb3J0IERheVZpZXcgZnJvbSAnQC9mZWF0dXJlcy9kYXktdmlldy9kYXktdmlldydcbmltcG9ydCB7IEV2ZW50Rm9ybSB9IGZyb20gJy4uL2V2ZW50LWZvcm0vZXZlbnQtZm9ybSdcbmltcG9ydCB7IEhlYWRlciB9IGZyb20gJy4uL2hlYWRlcidcbmltcG9ydCBZZWFyVmlldyBmcm9tICdAL2ZlYXR1cmVzL3llYXItdmlldy95ZWFyLXZpZXcnXG5pbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCB7IENhbGVuZGFyRG5kQ29udGV4dCB9IGZyb20gJ0AvZmVhdHVyZXMvZHJhZy1hbmQtZHJvcC9jYWxlbmRhci1kbmQtY29udGV4dCdcbmltcG9ydCB7IENhbGVuZGFyUHJvdmlkZXIgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvcHJvdmlkZXInXG5pbXBvcnQgdHlwZSB7IENhbGVuZGFyRXZlbnQsIFdlZWtEYXlzIH0gZnJvbSAnQC9jb21wb25lbnRzL3R5cGVzJ1xuaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB0eXBlIGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcblxuY29uc3QgQ2FsZW5kYXJDb250ZW50OiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3Qge1xuICAgIHZpZXcsXG4gICAgaXNFdmVudEZvcm1PcGVuLFxuICAgIGNsb3NlRXZlbnRGb3JtLFxuICAgIHNlbGVjdGVkRXZlbnQsXG4gICAgc2VsZWN0ZWREYXRlLFxuICAgIGFkZEV2ZW50LFxuICAgIHVwZGF0ZUV2ZW50LFxuICAgIGRlbGV0ZUV2ZW50LFxuICAgIGRheU1heEV2ZW50cyxcbiAgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgY29uc3Qgdmlld01hcCA9IHtcbiAgICBtb250aDogPE1vbnRoVmlldyBrZXk9XCJtb250aFwiIGRheU1heEV2ZW50cz17ZGF5TWF4RXZlbnRzfSAvPixcbiAgICB3ZWVrOiA8V2Vla1ZpZXcga2V5PVwid2Vla1wiIC8+LFxuICAgIGRheTogPERheVZpZXcga2V5PVwiZGF5XCIgLz4sXG4gICAgeWVhcjogPFllYXJWaWV3IGtleT1cInllYXJcIiAvPixcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZU9uVXBkYXRlID0gKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgdXBkYXRlRXZlbnQoZXZlbnQuaWQsIGV2ZW50KVxuICB9XG5cbiAgY29uc3QgaGFuZGxlT25EZWxldGUgPSAoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHtcbiAgICBkZWxldGVFdmVudChldmVudC5pZClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGxcIj5cbiAgICAgIDxIZWFkZXIgLz5cblxuICAgICAgey8qIENhbGVuZGFyIEJvZHkgd2l0aCBBbmltYXRlUHJlc2VuY2UgZm9yIHZpZXcgdHJhbnNpdGlvbnMgKi99XG4gICAgICA8Q2FsZW5kYXJEbmRDb250ZXh0PlxuICAgICAgICA8QW5pbWF0ZVByZXNlbmNlIG1vZGU9XCJ3YWl0XCI+XG4gICAgICAgICAgPG1vdGlvbi5kaXZcbiAgICAgICAgICAgIGtleT17dmlld31cbiAgICAgICAgICAgIGluaXRpYWw9e3sgb3BhY2l0eTogMCwgeDogMjAgfX1cbiAgICAgICAgICAgIGFuaW1hdGU9e3sgb3BhY2l0eTogMSwgeDogMCB9fVxuICAgICAgICAgICAgZXhpdD17eyBvcGFjaXR5OiAwLCB4OiAtMjAgfX1cbiAgICAgICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuMSwgZWFzZTogJ2Vhc2VJbk91dCcgfX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtZnVsbCB3LWZ1bGxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt2aWV3TWFwW3ZpZXddfVxuICAgICAgICAgIDwvbW90aW9uLmRpdj5cbiAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICA8L0NhbGVuZGFyRG5kQ29udGV4dD5cblxuICAgICAgey8qIEV2ZW50IEZvcm0gRGlhbG9nICovfVxuICAgICAge2lzRXZlbnRGb3JtT3BlbiAmJiAoXG4gICAgICAgIDxFdmVudEZvcm1cbiAgICAgICAgICBvbkNsb3NlPXtjbG9zZUV2ZW50Rm9ybX1cbiAgICAgICAgICBzZWxlY3RlZEV2ZW50PXtzZWxlY3RlZEV2ZW50fVxuICAgICAgICAgIHNlbGVjdGVkRGF0ZT17c2VsZWN0ZWREYXRlfVxuICAgICAgICAgIG9uQWRkPXthZGRFdmVudH1cbiAgICAgICAgICBvblVwZGF0ZT17aGFuZGxlT25VcGRhdGV9XG4gICAgICAgICAgb25EZWxldGU9e2hhbmRsZU9uRGVsZXRlfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5pbnRlcmZhY2UgQ2FsZW5kYXJQcm9wcyB7XG4gIGV2ZW50cz86IENhbGVuZGFyRXZlbnRbXVxuICBmaXJzdERheU9mV2Vlaz86IFdlZWtEYXlzXG4gIHJlbmRlckV2ZW50PzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiBSZWFjdC5SZWFjdE5vZGVcbiAgb25FdmVudENsaWNrPzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB2b2lkXG4gIG9uQ2VsbENsaWNrPzogKHN0YXJ0RGF0ZTogZGF5anMuRGF5anMsIGVuZERhdGU6IGRheWpzLkRheWpzKSA9PiB2b2lkXG4gIG9uVmlld0NoYW5nZT86ICh2aWV3OiAnbW9udGgnIHwgJ3dlZWsnIHwgJ2RheScgfCAneWVhcicpID0+IHZvaWRcbiAgbG9jYWxlPzogc3RyaW5nXG4gIHRpbWV6b25lPzogc3RyaW5nXG4gIGRpc2FibGVDZWxsQ2xpY2s/OiBib29sZWFuXG4gIGRpc2FibGVFdmVudENsaWNrPzogYm9vbGVhblxuICBkaXNhYmxlRHJhZ0FuZERyb3A/OiBib29sZWFuXG4gIGRheU1heEV2ZW50cz86IG51bWJlclxuICBzdGlja3lWaWV3SGVhZGVyPzogYm9vbGVhblxuICB2aWV3SGVhZGVyQ2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmNvbnN0IGRheU51bWJlck1hcDogUmVjb3JkPHN0cmluZywgbnVtYmVyPiA9IHtcbiAgc3VuZGF5OiAwLFxuICBtb25kYXk6IDEsXG4gIHR1ZXNkYXk6IDIsXG4gIHdlZG5lc2RheTogMyxcbiAgdGh1cnNkYXk6IDQsXG4gIGZyaWRheTogNSxcbiAgc2F0dXJkYXk6IDYsXG59XG5cbmNvbnN0IERFRkFVTFRfREFZX01BWF9FVkVOVFMgPSA2XG5leHBvcnQgY29uc3QgSWxhbXlDYWxlbmRhcjogUmVhY3QuRkM8Q2FsZW5kYXJQcm9wcz4gPSAoe1xuICBldmVudHMsXG4gIGZpcnN0RGF5T2ZXZWVrID0gJ3N1bmRheScsXG4gIHJlbmRlckV2ZW50LFxuICBvbkV2ZW50Q2xpY2ssXG4gIG9uQ2VsbENsaWNrLFxuICBvblZpZXdDaGFuZ2UsXG4gIGxvY2FsZSxcbiAgdGltZXpvbmUsXG4gIGRpc2FibGVDZWxsQ2xpY2ssXG4gIGRpc2FibGVFdmVudENsaWNrLFxuICBkaXNhYmxlRHJhZ0FuZERyb3AsXG4gIGRheU1heEV2ZW50cyA9IERFRkFVTFRfREFZX01BWF9FVkVOVFMsXG4gIHN0aWNreVZpZXdIZWFkZXIgPSB0cnVlLFxuICB2aWV3SGVhZGVyQ2xhc3NOYW1lID0gJycsXG59KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPENhbGVuZGFyUHJvdmlkZXJcbiAgICAgIGV2ZW50cz17ZXZlbnRzfVxuICAgICAgZmlyc3REYXlPZldlZWs9e2RheU51bWJlck1hcFtmaXJzdERheU9mV2Vla119XG4gICAgICByZW5kZXJFdmVudD17cmVuZGVyRXZlbnR9XG4gICAgICBvbkV2ZW50Q2xpY2s9e29uRXZlbnRDbGlja31cbiAgICAgIG9uQ2VsbENsaWNrPXtvbkNlbGxDbGlja31cbiAgICAgIG9uVmlld0NoYW5nZT17b25WaWV3Q2hhbmdlfVxuICAgICAgbG9jYWxlPXtsb2NhbGV9XG4gICAgICB0aW1lem9uZT17dGltZXpvbmV9XG4gICAgICBkaXNhYmxlQ2VsbENsaWNrPXtkaXNhYmxlQ2VsbENsaWNrfVxuICAgICAgZGlzYWJsZUV2ZW50Q2xpY2s9e2Rpc2FibGVFdmVudENsaWNrfVxuICAgICAgZGlzYWJsZURyYWdBbmREcm9wPXtkaXNhYmxlRHJhZ0FuZERyb3B9XG4gICAgICBkYXlNYXhFdmVudHM9e2RheU1heEV2ZW50c31cbiAgICAgIHN0aWNreVZpZXdIZWFkZXI9e3N0aWNreVZpZXdIZWFkZXJ9XG4gICAgICB2aWV3SGVhZGVyQ2xhc3NOYW1lPXt2aWV3SGVhZGVyQ2xhc3NOYW1lfVxuICAgID5cbiAgICAgIDxDYWxlbmRhckNvbnRlbnQgLz5cbiAgICA8L0NhbGVuZGFyUHJvdmlkZXI+XG4gIClcbn1cbiIsCiAgICAiaW1wb3J0IHtcbiAgRG5kQ29udGV4dCxcbiAgRHJhZ092ZXJsYXksXG4gIE1vdXNlU2Vuc29yLFxuICBwb2ludGVyV2l0aGluLFxuICBUb3VjaFNlbnNvcixcbiAgdXNlU2Vuc29yLFxuICB1c2VTZW5zb3JzLFxufSBmcm9tICdAZG5kLWtpdC9jb3JlJ1xuaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB0eXBlIHtcbiAgRHJhZ0NhbmNlbEV2ZW50LFxuICBEcmFnRW5kRXZlbnQsXG4gIERyYWdTdGFydEV2ZW50LFxufSBmcm9tICdAZG5kLWtpdC9jb3JlJ1xuaW1wb3J0IHsgc25hcENlbnRlclRvQ3Vyc29yIH0gZnJvbSAnQGRuZC1raXQvbW9kaWZpZXJzJ1xuaW1wb3J0IHR5cGUgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSAnQC9jb21wb25lbnRzL3R5cGVzJ1xuXG5pbnRlcmZhY2UgQ2FsZW5kYXJEbmRDb250ZXh0UHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDYWxlbmRhckRuZENvbnRleHQoeyBjaGlsZHJlbiB9OiBDYWxlbmRhckRuZENvbnRleHRQcm9wcykge1xuICBjb25zdCB7IHVwZGF0ZUV2ZW50LCB2aWV3LCBkaXNhYmxlRHJhZ0FuZERyb3AgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG4gIGNvbnN0IFthY3RpdmVFdmVudCwgc2V0QWN0aXZlRXZlbnRdID0gUmVhY3QudXNlU3RhdGU8Q2FsZW5kYXJFdmVudCB8IG51bGw+KFxuICAgIG51bGxcbiAgKVxuXG4gIC8vIENvbmZpZ3VyZSBzZW5zb3JzIHdpdGggcmVkdWNlZCBhY3RpdmF0aW9uIGNvbnN0cmFpbnRzIGZvciBlYXNpZXIgZHJhZ2dpbmdcbiAgY29uc3QgbW91c2VTZW5zb3IgPSB1c2VTZW5zb3IoTW91c2VTZW5zb3IsIHtcbiAgICAvLyBSZXF1aXJlIG1pbmltYWwgbW92ZW1lbnQgYmVmb3JlIGFjdGl2YXRpbmdcbiAgICBhY3RpdmF0aW9uQ29uc3RyYWludDoge1xuICAgICAgZGlzdGFuY2U6IDIsXG4gICAgfSxcbiAgfSlcblxuICBjb25zdCB0b3VjaFNlbnNvciA9IHVzZVNlbnNvcihUb3VjaFNlbnNvciwge1xuICAgIC8vIFJlZHVjZSBkZWxheSBmb3IgdG91Y2ggZGV2aWNlc1xuICAgIGFjdGl2YXRpb25Db25zdHJhaW50OiB7XG4gICAgICBkZWxheTogMTAwLFxuICAgICAgdG9sZXJhbmNlOiA1LFxuICAgIH0sXG4gIH0pXG5cbiAgY29uc3Qgc2Vuc29ycyA9IHVzZVNlbnNvcnMobW91c2VTZW5zb3IsIHRvdWNoU2Vuc29yKVxuXG4gIGNvbnN0IGhhbmRsZURyYWdTdGFydCA9IChldmVudDogRHJhZ1N0YXJ0RXZlbnQpID0+IHtcbiAgICBjb25zdCB7IGFjdGl2ZSB9ID0gZXZlbnRcblxuICAgIC8vIFNldCB0aGUgYWN0aXZlIGV2ZW50IGJhc2VkIG9uIHRoZSBldmVudCBkYXRhXG4gICAgaWYgKGFjdGl2ZS5kYXRhLmN1cnJlbnQ/LnR5cGUgPT09ICdjYWxlbmRhci1ldmVudCcpIHtcbiAgICAgIHNldEFjdGl2ZUV2ZW50KGFjdGl2ZS5kYXRhLmN1cnJlbnQuZXZlbnQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlRHJhZ0VuZCA9IChldmVudDogRHJhZ0VuZEV2ZW50KSA9PiB7XG4gICAgY29uc3QgeyBhY3RpdmUsIG92ZXIgfSA9IGV2ZW50XG5cbiAgICBpZiAoIWFjdGl2ZSB8fCAhb3ZlciB8fCAhYWN0aXZlRXZlbnQpIHtcbiAgICAgIHNldEFjdGl2ZUV2ZW50KG51bGwpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAob3Zlci5kYXRhLmN1cnJlbnQ/LnR5cGUgPT09ICd0aW1lLWNlbGwnKSB7XG4gICAgICBjb25zdCB7IGRhdGUsIGhvdXIgPSAwLCBtaW51dGUgPSAwIH0gPSBvdmVyLmRhdGEuY3VycmVudFxuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGV2ZW50IGR1cmF0aW9uIGluIG1pbnV0ZXNcbiAgICAgIGNvbnN0IG9yaWdpbmFsU3RhcnQgPSBhY3RpdmVFdmVudC5vcmlnaW5hbFN0YXJ0ID8/IGFjdGl2ZUV2ZW50LnN0YXJ0XG4gICAgICBjb25zdCBvcmlnaW5hbEVuZCA9IGFjdGl2ZUV2ZW50Lm9yaWdpbmFsRW5kID8/IGFjdGl2ZUV2ZW50LmVuZFxuICAgICAgY29uc3QgZHVyYXRpb25NaW51dGVzID0gb3JpZ2luYWxFbmQuZGlmZihvcmlnaW5hbFN0YXJ0LCAnbWludXRlJylcblxuICAgICAgLy8gQ3JlYXRlIG5ldyBzdGFydCB0aW1lIGJhc2VkIG9uIHRoZSBkcm9wIHRhcmdldFxuICAgICAgY29uc3QgbmV3U3RhcnQgPSBkYXlqcyhkYXRlKVxuICAgICAgICAuaG91cihob3VyKVxuICAgICAgICAubWludXRlKG1pbnV0ZSB8fCAwKVxuXG4gICAgICAvLyBDcmVhdGUgbmV3IGVuZCB0aW1lIGJ5IGFkZGluZyB0aGUgb3JpZ2luYWwgZHVyYXRpb25cbiAgICAgIGxldCBuZXdFbmQgPSBuZXdTdGFydC5hZGQoZHVyYXRpb25NaW51dGVzLCAnbWludXRlJylcbiAgICAgIGlmIChuZXdFbmQuaXNTYW1lKG5ld0VuZC5zdGFydE9mKCdkYXknKSkpIHtcbiAgICAgICAgLy8gSWYgdGhlIG5ldyBlbmQgdGltZSBpcyBhdCBtaWRuaWdodCwgc2V0IGl0IHRvIDI0IGhvdXJzIG9mIHBhcnRpYWwgZGF5XG4gICAgICAgIG5ld0VuZCA9IG5ld0VuZC5zdWJ0cmFjdCgxLCAnZGF5JykuZW5kT2YoJ2RheScpXG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZXZlbnQgd2l0aCBuZXcgdGltZXNcbiAgICAgIHVwZGF0ZUV2ZW50KGFjdGl2ZUV2ZW50LmlkLCB7XG4gICAgICAgIHN0YXJ0OiBuZXdTdGFydCxcbiAgICAgICAgZW5kOiBuZXdFbmQsXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAob3Zlci5kYXRhLmN1cnJlbnQ/LnR5cGUgPT09ICdkYXktY2VsbCcpIHtcbiAgICAgIGNvbnN0IHsgZGF0ZSB9ID0gb3Zlci5kYXRhLmN1cnJlbnRcbiAgICAgIGNvbnN0IG5ld0RhdGUgPSBkYXlqcyhkYXRlKVxuXG4gICAgICAvLyBGb3IgbXVsdGktZGF5IGV2ZW50cywgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgZHVyYXRpb24gaW4gZGF5c1xuICAgICAgY29uc3QgaXNNdWx0aURheUV2ZW50ID0gIWFjdGl2ZUV2ZW50LnN0YXJ0LmlzU2FtZShhY3RpdmVFdmVudC5lbmQsICdkYXknKVxuICAgICAgY29uc3Qgb3JpZ2luYWxTdGFydCA9IGFjdGl2ZUV2ZW50Lm9yaWdpbmFsU3RhcnQgPz8gYWN0aXZlRXZlbnQuc3RhcnRcbiAgICAgIGNvbnN0IG9yaWdpbmFsRW5kID0gYWN0aXZlRXZlbnQub3JpZ2luYWxFbmQgPz8gYWN0aXZlRXZlbnQuZW5kXG5cbiAgICAgIGlmIChpc011bHRpRGF5RXZlbnQpIHtcbiAgICAgICAgaWYgKHZpZXcgPT09ICd3ZWVrJykge1xuICAgICAgICAgIC8vIEdldCB0aW1lIGNvbXBvbmVudHMgdG8gcHJlc2VydmVcbiAgICAgICAgICBjb25zdCBzdGFydEhvdXIgPSBvcmlnaW5hbFN0YXJ0LmhvdXIoKVxuICAgICAgICAgIGNvbnN0IHN0YXJ0TWludXRlID0gb3JpZ2luYWxTdGFydC5taW51dGUoKVxuICAgICAgICAgIGNvbnN0IGVuZEhvdXIgPSBvcmlnaW5hbEVuZC5ob3VyKClcbiAgICAgICAgICBjb25zdCBlbmRNaW51dGUgPSBvcmlnaW5hbEVuZC5taW51dGUoKVxuXG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIGR1cmF0aW9uIGluIGRheXMgdG8gcHJlc2VydmVcbiAgICAgICAgICBjb25zdCBkdXJhdGlvbkRheXMgPSBvcmlnaW5hbEVuZC5kaWZmKG9yaWdpbmFsU3RhcnQsICdkYXknKVxuXG4gICAgICAgICAgLy8gQ3JlYXRlIG5ldyBzdGFydCBhbmQgZW5kIGRhdGVzXG4gICAgICAgICAgY29uc3QgbmV3U3RhcnQgPSBuZXdEYXRlXG4gICAgICAgICAgICAuc3RhcnRPZignZGF5JylcbiAgICAgICAgICAgIC5ob3VyKHN0YXJ0SG91cilcbiAgICAgICAgICAgIC5taW51dGUoc3RhcnRNaW51dGUpXG4gICAgICAgICAgY29uc3QgbmV3RW5kID0gbmV3U3RhcnRcbiAgICAgICAgICAgIC5hZGQoZHVyYXRpb25EYXlzLCAnZGF5JylcbiAgICAgICAgICAgIC5ob3VyKGVuZEhvdXIpXG4gICAgICAgICAgICAubWludXRlKGVuZE1pbnV0ZSlcblxuICAgICAgICAgIHVwZGF0ZUV2ZW50KGFjdGl2ZUV2ZW50LmlkLCB7XG4gICAgICAgICAgICBzdGFydDogbmV3U3RhcnQsXG4gICAgICAgICAgICBlbmQ6IG5ld0VuZCxcbiAgICAgICAgICAgIG9yaWdpbmFsU3RhcnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9yaWdpbmFsRW5kOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3Igb3RoZXIgdmlld3MgbGlrZSBtb250aCB2aWV3XG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkYXRlIHNoaWZ0IChob3cgbWFueSBkYXlzIHdlJ3JlIG1vdmluZyB0aGUgZXZlbnQpXG4gICAgICAgICAgY29uc3QgZGF5c0RpZmZlcmVuY2UgPSBuZXdEYXRlLmRpZmYoXG4gICAgICAgICAgICBvcmlnaW5hbFN0YXJ0LnN0YXJ0T2YoJ2RheScpLFxuICAgICAgICAgICAgJ2RheSdcbiAgICAgICAgICApXG5cbiAgICAgICAgICAvLyBDYWxjdWxhdGUgbmV3IHN0YXJ0IGFuZCBlbmQgd2hpbGUgcHJlc2VydmluZyB0aW1lIGNvbXBvbmVudHNcbiAgICAgICAgICBjb25zdCBuZXdTdGFydCA9IG9yaWdpbmFsU3RhcnQuYWRkKGRheXNEaWZmZXJlbmNlLCAnZGF5JylcbiAgICAgICAgICBjb25zdCBuZXdFbmQgPSBvcmlnaW5hbEVuZC5hZGQoZGF5c0RpZmZlcmVuY2UsICdkYXknKVxuXG4gICAgICAgICAgdXBkYXRlRXZlbnQoYWN0aXZlRXZlbnQuaWQsIHtcbiAgICAgICAgICAgIHN0YXJ0OiBuZXdTdGFydCxcbiAgICAgICAgICAgIGVuZDogbmV3RW5kLFxuICAgICAgICAgICAgb3JpZ2luYWxTdGFydDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3JpZ2luYWxFbmQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3Igc2luZ2xlLWRheSBldmVudHMsIG1haW50YWluIHRoZSB0aW1lIGJ1dCBjaGFuZ2UgdGhlIGRhdGVcbiAgICAgICAgY29uc3QgbmV3U3RhcnQgPSBuZXdEYXRlXG4gICAgICAgICAgLmhvdXIoYWN0aXZlRXZlbnQuc3RhcnQuaG91cigpKVxuICAgICAgICAgIC5taW51dGUoYWN0aXZlRXZlbnQuc3RhcnQubWludXRlKCkpXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGV2ZW50IGR1cmF0aW9uIGFuZCBzZXQgbmV3IGVuZCB0aW1lXG4gICAgICAgIGNvbnN0IGR1cmF0aW9uTWludXRlcyA9IGFjdGl2ZUV2ZW50LmVuZC5kaWZmKFxuICAgICAgICAgIGFjdGl2ZUV2ZW50LnN0YXJ0LFxuICAgICAgICAgICdtaW51dGUnXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgbmV3RW5kID0gbmV3U3RhcnQuYWRkKGR1cmF0aW9uTWludXRlcywgJ21pbnV0ZScpXG5cbiAgICAgICAgdXBkYXRlRXZlbnQoYWN0aXZlRXZlbnQuaWQsIHtcbiAgICAgICAgICBzdGFydDogbmV3U3RhcnQsXG4gICAgICAgICAgZW5kOiBuZXdFbmQsXG4gICAgICAgICAgb3JpZ2luYWxTdGFydDogdW5kZWZpbmVkLFxuICAgICAgICAgIG9yaWdpbmFsRW5kOiB1bmRlZmluZWQsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0QWN0aXZlRXZlbnQobnVsbClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURyYWdDYW5jZWwgPSAoX2V2ZW50OiBEcmFnQ2FuY2VsRXZlbnQpID0+IHtcbiAgICBzZXRBY3RpdmVFdmVudChudWxsKVxuICB9XG5cbiAgLy8gSWYgZHJhZyBhbmQgZHJvcCBpcyBkaXNhYmxlZCwganVzdCByZXR1cm4gY2hpbGRyZW4gd2l0aG91dCBEbmRDb250ZXh0XG4gIGlmIChkaXNhYmxlRHJhZ0FuZERyb3ApIHtcbiAgICByZXR1cm4gY2hpbGRyZW4gYXMgUmVhY3QuUmVhY3RFbGVtZW50XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxEbmRDb250ZXh0XG4gICAgICBzZW5zb3JzPXtzZW5zb3JzfVxuICAgICAgb25EcmFnU3RhcnQ9e2hhbmRsZURyYWdTdGFydH1cbiAgICAgIG9uRHJhZ0VuZD17aGFuZGxlRHJhZ0VuZH1cbiAgICAgIG9uRHJhZ0NhbmNlbD17aGFuZGxlRHJhZ0NhbmNlbH1cbiAgICAgIGNvbGxpc2lvbkRldGVjdGlvbj17cG9pbnRlcldpdGhpbn1cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICA8RHJhZ092ZXJsYXkgbW9kaWZpZXJzPXtbc25hcENlbnRlclRvQ3Vyc29yXX0+XG4gICAgICAgIHthY3RpdmVFdmVudCAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgJ2N1cnNvci1ncmFiIHRydW5jYXRlIHJvdW5kZWQgYmctYW1iZXItMjAwIHAtMiB0ZXh0LVsxMHB4XSBzaGFkb3ctbGcgc206dGV4dC14cycsXG4gICAgICAgICAgICAgIGFjdGl2ZUV2ZW50LmJhY2tncm91bmRDb2xvciB8fCAnYmctYmx1ZS01MDAnLFxuICAgICAgICAgICAgICBhY3RpdmVFdmVudC5jb2xvciB8fCAndGV4dC13aGl0ZSdcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2FjdGl2ZUV2ZW50Py50aXRsZX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvRHJhZ092ZXJsYXk+XG4gICAgPC9EbmRDb250ZXh0PlxuICApXG59XG4iLAogICAgImltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgUmVhY3QsIHtcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlU3RhdGUsXG4gIHR5cGUgUmVhY3ROb2RlLFxufSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IENhbGVuZGFyQ29udGV4dCB9IGZyb20gJy4vY29udGV4dCdcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcblxuaW50ZXJmYWNlIENhbGVuZGFyUHJvdmlkZXJQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGVcbiAgZXZlbnRzPzogQ2FsZW5kYXJFdmVudFtdXG4gIGZpcnN0RGF5T2ZXZWVrPzogbnVtYmVyIC8vIDAgZm9yIFN1bmRheSwgMSBmb3IgTW9uZGF5LCBldGMuXG4gIHJlbmRlckV2ZW50PzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiBSZWFjdE5vZGVcbiAgb25FdmVudENsaWNrPzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB2b2lkXG4gIG9uQ2VsbENsaWNrPzogKHN0YXJ0RGF0ZTogZGF5anMuRGF5anMsIGVuZERhdGU6IGRheWpzLkRheWpzKSA9PiB2b2lkXG4gIG9uVmlld0NoYW5nZT86ICh2aWV3OiAnbW9udGgnIHwgJ3dlZWsnIHwgJ2RheScgfCAneWVhcicpID0+IHZvaWRcbiAgbG9jYWxlPzogc3RyaW5nXG4gIHRpbWV6b25lPzogc3RyaW5nXG4gIGRpc2FibGVDZWxsQ2xpY2s/OiBib29sZWFuXG4gIGRpc2FibGVFdmVudENsaWNrPzogYm9vbGVhblxuICBkaXNhYmxlRHJhZ0FuZERyb3A/OiBib29sZWFuXG4gIGRheU1heEV2ZW50czogbnVtYmVyXG4gIHN0aWNreVZpZXdIZWFkZXI6IGJvb2xlYW5cbiAgdmlld0hlYWRlckNsYXNzTmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBDYWxlbmRhclByb3ZpZGVyOiBSZWFjdC5GQzxDYWxlbmRhclByb3ZpZGVyUHJvcHM+ID0gKHtcbiAgY2hpbGRyZW4sXG4gIGV2ZW50cyA9IFtdLFxuICBmaXJzdERheU9mV2VlayA9IDAsIC8vIERlZmF1bHQgdG8gU3VuZGF5LFxuICByZW5kZXJFdmVudCxcbiAgb25FdmVudENsaWNrLFxuICBvbkNlbGxDbGljayxcbiAgb25WaWV3Q2hhbmdlLFxuICBsb2NhbGUsXG4gIHRpbWV6b25lLFxuICBkaXNhYmxlQ2VsbENsaWNrLFxuICBkaXNhYmxlRXZlbnRDbGljayxcbiAgZGlzYWJsZURyYWdBbmREcm9wLFxuICBkYXlNYXhFdmVudHMsXG4gIHN0aWNreVZpZXdIZWFkZXIsXG4gIHZpZXdIZWFkZXJDbGFzc05hbWUsXG59KSA9PiB7XG4gIC8vIFN0YXRlXG4gIGNvbnN0IFtjdXJyZW50RGF0ZSwgc2V0Q3VycmVudERhdGVdID0gdXNlU3RhdGU8ZGF5anMuRGF5anM+KGRheWpzKCkpXG4gIGNvbnN0IFt2aWV3LCBzZXRWaWV3XSA9IHVzZVN0YXRlPCdtb250aCcgfCAnd2VlaycgfCAnZGF5JyB8ICd5ZWFyJz4oJ21vbnRoJylcbiAgY29uc3QgW2N1cnJlbnRFdmVudHMsIHNldEN1cnJlbnRFdmVudHNdID0gdXNlU3RhdGU8Q2FsZW5kYXJFdmVudFtdPihldmVudHMpXG4gIGNvbnN0IFtpc0V2ZW50Rm9ybU9wZW4sIHNldElzRXZlbnRGb3JtT3Blbl0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSlcbiAgY29uc3QgW3NlbGVjdGVkRXZlbnQsIHNldFNlbGVjdGVkRXZlbnRdID0gdXNlU3RhdGU8Q2FsZW5kYXJFdmVudCB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtzZWxlY3RlZERhdGUsIHNldFNlbGVjdGVkRGF0ZV0gPSB1c2VTdGF0ZTxkYXlqcy5EYXlqcyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtjdXJyZW50TG9jYWxlLCBzZXRDdXJyZW50TG9jYWxlXSA9IHVzZVN0YXRlPHN0cmluZz4obG9jYWxlIHx8ICdlbicpXG4gIGNvbnN0IFtjdXJyZW50VGltZXpvbmUsIHNldEN1cnJlbnRUaW1lem9uZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KHRpbWV6b25lIHx8ICcnKVxuXG4gIC8vIFVwZGF0ZSBldmVudHMgd2hlbiBldmVudHMgcHJvcCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGV2ZW50cykge1xuICAgICAgc2V0Q3VycmVudEV2ZW50cyhldmVudHMpXG4gICAgfVxuICB9LCBbZXZlbnRzXSlcblxuICAvLyBDb25maWd1cmUgbG9jYWxlIHdoZW4gbG9jYWxlIHByb3AgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsb2NhbGUpIHtcbiAgICAgIHNldEN1cnJlbnRMb2NhbGUobG9jYWxlKVxuICAgICAgZGF5anMubG9jYWxlKGxvY2FsZSlcbiAgICB9XG4gIH0sIFtsb2NhbGVdKVxuXG4gIC8vIENvbmZpZ3VyZSB0aW1lem9uZSBmb3IgY3VycmVudERhdGUgd2hlbiB0aW1lem9uZSBwcm9wIGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodGltZXpvbmUpIHtcbiAgICAgIHNldEN1cnJlbnRUaW1lem9uZSh0aW1lem9uZSlcbiAgICAgIGRheWpzLnR6LnNldERlZmF1bHQodGltZXpvbmUpXG4gICAgfVxuICB9LCBbdGltZXpvbmVdKVxuXG4gIC8vIEhhbmRsZXJzXG4gIGNvbnN0IHNlbGVjdERhdGUgPSB1c2VDYWxsYmFjaygoZGF0ZTogZGF5anMuRGF5anMpID0+IHtcbiAgICBzZXRDdXJyZW50RGF0ZShkYXRlKVxuICB9LCBbXSlcblxuICBjb25zdCBuZXh0UGVyaW9kID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHN3aXRjaCAodmlldykge1xuICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLmFkZCgxLCAnbW9udGgnKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLmFkZCgxLCAnd2VlaycpKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgc2V0Q3VycmVudERhdGUoKGN1cnJlbnREYXRlKSA9PiBjdXJyZW50RGF0ZS5hZGQoMSwgJ2RheScpKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgIHNldEN1cnJlbnREYXRlKChjdXJyZW50RGF0ZSkgPT4gY3VycmVudERhdGUuYWRkKDEsICd5ZWFyJykpXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9LCBbdmlld10pXG5cbiAgY29uc3QgcHJldlBlcmlvZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzd2l0Y2ggKHZpZXcpIHtcbiAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgc2V0Q3VycmVudERhdGUoKGN1cnJlbnREYXRlKSA9PiBjdXJyZW50RGF0ZS5zdWJ0cmFjdCgxLCAnbW9udGgnKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLnN1YnRyYWN0KDEsICd3ZWVrJykpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdkYXknOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLnN1YnRyYWN0KDEsICdkYXknKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLnN1YnRyYWN0KDEsICd5ZWFyJykpXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9LCBbdmlld10pXG5cbiAgY29uc3QgdG9kYXkgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0Q3VycmVudERhdGUoZGF5anMoKSlcbiAgfSwgW10pXG5cbiAgY29uc3QgYWRkRXZlbnQgPSB1c2VDYWxsYmFjaygoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHtcbiAgICBzZXRDdXJyZW50RXZlbnRzKChwcmV2RXZlbnRzKSA9PiBbLi4ucHJldkV2ZW50cywgZXZlbnRdKVxuICB9LCBbXSlcblxuICBjb25zdCB1cGRhdGVFdmVudCA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudElkOiBzdHJpbmcsIHVwZGF0ZWRFdmVudDogUGFydGlhbDxDYWxlbmRhckV2ZW50PikgPT4ge1xuICAgICAgc2V0Q3VycmVudEV2ZW50cygocHJldkV2ZW50cykgPT5cbiAgICAgICAgcHJldkV2ZW50cy5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgIGV2ZW50LmlkID09PSBldmVudElkID8geyAuLi5ldmVudCwgLi4udXBkYXRlZEV2ZW50IH0gOiBldmVudFxuICAgICAgICApXG4gICAgICApXG4gICAgfSxcbiAgICBbXVxuICApXG5cbiAgY29uc3QgZGVsZXRlRXZlbnQgPSB1c2VDYWxsYmFjaygoZXZlbnRJZDogc3RyaW5nKSA9PiB7XG4gICAgc2V0Q3VycmVudEV2ZW50cygocHJldkV2ZW50cykgPT5cbiAgICAgIHByZXZFdmVudHMuZmlsdGVyKChldmVudCkgPT4gZXZlbnQuaWQgIT09IGV2ZW50SWQpXG4gICAgKVxuICB9LCBbXSlcblxuICBjb25zdCBlZGl0RXZlbnQgPSB1c2VDYWxsYmFjaygoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHtcbiAgICBzZXRTZWxlY3RlZEV2ZW50KGV2ZW50KVxuICAgIHNldElzRXZlbnRGb3JtT3Blbih0cnVlKVxuICB9LCBbXSlcblxuICBjb25zdCBjbG9zZUV2ZW50Rm9ybSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTZWxlY3RlZERhdGUobnVsbClcbiAgICBzZXRTZWxlY3RlZEV2ZW50KG51bGwpXG4gICAgc2V0SXNFdmVudEZvcm1PcGVuKGZhbHNlKVxuICB9LCBbXSlcblxuICAvLyBDdXN0b20gaGFuZGxlcnMgdGhhdCBjYWxsIGV4dGVybmFsIGNhbGxiYWNrc1xuICBjb25zdCBoYW5kbGVWaWV3Q2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld1ZpZXc6ICdtb250aCcgfCAnd2VlaycgfCAnZGF5JyB8ICd5ZWFyJykgPT4ge1xuICAgICAgc2V0VmlldyhuZXdWaWV3KVxuICAgICAgb25WaWV3Q2hhbmdlPy4obmV3VmlldylcbiAgICB9LFxuICAgIFtvblZpZXdDaGFuZ2VdXG4gIClcblxuICBjb25zdCBoYW5kbGVFdmVudENsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgICBpZiAoZGlzYWJsZUNlbGxDbGljaykgcmV0dXJuXG4gICAgICBpZiAob25FdmVudENsaWNrKSB7XG4gICAgICAgIG9uRXZlbnRDbGljayhldmVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkaXRFdmVudChldmVudClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtkaXNhYmxlQ2VsbENsaWNrLCBvbkV2ZW50Q2xpY2ssIGVkaXRFdmVudF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZURhdGVDbGljayA9IHVzZUNhbGxiYWNrKFxuICAgIChzdGFydERhdGU6IGRheWpzLkRheWpzLCBlbmREYXRlOiBkYXlqcy5EYXlqcykgPT4ge1xuICAgICAgaWYgKGRpc2FibGVDZWxsQ2xpY2spIHJldHVyblxuXG4gICAgICBpZiAob25DZWxsQ2xpY2spIHtcbiAgICAgICAgb25DZWxsQ2xpY2soc3RhcnREYXRlLCBlbmREYXRlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0U2VsZWN0ZWREYXRlKHN0YXJ0RGF0ZSlcbiAgICAgICAgc2V0U2VsZWN0ZWRFdmVudCh7XG4gICAgICAgICAgdGl0bGU6IGBOZXcgRXZlbnRgLFxuICAgICAgICAgIHN0YXJ0OiBzdGFydERhdGUsXG4gICAgICAgICAgZW5kOiBlbmREYXRlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICBhbGxEYXk6IGZhbHNlLFxuICAgICAgICAgIGlzUmVjdXJyaW5nOiBmYWxzZSxcbiAgICAgICAgICByZWN1cnJlbmNlOiBudWxsLFxuICAgICAgICAgIHBhcmVudEV2ZW50SWQ6IG51bGwsXG4gICAgICAgIH0gYXMgQ2FsZW5kYXJFdmVudClcbiAgICAgICAgc2V0SXNFdmVudEZvcm1PcGVuKHRydWUpXG4gICAgICB9XG4gICAgfSxcbiAgICBbb25DZWxsQ2xpY2ssIGRpc2FibGVDZWxsQ2xpY2tdXG4gIClcblxuICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBuZXh0IG9jY3VycmVuY2UgYmFzZWQgb24gZnJlcXVlbmN5XG4gIGNvbnN0IGdldE5leHRPY2N1cnJlbmNlID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgZGF0ZTogZGF5anMuRGF5anMsXG4gICAgICBmcmVxOiAnZGFpbHknIHwgJ3dlZWtseScgfCAnbW9udGhseScgfCAneWVhcmx5JyxcbiAgICAgIGludDogbnVtYmVyLFxuICAgICAgZGF5cz86IG51bWJlcltdXG4gICAgKTogZGF5anMuRGF5anMgPT4ge1xuICAgICAgc3dpdGNoIChmcmVxKSB7XG4gICAgICAgIGNhc2UgJ2RhaWx5JzpcbiAgICAgICAgICByZXR1cm4gZGF0ZS5hZGQoaW50LCAnZGF5JylcbiAgICAgICAgY2FzZSAnd2Vla2x5JzpcbiAgICAgICAgICBpZiAoZGF5cyAmJiBkYXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgc3BlY2lmaWMgZGF5cyBvZiB0aGUgd2VlaywgZmluZCB0aGUgbmV4dCBkYXkgaW4gdGhlIGxpc3RcbiAgICAgICAgICAgIGxldCBuZXh0RGF0ZSA9IGRhdGUuYWRkKDEsICdkYXknKVxuICAgICAgICAgICAgbGV0IGxvb3BDb3VudCA9IDBcblxuICAgICAgICAgICAgLy8gUHJldmVudCBpbmZpbml0ZSBsb29wIC0gbWF4aW11bSA3IGl0ZXJhdGlvbnMgdG8gZmluZCB0aGUgbmV4dCBkYXlcbiAgICAgICAgICAgIHdoaWxlIChsb29wQ291bnQgPCA3KSB7XG4gICAgICAgICAgICAgIGlmIChkYXlzLmluY2x1ZGVzKG5leHREYXRlLmRheSgpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0RGF0ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG5leHREYXRlID0gbmV4dERhdGUuYWRkKDEsICdkYXknKVxuICAgICAgICAgICAgICBsb29wQ291bnQrK1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBuZXh0IGRheSwganVzdCBhZGQgdGhlIGludGVydmFsIHdlZWtzXG4gICAgICAgICAgICByZXR1cm4gZGF0ZS5hZGQoaW50LCAnd2VlaycpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwganVzdCBhZGQgdGhlIGludGVydmFsIHdlZWtzXG4gICAgICAgICAgICByZXR1cm4gZGF0ZS5hZGQoaW50LCAnd2VlaycpXG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdtb250aGx5JzpcbiAgICAgICAgICByZXR1cm4gZGF0ZS5hZGQoaW50LCAnbW9udGgnKVxuICAgICAgICBjYXNlICd5ZWFybHknOlxuICAgICAgICAgIHJldHVybiBkYXRlLmFkZChpbnQsICd5ZWFyJylcbiAgICAgIH1cbiAgICB9LFxuICAgIFtdXG4gIClcblxuICAvLyBFeHBhbmQgcmVjdXJyaW5nIGV2ZW50cyBmb3IgYSBkYXRlIHJhbmdlXG4gIGNvbnN0IGV4cGFuZFJlY3VycmluZ0V2ZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgYmFzZUV2ZW50OiBDYWxlbmRhckV2ZW50LFxuICAgICAgc3RhcnREYXRlOiBkYXlqcy5EYXlqcyxcbiAgICAgIGVuZERhdGU6IGRheWpzLkRheWpzXG4gICAgKTogQ2FsZW5kYXJFdmVudFtdID0+IHtcbiAgICAgIGNvbnN0IGV4cGFuZGVkRXZlbnRzOiBDYWxlbmRhckV2ZW50W10gPSBbXVxuICAgICAgaWYgKCFiYXNlRXZlbnQucmVjdXJyZW5jZSkgcmV0dXJuIFtiYXNlRXZlbnRdXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZnJlcXVlbmN5LFxuICAgICAgICBpbnRlcnZhbCxcbiAgICAgICAgZW5kRGF0ZTogcmVjdXJyZW5jZUVuZERhdGUsXG4gICAgICAgIGNvdW50LFxuICAgICAgICBkYXlzT2ZXZWVrLFxuICAgICAgICBleGNlcHRpb25zID0gW10sXG4gICAgICB9ID0gYmFzZUV2ZW50LnJlY3VycmVuY2VcblxuICAgICAgLy8gR2V0IGV4aXN0aW5nIGV4Y2VwdGlvbnMgZnJvbSB0aGUgZXZlbnRzIGFycmF5XG4gICAgICBjb25zdCBleGlzdGluZ0V4Y2VwdGlvbnMgPSBldmVudHMuZmlsdGVyKFxuICAgICAgICAoZXZlbnQpID0+IGV2ZW50LnBhcmVudEV2ZW50SWQgPT09IGJhc2VFdmVudC5pZCAmJiBldmVudC5pc0V4Y2VwdGlvblxuICAgICAgKVxuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGR1cmF0aW9uIG9mIHRoZSBldmVudFxuICAgICAgY29uc3QgZHVyYXRpb24gPSBiYXNlRXZlbnQuZW5kLmRpZmYoYmFzZUV2ZW50LnN0YXJ0LCAnbWludXRlJylcblxuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIGVuZCBkYXRlIGZvciByZWN1cnJlbmNlXG4gICAgICBjb25zdCBtYXhFbmREYXRlID1cbiAgICAgICAgcmVjdXJyZW5jZUVuZERhdGUgJiYgcmVjdXJyZW5jZUVuZERhdGUuaXNCZWZvcmUoZW5kRGF0ZSlcbiAgICAgICAgICA/IHJlY3VycmVuY2VFbmREYXRlXG4gICAgICAgICAgOiBlbmREYXRlXG5cbiAgICAgIGxldCBjdXJyZW50RGF0ZSA9IGJhc2VFdmVudC5zdGFydC5jbG9uZSgpXG4gICAgICBsZXQgb2NjdXJyZW5jZXMgPSAwXG5cbiAgICAgIC8vIElmIHRoZSByZWN1cnJpbmcgZXZlbnQgc3RhcnRzIGFmdGVyIHRoZSBlbmQgb2Ygb3VyIHJhbmdlLCBubyBldmVudHMgdG8gZ2VuZXJhdGVcbiAgICAgIGlmIChjdXJyZW50RGF0ZS5pc0FmdGVyKG1heEVuZERhdGUpKSB7XG4gICAgICAgIHJldHVybiBbXVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB3ZSBuZWVkIHRvIHN0YXJ0IGluIHRoZSBtaWRkbGUgb2YgYSByZWN1cnJlbmNlIHBhdHRlcm4sXG4gICAgICAvLyBmYXN0LWZvcndhcmQgdG8gZmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBpbiBvdXIgZGF0ZSByYW5nZVxuICAgICAgaWYgKGN1cnJlbnREYXRlLmlzQmVmb3JlKHN0YXJ0RGF0ZSkpIHtcbiAgICAgICAgc3dpdGNoIChmcmVxdWVuY3kpIHtcbiAgICAgICAgICBjYXNlICdkYWlseSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGRheXNUb0FkZCA9XG4gICAgICAgICAgICAgIE1hdGguZmxvb3Ioc3RhcnREYXRlLmRpZmYoY3VycmVudERhdGUsICdkYXknKSAvIGludGVydmFsKSAqXG4gICAgICAgICAgICAgIGludGVydmFsXG4gICAgICAgICAgICBpZiAoZGF5c1RvQWRkID4gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlLmFkZChkYXlzVG9BZGQsICdkYXknKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnd2Vla2x5Jzoge1xuICAgICAgICAgICAgaWYgKCFkYXlzT2ZXZWVrIHx8IGRheXNPZldlZWsubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHdlZWtzVG9BZGQgPVxuICAgICAgICAgICAgICAgIE1hdGguZmxvb3Ioc3RhcnREYXRlLmRpZmYoY3VycmVudERhdGUsICd3ZWVrJykgLyBpbnRlcnZhbCkgKlxuICAgICAgICAgICAgICAgIGludGVydmFsXG4gICAgICAgICAgICAgIGlmICh3ZWVrc1RvQWRkID4gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGUuYWRkKHdlZWtzVG9BZGQsICd3ZWVrJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnbW9udGhseSc6IHtcbiAgICAgICAgICAgIGNvbnN0IG1vbnRoc1RvQWRkID1cbiAgICAgICAgICAgICAgTWF0aC5mbG9vcihzdGFydERhdGUuZGlmZihjdXJyZW50RGF0ZSwgJ21vbnRoJykgLyBpbnRlcnZhbCkgKlxuICAgICAgICAgICAgICBpbnRlcnZhbFxuICAgICAgICAgICAgaWYgKG1vbnRoc1RvQWRkID4gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlLmFkZChtb250aHNUb0FkZCwgJ21vbnRoJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3llYXJseSc6IHtcbiAgICAgICAgICAgIGNvbnN0IHllYXJzVG9BZGQgPVxuICAgICAgICAgICAgICBNYXRoLmZsb29yKHN0YXJ0RGF0ZS5kaWZmKGN1cnJlbnREYXRlLCAneWVhcicpIC8gaW50ZXJ2YWwpICpcbiAgICAgICAgICAgICAgaW50ZXJ2YWxcbiAgICAgICAgICAgIGlmICh5ZWFyc1RvQWRkID4gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlLmFkZCh5ZWFyc1RvQWRkLCAneWVhcicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoXG4gICAgICAgIChjdXJyZW50RGF0ZS5pc0JlZm9yZShtYXhFbmREYXRlKSB8fFxuICAgICAgICAgIGN1cnJlbnREYXRlLmlzU2FtZShtYXhFbmREYXRlLCAnZGF5JykpICYmXG4gICAgICAgIChjb3VudCA9PT0gdW5kZWZpbmVkIHx8IG9jY3VycmVuY2VzIDwgY291bnQpXG4gICAgICApIHtcbiAgICAgICAgLy8gRm9ybWF0IGN1cnJlbnQgZGF0ZSBmb3IgY29tcGFyaXNvblxuICAgICAgICBjb25zdCBjdXJyZW50RGF0ZVN0ciA9IGN1cnJlbnREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG5cbiAgICAgICAgLy8gU2tpcCBpZiB0aGlzIGRhdGUgaXMgaW4gZXhjZXB0aW9uc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXhjZXB0aW9ucy5zb21lKFxuICAgICAgICAgICAgKGRhdGUpID0+IGRhdGUuZm9ybWF0KCdZWVlZLU1NLUREJykgPT09IGN1cnJlbnREYXRlU3RyXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IG9jY3VycmVuY2VcbiAgICAgICAgICBjdXJyZW50RGF0ZSA9IGdldE5leHRPY2N1cnJlbmNlKFxuICAgICAgICAgICAgY3VycmVudERhdGUsXG4gICAgICAgICAgICBmcmVxdWVuY3ksXG4gICAgICAgICAgICBpbnRlcnZhbCxcbiAgICAgICAgICAgIGRheXNPZldlZWtcbiAgICAgICAgICApXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgaWYgaXQncyBhIHdlZWtseSByZWN1cnJlbmNlIHdpdGggc3BlY2lmaWVkIGRheXMgYW5kIGN1cnJlbnQgZGF5IGlzIG5vdCBpbmNsdWRlZFxuICAgICAgICBpZiAoXG4gICAgICAgICAgZnJlcXVlbmN5ID09PSAnd2Vla2x5JyAmJlxuICAgICAgICAgIGRheXNPZldlZWsgJiZcbiAgICAgICAgICBkYXlzT2ZXZWVrLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAhZGF5c09mV2Vlay5pbmNsdWRlcyhjdXJyZW50RGF0ZS5kYXkoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3VycmVudERhdGUgPSBjdXJyZW50RGF0ZS5hZGQoMSwgJ2RheScpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBjdXN0b20gZXhjZXB0aW9uIGZvciB0aGlzIG9jY3VycmVuY2VcbiAgICAgICAgY29uc3QgZXhjZXB0aW9uRXZlbnQgPSBleGlzdGluZ0V4Y2VwdGlvbnMuZmluZChcbiAgICAgICAgICAoZXZlbnQpID0+IGV2ZW50LnN0YXJ0LmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBjdXJyZW50RGF0ZVN0clxuICAgICAgICApXG5cbiAgICAgICAgaWYgKGV4Y2VwdGlvbkV2ZW50KSB7XG4gICAgICAgICAgLy8gVXNlIHRoZSBleGNlcHRpb24gaW5zdGVhZCBvZiBnZW5lcmF0aW5nIGEgbmV3IGV2ZW50XG4gICAgICAgICAgZXhwYW5kZWRFdmVudHMucHVzaChleGNlcHRpb25FdmVudClcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50RGF0ZS5pc0FmdGVyKHN0YXJ0RGF0ZS5zdWJ0cmFjdCgxLCAnZGF5JykpKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IG9jY3VycmVuY2UgaWYgaXQgZmFsbHMgd2l0aGluIHRoZSByZXF1ZXN0ZWQgcmFuZ2VcbiAgICAgICAgICBjb25zdCBldmVudEluc3RhbmNlOiBDYWxlbmRhckV2ZW50ID0ge1xuICAgICAgICAgICAgLi4uYmFzZUV2ZW50LFxuICAgICAgICAgICAgaWQ6IGAke2Jhc2VFdmVudC5pZH0tJHtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVlNTUREJyl9YCxcbiAgICAgICAgICAgIHN0YXJ0OiBjdXJyZW50RGF0ZS5jbG9uZSgpLFxuICAgICAgICAgICAgZW5kOiBjdXJyZW50RGF0ZS5jbG9uZSgpLmFkZChkdXJhdGlvbiwgJ21pbnV0ZScpLFxuICAgICAgICAgICAgaXNSZWN1cnJpbmc6IHRydWUsXG4gICAgICAgICAgICBwYXJlbnRFdmVudElkOiBiYXNlRXZlbnQuaWQsXG4gICAgICAgICAgfVxuICAgICAgICAgIGV4cGFuZGVkRXZlbnRzLnB1c2goZXZlbnRJbnN0YW5jZSlcbiAgICAgICAgfVxuXG4gICAgICAgIG9jY3VycmVuY2VzKytcbiAgICAgICAgY3VycmVudERhdGUgPSBnZXROZXh0T2NjdXJyZW5jZShcbiAgICAgICAgICBjdXJyZW50RGF0ZSxcbiAgICAgICAgICBmcmVxdWVuY3ksXG4gICAgICAgICAgaW50ZXJ2YWwsXG4gICAgICAgICAgZGF5c09mV2Vla1xuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleHBhbmRlZEV2ZW50c1xuICAgIH0sXG4gICAgW2V2ZW50cywgZ2V0TmV4dE9jY3VycmVuY2VdXG4gIClcblxuICAvLyBFdmVudCBxdWVyeSBmdW5jdGlvbnNcbiAgY29uc3QgZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKHN0YXJ0OiBkYXlqcy5EYXlqcywgZW5kOiBkYXlqcy5EYXlqcyk6IENhbGVuZGFyRXZlbnRbXSA9PiB7XG4gICAgICBjb25zdCBzdGFydERhdGUgPSBzdGFydC5zdGFydE9mKCdkYXknKVxuICAgICAgY29uc3QgZW5kRGF0ZSA9IGVuZC5lbmRPZignZGF5JylcblxuICAgICAgLy8gRmlsdGVyIHJlZ3VsYXIgZXZlbnRzIGZpcnN0XG4gICAgICBjb25zdCByZWd1bGFyRXZlbnRzID0gZXZlbnRzLmZpbHRlcigoZXZlbnQpID0+IHtcbiAgICAgICAgLy8gRml4ZWQgbG9naWMgZm9yIGNoZWNraW5nIGlmIGV2ZW50IG92ZXJsYXBzIHdpdGggdGhlIGRhdGUgcmFuZ2VcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAvLyBDYXNlIDE6IEV2ZW50IHN0YXJ0cyB3aXRoaW4gdGhlIHJhbmdlXG4gICAgICAgICAgKChldmVudC5zdGFydC5pc0FmdGVyKHN0YXJ0RGF0ZSkgfHwgZXZlbnQuc3RhcnQuaXNTYW1lKHN0YXJ0RGF0ZSkpICYmXG4gICAgICAgICAgICAoZXZlbnQuc3RhcnQuaXNCZWZvcmUoZW5kRGF0ZSkgfHwgZXZlbnQuc3RhcnQuaXNTYW1lKGVuZERhdGUpKSkgfHxcbiAgICAgICAgICAvLyBDYXNlIDI6IEV2ZW50IGVuZHMgd2l0aGluIHRoZSByYW5nZVxuICAgICAgICAgICgoZXZlbnQuZW5kLmlzQWZ0ZXIoc3RhcnREYXRlKSB8fCBldmVudC5lbmQuaXNTYW1lKHN0YXJ0RGF0ZSkpICYmXG4gICAgICAgICAgICAoZXZlbnQuZW5kLmlzQmVmb3JlKGVuZERhdGUpIHx8IGV2ZW50LmVuZC5pc1NhbWUoZW5kRGF0ZSkpKSB8fFxuICAgICAgICAgIC8vIENhc2UgMzogRXZlbnQgc3BhbnMgYWNyb3NzIHRoZSBlbnRpcmUgcmFuZ2VcbiAgICAgICAgICAoZXZlbnQuc3RhcnQuaXNCZWZvcmUoc3RhcnREYXRlKSAmJiBldmVudC5lbmQuaXNBZnRlcihlbmREYXRlKSlcbiAgICAgICAgKVxuICAgICAgfSlcblxuICAgICAgLy8gRmluZCBwYXJlbnQgcmVjdXJyaW5nIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgZXhwYW5kZWRcbiAgICAgIGNvbnN0IHJlY3VycmluZ1BhcmVudEV2ZW50cyA9IGV2ZW50cy5maWx0ZXIoXG4gICAgICAgIChldmVudCkgPT4gZXZlbnQucmVjdXJyZW5jZSAmJiAhZXZlbnQucGFyZW50RXZlbnRJZFxuICAgICAgKVxuXG4gICAgICAvLyBFeHBhbmQgcmVjdXJyaW5nIGV2ZW50cyBmb3IgdGhpcyByYW5nZVxuICAgICAgbGV0IHJlY3VycmluZ0V2ZW50czogQ2FsZW5kYXJFdmVudFtdID0gW11cbiAgICAgIHJlY3VycmluZ1BhcmVudEV2ZW50cy5mb3JFYWNoKChwYXJlbnRFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBleHBhbmRlZCA9IGV4cGFuZFJlY3VycmluZ0V2ZW50KHBhcmVudEV2ZW50LCBzdGFydERhdGUsIGVuZERhdGUpXG4gICAgICAgIHJlY3VycmluZ0V2ZW50cyA9IFsuLi5yZWN1cnJpbmdFdmVudHMsIC4uLmV4cGFuZGVkXVxuICAgICAgfSlcblxuICAgICAgLy8gQ29tYmluZSBhbGwgZXZlbnRzIGFuZCByZW1vdmUgYW55IGR1cGxpY2F0ZXNcbiAgICAgIHJldHVybiBbLi4ucmVndWxhckV2ZW50cywgLi4ucmVjdXJyaW5nRXZlbnRzXS5maWx0ZXIoXG4gICAgICAgIChldmVudCwgaW5kZXgsIHNlbGYpID0+XG4gICAgICAgICAgaW5kZXggPT09IHNlbGYuZmluZEluZGV4KChlKSA9PiBlLmlkID09PSBldmVudC5pZClcbiAgICAgIClcbiAgICB9LFxuICAgIFtldmVudHMsIGV4cGFuZFJlY3VycmluZ0V2ZW50XVxuICApXG5cbiAgY29uc3QgZ2V0RXZlbnRzRm9yRGF0ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChkYXRlOiBkYXlqcy5EYXlqcyk6IENhbGVuZGFyRXZlbnRbXSA9PiB7XG4gICAgICBjb25zdCBkYXkgPSBkYXRlLnN0YXJ0T2YoJ2RheScpXG4gICAgICBjb25zdCBuZXh0RGF5ID0gZGF5LmFkZCgxLCAnZGF5JylcbiAgICAgIHJldHVybiBnZXRFdmVudHNGb3JEYXRlUmFuZ2UoZGF5LCBuZXh0RGF5KVxuICAgIH0sXG4gICAgW2dldEV2ZW50c0ZvckRhdGVSYW5nZV1cbiAgKVxuXG4gIC8vIFJlY3VycmluZyBldmVudCBvcGVyYXRpb25zXG4gIGNvbnN0IGFkZFJlY3VycmluZ0V2ZW50ID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgc2V0Q3VycmVudEV2ZW50cygocHJldkV2ZW50cykgPT4gWy4uLnByZXZFdmVudHMsIGV2ZW50XSlcbiAgfSwgW10pXG5cbiAgY29uc3QgZGVsZXRlUmVjdXJyaW5nRXZlbnQgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnRJZDogc3RyaW5nLCBkZWxldGVBbGw6IGJvb2xlYW4pID0+IHtcbiAgICAgIHNldEN1cnJlbnRFdmVudHMoKHByZXZFdmVudHMpID0+IHtcbiAgICAgICAgLy8gRmluZCB0aGUgZXZlbnQgYnkgSURcbiAgICAgICAgY29uc3QgZXZlbnQgPSBwcmV2RXZlbnRzLmZpbmQoKGUpID0+IGUuaWQgPT09IGV2ZW50SWQpXG4gICAgICAgIGlmICghZXZlbnQpIHJldHVybiBwcmV2RXZlbnRzXG5cbiAgICAgICAgaWYgKGV2ZW50LnBhcmVudEV2ZW50SWQgJiYgIWRlbGV0ZUFsbCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSByZWN1cnJpbmcgaW5zdGFuY2UsIGFuZCB3ZSBvbmx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgaW5zdGFuY2VcblxuICAgICAgICAgIC8vIEZpbmQgdGhlIHBhcmVudCBldmVudFxuICAgICAgICAgIGNvbnN0IHBhcmVudEV2ZW50ID0gcHJldkV2ZW50cy5maW5kKFxuICAgICAgICAgICAgKGUpID0+IGUuaWQgPT09IGV2ZW50LnBhcmVudEV2ZW50SWRcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKCFwYXJlbnRFdmVudCB8fCAhcGFyZW50RXZlbnQucmVjdXJyZW5jZSkgcmV0dXJuIHByZXZFdmVudHNcblxuICAgICAgICAgIC8vIEFkZCB0aGlzIGRhdGUgdG8gdGhlIGV4Y2VwdGlvbnMgbGlzdFxuICAgICAgICAgIHJldHVybiBwcmV2RXZlbnRzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuaWQgPT09IGV2ZW50LnBhcmVudEV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5lLFxuICAgICAgICAgICAgICAgIHJlY3VycmVuY2U6IHtcbiAgICAgICAgICAgICAgICAgIC4uLmUucmVjdXJyZW5jZSEsXG4gICAgICAgICAgICAgICAgICBleGNlcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgIC4uLihlLnJlY3VycmVuY2UhLmV4Y2VwdGlvbnMgfHwgW10pLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdGFydC5zdGFydE9mKCdkYXknKSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnBhcmVudEV2ZW50SWQgJiYgZGVsZXRlQWxsKSB7XG4gICAgICAgICAgLy8gV2Ugd2FudCB0byBkZWxldGUgYWxsIG9jY3VycmVuY2VzIG9mIHRoaXMgcmVjdXJyaW5nIGV2ZW50XG4gICAgICAgICAgLy8gRmluZCB0aGUgcGFyZW50IElEIGFuZCBkZWxldGUgaXQgYW5kIGFsbCBpdHMgY2hpbGRyZW5cbiAgICAgICAgICByZXR1cm4gcHJldkV2ZW50cy5maWx0ZXIoXG4gICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgZS5pZCAhPT0gZXZlbnQucGFyZW50RXZlbnRJZCAmJlxuICAgICAgICAgICAgICBlLnBhcmVudEV2ZW50SWQgIT09IGV2ZW50LnBhcmVudEV2ZW50SWRcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQucmVjdXJyZW5jZSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSBwYXJlbnQgcmVjdXJyaW5nIGV2ZW50LCBkZWxldGUgaXQgYW5kIGFsbCBpdHMgaW5zdGFuY2VzXG4gICAgICAgICAgcmV0dXJuIHByZXZFdmVudHMuZmlsdGVyKFxuICAgICAgICAgICAgKGUpID0+IGUuaWQgIT09IGV2ZW50LmlkICYmIGUucGFyZW50RXZlbnRJZCAhPT0gZXZlbnQuaWRcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVndWxhciBldmVudCwganVzdCBkZWxldGUgaXRcbiAgICAgICAgICByZXR1cm4gcHJldkV2ZW50cy5maWx0ZXIoKGUpID0+IGUuaWQgIT09IGV2ZW50LmlkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG4gICAgW11cbiAgKVxuXG4gIGNvbnN0IHVwZGF0ZVJlY3VycmluZ0V2ZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgZXZlbnRJZDogc3RyaW5nLFxuICAgICAgdXBkYXRlZEV2ZW50OiBQYXJ0aWFsPENhbGVuZGFyRXZlbnQ+LFxuICAgICAgdXBkYXRlQWxsOiBib29sZWFuXG4gICAgKSA9PiB7XG4gICAgICBzZXRDdXJyZW50RXZlbnRzKChwcmV2RXZlbnRzKSA9PiB7XG4gICAgICAgIC8vIEZpbmQgdGhlIGV2ZW50IGJ5IElEXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gcHJldkV2ZW50cy5maW5kKChlKSA9PiBlLmlkID09PSBldmVudElkKVxuICAgICAgICBpZiAoIWV2ZW50KSByZXR1cm4gcHJldkV2ZW50c1xuXG4gICAgICAgIGlmIChldmVudC5wYXJlbnRFdmVudElkICYmICF1cGRhdGVBbGwpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgcmVjdXJyaW5nIGluc3RhbmNlIGJlaW5nIHVwZGF0ZWQgaW5kaXZpZHVhbGx5XG5cbiAgICAgICAgICAvLyBDcmVhdGUgYW4gZXhjZXB0aW9uIHdpdGggdGhlIHVwZGF0ZXNcbiAgICAgICAgICBjb25zdCBleGNlcHRpb25FdmVudDogQ2FsZW5kYXJFdmVudCA9IHtcbiAgICAgICAgICAgIC4uLmV2ZW50LFxuICAgICAgICAgICAgLi4udXBkYXRlZEV2ZW50LFxuICAgICAgICAgICAgaXNFeGNlcHRpb246IHRydWUsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQWRkIHRoZSBleGNlcHRpb24gdG8gdGhlIHN0b3JlIGFuZCBhZGQgdGhpcyBkYXRlIHRvIHRoZSBwYXJlbnQncyBleGNlcHRpb25zIGxpc3RcbiAgICAgICAgICBjb25zdCB1cGRhdGVkRXZlbnRzID0gcHJldkV2ZW50cy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChlLmlkID09PSBldmVudC5wYXJlbnRFdmVudElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uZSxcbiAgICAgICAgICAgICAgICByZWN1cnJlbmNlOiB7XG4gICAgICAgICAgICAgICAgICAuLi5lLnJlY3VycmVuY2UhLFxuICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAuLi4oZS5yZWN1cnJlbmNlIS5leGNlcHRpb25zIHx8IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RhcnQuc3RhcnRPZignZGF5JyksXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJldHVybiBbLi4udXBkYXRlZEV2ZW50cywgZXhjZXB0aW9uRXZlbnRdXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQucGFyZW50RXZlbnRJZCAmJiB1cGRhdGVBbGwpIHtcbiAgICAgICAgICAvLyBVcGRhdGUgYWxsIG9jY3VycmVuY2VzIGJ5IHVwZGF0aW5nIHRoZSBwYXJlbnRcbiAgICAgICAgICAvLyBGaW5kIHRoZSBwYXJlbnQgYW5kIHVwZGF0ZSBpdFxuICAgICAgICAgIHJldHVybiBwcmV2RXZlbnRzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuaWQgPT09IGV2ZW50LnBhcmVudEV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uZSwgLi4udXBkYXRlZEV2ZW50IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5yZWN1cnJlbmNlKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIHBhcmVudCByZWN1cnJpbmcgZXZlbnQsIHVwZGF0ZSBpdCBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBwcmV2RXZlbnRzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuaWQgPT09IGV2ZW50LmlkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLmUsIC4uLnVwZGF0ZWRFdmVudCB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVndWxhciBldmVudCwganVzdCB1cGRhdGUgaXRcbiAgICAgICAgICByZXR1cm4gcHJldkV2ZW50cy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChlLmlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICByZXR1cm4geyAuLi5lLCAuLi51cGRhdGVkRXZlbnQgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG4gICAgW11cbiAgKVxuXG4gIGNvbnN0IGNyZWF0ZUV4Y2VwdGlvbkZvclJlY3VycmluZ0V2ZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50SWQ6IHN0cmluZywgZGF0ZTogZGF5anMuRGF5anMpID0+IHtcbiAgICAgIHNldEN1cnJlbnRFdmVudHMoKHByZXZFdmVudHMpID0+IHtcbiAgICAgICAgLy8gRmluZCB0aGUgZXZlbnQgZmlyc3RcbiAgICAgICAgY29uc3QgZXZlbnQgPSBwcmV2RXZlbnRzLmZpbmQoKGUpID0+IGUuaWQgPT09IGV2ZW50SWQpXG4gICAgICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LnJlY3VycmVuY2UpIHJldHVybiBwcmV2RXZlbnRzXG5cbiAgICAgICAgLy8gQWRkIHRoZSBkYXRlIHRvIGV4Y2VwdGlvbnNcbiAgICAgICAgcmV0dXJuIHByZXZFdmVudHMubWFwKChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUuaWQgPT09IGV2ZW50SWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmUsXG4gICAgICAgICAgICAgIHJlY3VycmVuY2U6IHtcbiAgICAgICAgICAgICAgICAuLi5lLnJlY3VycmVuY2UhLFxuICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgIC4uLihlLnJlY3VycmVuY2UhLmV4Y2VwdGlvbnMgfHwgW10pLFxuICAgICAgICAgICAgICAgICAgZGF0ZS5zdGFydE9mKCdkYXknKSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LFxuICAgIFtdXG4gIClcblxuICAvLyBDcmVhdGUgdGhlIGNvbnRleHQgdmFsdWVcbiAgY29uc3QgY29udGV4dFZhbHVlID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgY3VycmVudERhdGUsXG4gICAgICB2aWV3LFxuICAgICAgZXZlbnRzOiBjdXJyZW50RXZlbnRzLFxuICAgICAgY3VycmVudExvY2FsZSxcbiAgICAgIGlzRXZlbnRGb3JtT3BlbixcbiAgICAgIHNlbGVjdGVkRXZlbnQsXG4gICAgICBzZWxlY3RlZERhdGUsXG4gICAgICBmaXJzdERheU9mV2VlayxcbiAgICAgIHNldEN1cnJlbnREYXRlLFxuICAgICAgc2VsZWN0RGF0ZSxcbiAgICAgIHNldFZpZXc6IGhhbmRsZVZpZXdDaGFuZ2UsXG4gICAgICBuZXh0UGVyaW9kLFxuICAgICAgcHJldlBlcmlvZCxcbiAgICAgIHRvZGF5LFxuICAgICAgYWRkRXZlbnQsXG4gICAgICB1cGRhdGVFdmVudCxcbiAgICAgIGRlbGV0ZUV2ZW50LFxuICAgICAgb3BlbkV2ZW50Rm9ybTogKCkgPT4gc2V0SXNFdmVudEZvcm1PcGVuKHRydWUpLFxuICAgICAgY2xvc2VFdmVudEZvcm0sXG4gICAgICBnZXRFdmVudHNGb3JEYXRlLFxuICAgICAgZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlLFxuICAgICAgZXhwYW5kUmVjdXJyaW5nRXZlbnQsXG4gICAgICBhZGRSZWN1cnJpbmdFdmVudCxcbiAgICAgIGRlbGV0ZVJlY3VycmluZ0V2ZW50LFxuICAgICAgdXBkYXRlUmVjdXJyaW5nRXZlbnQsXG4gICAgICBjcmVhdGVFeGNlcHRpb25Gb3JSZWN1cnJpbmdFdmVudCxcbiAgICAgIHJlbmRlckV2ZW50LFxuICAgICAgb25FdmVudENsaWNrOiBoYW5kbGVFdmVudENsaWNrLFxuICAgICAgb25DZWxsQ2xpY2s6IGhhbmRsZURhdGVDbGljayxcbiAgICAgIGxvY2FsZSxcbiAgICAgIHRpbWV6b25lOiBjdXJyZW50VGltZXpvbmUsXG4gICAgICBkaXNhYmxlQ2VsbENsaWNrLFxuICAgICAgZGlzYWJsZUV2ZW50Q2xpY2ssXG4gICAgICBkaXNhYmxlRHJhZ0FuZERyb3AsXG4gICAgICBkYXlNYXhFdmVudHMsXG4gICAgICBzdGlja3lWaWV3SGVhZGVyLFxuICAgICAgdmlld0hlYWRlckNsYXNzTmFtZSxcbiAgICB9KSxcbiAgICBbXG4gICAgICBjdXJyZW50RGF0ZSxcbiAgICAgIHZpZXcsXG4gICAgICBjdXJyZW50RXZlbnRzLFxuICAgICAgY3VycmVudExvY2FsZSxcbiAgICAgIGlzRXZlbnRGb3JtT3BlbixcbiAgICAgIHNlbGVjdGVkRXZlbnQsXG4gICAgICBzZWxlY3RlZERhdGUsXG4gICAgICBmaXJzdERheU9mV2VlayxcbiAgICAgIHNlbGVjdERhdGUsXG4gICAgICBoYW5kbGVWaWV3Q2hhbmdlLFxuICAgICAgbmV4dFBlcmlvZCxcbiAgICAgIHByZXZQZXJpb2QsXG4gICAgICB0b2RheSxcbiAgICAgIGFkZEV2ZW50LFxuICAgICAgdXBkYXRlRXZlbnQsXG4gICAgICBkZWxldGVFdmVudCxcbiAgICAgIGNsb3NlRXZlbnRGb3JtLFxuICAgICAgZ2V0RXZlbnRzRm9yRGF0ZSxcbiAgICAgIGdldEV2ZW50c0ZvckRhdGVSYW5nZSxcbiAgICAgIGV4cGFuZFJlY3VycmluZ0V2ZW50LFxuICAgICAgYWRkUmVjdXJyaW5nRXZlbnQsXG4gICAgICBkZWxldGVSZWN1cnJpbmdFdmVudCxcbiAgICAgIHVwZGF0ZVJlY3VycmluZ0V2ZW50LFxuICAgICAgY3JlYXRlRXhjZXB0aW9uRm9yUmVjdXJyaW5nRXZlbnQsXG4gICAgICByZW5kZXJFdmVudCxcbiAgICAgIGhhbmRsZUV2ZW50Q2xpY2ssXG4gICAgICBoYW5kbGVEYXRlQ2xpY2ssXG4gICAgICBsb2NhbGUsXG4gICAgICBjdXJyZW50VGltZXpvbmUsXG4gICAgICBkaXNhYmxlQ2VsbENsaWNrLFxuICAgICAgZGlzYWJsZUV2ZW50Q2xpY2ssXG4gICAgICBkaXNhYmxlRHJhZ0FuZERyb3AsXG4gICAgICBkYXlNYXhFdmVudHMsXG4gICAgICBzdGlja3lWaWV3SGVhZGVyLFxuICAgICAgdmlld0hlYWRlckNsYXNzTmFtZSxcbiAgICBdXG4gIClcblxuICByZXR1cm4gKFxuICAgIDxDYWxlbmRhckNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NvbnRleHRWYWx1ZX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9DYWxlbmRhckNvbnRleHQuUHJvdmlkZXI+XG4gIClcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFDQSw0QkFBUyw0QkFBaUI7QUFDMUIsNEJBQWdCOzs7QUNBaEI7QUFtRE8sSUFBTSxrQkFBa0IsY0FDN0IsU0FDRjtBQUVPLElBQU0scUJBQXFCLE1BQU07QUFBQSxFQUN0QyxNQUFNLFVBQVUsV0FBVyxlQUFlO0FBQUEsRUFDMUMsSUFBSSxZQUFZLFdBQVc7QUFBQSxJQUN6QixNQUFNLElBQUksTUFBTSwyREFBMkQ7QUFBQSxFQUM3RTtBQUFBLEVBQ0EsT0FBTztBQUFBO0FBR0YsSUFBTSwyQkFBMkIsTUFBTTtBQUFBLEVBQzVDLE1BQU0sVUFBVSxXQUFXLGVBQWU7QUFBQSxFQUMxQyxJQUFJLFlBQVksV0FBVztBQUFBLElBQ3pCLE1BQU0sSUFB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QUFBQSxJQUFLLFdBQVU7QUFBQSxJQUFmLFVBOEJFO0FBQUEsc0JBN0JBLE1BQUMscUJBQUQsRUFBUTtBQUFBLHNCQUdSLE1BYUUsb0JBYkY7QUFBQSxrQ0FDRSxNQVdFLGtCQVhGO0FBQUEsVUFBaUIsTUFBSztBQUFBLFVBQXRCLDBCQUNFLE1BU0UsUUFBTyxLQVRUO0FBQUEsWUFFRSxTQUFTLEVBQUUsU0FBUyxHQUFHLEdBQUcsR0FBRztBQUFBLFlBQzdCLFNBQVMsRUFBRSxTQUFTLEdBQUcsR0FBRyxFQUFFO0FBQUEsWUFDNUIsTUFBTSxFQUFFLFNBQVMsR0FBRyxHQUFHLElBQUk7QUFBQSxZQUMzQixZQUFZLEVBQUUsVUFBVSxLQUFLLE1BQU0sWUFBWTtBQUFBLFlBQy9DLFdBQVU7QUFBQSxZQU5aLFVBUUcsUUFBUTtBQUFBLGFBUEosSUFRTDtBQUFBLFNBQ0Y7QUFBQSxPQUNGO0FBQUEsTUFHRCxtQ0FDQyxNQUFDLFdBQUQ7QUFBQSxRQUNFLFNBQVM7QUFBQSxRQUNUO0FBQUEsUUFDQTtBQUFBLFFBQ0EsT0FBTztBQUFBLFFBQ1AsVUFBVTtBQUFBLFFBQ1YsVUFBVTtBQUFBLE9BQ1o7QUFBQTtBQUFBLEdBRUY7QUFBQTtBQXFCTixJQUFNLGVBQXVDO0FBQUEsRUFDM0MsUUFBUTtBQUFBLEVBQ1IsUUFBUTtBQUFBLEVBQ1IsU0FBUztBQUFBLEVBQ1QsV0FBVztBQUFBLEVBQ1gsVUFBVTtBQUFBLEVBQ1YsUUFBUTtBQUFBLEVBQ1IsVUFBVTtBQUNaO0FBRUEsSUFBTSx5QkFBeUI7QUFDeEIsSUFBTSxnQkFBeUM7QUFBQSxFQUNwRDtBQUFBLEVBQ0EsaUJBQWlCO0FBQUEsRUFDakI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsZUFBZTtBQUFBLEVBQ2YsbUJBQW1CO0FBQUEsRUFDbkIsc0JBQXNCO0FBQUEsTUFDbEI7QUFBQSxFQUNKLHVCQUNFLE1BaUJFLGtCQWpCRjtBQUFBLElBQ0U7QUFBQSxJQUNBLGdCQUFnQixhQUFhO0FBQUEsSUFDN0I7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQSxVQUFVO0FBQUEsSUFDVjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFkRiwwQkFnQkUsTUFBQyxpQkFBRCxFQUFpQjtBQUFBLEdBQ2pCO0FBQUE7IiwKICAiZGVidWdJZCI6ICJCRTgzOEEyQzdFRUU3MTIwNjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
|
|
3560
|
+
//# debugId=E1A98CE4E1EA9C1064756E2164756E21
|
|
3561
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2ZlYXR1cmVzL21vbnRoLXZpZXcvY29tcG9uZW50cy9tb250aC12aWV3LnRzeCIsICIuLi9zcmMvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0LnRzIiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL2FjY29yZGlvbi50c3giLCAiLi4vc3JjL2xpYi91dGlscy50cyIsICIuLi9zcmMvbGliL2RheWpzLWNvbmZpZy50cyIsICIuLi9zcmMvY29tcG9uZW50cy91aS9hbGVydC50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvYmFkZ2UudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL2J1dHRvbi50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvY2FsZW5kYXIudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL2NoZWNrYm94LnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy91aS9kYXRlLXBpY2tlci50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvcG9wb3Zlci50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvZGlhbG9nLnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy91aS9kcm9wZG93bi1tZW51LnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy91aS9mb3JtLnRzeCIsICIuLi9ub2RlX21vZHVsZXMvcmVhY3QtaG9vay1mb3JtL2Rpc3QvaW5kZXguZXNtLm1qcyIsICIuLi9zcmMvY29tcG9uZW50cy91aS9sYWJlbC50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvaW5wdXQudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL3Njcm9sbC1hcmVhLnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy91aS9zZWxlY3QudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL3NlcGFyYXRvci50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvdWkvc2hlZXQudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL3RhYnMudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL3VpL3Rvb2x0aXAudHN4IiwgIi4uL3NyYy9mZWF0dXJlcy9tb250aC12aWV3L2NvbXBvbmVudHMvYWxsLWV2ZW50cy1kaWFsb2cudHN4IiwgIi4uL3NyYy9mZWF0dXJlcy9kcmFnZ2FibGUtZXZlbnQvZHJhZ2dhYmxlLWV2ZW50LnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvbW9udGgtdmlldy9jb21wb25lbnRzL2RheS1jZWxsLnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvZHJvcHBhYmxlLWNlbGwvZHJvcHBhYmxlLWNlbGwudHN4IiwgIi4uL3NyYy9mZWF0dXJlcy9tb250aC12aWV3L2NvbXBvbmVudHMvbW9udGgtaGVhZGVyLnRzeCIsICIuLi9zcmMvbGliL2NvbnN0YW50cy50cyIsICIuLi9zcmMvZmVhdHVyZXMvbW9udGgtdmlldy9jb21wb25lbnRzL3dlZWstZXZlbnRzLWxheWVyLnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvd2Vlay12aWV3L3dlZWstdmlldy50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL3dlZWstdmlldy93ZWVrLWFsbC1kYXktcm93LnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvd2Vlay12aWV3L3dlZWstaGVhZGVyLnRzeCIsICIuLi9zcmMvaG9va3MvdXNlUHJvY2Vzc2VkRGF5RXZlbnRzLnRzIiwgIi4uL3NyYy9mZWF0dXJlcy9kYXktdmlldy9kYXktZXZlbnRzLWxheWVyLnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvd2Vlay12aWV3L3dlZWstZGF5LWNvbC50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL3dlZWstdmlldy93ZWVrLXRpbWUtZ3JpZC50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL2RheS12aWV3L2RheS12aWV3LnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvZGF5LXZpZXcvZGF5LWFsbC1kYXktcm93LnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvZGF5LXZpZXcvZGF5LWhlYWRlci50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL2RheS12aWV3L2RheS10aW1lLWNvbC50c3giLCAiLi4vc3JjL2NvbXBvbmVudHMvZXZlbnQtZm9ybS9ldmVudC1mb3JtLnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy9oZWFkZXIvYmFzZS1oZWFkZXIudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL2hlYWRlci90aXRsZS1jb250ZW50LnRzeCIsICIuLi9zcmMvY29tcG9uZW50cy9oZWFkZXIvdmlldy1jb250cm9scy50c3giLCAiLi4vc3JjL2ZlYXR1cmVzL3llYXItdmlldy95ZWFyLXZpZXcudHN4IiwgIi4uL3NyYy9jb21wb25lbnRzL2lsYW15LWNhbGVuZGFyL2lsYW15LWNhbGVuZGFyLnRzeCIsICIuLi9zcmMvZmVhdHVyZXMvZHJhZy1hbmQtZHJvcC9jYWxlbmRhci1kbmQtY29udGV4dC50c3giLCAiLi4vc3JjL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvcHJvdmlkZXIudHN4Il0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB0eXBlIGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IEFuaW1hdGVQcmVzZW5jZSwgbW90aW9uIH0gZnJvbSAnbW90aW9uL3JlYWN0J1xuaW1wb3J0IFJlYWN0LCB7IHVzZU1lbW8gfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgQWxsRXZlbnREaWFsb2cgfSBmcm9tICcuL2FsbC1ldmVudHMtZGlhbG9nJ1xuaW1wb3J0IHsgRGF5Q2VsbCB9IGZyb20gJy4vZGF5LWNlbGwnXG5pbXBvcnQgdHlwZSB7IE1vbnRoVmlld1Byb3BzLCBTZWxlY3RlZERheUV2ZW50cyB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHsgTW9udGhIZWFkZXIgfSBmcm9tICcuL21vbnRoLWhlYWRlcidcbmltcG9ydCB7IFdlZWtFdmVudHNMYXllciB9IGZyb20gJy4vd2Vlay1ldmVudHMtbGF5ZXInXG5cbmV4cG9ydCBjb25zdCBNb250aFZpZXc6IFJlYWN0LkZDPE1vbnRoVmlld1Byb3BzPiA9ICh7IGRheU1heEV2ZW50cyA9IDMgfSkgPT4ge1xuICBjb25zdCBhbGxFdmVudHNEaWFsb2dSZWYgPSBSZWFjdC51c2VSZWY8e1xuICAgIG9wZW46ICgpID0+IHZvaWRcbiAgICBjbG9zZTogKCkgPT4gdm9pZFxuICAgIHNldFNlbGVjdGVkRGF5RXZlbnRzOiAoZGF5RXZlbnRzOiBTZWxlY3RlZERheUV2ZW50cykgPT4gdm9pZFxuICB9PihudWxsKVxuICBjb25zdCB7IGN1cnJlbnREYXRlLCBmaXJzdERheU9mV2VlayB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICAvLyBHZXQgc3RhcnQgZGF0ZSBmb3IgdGhlIGN1cnJlbnQgbW9udGggdmlldyBiYXNlZCBvbiBmaXJzdERheU9mV2Vla1xuICBjb25zdCBmaXJzdERheU9mTW9udGggPSBjdXJyZW50RGF0ZS5zdGFydE9mKCdtb250aCcpXG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBmaXJzdCBkYXkgb2YgdGhlIGNhbGVuZGFyIGdyaWQgY29ycmVjdGx5XG4gIC8vIEZpbmQgdGhlIGZpcnN0IGRheSBvZiB3ZWVrIChlLmcuIFN1bmRheSBvciBNb25kYXkpIHRoYXQgY29tZXMgYmVmb3JlIG9yIG9uIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoXG4gIGxldCBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhciA9IGZpcnN0RGF5T2ZNb250aC5jbG9uZSgpXG4gIHdoaWxlIChhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhci5kYXkoKSAhPT0gZmlyc3REYXlPZldlZWspIHtcbiAgICBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhciA9IGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyLnN1YnRyYWN0KDEsICdkYXknKVxuICB9XG5cbiAgLy8gQWx3YXlzIGdlbmVyYXRlIDYgd2Vla3MgKDQyIGRheXMpIHJlZ2FyZGxlc3Mgb2YgdGhlIG1vbnRoIGxlbmd0aFxuICAvLyBUaGlzIGVuc3VyZXMgd2UgYWx3YXlzIGhhdmUgNiByb3dzIG9mIGRheXNcbiAgY29uc3QgY2FsZW5kYXJEYXlzID0gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gNiB3ZWVrcyDDlyA3IGRheXMgPSA0MiBkYXlzXG4gICAgY29uc3QgZGF5czogZGF5anMuRGF5anNbXVtdID0gW1tdXVxuICAgIGxldCBkYXkgPSBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhci5jbG9uZSgpIC8vIENsb25lIHRvIGF2b2lkIG11dGF0aW9uXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0MjsgaSsrKSB7XG4gICAgICBpZiAoZGF5c1tkYXlzLmxlbmd0aCAtIDFdLmxlbmd0aCA9PT0gNykge1xuICAgICAgICBkYXlzLnB1c2goW10pIC8vIFN0YXJ0IGEgbmV3IHdlZWtcbiAgICAgIH1cbiAgICAgIGRheXNbZGF5cy5sZW5ndGggLSAxXS5wdXNoKGRheSlcbiAgICAgIGRheSA9IGRheS5hZGQoMSwgJ2RheScpIC8vIE1vdmUgdG8gdGhlIG5leHQgZGF5XG4gICAgfVxuICAgIHJldHVybiBkYXlzXG4gIH0sIFthZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhcl0pXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaC1mdWxsIGZsZXgtY29sXCIgZGF0YS10ZXN0aWQ9XCJtb250aC12aWV3XCI+XG4gICAgICB7LyogV2VlayBkYXlzIGhlYWRlciAqL31cbiAgICAgIDxNb250aEhlYWRlciAvPlxuXG4gICAgICB7LyogQ2FsZW5kYXIgZ3JpZCAtIGFkZGVkIGZpeGVkIGhlaWdodCAqL31cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3NOYW1lPVwiZmxleC0xIG92ZXJmbG93LWF1dG8gaC1mdWxsXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJtb250aC1zY3JvbGwtYXJlYVwiXG4gICAgICA+XG4gICAgICAgIDxBbmltYXRlUHJlc2VuY2UgbW9kZT1cIndhaXRcIj5cbiAgICAgICAgICA8bW90aW9uLmRpdlxuICAgICAgICAgICAga2V5PXtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICAgIGluaXRpYWw9e3sgb3BhY2l0eTogMCB9fVxuICAgICAgICAgICAgYW5pbWF0ZT17eyBvcGFjaXR5OiAxIH19XG4gICAgICAgICAgICBleGl0PXt7IG9wYWNpdHk6IDAgfX1cbiAgICAgICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuMjUsIGVhc2U6ICdlYXNlSW5PdXQnIH19XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBncmlkIGgtZnVsbCBncmlkLWNvbHMtNyBncmlkLXJvd3MtNiBvdmVyZmxvdy1hdXRvXCJcbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwibW9udGgtY2FsZW5kYXItZ3JpZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgey8qIERheSBjZWxscyAqL31cbiAgICAgICAgICAgIHtjYWxlbmRhckRheXMubWFwKChkYXlzLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgIGtleT17YHdlZWstJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgY29sLXNwYW4tNyBncmlkIGdyaWQtY29scy03XCJcbiAgICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgd2Vlay1yb3ctJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtkYXlzLm1hcCgoZGF5LCBkYXlJbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxEYXlDZWxsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleD17ZGF5SW5kZXh9XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXk9e2RheX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGRheU1heEV2ZW50cz17ZGF5TWF4RXZlbnRzfVxuICAgICAgICAgICAgICAgICAgICAgICAga2V5PXtkYXkuZm9ybWF0KCdZWVlZLU1NLUREJyl9XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJib3JkZXItciBib3JkZXItYiBmaXJzdDpib3JkZXItbFwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgfSl9XG5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiYWJzb2x1dGUgaW5zZXQtMCB6LTEwIHBvaW50ZXItZXZlbnRzLW5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPFdlZWtFdmVudHNMYXllciBkYXlzPXtkYXlzfSAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICAgIDwvbW90aW9uLmRpdj5cbiAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICA8L2Rpdj5cblxuICAgICAgey8qIERpYWxvZyBmb3Igc2hvd2luZyBhbGwgZXZlbnRzICovfVxuICAgICAgPEFsbEV2ZW50RGlhbG9nIHJlZj17YWxsRXZlbnRzRGlhbG9nUmVmfSAvPlxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcbmltcG9ydCB0eXBlIGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IGNyZWF0ZUNvbnRleHQsIHVzZUNvbnRleHQgfSBmcm9tICdyZWFjdCdcblxuZXhwb3J0IGludGVyZmFjZSBDYWxlbmRhckNvbnRleHRUeXBlIHtcbiAgY3VycmVudERhdGU6IGRheWpzLkRheWpzXG4gIHZpZXc6ICdtb250aCcgfCAnd2VlaycgfCAnZGF5JyB8ICd5ZWFyJ1xuICBldmVudHM6IENhbGVuZGFyRXZlbnRbXVxuICBpc0V2ZW50Rm9ybU9wZW46IGJvb2xlYW5cbiAgc2VsZWN0ZWRFdmVudDogQ2FsZW5kYXJFdmVudCB8IG51bGxcbiAgc2VsZWN0ZWREYXRlOiBkYXlqcy5EYXlqcyB8IG51bGxcbiAgZmlyc3REYXlPZldlZWs6IG51bWJlciAvLyAwIGZvciBTdW5kYXksIDEgZm9yIE1vbmRheSwgZXRjLlxuICBzZXRDdXJyZW50RGF0ZTogKGRhdGU6IGRheWpzLkRheWpzKSA9PiB2b2lkXG4gIHNlbGVjdERhdGU6IChkYXRlOiBkYXlqcy5EYXlqcykgPT4gdm9pZFxuICBzZXRWaWV3OiAodmlldzogJ21vbnRoJyB8ICd3ZWVrJyB8ICdkYXknIHwgJ3llYXInKSA9PiB2b2lkXG4gIG5leHRQZXJpb2Q6ICgpID0+IHZvaWRcbiAgcHJldlBlcmlvZDogKCkgPT4gdm9pZFxuICB0b2RheTogKCkgPT4gdm9pZFxuICBhZGRFdmVudDogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB2b2lkXG4gIHVwZGF0ZUV2ZW50OiAoZXZlbnRJZDogc3RyaW5nIHwgbnVtYmVyLCBldmVudDogUGFydGlhbDxDYWxlbmRhckV2ZW50PikgPT4gdm9pZFxuICBkZWxldGVFdmVudDogKGV2ZW50SWQ6IHN0cmluZyB8IG51bWJlcikgPT4gdm9pZFxuICBvcGVuRXZlbnRGb3JtOiAoZGF0ZT86IGRheWpzLkRheWpzLCBldmVudD86IENhbGVuZGFyRXZlbnQpID0+IHZvaWRcbiAgY2xvc2VFdmVudEZvcm06ICgpID0+IHZvaWRcbiAgZ2V0RXZlbnRzRm9yRGF0ZTogKGRhdGU6IGRheWpzLkRheWpzKSA9PiBDYWxlbmRhckV2ZW50W11cbiAgZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlOiAoXG4gICAgc3RhcnQ6IGRheWpzLkRheWpzLFxuICAgIGVuZDogZGF5anMuRGF5anNcbiAgKSA9PiBDYWxlbmRhckV2ZW50W11cbiAgZXhwYW5kUmVjdXJyaW5nRXZlbnQ6IChcbiAgICBiYXNlRXZlbnQ6IENhbGVuZGFyRXZlbnQsXG4gICAgc3RhcnREYXRlOiBkYXlqcy5EYXlqcyxcbiAgICBlbmREYXRlOiBkYXlqcy5EYXlqc1xuICApID0+IENhbGVuZGFyRXZlbnRbXVxuICBhZGRSZWN1cnJpbmdFdmVudDogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB2b2lkXG4gIGRlbGV0ZVJlY3VycmluZ0V2ZW50OiAoZXZlbnRJZDogc3RyaW5nLCBkZWxldGVBbGw6IGJvb2xlYW4pID0+IHZvaWRcbiAgdXBkYXRlUmVjdXJyaW5nRXZlbnQ6IChcbiAgICBldmVudElkOiBzdHJpbmcsXG4gICAgdXBkYXRlZEV2ZW50OiBQYXJ0aWFsPENhbGVuZGFyRXZlbnQ+LFxuICAgIHVwZGF0ZUFsbDogYm9vbGVhblxuICApID0+IHZvaWRcbiAgY3JlYXRlRXhjZXB0aW9uRm9yUmVjdXJyaW5nRXZlbnQ6IChldmVudElkOiBzdHJpbmcsIGRhdGU6IGRheWpzLkRheWpzKSA9PiB2b2lkXG4gIHJlbmRlckV2ZW50PzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiBSZWFjdC5SZWFjdE5vZGVcbiAgb25FdmVudENsaWNrOiAoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHZvaWRcbiAgb25DZWxsQ2xpY2s6IChzdGFydERhdGU6IGRheWpzLkRheWpzLCBlbmREYXRlOiBkYXlqcy5EYXlqcykgPT4gdm9pZFxuICBjdXJyZW50TG9jYWxlPzogc3RyaW5nXG4gIGRpc2FibGVDZWxsQ2xpY2s/OiBib29sZWFuXG4gIGRpc2FibGVFdmVudENsaWNrPzogYm9vbGVhblxuICBkaXNhYmxlRHJhZ0FuZERyb3A/OiBib29sZWFuXG4gIGRheU1heEV2ZW50czogbnVtYmVyXG4gIHN0aWNreVZpZXdIZWFkZXI6IGJvb2xlYW5cbiAgdmlld0hlYWRlckNsYXNzTmFtZTogc3RyaW5nXG4gIGhlYWRlckNvbXBvbmVudD86IFJlYWN0LlJlYWN0Tm9kZSAvLyBPcHRpb25hbCBjdXN0b20gaGVhZGVyIGNvbXBvbmVudFxufVxuXG5leHBvcnQgY29uc3QgQ2FsZW5kYXJDb250ZXh0ID0gY3JlYXRlQ29udGV4dDxDYWxlbmRhckNvbnRleHRUeXBlIHwgdW5kZWZpbmVkPihcbiAgdW5kZWZpbmVkXG4pXG5cbmV4cG9ydCBjb25zdCB1c2VDYWxlbmRhckNvbnRleHQgPSAoKSA9PiB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KENhbGVuZGFyQ29udGV4dClcbiAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlQ2FsZW5kYXJDb250ZXh0IG11c3QgYmUgdXNlZCB3aXRoaW4gYSBDYWxlbmRhclByb3ZpZGVyJylcbiAgfVxuICByZXR1cm4gY29udGV4dFxufVxuXG5leHBvcnQgY29uc3QgdXNlUHVibGljQ2FsZW5kYXJDb250ZXh0ID0gKCkgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChDYWxlbmRhckNvbnRleHQpXG4gIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZUNhbGVuZGFyQ29udGV4dCBtdXN0IGJlIHVzZWQgd2l0aGluIGlsYW15IGNhbGVuZGFyJylcbiAgfVxuICByZXR1cm4ge1xuICAgIGN1cnJlbnREYXRlOiBjb250ZXh0LmN1cnJlbnREYXRlLFxuICAgIHZpZXc6IGNvbnRleHQudmlldyxcbiAgICBldmVudHM6IGNvbnRleHQuZXZlbnRzLFxuICAgIGlzRXZlbnRGb3JtT3BlbjogY29udGV4dC5pc0V2ZW50Rm9ybU9wZW4sXG4gICAgc2VsZWN0ZWRFdmVudDogY29udGV4dC5zZWxlY3RlZEV2ZW50LFxuICAgIHNlbGVjdGVkRGF0ZTogY29udGV4dC5zZWxlY3RlZERhdGUsXG4gICAgZmlyc3REYXlPZldlZWs6IGNvbnRleHQuZmlyc3REYXlPZldlZWssXG4gICAgc2V0Q3VycmVudERhdGU6IGNvbnRleHQuc2V0Q3VycmVudERhdGUsXG4gICAgc2VsZWN0RGF0ZTogY29udGV4dC5zZWxlY3REYXRlLFxuICAgIHNldFZpZXc6IGNvbnRleHQuc2V0VmlldyxcbiAgICBuZXh0UGVyaW9kOiBjb250ZXh0Lm5leHRQZXJpb2QsXG4gICAgcHJldlBlcmlvZDogY29udGV4dC5wcmV2UGVyaW9kLFxuICAgIHRvZGF5OiBjb250ZXh0LnRvZGF5LFxuICAgIGFkZEV2ZW50OiBjb250ZXh0LmFkZEV2ZW50LFxuICAgIHVwZGF0ZUV2ZW50OiBjb250ZXh0LnVwZGF0ZUV2ZW50LFxuICAgIGRlbGV0ZUV2ZW50OiBjb250ZXh0LmRlbGV0ZUV2ZW50LFxuICAgIG9wZW5FdmVudEZvcm06IGNvbnRleHQub3BlbkV2ZW50Rm9ybSxcbiAgICBjbG9zZUV2ZW50Rm9ybTogY29udGV4dC5jbG9zZUV2ZW50Rm9ybSxcbiAgfVxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIEFjY29yZGlvblByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtYWNjb3JkaW9uJ1xuaW1wb3J0IHsgQ2hldnJvbkRvd25JY29uIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5mdW5jdGlvbiBBY2NvcmRpb24oe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIEFjY29yZGlvblByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gPEFjY29yZGlvblByaW1pdGl2ZS5Sb290IGRhdGEtc2xvdD1cImFjY29yZGlvblwiIHsuLi5wcm9wc30gLz5cbn1cblxuZnVuY3Rpb24gQWNjb3JkaW9uSXRlbSh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBBY2NvcmRpb25QcmltaXRpdmUuSXRlbT4pIHtcbiAgcmV0dXJuIChcbiAgICA8QWNjb3JkaW9uUHJpbWl0aXZlLkl0ZW1cbiAgICAgIGRhdGEtc2xvdD1cImFjY29yZGlvbi1pdGVtXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ2JvcmRlci1iIGxhc3Q6Ym9yZGVyLWItMCcsIGNsYXNzTmFtZSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBBY2NvcmRpb25UcmlnZ2VyKHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBBY2NvcmRpb25QcmltaXRpdmUuVHJpZ2dlcj4pIHtcbiAgcmV0dXJuIChcbiAgICA8QWNjb3JkaW9uUHJpbWl0aXZlLkhlYWRlciBjbGFzc05hbWU9XCJmbGV4XCI+XG4gICAgICA8QWNjb3JkaW9uUHJpbWl0aXZlLlRyaWdnZXJcbiAgICAgICAgZGF0YS1zbG90PVwiYWNjb3JkaW9uLXRyaWdnZXJcIlxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGZsZXggZmxleC0xIGl0ZW1zLXN0YXJ0IGp1c3RpZnktYmV0d2VlbiBnYXAtNCByb3VuZGVkLW1kIHB5LTQgdGV4dC1sZWZ0IHRleHQtc20gZm9udC1tZWRpdW0gdHJhbnNpdGlvbi1hbGwgb3V0bGluZS1ub25lIGhvdmVyOnVuZGVybGluZSBmb2N1cy12aXNpYmxlOnJpbmctWzNweF0gZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBkaXNhYmxlZDpvcGFjaXR5LTUwIFsmW2RhdGEtc3RhdGU9b3Blbl0+c3ZnXTpyb3RhdGUtMTgwJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgPlxuICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDxDaGV2cm9uRG93bkljb24gY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHBvaW50ZXItZXZlbnRzLW5vbmUgc2l6ZS00IHNocmluay0wIHRyYW5zbGF0ZS15LTAuNSB0cmFuc2l0aW9uLXRyYW5zZm9ybSBkdXJhdGlvbi0yMDBcIiAvPlxuICAgICAgPC9BY2NvcmRpb25QcmltaXRpdmUuVHJpZ2dlcj5cbiAgICA8L0FjY29yZGlvblByaW1pdGl2ZS5IZWFkZXI+XG4gIClcbn1cblxuZnVuY3Rpb24gQWNjb3JkaW9uQ29udGVudCh7XG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgQWNjb3JkaW9uUHJpbWl0aXZlLkNvbnRlbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPEFjY29yZGlvblByaW1pdGl2ZS5Db250ZW50XG4gICAgICBkYXRhLXNsb3Q9XCJhY2NvcmRpb24tY29udGVudFwiXG4gICAgICBjbGFzc05hbWU9XCJkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtYWNjb3JkaW9uLXVwIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtYWNjb3JkaW9uLWRvd24gb3ZlcmZsb3ctY2xpcCB0ZXh0LXNtXCJcbiAgICAgIHsuLi5wcm9wc31cbiAgICA+XG4gICAgICA8ZGl2IGNsYXNzTmFtZT17Y24oJ3B0LTAgcGItNCcsIGNsYXNzTmFtZSl9PntjaGlsZHJlbn08L2Rpdj5cbiAgICA8L0FjY29yZGlvblByaW1pdGl2ZS5Db250ZW50PlxuICApXG59XG5cbmV4cG9ydCB7IEFjY29yZGlvbiwgQWNjb3JkaW9uSXRlbSwgQWNjb3JkaW9uVHJpZ2dlciwgQWNjb3JkaW9uQ29udGVudCB9XG4iLAogICAgImltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cydcbmltcG9ydCB7IHR5cGUgQ2xhc3NWYWx1ZSwgY2xzeCB9IGZyb20gJ2Nsc3gnXG5pbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IHsgdHdNZXJnZSB9IGZyb20gJ3RhaWx3aW5kLW1lcmdlJ1xuXG5leHBvcnQgZnVuY3Rpb24gY24oLi4uaW5wdXRzOiBDbGFzc1ZhbHVlW10pIHtcbiAgcmV0dXJuIHR3TWVyZ2UoY2xzeChpbnB1dHMpKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVNb2NrRXZlbnRzKHsgY291bnQgPSA1IH0gPSB7fSkge1xuICBjb25zdCBldmVudHM6IENhbGVuZGFyRXZlbnRbXSA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY291bnQ7IGkrKykge1xuICAgIGV2ZW50cy5wdXNoKHtcbiAgICAgIGlkOiBpLnRvU3RyaW5nKCksXG4gICAgICB0aXRsZTogYE1vY2sgRXZlbnQgJHtpICsgMX1gLFxuICAgICAgc3RhcnQ6IGRheWpzKCkuYWRkKGksICdkYXknKS5zdGFydE9mKCdkYXknKSxcbiAgICAgIGVuZDogZGF5anMoKS5hZGQoaSwgJ2RheScpLmVuZE9mKCdkYXknKSxcbiAgICAgIGNvbG9yOiAnYmctZ3JheS0xMDAgdGV4dC1ncmF5LTgwMCcsXG4gICAgfSlcbiAgfVxuICByZXR1cm4gZXZlbnRzXG59XG4iLAogICAgImltcG9ydCBkYXlqcyBmcm9tICdkYXlqcydcbmltcG9ydCB3ZWVrZGF5IGZyb20gJ2RheWpzL3BsdWdpbi93ZWVrZGF5LmpzJ1xuaW1wb3J0IHdlZWtPZlllYXIgZnJvbSAnZGF5anMvcGx1Z2luL3dlZWtPZlllYXIuanMnXG5pbXBvcnQgaXNTYW1lT3JBZnRlciBmcm9tICdkYXlqcy9wbHVnaW4vaXNTYW1lT3JBZnRlci5qcydcbmltcG9ydCBpc1NhbWVPckJlZm9yZSBmcm9tICdkYXlqcy9wbHVnaW4vaXNTYW1lT3JCZWZvcmUuanMnXG5pbXBvcnQgaXNCZXR3ZWVuIGZyb20gJ2RheWpzL3BsdWdpbi9pc0JldHdlZW4uanMnXG5pbXBvcnQgbWluTWF4IGZyb20gJ2RheWpzL3BsdWdpbi9taW5NYXguanMnXG5pbXBvcnQgdGltZXpvbmUgZnJvbSAnZGF5anMvcGx1Z2luL3RpbWV6b25lLmpzJ1xuaW1wb3J0IHV0YyBmcm9tICdkYXlqcy9wbHVnaW4vdXRjLmpzJ1xuaW1wb3J0IGxvY2FsZURhdGEgZnJvbSAnZGF5anMvcGx1Z2luL2xvY2FsZURhdGEuanMnXG5cbi8vIEV4dGVuZCBkYXlqcyB3aXRoIHBsdWdpbnNcbmRheWpzLmV4dGVuZCh3ZWVrZGF5KVxuZGF5anMuZXh0ZW5kKHdlZWtPZlllYXIpXG5kYXlqcy5leHRlbmQoaXNTYW1lT3JBZnRlcilcbmRheWpzLmV4dGVuZChpc1NhbWVPckJlZm9yZSlcbmRheWpzLmV4dGVuZChpc0JldHdlZW4pXG5kYXlqcy5leHRlbmQobWluTWF4KVxuZGF5anMuZXh0ZW5kKHRpbWV6b25lKVxuZGF5anMuZXh0ZW5kKHV0YylcbmRheWpzLmV4dGVuZChsb2NhbGVEYXRhKVxuXG4vLyBJbXBvcnQgYWxsIGRheWpzIGxvY2FsZXMgYWxwaGFiZXRpY2FsbHlcbi8vIGxvY2FsZS5qc29uIGZpbGU6IFt7XCJrZXlcIjpcImFmXCIsXCJuYW1lXCI6XCJBZnJpa2FhbnNcIn0se1wia2V5XCI6XCJhbVwiLFwibmFtZVwiOlwiQW1oYXJpY1wifSx7XCJrZXlcIjpcImFyLWR6XCIsXCJuYW1lXCI6XCJBcmFiaWMgKEFsZ2VyaWEpXCJ9LHtcImtleVwiOlwiYXItaXFcIixcIm5hbWVcIjpcIiBBcmFiaWMgKElyYXEpXCJ9LHtcImtleVwiOlwiYXIta3dcIixcIm5hbWVcIjpcIkFyYWJpYyAoS3V3YWl0KVwifSx7XCJrZXlcIjpcImFyLWx5XCIsXCJuYW1lXCI6XCJBcmFiaWMgKEx5YmlhKVwifSx7XCJrZXlcIjpcImFyLW1hXCIsXCJuYW1lXCI6XCJBcmFiaWMgKE1vcm9jY28pXCJ9LHtcImtleVwiOlwiYXItc2FcIixcIm5hbWVcIjpcIkFyYWJpYyAoU2F1ZGkgQXJhYmlhKVwifSx7XCJrZXlcIjpcImFyLXRuXCIsXCJuYW1lXCI6XCIgQXJhYmljIChUdW5pc2lhKVwifSx7XCJrZXlcIjpcImFyXCIsXCJuYW1lXCI6XCJBcmFiaWNcIn0se1wia2V5XCI6XCJhelwiLFwibmFtZVwiOlwiQXplcmJhaWphbmlcIn0se1wia2V5XCI6XCJiZVwiLFwibmFtZVwiOlwiQmVsYXJ1c2lhblwifSx7XCJrZXlcIjpcImJnXCIsXCJuYW1lXCI6XCJCdWxnYXJpYW5cIn0se1wia2V5XCI6XCJiaVwiLFwibmFtZVwiOlwiQmlzbGFtYVwifSx7XCJrZXlcIjpcImJtXCIsXCJuYW1lXCI6XCJCYW1iYXJhXCJ9LHtcImtleVwiOlwiYm4tYmRcIixcIm5hbWVcIjpcIkJlbmdhbGkgKEJhbmdsYWRlc2gpXCJ9LHtcImtleVwiOlwiYm5cIixcIm5hbWVcIjpcIkJlbmdhbGlcIn0se1wia2V5XCI6XCJib1wiLFwibmFtZVwiOlwiVGliZXRhblwifSx7XCJrZXlcIjpcImJyXCIsXCJuYW1lXCI6XCJCcmV0b25cIn0se1wia2V5XCI6XCJic1wiLFwibmFtZVwiOlwiQm9zbmlhblwifSx7XCJrZXlcIjpcImNhXCIsXCJuYW1lXCI6XCJDYXRhbGFuXCJ9LHtcImtleVwiOlwiY3NcIixcIm5hbWVcIjpcIkN6ZWNoXCJ9LHtcImtleVwiOlwiY3ZcIixcIm5hbWVcIjpcIkNodXZhc2hcIn0se1wia2V5XCI6XCJjeVwiLFwibmFtZVwiOlwiV2Vsc2hcIn0se1wia2V5XCI6XCJkZS1hdFwiLFwibmFtZVwiOlwiR2VybWFuIChBdXN0cmlhKVwifSx7XCJrZXlcIjpcImRhXCIsXCJuYW1lXCI6XCJEYW5pc2hcIn0se1wia2V5XCI6XCJkZS1jaFwiLFwibmFtZVwiOlwiR2VybWFuIChTd2l0emVybGFuZClcIn0se1wia2V5XCI6XCJkZVwiLFwibmFtZVwiOlwiR2VybWFuXCJ9LHtcImtleVwiOlwiZHZcIixcIm5hbWVcIjpcIk1hbGRpdmlhblwifSx7XCJrZXlcIjpcImVsXCIsXCJuYW1lXCI6XCJHcmVla1wifSx7XCJrZXlcIjpcImVuLWF1XCIsXCJuYW1lXCI6XCJFbmdsaXNoIChBdXN0cmFsaWEpXCJ9LHtcImtleVwiOlwiZW4tY2FcIixcIm5hbWVcIjpcIkVuZ2xpc2ggKENhbmFkYSlcIn0se1wia2V5XCI6XCJlbi1nYlwiLFwibmFtZVwiOlwiRW5nbGlzaCAoVW5pdGVkIEtpbmdkb20pXCJ9LHtcImtleVwiOlwiZW4taWVcIixcIm5hbWVcIjpcIkVuZ2xpc2ggKElyZWxhbmQpXCJ9LHtcImtleVwiOlwiZW4taWxcIixcIm5hbWVcIjpcIkVuZ2xpc2ggKElzcmFlbClcIn0se1wia2V5XCI6XCJlbi1pblwiLFwibmFtZVwiOlwiRW5nbGlzaCAoSW5kaWEpXCJ9LHtcImtleVwiOlwiZW4tbnpcIixcIm5hbWVcIjpcIkVuZ2xpc2ggKE5ldyBaZWFsYW5kKVwifSx7XCJrZXlcIjpcImVuLXNnXCIsXCJuYW1lXCI6XCJFbmdsaXNoIChTaW5nYXBvcmUpXCJ9LHtcImtleVwiOlwiZW4tdHRcIixcIm5hbWVcIjpcIkVuZ2xpc2ggKFRyaW5pZGFkICYgVG9iYWdvKVwifSx7XCJrZXlcIjpcImVvXCIsXCJuYW1lXCI6XCJFc3BlcmFudG9cIn0se1wia2V5XCI6XCJlblwiLFwibmFtZVwiOlwiRW5nbGlzaFwifSx7XCJrZXlcIjpcImVzLWRvXCIsXCJuYW1lXCI6XCJTcGFuaXNoIChEb21pbmljYW4gUmVwdWJsaWMpXCJ9LHtcImtleVwiOlwiZXMtbXhcIixcIm5hbWVcIjpcIlNwYW5pc2ggKE1leGljbylcIn0se1wia2V5XCI6XCJlcy1wclwiLFwibmFtZVwiOlwiU3BhbmlzaCAoUHVlcnRvIFJpY28pXCJ9LHtcImtleVwiOlwiZXMtdXNcIixcIm5hbWVcIjpcIlNwYW5pc2ggKFVuaXRlZCBTdGF0ZXMpXCJ9LHtcImtleVwiOlwiZXRcIixcIm5hbWVcIjpcIkVzdG9uaWFuXCJ9LHtcImtleVwiOlwiZXNcIixcIm5hbWVcIjpcIlNwYW5pc2hcIn0se1wia2V5XCI6XCJldVwiLFwibmFtZVwiOlwiQmFzcXVlXCJ9LHtcImtleVwiOlwiZmFcIixcIm5hbWVcIjpcIlBlcnNpYW5cIn0se1wia2V5XCI6XCJmb1wiLFwibmFtZVwiOlwiRmFyb2VzZVwifSx7XCJrZXlcIjpcImZpXCIsXCJuYW1lXCI6XCJGaW5uaXNoXCJ9LHtcImtleVwiOlwiZnItY2FcIixcIm5hbWVcIjpcIkZyZW5jaCAoQ2FuYWRhKVwifSx7XCJrZXlcIjpcImZyLWNoXCIsXCJuYW1lXCI6XCJGcmVuY2ggKFN3aXR6ZXJsYW5kKVwifSx7XCJrZXlcIjpcImZyXCIsXCJuYW1lXCI6XCJGcmVuY2hcIn0se1wia2V5XCI6XCJmeVwiLFwibmFtZVwiOlwiRnJpc2lhblwifSx7XCJrZXlcIjpcImdhXCIsXCJuYW1lXCI6XCJJcmlzaCBvciBJcmlzaCBHYWVsaWNcIn0se1wia2V5XCI6XCJnZFwiLFwibmFtZVwiOlwiU2NvdHRpc2ggR2FlbGljXCJ9LHtcImtleVwiOlwiZ29tLWxhdG5cIixcIm5hbWVcIjpcIktvbmthbmkgTGF0aW4gc2NyaXB0XCJ9LHtcImtleVwiOlwiZ2xcIixcIm5hbWVcIjpcIkdhbGljaWFuXCJ9LHtcImtleVwiOlwiZ3VcIixcIm5hbWVcIjpcIkd1amFyYXRpXCJ9LHtcImtleVwiOlwiaGVcIixcIm5hbWVcIjpcIkhlYnJld1wifSx7XCJrZXlcIjpcImhpXCIsXCJuYW1lXCI6XCJIaW5kaVwifSx7XCJrZXlcIjpcImhyXCIsXCJuYW1lXCI6XCJDcm9hdGlhblwifSx7XCJrZXlcIjpcImh1XCIsXCJuYW1lXCI6XCJIdW5nYXJpYW5cIn0se1wia2V5XCI6XCJodFwiLFwibmFtZVwiOlwiSGFpdGlhbiBDcmVvbGUgKEhhaXRpKVwifSx7XCJrZXlcIjpcImh5LWFtXCIsXCJuYW1lXCI6XCJBcm1lbmlhblwifSx7XCJrZXlcIjpcImlkXCIsXCJuYW1lXCI6XCJJbmRvbmVzaWFuXCJ9LHtcImtleVwiOlwiaXNcIixcIm5hbWVcIjpcIkljZWxhbmRpY1wifSx7XCJrZXlcIjpcIml0LWNoXCIsXCJuYW1lXCI6XCJJdGFsaWFuIChTd2l0emVybGFuZClcIn0se1wia2V5XCI6XCJpdFwiLFwibmFtZVwiOlwiSXRhbGlhblwifSx7XCJrZXlcIjpcImphXCIsXCJuYW1lXCI6XCJKYXBhbmVzZVwifSx7XCJrZXlcIjpcImp2XCIsXCJuYW1lXCI6XCJKYXZhbmVzZVwifSx7XCJrZXlcIjpcImthXCIsXCJuYW1lXCI6XCJHZW9yZ2lhblwifSx7XCJrZXlcIjpcImtrXCIsXCJuYW1lXCI6XCJLYXpha2hcIn0se1wia2V5XCI6XCJrbVwiLFwibmFtZVwiOlwiQ2FtYm9kaWFuXCJ9LHtcImtleVwiOlwia25cIixcIm5hbWVcIjpcIkthbm5hZGFcIn0se1wia2V5XCI6XCJrb1wiLFwibmFtZVwiOlwiS29yZWFuXCJ9LHtcImtleVwiOlwia3VcIixcIm5hbWVcIjpcIkt1cmRpc2hcIn0se1wia2V5XCI6XCJreVwiLFwibmFtZVwiOlwiS3lyZ3l6XCJ9LHtcImtleVwiOlwibGJcIixcIm5hbWVcIjpcIkx1eGVtYm91cmdpc2hcIn0se1wia2V5XCI6XCJsb1wiLFwibmFtZVwiOlwiTGFvXCJ9LHtcImtleVwiOlwibHRcIixcIm5hbWVcIjpcIkxpdGh1YW5pYW5cIn0se1wia2V5XCI6XCJsdlwiLFwibmFtZVwiOlwiTGF0dmlhblwifSx7XCJrZXlcIjpcIm1lXCIsXCJuYW1lXCI6XCJNb250ZW5lZ3JpblwifSx7XCJrZXlcIjpcIm1pXCIsXCJuYW1lXCI6XCJNYW9yaVwifSx7XCJrZXlcIjpcIm1rXCIsXCJuYW1lXCI6XCJNYWNlZG9uaWFuXCJ9LHtcImtleVwiOlwibWxcIixcIm5hbWVcIjpcIk1hbGF5YWxhbVwifSx7XCJrZXlcIjpcIm1uXCIsXCJuYW1lXCI6XCJNb25nb2xpYW5cIn0se1wia2V5XCI6XCJtclwiLFwibmFtZVwiOlwiTWFyYXRoaVwifSx7XCJrZXlcIjpcIm1zLW15XCIsXCJuYW1lXCI6XCJNYWxheVwifSx7XCJrZXlcIjpcIm1zXCIsXCJuYW1lXCI6XCJNYWxheVwifSx7XCJrZXlcIjpcIm10XCIsXCJuYW1lXCI6XCJNYWx0ZXNlIChNYWx0YSlcIn0se1wia2V5XCI6XCJteVwiLFwibmFtZVwiOlwiQnVybWVzZVwifSx7XCJrZXlcIjpcIm5iXCIsXCJuYW1lXCI6XCJOb3J3ZWdpYW4gQm9rbcOlbFwifSx7XCJrZXlcIjpcIm5lXCIsXCJuYW1lXCI6XCJOZXBhbGVzZVwifSx7XCJrZXlcIjpcIm5sLWJlXCIsXCJuYW1lXCI6XCJEdXRjaCAoQmVsZ2l1bSlcIn0se1wia2V5XCI6XCJubFwiLFwibmFtZVwiOlwiRHV0Y2hcIn0se1wia2V5XCI6XCJwbFwiLFwibmFtZVwiOlwiUG9saXNoXCJ9LHtcImtleVwiOlwicHQtYnJcIixcIm5hbWVcIjpcIlBvcnR1Z3Vlc2UgKEJyYXppbClcIn0se1wia2V5XCI6XCJwdFwiLFwibmFtZVwiOlwiUG9ydHVndWVzZVwifSx7XCJrZXlcIjpcInJuXCIsXCJuYW1lXCI6XCJLaXJ1bmRpXCJ9LHtcImtleVwiOlwicm9cIixcIm5hbWVcIjpcIlJvbWFuaWFuXCJ9LHtcImtleVwiOlwicnVcIixcIm5hbWVcIjpcIlJ1c3NpYW5cIn0se1wia2V5XCI6XCJyd1wiLFwibmFtZVwiOlwiS2lueWFyd2FuZGEgKFJ3YW5kYSlcIn0se1wia2V5XCI6XCJzZFwiLFwibmFtZVwiOlwiU2luZGhpXCJ9LHtcImtleVwiOlwic2VcIixcIm5hbWVcIjpcIk5vcnRoZXJuIFNhbWlcIn0se1wia2V5XCI6XCJzaVwiLFwibmFtZVwiOlwiU2luaGFsZXNlXCJ9LHtcImtleVwiOlwic2tcIixcIm5hbWVcIjpcIlNsb3Zha1wifSx7XCJrZXlcIjpcInNsXCIsXCJuYW1lXCI6XCJTbG92ZW5pYW5cIn0se1wia2V5XCI6XCJzcVwiLFwibmFtZVwiOlwiQWxiYW5pYW5cIn0se1wia2V5XCI6XCJzci1jeXJsXCIsXCJuYW1lXCI6XCJTZXJiaWFuIEN5cmlsbGljXCJ9LHtcImtleVwiOlwic3NcIixcIm5hbWVcIjpcInNpU3dhdGlcIn0se1wia2V5XCI6XCJzdi1maVwiLFwibmFtZVwiOlwiRmlubGFuZCBTd2VkaXNoXCJ9LHtcImtleVwiOlwic3JcIixcIm5hbWVcIjpcIlNlcmJpYW5cIn0se1wia2V5XCI6XCJzdlwiLFwibmFtZVwiOlwiU3dlZGlzaFwifSx7XCJrZXlcIjpcInN3XCIsXCJuYW1lXCI6XCJTd2FoaWxpXCJ9LHtcImtleVwiOlwidGFcIixcIm5hbWVcIjpcIlRhbWlsXCJ9LHtcImtleVwiOlwidGVcIixcIm5hbWVcIjpcIlRlbHVndVwifSx7XCJrZXlcIjpcInRldFwiLFwibmFtZVwiOlwiVGV0dW4gRGlsaSAoRWFzdCBUaW1vcilcIn0se1wia2V5XCI6XCJ0Z1wiLFwibmFtZVwiOlwiVGFqaWtcIn0se1wia2V5XCI6XCJ0aFwiLFwibmFtZVwiOlwiVGhhaVwifSx7XCJrZXlcIjpcInRrXCIsXCJuYW1lXCI6XCJUdXJrbWVuXCJ9LHtcImtleVwiOlwidGwtcGhcIixcIm5hbWVcIjpcIlRhZ2Fsb2cgKFBoaWxpcHBpbmVzKVwifSx7XCJrZXlcIjpcInRsaFwiLFwibmFtZVwiOlwiS2xpbmdvblwifSx7XCJrZXlcIjpcInRyXCIsXCJuYW1lXCI6XCJUdXJraXNoXCJ9LHtcImtleVwiOlwidHpsXCIsXCJuYW1lXCI6XCJUYWxvc3NhblwifSx7XCJrZXlcIjpcInR6bS1sYXRuXCIsXCJuYW1lXCI6XCJDZW50cmFsIEF0bGFzIFRhbWF6aWdodCBMYXRpblwifSx7XCJrZXlcIjpcInR6bVwiLFwibmFtZVwiOlwiQ2VudHJhbCBBdGxhcyBUYW1hemlnaHRcIn0se1wia2V5XCI6XCJ1Zy1jblwiLFwibmFtZVwiOlwiVXlnaHVyIChDaGluYSlcIn0se1wia2V5XCI6XCJ1a1wiLFwibmFtZVwiOlwiVWtyYWluaWFuXCJ9LHtcImtleVwiOlwidXJcIixcIm5hbWVcIjpcIlVyZHVcIn0se1wia2V5XCI6XCJ1ei1sYXRuXCIsXCJuYW1lXCI6XCJVemJlayBMYXRpblwifSx7XCJrZXlcIjpcInV6XCIsXCJuYW1lXCI6XCJVemJla1wifSx7XCJrZXlcIjpcInZpXCIsXCJuYW1lXCI6XCJWaWV0bmFtZXNlXCJ9LHtcImtleVwiOlwieC1wc2V1ZG9cIixcIm5hbWVcIjpcIlBzZXVkb1wifSx7XCJrZXlcIjpcInlvXCIsXCJuYW1lXCI6XCJZb3J1YmEgTmlnZXJpYVwifSx7XCJrZXlcIjpcInpoLWNuXCIsXCJuYW1lXCI6XCJDaGluZXNlIChDaGluYSlcIn0se1wia2V5XCI6XCJ6aC1oa1wiLFwibmFtZVwiOlwiQ2hpbmVzZSAoSG9uZyBLb25nKVwifSx7XCJrZXlcIjpcInpoLXR3XCIsXCJuYW1lXCI6XCJDaGluZXNlIChUYWl3YW4pXCJ9LHtcImtleVwiOlwiemhcIixcIm5hbWVcIjpcIkNoaW5lc2VcIn0se1wia2V5XCI6XCJvYy1sbmNcIixcIm5hbWVcIjpcIk9jY2l0YW4sIGxlbmdhZG9jaWFuIGRpYWxlY3RlXCJ9LHtcImtleVwiOlwibm5cIixcIm5hbWVcIjpcIk55bm9yc2tcIn0se1wia2V5XCI6XCJwYS1pblwiLFwibmFtZVwiOlwiUHVuamFiaSAoSW5kaWEpXCJ9XVxuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYWYuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9hbS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2FyLWR6LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYXItaXEuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9hci1rdy5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2FyLWx5LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYXItbWEuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9hci1zYS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2FyLXRuLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYXIuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9hei5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2JlLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYmcuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9iaS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2JtLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYm4tYmQuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ibi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2JvLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvYnIuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9icy5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2NhLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvY3MuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9jdi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2N5LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZGEuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9kZS1hdC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2RlLWNoLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZGUuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9kdi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VsLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZW4tYXUuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbi1jYS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VuLWdiLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZW4taWUuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbi1pbC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VuLWluLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZW4tbnouanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lbi1zZy5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VuLXR0LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZW4uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VzLWRvLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZXMtbXguanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9lcy1wci5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2VzLXVzLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZXMuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ldC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2V1LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZmEuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9maS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2ZvLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZnItY2EuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9mci1jaC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2ZyLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZnkuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9nYS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2dkLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvZ2wuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9nb20tbGF0bi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2d1LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvaGUuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9oaS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2hyLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvaHQuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9odS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2h5LWFtLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvaWQuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9pcy5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2l0LWNoLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvaXQuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9qYS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2p2LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUva2EuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ray5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2ttLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUva24uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9rby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2t1LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUva3kuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9sYi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL2xvLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbHQuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9sdi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL21lLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbWkuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9tay5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL21sLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbW4uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9tci5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL21zLW15LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbXMuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9tdC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL215LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbmIuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9uZS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL25sLWJlLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvbmwuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9ubi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL29jLWxuYy5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3BhLWluLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvcGwuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9wdC1ici5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3B0LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvcm4uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9yby5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3J1LmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvcncuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9zZC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3NlLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc2kuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9zay5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3NsLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc3EuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9zci1jeXJsLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc3IuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9zcy5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3N2LWZpLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvc3YuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS9zdy5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3RhLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdGUuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS90ZXQuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS90Zy5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3RoLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdGsuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS90bC1waC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3RsaC5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3RyLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdHpsLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdHptLWxhdG4uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS90em0uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS91Zy1jbi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3VrLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdXIuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS91ei1sYXRuLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvdXouanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS92aS5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3gtcHNldWRvLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUveW8uanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS96aC1jbi5qcydcbmltcG9ydCAnZGF5anMvbG9jYWxlL3poLWhrLmpzJ1xuaW1wb3J0ICdkYXlqcy9sb2NhbGUvemgtdHcuanMnXG5pbXBvcnQgJ2RheWpzL2xvY2FsZS96aC5qcydcblxuZXhwb3J0IGRlZmF1bHQgZGF5anNcbiIsCiAgICAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBjdmEsIHR5cGUgVmFyaWFudFByb3BzIH0gZnJvbSAnY2xhc3MtdmFyaWFuY2UtYXV0aG9yaXR5J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5jb25zdCBhbGVydFZhcmlhbnRzID0gY3ZhKFxuICAncmVsYXRpdmUgdy1mdWxsIHJvdW5kZWQtbGcgYm9yZGVyIHB4LTQgcHktMyB0ZXh0LXNtIGdyaWQgaGFzLVs+c3ZnXTpncmlkLWNvbHMtW2NhbGModmFyKC0tc3BhY2luZykqNClfMWZyXSBncmlkLWNvbHMtWzBfMWZyXSBoYXMtWz5zdmddOmdhcC14LTMgZ2FwLXktMC41IGl0ZW1zLXN0YXJ0IFsmPnN2Z106c2l6ZS00IFsmPnN2Z106dHJhbnNsYXRlLXktMC41IFsmPnN2Z106dGV4dC1jdXJyZW50JyxcbiAge1xuICAgIHZhcmlhbnRzOiB7XG4gICAgICB2YXJpYW50OiB7XG4gICAgICAgIGRlZmF1bHQ6ICdiZy1jYXJkIHRleHQtY2FyZC1mb3JlZ3JvdW5kJyxcbiAgICAgICAgZGVzdHJ1Y3RpdmU6XG4gICAgICAgICAgJ3RleHQtZGVzdHJ1Y3RpdmUgYmctY2FyZCBbJj5zdmddOnRleHQtY3VycmVudCAqOmRhdGEtW3Nsb3Q9YWxlcnQtZGVzY3JpcHRpb25dOnRleHQtZGVzdHJ1Y3RpdmUvOTAnLFxuICAgICAgICBwcmltYXJ5OlxuICAgICAgICAgICdiZy1ibHVlLTUwIGRhcms6YmctYmx1ZS05NTAvMjAgYm9yZGVyLWJsdWUtMjAwIGRhcms6Ym9yZGVyLWJsdWUtODAwIHRleHQtYmx1ZS05MDAgZGFyazp0ZXh0LWJsdWUtMTAwIFsmPnN2Z106dGV4dC1ibHVlLTYwMCBkYXJrOlsmPnN2Z106dGV4dC1ibHVlLTQwMCAqOmRhdGEtW3Nsb3Q9YWxlcnQtZGVzY3JpcHRpb25dOnRleHQtYmx1ZS04MDAgZGFyazoqOmRhdGEtW3Nsb3Q9YWxlcnQtZGVzY3JpcHRpb25dOnRleHQtYmx1ZS0yMDAnLFxuICAgICAgICBzZWNvbmRhcnk6XG4gICAgICAgICAgJ2JnLWdyYXktNTAgZGFyazpiZy1ncmF5LTk1MC8yMCBib3JkZXItZ3JheS0yMDAgZGFyazpib3JkZXItZ3JheS04MDAgdGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtZ3JheS0xMDAgWyY+c3ZnXTp0ZXh0LWdyYXktNjAwIGRhcms6WyY+c3ZnXTp0ZXh0LWdyYXktNDAwICo6ZGF0YS1bc2xvdD1hbGVydC1kZXNjcmlwdGlvbl06dGV4dC1ncmF5LTgwMCBkYXJrOio6ZGF0YS1bc2xvdD1hbGVydC1kZXNjcmlwdGlvbl06dGV4dC1ncmF5LTIwMCcsXG4gICAgICAgIHN1Y2Nlc3M6XG4gICAgICAgICAgJ2JnLWdyZWVuLTUwIGRhcms6YmctZ3JlZW4tOTUwLzIwIGJvcmRlci1ncmVlbi0yMDAgZGFyazpib3JkZXItZ3JlZW4tODAwIHRleHQtZ3JlZW4tOTAwIGRhcms6dGV4dC1ncmVlbi0xMDAgWyY+c3ZnXTp0ZXh0LWdyZWVuLTYwMCBkYXJrOlsmPnN2Z106dGV4dC1ncmVlbi00MDAgKjpkYXRhLVtzbG90PWFsZXJ0LWRlc2NyaXB0aW9uXTp0ZXh0LWdyZWVuLTgwMCBkYXJrOio6ZGF0YS1bc2xvdD1hbGVydC1kZXNjcmlwdGlvbl06dGV4dC1ncmVlbi0yMDAnLFxuICAgICAgICB3YXJuaW5nOlxuICAgICAgICAgICdiZy15ZWxsb3ctNTAgZGFyazpiZy15ZWxsb3ctOTUwLzIwIGJvcmRlci15ZWxsb3ctMjAwIGRhcms6Ym9yZGVyLXllbGxvdy04MDAgdGV4dC15ZWxsb3ctOTAwIGRhcms6dGV4dC15ZWxsb3ctMTAwIFsmPnN2Z106dGV4dC15ZWxsb3ctNjAwIGRhcms6WyY+c3ZnXTp0ZXh0LXllbGxvdy00MDAgKjpkYXRhLVtzbG90PWFsZXJ0LWRlc2NyaXB0aW9uXTp0ZXh0LXllbGxvdy04MDAgZGFyazoqOmRhdGEtW3Nsb3Q9YWxlcnQtZGVzY3JpcHRpb25dOnRleHQteWVsbG93LTIwMCcsXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGVmYXVsdFZhcmlhbnRzOiB7XG4gICAgICB2YXJpYW50OiAnZGVmYXVsdCcsXG4gICAgfSxcbiAgfVxuKVxuXG5mdW5jdGlvbiBBbGVydCh7XG4gIGNsYXNzTmFtZSxcbiAgdmFyaWFudCxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdkaXYnPiAmIFZhcmlhbnRQcm9wczx0eXBlb2YgYWxlcnRWYXJpYW50cz4pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBkYXRhLXNsb3Q9XCJhbGVydFwiXG4gICAgICByb2xlPVwiYWxlcnRcIlxuICAgICAgY2xhc3NOYW1lPXtjbihhbGVydFZhcmlhbnRzKHsgdmFyaWFudCB9KSwgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIEFsZXJ0VGl0bGUoeyBjbGFzc05hbWUsIC4uLnByb3BzIH06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdkaXYnPikge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtc2xvdD1cImFsZXJ0LXRpdGxlXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdjb2wtc3RhcnQtMiBsaW5lLWNsYW1wLTEgbWluLWgtNCBmb250LW1lZGl1bSB0cmFja2luZy10aWdodCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIEFsZXJ0RGVzY3JpcHRpb24oe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczwnZGl2Jz4pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBkYXRhLXNsb3Q9XCJhbGVydC1kZXNjcmlwdGlvblwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAndGV4dC1tdXRlZC1mb3JlZ3JvdW5kIGNvbC1zdGFydC0yIGdyaWQganVzdGlmeS1pdGVtcy1zdGFydCBnYXAtMSB0ZXh0LXNtIFsmX3BdOmxlYWRpbmctcmVsYXhlZCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmV4cG9ydCB7IEFsZXJ0LCBBbGVydFRpdGxlLCBBbGVydERlc2NyaXB0aW9uIH1cbiIsCiAgICAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBTbG90IH0gZnJvbSAnQHJhZGl4LXVpL3JlYWN0LXNsb3QnXG5pbXBvcnQgeyBjdmEsIHR5cGUgVmFyaWFudFByb3BzIH0gZnJvbSAnY2xhc3MtdmFyaWFuY2UtYXV0aG9yaXR5J1xuXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuXG5jb25zdCBiYWRnZVZhcmlhbnRzID0gY3ZhKFxuICAnaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIHJvdW5kZWQtbWQgYm9yZGVyIHB4LTIgcHktMC41IHRleHQteHMgZm9udC1tZWRpdW0gdy1maXQgd2hpdGVzcGFjZS1ub3dyYXAgc2hyaW5rLTAgWyY+c3ZnXTpzaXplLTMgZ2FwLTEgWyY+c3ZnXTpwb2ludGVyLWV2ZW50cy1ub25lIGZvY3VzLXZpc2libGU6Ym9yZGVyLXJpbmcgZm9jdXMtdmlzaWJsZTpyaW5nLXJpbmcvNTAgZm9jdXMtdmlzaWJsZTpyaW5nLVszcHhdIGFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzIwIGRhcms6YXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvNDAgYXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZSB0cmFuc2l0aW9uLVtjb2xvcixib3gtc2hhZG93XSBvdmVyZmxvdy1jbGlwJyxcbiAge1xuICAgIHZhcmlhbnRzOiB7XG4gICAgICB2YXJpYW50OiB7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgJ2JvcmRlci10cmFuc3BhcmVudCBiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIFthJl06aG92ZXI6YmctcHJpbWFyeS85MCcsXG4gICAgICAgIHNlY29uZGFyeTpcbiAgICAgICAgICAnYm9yZGVyLXRyYW5zcGFyZW50IGJnLXNlY29uZGFyeSB0ZXh0LXNlY29uZGFyeS1mb3JlZ3JvdW5kIFthJl06aG92ZXI6Ymctc2Vjb25kYXJ5LzkwJyxcbiAgICAgICAgZGVzdHJ1Y3RpdmU6XG4gICAgICAgICAgJ2JvcmRlci10cmFuc3BhcmVudCBiZy1kZXN0cnVjdGl2ZSB0ZXh0LXdoaXRlIFthJl06aG92ZXI6YmctZGVzdHJ1Y3RpdmUvOTAgZm9jdXMtdmlzaWJsZTpyaW5nLWRlc3RydWN0aXZlLzIwIGRhcms6Zm9jdXMtdmlzaWJsZTpyaW5nLWRlc3RydWN0aXZlLzQwIGRhcms6YmctZGVzdHJ1Y3RpdmUvNjAnLFxuICAgICAgICBvdXRsaW5lOlxuICAgICAgICAgICd0ZXh0LWZvcmVncm91bmQgW2EmXTpob3ZlcjpiZy1hY2NlbnQgW2EmXTpob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBkZWZhdWx0VmFyaWFudHM6IHtcbiAgICAgIHZhcmlhbnQ6ICdkZWZhdWx0JyxcbiAgICB9LFxuICB9XG4pXG5cbmZ1bmN0aW9uIEJhZGdlKHtcbiAgY2xhc3NOYW1lLFxuICB2YXJpYW50LFxuICBhc0NoaWxkID0gZmFsc2UsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczwnc3Bhbic+ICZcbiAgVmFyaWFudFByb3BzPHR5cGVvZiBiYWRnZVZhcmlhbnRzPiAmIHsgYXNDaGlsZD86IGJvb2xlYW4gfSkge1xuICBjb25zdCBDb21wID0gYXNDaGlsZCA/IFNsb3QgOiAnc3BhbidcblxuICByZXR1cm4gKFxuICAgIDxDb21wXG4gICAgICBkYXRhLXNsb3Q9XCJiYWRnZVwiXG4gICAgICBjbGFzc05hbWU9e2NuKGJhZGdlVmFyaWFudHMoeyB2YXJpYW50IH0pLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IHsgQmFkZ2UsIGJhZGdlVmFyaWFudHMgfVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IFNsb3QgfSBmcm9tICdAcmFkaXgtdWkvcmVhY3Qtc2xvdCdcbmltcG9ydCB7IGN2YSwgdHlwZSBWYXJpYW50UHJvcHMgfSBmcm9tICdjbGFzcy12YXJpYW5jZS1hdXRob3JpdHknXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmNvbnN0IGJ1dHRvblZhcmlhbnRzID0gY3ZhKFxuICBcImlubGluZS1mbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBnYXAtMiB3aGl0ZXNwYWNlLW5vd3JhcCByb3VuZGVkLW1kIHRleHQtc20gZm9udC1tZWRpdW0gdHJhbnNpdGlvbi1hbGwgZGlzYWJsZWQ6cG9pbnRlci1ldmVudHMtbm9uZSBkaXNhYmxlZDpvcGFjaXR5LTUwIFsmX3N2Z106cG9pbnRlci1ldmVudHMtbm9uZSBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTQgc2hyaW5rLTAgWyZfc3ZnXTpzaHJpbmstMCBvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBmb2N1cy12aXNpYmxlOnJpbmctWzNweF0gYXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvMjAgZGFyazphcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS80MCBhcmlhLWludmFsaWQ6Ym9yZGVyLWRlc3RydWN0aXZlXCIsXG4gIHtcbiAgICB2YXJpYW50czoge1xuICAgICAgdmFyaWFudDoge1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIHNoYWRvdy14cyBob3ZlcjpiZy1wcmltYXJ5LzkwJyxcbiAgICAgICAgZGVzdHJ1Y3RpdmU6XG4gICAgICAgICAgJ2JnLWRlc3RydWN0aXZlIHRleHQtd2hpdGUgc2hhZG93LXhzIGhvdmVyOmJnLWRlc3RydWN0aXZlLzkwIGZvY3VzLXZpc2libGU6cmluZy1kZXN0cnVjdGl2ZS8yMCBkYXJrOmZvY3VzLXZpc2libGU6cmluZy1kZXN0cnVjdGl2ZS80MCBkYXJrOmJnLWRlc3RydWN0aXZlLzYwJyxcbiAgICAgICAgb3V0bGluZTpcbiAgICAgICAgICAnYm9yZGVyIGJnLWJhY2tncm91bmQgc2hhZG93LXhzIGhvdmVyOmJnLWFjY2VudCBob3Zlcjp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIGRhcms6YmctaW5wdXQvMzAgZGFyazpib3JkZXItaW5wdXQgZGFyazpob3ZlcjpiZy1pbnB1dC81MCcsXG4gICAgICAgIHNlY29uZGFyeTpcbiAgICAgICAgICAnYmctc2Vjb25kYXJ5IHRleHQtc2Vjb25kYXJ5LWZvcmVncm91bmQgc2hhZG93LXhzIGhvdmVyOmJnLXNlY29uZGFyeS84MCcsXG4gICAgICAgIGdob3N0OlxuICAgICAgICAgICdob3ZlcjpiZy1hY2NlbnQgaG92ZXI6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCBkYXJrOmhvdmVyOmJnLWFjY2VudC81MCcsXG4gICAgICAgIGxpbms6ICd0ZXh0LXByaW1hcnkgdW5kZXJsaW5lLW9mZnNldC00IGhvdmVyOnVuZGVybGluZScsXG4gICAgICB9LFxuICAgICAgc2l6ZToge1xuICAgICAgICBkZWZhdWx0OiAnaC05IHB4LTQgcHktMiBoYXMtWz5zdmddOnB4LTMnLFxuICAgICAgICBzbTogJ2gtOCByb3VuZGVkLW1kIGdhcC0xLjUgcHgtMyBoYXMtWz5zdmddOnB4LTIuNScsXG4gICAgICAgIGxnOiAnaC0xMCByb3VuZGVkLW1kIHB4LTYgaGFzLVs+c3ZnXTpweC00JyxcbiAgICAgICAgaWNvbjogJ3NpemUtOScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgZGVmYXVsdFZhcmlhbnRzOiB7XG4gICAgICB2YXJpYW50OiAnZGVmYXVsdCcsXG4gICAgICBzaXplOiAnZGVmYXVsdCcsXG4gICAgfSxcbiAgfVxuKVxuXG5mdW5jdGlvbiBCdXR0b24oe1xuICBjbGFzc05hbWUsXG4gIHZhcmlhbnQsXG4gIHNpemUsXG4gIGFzQ2hpbGQgPSBmYWxzZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdidXR0b24nPiAmXG4gIFZhcmlhbnRQcm9wczx0eXBlb2YgYnV0dG9uVmFyaWFudHM+ICYge1xuICAgIGFzQ2hpbGQ/OiBib29sZWFuXG4gIH0pIHtcbiAgY29uc3QgQ29tcCA9IGFzQ2hpbGQgPyBTbG90IDogJ2J1dHRvbidcblxuICByZXR1cm4gKFxuICAgIDxDb21wXG4gICAgICBkYXRhLXNsb3Q9XCJidXR0b25cIlxuICAgICAgY2xhc3NOYW1lPXtjbihidXR0b25WYXJpYW50cyh7IHZhcmlhbnQsIHNpemUsIGNsYXNzTmFtZSB9KSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgeyBCdXR0b24sIGJ1dHRvblZhcmlhbnRzIH1cbiIsCiAgICAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBDaGV2cm9uTGVmdCwgQ2hldnJvblJpZ2h0IH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHsgRGF5UGlja2VyIH0gZnJvbSAncmVhY3QtZGF5LXBpY2tlcidcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCB7IGJ1dHRvblZhcmlhbnRzIH0gZnJvbSAnQC9jb21wb25lbnRzL3VpL2J1dHRvbidcblxuZnVuY3Rpb24gQ2FsZW5kYXIoe1xuICBjbGFzc05hbWUsXG4gIGNsYXNzTmFtZXMsXG4gIHNob3dPdXRzaWRlRGF5cyA9IHRydWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRGF5UGlja2VyPikge1xuICByZXR1cm4gKFxuICAgIDxEYXlQaWNrZXJcbiAgICAgIHNob3dPdXRzaWRlRGF5cz17c2hvd091dHNpZGVEYXlzfVxuICAgICAgY2xhc3NOYW1lPXtjbigncC0zJywgY2xhc3NOYW1lKX1cbiAgICAgIGNsYXNzTmFtZXM9e3tcbiAgICAgICAgbW9udGhzOiAnZmxleCBmbGV4LWNvbCBzbTpmbGV4LXJvdyBnYXAtMicsXG4gICAgICAgIG1vbnRoOiAnZmxleCBmbGV4LWNvbCBnYXAtNCcsXG4gICAgICAgIGNhcHRpb246ICdmbGV4IGp1c3RpZnktY2VudGVyIHB0LTEgcmVsYXRpdmUgaXRlbXMtY2VudGVyIHctZnVsbCcsXG4gICAgICAgIGNhcHRpb25fbGFiZWw6ICd0ZXh0LXNtIGZvbnQtbWVkaXVtJyxcbiAgICAgICAgbmF2OiAnZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEnLFxuICAgICAgICBuYXZfYnV0dG9uOiBjbihcbiAgICAgICAgICBidXR0b25WYXJpYW50cyh7IHZhcmlhbnQ6ICdvdXRsaW5lJyB9KSxcbiAgICAgICAgICAnc2l6ZS03IGJnLXRyYW5zcGFyZW50IHAtMCBvcGFjaXR5LTUwIGhvdmVyOm9wYWNpdHktMTAwJ1xuICAgICAgICApLFxuICAgICAgICBuYXZfYnV0dG9uX3ByZXZpb3VzOiAnYWJzb2x1dGUgbGVmdC0xJyxcbiAgICAgICAgbmF2X2J1dHRvbl9uZXh0OiAnYWJzb2x1dGUgcmlnaHQtMScsXG4gICAgICAgIHRhYmxlOiAndy1mdWxsIGJvcmRlci1jb2xsYXBzZSBzcGFjZS14LTEnLFxuICAgICAgICBoZWFkX3JvdzogJ2ZsZXgnLFxuICAgICAgICBoZWFkX2NlbGw6XG4gICAgICAgICAgJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCByb3VuZGVkLW1kIHctOCBmb250LW5vcm1hbCB0ZXh0LVswLjhyZW1dJyxcbiAgICAgICAgcm93OiAnZmxleCB3LWZ1bGwgbXQtMicsXG4gICAgICAgIGNlbGw6IGNuKFxuICAgICAgICAgICdyZWxhdGl2ZSBwLTAgdGV4dC1jZW50ZXIgdGV4dC1zbSBmb2N1cy13aXRoaW46cmVsYXRpdmUgZm9jdXMtd2l0aGluOnotMjAgWyY6aGFzKFthcmlhLXNlbGVjdGVkXSldOmJnLWFjY2VudCBbJjpoYXMoW2FyaWEtc2VsZWN0ZWRdLmRheS1yYW5nZS1lbmQpXTpyb3VuZGVkLXItbWQnLFxuICAgICAgICAgIHByb3BzLm1vZGUgPT09ICdyYW5nZSdcbiAgICAgICAgICAgID8gJ1smOmhhcyg+LmRheS1yYW5nZS1lbmQpXTpyb3VuZGVkLXItbWQgWyY6aGFzKD4uZGF5LXJhbmdlLXN0YXJ0KV06cm91bmRlZC1sLW1kIGZpcnN0OlsmOmhhcyhbYXJpYS1zZWxlY3RlZF0pXTpyb3VuZGVkLWwtbWQgbGFzdDpbJjpoYXMoW2FyaWEtc2VsZWN0ZWRdKV06cm91bmRlZC1yLW1kJ1xuICAgICAgICAgICAgOiAnWyY6aGFzKFthcmlhLXNlbGVjdGVkXSldOnJvdW5kZWQtbWQnXG4gICAgICAgICksXG4gICAgICAgIGRheTogY24oXG4gICAgICAgICAgYnV0dG9uVmFyaWFudHMoeyB2YXJpYW50OiAnZ2hvc3QnIH0pLFxuICAgICAgICAgICdzaXplLTggcC0wIGZvbnQtbm9ybWFsIGFyaWEtc2VsZWN0ZWQ6b3BhY2l0eS0xMDAnXG4gICAgICAgICksXG4gICAgICAgIGRheV9yYW5nZV9zdGFydDpcbiAgICAgICAgICAnZGF5LXJhbmdlLXN0YXJ0IGFyaWEtc2VsZWN0ZWQ6YmctcHJpbWFyeSBhcmlhLXNlbGVjdGVkOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kJyxcbiAgICAgICAgZGF5X3JhbmdlX2VuZDpcbiAgICAgICAgICAnZGF5LXJhbmdlLWVuZCBhcmlhLXNlbGVjdGVkOmJnLXByaW1hcnkgYXJpYS1zZWxlY3RlZDp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCcsXG4gICAgICAgIGRheV9zZWxlY3RlZDpcbiAgICAgICAgICAnYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBob3ZlcjpiZy1wcmltYXJ5IGhvdmVyOnRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGZvY3VzOmJnLXByaW1hcnkgZm9jdXM6dGV4dC1wcmltYXJ5LWZvcmVncm91bmQnLFxuICAgICAgICBkYXlfdG9kYXk6ICdiZy1hY2NlbnQgdGV4dC1hY2NlbnQtZm9yZWdyb3VuZCcsXG4gICAgICAgIGRheV9vdXRzaWRlOlxuICAgICAgICAgICdkYXktb3V0c2lkZSB0ZXh0LW11dGVkLWZvcmVncm91bmQgYXJpYS1zZWxlY3RlZDp0ZXh0LW11dGVkLWZvcmVncm91bmQnLFxuICAgICAgICBkYXlfZGlzYWJsZWQ6ICd0ZXh0LW11dGVkLWZvcmVncm91bmQgb3BhY2l0eS01MCcsXG4gICAgICAgIGRheV9yYW5nZV9taWRkbGU6XG4gICAgICAgICAgJ2FyaWEtc2VsZWN0ZWQ6YmctYWNjZW50IGFyaWEtc2VsZWN0ZWQ6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCcsXG4gICAgICAgIGRheV9oaWRkZW46ICdpbnZpc2libGUnLFxuICAgICAgICAuLi5jbGFzc05hbWVzLFxuICAgICAgfX1cbiAgICAgIGNvbXBvbmVudHM9e3tcbiAgICAgICAgSWNvbkxlZnQ6ICh7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfSkgPT4gKFxuICAgICAgICAgIDxDaGV2cm9uTGVmdCBjbGFzc05hbWU9e2NuKCdzaXplLTQnLCBjbGFzc05hbWUpfSB7Li4ucHJvcHN9IC8+XG4gICAgICAgICksXG4gICAgICAgIEljb25SaWdodDogKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9KSA9PiAoXG4gICAgICAgICAgPENoZXZyb25SaWdodCBjbGFzc05hbWU9e2NuKCdzaXplLTQnLCBjbGFzc05hbWUpfSB7Li4ucHJvcHN9IC8+XG4gICAgICAgICksXG4gICAgICB9fVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IHsgQ2FsZW5kYXIgfVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIENoZWNrYm94UHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1jaGVja2JveCdcbmltcG9ydCB7IENoZWNrSWNvbiB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gQ2hlY2tib3goe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgQ2hlY2tib3hQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIChcbiAgICA8Q2hlY2tib3hQcmltaXRpdmUuUm9vdFxuICAgICAgZGF0YS1zbG90PVwiY2hlY2tib3hcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ3BlZXIgYm9yZGVyLWlucHV0IGRhcms6YmctaW5wdXQvMzAgZGF0YS1bc3RhdGU9Y2hlY2tlZF06YmctcHJpbWFyeSBkYXRhLVtzdGF0ZT1jaGVja2VkXTp0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCBkYXJrOmRhdGEtW3N0YXRlPWNoZWNrZWRdOmJnLXByaW1hcnkgZGF0YS1bc3RhdGU9Y2hlY2tlZF06Ym9yZGVyLXByaW1hcnkgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBhcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS8yMCBkYXJrOmFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzQwIGFyaWEtaW52YWxpZDpib3JkZXItZGVzdHJ1Y3RpdmUgc2l6ZS00IHNocmluay0wIHJvdW5kZWQtWzRweF0gYm9yZGVyIHNoYWRvdy14cyB0cmFuc2l0aW9uLXNoYWRvdyBvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLVszcHhdIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxDaGVja2JveFByaW1pdGl2ZS5JbmRpY2F0b3JcbiAgICAgICAgZGF0YS1zbG90PVwiY2hlY2tib3gtaW5kaWNhdG9yXCJcbiAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgdGV4dC1jdXJyZW50IHRyYW5zaXRpb24tbm9uZVwiXG4gICAgICA+XG4gICAgICAgIDxDaGVja0ljb24gY2xhc3NOYW1lPVwic2l6ZS0zLjVcIiAvPlxuICAgICAgPC9DaGVja2JveFByaW1pdGl2ZS5JbmRpY2F0b3I+XG4gICAgPC9DaGVja2JveFByaW1pdGl2ZS5Sb290PlxuICApXG59XG5cbmV4cG9ydCB7IENoZWNrYm94IH1cbiIsCiAgICAiaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IENhbGVuZGFyIGFzIENhbGVuZGFySWNvbiB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICdAL2NvbXBvbmVudHMvdWkvYnV0dG9uJ1xuaW1wb3J0IHsgQ2FsZW5kYXIgfSBmcm9tICdAL2NvbXBvbmVudHMvdWkvY2FsZW5kYXInXG5pbXBvcnQge1xuICBQb3BvdmVyLFxuICBQb3BvdmVyQ29udGVudCxcbiAgUG9wb3ZlclRyaWdnZXIsXG59IGZyb20gJ0AvY29tcG9uZW50cy91aS9wb3BvdmVyJ1xuaW1wb3J0IHsgdXNlUmVmIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBQb3BvdmVyQ2xvc2UgfSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtcG9wb3ZlcidcblxuaW50ZXJmYWNlIERhdGVQaWNrZXJQcm9wcyB7XG4gIGRhdGU6IERhdGUgfCB1bmRlZmluZWRcbiAgc2V0RGF0ZTogKGRhdGU6IERhdGUgfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgbGFiZWw/OiBzdHJpbmdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIGNsb3NlT25TZWxlY3Q/OiBib29sZWFuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEYXRlUGlja2VyKHtcbiAgZGF0ZSxcbiAgY2xvc2VPblNlbGVjdCxcbiAgc2V0RGF0ZSxcbiAgbGFiZWwgPSAnUGljayBhIGRhdGUnLFxuICBjbGFzc05hbWUsXG59OiBEYXRlUGlja2VyUHJvcHMpIHtcbiAgY29uc3QgcG9wT3ZlclJlZiA9IHVzZVJlZjxIVE1MQnV0dG9uRWxlbWVudCB8IG51bGw+KG51bGwpXG5cbiAgY29uc3Qgb25TZWxlY3QgPSAoZGF0ZTogRGF0ZSB8IHVuZGVmaW5lZCkgPT4ge1xuICAgIHNldERhdGUoZGF0ZSlcbiAgICBpZiAoY2xvc2VPblNlbGVjdCkge1xuICAgICAgcG9wT3ZlclJlZi5jdXJyZW50Py5jbGljaygpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3NOYW1lfT5cbiAgICAgIDxQb3BvdmVyPlxuICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICB2YXJpYW50PVwib3V0bGluZVwiXG4gICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAndy1mdWxsIGp1c3RpZnktc3RhcnQgdGV4dC1sZWZ0IGZvbnQtbm9ybWFsJyxcbiAgICAgICAgICAgICAgIWRhdGUgJiYgJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCdcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPENhbGVuZGFySWNvbiBjbGFzc05hbWU9XCJtci0yIGgtNCB3LTRcIiAvPlxuICAgICAgICAgICAge2RhdGUgPyBkYXlqcyhkYXRlKS5mb3JtYXQoJ01NTSBELCBZWVlZJykgOiA8c3Bhbj57bGFiZWx9PC9zcGFuPn1cbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgPC9Qb3BvdmVyVHJpZ2dlcj5cbiAgICAgICAgPFBvcG92ZXJDb250ZW50IGNsYXNzTmFtZT1cInctYXV0byBwLTBcIiBhbGlnbj1cInN0YXJ0XCI+XG4gICAgICAgICAgPFBvcG92ZXJDbG9zZSByZWY9e3BvcE92ZXJSZWZ9IC8+XG4gICAgICAgICAgPENhbGVuZGFyXG4gICAgICAgICAgICBtb2RlPVwic2luZ2xlXCJcbiAgICAgICAgICAgIHNlbGVjdGVkPXtkYXRlfVxuICAgICAgICAgICAgb25TZWxlY3Q9e29uU2VsZWN0fVxuICAgICAgICAgICAgaW5pdGlhbEZvY3VzXG4gICAgICAgICAgLz5cbiAgICAgICAgPC9Qb3BvdmVyQ29udGVudD5cbiAgICAgIDwvUG9wb3Zlcj5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIFBvcG92ZXJQcmltaXRpdmUgZnJvbSAnQHJhZGl4LXVpL3JlYWN0LXBvcG92ZXInXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmZ1bmN0aW9uIFBvcG92ZXIoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFBvcG92ZXJQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIDxQb3BvdmVyUHJpbWl0aXZlLlJvb3QgZGF0YS1zbG90PVwicG9wb3ZlclwiIHsuLi5wcm9wc30gLz5cbn1cblxuZnVuY3Rpb24gUG9wb3ZlclRyaWdnZXIoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFBvcG92ZXJQcmltaXRpdmUuVHJpZ2dlcj4pIHtcbiAgcmV0dXJuIDxQb3BvdmVyUHJpbWl0aXZlLlRyaWdnZXIgZGF0YS1zbG90PVwicG9wb3Zlci10cmlnZ2VyXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBQb3BvdmVyQ29udGVudCh7XG4gIGNsYXNzTmFtZSxcbiAgYWxpZ24gPSAnY2VudGVyJyxcbiAgc2lkZU9mZnNldCA9IDQsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgUG9wb3ZlclByaW1pdGl2ZS5Db250ZW50Pikge1xuICByZXR1cm4gKFxuICAgIDxQb3BvdmVyUHJpbWl0aXZlLlBvcnRhbD5cbiAgICAgIDxQb3BvdmVyUHJpbWl0aXZlLkNvbnRlbnRcbiAgICAgICAgZGF0YS1zbG90PVwicG9wb3Zlci1jb250ZW50XCJcbiAgICAgICAgYWxpZ249e2FsaWdufVxuICAgICAgICBzaWRlT2Zmc2V0PXtzaWRlT2Zmc2V0fVxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdiZy1wb3BvdmVyIHRleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmZhZGUtb3V0LTAgZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wIGRhdGEtW3N0YXRlPWNsb3NlZF06em9vbS1vdXQtOTUgZGF0YS1bc3RhdGU9b3Blbl06em9vbS1pbi05NSBkYXRhLVtzaWRlPWJvdHRvbV06c2xpZGUtaW4tZnJvbS10b3AtMiBkYXRhLVtzaWRlPWxlZnRdOnNsaWRlLWluLWZyb20tcmlnaHQtMiBkYXRhLVtzaWRlPXJpZ2h0XTpzbGlkZS1pbi1mcm9tLWxlZnQtMiBkYXRhLVtzaWRlPXRvcF06c2xpZGUtaW4tZnJvbS1ib3R0b20tMiB6LTUwIHctNzIgb3JpZ2luLSgtLXJhZGl4LXBvcG92ZXItY29udGVudC10cmFuc2Zvcm0tb3JpZ2luKSByb3VuZGVkLW1kIGJvcmRlciBwLTQgc2hhZG93LW1kIG91dGxpbmUtaGlkZGVuJyxcbiAgICAgICAgICBjbGFzc05hbWVcbiAgICAgICAgKX1cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgLz5cbiAgICA8L1BvcG92ZXJQcmltaXRpdmUuUG9ydGFsPlxuICApXG59XG5cbmZ1bmN0aW9uIFBvcG92ZXJBbmNob3Ioe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFBvcG92ZXJQcmltaXRpdmUuQW5jaG9yPikge1xuICByZXR1cm4gPFBvcG92ZXJQcmltaXRpdmUuQW5jaG9yIGRhdGEtc2xvdD1cInBvcG92ZXItYW5jaG9yXCIgey4uLnByb3BzfSAvPlxufVxuXG5leHBvcnQgeyBQb3BvdmVyLCBQb3BvdmVyVHJpZ2dlciwgUG9wb3ZlckNvbnRlbnQsIFBvcG92ZXJBbmNob3IgfVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIERpYWxvZ1ByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtZGlhbG9nJ1xuaW1wb3J0IHsgWEljb24gfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmZ1bmN0aW9uIERpYWxvZyh7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRGlhbG9nUHJpbWl0aXZlLlJvb3Q+KSB7XG4gIHJldHVybiA8RGlhbG9nUHJpbWl0aXZlLlJvb3QgZGF0YS1zbG90PVwiZGlhbG9nXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBEaWFsb2dUcmlnZ2VyKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEaWFsb2dQcmltaXRpdmUuVHJpZ2dlcj4pIHtcbiAgcmV0dXJuIDxEaWFsb2dQcmltaXRpdmUuVHJpZ2dlciBkYXRhLXNsb3Q9XCJkaWFsb2ctdHJpZ2dlclwiIHsuLi5wcm9wc30gLz5cbn1cblxuZnVuY3Rpb24gRGlhbG9nUG9ydGFsKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEaWFsb2dQcmltaXRpdmUuUG9ydGFsPikge1xuICByZXR1cm4gPERpYWxvZ1ByaW1pdGl2ZS5Qb3J0YWwgZGF0YS1zbG90PVwiZGlhbG9nLXBvcnRhbFwiIHsuLi5wcm9wc30gLz5cbn1cblxuZnVuY3Rpb24gRGlhbG9nQ2xvc2Uoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERpYWxvZ1ByaW1pdGl2ZS5DbG9zZT4pIHtcbiAgcmV0dXJuIDxEaWFsb2dQcmltaXRpdmUuQ2xvc2UgZGF0YS1zbG90PVwiZGlhbG9nLWNsb3NlXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBEaWFsb2dPdmVybGF5KHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERpYWxvZ1ByaW1pdGl2ZS5PdmVybGF5Pikge1xuICByZXR1cm4gKFxuICAgIDxEaWFsb2dQcmltaXRpdmUuT3ZlcmxheVxuICAgICAgZGF0YS1zbG90PVwiZGlhbG9nLW92ZXJsYXlcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2RhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmZhZGUtb3V0LTAgZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wIGZpeGVkIGluc2V0LTAgei01MCBiZy1ibGFjay81MCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERpYWxvZ0NvbnRlbnQoe1xuICBjbGFzc05hbWUsXG4gIGNoaWxkcmVuLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERpYWxvZ1ByaW1pdGl2ZS5Db250ZW50Pikge1xuICByZXR1cm4gKFxuICAgIDxEaWFsb2dQb3J0YWwgZGF0YS1zbG90PVwiZGlhbG9nLXBvcnRhbFwiPlxuICAgICAgPERpYWxvZ092ZXJsYXkgLz5cbiAgICAgIDxEaWFsb2dQcmltaXRpdmUuQ29udGVudFxuICAgICAgICBkYXRhLXNsb3Q9XCJkaWFsb2ctY29udGVudFwiXG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ2JnLWJhY2tncm91bmQgZGF0YS1bc3RhdGU9b3Blbl06YW5pbWF0ZS1pbiBkYXRhLVtzdGF0ZT1jbG9zZWRdOmFuaW1hdGUtb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZmFkZS1vdXQtMCBkYXRhLVtzdGF0ZT1vcGVuXTpmYWRlLWluLTAgZGF0YS1bc3RhdGU9Y2xvc2VkXTp6b29tLW91dC05NSBkYXRhLVtzdGF0ZT1vcGVuXTp6b29tLWluLTk1IGZpeGVkIHRvcC1bNTAlXSBsZWZ0LVs1MCVdIHotNTAgZ3JpZCB3LWZ1bGwgbWF4LXctW2NhbGMoMTAwJS0ycmVtKV0gdHJhbnNsYXRlLXgtWy01MCVdIHRyYW5zbGF0ZS15LVstNTAlXSBnYXAtNCByb3VuZGVkLWxnIGJvcmRlciBwLTYgc2hhZG93LWxnIGR1cmF0aW9uLTIwMCBzbTptYXgtdy1sZycsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgID5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8RGlhbG9nUHJpbWl0aXZlLkNsb3NlIGNsYXNzTmFtZT1cInJpbmctb2Zmc2V0LWJhY2tncm91bmQgZm9jdXM6cmluZy1yaW5nIGRhdGEtW3N0YXRlPW9wZW5dOmJnLWFjY2VudCBkYXRhLVtzdGF0ZT1vcGVuXTp0ZXh0LW11dGVkLWZvcmVncm91bmQgYWJzb2x1dGUgdG9wLTQgcmlnaHQtNCByb3VuZGVkLXhzIG9wYWNpdHktNzAgdHJhbnNpdGlvbi1vcGFjaXR5IGhvdmVyOm9wYWNpdHktMTAwIGZvY3VzOnJpbmctMiBmb2N1czpyaW5nLW9mZnNldC0yIGZvY3VzOm91dGxpbmUtaGlkZGVuIGRpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpwb2ludGVyLWV2ZW50cy1ub25lIFsmX3N2Z106c2hyaW5rLTAgWyZfc3ZnOm5vdChbY2xhc3MqPSdzaXplLSddKV06c2l6ZS00XCI+XG4gICAgICAgICAgPFhJY29uIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwic3Itb25seVwiPkNsb3NlPC9zcGFuPlxuICAgICAgICA8L0RpYWxvZ1ByaW1pdGl2ZS5DbG9zZT5cbiAgICAgIDwvRGlhbG9nUHJpbWl0aXZlLkNvbnRlbnQ+XG4gICAgPC9EaWFsb2dQb3J0YWw+XG4gIClcbn1cblxuZnVuY3Rpb24gRGlhbG9nSGVhZGVyKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczwnZGl2Jz4pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBkYXRhLXNsb3Q9XCJkaWFsb2ctaGVhZGVyXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ2ZsZXggZmxleC1jb2wgZ2FwLTIgdGV4dC1jZW50ZXIgc206dGV4dC1sZWZ0JywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERpYWxvZ0Zvb3Rlcih7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2Rpdic+KSB7XG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgZGF0YS1zbG90PVwiZGlhbG9nLWZvb3RlclwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZmxleCBmbGV4LWNvbC1yZXZlcnNlIGdhcC0yIHNtOmZsZXgtcm93IHNtOmp1c3RpZnktZW5kJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRGlhbG9nVGl0bGUoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRGlhbG9nUHJpbWl0aXZlLlRpdGxlPikge1xuICByZXR1cm4gKFxuICAgIDxEaWFsb2dQcmltaXRpdmUuVGl0bGVcbiAgICAgIGRhdGEtc2xvdD1cImRpYWxvZy10aXRsZVwiXG4gICAgICBjbGFzc05hbWU9e2NuKCd0ZXh0LWxnIGxlYWRpbmctbm9uZSBmb250LXNlbWlib2xkJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERpYWxvZ0Rlc2NyaXB0aW9uKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERpYWxvZ1ByaW1pdGl2ZS5EZXNjcmlwdGlvbj4pIHtcbiAgcmV0dXJuIChcbiAgICA8RGlhbG9nUHJpbWl0aXZlLkRlc2NyaXB0aW9uXG4gICAgICBkYXRhLXNsb3Q9XCJkaWFsb2ctZGVzY3JpcHRpb25cIlxuICAgICAgY2xhc3NOYW1lPXtjbigndGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRleHQtc20nLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IHtcbiAgRGlhbG9nLFxuICBEaWFsb2dDbG9zZSxcbiAgRGlhbG9nQ29udGVudCxcbiAgRGlhbG9nRGVzY3JpcHRpb24sXG4gIERpYWxvZ0Zvb3RlcixcbiAgRGlhbG9nSGVhZGVyLFxuICBEaWFsb2dPdmVybGF5LFxuICBEaWFsb2dQb3J0YWwsXG4gIERpYWxvZ1RpdGxlLFxuICBEaWFsb2dUcmlnZ2VyLFxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIERyb3Bkb3duTWVudVByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtZHJvcGRvd24tbWVudSdcbmltcG9ydCB7IENoZWNrSWNvbiwgQ2hldnJvblJpZ2h0SWNvbiwgQ2lyY2xlSWNvbiB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gRHJvcGRvd25NZW51KHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuUm9vdCBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51XCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVQb3J0YWwoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERyb3Bkb3duTWVudVByaW1pdGl2ZS5Qb3J0YWw+KSB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duTWVudVByaW1pdGl2ZS5Qb3J0YWwgZGF0YS1zbG90PVwiZHJvcGRvd24tbWVudS1wb3J0YWxcIiB7Li4ucHJvcHN9IC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRHJvcGRvd25NZW51VHJpZ2dlcih7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLlRyaWdnZXI+KSB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duTWVudVByaW1pdGl2ZS5UcmlnZ2VyXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXRyaWdnZXJcIlxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRHJvcGRvd25NZW51Q29udGVudCh7XG4gIGNsYXNzTmFtZSxcbiAgc2lkZU9mZnNldCA9IDQsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLkNvbnRlbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duTWVudVByaW1pdGl2ZS5Qb3J0YWw+XG4gICAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLkNvbnRlbnRcbiAgICAgICAgZGF0YS1zbG90PVwiZHJvcGRvd24tbWVudS1jb250ZW50XCJcbiAgICAgICAgc2lkZU9mZnNldD17c2lkZU9mZnNldH1cbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAnYmctcG9wb3ZlciB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBkYXRhLVtzdGF0ZT1vcGVuXTphbmltYXRlLWluIGRhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1vdXQgZGF0YS1bc3RhdGU9Y2xvc2VkXTpmYWRlLW91dC0wIGRhdGEtW3N0YXRlPW9wZW5dOmZhZGUtaW4tMCBkYXRhLVtzdGF0ZT1jbG9zZWRdOnpvb20tb3V0LTk1IGRhdGEtW3N0YXRlPW9wZW5dOnpvb20taW4tOTUgZGF0YS1bc2lkZT1ib3R0b21dOnNsaWRlLWluLWZyb20tdG9wLTIgZGF0YS1bc2lkZT1sZWZ0XTpzbGlkZS1pbi1mcm9tLXJpZ2h0LTIgZGF0YS1bc2lkZT1yaWdodF06c2xpZGUtaW4tZnJvbS1sZWZ0LTIgZGF0YS1bc2lkZT10b3BdOnNsaWRlLWluLWZyb20tYm90dG9tLTIgei01MCBtYXgtaC0oLS1yYWRpeC1kcm9wZG93bi1tZW51LWNvbnRlbnQtYXZhaWxhYmxlLWhlaWdodCkgbWluLXctWzhyZW1dIG9yaWdpbi0oLS1yYWRpeC1kcm9wZG93bi1tZW51LWNvbnRlbnQtdHJhbnNmb3JtLW9yaWdpbikgb3ZlcmZsb3cteC1oaWRkZW4gb3ZlcmZsb3cteS1hdXRvIHJvdW5kZWQtbWQgYm9yZGVyIHAtMSBzaGFkb3ctbWQnLFxuICAgICAgICAgIGNsYXNzTmFtZVxuICAgICAgICApfVxuICAgICAgICB7Li4ucHJvcHN9XG4gICAgICAvPlxuICAgIDwvRHJvcGRvd25NZW51UHJpbWl0aXZlLlBvcnRhbD5cbiAgKVxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVHcm91cCh7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLkdyb3VwPikge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuR3JvdXAgZGF0YS1zbG90PVwiZHJvcGRvd24tbWVudS1ncm91cFwiIHsuLi5wcm9wc30gLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVJdGVtKHtcbiAgY2xhc3NOYW1lLFxuICBpbnNldCxcbiAgdmFyaWFudCA9ICdkZWZhdWx0JyxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuSXRlbT4gJiB7XG4gIGluc2V0PzogYm9vbGVhblxuICB2YXJpYW50PzogJ2RlZmF1bHQnIHwgJ2Rlc3RydWN0aXZlJ1xufSkge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuSXRlbVxuICAgICAgZGF0YS1zbG90PVwiZHJvcGRvd24tbWVudS1pdGVtXCJcbiAgICAgIGRhdGEtaW5zZXQ9e2luc2V0fVxuICAgICAgZGF0YS12YXJpYW50PXt2YXJpYW50fVxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgXCJmb2N1czpiZy1hY2NlbnQgZm9jdXM6dGV4dC1hY2NlbnQtZm9yZWdyb3VuZCBkYXRhLVt2YXJpYW50PWRlc3RydWN0aXZlXTp0ZXh0LWRlc3RydWN0aXZlIGRhdGEtW3ZhcmlhbnQ9ZGVzdHJ1Y3RpdmVdOmZvY3VzOmJnLWRlc3RydWN0aXZlLzEwIGRhcms6ZGF0YS1bdmFyaWFudD1kZXN0cnVjdGl2ZV06Zm9jdXM6YmctZGVzdHJ1Y3RpdmUvMjAgZGF0YS1bdmFyaWFudD1kZXN0cnVjdGl2ZV06Zm9jdXM6dGV4dC1kZXN0cnVjdGl2ZSBkYXRhLVt2YXJpYW50PWRlc3RydWN0aXZlXToqOltzdmddOiF0ZXh0LWRlc3RydWN0aXZlIFsmX3N2Zzpub3QoW2NsYXNzKj0ndGV4dC0nXSldOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCByZWxhdGl2ZSBmbGV4IGN1cnNvci1kZWZhdWx0IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLXNtIHB4LTIgcHktMS41IHRleHQtc20gb3V0bGluZS1oaWRkZW4gc2VsZWN0LW5vbmUgZGF0YS1bZGlzYWJsZWRdOnBvaW50ZXItZXZlbnRzLW5vbmUgZGF0YS1bZGlzYWJsZWRdOm9wYWNpdHktNTAgZGF0YS1baW5zZXRdOnBsLTggWyZfc3ZnXTpwb2ludGVyLWV2ZW50cy1ub25lIFsmX3N2Z106c2hyaW5rLTAgWyZfc3ZnOm5vdChbY2xhc3MqPSdzaXplLSddKV06c2l6ZS00XCIsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudUNoZWNrYm94SXRlbSh7XG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIGNoZWNrZWQsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLkNoZWNrYm94SXRlbT4pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLkNoZWNrYm94SXRlbVxuICAgICAgZGF0YS1zbG90PVwiZHJvcGRvd24tbWVudS1jaGVja2JveC1pdGVtXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgIFwiZm9jdXM6YmctYWNjZW50IGZvY3VzOnRleHQtYWNjZW50LWZvcmVncm91bmQgcmVsYXRpdmUgZmxleCBjdXJzb3ItZGVmYXVsdCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1zbSBweS0xLjUgcHItMiBwbC04IHRleHQtc20gb3V0bGluZS1oaWRkZW4gc2VsZWN0LW5vbmUgZGF0YS1bZGlzYWJsZWRdOnBvaW50ZXItZXZlbnRzLW5vbmUgZGF0YS1bZGlzYWJsZWRdOm9wYWNpdHktNTAgWyZfc3ZnXTpwb2ludGVyLWV2ZW50cy1ub25lIFsmX3N2Z106c2hyaW5rLTAgWyZfc3ZnOm5vdChbY2xhc3MqPSdzaXplLSddKV06c2l6ZS00XCIsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIGNoZWNrZWQ9e2NoZWNrZWR9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgPlxuICAgICAgPHNwYW4gY2xhc3NOYW1lPVwicG9pbnRlci1ldmVudHMtbm9uZSBhYnNvbHV0ZSBsZWZ0LTIgZmxleCBzaXplLTMuNSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgPERyb3Bkb3duTWVudVByaW1pdGl2ZS5JdGVtSW5kaWNhdG9yPlxuICAgICAgICAgIDxDaGVja0ljb24gY2xhc3NOYW1lPVwic2l6ZS00XCIgLz5cbiAgICAgICAgPC9Ecm9wZG93bk1lbnVQcmltaXRpdmUuSXRlbUluZGljYXRvcj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIHtjaGlsZHJlbn1cbiAgICA8L0Ryb3Bkb3duTWVudVByaW1pdGl2ZS5DaGVja2JveEl0ZW0+XG4gIClcbn1cblxuZnVuY3Rpb24gRHJvcGRvd25NZW51UmFkaW9Hcm91cCh7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLlJhZGlvR3JvdXA+KSB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duTWVudVByaW1pdGl2ZS5SYWRpb0dyb3VwXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXJhZGlvLWdyb3VwXCJcbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudVJhZGlvSXRlbSh7XG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLlJhZGlvSXRlbT4pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlJhZGlvSXRlbVxuICAgICAgZGF0YS1zbG90PVwiZHJvcGRvd24tbWVudS1yYWRpby1pdGVtXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgIFwiZm9jdXM6YmctYWNjZW50IGZvY3VzOnRleHQtYWNjZW50LWZvcmVncm91bmQgcmVsYXRpdmUgZmxleCBjdXJzb3ItZGVmYXVsdCBpdGVtcy1jZW50ZXIgZ2FwLTIgcm91bmRlZC1zbSBweS0xLjUgcHItMiBwbC04IHRleHQtc20gb3V0bGluZS1oaWRkZW4gc2VsZWN0LW5vbmUgZGF0YS1bZGlzYWJsZWRdOnBvaW50ZXItZXZlbnRzLW5vbmUgZGF0YS1bZGlzYWJsZWRdOm9wYWNpdHktNTAgWyZfc3ZnXTpwb2ludGVyLWV2ZW50cy1ub25lIFsmX3N2Z106c2hyaW5rLTAgWyZfc3ZnOm5vdChbY2xhc3MqPSdzaXplLSddKV06c2l6ZS00XCIsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICA+XG4gICAgICA8c3BhbiBjbGFzc05hbWU9XCJwb2ludGVyLWV2ZW50cy1ub25lIGFic29sdXRlIGxlZnQtMiBmbGV4IHNpemUtMy41IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLkl0ZW1JbmRpY2F0b3I+XG4gICAgICAgICAgPENpcmNsZUljb24gY2xhc3NOYW1lPVwic2l6ZS0yIGZpbGwtY3VycmVudFwiIC8+XG4gICAgICAgIDwvRHJvcGRvd25NZW51UHJpbWl0aXZlLkl0ZW1JbmRpY2F0b3I+XG4gICAgICA8L3NwYW4+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9Ecm9wZG93bk1lbnVQcmltaXRpdmUuUmFkaW9JdGVtPlxuICApXG59XG5cbmZ1bmN0aW9uIERyb3Bkb3duTWVudUxhYmVsKHtcbiAgY2xhc3NOYW1lLFxuICBpbnNldCxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBEcm9wZG93bk1lbnVQcmltaXRpdmUuTGFiZWw+ICYge1xuICBpbnNldD86IGJvb2xlYW5cbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLkxhYmVsXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LWxhYmVsXCJcbiAgICAgIGRhdGEtaW5zZXQ9e2luc2V0fVxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ3B4LTIgcHktMS41IHRleHQtc20gZm9udC1tZWRpdW0gZGF0YS1baW5zZXRdOnBsLTgnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVTZXBhcmF0b3Ioe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgRHJvcGRvd25NZW51UHJpbWl0aXZlLlNlcGFyYXRvcj4pIHtcbiAgcmV0dXJuIChcbiAgICA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlNlcGFyYXRvclxuICAgICAgZGF0YS1zbG90PVwiZHJvcGRvd24tbWVudS1zZXBhcmF0b3JcIlxuICAgICAgY2xhc3NOYW1lPXtjbignYmctYm9yZGVyIC1teC0xIG15LTEgaC1weCcsIGNsYXNzTmFtZSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVTaG9ydGN1dCh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdzcGFuJz4pIHtcbiAgcmV0dXJuIChcbiAgICA8c3BhblxuICAgICAgZGF0YS1zbG90PVwiZHJvcGRvd24tbWVudS1zaG9ydGN1dFwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAndGV4dC1tdXRlZC1mb3JlZ3JvdW5kIG1sLWF1dG8gdGV4dC14cyB0cmFja2luZy13aWRlc3QnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVTdWIoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERyb3Bkb3duTWVudVByaW1pdGl2ZS5TdWI+KSB7XG4gIHJldHVybiA8RHJvcGRvd25NZW51UHJpbWl0aXZlLlN1YiBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXN1YlwiIHsuLi5wcm9wc30gLz5cbn1cblxuZnVuY3Rpb24gRHJvcGRvd25NZW51U3ViVHJpZ2dlcih7XG4gIGNsYXNzTmFtZSxcbiAgaW5zZXQsXG4gIGNoaWxkcmVuLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERyb3Bkb3duTWVudVByaW1pdGl2ZS5TdWJUcmlnZ2VyPiAmIHtcbiAgaW5zZXQ/OiBib29sZWFuXG59KSB7XG4gIHJldHVybiAoXG4gICAgPERyb3Bkb3duTWVudVByaW1pdGl2ZS5TdWJUcmlnZ2VyXG4gICAgICBkYXRhLXNsb3Q9XCJkcm9wZG93bi1tZW51LXN1Yi10cmlnZ2VyXCJcbiAgICAgIGRhdGEtaW5zZXQ9e2luc2V0fVxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2ZvY3VzOmJnLWFjY2VudCBmb2N1czp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIGRhdGEtW3N0YXRlPW9wZW5dOmJnLWFjY2VudCBkYXRhLVtzdGF0ZT1vcGVuXTp0ZXh0LWFjY2VudC1mb3JlZ3JvdW5kIGZsZXggY3Vyc29yLWRlZmF1bHQgaXRlbXMtY2VudGVyIHJvdW5kZWQtc20gcHgtMiBweS0xLjUgdGV4dC1zbSBvdXRsaW5lLWhpZGRlbiBzZWxlY3Qtbm9uZSBkYXRhLVtpbnNldF06cGwtOCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICA8Q2hldnJvblJpZ2h0SWNvbiBjbGFzc05hbWU9XCJtbC1hdXRvIHNpemUtNFwiIC8+XG4gICAgPC9Ecm9wZG93bk1lbnVQcmltaXRpdmUuU3ViVHJpZ2dlcj5cbiAgKVxufVxuXG5mdW5jdGlvbiBEcm9wZG93bk1lbnVTdWJDb250ZW50KHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIERyb3Bkb3duTWVudVByaW1pdGl2ZS5TdWJDb250ZW50Pikge1xuICByZXR1cm4gKFxuICAgIDxEcm9wZG93bk1lbnVQcmltaXRpdmUuU3ViQ29udGVudFxuICAgICAgZGF0YS1zbG90PVwiZHJvcGRvd24tbWVudS1zdWItY29udGVudFwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnYmctcG9wb3ZlciB0ZXh0LXBvcG92ZXItZm9yZWdyb3VuZCBkYXRhLVtzdGF0ZT1vcGVuXTphbmltYXRlLWluIGRhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1vdXQgZGF0YS1bc3RhdGU9Y2xvc2VkXTpmYWRlLW91dC0wIGRhdGEtW3N0YXRlPW9wZW5dOmZhZGUtaW4tMCBkYXRhLVtzdGF0ZT1jbG9zZWRdOnpvb20tb3V0LTk1IGRhdGEtW3N0YXRlPW9wZW5dOnpvb20taW4tOTUgZGF0YS1bc2lkZT1ib3R0b21dOnNsaWRlLWluLWZyb20tdG9wLTIgZGF0YS1bc2lkZT1sZWZ0XTpzbGlkZS1pbi1mcm9tLXJpZ2h0LTIgZGF0YS1bc2lkZT1yaWdodF06c2xpZGUtaW4tZnJvbS1sZWZ0LTIgZGF0YS1bc2lkZT10b3BdOnNsaWRlLWluLWZyb20tYm90dG9tLTIgei01MCBtaW4tdy1bOHJlbV0gb3JpZ2luLSgtLXJhZGl4LWRyb3Bkb3duLW1lbnUtY29udGVudC10cmFuc2Zvcm0tb3JpZ2luKSBvdmVyZmxvdy1jbGlwIHJvdW5kZWQtbWQgYm9yZGVyIHAtMSBzaGFkb3ctbGcnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQge1xuICBEcm9wZG93bk1lbnUsXG4gIERyb3Bkb3duTWVudVBvcnRhbCxcbiAgRHJvcGRvd25NZW51VHJpZ2dlcixcbiAgRHJvcGRvd25NZW51Q29udGVudCxcbiAgRHJvcGRvd25NZW51R3JvdXAsXG4gIERyb3Bkb3duTWVudUxhYmVsLFxuICBEcm9wZG93bk1lbnVJdGVtLFxuICBEcm9wZG93bk1lbnVDaGVja2JveEl0ZW0sXG4gIERyb3Bkb3duTWVudVJhZGlvR3JvdXAsXG4gIERyb3Bkb3duTWVudVJhZGlvSXRlbSxcbiAgRHJvcGRvd25NZW51U2VwYXJhdG9yLFxuICBEcm9wZG93bk1lbnVTaG9ydGN1dCxcbiAgRHJvcGRvd25NZW51U3ViLFxuICBEcm9wZG93bk1lbnVTdWJUcmlnZ2VyLFxuICBEcm9wZG93bk1lbnVTdWJDb250ZW50LFxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB0eXBlICogYXMgTGFiZWxQcmltaXRpdmUgZnJvbSAnQHJhZGl4LXVpL3JlYWN0LWxhYmVsJ1xuaW1wb3J0IHsgU2xvdCB9IGZyb20gJ0ByYWRpeC11aS9yZWFjdC1zbG90J1xuaW1wb3J0IHtcbiAgQ29udHJvbGxlcixcbiAgRm9ybVByb3ZpZGVyLFxuICB1c2VGb3JtQ29udGV4dCxcbiAgdXNlRm9ybVN0YXRlLFxuICB0eXBlIENvbnRyb2xsZXJQcm9wcyxcbiAgdHlwZSBGaWVsZFBhdGgsXG4gIHR5cGUgRmllbGRWYWx1ZXMsXG59IGZyb20gJ3JlYWN0LWhvb2stZm9ybSdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCB7IExhYmVsIH0gZnJvbSAnQC9jb21wb25lbnRzL3VpL2xhYmVsJ1xuXG5jb25zdCBGb3JtID0gRm9ybVByb3ZpZGVyXG5cbnR5cGUgRm9ybUZpZWxkQ29udGV4dFZhbHVlPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+ID0ge1xuICBuYW1lOiBUTmFtZVxufVxuXG5jb25zdCBGb3JtRmllbGRDb250ZXh0ID0gUmVhY3QuY3JlYXRlQ29udGV4dDxGb3JtRmllbGRDb250ZXh0VmFsdWU+KFxuICB7fSBhcyBGb3JtRmllbGRDb250ZXh0VmFsdWVcbilcblxuY29uc3QgRm9ybUZpZWxkID0gPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4+KHtcbiAgLi4ucHJvcHNcbn06IENvbnRyb2xsZXJQcm9wczxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4ge1xuICByZXR1cm4gKFxuICAgIDxGb3JtRmllbGRDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7IG5hbWU6IHByb3BzLm5hbWUgfX0+XG4gICAgICA8Q29udHJvbGxlciB7Li4ucHJvcHN9IC8+XG4gICAgPC9Gb3JtRmllbGRDb250ZXh0LlByb3ZpZGVyPlxuICApXG59XG5cbmNvbnN0IHVzZUZvcm1GaWVsZCA9ICgpID0+IHtcbiAgY29uc3QgZmllbGRDb250ZXh0ID0gUmVhY3QudXNlQ29udGV4dChGb3JtRmllbGRDb250ZXh0KVxuICBjb25zdCBpdGVtQ29udGV4dCA9IFJlYWN0LnVzZUNvbnRleHQoRm9ybUl0ZW1Db250ZXh0KVxuICBjb25zdCB7IGdldEZpZWxkU3RhdGUgfSA9IHVzZUZvcm1Db250ZXh0KClcbiAgY29uc3QgZm9ybVN0YXRlID0gdXNlRm9ybVN0YXRlKHsgbmFtZTogZmllbGRDb250ZXh0Lm5hbWUgfSlcbiAgY29uc3QgZmllbGRTdGF0ZSA9IGdldEZpZWxkU3RhdGUoZmllbGRDb250ZXh0Lm5hbWUsIGZvcm1TdGF0ZSlcblxuICBpZiAoIWZpZWxkQ29udGV4dCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlRm9ybUZpZWxkIHNob3VsZCBiZSB1c2VkIHdpdGhpbiA8Rm9ybUZpZWxkPicpXG4gIH1cblxuICBjb25zdCB7IGlkIH0gPSBpdGVtQ29udGV4dFxuXG4gIHJldHVybiB7XG4gICAgaWQsXG4gICAgbmFtZTogZmllbGRDb250ZXh0Lm5hbWUsXG4gICAgZm9ybUl0ZW1JZDogYCR7aWR9LWZvcm0taXRlbWAsXG4gICAgZm9ybURlc2NyaXB0aW9uSWQ6IGAke2lkfS1mb3JtLWl0ZW0tZGVzY3JpcHRpb25gLFxuICAgIGZvcm1NZXNzYWdlSWQ6IGAke2lkfS1mb3JtLWl0ZW0tbWVzc2FnZWAsXG4gICAgLi4uZmllbGRTdGF0ZSxcbiAgfVxufVxuXG50eXBlIEZvcm1JdGVtQ29udGV4dFZhbHVlID0ge1xuICBpZDogc3RyaW5nXG59XG5cbmNvbnN0IEZvcm1JdGVtQ29udGV4dCA9IFJlYWN0LmNyZWF0ZUNvbnRleHQ8Rm9ybUl0ZW1Db250ZXh0VmFsdWU+KFxuICB7fSBhcyBGb3JtSXRlbUNvbnRleHRWYWx1ZVxuKVxuXG5mdW5jdGlvbiBGb3JtSXRlbSh7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J2Rpdic+KSB7XG4gIGNvbnN0IGlkID0gUmVhY3QudXNlSWQoKVxuXG4gIHJldHVybiAoXG4gICAgPEZvcm1JdGVtQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17eyBpZCB9fT5cbiAgICAgIDxkaXZcbiAgICAgICAgZGF0YS1zbG90PVwiZm9ybS1pdGVtXCJcbiAgICAgICAgY2xhc3NOYW1lPXtjbignZ3JpZCBnYXAtMicsIGNsYXNzTmFtZSl9XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgIC8+XG4gICAgPC9Gb3JtSXRlbUNvbnRleHQuUHJvdmlkZXI+XG4gIClcbn1cblxuZnVuY3Rpb24gRm9ybUxhYmVsKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIExhYmVsUHJpbWl0aXZlLlJvb3Q+KSB7XG4gIGNvbnN0IHsgZXJyb3IsIGZvcm1JdGVtSWQgfSA9IHVzZUZvcm1GaWVsZCgpXG5cbiAgcmV0dXJuIChcbiAgICA8TGFiZWxcbiAgICAgIGRhdGEtc2xvdD1cImZvcm0tbGFiZWxcIlxuICAgICAgZGF0YS1lcnJvcj17ISFlcnJvcn1cbiAgICAgIGNsYXNzTmFtZT17Y24oJ2RhdGEtW2Vycm9yPXRydWVdOnRleHQtZGVzdHJ1Y3RpdmUnLCBjbGFzc05hbWUpfVxuICAgICAgaHRtbEZvcj17Zm9ybUl0ZW1JZH1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIEZvcm1Db250cm9sKHsgLi4ucHJvcHMgfTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNsb3Q+KSB7XG4gIGNvbnN0IHsgZXJyb3IsIGZvcm1JdGVtSWQsIGZvcm1EZXNjcmlwdGlvbklkLCBmb3JtTWVzc2FnZUlkIH0gPSB1c2VGb3JtRmllbGQoKVxuXG4gIHJldHVybiAoXG4gICAgPFNsb3RcbiAgICAgIGRhdGEtc2xvdD1cImZvcm0tY29udHJvbFwiXG4gICAgICBpZD17Zm9ybUl0ZW1JZH1cbiAgICAgIGFyaWEtZGVzY3JpYmVkYnk9e1xuICAgICAgICAhZXJyb3JcbiAgICAgICAgICA/IGAke2Zvcm1EZXNjcmlwdGlvbklkfWBcbiAgICAgICAgICA6IGAke2Zvcm1EZXNjcmlwdGlvbklkfSAke2Zvcm1NZXNzYWdlSWR9YFxuICAgICAgfVxuICAgICAgYXJpYS1pbnZhbGlkPXshIWVycm9yfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gRm9ybURlc2NyaXB0aW9uKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczwncCc+KSB7XG4gIGNvbnN0IHsgZm9ybURlc2NyaXB0aW9uSWQgfSA9IHVzZUZvcm1GaWVsZCgpXG5cbiAgcmV0dXJuIChcbiAgICA8cFxuICAgICAgZGF0YS1zbG90PVwiZm9ybS1kZXNjcmlwdGlvblwiXG4gICAgICBpZD17Zm9ybURlc2NyaXB0aW9uSWR9XG4gICAgICBjbGFzc05hbWU9e2NuKCd0ZXh0LW11dGVkLWZvcmVncm91bmQgdGV4dC1zbScsIGNsYXNzTmFtZSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBGb3JtTWVzc2FnZSh7IGNsYXNzTmFtZSwgLi4ucHJvcHMgfTogUmVhY3QuQ29tcG9uZW50UHJvcHM8J3AnPikge1xuICBjb25zdCB7IGVycm9yLCBmb3JtTWVzc2FnZUlkIH0gPSB1c2VGb3JtRmllbGQoKVxuICBjb25zdCBib2R5ID0gZXJyb3IgPyBTdHJpbmcoZXJyb3I/Lm1lc3NhZ2UgPz8gJycpIDogcHJvcHMuY2hpbGRyZW5cblxuICBpZiAoIWJvZHkpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8cFxuICAgICAgZGF0YS1zbG90PVwiZm9ybS1tZXNzYWdlXCJcbiAgICAgIGlkPXtmb3JtTWVzc2FnZUlkfVxuICAgICAgY2xhc3NOYW1lPXtjbigndGV4dC1kZXN0cnVjdGl2ZSB0ZXh0LXNtJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICA+XG4gICAgICB7Ym9keX1cbiAgICA8L3A+XG4gIClcbn1cblxuZXhwb3J0IHtcbiAgdXNlRm9ybUZpZWxkLFxuICBGb3JtLFxuICBGb3JtSXRlbSxcbiAgRm9ybUxhYmVsLFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybURlc2NyaXB0aW9uLFxuICBGb3JtTWVzc2FnZSxcbiAgRm9ybUZpZWxkLFxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgUmVhY3RfX2RlZmF1bHQgZnJvbSAncmVhY3QnO1xuXG52YXIgaXNDaGVja0JveElucHV0ID0gKGVsZW1lbnQpID0+IGVsZW1lbnQudHlwZSA9PT0gJ2NoZWNrYm94JztcblxudmFyIGlzRGF0ZU9iamVjdCA9ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlO1xuXG52YXIgaXNOdWxsT3JVbmRlZmluZWQgPSAodmFsdWUpID0+IHZhbHVlID09IG51bGw7XG5cbmNvbnN0IGlzT2JqZWN0VHlwZSA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JztcbnZhciBpc09iamVjdCA9ICh2YWx1ZSkgPT4gIWlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKSAmJlxuICAgICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJlxuICAgIGlzT2JqZWN0VHlwZSh2YWx1ZSkgJiZcbiAgICAhaXNEYXRlT2JqZWN0KHZhbHVlKTtcblxudmFyIGdldEV2ZW50VmFsdWUgPSAoZXZlbnQpID0+IGlzT2JqZWN0KGV2ZW50KSAmJiBldmVudC50YXJnZXRcbiAgICA/IGlzQ2hlY2tCb3hJbnB1dChldmVudC50YXJnZXQpXG4gICAgICAgID8gZXZlbnQudGFyZ2V0LmNoZWNrZWRcbiAgICAgICAgOiBldmVudC50YXJnZXQudmFsdWVcbiAgICA6IGV2ZW50O1xuXG52YXIgZ2V0Tm9kZVBhcmVudE5hbWUgPSAobmFtZSkgPT4gbmFtZS5zdWJzdHJpbmcoMCwgbmFtZS5zZWFyY2goL1xcLlxcZCsoXFwufCQpLykpIHx8IG5hbWU7XG5cbnZhciBpc05hbWVJbkZpZWxkQXJyYXkgPSAobmFtZXMsIG5hbWUpID0+IG5hbWVzLmhhcyhnZXROb2RlUGFyZW50TmFtZShuYW1lKSk7XG5cbnZhciBpc1BsYWluT2JqZWN0ID0gKHRlbXBPYmplY3QpID0+IHtcbiAgICBjb25zdCBwcm90b3R5cGVDb3B5ID0gdGVtcE9iamVjdC5jb25zdHJ1Y3RvciAmJiB0ZW1wT2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgICByZXR1cm4gKGlzT2JqZWN0KHByb3RvdHlwZUNvcHkpICYmIHByb3RvdHlwZUNvcHkuaGFzT3duUHJvcGVydHkoJ2lzUHJvdG90eXBlT2YnKSk7XG59O1xuXG52YXIgaXNXZWIgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgIHR5cGVvZiB3aW5kb3cuSFRNTEVsZW1lbnQgIT09ICd1bmRlZmluZWQnICYmXG4gICAgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcblxuZnVuY3Rpb24gY2xvbmVPYmplY3QoZGF0YSkge1xuICAgIGxldCBjb3B5O1xuICAgIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KGRhdGEpO1xuICAgIGNvbnN0IGlzRmlsZUxpc3RJbnN0YW5jZSA9IHR5cGVvZiBGaWxlTGlzdCAhPT0gJ3VuZGVmaW5lZCcgPyBkYXRhIGluc3RhbmNlb2YgRmlsZUxpc3QgOiBmYWxzZTtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgY29weSA9IG5ldyBEYXRlKGRhdGEpO1xuICAgIH1cbiAgICBlbHNlIGlmICghKGlzV2ViICYmIChkYXRhIGluc3RhbmNlb2YgQmxvYiB8fCBpc0ZpbGVMaXN0SW5zdGFuY2UpKSAmJlxuICAgICAgICAoaXNBcnJheSB8fCBpc09iamVjdChkYXRhKSkpIHtcbiAgICAgICAgY29weSA9IGlzQXJyYXkgPyBbXSA6IHt9O1xuICAgICAgICBpZiAoIWlzQXJyYXkgJiYgIWlzUGxhaW5PYmplY3QoZGF0YSkpIHtcbiAgICAgICAgICAgIGNvcHkgPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29weVtrZXldID0gY2xvbmVPYmplY3QoZGF0YVtrZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICByZXR1cm4gY29weTtcbn1cblxudmFyIGlzS2V5ID0gKHZhbHVlKSA9PiAvXlxcdyokLy50ZXN0KHZhbHVlKTtcblxudmFyIGlzVW5kZWZpbmVkID0gKHZhbCkgPT4gdmFsID09PSB1bmRlZmluZWQ7XG5cbnZhciBjb21wYWN0ID0gKHZhbHVlKSA9PiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLmZpbHRlcihCb29sZWFuKSA6IFtdO1xuXG52YXIgc3RyaW5nVG9QYXRoID0gKGlucHV0KSA9PiBjb21wYWN0KGlucHV0LnJlcGxhY2UoL1tcInwnXXxcXF0vZywgJycpLnNwbGl0KC9cXC58XFxbLykpO1xuXG52YXIgZ2V0ID0gKG9iamVjdCwgcGF0aCwgZGVmYXVsdFZhbHVlKSA9PiB7XG4gICAgaWYgKCFwYXRoIHx8ICFpc09iamVjdChvYmplY3QpKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IChpc0tleShwYXRoKSA/IFtwYXRoXSA6IHN0cmluZ1RvUGF0aChwYXRoKSkucmVkdWNlKChyZXN1bHQsIGtleSkgPT4gaXNOdWxsT3JVbmRlZmluZWQocmVzdWx0KSA/IHJlc3VsdCA6IHJlc3VsdFtrZXldLCBvYmplY3QpO1xuICAgIHJldHVybiBpc1VuZGVmaW5lZChyZXN1bHQpIHx8IHJlc3VsdCA9PT0gb2JqZWN0XG4gICAgICAgID8gaXNVbmRlZmluZWQob2JqZWN0W3BhdGhdKVxuICAgICAgICAgICAgPyBkZWZhdWx0VmFsdWVcbiAgICAgICAgICAgIDogb2JqZWN0W3BhdGhdXG4gICAgICAgIDogcmVzdWx0O1xufTtcblxudmFyIGlzQm9vbGVhbiA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG5cbnZhciBzZXQgPSAob2JqZWN0LCBwYXRoLCB2YWx1ZSkgPT4ge1xuICAgIGxldCBpbmRleCA9IC0xO1xuICAgIGNvbnN0IHRlbXBQYXRoID0gaXNLZXkocGF0aCkgPyBbcGF0aF0gOiBzdHJpbmdUb1BhdGgocGF0aCk7XG4gICAgY29uc3QgbGVuZ3RoID0gdGVtcFBhdGgubGVuZ3RoO1xuICAgIGNvbnN0IGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdGVtcFBhdGhbaW5kZXhdO1xuICAgICAgICBsZXQgbmV3VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSBsYXN0SW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IG9ialZhbHVlID0gb2JqZWN0W2tleV07XG4gICAgICAgICAgICBuZXdWYWx1ZSA9XG4gICAgICAgICAgICAgICAgaXNPYmplY3Qob2JqVmFsdWUpIHx8IEFycmF5LmlzQXJyYXkob2JqVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgID8gb2JqVmFsdWVcbiAgICAgICAgICAgICAgICAgICAgOiAhaXNOYU4oK3RlbXBQYXRoW2luZGV4ICsgMV0pXG4gICAgICAgICAgICAgICAgICAgICAgICA/IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHt9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nIHx8IGtleSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCBrZXkgPT09ICdwcm90b3R5cGUnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgb2JqZWN0W2tleV0gPSBuZXdWYWx1ZTtcbiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W2tleV07XG4gICAgfVxufTtcblxuY29uc3QgRVZFTlRTID0ge1xuICAgIEJMVVI6ICdibHVyJyxcbiAgICBGT0NVU19PVVQ6ICdmb2N1c291dCcsXG4gICAgQ0hBTkdFOiAnY2hhbmdlJyxcbn07XG5jb25zdCBWQUxJREFUSU9OX01PREUgPSB7XG4gICAgb25CbHVyOiAnb25CbHVyJyxcbiAgICBvbkNoYW5nZTogJ29uQ2hhbmdlJyxcbiAgICBvblN1Ym1pdDogJ29uU3VibWl0JyxcbiAgICBvblRvdWNoZWQ6ICdvblRvdWNoZWQnLFxuICAgIGFsbDogJ2FsbCcsXG59O1xuY29uc3QgSU5QVVRfVkFMSURBVElPTl9SVUxFUyA9IHtcbiAgICBtYXg6ICdtYXgnLFxuICAgIG1pbjogJ21pbicsXG4gICAgbWF4TGVuZ3RoOiAnbWF4TGVuZ3RoJyxcbiAgICBtaW5MZW5ndGg6ICdtaW5MZW5ndGgnLFxuICAgIHBhdHRlcm46ICdwYXR0ZXJuJyxcbiAgICByZXF1aXJlZDogJ3JlcXVpcmVkJyxcbiAgICB2YWxpZGF0ZTogJ3ZhbGlkYXRlJyxcbn07XG5cbmNvbnN0IEhvb2tGb3JtQ29udGV4dCA9IFJlYWN0X19kZWZhdWx0LmNyZWF0ZUNvbnRleHQobnVsbCk7XG5Ib29rRm9ybUNvbnRleHQuZGlzcGxheU5hbWUgPSAnSG9va0Zvcm1Db250ZXh0Jztcbi8qKlxuICogVGhpcyBjdXN0b20gaG9vayBhbGxvd3MgeW91IHRvIGFjY2VzcyB0aGUgZm9ybSBjb250ZXh0LiB1c2VGb3JtQ29udGV4dCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGRlZXBseSBuZXN0ZWQgc3RydWN0dXJlcywgd2hlcmUgaXQgd291bGQgYmVjb21lIGluY29udmVuaWVudCB0byBwYXNzIHRoZSBjb250ZXh0IGFzIGEgcHJvcC4gVG8gYmUgdXNlZCB3aXRoIHtAbGluayBGb3JtUHJvdmlkZXJ9LlxuICpcbiAqIEByZW1hcmtzXG4gKiBbQVBJXShodHRwczovL3JlYWN0LWhvb2stZm9ybS5jb20vZG9jcy91c2Vmb3JtY29udGV4dCkg4oCiIFtEZW1vXShodHRwczovL2NvZGVzYW5kYm94LmlvL3MvcmVhY3QtaG9vay1mb3JtLXY3LWZvcm0tY29udGV4dC15dHVkaSlcbiAqXG4gKiBAcmV0dXJucyByZXR1cm4gYWxsIHVzZUZvcm0gbWV0aG9kc1xuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFwcCgpIHtcbiAqICAgY29uc3QgbWV0aG9kcyA9IHVzZUZvcm0oKTtcbiAqICAgY29uc3Qgb25TdWJtaXQgPSBkYXRhID0+IGNvbnNvbGUubG9nKGRhdGEpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8Rm9ybVByb3ZpZGVyIHsuLi5tZXRob2RzfSA+XG4gKiAgICAgICA8Zm9ybSBvblN1Ym1pdD17bWV0aG9kcy5oYW5kbGVTdWJtaXQob25TdWJtaXQpfT5cbiAqICAgICAgICAgPE5lc3RlZElucHV0IC8+XG4gKiAgICAgICAgIDxpbnB1dCB0eXBlPVwic3VibWl0XCIgLz5cbiAqICAgICAgIDwvZm9ybT5cbiAqICAgICA8L0Zvcm1Qcm92aWRlcj5cbiAqICAgKTtcbiAqIH1cbiAqXG4gKiAgZnVuY3Rpb24gTmVzdGVkSW5wdXQoKSB7XG4gKiAgIGNvbnN0IHsgcmVnaXN0ZXIgfSA9IHVzZUZvcm1Db250ZXh0KCk7IC8vIHJldHJpZXZlIGFsbCBob29rIG1ldGhvZHNcbiAqICAgcmV0dXJuIDxpbnB1dCB7Li4ucmVnaXN0ZXIoXCJ0ZXN0XCIpfSAvPjtcbiAqIH1cbiAqIGBgYFxuICovXG5jb25zdCB1c2VGb3JtQ29udGV4dCA9ICgpID0+IFJlYWN0X19kZWZhdWx0LnVzZUNvbnRleHQoSG9va0Zvcm1Db250ZXh0KTtcbi8qKlxuICogQSBwcm92aWRlciBjb21wb25lbnQgdGhhdCBwcm9wYWdhdGVzIHRoZSBgdXNlRm9ybWAgbWV0aG9kcyB0byBhbGwgY2hpbGRyZW4gY29tcG9uZW50cyB2aWEgW1JlYWN0IENvbnRleHRdKGh0dHBzOi8vcmVhY3Rqcy5vcmcvZG9jcy9jb250ZXh0Lmh0bWwpIEFQSS4gVG8gYmUgdXNlZCB3aXRoIHtAbGluayB1c2VGb3JtQ29udGV4dH0uXG4gKlxuICogQHJlbWFya3NcbiAqIFtBUEldKGh0dHBzOi8vcmVhY3QtaG9vay1mb3JtLmNvbS9kb2NzL3VzZWZvcm1jb250ZXh0KSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy9yZWFjdC1ob29rLWZvcm0tdjctZm9ybS1jb250ZXh0LXl0dWRpKVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIGFsbCB1c2VGb3JtIG1ldGhvZHNcbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBBcHAoKSB7XG4gKiAgIGNvbnN0IG1ldGhvZHMgPSB1c2VGb3JtKCk7XG4gKiAgIGNvbnN0IG9uU3VibWl0ID0gZGF0YSA9PiBjb25zb2xlLmxvZyhkYXRhKTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPEZvcm1Qcm92aWRlciB7Li4ubWV0aG9kc30gPlxuICogICAgICAgPGZvcm0gb25TdWJtaXQ9e21ldGhvZHMuaGFuZGxlU3VibWl0KG9uU3VibWl0KX0+XG4gKiAgICAgICAgIDxOZXN0ZWRJbnB1dCAvPlxuICogICAgICAgICA8aW5wdXQgdHlwZT1cInN1Ym1pdFwiIC8+XG4gKiAgICAgICA8L2Zvcm0+XG4gKiAgICAgPC9Gb3JtUHJvdmlkZXI+XG4gKiAgICk7XG4gKiB9XG4gKlxuICogIGZ1bmN0aW9uIE5lc3RlZElucHV0KCkge1xuICogICBjb25zdCB7IHJlZ2lzdGVyIH0gPSB1c2VGb3JtQ29udGV4dCgpOyAvLyByZXRyaWV2ZSBhbGwgaG9vayBtZXRob2RzXG4gKiAgIHJldHVybiA8aW5wdXQgey4uLnJlZ2lzdGVyKFwidGVzdFwiKX0gLz47XG4gKiB9XG4gKiBgYGBcbiAqL1xuY29uc3QgRm9ybVByb3ZpZGVyID0gKHByb3BzKSA9PiB7XG4gICAgY29uc3QgeyBjaGlsZHJlbiwgLi4uZGF0YSB9ID0gcHJvcHM7XG4gICAgcmV0dXJuIChSZWFjdF9fZGVmYXVsdC5jcmVhdGVFbGVtZW50KEhvb2tGb3JtQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogZGF0YSB9LCBjaGlsZHJlbikpO1xufTtcblxudmFyIGdldFByb3h5Rm9ybVN0YXRlID0gKGZvcm1TdGF0ZSwgY29udHJvbCwgbG9jYWxQcm94eUZvcm1TdGF0ZSwgaXNSb290ID0gdHJ1ZSkgPT4ge1xuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgZGVmYXVsdFZhbHVlczogY29udHJvbC5fZGVmYXVsdFZhbHVlcyxcbiAgICB9O1xuICAgIGZvciAoY29uc3Qga2V5IGluIGZvcm1TdGF0ZSkge1xuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVzdWx0LCBrZXksIHtcbiAgICAgICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9rZXkgPSBrZXk7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuX3Byb3h5Rm9ybVN0YXRlW19rZXldICE9PSBWQUxJREFUSU9OX01PREUuYWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRyb2wuX3Byb3h5Rm9ybVN0YXRlW19rZXldID0gIWlzUm9vdCB8fCBWQUxJREFUSU9OX01PREUuYWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2NhbFByb3h5Rm9ybVN0YXRlICYmIChsb2NhbFByb3h5Rm9ybVN0YXRlW19rZXldID0gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1TdGF0ZVtfa2V5XTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gUmVhY3QudXNlTGF5b3V0RWZmZWN0IDogUmVhY3QudXNlRWZmZWN0O1xuXG4vKipcbiAqIFRoaXMgY3VzdG9tIGhvb2sgYWxsb3dzIHlvdSB0byBzdWJzY3JpYmUgdG8gZWFjaCBmb3JtIHN0YXRlLCBhbmQgaXNvbGF0ZSB0aGUgcmUtcmVuZGVyIGF0IHRoZSBjdXN0b20gaG9vayBsZXZlbC4gSXQgaGFzIGl0cyBzY29wZSBpbiB0ZXJtcyBvZiBmb3JtIHN0YXRlIHN1YnNjcmlwdGlvbiwgc28gaXQgd291bGQgbm90IGFmZmVjdCBvdGhlciB1c2VGb3JtU3RhdGUgYW5kIHVzZUZvcm0uIFVzaW5nIHRoaXMgaG9vayBjYW4gcmVkdWNlIHRoZSByZS1yZW5kZXIgaW1wYWN0IG9uIGxhcmdlIGFuZCBjb21wbGV4IGZvcm0gYXBwbGljYXRpb24uXG4gKlxuICogQHJlbWFya3NcbiAqIFtBUEldKGh0dHBzOi8vcmVhY3QtaG9vay1mb3JtLmNvbS9kb2NzL3VzZWZvcm1zdGF0ZSkg4oCiIFtEZW1vXShodHRwczovL2NvZGVzYW5kYm94LmlvL3MvdXNlZm9ybXN0YXRlLTc1eGx5KVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIGluY2x1ZGUgb3B0aW9ucyBvbiBzcGVjaWZ5IGZpZWxkcyB0byBzdWJzY3JpYmUuIHtAbGluayBVc2VGb3JtU3RhdGVSZXR1cm59XG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogZnVuY3Rpb24gQXBwKCkge1xuICogICBjb25zdCB7IHJlZ2lzdGVyLCBoYW5kbGVTdWJtaXQsIGNvbnRyb2wgfSA9IHVzZUZvcm0oe1xuICogICAgIGRlZmF1bHRWYWx1ZXM6IHtcbiAqICAgICBmaXJzdE5hbWU6IFwiZmlyc3ROYW1lXCJcbiAqICAgfX0pO1xuICogICBjb25zdCB7IGRpcnR5RmllbGRzIH0gPSB1c2VGb3JtU3RhdGUoe1xuICogICAgIGNvbnRyb2xcbiAqICAgfSk7XG4gKiAgIGNvbnN0IG9uU3VibWl0ID0gKGRhdGEpID0+IGNvbnNvbGUubG9nKGRhdGEpO1xuICpcbiAqICAgcmV0dXJuIChcbiAqICAgICA8Zm9ybSBvblN1Ym1pdD17aGFuZGxlU3VibWl0KG9uU3VibWl0KX0+XG4gKiAgICAgICA8aW5wdXQgey4uLnJlZ2lzdGVyKFwiZmlyc3ROYW1lXCIpfSBwbGFjZWhvbGRlcj1cIkZpcnN0IE5hbWVcIiAvPlxuICogICAgICAge2RpcnR5RmllbGRzLmZpcnN0TmFtZSAmJiA8cD5GaWVsZCBpcyBkaXJ0eS48L3A+fVxuICogICAgICAgPGlucHV0IHR5cGU9XCJzdWJtaXRcIiAvPlxuICogICAgIDwvZm9ybT5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICovXG5mdW5jdGlvbiB1c2VGb3JtU3RhdGUocHJvcHMpIHtcbiAgICBjb25zdCBtZXRob2RzID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgICBjb25zdCB7IGNvbnRyb2wgPSBtZXRob2RzLmNvbnRyb2wsIGRpc2FibGVkLCBuYW1lLCBleGFjdCB9ID0gcHJvcHMgfHwge307XG4gICAgY29uc3QgW2Zvcm1TdGF0ZSwgdXBkYXRlRm9ybVN0YXRlXSA9IFJlYWN0X19kZWZhdWx0LnVzZVN0YXRlKGNvbnRyb2wuX2Zvcm1TdGF0ZSk7XG4gICAgY29uc3QgX2xvY2FsUHJveHlGb3JtU3RhdGUgPSBSZWFjdF9fZGVmYXVsdC51c2VSZWYoe1xuICAgICAgICBpc0RpcnR5OiBmYWxzZSxcbiAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgZGlydHlGaWVsZHM6IGZhbHNlLFxuICAgICAgICB0b3VjaGVkRmllbGRzOiBmYWxzZSxcbiAgICAgICAgdmFsaWRhdGluZ0ZpZWxkczogZmFsc2UsXG4gICAgICAgIGlzVmFsaWRhdGluZzogZmFsc2UsXG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICBlcnJvcnM6IGZhbHNlLFxuICAgIH0pO1xuICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4gY29udHJvbC5fc3Vic2NyaWJlKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgZm9ybVN0YXRlOiBfbG9jYWxQcm94eUZvcm1TdGF0ZS5jdXJyZW50LFxuICAgICAgICBleGFjdCxcbiAgICAgICAgY2FsbGJhY2s6IChmb3JtU3RhdGUpID0+IHtcbiAgICAgICAgICAgICFkaXNhYmxlZCAmJlxuICAgICAgICAgICAgICAgIHVwZGF0ZUZvcm1TdGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIC4uLmNvbnRyb2wuX2Zvcm1TdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgLi4uZm9ybVN0YXRlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgIH0pLCBbbmFtZSwgZGlzYWJsZWQsIGV4YWN0XSk7XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgX2xvY2FsUHJveHlGb3JtU3RhdGUuY3VycmVudC5pc1ZhbGlkICYmIGNvbnRyb2wuX3NldFZhbGlkKHRydWUpO1xuICAgIH0sIFtjb250cm9sXSk7XG4gICAgcmV0dXJuIFJlYWN0X19kZWZhdWx0LnVzZU1lbW8oKCkgPT4gZ2V0UHJveHlGb3JtU3RhdGUoZm9ybVN0YXRlLCBjb250cm9sLCBfbG9jYWxQcm94eUZvcm1TdGF0ZS5jdXJyZW50LCBmYWxzZSksIFtmb3JtU3RhdGUsIGNvbnRyb2xdKTtcbn1cblxudmFyIGlzU3RyaW5nID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuXG52YXIgZ2VuZXJhdGVXYXRjaE91dHB1dCA9IChuYW1lcywgX25hbWVzLCBmb3JtVmFsdWVzLCBpc0dsb2JhbCwgZGVmYXVsdFZhbHVlKSA9PiB7XG4gICAgaWYgKGlzU3RyaW5nKG5hbWVzKSkge1xuICAgICAgICBpc0dsb2JhbCAmJiBfbmFtZXMud2F0Y2guYWRkKG5hbWVzKTtcbiAgICAgICAgcmV0dXJuIGdldChmb3JtVmFsdWVzLCBuYW1lcywgZGVmYXVsdFZhbHVlKTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkobmFtZXMpKSB7XG4gICAgICAgIHJldHVybiBuYW1lcy5tYXAoKGZpZWxkTmFtZSkgPT4gKGlzR2xvYmFsICYmIF9uYW1lcy53YXRjaC5hZGQoZmllbGROYW1lKSxcbiAgICAgICAgICAgIGdldChmb3JtVmFsdWVzLCBmaWVsZE5hbWUpKSk7XG4gICAgfVxuICAgIGlzR2xvYmFsICYmIChfbmFtZXMud2F0Y2hBbGwgPSB0cnVlKTtcbiAgICByZXR1cm4gZm9ybVZhbHVlcztcbn07XG5cbi8qKlxuICogQ3VzdG9tIGhvb2sgdG8gc3Vic2NyaWJlIHRvIGZpZWxkIGNoYW5nZSBhbmQgaXNvbGF0ZSByZS1yZW5kZXJpbmcgYXQgdGhlIGNvbXBvbmVudCBsZXZlbC5cbiAqXG4gKiBAcmVtYXJrc1xuICpcbiAqIFtBUEldKGh0dHBzOi8vcmVhY3QtaG9vay1mb3JtLmNvbS9kb2NzL3VzZXdhdGNoKSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy9yZWFjdC1ob29rLWZvcm0tdjctdHMtdXNld2F0Y2gtaDlpNWUpXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogY29uc3QgeyBjb250cm9sIH0gPSB1c2VGb3JtKCk7XG4gKiBjb25zdCB2YWx1ZXMgPSB1c2VXYXRjaCh7XG4gKiAgIG5hbWU6IFwiZmllbGROYW1lXCJcbiAqICAgY29udHJvbCxcbiAqIH0pXG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gdXNlV2F0Y2gocHJvcHMpIHtcbiAgICBjb25zdCBtZXRob2RzID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgICBjb25zdCB7IGNvbnRyb2wgPSBtZXRob2RzLmNvbnRyb2wsIG5hbWUsIGRlZmF1bHRWYWx1ZSwgZGlzYWJsZWQsIGV4YWN0LCB9ID0gcHJvcHMgfHwge307XG4gICAgY29uc3QgX2RlZmF1bHRWYWx1ZSA9IFJlYWN0X19kZWZhdWx0LnVzZVJlZihkZWZhdWx0VmFsdWUpO1xuICAgIGNvbnN0IFt2YWx1ZSwgdXBkYXRlVmFsdWVdID0gUmVhY3RfX2RlZmF1bHQudXNlU3RhdGUoY29udHJvbC5fZ2V0V2F0Y2gobmFtZSwgX2RlZmF1bHRWYWx1ZS5jdXJyZW50KSk7XG4gICAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiBjb250cm9sLl9zdWJzY3JpYmUoe1xuICAgICAgICBuYW1lLFxuICAgICAgICBmb3JtU3RhdGU6IHtcbiAgICAgICAgICAgIHZhbHVlczogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgZXhhY3QsXG4gICAgICAgIGNhbGxiYWNrOiAoZm9ybVN0YXRlKSA9PiAhZGlzYWJsZWQgJiZcbiAgICAgICAgICAgIHVwZGF0ZVZhbHVlKGdlbmVyYXRlV2F0Y2hPdXRwdXQobmFtZSwgY29udHJvbC5fbmFtZXMsIGZvcm1TdGF0ZS52YWx1ZXMgfHwgY29udHJvbC5fZm9ybVZhbHVlcywgZmFsc2UsIF9kZWZhdWx0VmFsdWUuY3VycmVudCkpLFxuICAgIH0pLCBbbmFtZSwgY29udHJvbCwgZGlzYWJsZWQsIGV4YWN0XSk7XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IGNvbnRyb2wuX3JlbW92ZVVubW91bnRlZCgpKTtcbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbi8qKlxuICogQ3VzdG9tIGhvb2sgdG8gd29yayB3aXRoIGNvbnRyb2xsZWQgY29tcG9uZW50LCB0aGlzIGZ1bmN0aW9uIHByb3ZpZGUgeW91IHdpdGggYm90aCBmb3JtIGFuZCBmaWVsZCBsZXZlbCBzdGF0ZS4gUmUtcmVuZGVyIGlzIGlzb2xhdGVkIGF0IHRoZSBob29rIGxldmVsLlxuICpcbiAqIEByZW1hcmtzXG4gKiBbQVBJXShodHRwczovL3JlYWN0LWhvb2stZm9ybS5jb20vZG9jcy91c2Vjb250cm9sbGVyKSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy91c2Vjb250cm9sbGVyLTBvOHB4KVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIHRoZSBwYXRoIG5hbWUgdG8gdGhlIGZvcm0gZmllbGQgdmFsdWUsIGFuZCB2YWxpZGF0aW9uIHJ1bGVzLlxuICpcbiAqIEByZXR1cm5zIGZpZWxkIHByb3BlcnRpZXMsIGZpZWxkIGFuZCBmb3JtIHN0YXRlLiB7QGxpbmsgVXNlQ29udHJvbGxlclJldHVybn1cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBJbnB1dChwcm9wcykge1xuICogICBjb25zdCB7IGZpZWxkLCBmaWVsZFN0YXRlLCBmb3JtU3RhdGUgfSA9IHVzZUNvbnRyb2xsZXIocHJvcHMpO1xuICogICByZXR1cm4gKFxuICogICAgIDxkaXY+XG4gKiAgICAgICA8aW5wdXQgey4uLmZpZWxkfSBwbGFjZWhvbGRlcj17cHJvcHMubmFtZX0gLz5cbiAqICAgICAgIDxwPntmaWVsZFN0YXRlLmlzVG91Y2hlZCAmJiBcIlRvdWNoZWRcIn08L3A+XG4gKiAgICAgICA8cD57Zm9ybVN0YXRlLmlzU3VibWl0dGVkID8gXCJzdWJtaXR0ZWRcIiA6IFwiXCJ9PC9wPlxuICogICAgIDwvZGl2PlxuICogICApO1xuICogfVxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIHVzZUNvbnRyb2xsZXIocHJvcHMpIHtcbiAgICBjb25zdCBtZXRob2RzID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgICBjb25zdCB7IG5hbWUsIGRpc2FibGVkLCBjb250cm9sID0gbWV0aG9kcy5jb250cm9sLCBzaG91bGRVbnJlZ2lzdGVyIH0gPSBwcm9wcztcbiAgICBjb25zdCBpc0FycmF5RmllbGQgPSBpc05hbWVJbkZpZWxkQXJyYXkoY29udHJvbC5fbmFtZXMuYXJyYXksIG5hbWUpO1xuICAgIGNvbnN0IHZhbHVlID0gdXNlV2F0Y2goe1xuICAgICAgICBjb250cm9sLFxuICAgICAgICBuYW1lLFxuICAgICAgICBkZWZhdWx0VmFsdWU6IGdldChjb250cm9sLl9mb3JtVmFsdWVzLCBuYW1lLCBnZXQoY29udHJvbC5fZGVmYXVsdFZhbHVlcywgbmFtZSwgcHJvcHMuZGVmYXVsdFZhbHVlKSksXG4gICAgICAgIGV4YWN0OiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IGZvcm1TdGF0ZSA9IHVzZUZvcm1TdGF0ZSh7XG4gICAgICAgIGNvbnRyb2wsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGV4YWN0OiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IF9wcm9wcyA9IFJlYWN0X19kZWZhdWx0LnVzZVJlZihwcm9wcyk7XG4gICAgY29uc3QgX3JlZ2lzdGVyUHJvcHMgPSBSZWFjdF9fZGVmYXVsdC51c2VSZWYoY29udHJvbC5yZWdpc3RlcihuYW1lLCB7XG4gICAgICAgIC4uLnByb3BzLnJ1bGVzLFxuICAgICAgICB2YWx1ZSxcbiAgICAgICAgLi4uKGlzQm9vbGVhbihwcm9wcy5kaXNhYmxlZCkgPyB7IGRpc2FibGVkOiBwcm9wcy5kaXNhYmxlZCB9IDoge30pLFxuICAgIH0pKTtcbiAgICBjb25zdCBmaWVsZFN0YXRlID0gUmVhY3RfX2RlZmF1bHQudXNlTWVtbygoKSA9PiBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh7fSwge1xuICAgICAgICBpbnZhbGlkOiB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiAoKSA9PiAhIWdldChmb3JtU3RhdGUuZXJyb3JzLCBuYW1lKSxcbiAgICAgICAgfSxcbiAgICAgICAgaXNEaXJ0eToge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogKCkgPT4gISFnZXQoZm9ybVN0YXRlLmRpcnR5RmllbGRzLCBuYW1lKSxcbiAgICAgICAgfSxcbiAgICAgICAgaXNUb3VjaGVkOiB7XG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiAoKSA9PiAhIWdldChmb3JtU3RhdGUudG91Y2hlZEZpZWxkcywgbmFtZSksXG4gICAgICAgIH0sXG4gICAgICAgIGlzVmFsaWRhdGluZzoge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogKCkgPT4gISFnZXQoZm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMsIG5hbWUpLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIGdldDogKCkgPT4gZ2V0KGZvcm1TdGF0ZS5lcnJvcnMsIG5hbWUpLFxuICAgICAgICB9LFxuICAgIH0pLCBbZm9ybVN0YXRlLCBuYW1lXSk7XG4gICAgY29uc3Qgb25DaGFuZ2UgPSBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjaygoZXZlbnQpID0+IF9yZWdpc3RlclByb3BzLmN1cnJlbnQub25DaGFuZ2Uoe1xuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICAgIHZhbHVlOiBnZXRFdmVudFZhbHVlKGV2ZW50KSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgIH0sXG4gICAgICAgIHR5cGU6IEVWRU5UUy5DSEFOR0UsXG4gICAgfSksIFtuYW1lXSk7XG4gICAgY29uc3Qgb25CbHVyID0gUmVhY3RfX2RlZmF1bHQudXNlQ2FsbGJhY2soKCkgPT4gX3JlZ2lzdGVyUHJvcHMuY3VycmVudC5vbkJsdXIoe1xuICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICAgIHZhbHVlOiBnZXQoY29udHJvbC5fZm9ybVZhbHVlcywgbmFtZSksXG4gICAgICAgICAgICBuYW1lOiBuYW1lLFxuICAgICAgICB9LFxuICAgICAgICB0eXBlOiBFVkVOVFMuQkxVUixcbiAgICB9KSwgW25hbWUsIGNvbnRyb2wuX2Zvcm1WYWx1ZXNdKTtcbiAgICBjb25zdCByZWYgPSBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjaygoZWxtKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KGNvbnRyb2wuX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCAmJiBlbG0pIHtcbiAgICAgICAgICAgIGZpZWxkLl9mLnJlZiA9IHtcbiAgICAgICAgICAgICAgICBmb2N1czogKCkgPT4gZWxtLmZvY3VzICYmIGVsbS5mb2N1cygpLFxuICAgICAgICAgICAgICAgIHNlbGVjdDogKCkgPT4gZWxtLnNlbGVjdCAmJiBlbG0uc2VsZWN0KCksXG4gICAgICAgICAgICAgICAgc2V0Q3VzdG9tVmFsaWRpdHk6IChtZXNzYWdlKSA9PiBlbG0uc2V0Q3VzdG9tVmFsaWRpdHkobWVzc2FnZSksXG4gICAgICAgICAgICAgICAgcmVwb3J0VmFsaWRpdHk6ICgpID0+IGVsbS5yZXBvcnRWYWxpZGl0eSgpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH0sIFtjb250cm9sLl9maWVsZHMsIG5hbWVdKTtcbiAgICBjb25zdCBmaWVsZCA9IFJlYWN0X19kZWZhdWx0LnVzZU1lbW8oKCkgPT4gKHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIC4uLihpc0Jvb2xlYW4oZGlzYWJsZWQpIHx8IGZvcm1TdGF0ZS5kaXNhYmxlZFxuICAgICAgICAgICAgPyB7IGRpc2FibGVkOiBmb3JtU3RhdGUuZGlzYWJsZWQgfHwgZGlzYWJsZWQgfVxuICAgICAgICAgICAgOiB7fSksXG4gICAgICAgIG9uQ2hhbmdlLFxuICAgICAgICBvbkJsdXIsXG4gICAgICAgIHJlZixcbiAgICB9KSwgW25hbWUsIGRpc2FibGVkLCBmb3JtU3RhdGUuZGlzYWJsZWQsIG9uQ2hhbmdlLCBvbkJsdXIsIHJlZiwgdmFsdWVdKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCBfc2hvdWxkVW5yZWdpc3RlckZpZWxkID0gY29udHJvbC5fb3B0aW9ucy5zaG91bGRVbnJlZ2lzdGVyIHx8IHNob3VsZFVucmVnaXN0ZXI7XG4gICAgICAgIGNvbnRyb2wucmVnaXN0ZXIobmFtZSwge1xuICAgICAgICAgICAgLi4uX3Byb3BzLmN1cnJlbnQucnVsZXMsXG4gICAgICAgICAgICAuLi4oaXNCb29sZWFuKF9wcm9wcy5jdXJyZW50LmRpc2FibGVkKVxuICAgICAgICAgICAgICAgID8geyBkaXNhYmxlZDogX3Byb3BzLmN1cnJlbnQuZGlzYWJsZWQgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdXBkYXRlTW91bnRlZCA9IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoY29udHJvbC5fZmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5fZikge1xuICAgICAgICAgICAgICAgIGZpZWxkLl9mLm1vdW50ID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHVwZGF0ZU1vdW50ZWQobmFtZSwgdHJ1ZSk7XG4gICAgICAgIGlmIChfc2hvdWxkVW5yZWdpc3RlckZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNsb25lT2JqZWN0KGdldChjb250cm9sLl9vcHRpb25zLmRlZmF1bHRWYWx1ZXMsIG5hbWUpKTtcbiAgICAgICAgICAgIHNldChjb250cm9sLl9kZWZhdWx0VmFsdWVzLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQoZ2V0KGNvbnRyb2wuX2Zvcm1WYWx1ZXMsIG5hbWUpKSkge1xuICAgICAgICAgICAgICAgIHNldChjb250cm9sLl9mb3JtVmFsdWVzLCBuYW1lLCB2YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgIWlzQXJyYXlGaWVsZCAmJiBjb250cm9sLnJlZ2lzdGVyKG5hbWUpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgKGlzQXJyYXlGaWVsZFxuICAgICAgICAgICAgICAgID8gX3Nob3VsZFVucmVnaXN0ZXJGaWVsZCAmJiAhY29udHJvbC5fc3RhdGUuYWN0aW9uXG4gICAgICAgICAgICAgICAgOiBfc2hvdWxkVW5yZWdpc3RlckZpZWxkKVxuICAgICAgICAgICAgICAgID8gY29udHJvbC51bnJlZ2lzdGVyKG5hbWUpXG4gICAgICAgICAgICAgICAgOiB1cGRhdGVNb3VudGVkKG5hbWUsIGZhbHNlKTtcbiAgICAgICAgfTtcbiAgICB9LCBbbmFtZSwgY29udHJvbCwgaXNBcnJheUZpZWxkLCBzaG91bGRVbnJlZ2lzdGVyXSk7XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29udHJvbC5fc2V0RGlzYWJsZWRGaWVsZCh7XG4gICAgICAgICAgICBkaXNhYmxlZCxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgIH0pO1xuICAgIH0sIFtkaXNhYmxlZCwgbmFtZSwgY29udHJvbF0pO1xuICAgIHJldHVybiBSZWFjdF9fZGVmYXVsdC51c2VNZW1vKCgpID0+ICh7XG4gICAgICAgIGZpZWxkLFxuICAgICAgICBmb3JtU3RhdGUsXG4gICAgICAgIGZpZWxkU3RhdGUsXG4gICAgfSksIFtmaWVsZCwgZm9ybVN0YXRlLCBmaWVsZFN0YXRlXSk7XG59XG5cbi8qKlxuICogQ29tcG9uZW50IGJhc2VkIG9uIGB1c2VDb250cm9sbGVyYCBob29rIHRvIHdvcmsgd2l0aCBjb250cm9sbGVkIGNvbXBvbmVudC5cbiAqXG4gKiBAcmVtYXJrc1xuICogW0FQSV0oaHR0cHM6Ly9yZWFjdC1ob29rLWZvcm0uY29tL2RvY3MvdXNlY29udHJvbGxlci9jb250cm9sbGVyKSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy9yZWFjdC1ob29rLWZvcm0tdjYtY29udHJvbGxlci10cy1qd3l6dykg4oCiIFtWaWRlb10oaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1OMlVOa19VQ1Z5QSlcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSB0aGUgcGF0aCBuYW1lIHRvIHRoZSBmb3JtIGZpZWxkIHZhbHVlLCBhbmQgdmFsaWRhdGlvbiBydWxlcy5cbiAqXG4gKiBAcmV0dXJucyBwcm92aWRlIGZpZWxkIGhhbmRsZXIgZnVuY3Rpb25zLCBmaWVsZCBhbmQgZm9ybSBzdGF0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBBcHAoKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCB9ID0gdXNlRm9ybTxGb3JtVmFsdWVzPih7XG4gKiAgICAgZGVmYXVsdFZhbHVlczoge1xuICogICAgICAgdGVzdDogXCJcIlxuICogICAgIH1cbiAqICAgfSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxmb3JtPlxuICogICAgICAgPENvbnRyb2xsZXJcbiAqICAgICAgICAgY29udHJvbD17Y29udHJvbH1cbiAqICAgICAgICAgbmFtZT1cInRlc3RcIlxuICogICAgICAgICByZW5kZXI9eyh7IGZpZWxkOiB7IG9uQ2hhbmdlLCBvbkJsdXIsIHZhbHVlLCByZWYgfSwgZm9ybVN0YXRlLCBmaWVsZFN0YXRlIH0pID0+IChcbiAqICAgICAgICAgICA8PlxuICogICAgICAgICAgICAgPGlucHV0XG4gKiAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtvbkNoYW5nZX0gLy8gc2VuZCB2YWx1ZSB0byBob29rIGZvcm1cbiAqICAgICAgICAgICAgICAgb25CbHVyPXtvbkJsdXJ9IC8vIG5vdGlmeSB3aGVuIGlucHV0IGlzIHRvdWNoZWRcbiAqICAgICAgICAgICAgICAgdmFsdWU9e3ZhbHVlfSAvLyByZXR1cm4gdXBkYXRlZCB2YWx1ZVxuICogICAgICAgICAgICAgICByZWY9e3JlZn0gLy8gc2V0IHJlZiBmb3IgZm9jdXMgbWFuYWdlbWVudFxuICogICAgICAgICAgICAgLz5cbiAqICAgICAgICAgICAgIDxwPntmb3JtU3RhdGUuaXNTdWJtaXR0ZWQgPyBcInN1Ym1pdHRlZFwiIDogXCJcIn08L3A+XG4gKiAgICAgICAgICAgICA8cD57ZmllbGRTdGF0ZS5pc1RvdWNoZWQgPyBcInRvdWNoZWRcIiA6IFwiXCJ9PC9wPlxuICogICAgICAgICAgIDwvPlxuICogICAgICAgICApfVxuICogICAgICAgLz5cbiAqICAgICA8L2Zvcm0+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuY29uc3QgQ29udHJvbGxlciA9IChwcm9wcykgPT4gcHJvcHMucmVuZGVyKHVzZUNvbnRyb2xsZXIocHJvcHMpKTtcblxuY29uc3QgZmxhdHRlbiA9IChvYmopID0+IHtcbiAgICBjb25zdCBvdXRwdXQgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvYmopKSB7XG4gICAgICAgIGlmIChpc09iamVjdFR5cGUob2JqW2tleV0pICYmIG9ialtrZXldICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBuZXN0ZWQgPSBmbGF0dGVuKG9ialtrZXldKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmVzdGVkS2V5IG9mIE9iamVjdC5rZXlzKG5lc3RlZCkpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRbYCR7a2V5fS4ke25lc3RlZEtleX1gXSA9IG5lc3RlZFtuZXN0ZWRLZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0W2tleV0gPSBvYmpba2V5XTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xufTtcblxuY29uc3QgUE9TVF9SRVFVRVNUID0gJ3Bvc3QnO1xuLyoqXG4gKiBGb3JtIGNvbXBvbmVudCB0byBtYW5hZ2Ugc3VibWlzc2lvbi5cbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSB0byBzZXR1cCBzdWJtaXNzaW9uIGRldGFpbC4ge0BsaW5rIEZvcm1Qcm9wc31cbiAqXG4gKiBAcmV0dXJucyBmb3JtIGNvbXBvbmVudCBvciBoZWFkbGVzcyByZW5kZXIgcHJvcC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHN4XG4gKiBmdW5jdGlvbiBBcHAoKSB7XG4gKiAgIGNvbnN0IHsgY29udHJvbCwgZm9ybVN0YXRlOiB7IGVycm9ycyB9IH0gPSB1c2VGb3JtKCk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxGb3JtIGFjdGlvbj1cIi9hcGlcIiBjb250cm9sPXtjb250cm9sfT5cbiAqICAgICAgIDxpbnB1dCB7Li4ucmVnaXN0ZXIoXCJuYW1lXCIpfSAvPlxuICogICAgICAgPHA+e2Vycm9ycz8ucm9vdD8uc2VydmVyICYmICdTZXJ2ZXIgZXJyb3InfTwvcD5cbiAqICAgICAgIDxidXR0b24+U3VibWl0PC9idXR0b24+XG4gKiAgICAgPC9Gb3JtPlxuICogICApO1xuICogfVxuICogYGBgXG4gKi9cbmZ1bmN0aW9uIEZvcm0ocHJvcHMpIHtcbiAgICBjb25zdCBtZXRob2RzID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgICBjb25zdCBbbW91bnRlZCwgc2V0TW91bnRlZF0gPSBSZWFjdF9fZGVmYXVsdC51c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgeyBjb250cm9sID0gbWV0aG9kcy5jb250cm9sLCBvblN1Ym1pdCwgY2hpbGRyZW4sIGFjdGlvbiwgbWV0aG9kID0gUE9TVF9SRVFVRVNULCBoZWFkZXJzLCBlbmNUeXBlLCBvbkVycm9yLCByZW5kZXIsIG9uU3VjY2VzcywgdmFsaWRhdGVTdGF0dXMsIC4uLnJlc3QgfSA9IHByb3BzO1xuICAgIGNvbnN0IHN1Ym1pdCA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgbGV0IHR5cGUgPSAnJztcbiAgICAgICAgYXdhaXQgY29udHJvbC5oYW5kbGVTdWJtaXQoYXN5bmMgKGRhdGEpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgICAgICAgICBsZXQgZm9ybURhdGFKc29uID0gJyc7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGZvcm1EYXRhSnNvbiA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2ggKF9hKSB7IH1cbiAgICAgICAgICAgIGNvbnN0IGZsYXR0ZW5Gb3JtVmFsdWVzID0gZmxhdHRlbihjb250cm9sLl9mb3JtVmFsdWVzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIGZsYXR0ZW5Gb3JtVmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgZmxhdHRlbkZvcm1WYWx1ZXNba2V5XSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob25TdWJtaXQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBvblN1Ym1pdCh7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgICAgICBtZXRob2QsXG4gICAgICAgICAgICAgICAgICAgIGZvcm1EYXRhLFxuICAgICAgICAgICAgICAgICAgICBmb3JtRGF0YUpzb24sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoYWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkU3RyaW5naWZ5U3VibWlzc2lvbkRhdGEgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzICYmIGhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5jVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgXS5zb21lKCh2YWx1ZSkgPT4gdmFsdWUgJiYgdmFsdWUuaW5jbHVkZXMoJ2pzb24nKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goU3RyaW5nKGFjdGlvbiksIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5oZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLihlbmNUeXBlID8geyAnQ29udGVudC1UeXBlJzogZW5jVHlwZSB9IDoge30pLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk6IHNob3VsZFN0cmluZ2lmeVN1Ym1pc3Npb25EYXRhID8gZm9ybURhdGFKc29uIDogZm9ybURhdGEsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICh2YWxpZGF0ZVN0YXR1c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gIXZhbGlkYXRlU3RhdHVzKHJlc3BvbnNlLnN0YXR1cylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHJlc3BvbnNlLnN0YXR1cyA8IDIwMCB8fCByZXNwb25zZS5zdGF0dXMgPj0gMzAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvciAmJiBvbkVycm9yKHsgcmVzcG9uc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gU3RyaW5nKHJlc3BvbnNlLnN0YXR1cyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvblN1Y2Nlc3MgJiYgb25TdWNjZXNzKHsgcmVzcG9uc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgb25FcnJvciAmJiBvbkVycm9yKHsgZXJyb3IgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KShldmVudCk7XG4gICAgICAgIGlmIChoYXNFcnJvciAmJiBwcm9wcy5jb250cm9sKSB7XG4gICAgICAgICAgICBwcm9wcy5jb250cm9sLl9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICBpc1N1Ym1pdFN1Y2Nlc3NmdWw6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcm9wcy5jb250cm9sLnNldEVycm9yKCdyb290LnNlcnZlcicsIHtcbiAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHNldE1vdW50ZWQodHJ1ZSk7XG4gICAgfSwgW10pO1xuICAgIHJldHVybiByZW5kZXIgPyAoUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChSZWFjdF9fZGVmYXVsdC5GcmFnbWVudCwgbnVsbCwgcmVuZGVyKHtcbiAgICAgICAgc3VibWl0LFxuICAgIH0pKSkgOiAoUmVhY3RfX2RlZmF1bHQuY3JlYXRlRWxlbWVudChcImZvcm1cIiwgeyBub1ZhbGlkYXRlOiBtb3VudGVkLCBhY3Rpb246IGFjdGlvbiwgbWV0aG9kOiBtZXRob2QsIGVuY1R5cGU6IGVuY1R5cGUsIG9uU3VibWl0OiBzdWJtaXQsIC4uLnJlc3QgfSwgY2hpbGRyZW4pKTtcbn1cblxudmFyIGFwcGVuZEVycm9ycyA9IChuYW1lLCB2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEsIGVycm9ycywgdHlwZSwgbWVzc2FnZSkgPT4gdmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhXG4gICAgPyB7XG4gICAgICAgIC4uLmVycm9yc1tuYW1lXSxcbiAgICAgICAgdHlwZXM6IHtcbiAgICAgICAgICAgIC4uLihlcnJvcnNbbmFtZV0gJiYgZXJyb3JzW25hbWVdLnR5cGVzID8gZXJyb3JzW25hbWVdLnR5cGVzIDoge30pLFxuICAgICAgICAgICAgW3R5cGVdOiBtZXNzYWdlIHx8IHRydWUsXG4gICAgICAgIH0sXG4gICAgfVxuICAgIDoge307XG5cbnZhciBjb252ZXJ0VG9BcnJheVBheWxvYWQgPSAodmFsdWUpID0+IChBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXSk7XG5cbnZhciBjcmVhdGVTdWJqZWN0ID0gKCkgPT4ge1xuICAgIGxldCBfb2JzZXJ2ZXJzID0gW107XG4gICAgY29uc3QgbmV4dCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IG9ic2VydmVyIG9mIF9vYnNlcnZlcnMpIHtcbiAgICAgICAgICAgIG9ic2VydmVyLm5leHQgJiYgb2JzZXJ2ZXIubmV4dCh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHN1YnNjcmliZSA9IChvYnNlcnZlcikgPT4ge1xuICAgICAgICBfb2JzZXJ2ZXJzLnB1c2gob2JzZXJ2ZXIpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdW5zdWJzY3JpYmU6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBfb2JzZXJ2ZXJzID0gX29ic2VydmVycy5maWx0ZXIoKG8pID0+IG8gIT09IG9ic2VydmVyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCB1bnN1YnNjcmliZSA9ICgpID0+IHtcbiAgICAgICAgX29ic2VydmVycyA9IFtdO1xuICAgIH07XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZ2V0IG9ic2VydmVycygpIHtcbiAgICAgICAgICAgIHJldHVybiBfb2JzZXJ2ZXJzO1xuICAgICAgICB9LFxuICAgICAgICBuZXh0LFxuICAgICAgICBzdWJzY3JpYmUsXG4gICAgICAgIHVuc3Vic2NyaWJlLFxuICAgIH07XG59O1xuXG52YXIgaXNQcmltaXRpdmUgPSAodmFsdWUpID0+IGlzTnVsbE9yVW5kZWZpbmVkKHZhbHVlKSB8fCAhaXNPYmplY3RUeXBlKHZhbHVlKTtcblxuZnVuY3Rpb24gZGVlcEVxdWFsKG9iamVjdDEsIG9iamVjdDIsIF9pbnRlcm5hbF92aXNpdGVkID0gbmV3IFdlYWtTZXQoKSkge1xuICAgIGlmIChpc1ByaW1pdGl2ZShvYmplY3QxKSB8fCBpc1ByaW1pdGl2ZShvYmplY3QyKSkge1xuICAgICAgICByZXR1cm4gb2JqZWN0MSA9PT0gb2JqZWN0MjtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZU9iamVjdChvYmplY3QxKSAmJiBpc0RhdGVPYmplY3Qob2JqZWN0MikpIHtcbiAgICAgICAgcmV0dXJuIG9iamVjdDEuZ2V0VGltZSgpID09PSBvYmplY3QyLmdldFRpbWUoKTtcbiAgICB9XG4gICAgY29uc3Qga2V5czEgPSBPYmplY3Qua2V5cyhvYmplY3QxKTtcbiAgICBjb25zdCBrZXlzMiA9IE9iamVjdC5rZXlzKG9iamVjdDIpO1xuICAgIGlmIChrZXlzMS5sZW5ndGggIT09IGtleXMyLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChfaW50ZXJuYWxfdmlzaXRlZC5oYXMob2JqZWN0MSkgfHwgX2ludGVybmFsX3Zpc2l0ZWQuaGFzKG9iamVjdDIpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBfaW50ZXJuYWxfdmlzaXRlZC5hZGQob2JqZWN0MSk7XG4gICAgX2ludGVybmFsX3Zpc2l0ZWQuYWRkKG9iamVjdDIpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMxKSB7XG4gICAgICAgIGNvbnN0IHZhbDEgPSBvYmplY3QxW2tleV07XG4gICAgICAgIGlmICgha2V5czIuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChrZXkgIT09ICdyZWYnKSB7XG4gICAgICAgICAgICBjb25zdCB2YWwyID0gb2JqZWN0MltrZXldO1xuICAgICAgICAgICAgaWYgKChpc0RhdGVPYmplY3QodmFsMSkgJiYgaXNEYXRlT2JqZWN0KHZhbDIpKSB8fFxuICAgICAgICAgICAgICAgIChpc09iamVjdCh2YWwxKSAmJiBpc09iamVjdCh2YWwyKSkgfHxcbiAgICAgICAgICAgICAgICAoQXJyYXkuaXNBcnJheSh2YWwxKSAmJiBBcnJheS5pc0FycmF5KHZhbDIpKVxuICAgICAgICAgICAgICAgID8gIWRlZXBFcXVhbCh2YWwxLCB2YWwyLCBfaW50ZXJuYWxfdmlzaXRlZClcbiAgICAgICAgICAgICAgICA6IHZhbDEgIT09IHZhbDIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5cbnZhciBpc0VtcHR5T2JqZWN0ID0gKHZhbHVlKSA9PiBpc09iamVjdCh2YWx1ZSkgJiYgIU9iamVjdC5rZXlzKHZhbHVlKS5sZW5ndGg7XG5cbnZhciBpc0ZpbGVJbnB1dCA9IChlbGVtZW50KSA9PiBlbGVtZW50LnR5cGUgPT09ICdmaWxlJztcblxudmFyIGlzRnVuY3Rpb24gPSAodmFsdWUpID0+IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcblxudmFyIGlzSFRNTEVsZW1lbnQgPSAodmFsdWUpID0+IHtcbiAgICBpZiAoIWlzV2ViKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgb3duZXIgPSB2YWx1ZSA/IHZhbHVlLm93bmVyRG9jdW1lbnQgOiAwO1xuICAgIHJldHVybiAodmFsdWUgaW5zdGFuY2VvZlxuICAgICAgICAob3duZXIgJiYgb3duZXIuZGVmYXVsdFZpZXcgPyBvd25lci5kZWZhdWx0Vmlldy5IVE1MRWxlbWVudCA6IEhUTUxFbGVtZW50KSk7XG59O1xuXG52YXIgaXNNdWx0aXBsZVNlbGVjdCA9IChlbGVtZW50KSA9PiBlbGVtZW50LnR5cGUgPT09IGBzZWxlY3QtbXVsdGlwbGVgO1xuXG52YXIgaXNSYWRpb0lucHV0ID0gKGVsZW1lbnQpID0+IGVsZW1lbnQudHlwZSA9PT0gJ3JhZGlvJztcblxudmFyIGlzUmFkaW9PckNoZWNrYm94ID0gKHJlZikgPT4gaXNSYWRpb0lucHV0KHJlZikgfHwgaXNDaGVja0JveElucHV0KHJlZik7XG5cbnZhciBsaXZlID0gKHJlZikgPT4gaXNIVE1MRWxlbWVudChyZWYpICYmIHJlZi5pc0Nvbm5lY3RlZDtcblxuZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHVwZGF0ZVBhdGgpIHtcbiAgICBjb25zdCBsZW5ndGggPSB1cGRhdGVQYXRoLnNsaWNlKDAsIC0xKS5sZW5ndGg7XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHtcbiAgICAgICAgb2JqZWN0ID0gaXNVbmRlZmluZWQob2JqZWN0KSA/IGluZGV4KysgOiBvYmplY3RbdXBkYXRlUGF0aFtpbmRleCsrXV07XG4gICAgfVxuICAgIHJldHVybiBvYmplY3Q7XG59XG5mdW5jdGlvbiBpc0VtcHR5QXJyYXkob2JqKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhaXNVbmRlZmluZWQob2JqW2tleV0pKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59XG5mdW5jdGlvbiB1bnNldChvYmplY3QsIHBhdGgpIHtcbiAgICBjb25zdCBwYXRocyA9IEFycmF5LmlzQXJyYXkocGF0aClcbiAgICAgICAgPyBwYXRoXG4gICAgICAgIDogaXNLZXkocGF0aClcbiAgICAgICAgICAgID8gW3BhdGhdXG4gICAgICAgICAgICA6IHN0cmluZ1RvUGF0aChwYXRoKTtcbiAgICBjb25zdCBjaGlsZE9iamVjdCA9IHBhdGhzLmxlbmd0aCA9PT0gMSA/IG9iamVjdCA6IGJhc2VHZXQob2JqZWN0LCBwYXRocyk7XG4gICAgY29uc3QgaW5kZXggPSBwYXRocy5sZW5ndGggLSAxO1xuICAgIGNvbnN0IGtleSA9IHBhdGhzW2luZGV4XTtcbiAgICBpZiAoY2hpbGRPYmplY3QpIHtcbiAgICAgICAgZGVsZXRlIGNoaWxkT2JqZWN0W2tleV07XG4gICAgfVxuICAgIGlmIChpbmRleCAhPT0gMCAmJlxuICAgICAgICAoKGlzT2JqZWN0KGNoaWxkT2JqZWN0KSAmJiBpc0VtcHR5T2JqZWN0KGNoaWxkT2JqZWN0KSkgfHxcbiAgICAgICAgICAgIChBcnJheS5pc0FycmF5KGNoaWxkT2JqZWN0KSAmJiBpc0VtcHR5QXJyYXkoY2hpbGRPYmplY3QpKSkpIHtcbiAgICAgICAgdW5zZXQob2JqZWN0LCBwYXRocy5zbGljZSgwLCAtMSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0O1xufVxuXG52YXIgb2JqZWN0SGFzRnVuY3Rpb24gPSAoZGF0YSkgPT4ge1xuICAgIGZvciAoY29uc3Qga2V5IGluIGRhdGEpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oZGF0YVtrZXldKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufTtcblxuZnVuY3Rpb24gbWFya0ZpZWxkc0RpcnR5KGRhdGEsIGZpZWxkcyA9IHt9KSB7XG4gICAgY29uc3QgaXNQYXJlbnROb2RlQXJyYXkgPSBBcnJheS5pc0FycmF5KGRhdGEpO1xuICAgIGlmIChpc09iamVjdChkYXRhKSB8fCBpc1BhcmVudE5vZGVBcnJheSkge1xuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBkYXRhKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhW2tleV0pIHx8XG4gICAgICAgICAgICAgICAgKGlzT2JqZWN0KGRhdGFba2V5XSkgJiYgIW9iamVjdEhhc0Z1bmN0aW9uKGRhdGFba2V5XSkpKSB7XG4gICAgICAgICAgICAgICAgZmllbGRzW2tleV0gPSBBcnJheS5pc0FycmF5KGRhdGFba2V5XSkgPyBbXSA6IHt9O1xuICAgICAgICAgICAgICAgIG1hcmtGaWVsZHNEaXJ0eShkYXRhW2tleV0sIGZpZWxkc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFpc051bGxPclVuZGVmaW5lZChkYXRhW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgZmllbGRzW2tleV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaWVsZHM7XG59XG5mdW5jdGlvbiBnZXREaXJ0eUZpZWxkc0Zyb21EZWZhdWx0VmFsdWVzKGRhdGEsIGZvcm1WYWx1ZXMsIGRpcnR5RmllbGRzRnJvbVZhbHVlcykge1xuICAgIGNvbnN0IGlzUGFyZW50Tm9kZUFycmF5ID0gQXJyYXkuaXNBcnJheShkYXRhKTtcbiAgICBpZiAoaXNPYmplY3QoZGF0YSkgfHwgaXNQYXJlbnROb2RlQXJyYXkpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YVtrZXldKSB8fFxuICAgICAgICAgICAgICAgIChpc09iamVjdChkYXRhW2tleV0pICYmICFvYmplY3RIYXNGdW5jdGlvbihkYXRhW2tleV0pKSkge1xuICAgICAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZChmb3JtVmFsdWVzKSB8fFxuICAgICAgICAgICAgICAgICAgICBpc1ByaW1pdGl2ZShkaXJ0eUZpZWxkc0Zyb21WYWx1ZXNba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlydHlGaWVsZHNGcm9tVmFsdWVzW2tleV0gPSBBcnJheS5pc0FycmF5KGRhdGFba2V5XSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gbWFya0ZpZWxkc0RpcnR5KGRhdGFba2V5XSwgW10pXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHsgLi4ubWFya0ZpZWxkc0RpcnR5KGRhdGFba2V5XSkgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGdldERpcnR5RmllbGRzRnJvbURlZmF1bHRWYWx1ZXMoZGF0YVtrZXldLCBpc051bGxPclVuZGVmaW5lZChmb3JtVmFsdWVzKSA/IHt9IDogZm9ybVZhbHVlc1trZXldLCBkaXJ0eUZpZWxkc0Zyb21WYWx1ZXNba2V5XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgZGlydHlGaWVsZHNGcm9tVmFsdWVzW2tleV0gPSAhZGVlcEVxdWFsKGRhdGFba2V5XSwgZm9ybVZhbHVlc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZGlydHlGaWVsZHNGcm9tVmFsdWVzO1xufVxudmFyIGdldERpcnR5RmllbGRzID0gKGRlZmF1bHRWYWx1ZXMsIGZvcm1WYWx1ZXMpID0+IGdldERpcnR5RmllbGRzRnJvbURlZmF1bHRWYWx1ZXMoZGVmYXVsdFZhbHVlcywgZm9ybVZhbHVlcywgbWFya0ZpZWxkc0RpcnR5KGZvcm1WYWx1ZXMpKTtcblxuY29uc3QgZGVmYXVsdFJlc3VsdCA9IHtcbiAgICB2YWx1ZTogZmFsc2UsXG4gICAgaXNWYWxpZDogZmFsc2UsXG59O1xuY29uc3QgdmFsaWRSZXN1bHQgPSB7IHZhbHVlOiB0cnVlLCBpc1ZhbGlkOiB0cnVlIH07XG52YXIgZ2V0Q2hlY2tib3hWYWx1ZSA9IChvcHRpb25zKSA9PiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3B0aW9ucykpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gb3B0aW9uc1xuICAgICAgICAgICAgICAgIC5maWx0ZXIoKG9wdGlvbikgPT4gb3B0aW9uICYmIG9wdGlvbi5jaGVja2VkICYmICFvcHRpb24uZGlzYWJsZWQpXG4gICAgICAgICAgICAgICAgLm1hcCgob3B0aW9uKSA9PiBvcHRpb24udmFsdWUpO1xuICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6IHZhbHVlcywgaXNWYWxpZDogISF2YWx1ZXMubGVuZ3RoIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9wdGlvbnNbMF0uY2hlY2tlZCAmJiAhb3B0aW9uc1swXS5kaXNhYmxlZFxuICAgICAgICAgICAgPyAvLyBAdHMtZXhwZWN0LWVycm9yIGV4cGVjdGVkIHRvIHdvcmsgaW4gdGhlIGJyb3dzZXJcbiAgICAgICAgICAgICAgICBvcHRpb25zWzBdLmF0dHJpYnV0ZXMgJiYgIWlzVW5kZWZpbmVkKG9wdGlvbnNbMF0uYXR0cmlidXRlcy52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgPyBpc1VuZGVmaW5lZChvcHRpb25zWzBdLnZhbHVlKSB8fCBvcHRpb25zWzBdLnZhbHVlID09PSAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyB2YWxpZFJlc3VsdFxuICAgICAgICAgICAgICAgICAgICAgICAgOiB7IHZhbHVlOiBvcHRpb25zWzBdLnZhbHVlLCBpc1ZhbGlkOiB0cnVlIH1cbiAgICAgICAgICAgICAgICAgICAgOiB2YWxpZFJlc3VsdFxuICAgICAgICAgICAgOiBkZWZhdWx0UmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gZGVmYXVsdFJlc3VsdDtcbn07XG5cbnZhciBnZXRGaWVsZFZhbHVlQXMgPSAodmFsdWUsIHsgdmFsdWVBc051bWJlciwgdmFsdWVBc0RhdGUsIHNldFZhbHVlQXMgfSkgPT4gaXNVbmRlZmluZWQodmFsdWUpXG4gICAgPyB2YWx1ZVxuICAgIDogdmFsdWVBc051bWJlclxuICAgICAgICA/IHZhbHVlID09PSAnJ1xuICAgICAgICAgICAgPyBOYU5cbiAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgICAgICAgICA/ICt2YWx1ZVxuICAgICAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgOiB2YWx1ZUFzRGF0ZSAmJiBpc1N0cmluZyh2YWx1ZSlcbiAgICAgICAgICAgID8gbmV3IERhdGUodmFsdWUpXG4gICAgICAgICAgICA6IHNldFZhbHVlQXNcbiAgICAgICAgICAgICAgICA/IHNldFZhbHVlQXModmFsdWUpXG4gICAgICAgICAgICAgICAgOiB2YWx1ZTtcblxuY29uc3QgZGVmYXVsdFJldHVybiA9IHtcbiAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICB2YWx1ZTogbnVsbCxcbn07XG52YXIgZ2V0UmFkaW9WYWx1ZSA9IChvcHRpb25zKSA9PiBBcnJheS5pc0FycmF5KG9wdGlvbnMpXG4gICAgPyBvcHRpb25zLnJlZHVjZSgocHJldmlvdXMsIG9wdGlvbikgPT4gb3B0aW9uICYmIG9wdGlvbi5jaGVja2VkICYmICFvcHRpb24uZGlzYWJsZWRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBpc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IG9wdGlvbi52YWx1ZSxcbiAgICAgICAgfVxuICAgICAgICA6IHByZXZpb3VzLCBkZWZhdWx0UmV0dXJuKVxuICAgIDogZGVmYXVsdFJldHVybjtcblxuZnVuY3Rpb24gZ2V0RmllbGRWYWx1ZShfZikge1xuICAgIGNvbnN0IHJlZiA9IF9mLnJlZjtcbiAgICBpZiAoaXNGaWxlSW5wdXQocmVmKSkge1xuICAgICAgICByZXR1cm4gcmVmLmZpbGVzO1xuICAgIH1cbiAgICBpZiAoaXNSYWRpb0lucHV0KHJlZikpIHtcbiAgICAgICAgcmV0dXJuIGdldFJhZGlvVmFsdWUoX2YucmVmcykudmFsdWU7XG4gICAgfVxuICAgIGlmIChpc011bHRpcGxlU2VsZWN0KHJlZikpIHtcbiAgICAgICAgcmV0dXJuIFsuLi5yZWYuc2VsZWN0ZWRPcHRpb25zXS5tYXAoKHsgdmFsdWUgfSkgPT4gdmFsdWUpO1xuICAgIH1cbiAgICBpZiAoaXNDaGVja0JveElucHV0KHJlZikpIHtcbiAgICAgICAgcmV0dXJuIGdldENoZWNrYm94VmFsdWUoX2YucmVmcykudmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBnZXRGaWVsZFZhbHVlQXMoaXNVbmRlZmluZWQocmVmLnZhbHVlKSA/IF9mLnJlZi52YWx1ZSA6IHJlZi52YWx1ZSwgX2YpO1xufVxuXG52YXIgZ2V0UmVzb2x2ZXJPcHRpb25zID0gKGZpZWxkc05hbWVzLCBfZmllbGRzLCBjcml0ZXJpYU1vZGUsIHNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24pID0+IHtcbiAgICBjb25zdCBmaWVsZHMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgZmllbGRzTmFtZXMpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgIGZpZWxkICYmIHNldChmaWVsZHMsIG5hbWUsIGZpZWxkLl9mKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgICAgY3JpdGVyaWFNb2RlLFxuICAgICAgICBuYW1lczogWy4uLmZpZWxkc05hbWVzXSxcbiAgICAgICAgZmllbGRzLFxuICAgICAgICBzaG91bGRVc2VOYXRpdmVWYWxpZGF0aW9uLFxuICAgIH07XG59O1xuXG52YXIgaXNSZWdleCA9ICh2YWx1ZSkgPT4gdmFsdWUgaW5zdGFuY2VvZiBSZWdFeHA7XG5cbnZhciBnZXRSdWxlVmFsdWUgPSAocnVsZSkgPT4gaXNVbmRlZmluZWQocnVsZSlcbiAgICA/IHJ1bGVcbiAgICA6IGlzUmVnZXgocnVsZSlcbiAgICAgICAgPyBydWxlLnNvdXJjZVxuICAgICAgICA6IGlzT2JqZWN0KHJ1bGUpXG4gICAgICAgICAgICA/IGlzUmVnZXgocnVsZS52YWx1ZSlcbiAgICAgICAgICAgICAgICA/IHJ1bGUudmFsdWUuc291cmNlXG4gICAgICAgICAgICAgICAgOiBydWxlLnZhbHVlXG4gICAgICAgICAgICA6IHJ1bGU7XG5cbnZhciBnZXRWYWxpZGF0aW9uTW9kZXMgPSAobW9kZSkgPT4gKHtcbiAgICBpc09uU3VibWl0OiAhbW9kZSB8fCBtb2RlID09PSBWQUxJREFUSU9OX01PREUub25TdWJtaXQsXG4gICAgaXNPbkJsdXI6IG1vZGUgPT09IFZBTElEQVRJT05fTU9ERS5vbkJsdXIsXG4gICAgaXNPbkNoYW5nZTogbW9kZSA9PT0gVkFMSURBVElPTl9NT0RFLm9uQ2hhbmdlLFxuICAgIGlzT25BbGw6IG1vZGUgPT09IFZBTElEQVRJT05fTU9ERS5hbGwsXG4gICAgaXNPblRvdWNoOiBtb2RlID09PSBWQUxJREFUSU9OX01PREUub25Ub3VjaGVkLFxufSk7XG5cbmNvbnN0IEFTWU5DX0ZVTkNUSU9OID0gJ0FzeW5jRnVuY3Rpb24nO1xudmFyIGhhc1Byb21pc2VWYWxpZGF0aW9uID0gKGZpZWxkUmVmZXJlbmNlKSA9PiAhIWZpZWxkUmVmZXJlbmNlICYmXG4gICAgISFmaWVsZFJlZmVyZW5jZS52YWxpZGF0ZSAmJlxuICAgICEhKChpc0Z1bmN0aW9uKGZpZWxkUmVmZXJlbmNlLnZhbGlkYXRlKSAmJlxuICAgICAgICBmaWVsZFJlZmVyZW5jZS52YWxpZGF0ZS5jb25zdHJ1Y3Rvci5uYW1lID09PSBBU1lOQ19GVU5DVElPTikgfHxcbiAgICAgICAgKGlzT2JqZWN0KGZpZWxkUmVmZXJlbmNlLnZhbGlkYXRlKSAmJlxuICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhmaWVsZFJlZmVyZW5jZS52YWxpZGF0ZSkuZmluZCgodmFsaWRhdGVGdW5jdGlvbikgPT4gdmFsaWRhdGVGdW5jdGlvbi5jb25zdHJ1Y3Rvci5uYW1lID09PSBBU1lOQ19GVU5DVElPTikpKTtcblxudmFyIGhhc1ZhbGlkYXRpb24gPSAob3B0aW9ucykgPT4gb3B0aW9ucy5tb3VudCAmJlxuICAgIChvcHRpb25zLnJlcXVpcmVkIHx8XG4gICAgICAgIG9wdGlvbnMubWluIHx8XG4gICAgICAgIG9wdGlvbnMubWF4IHx8XG4gICAgICAgIG9wdGlvbnMubWF4TGVuZ3RoIHx8XG4gICAgICAgIG9wdGlvbnMubWluTGVuZ3RoIHx8XG4gICAgICAgIG9wdGlvbnMucGF0dGVybiB8fFxuICAgICAgICBvcHRpb25zLnZhbGlkYXRlKTtcblxudmFyIGlzV2F0Y2hlZCA9IChuYW1lLCBfbmFtZXMsIGlzQmx1ckV2ZW50KSA9PiAhaXNCbHVyRXZlbnQgJiZcbiAgICAoX25hbWVzLndhdGNoQWxsIHx8XG4gICAgICAgIF9uYW1lcy53YXRjaC5oYXMobmFtZSkgfHxcbiAgICAgICAgWy4uLl9uYW1lcy53YXRjaF0uc29tZSgod2F0Y2hOYW1lKSA9PiBuYW1lLnN0YXJ0c1dpdGgod2F0Y2hOYW1lKSAmJlxuICAgICAgICAgICAgL15cXC5cXHcrLy50ZXN0KG5hbWUuc2xpY2Uod2F0Y2hOYW1lLmxlbmd0aCkpKSk7XG5cbmNvbnN0IGl0ZXJhdGVGaWVsZHNCeUFjdGlvbiA9IChmaWVsZHMsIGFjdGlvbiwgZmllbGRzTmFtZXMsIGFib3J0RWFybHkpID0+IHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWVsZHNOYW1lcyB8fCBPYmplY3Qua2V5cyhmaWVsZHMpKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KGZpZWxkcywga2V5KTtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCB7IF9mLCAuLi5jdXJyZW50RmllbGQgfSA9IGZpZWxkO1xuICAgICAgICAgICAgaWYgKF9mKSB7XG4gICAgICAgICAgICAgICAgaWYgKF9mLnJlZnMgJiYgX2YucmVmc1swXSAmJiBhY3Rpb24oX2YucmVmc1swXSwga2V5KSAmJiAhYWJvcnRFYXJseSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoX2YucmVmICYmIGFjdGlvbihfZi5yZWYsIF9mLm5hbWUpICYmICFhYm9ydEVhcmx5KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZXJhdGVGaWVsZHNCeUFjdGlvbihjdXJyZW50RmllbGQsIGFjdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNPYmplY3QoY3VycmVudEZpZWxkKSkge1xuICAgICAgICAgICAgICAgIGlmIChpdGVyYXRlRmllbGRzQnlBY3Rpb24oY3VycmVudEZpZWxkLCBhY3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm47XG59O1xuXG5mdW5jdGlvbiBzY2hlbWFFcnJvckxvb2t1cChlcnJvcnMsIF9maWVsZHMsIG5hbWUpIHtcbiAgICBjb25zdCBlcnJvciA9IGdldChlcnJvcnMsIG5hbWUpO1xuICAgIGlmIChlcnJvciB8fCBpc0tleShuYW1lKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBjb25zdCBuYW1lcyA9IG5hbWUuc3BsaXQoJy4nKTtcbiAgICB3aGlsZSAobmFtZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IG5hbWVzLmpvaW4oJy4nKTtcbiAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoX2ZpZWxkcywgZmllbGROYW1lKTtcbiAgICAgICAgY29uc3QgZm91bmRFcnJvciA9IGdldChlcnJvcnMsIGZpZWxkTmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCAmJiAhQXJyYXkuaXNBcnJheShmaWVsZCkgJiYgbmFtZSAhPT0gZmllbGROYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4geyBuYW1lIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdW5kRXJyb3IgJiYgZm91bmRFcnJvci50eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGZpZWxkTmFtZSxcbiAgICAgICAgICAgICAgICBlcnJvcjogZm91bmRFcnJvcixcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvdW5kRXJyb3IgJiYgZm91bmRFcnJvci5yb290ICYmIGZvdW5kRXJyb3Iucm9vdC50eXBlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5hbWU6IGAke2ZpZWxkTmFtZX0ucm9vdGAsXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZvdW5kRXJyb3Iucm9vdCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgbmFtZXMucG9wKCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAgIG5hbWUsXG4gICAgfTtcbn1cblxudmFyIHNob3VsZFJlbmRlckZvcm1TdGF0ZSA9IChmb3JtU3RhdGVEYXRhLCBfcHJveHlGb3JtU3RhdGUsIHVwZGF0ZUZvcm1TdGF0ZSwgaXNSb290KSA9PiB7XG4gICAgdXBkYXRlRm9ybVN0YXRlKGZvcm1TdGF0ZURhdGEpO1xuICAgIGNvbnN0IHsgbmFtZSwgLi4uZm9ybVN0YXRlIH0gPSBmb3JtU3RhdGVEYXRhO1xuICAgIHJldHVybiAoaXNFbXB0eU9iamVjdChmb3JtU3RhdGUpIHx8XG4gICAgICAgIE9iamVjdC5rZXlzKGZvcm1TdGF0ZSkubGVuZ3RoID49IE9iamVjdC5rZXlzKF9wcm94eUZvcm1TdGF0ZSkubGVuZ3RoIHx8XG4gICAgICAgIE9iamVjdC5rZXlzKGZvcm1TdGF0ZSkuZmluZCgoa2V5KSA9PiBfcHJveHlGb3JtU3RhdGVba2V5XSA9PT1cbiAgICAgICAgICAgICghaXNSb290IHx8IFZBTElEQVRJT05fTU9ERS5hbGwpKSk7XG59O1xuXG52YXIgc2hvdWxkU3Vic2NyaWJlQnlOYW1lID0gKG5hbWUsIHNpZ25hbE5hbWUsIGV4YWN0KSA9PiAhbmFtZSB8fFxuICAgICFzaWduYWxOYW1lIHx8XG4gICAgbmFtZSA9PT0gc2lnbmFsTmFtZSB8fFxuICAgIGNvbnZlcnRUb0FycmF5UGF5bG9hZChuYW1lKS5zb21lKChjdXJyZW50TmFtZSkgPT4gY3VycmVudE5hbWUgJiZcbiAgICAgICAgKGV4YWN0XG4gICAgICAgICAgICA/IGN1cnJlbnROYW1lID09PSBzaWduYWxOYW1lXG4gICAgICAgICAgICA6IGN1cnJlbnROYW1lLnN0YXJ0c1dpdGgoc2lnbmFsTmFtZSkgfHxcbiAgICAgICAgICAgICAgICBzaWduYWxOYW1lLnN0YXJ0c1dpdGgoY3VycmVudE5hbWUpKSk7XG5cbnZhciBza2lwVmFsaWRhdGlvbiA9IChpc0JsdXJFdmVudCwgaXNUb3VjaGVkLCBpc1N1Ym1pdHRlZCwgcmVWYWxpZGF0ZU1vZGUsIG1vZGUpID0+IHtcbiAgICBpZiAobW9kZS5pc09uQWxsKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIWlzU3VibWl0dGVkICYmIG1vZGUuaXNPblRvdWNoKSB7XG4gICAgICAgIHJldHVybiAhKGlzVG91Y2hlZCB8fCBpc0JsdXJFdmVudCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzU3VibWl0dGVkID8gcmVWYWxpZGF0ZU1vZGUuaXNPbkJsdXIgOiBtb2RlLmlzT25CbHVyKSB7XG4gICAgICAgIHJldHVybiAhaXNCbHVyRXZlbnQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGlzU3VibWl0dGVkID8gcmVWYWxpZGF0ZU1vZGUuaXNPbkNoYW5nZSA6IG1vZGUuaXNPbkNoYW5nZSkge1xuICAgICAgICByZXR1cm4gaXNCbHVyRXZlbnQ7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcblxudmFyIHVuc2V0RW1wdHlBcnJheSA9IChyZWYsIG5hbWUpID0+ICFjb21wYWN0KGdldChyZWYsIG5hbWUpKS5sZW5ndGggJiYgdW5zZXQocmVmLCBuYW1lKTtcblxudmFyIHVwZGF0ZUZpZWxkQXJyYXlSb290RXJyb3IgPSAoZXJyb3JzLCBlcnJvciwgbmFtZSkgPT4ge1xuICAgIGNvbnN0IGZpZWxkQXJyYXlFcnJvcnMgPSBjb252ZXJ0VG9BcnJheVBheWxvYWQoZ2V0KGVycm9ycywgbmFtZSkpO1xuICAgIHNldChmaWVsZEFycmF5RXJyb3JzLCAncm9vdCcsIGVycm9yW25hbWVdKTtcbiAgICBzZXQoZXJyb3JzLCBuYW1lLCBmaWVsZEFycmF5RXJyb3JzKTtcbiAgICByZXR1cm4gZXJyb3JzO1xufTtcblxudmFyIGlzTWVzc2FnZSA9ICh2YWx1ZSkgPT4gaXNTdHJpbmcodmFsdWUpO1xuXG5mdW5jdGlvbiBnZXRWYWxpZGF0ZUVycm9yKHJlc3VsdCwgcmVmLCB0eXBlID0gJ3ZhbGlkYXRlJykge1xuICAgIGlmIChpc01lc3NhZ2UocmVzdWx0KSB8fFxuICAgICAgICAoQXJyYXkuaXNBcnJheShyZXN1bHQpICYmIHJlc3VsdC5ldmVyeShpc01lc3NhZ2UpKSB8fFxuICAgICAgICAoaXNCb29sZWFuKHJlc3VsdCkgJiYgIXJlc3VsdCkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlOiBpc01lc3NhZ2UocmVzdWx0KSA/IHJlc3VsdCA6ICcnLFxuICAgICAgICAgICAgcmVmLFxuICAgICAgICB9O1xuICAgIH1cbn1cblxudmFyIGdldFZhbHVlQW5kTWVzc2FnZSA9ICh2YWxpZGF0aW9uRGF0YSkgPT4gaXNPYmplY3QodmFsaWRhdGlvbkRhdGEpICYmICFpc1JlZ2V4KHZhbGlkYXRpb25EYXRhKVxuICAgID8gdmFsaWRhdGlvbkRhdGFcbiAgICA6IHtcbiAgICAgICAgdmFsdWU6IHZhbGlkYXRpb25EYXRhLFxuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICB9O1xuXG52YXIgdmFsaWRhdGVGaWVsZCA9IGFzeW5jIChmaWVsZCwgZGlzYWJsZWRGaWVsZE5hbWVzLCBmb3JtVmFsdWVzLCB2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEsIHNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24sIGlzRmllbGRBcnJheSkgPT4ge1xuICAgIGNvbnN0IHsgcmVmLCByZWZzLCByZXF1aXJlZCwgbWF4TGVuZ3RoLCBtaW5MZW5ndGgsIG1pbiwgbWF4LCBwYXR0ZXJuLCB2YWxpZGF0ZSwgbmFtZSwgdmFsdWVBc051bWJlciwgbW91bnQsIH0gPSBmaWVsZC5fZjtcbiAgICBjb25zdCBpbnB1dFZhbHVlID0gZ2V0KGZvcm1WYWx1ZXMsIG5hbWUpO1xuICAgIGlmICghbW91bnQgfHwgZGlzYWJsZWRGaWVsZE5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IGlucHV0UmVmID0gcmVmcyA/IHJlZnNbMF0gOiByZWY7XG4gICAgY29uc3Qgc2V0Q3VzdG9tVmFsaWRpdHkgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICBpZiAoc2hvdWxkVXNlTmF0aXZlVmFsaWRhdGlvbiAmJiBpbnB1dFJlZi5yZXBvcnRWYWxpZGl0eSkge1xuICAgICAgICAgICAgaW5wdXRSZWYuc2V0Q3VzdG9tVmFsaWRpdHkoaXNCb29sZWFuKG1lc3NhZ2UpID8gJycgOiBtZXNzYWdlIHx8ICcnKTtcbiAgICAgICAgICAgIGlucHV0UmVmLnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGVycm9yID0ge307XG4gICAgY29uc3QgaXNSYWRpbyA9IGlzUmFkaW9JbnB1dChyZWYpO1xuICAgIGNvbnN0IGlzQ2hlY2tCb3ggPSBpc0NoZWNrQm94SW5wdXQocmVmKTtcbiAgICBjb25zdCBpc1JhZGlvT3JDaGVja2JveCA9IGlzUmFkaW8gfHwgaXNDaGVja0JveDtcbiAgICBjb25zdCBpc0VtcHR5ID0gKCh2YWx1ZUFzTnVtYmVyIHx8IGlzRmlsZUlucHV0KHJlZikpICYmXG4gICAgICAgIGlzVW5kZWZpbmVkKHJlZi52YWx1ZSkgJiZcbiAgICAgICAgaXNVbmRlZmluZWQoaW5wdXRWYWx1ZSkpIHx8XG4gICAgICAgIChpc0hUTUxFbGVtZW50KHJlZikgJiYgcmVmLnZhbHVlID09PSAnJykgfHxcbiAgICAgICAgaW5wdXRWYWx1ZSA9PT0gJycgfHxcbiAgICAgICAgKEFycmF5LmlzQXJyYXkoaW5wdXRWYWx1ZSkgJiYgIWlucHV0VmFsdWUubGVuZ3RoKTtcbiAgICBjb25zdCBhcHBlbmRFcnJvcnNDdXJyeSA9IGFwcGVuZEVycm9ycy5iaW5kKG51bGwsIG5hbWUsIHZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSwgZXJyb3IpO1xuICAgIGNvbnN0IGdldE1pbk1heE1lc3NhZ2UgPSAoZXhjZWVkTWF4LCBtYXhMZW5ndGhNZXNzYWdlLCBtaW5MZW5ndGhNZXNzYWdlLCBtYXhUeXBlID0gSU5QVVRfVkFMSURBVElPTl9SVUxFUy5tYXhMZW5ndGgsIG1pblR5cGUgPSBJTlBVVF9WQUxJREFUSU9OX1JVTEVTLm1pbkxlbmd0aCkgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gZXhjZWVkTWF4ID8gbWF4TGVuZ3RoTWVzc2FnZSA6IG1pbkxlbmd0aE1lc3NhZ2U7XG4gICAgICAgIGVycm9yW25hbWVdID0ge1xuICAgICAgICAgICAgdHlwZTogZXhjZWVkTWF4ID8gbWF4VHlwZSA6IG1pblR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgcmVmLFxuICAgICAgICAgICAgLi4uYXBwZW5kRXJyb3JzQ3VycnkoZXhjZWVkTWF4ID8gbWF4VHlwZSA6IG1pblR5cGUsIG1lc3NhZ2UpLFxuICAgICAgICB9O1xuICAgIH07XG4gICAgaWYgKGlzRmllbGRBcnJheVxuICAgICAgICA/ICFBcnJheS5pc0FycmF5KGlucHV0VmFsdWUpIHx8ICFpbnB1dFZhbHVlLmxlbmd0aFxuICAgICAgICA6IHJlcXVpcmVkICYmXG4gICAgICAgICAgICAoKCFpc1JhZGlvT3JDaGVja2JveCAmJiAoaXNFbXB0eSB8fCBpc051bGxPclVuZGVmaW5lZChpbnB1dFZhbHVlKSkpIHx8XG4gICAgICAgICAgICAgICAgKGlzQm9vbGVhbihpbnB1dFZhbHVlKSAmJiAhaW5wdXRWYWx1ZSkgfHxcbiAgICAgICAgICAgICAgICAoaXNDaGVja0JveCAmJiAhZ2V0Q2hlY2tib3hWYWx1ZShyZWZzKS5pc1ZhbGlkKSB8fFxuICAgICAgICAgICAgICAgIChpc1JhZGlvICYmICFnZXRSYWRpb1ZhbHVlKHJlZnMpLmlzVmFsaWQpKSkge1xuICAgICAgICBjb25zdCB7IHZhbHVlLCBtZXNzYWdlIH0gPSBpc01lc3NhZ2UocmVxdWlyZWQpXG4gICAgICAgICAgICA/IHsgdmFsdWU6ICEhcmVxdWlyZWQsIG1lc3NhZ2U6IHJlcXVpcmVkIH1cbiAgICAgICAgICAgIDogZ2V0VmFsdWVBbmRNZXNzYWdlKHJlcXVpcmVkKTtcbiAgICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICAgICBlcnJvcltuYW1lXSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiBJTlBVVF9WQUxJREFUSU9OX1JVTEVTLnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgcmVmOiBpbnB1dFJlZixcbiAgICAgICAgICAgICAgICAuLi5hcHBlbmRFcnJvcnNDdXJyeShJTlBVVF9WQUxJREFUSU9OX1JVTEVTLnJlcXVpcmVkLCBtZXNzYWdlKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAoIXZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSkge1xuICAgICAgICAgICAgICAgIHNldEN1c3RvbVZhbGlkaXR5KG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWlzRW1wdHkgJiYgKCFpc051bGxPclVuZGVmaW5lZChtaW4pIHx8ICFpc051bGxPclVuZGVmaW5lZChtYXgpKSkge1xuICAgICAgICBsZXQgZXhjZWVkTWF4O1xuICAgICAgICBsZXQgZXhjZWVkTWluO1xuICAgICAgICBjb25zdCBtYXhPdXRwdXQgPSBnZXRWYWx1ZUFuZE1lc3NhZ2UobWF4KTtcbiAgICAgICAgY29uc3QgbWluT3V0cHV0ID0gZ2V0VmFsdWVBbmRNZXNzYWdlKG1pbik7XG4gICAgICAgIGlmICghaXNOdWxsT3JVbmRlZmluZWQoaW5wdXRWYWx1ZSkgJiYgIWlzTmFOKGlucHV0VmFsdWUpKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZU51bWJlciA9IHJlZi52YWx1ZUFzTnVtYmVyIHx8XG4gICAgICAgICAgICAgICAgKGlucHV0VmFsdWUgPyAraW5wdXRWYWx1ZSA6IGlucHV0VmFsdWUpO1xuICAgICAgICAgICAgaWYgKCFpc051bGxPclVuZGVmaW5lZChtYXhPdXRwdXQudmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgZXhjZWVkTWF4ID0gdmFsdWVOdW1iZXIgPiBtYXhPdXRwdXQudmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzTnVsbE9yVW5kZWZpbmVkKG1pbk91dHB1dC52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBleGNlZWRNaW4gPSB2YWx1ZU51bWJlciA8IG1pbk91dHB1dC52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlRGF0ZSA9IHJlZi52YWx1ZUFzRGF0ZSB8fCBuZXcgRGF0ZShpbnB1dFZhbHVlKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRUaW1lVG9EYXRlID0gKHRpbWUpID0+IG5ldyBEYXRlKG5ldyBEYXRlKCkudG9EYXRlU3RyaW5nKCkgKyAnICcgKyB0aW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGlzVGltZSA9IHJlZi50eXBlID09ICd0aW1lJztcbiAgICAgICAgICAgIGNvbnN0IGlzV2VlayA9IHJlZi50eXBlID09ICd3ZWVrJztcbiAgICAgICAgICAgIGlmIChpc1N0cmluZyhtYXhPdXRwdXQudmFsdWUpICYmIGlucHV0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBleGNlZWRNYXggPSBpc1RpbWVcbiAgICAgICAgICAgICAgICAgICAgPyBjb252ZXJ0VGltZVRvRGF0ZShpbnB1dFZhbHVlKSA+IGNvbnZlcnRUaW1lVG9EYXRlKG1heE91dHB1dC52YWx1ZSlcbiAgICAgICAgICAgICAgICAgICAgOiBpc1dlZWtcbiAgICAgICAgICAgICAgICAgICAgICAgID8gaW5wdXRWYWx1ZSA+IG1heE91dHB1dC52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgOiB2YWx1ZURhdGUgPiBuZXcgRGF0ZShtYXhPdXRwdXQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaW5nKG1pbk91dHB1dC52YWx1ZSkgJiYgaW5wdXRWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGV4Y2VlZE1pbiA9IGlzVGltZVxuICAgICAgICAgICAgICAgICAgICA/IGNvbnZlcnRUaW1lVG9EYXRlKGlucHV0VmFsdWUpIDwgY29udmVydFRpbWVUb0RhdGUobWluT3V0cHV0LnZhbHVlKVxuICAgICAgICAgICAgICAgICAgICA6IGlzV2Vla1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBpbnB1dFZhbHVlIDwgbWluT3V0cHV0LnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHZhbHVlRGF0ZSA8IG5ldyBEYXRlKG1pbk91dHB1dC52YWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4Y2VlZE1heCB8fCBleGNlZWRNaW4pIHtcbiAgICAgICAgICAgIGdldE1pbk1heE1lc3NhZ2UoISFleGNlZWRNYXgsIG1heE91dHB1dC5tZXNzYWdlLCBtaW5PdXRwdXQubWVzc2FnZSwgSU5QVVRfVkFMSURBVElPTl9SVUxFUy5tYXgsIElOUFVUX1ZBTElEQVRJT05fUlVMRVMubWluKTtcbiAgICAgICAgICAgIGlmICghdmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhKSB7XG4gICAgICAgICAgICAgICAgc2V0Q3VzdG9tVmFsaWRpdHkoZXJyb3JbbmFtZV0ubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmICgobWF4TGVuZ3RoIHx8IG1pbkxlbmd0aCkgJiZcbiAgICAgICAgIWlzRW1wdHkgJiZcbiAgICAgICAgKGlzU3RyaW5nKGlucHV0VmFsdWUpIHx8IChpc0ZpZWxkQXJyYXkgJiYgQXJyYXkuaXNBcnJheShpbnB1dFZhbHVlKSkpKSB7XG4gICAgICAgIGNvbnN0IG1heExlbmd0aE91dHB1dCA9IGdldFZhbHVlQW5kTWVzc2FnZShtYXhMZW5ndGgpO1xuICAgICAgICBjb25zdCBtaW5MZW5ndGhPdXRwdXQgPSBnZXRWYWx1ZUFuZE1lc3NhZ2UobWluTGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZXhjZWVkTWF4ID0gIWlzTnVsbE9yVW5kZWZpbmVkKG1heExlbmd0aE91dHB1dC52YWx1ZSkgJiZcbiAgICAgICAgICAgIGlucHV0VmFsdWUubGVuZ3RoID4gK21heExlbmd0aE91dHB1dC52YWx1ZTtcbiAgICAgICAgY29uc3QgZXhjZWVkTWluID0gIWlzTnVsbE9yVW5kZWZpbmVkKG1pbkxlbmd0aE91dHB1dC52YWx1ZSkgJiZcbiAgICAgICAgICAgIGlucHV0VmFsdWUubGVuZ3RoIDwgK21pbkxlbmd0aE91dHB1dC52YWx1ZTtcbiAgICAgICAgaWYgKGV4Y2VlZE1heCB8fCBleGNlZWRNaW4pIHtcbiAgICAgICAgICAgIGdldE1pbk1heE1lc3NhZ2UoZXhjZWVkTWF4LCBtYXhMZW5ndGhPdXRwdXQubWVzc2FnZSwgbWluTGVuZ3RoT3V0cHV0Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICBzZXRDdXN0b21WYWxpZGl0eShlcnJvcltuYW1lXS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHBhdHRlcm4gJiYgIWlzRW1wdHkgJiYgaXNTdHJpbmcoaW5wdXRWYWx1ZSkpIHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZTogcGF0dGVyblZhbHVlLCBtZXNzYWdlIH0gPSBnZXRWYWx1ZUFuZE1lc3NhZ2UocGF0dGVybik7XG4gICAgICAgIGlmIChpc1JlZ2V4KHBhdHRlcm5WYWx1ZSkgJiYgIWlucHV0VmFsdWUubWF0Y2gocGF0dGVyblZhbHVlKSkge1xuICAgICAgICAgICAgZXJyb3JbbmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgdHlwZTogSU5QVVRfVkFMSURBVElPTl9SVUxFUy5wYXR0ZXJuLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgcmVmLFxuICAgICAgICAgICAgICAgIC4uLmFwcGVuZEVycm9yc0N1cnJ5KElOUFVUX1ZBTElEQVRJT05fUlVMRVMucGF0dGVybiwgbWVzc2FnZSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKCF2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICBzZXRDdXN0b21WYWxpZGl0eShtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWYgKHZhbGlkYXRlKSB7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHZhbGlkYXRlKSkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdmFsaWRhdGUoaW5wdXRWYWx1ZSwgZm9ybVZhbHVlcyk7XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZUVycm9yID0gZ2V0VmFsaWRhdGVFcnJvcihyZXN1bHQsIGlucHV0UmVmKTtcbiAgICAgICAgICAgIGlmICh2YWxpZGF0ZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgZXJyb3JbbmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLnZhbGlkYXRlRXJyb3IsXG4gICAgICAgICAgICAgICAgICAgIC4uLmFwcGVuZEVycm9yc0N1cnJ5KElOUFVUX1ZBTElEQVRJT05fUlVMRVMudmFsaWRhdGUsIHZhbGlkYXRlRXJyb3IubWVzc2FnZSksXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRlQWxsRmllbGRDcml0ZXJpYSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRDdXN0b21WYWxpZGl0eSh2YWxpZGF0ZUVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzT2JqZWN0KHZhbGlkYXRlKSkge1xuICAgICAgICAgICAgbGV0IHZhbGlkYXRpb25SZXN1bHQgPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIHZhbGlkYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0VtcHR5T2JqZWN0KHZhbGlkYXRpb25SZXN1bHQpICYmICF2YWxpZGF0ZUFsbEZpZWxkQ3JpdGVyaWEpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlRXJyb3IgPSBnZXRWYWxpZGF0ZUVycm9yKGF3YWl0IHZhbGlkYXRlW2tleV0oaW5wdXRWYWx1ZSwgZm9ybVZhbHVlcyksIGlucHV0UmVmLCBrZXkpO1xuICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi52YWxpZGF0ZUVycm9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4uYXBwZW5kRXJyb3JzQ3Vycnkoa2V5LCB2YWxpZGF0ZUVycm9yLm1lc3NhZ2UpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBzZXRDdXN0b21WYWxpZGl0eSh2YWxpZGF0ZUVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcltuYW1lXSA9IHZhbGlkYXRpb25SZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzRW1wdHlPYmplY3QodmFsaWRhdGlvblJlc3VsdCkpIHtcbiAgICAgICAgICAgICAgICBlcnJvcltuYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgcmVmOiBpbnB1dFJlZixcbiAgICAgICAgICAgICAgICAgICAgLi4udmFsaWRhdGlvblJlc3VsdCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmICghdmFsaWRhdGVBbGxGaWVsZENyaXRlcmlhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgc2V0Q3VzdG9tVmFsaWRpdHkodHJ1ZSk7XG4gICAgcmV0dXJuIGVycm9yO1xufTtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG4gICAgbW9kZTogVkFMSURBVElPTl9NT0RFLm9uU3VibWl0LFxuICAgIHJlVmFsaWRhdGVNb2RlOiBWQUxJREFUSU9OX01PREUub25DaGFuZ2UsXG4gICAgc2hvdWxkRm9jdXNFcnJvcjogdHJ1ZSxcbn07XG5mdW5jdGlvbiBjcmVhdGVGb3JtQ29udHJvbChwcm9wcyA9IHt9KSB7XG4gICAgbGV0IF9vcHRpb25zID0ge1xuICAgICAgICAuLi5kZWZhdWx0T3B0aW9ucyxcbiAgICAgICAgLi4ucHJvcHMsXG4gICAgfTtcbiAgICBsZXQgX2Zvcm1TdGF0ZSA9IHtcbiAgICAgICAgc3VibWl0Q291bnQ6IDAsXG4gICAgICAgIGlzRGlydHk6IGZhbHNlLFxuICAgICAgICBpc1JlYWR5OiBmYWxzZSxcbiAgICAgICAgaXNMb2FkaW5nOiBpc0Z1bmN0aW9uKF9vcHRpb25zLmRlZmF1bHRWYWx1ZXMpLFxuICAgICAgICBpc1ZhbGlkYXRpbmc6IGZhbHNlLFxuICAgICAgICBpc1N1Ym1pdHRlZDogZmFsc2UsXG4gICAgICAgIGlzU3VibWl0dGluZzogZmFsc2UsXG4gICAgICAgIGlzU3VibWl0U3VjY2Vzc2Z1bDogZmFsc2UsXG4gICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICB0b3VjaGVkRmllbGRzOiB7fSxcbiAgICAgICAgZGlydHlGaWVsZHM6IHt9LFxuICAgICAgICB2YWxpZGF0aW5nRmllbGRzOiB7fSxcbiAgICAgICAgZXJyb3JzOiBfb3B0aW9ucy5lcnJvcnMgfHwge30sXG4gICAgICAgIGRpc2FibGVkOiBfb3B0aW9ucy5kaXNhYmxlZCB8fCBmYWxzZSxcbiAgICB9O1xuICAgIGxldCBfZmllbGRzID0ge307XG4gICAgbGV0IF9kZWZhdWx0VmFsdWVzID0gaXNPYmplY3QoX29wdGlvbnMuZGVmYXVsdFZhbHVlcykgfHwgaXNPYmplY3QoX29wdGlvbnMudmFsdWVzKVxuICAgICAgICA/IGNsb25lT2JqZWN0KF9vcHRpb25zLmRlZmF1bHRWYWx1ZXMgfHwgX29wdGlvbnMudmFsdWVzKSB8fCB7fVxuICAgICAgICA6IHt9O1xuICAgIGxldCBfZm9ybVZhbHVlcyA9IF9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXJcbiAgICAgICAgPyB7fVxuICAgICAgICA6IGNsb25lT2JqZWN0KF9kZWZhdWx0VmFsdWVzKTtcbiAgICBsZXQgX3N0YXRlID0ge1xuICAgICAgICBhY3Rpb246IGZhbHNlLFxuICAgICAgICBtb3VudDogZmFsc2UsXG4gICAgICAgIHdhdGNoOiBmYWxzZSxcbiAgICB9O1xuICAgIGxldCBfbmFtZXMgPSB7XG4gICAgICAgIG1vdW50OiBuZXcgU2V0KCksXG4gICAgICAgIGRpc2FibGVkOiBuZXcgU2V0KCksXG4gICAgICAgIHVuTW91bnQ6IG5ldyBTZXQoKSxcbiAgICAgICAgYXJyYXk6IG5ldyBTZXQoKSxcbiAgICAgICAgd2F0Y2g6IG5ldyBTZXQoKSxcbiAgICB9O1xuICAgIGxldCBkZWxheUVycm9yQ2FsbGJhY2s7XG4gICAgbGV0IHRpbWVyID0gMDtcbiAgICBjb25zdCBfcHJveHlGb3JtU3RhdGUgPSB7XG4gICAgICAgIGlzRGlydHk6IGZhbHNlLFxuICAgICAgICBkaXJ0eUZpZWxkczogZmFsc2UsXG4gICAgICAgIHZhbGlkYXRpbmdGaWVsZHM6IGZhbHNlLFxuICAgICAgICB0b3VjaGVkRmllbGRzOiBmYWxzZSxcbiAgICAgICAgaXNWYWxpZGF0aW5nOiBmYWxzZSxcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIGVycm9yczogZmFsc2UsXG4gICAgfTtcbiAgICBsZXQgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlID0ge1xuICAgICAgICAuLi5fcHJveHlGb3JtU3RhdGUsXG4gICAgfTtcbiAgICBjb25zdCBfc3ViamVjdHMgPSB7XG4gICAgICAgIGFycmF5OiBjcmVhdGVTdWJqZWN0KCksXG4gICAgICAgIHN0YXRlOiBjcmVhdGVTdWJqZWN0KCksXG4gICAgfTtcbiAgICBjb25zdCBzaG91bGREaXNwbGF5QWxsQXNzb2NpYXRlZEVycm9ycyA9IF9vcHRpb25zLmNyaXRlcmlhTW9kZSA9PT0gVkFMSURBVElPTl9NT0RFLmFsbDtcbiAgICBjb25zdCBkZWJvdW5jZSA9IChjYWxsYmFjaykgPT4gKHdhaXQpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGNhbGxiYWNrLCB3YWl0KTtcbiAgICB9O1xuICAgIGNvbnN0IF9zZXRWYWxpZCA9IGFzeW5jIChzaG91bGRVcGRhdGVWYWxpZCkgPT4ge1xuICAgICAgICBpZiAoIV9vcHRpb25zLmRpc2FibGVkICYmXG4gICAgICAgICAgICAoX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWQgfHxcbiAgICAgICAgICAgICAgICBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuaXNWYWxpZCB8fFxuICAgICAgICAgICAgICAgIHNob3VsZFVwZGF0ZVZhbGlkKSkge1xuICAgICAgICAgICAgY29uc3QgaXNWYWxpZCA9IF9vcHRpb25zLnJlc29sdmVyXG4gICAgICAgICAgICAgICAgPyBpc0VtcHR5T2JqZWN0KChhd2FpdCBfcnVuU2NoZW1hKCkpLmVycm9ycylcbiAgICAgICAgICAgICAgICA6IGF3YWl0IGV4ZWN1dGVCdWlsdEluVmFsaWRhdGlvbihfZmllbGRzLCB0cnVlKTtcbiAgICAgICAgICAgIGlmIChpc1ZhbGlkICE9PSBfZm9ybVN0YXRlLmlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgIGlzVmFsaWQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IF91cGRhdGVJc1ZhbGlkYXRpbmcgPSAobmFtZXMsIGlzVmFsaWRhdGluZykgPT4ge1xuICAgICAgICBpZiAoIV9vcHRpb25zLmRpc2FibGVkICYmXG4gICAgICAgICAgICAoX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWRhdGluZyB8fFxuICAgICAgICAgICAgICAgIF9wcm94eUZvcm1TdGF0ZS52YWxpZGF0aW5nRmllbGRzIHx8XG4gICAgICAgICAgICAgICAgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLmlzVmFsaWRhdGluZyB8fFxuICAgICAgICAgICAgICAgIF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZS52YWxpZGF0aW5nRmllbGRzKSkge1xuICAgICAgICAgICAgKG5hbWVzIHx8IEFycmF5LmZyb20oX25hbWVzLm1vdW50KSkuZm9yRWFjaCgobmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChuYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGlzVmFsaWRhdGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBzZXQoX2Zvcm1TdGF0ZS52YWxpZGF0aW5nRmllbGRzLCBuYW1lLCBpc1ZhbGlkYXRpbmcpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHVuc2V0KF9mb3JtU3RhdGUudmFsaWRhdGluZ0ZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgdmFsaWRhdGluZ0ZpZWxkczogX2Zvcm1TdGF0ZS52YWxpZGF0aW5nRmllbGRzLFxuICAgICAgICAgICAgICAgIGlzVmFsaWRhdGluZzogIWlzRW1wdHlPYmplY3QoX2Zvcm1TdGF0ZS52YWxpZGF0aW5nRmllbGRzKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBfc2V0RmllbGRBcnJheSA9IChuYW1lLCB2YWx1ZXMgPSBbXSwgbWV0aG9kLCBhcmdzLCBzaG91bGRTZXRWYWx1ZXMgPSB0cnVlLCBzaG91bGRVcGRhdGVGaWVsZHNBbmRTdGF0ZSA9IHRydWUpID0+IHtcbiAgICAgICAgaWYgKGFyZ3MgJiYgbWV0aG9kICYmICFfb3B0aW9ucy5kaXNhYmxlZCkge1xuICAgICAgICAgICAgX3N0YXRlLmFjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICBpZiAoc2hvdWxkVXBkYXRlRmllbGRzQW5kU3RhdGUgJiYgQXJyYXkuaXNBcnJheShnZXQoX2ZpZWxkcywgbmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGRWYWx1ZXMgPSBtZXRob2QoZ2V0KF9maWVsZHMsIG5hbWUpLCBhcmdzLmFyZ0EsIGFyZ3MuYXJnQik7XG4gICAgICAgICAgICAgICAgc2hvdWxkU2V0VmFsdWVzICYmIHNldChfZmllbGRzLCBuYW1lLCBmaWVsZFZhbHVlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc2hvdWxkVXBkYXRlRmllbGRzQW5kU3RhdGUgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGdldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSkpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gbWV0aG9kKGdldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSksIGFyZ3MuYXJnQSwgYXJncy5hcmdCKTtcbiAgICAgICAgICAgICAgICBzaG91bGRTZXRWYWx1ZXMgJiYgc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lLCBlcnJvcnMpO1xuICAgICAgICAgICAgICAgIHVuc2V0RW1wdHlBcnJheShfZm9ybVN0YXRlLmVycm9ycywgbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKF9wcm94eUZvcm1TdGF0ZS50b3VjaGVkRmllbGRzIHx8XG4gICAgICAgICAgICAgICAgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLnRvdWNoZWRGaWVsZHMpICYmXG4gICAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlRmllbGRzQW5kU3RhdGUgJiZcbiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KGdldChfZm9ybVN0YXRlLnRvdWNoZWRGaWVsZHMsIG5hbWUpKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvdWNoZWRGaWVsZHMgPSBtZXRob2QoZ2V0KF9mb3JtU3RhdGUudG91Y2hlZEZpZWxkcywgbmFtZSksIGFyZ3MuYXJnQSwgYXJncy5hcmdCKTtcbiAgICAgICAgICAgICAgICBzaG91bGRTZXRWYWx1ZXMgJiYgc2V0KF9mb3JtU3RhdGUudG91Y2hlZEZpZWxkcywgbmFtZSwgdG91Y2hlZEZpZWxkcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3Byb3h5Rm9ybVN0YXRlLmRpcnR5RmllbGRzIHx8IF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZS5kaXJ0eUZpZWxkcykge1xuICAgICAgICAgICAgICAgIF9mb3JtU3RhdGUuZGlydHlGaWVsZHMgPSBnZXREaXJ0eUZpZWxkcyhfZGVmYXVsdFZhbHVlcywgX2Zvcm1WYWx1ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgaXNEaXJ0eTogX2dldERpcnR5KG5hbWUsIHZhbHVlcyksXG4gICAgICAgICAgICAgICAgZGlydHlGaWVsZHM6IF9mb3JtU3RhdGUuZGlydHlGaWVsZHMsXG4gICAgICAgICAgICAgICAgZXJyb3JzOiBfZm9ybVN0YXRlLmVycm9ycyxcbiAgICAgICAgICAgICAgICBpc1ZhbGlkOiBfZm9ybVN0YXRlLmlzVmFsaWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHNldChfZm9ybVZhbHVlcywgbmFtZSwgdmFsdWVzKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgdXBkYXRlRXJyb3JzID0gKG5hbWUsIGVycm9yKSA9PiB7XG4gICAgICAgIHNldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSwgZXJyb3IpO1xuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICBlcnJvcnM6IF9mb3JtU3RhdGUuZXJyb3JzLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IF9zZXRFcnJvcnMgPSAoZXJyb3JzKSA9PiB7XG4gICAgICAgIF9mb3JtU3RhdGUuZXJyb3JzID0gZXJyb3JzO1xuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICBlcnJvcnM6IF9mb3JtU3RhdGUuZXJyb3JzLFxuICAgICAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgdXBkYXRlVmFsaWRBbmRWYWx1ZSA9IChuYW1lLCBzaG91bGRTa2lwU2V0VmFsdWVBcywgdmFsdWUsIHJlZikgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSBnZXQoX2Zvcm1WYWx1ZXMsIG5hbWUsIGlzVW5kZWZpbmVkKHZhbHVlKSA/IGdldChfZGVmYXVsdFZhbHVlcywgbmFtZSkgOiB2YWx1ZSk7XG4gICAgICAgICAgICBpc1VuZGVmaW5lZChkZWZhdWx0VmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgKHJlZiAmJiByZWYuZGVmYXVsdENoZWNrZWQpIHx8XG4gICAgICAgICAgICAgICAgc2hvdWxkU2tpcFNldFZhbHVlQXNcbiAgICAgICAgICAgICAgICA/IHNldChfZm9ybVZhbHVlcywgbmFtZSwgc2hvdWxkU2tpcFNldFZhbHVlQXMgPyBkZWZhdWx0VmFsdWUgOiBnZXRGaWVsZFZhbHVlKGZpZWxkLl9mKSlcbiAgICAgICAgICAgICAgICA6IHNldEZpZWxkVmFsdWUobmFtZSwgZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICAgIF9zdGF0ZS5tb3VudCAmJiBfc2V0VmFsaWQoKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgdXBkYXRlVG91Y2hBbmREaXJ0eSA9IChuYW1lLCBmaWVsZFZhbHVlLCBpc0JsdXJFdmVudCwgc2hvdWxkRGlydHksIHNob3VsZFJlbmRlcikgPT4ge1xuICAgICAgICBsZXQgc2hvdWxkVXBkYXRlRmllbGQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGlzUHJldmlvdXNEaXJ0eSA9IGZhbHNlO1xuICAgICAgICBjb25zdCBvdXRwdXQgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoIV9vcHRpb25zLmRpc2FibGVkKSB7XG4gICAgICAgICAgICBpZiAoIWlzQmx1ckV2ZW50IHx8IHNob3VsZERpcnR5KSB7XG4gICAgICAgICAgICAgICAgaWYgKF9wcm94eUZvcm1TdGF0ZS5pc0RpcnR5IHx8IF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZS5pc0RpcnR5KSB7XG4gICAgICAgICAgICAgICAgICAgIGlzUHJldmlvdXNEaXJ0eSA9IF9mb3JtU3RhdGUuaXNEaXJ0eTtcbiAgICAgICAgICAgICAgICAgICAgX2Zvcm1TdGF0ZS5pc0RpcnR5ID0gb3V0cHV0LmlzRGlydHkgPSBfZ2V0RGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlRmllbGQgPSBpc1ByZXZpb3VzRGlydHkgIT09IG91dHB1dC5pc0RpcnR5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRGaWVsZFByaXN0aW5lID0gZGVlcEVxdWFsKGdldChfZGVmYXVsdFZhbHVlcywgbmFtZSksIGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgICAgIGlzUHJldmlvdXNEaXJ0eSA9ICEhZ2V0KF9mb3JtU3RhdGUuZGlydHlGaWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgICAgIGlzQ3VycmVudEZpZWxkUHJpc3RpbmVcbiAgICAgICAgICAgICAgICAgICAgPyB1bnNldChfZm9ybVN0YXRlLmRpcnR5RmllbGRzLCBuYW1lKVxuICAgICAgICAgICAgICAgICAgICA6IHNldChfZm9ybVN0YXRlLmRpcnR5RmllbGRzLCBuYW1lLCB0cnVlKTtcbiAgICAgICAgICAgICAgICBvdXRwdXQuZGlydHlGaWVsZHMgPSBfZm9ybVN0YXRlLmRpcnR5RmllbGRzO1xuICAgICAgICAgICAgICAgIHNob3VsZFVwZGF0ZUZpZWxkID1cbiAgICAgICAgICAgICAgICAgICAgc2hvdWxkVXBkYXRlRmllbGQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICgoX3Byb3h5Rm9ybVN0YXRlLmRpcnR5RmllbGRzIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLmRpcnR5RmllbGRzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJldmlvdXNEaXJ0eSAhPT0gIWlzQ3VycmVudEZpZWxkUHJpc3RpbmUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQmx1ckV2ZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaXNQcmV2aW91c0ZpZWxkVG91Y2hlZCA9IGdldChfZm9ybVN0YXRlLnRvdWNoZWRGaWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmICghaXNQcmV2aW91c0ZpZWxkVG91Y2hlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZXQoX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzLCBuYW1lLCBpc0JsdXJFdmVudCk7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dC50b3VjaGVkRmllbGRzID0gX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzO1xuICAgICAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWVsZCA9XG4gICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRVcGRhdGVGaWVsZCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoX3Byb3h5Rm9ybVN0YXRlLnRvdWNoZWRGaWVsZHMgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLnRvdWNoZWRGaWVsZHMpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJldmlvdXNGaWVsZFRvdWNoZWQgIT09IGlzQmx1ckV2ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzaG91bGRVcGRhdGVGaWVsZCAmJiBzaG91bGRSZW5kZXIgJiYgX3N1YmplY3RzLnN0YXRlLm5leHQob3V0cHV0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc2hvdWxkVXBkYXRlRmllbGQgPyBvdXRwdXQgOiB7fTtcbiAgICB9O1xuICAgIGNvbnN0IHNob3VsZFJlbmRlckJ5RXJyb3IgPSAobmFtZSwgaXNWYWxpZCwgZXJyb3IsIGZpZWxkU3RhdGUpID0+IHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNGaWVsZEVycm9yID0gZ2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKTtcbiAgICAgICAgY29uc3Qgc2hvdWxkVXBkYXRlVmFsaWQgPSAoX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWQgfHwgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLmlzVmFsaWQpICYmXG4gICAgICAgICAgICBpc0Jvb2xlYW4oaXNWYWxpZCkgJiZcbiAgICAgICAgICAgIF9mb3JtU3RhdGUuaXNWYWxpZCAhPT0gaXNWYWxpZDtcbiAgICAgICAgaWYgKF9vcHRpb25zLmRlbGF5RXJyb3IgJiYgZXJyb3IpIHtcbiAgICAgICAgICAgIGRlbGF5RXJyb3JDYWxsYmFjayA9IGRlYm91bmNlKCgpID0+IHVwZGF0ZUVycm9ycyhuYW1lLCBlcnJvcikpO1xuICAgICAgICAgICAgZGVsYXlFcnJvckNhbGxiYWNrKF9vcHRpb25zLmRlbGF5RXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgIGRlbGF5RXJyb3JDYWxsYmFjayA9IG51bGw7XG4gICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICAgID8gc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lLCBlcnJvcilcbiAgICAgICAgICAgICAgICA6IHVuc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKGVycm9yID8gIWRlZXBFcXVhbChwcmV2aW91c0ZpZWxkRXJyb3IsIGVycm9yKSA6IHByZXZpb3VzRmllbGRFcnJvcikgfHxcbiAgICAgICAgICAgICFpc0VtcHR5T2JqZWN0KGZpZWxkU3RhdGUpIHx8XG4gICAgICAgICAgICBzaG91bGRVcGRhdGVWYWxpZCkge1xuICAgICAgICAgICAgY29uc3QgdXBkYXRlZEZvcm1TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5maWVsZFN0YXRlLFxuICAgICAgICAgICAgICAgIC4uLihzaG91bGRVcGRhdGVWYWxpZCAmJiBpc0Jvb2xlYW4oaXNWYWxpZCkgPyB7IGlzVmFsaWQgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICBlcnJvcnM6IF9mb3JtU3RhdGUuZXJyb3JzLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgX2Zvcm1TdGF0ZSA9IHtcbiAgICAgICAgICAgICAgICAuLi5fZm9ybVN0YXRlLFxuICAgICAgICAgICAgICAgIC4uLnVwZGF0ZWRGb3JtU3RhdGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQodXBkYXRlZEZvcm1TdGF0ZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IF9ydW5TY2hlbWEgPSBhc3luYyAobmFtZSkgPT4ge1xuICAgICAgICBfdXBkYXRlSXNWYWxpZGF0aW5nKG5hbWUsIHRydWUpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBfb3B0aW9ucy5yZXNvbHZlcihfZm9ybVZhbHVlcywgX29wdGlvbnMuY29udGV4dCwgZ2V0UmVzb2x2ZXJPcHRpb25zKG5hbWUgfHwgX25hbWVzLm1vdW50LCBfZmllbGRzLCBfb3B0aW9ucy5jcml0ZXJpYU1vZGUsIF9vcHRpb25zLnNob3VsZFVzZU5hdGl2ZVZhbGlkYXRpb24pKTtcbiAgICAgICAgX3VwZGF0ZUlzVmFsaWRhdGluZyhuYW1lKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICAgIGNvbnN0IGV4ZWN1dGVTY2hlbWFBbmRVcGRhdGVTdGF0ZSA9IGFzeW5jIChuYW1lcykgPT4ge1xuICAgICAgICBjb25zdCB7IGVycm9ycyB9ID0gYXdhaXQgX3J1blNjaGVtYShuYW1lcyk7XG4gICAgICAgIGlmIChuYW1lcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBnZXQoZXJyb3JzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICBlcnJvclxuICAgICAgICAgICAgICAgICAgICA/IHNldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSwgZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgIDogdW5zZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgX2Zvcm1TdGF0ZS5lcnJvcnMgPSBlcnJvcnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVycm9ycztcbiAgICB9O1xuICAgIGNvbnN0IGV4ZWN1dGVCdWlsdEluVmFsaWRhdGlvbiA9IGFzeW5jIChmaWVsZHMsIHNob3VsZE9ubHlDaGVja1ZhbGlkLCBjb250ZXh0ID0ge1xuICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICB9KSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBmaWVsZHMpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZmllbGRzW25hbWVdO1xuICAgICAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBfZiwgLi4uZmllbGRWYWx1ZSB9ID0gZmllbGQ7XG4gICAgICAgICAgICAgICAgaWYgKF9mKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzRmllbGRBcnJheVJvb3QgPSBfbmFtZXMuYXJyYXkuaGFzKF9mLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1Byb21pc2VGdW5jdGlvbiA9IGZpZWxkLl9mICYmIGhhc1Byb21pc2VWYWxpZGF0aW9uKGZpZWxkLl9mKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJvbWlzZUZ1bmN0aW9uICYmIF9wcm94eUZvcm1TdGF0ZS52YWxpZGF0aW5nRmllbGRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdXBkYXRlSXNWYWxpZGF0aW5nKFtuYW1lXSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRFcnJvciA9IGF3YWl0IHZhbGlkYXRlRmllbGQoZmllbGQsIF9uYW1lcy5kaXNhYmxlZCwgX2Zvcm1WYWx1ZXMsIHNob3VsZERpc3BsYXlBbGxBc3NvY2lhdGVkRXJyb3JzLCBfb3B0aW9ucy5zaG91bGRVc2VOYXRpdmVWYWxpZGF0aW9uICYmICFzaG91bGRPbmx5Q2hlY2tWYWxpZCwgaXNGaWVsZEFycmF5Um9vdCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc1Byb21pc2VGdW5jdGlvbiAmJiBfcHJveHlGb3JtU3RhdGUudmFsaWRhdGluZ0ZpZWxkcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3VwZGF0ZUlzVmFsaWRhdGluZyhbbmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZEVycm9yW19mLm5hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkT25seUNoZWNrVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAhc2hvdWxkT25seUNoZWNrVmFsaWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIChnZXQoZmllbGRFcnJvciwgX2YubmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGlzRmllbGRBcnJheVJvb3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB1cGRhdGVGaWVsZEFycmF5Um9vdEVycm9yKF9mb3JtU3RhdGUuZXJyb3JzLCBmaWVsZEVycm9yLCBfZi5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHNldChfZm9ybVN0YXRlLmVycm9ycywgX2YubmFtZSwgZmllbGRFcnJvcltfZi5uYW1lXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuc2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBfZi5uYW1lKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICFpc0VtcHR5T2JqZWN0KGZpZWxkVmFsdWUpICYmXG4gICAgICAgICAgICAgICAgICAgIChhd2FpdCBleGVjdXRlQnVpbHRJblZhbGlkYXRpb24oZmllbGRWYWx1ZSwgc2hvdWxkT25seUNoZWNrVmFsaWQsIGNvbnRleHQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udGV4dC52YWxpZDtcbiAgICB9O1xuICAgIGNvbnN0IF9yZW1vdmVVbm1vdW50ZWQgPSAoKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBfbmFtZXMudW5Nb3VudCkge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICBmaWVsZCAmJlxuICAgICAgICAgICAgICAgIChmaWVsZC5fZi5yZWZzXG4gICAgICAgICAgICAgICAgICAgID8gZmllbGQuX2YucmVmcy5ldmVyeSgocmVmKSA9PiAhbGl2ZShyZWYpKVxuICAgICAgICAgICAgICAgICAgICA6ICFsaXZlKGZpZWxkLl9mLnJlZikpICYmXG4gICAgICAgICAgICAgICAgdW5yZWdpc3RlcihuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBfbmFtZXMudW5Nb3VudCA9IG5ldyBTZXQoKTtcbiAgICB9O1xuICAgIGNvbnN0IF9nZXREaXJ0eSA9IChuYW1lLCBkYXRhKSA9PiAhX29wdGlvbnMuZGlzYWJsZWQgJiZcbiAgICAgICAgKG5hbWUgJiYgZGF0YSAmJiBzZXQoX2Zvcm1WYWx1ZXMsIG5hbWUsIGRhdGEpLFxuICAgICAgICAgICAgIWRlZXBFcXVhbChnZXRWYWx1ZXMoKSwgX2RlZmF1bHRWYWx1ZXMpKTtcbiAgICBjb25zdCBfZ2V0V2F0Y2ggPSAobmFtZXMsIGRlZmF1bHRWYWx1ZSwgaXNHbG9iYWwpID0+IGdlbmVyYXRlV2F0Y2hPdXRwdXQobmFtZXMsIF9uYW1lcywge1xuICAgICAgICAuLi4oX3N0YXRlLm1vdW50XG4gICAgICAgICAgICA/IF9mb3JtVmFsdWVzXG4gICAgICAgICAgICA6IGlzVW5kZWZpbmVkKGRlZmF1bHRWYWx1ZSlcbiAgICAgICAgICAgICAgICA/IF9kZWZhdWx0VmFsdWVzXG4gICAgICAgICAgICAgICAgOiBpc1N0cmluZyhuYW1lcylcbiAgICAgICAgICAgICAgICAgICAgPyB7IFtuYW1lc106IGRlZmF1bHRWYWx1ZSB9XG4gICAgICAgICAgICAgICAgICAgIDogZGVmYXVsdFZhbHVlKSxcbiAgICB9LCBpc0dsb2JhbCwgZGVmYXVsdFZhbHVlKTtcbiAgICBjb25zdCBfZ2V0RmllbGRBcnJheSA9IChuYW1lKSA9PiBjb21wYWN0KGdldChfc3RhdGUubW91bnQgPyBfZm9ybVZhbHVlcyA6IF9kZWZhdWx0VmFsdWVzLCBuYW1lLCBfb3B0aW9ucy5zaG91bGRVbnJlZ2lzdGVyID8gZ2V0KF9kZWZhdWx0VmFsdWVzLCBuYW1lLCBbXSkgOiBbXSkpO1xuICAgIGNvbnN0IHNldEZpZWxkVmFsdWUgPSAobmFtZSwgdmFsdWUsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgbGV0IGZpZWxkVmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZFJlZmVyZW5jZSA9IGZpZWxkLl9mO1xuICAgICAgICAgICAgaWYgKGZpZWxkUmVmZXJlbmNlKSB7XG4gICAgICAgICAgICAgICAgIWZpZWxkUmVmZXJlbmNlLmRpc2FibGVkICYmXG4gICAgICAgICAgICAgICAgICAgIHNldChfZm9ybVZhbHVlcywgbmFtZSwgZ2V0RmllbGRWYWx1ZUFzKHZhbHVlLCBmaWVsZFJlZmVyZW5jZSkpO1xuICAgICAgICAgICAgICAgIGZpZWxkVmFsdWUgPVxuICAgICAgICAgICAgICAgICAgICBpc0hUTUxFbGVtZW50KGZpZWxkUmVmZXJlbmNlLnJlZikgJiYgaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHZhbHVlO1xuICAgICAgICAgICAgICAgIGlmIChpc011bHRpcGxlU2VsZWN0KGZpZWxkUmVmZXJlbmNlLnJlZikpIHtcbiAgICAgICAgICAgICAgICAgICAgWy4uLmZpZWxkUmVmZXJlbmNlLnJlZi5vcHRpb25zXS5mb3JFYWNoKChvcHRpb25SZWYpID0+IChvcHRpb25SZWYuc2VsZWN0ZWQgPSBmaWVsZFZhbHVlLmluY2x1ZGVzKG9wdGlvblJlZi52YWx1ZSkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZmllbGRSZWZlcmVuY2UucmVmcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNDaGVja0JveElucHV0KGZpZWxkUmVmZXJlbmNlLnJlZikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkUmVmZXJlbmNlLnJlZnMuZm9yRWFjaCgoY2hlY2tib3hSZWYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrYm94UmVmLmRlZmF1bHRDaGVja2VkIHx8ICFjaGVja2JveFJlZi5kaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tib3hSZWYuY2hlY2tlZCA9ICEhZmllbGRWYWx1ZS5maW5kKChkYXRhKSA9PiBkYXRhID09PSBjaGVja2JveFJlZi52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveFJlZi5jaGVja2VkID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFZhbHVlID09PSBjaGVja2JveFJlZi52YWx1ZSB8fCAhIWZpZWxkVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkUmVmZXJlbmNlLnJlZnMuZm9yRWFjaCgocmFkaW9SZWYpID0+IChyYWRpb1JlZi5jaGVja2VkID0gcmFkaW9SZWYudmFsdWUgPT09IGZpZWxkVmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChpc0ZpbGVJbnB1dChmaWVsZFJlZmVyZW5jZS5yZWYpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkUmVmZXJlbmNlLnJlZi52YWx1ZSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmllbGRSZWZlcmVuY2UucmVmLnZhbHVlID0gZmllbGRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWVsZFJlZmVyZW5jZS5yZWYudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBjbG9uZU9iamVjdChfZm9ybVZhbHVlcyksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAob3B0aW9ucy5zaG91bGREaXJ0eSB8fCBvcHRpb25zLnNob3VsZFRvdWNoKSAmJlxuICAgICAgICAgICAgdXBkYXRlVG91Y2hBbmREaXJ0eShuYW1lLCBmaWVsZFZhbHVlLCBvcHRpb25zLnNob3VsZFRvdWNoLCBvcHRpb25zLnNob3VsZERpcnR5LCB0cnVlKTtcbiAgICAgICAgb3B0aW9ucy5zaG91bGRWYWxpZGF0ZSAmJiB0cmlnZ2VyKG5hbWUpO1xuICAgIH07XG4gICAgY29uc3Qgc2V0VmFsdWVzID0gKG5hbWUsIHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZmllbGRLZXkgaW4gdmFsdWUpIHtcbiAgICAgICAgICAgIGlmICghdmFsdWUuaGFzT3duUHJvcGVydHkoZmllbGRLZXkpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHZhbHVlW2ZpZWxkS2V5XTtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IG5hbWUgKyAnLicgKyBmaWVsZEtleTtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIGZpZWxkTmFtZSk7XG4gICAgICAgICAgICAoX25hbWVzLmFycmF5LmhhcyhuYW1lKSB8fFxuICAgICAgICAgICAgICAgIGlzT2JqZWN0KGZpZWxkVmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgKGZpZWxkICYmICFmaWVsZC5fZikpICYmXG4gICAgICAgICAgICAgICAgIWlzRGF0ZU9iamVjdChmaWVsZFZhbHVlKVxuICAgICAgICAgICAgICAgID8gc2V0VmFsdWVzKGZpZWxkTmFtZSwgZmllbGRWYWx1ZSwgb3B0aW9ucylcbiAgICAgICAgICAgICAgICA6IHNldEZpZWxkVmFsdWUoZmllbGROYW1lLCBmaWVsZFZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgc2V0VmFsdWUgPSAobmFtZSwgdmFsdWUsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgY29uc3QgaXNGaWVsZEFycmF5ID0gX25hbWVzLmFycmF5LmhhcyhuYW1lKTtcbiAgICAgICAgY29uc3QgY2xvbmVWYWx1ZSA9IGNsb25lT2JqZWN0KHZhbHVlKTtcbiAgICAgICAgc2V0KF9mb3JtVmFsdWVzLCBuYW1lLCBjbG9uZVZhbHVlKTtcbiAgICAgICAgaWYgKGlzRmllbGRBcnJheSkge1xuICAgICAgICAgICAgX3N1YmplY3RzLmFycmF5Lm5leHQoe1xuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWVzOiBjbG9uZU9iamVjdChfZm9ybVZhbHVlcyksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICgoX3Byb3h5Rm9ybVN0YXRlLmlzRGlydHkgfHxcbiAgICAgICAgICAgICAgICBfcHJveHlGb3JtU3RhdGUuZGlydHlGaWVsZHMgfHxcbiAgICAgICAgICAgICAgICBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuaXNEaXJ0eSB8fFxuICAgICAgICAgICAgICAgIF9wcm94eVN1YnNjcmliZUZvcm1TdGF0ZS5kaXJ0eUZpZWxkcykgJiZcbiAgICAgICAgICAgICAgICBvcHRpb25zLnNob3VsZERpcnR5KSB7XG4gICAgICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICBkaXJ0eUZpZWxkczogZ2V0RGlydHlGaWVsZHMoX2RlZmF1bHRWYWx1ZXMsIF9mb3JtVmFsdWVzKSxcbiAgICAgICAgICAgICAgICAgICAgaXNEaXJ0eTogX2dldERpcnR5KG5hbWUsIGNsb25lVmFsdWUpLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZmllbGQgJiYgIWZpZWxkLl9mICYmICFpc051bGxPclVuZGVmaW5lZChjbG9uZVZhbHVlKVxuICAgICAgICAgICAgICAgID8gc2V0VmFsdWVzKG5hbWUsIGNsb25lVmFsdWUsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgOiBzZXRGaWVsZFZhbHVlKG5hbWUsIGNsb25lVmFsdWUsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGlzV2F0Y2hlZChuYW1lLCBfbmFtZXMpICYmIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHsgLi4uX2Zvcm1TdGF0ZSB9KTtcbiAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgbmFtZTogX3N0YXRlLm1vdW50ID8gbmFtZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHZhbHVlczogY2xvbmVPYmplY3QoX2Zvcm1WYWx1ZXMpLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IG9uQ2hhbmdlID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICAgIF9zdGF0ZS5tb3VudCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICAgICAgbGV0IG5hbWUgPSB0YXJnZXQubmFtZTtcbiAgICAgICAgbGV0IGlzRmllbGRWYWx1ZVVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgY29uc3QgX3VwZGF0ZUlzRmllbGRWYWx1ZVVwZGF0ZWQgPSAoZmllbGRWYWx1ZSkgPT4ge1xuICAgICAgICAgICAgaXNGaWVsZFZhbHVlVXBkYXRlZCA9XG4gICAgICAgICAgICAgICAgTnVtYmVyLmlzTmFOKGZpZWxkVmFsdWUpIHx8XG4gICAgICAgICAgICAgICAgICAgIChpc0RhdGVPYmplY3QoZmllbGRWYWx1ZSkgJiYgaXNOYU4oZmllbGRWYWx1ZS5nZXRUaW1lKCkpKSB8fFxuICAgICAgICAgICAgICAgICAgICBkZWVwRXF1YWwoZmllbGRWYWx1ZSwgZ2V0KF9mb3JtVmFsdWVzLCBuYW1lLCBmaWVsZFZhbHVlKSk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25Nb2RlQmVmb3JlU3VibWl0ID0gZ2V0VmFsaWRhdGlvbk1vZGVzKF9vcHRpb25zLm1vZGUpO1xuICAgICAgICBjb25zdCB2YWxpZGF0aW9uTW9kZUFmdGVyU3VibWl0ID0gZ2V0VmFsaWRhdGlvbk1vZGVzKF9vcHRpb25zLnJlVmFsaWRhdGVNb2RlKTtcbiAgICAgICAgaWYgKGZpZWxkKSB7XG4gICAgICAgICAgICBsZXQgZXJyb3I7XG4gICAgICAgICAgICBsZXQgaXNWYWxpZDtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkVmFsdWUgPSB0YXJnZXQudHlwZVxuICAgICAgICAgICAgICAgID8gZ2V0RmllbGRWYWx1ZShmaWVsZC5fZilcbiAgICAgICAgICAgICAgICA6IGdldEV2ZW50VmFsdWUoZXZlbnQpO1xuICAgICAgICAgICAgY29uc3QgaXNCbHVyRXZlbnQgPSBldmVudC50eXBlID09PSBFVkVOVFMuQkxVUiB8fCBldmVudC50eXBlID09PSBFVkVOVFMuRk9DVVNfT1VUO1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkU2tpcFZhbGlkYXRpb24gPSAoIWhhc1ZhbGlkYXRpb24oZmllbGQuX2YpICYmXG4gICAgICAgICAgICAgICAgIV9vcHRpb25zLnJlc29sdmVyICYmXG4gICAgICAgICAgICAgICAgIWdldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSkgJiZcbiAgICAgICAgICAgICAgICAhZmllbGQuX2YuZGVwcykgfHxcbiAgICAgICAgICAgICAgICBza2lwVmFsaWRhdGlvbihpc0JsdXJFdmVudCwgZ2V0KF9mb3JtU3RhdGUudG91Y2hlZEZpZWxkcywgbmFtZSksIF9mb3JtU3RhdGUuaXNTdWJtaXR0ZWQsIHZhbGlkYXRpb25Nb2RlQWZ0ZXJTdWJtaXQsIHZhbGlkYXRpb25Nb2RlQmVmb3JlU3VibWl0KTtcbiAgICAgICAgICAgIGNvbnN0IHdhdGNoZWQgPSBpc1dhdGNoZWQobmFtZSwgX25hbWVzLCBpc0JsdXJFdmVudCk7XG4gICAgICAgICAgICBzZXQoX2Zvcm1WYWx1ZXMsIG5hbWUsIGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgaWYgKGlzQmx1ckV2ZW50KSB7XG4gICAgICAgICAgICAgICAgZmllbGQuX2Yub25CbHVyICYmIGZpZWxkLl9mLm9uQmx1cihldmVudCk7XG4gICAgICAgICAgICAgICAgZGVsYXlFcnJvckNhbGxiYWNrICYmIGRlbGF5RXJyb3JDYWxsYmFjaygwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkLl9mLm9uQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuX2Yub25DaGFuZ2UoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZmllbGRTdGF0ZSA9IHVwZGF0ZVRvdWNoQW5kRGlydHkobmFtZSwgZmllbGRWYWx1ZSwgaXNCbHVyRXZlbnQpO1xuICAgICAgICAgICAgY29uc3Qgc2hvdWxkUmVuZGVyID0gIWlzRW1wdHlPYmplY3QoZmllbGRTdGF0ZSkgfHwgd2F0Y2hlZDtcbiAgICAgICAgICAgICFpc0JsdXJFdmVudCAmJlxuICAgICAgICAgICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogZXZlbnQudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBjbG9uZU9iamVjdChfZm9ybVZhbHVlcyksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoc2hvdWxkU2tpcFZhbGlkYXRpb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWQgfHwgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLmlzVmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9vcHRpb25zLm1vZGUgPT09ICdvbkJsdXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNCbHVyRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfc2V0VmFsaWQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghaXNCbHVyRXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9zZXRWYWxpZCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAoc2hvdWxkUmVuZGVyICYmXG4gICAgICAgICAgICAgICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHsgbmFtZSwgLi4uKHdhdGNoZWQgPyB7fSA6IGZpZWxkU3RhdGUpIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICFpc0JsdXJFdmVudCAmJiB3YXRjaGVkICYmIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHsgLi4uX2Zvcm1TdGF0ZSB9KTtcbiAgICAgICAgICAgIGlmIChfb3B0aW9ucy5yZXNvbHZlcikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgZXJyb3JzIH0gPSBhd2FpdCBfcnVuU2NoZW1hKFtuYW1lXSk7XG4gICAgICAgICAgICAgICAgX3VwZGF0ZUlzRmllbGRWYWx1ZVVwZGF0ZWQoZmllbGRWYWx1ZSk7XG4gICAgICAgICAgICAgICAgaWYgKGlzRmllbGRWYWx1ZVVwZGF0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNFcnJvckxvb2t1cFJlc3VsdCA9IHNjaGVtYUVycm9yTG9va3VwKF9mb3JtU3RhdGUuZXJyb3JzLCBfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JMb29rdXBSZXN1bHQgPSBzY2hlbWFFcnJvckxvb2t1cChlcnJvcnMsIF9maWVsZHMsIHByZXZpb3VzRXJyb3JMb29rdXBSZXN1bHQubmFtZSB8fCBuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnJvckxvb2t1cFJlc3VsdC5lcnJvcjtcbiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGVycm9yTG9va3VwUmVzdWx0Lm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgPSBpc0VtcHR5T2JqZWN0KGVycm9ycyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgX3VwZGF0ZUlzVmFsaWRhdGluZyhbbmFtZV0sIHRydWUpO1xuICAgICAgICAgICAgICAgIGVycm9yID0gKGF3YWl0IHZhbGlkYXRlRmllbGQoZmllbGQsIF9uYW1lcy5kaXNhYmxlZCwgX2Zvcm1WYWx1ZXMsIHNob3VsZERpc3BsYXlBbGxBc3NvY2lhdGVkRXJyb3JzLCBfb3B0aW9ucy5zaG91bGRVc2VOYXRpdmVWYWxpZGF0aW9uKSlbbmFtZV07XG4gICAgICAgICAgICAgICAgX3VwZGF0ZUlzVmFsaWRhdGluZyhbbmFtZV0pO1xuICAgICAgICAgICAgICAgIF91cGRhdGVJc0ZpZWxkVmFsdWVVcGRhdGVkKGZpZWxkVmFsdWUpO1xuICAgICAgICAgICAgICAgIGlmIChpc0ZpZWxkVmFsdWVVcGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9wcm94eUZvcm1TdGF0ZS5pc1ZhbGlkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUuaXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNWYWxpZCA9IGF3YWl0IGV4ZWN1dGVCdWlsdEluVmFsaWRhdGlvbihfZmllbGRzLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0ZpZWxkVmFsdWVVcGRhdGVkKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuX2YuZGVwcyAmJlxuICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKGZpZWxkLl9mLmRlcHMpO1xuICAgICAgICAgICAgICAgIHNob3VsZFJlbmRlckJ5RXJyb3IobmFtZSwgaXNWYWxpZCwgZXJyb3IsIGZpZWxkU3RhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBfZm9jdXNJbnB1dCA9IChyZWYsIGtleSkgPT4ge1xuICAgICAgICBpZiAoZ2V0KF9mb3JtU3RhdGUuZXJyb3JzLCBrZXkpICYmIHJlZi5mb2N1cykge1xuICAgICAgICAgICAgcmVmLmZvY3VzKCk7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgfTtcbiAgICBjb25zdCB0cmlnZ2VyID0gYXN5bmMgKG5hbWUsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBsZXQgaXNWYWxpZDtcbiAgICAgICAgbGV0IHZhbGlkYXRpb25SZXN1bHQ7XG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZXMgPSBjb252ZXJ0VG9BcnJheVBheWxvYWQobmFtZSk7XG4gICAgICAgIGlmIChfb3B0aW9ucy5yZXNvbHZlcikge1xuICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gYXdhaXQgZXhlY3V0ZVNjaGVtYUFuZFVwZGF0ZVN0YXRlKGlzVW5kZWZpbmVkKG5hbWUpID8gbmFtZSA6IGZpZWxkTmFtZXMpO1xuICAgICAgICAgICAgaXNWYWxpZCA9IGlzRW1wdHlPYmplY3QoZXJyb3JzKTtcbiAgICAgICAgICAgIHZhbGlkYXRpb25SZXN1bHQgPSBuYW1lXG4gICAgICAgICAgICAgICAgPyAhZmllbGROYW1lcy5zb21lKChuYW1lKSA9PiBnZXQoZXJyb3JzLCBuYW1lKSlcbiAgICAgICAgICAgICAgICA6IGlzVmFsaWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobmFtZSkge1xuICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdCA9IChhd2FpdCBQcm9taXNlLmFsbChmaWVsZE5hbWVzLm1hcChhc3luYyAoZmllbGROYW1lKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoX2ZpZWxkcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgZXhlY3V0ZUJ1aWx0SW5WYWxpZGF0aW9uKGZpZWxkICYmIGZpZWxkLl9mID8geyBbZmllbGROYW1lXTogZmllbGQgfSA6IGZpZWxkKTtcbiAgICAgICAgICAgIH0pKSkuZXZlcnkoQm9vbGVhbik7XG4gICAgICAgICAgICAhKCF2YWxpZGF0aW9uUmVzdWx0ICYmICFfZm9ybVN0YXRlLmlzVmFsaWQpICYmIF9zZXRWYWxpZCgpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsaWRhdGlvblJlc3VsdCA9IGlzVmFsaWQgPSBhd2FpdCBleGVjdXRlQnVpbHRJblZhbGlkYXRpb24oX2ZpZWxkcyk7XG4gICAgICAgIH1cbiAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgLi4uKCFpc1N0cmluZyhuYW1lKSB8fFxuICAgICAgICAgICAgICAgICgoX3Byb3h5Rm9ybVN0YXRlLmlzVmFsaWQgfHwgX3Byb3h5U3Vic2NyaWJlRm9ybVN0YXRlLmlzVmFsaWQpICYmXG4gICAgICAgICAgICAgICAgICAgIGlzVmFsaWQgIT09IF9mb3JtU3RhdGUuaXNWYWxpZClcbiAgICAgICAgICAgICAgICA/IHt9XG4gICAgICAgICAgICAgICAgOiB7IG5hbWUgfSksXG4gICAgICAgICAgICAuLi4oX29wdGlvbnMucmVzb2x2ZXIgfHwgIW5hbWUgPyB7IGlzVmFsaWQgfSA6IHt9KSxcbiAgICAgICAgICAgIGVycm9yczogX2Zvcm1TdGF0ZS5lcnJvcnMsXG4gICAgICAgIH0pO1xuICAgICAgICBvcHRpb25zLnNob3VsZEZvY3VzICYmXG4gICAgICAgICAgICAhdmFsaWRhdGlvblJlc3VsdCAmJlxuICAgICAgICAgICAgaXRlcmF0ZUZpZWxkc0J5QWN0aW9uKF9maWVsZHMsIF9mb2N1c0lucHV0LCBuYW1lID8gZmllbGROYW1lcyA6IF9uYW1lcy5tb3VudCk7XG4gICAgICAgIHJldHVybiB2YWxpZGF0aW9uUmVzdWx0O1xuICAgIH07XG4gICAgY29uc3QgZ2V0VmFsdWVzID0gKGZpZWxkTmFtZXMpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0ge1xuICAgICAgICAgICAgLi4uKF9zdGF0ZS5tb3VudCA/IF9mb3JtVmFsdWVzIDogX2RlZmF1bHRWYWx1ZXMpLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXNVbmRlZmluZWQoZmllbGROYW1lcylcbiAgICAgICAgICAgID8gdmFsdWVzXG4gICAgICAgICAgICA6IGlzU3RyaW5nKGZpZWxkTmFtZXMpXG4gICAgICAgICAgICAgICAgPyBnZXQodmFsdWVzLCBmaWVsZE5hbWVzKVxuICAgICAgICAgICAgICAgIDogZmllbGROYW1lcy5tYXAoKG5hbWUpID0+IGdldCh2YWx1ZXMsIG5hbWUpKTtcbiAgICB9O1xuICAgIGNvbnN0IGdldEZpZWxkU3RhdGUgPSAobmFtZSwgZm9ybVN0YXRlKSA9PiAoe1xuICAgICAgICBpbnZhbGlkOiAhIWdldCgoZm9ybVN0YXRlIHx8IF9mb3JtU3RhdGUpLmVycm9ycywgbmFtZSksXG4gICAgICAgIGlzRGlydHk6ICEhZ2V0KChmb3JtU3RhdGUgfHwgX2Zvcm1TdGF0ZSkuZGlydHlGaWVsZHMsIG5hbWUpLFxuICAgICAgICBlcnJvcjogZ2V0KChmb3JtU3RhdGUgfHwgX2Zvcm1TdGF0ZSkuZXJyb3JzLCBuYW1lKSxcbiAgICAgICAgaXNWYWxpZGF0aW5nOiAhIWdldChfZm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMsIG5hbWUpLFxuICAgICAgICBpc1RvdWNoZWQ6ICEhZ2V0KChmb3JtU3RhdGUgfHwgX2Zvcm1TdGF0ZSkudG91Y2hlZEZpZWxkcywgbmFtZSksXG4gICAgfSk7XG4gICAgY29uc3QgY2xlYXJFcnJvcnMgPSAobmFtZSkgPT4ge1xuICAgICAgICBuYW1lICYmXG4gICAgICAgICAgICBjb252ZXJ0VG9BcnJheVBheWxvYWQobmFtZSkuZm9yRWFjaCgoaW5wdXROYW1lKSA9PiB1bnNldChfZm9ybVN0YXRlLmVycm9ycywgaW5wdXROYW1lKSk7XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIGVycm9yczogbmFtZSA/IF9mb3JtU3RhdGUuZXJyb3JzIDoge30sXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3Qgc2V0RXJyb3IgPSAobmFtZSwgZXJyb3IsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgY29uc3QgcmVmID0gKGdldChfZmllbGRzLCBuYW1lLCB7IF9mOiB7fSB9KS5fZiB8fCB7fSkucmVmO1xuICAgICAgICBjb25zdCBjdXJyZW50RXJyb3IgPSBnZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUpIHx8IHt9O1xuICAgICAgICAvLyBEb24ndCBvdmVycmlkZSBleGlzdGluZyBlcnJvciBtZXNzYWdlcyBlbHNld2hlcmUgaW4gdGhlIG9iamVjdCB0cmVlLlxuICAgICAgICBjb25zdCB7IHJlZjogY3VycmVudFJlZiwgbWVzc2FnZSwgdHlwZSwgLi4ucmVzdE9mRXJyb3JUcmVlIH0gPSBjdXJyZW50RXJyb3I7XG4gICAgICAgIHNldChfZm9ybVN0YXRlLmVycm9ycywgbmFtZSwge1xuICAgICAgICAgICAgLi4ucmVzdE9mRXJyb3JUcmVlLFxuICAgICAgICAgICAgLi4uZXJyb3IsXG4gICAgICAgICAgICByZWYsXG4gICAgICAgIH0pO1xuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZXJyb3JzOiBfZm9ybVN0YXRlLmVycm9ycyxcbiAgICAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICAgICAgb3B0aW9ucyAmJiBvcHRpb25zLnNob3VsZEZvY3VzICYmIHJlZiAmJiByZWYuZm9jdXMgJiYgcmVmLmZvY3VzKCk7XG4gICAgfTtcbiAgICBjb25zdCB3YXRjaCA9IChuYW1lLCBkZWZhdWx0VmFsdWUpID0+IGlzRnVuY3Rpb24obmFtZSlcbiAgICAgICAgPyBfc3ViamVjdHMuc3RhdGUuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IChwYXlsb2FkKSA9PiBuYW1lKF9nZXRXYXRjaCh1bmRlZmluZWQsIGRlZmF1bHRWYWx1ZSksIHBheWxvYWQpLFxuICAgICAgICB9KVxuICAgICAgICA6IF9nZXRXYXRjaChuYW1lLCBkZWZhdWx0VmFsdWUsIHRydWUpO1xuICAgIGNvbnN0IF9zdWJzY3JpYmUgPSAocHJvcHMpID0+IF9zdWJqZWN0cy5zdGF0ZS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZm9ybVN0YXRlKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2hvdWxkU3Vic2NyaWJlQnlOYW1lKHByb3BzLm5hbWUsIGZvcm1TdGF0ZS5uYW1lLCBwcm9wcy5leGFjdCkgJiZcbiAgICAgICAgICAgICAgICBzaG91bGRSZW5kZXJGb3JtU3RhdGUoZm9ybVN0YXRlLCBwcm9wcy5mb3JtU3RhdGUgfHwgX3Byb3h5Rm9ybVN0YXRlLCBfc2V0Rm9ybVN0YXRlLCBwcm9wcy5yZVJlbmRlclJvb3QpKSB7XG4gICAgICAgICAgICAgICAgcHJvcHMuY2FsbGJhY2soe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IHsgLi4uX2Zvcm1WYWx1ZXMgfSxcbiAgICAgICAgICAgICAgICAgICAgLi4uX2Zvcm1TdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgLi4uZm9ybVN0YXRlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pLnVuc3Vic2NyaWJlO1xuICAgIGNvbnN0IHN1YnNjcmliZSA9IChwcm9wcykgPT4ge1xuICAgICAgICBfc3RhdGUubW91bnQgPSB0cnVlO1xuICAgICAgICBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUgPSB7XG4gICAgICAgICAgICAuLi5fcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUsXG4gICAgICAgICAgICAuLi5wcm9wcy5mb3JtU3RhdGUsXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBfc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICAgICAgZm9ybVN0YXRlOiBfcHJveHlTdWJzY3JpYmVGb3JtU3RhdGUsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgdW5yZWdpc3RlciA9IChuYW1lLCBvcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBmaWVsZE5hbWUgb2YgbmFtZSA/IGNvbnZlcnRUb0FycmF5UGF5bG9hZChuYW1lKSA6IF9uYW1lcy5tb3VudCkge1xuICAgICAgICAgICAgX25hbWVzLm1vdW50LmRlbGV0ZShmaWVsZE5hbWUpO1xuICAgICAgICAgICAgX25hbWVzLmFycmF5LmRlbGV0ZShmaWVsZE5hbWUpO1xuICAgICAgICAgICAgaWYgKCFvcHRpb25zLmtlZXBWYWx1ZSkge1xuICAgICAgICAgICAgICAgIHVuc2V0KF9maWVsZHMsIGZpZWxkTmFtZSk7XG4gICAgICAgICAgICAgICAgdW5zZXQoX2Zvcm1WYWx1ZXMsIGZpZWxkTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAhb3B0aW9ucy5rZWVwRXJyb3IgJiYgdW5zZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIGZpZWxkTmFtZSk7XG4gICAgICAgICAgICAhb3B0aW9ucy5rZWVwRGlydHkgJiYgdW5zZXQoX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgICFvcHRpb25zLmtlZXBUb3VjaGVkICYmIHVuc2V0KF9mb3JtU3RhdGUudG91Y2hlZEZpZWxkcywgZmllbGROYW1lKTtcbiAgICAgICAgICAgICFvcHRpb25zLmtlZXBJc1ZhbGlkYXRpbmcgJiZcbiAgICAgICAgICAgICAgICB1bnNldChfZm9ybVN0YXRlLnZhbGlkYXRpbmdGaWVsZHMsIGZpZWxkTmFtZSk7XG4gICAgICAgICAgICAhX29wdGlvbnMuc2hvdWxkVW5yZWdpc3RlciAmJlxuICAgICAgICAgICAgICAgICFvcHRpb25zLmtlZXBEZWZhdWx0VmFsdWUgJiZcbiAgICAgICAgICAgICAgICB1bnNldChfZGVmYXVsdFZhbHVlcywgZmllbGROYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICB2YWx1ZXM6IGNsb25lT2JqZWN0KF9mb3JtVmFsdWVzKSxcbiAgICAgICAgfSk7XG4gICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIC4uLl9mb3JtU3RhdGUsXG4gICAgICAgICAgICAuLi4oIW9wdGlvbnMua2VlcERpcnR5ID8ge30gOiB7IGlzRGlydHk6IF9nZXREaXJ0eSgpIH0pLFxuICAgICAgICB9KTtcbiAgICAgICAgIW9wdGlvbnMua2VlcElzVmFsaWQgJiYgX3NldFZhbGlkKCk7XG4gICAgfTtcbiAgICBjb25zdCBfc2V0RGlzYWJsZWRGaWVsZCA9ICh7IGRpc2FibGVkLCBuYW1lLCB9KSA9PiB7XG4gICAgICAgIGlmICgoaXNCb29sZWFuKGRpc2FibGVkKSAmJiBfc3RhdGUubW91bnQpIHx8XG4gICAgICAgICAgICAhIWRpc2FibGVkIHx8XG4gICAgICAgICAgICBfbmFtZXMuZGlzYWJsZWQuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICBkaXNhYmxlZCA/IF9uYW1lcy5kaXNhYmxlZC5hZGQobmFtZSkgOiBfbmFtZXMuZGlzYWJsZWQuZGVsZXRlKG5hbWUpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCByZWdpc3RlciA9IChuYW1lLCBvcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgbGV0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICBjb25zdCBkaXNhYmxlZElzRGVmaW5lZCA9IGlzQm9vbGVhbihvcHRpb25zLmRpc2FibGVkKSB8fCBpc0Jvb2xlYW4oX29wdGlvbnMuZGlzYWJsZWQpO1xuICAgICAgICBzZXQoX2ZpZWxkcywgbmFtZSwge1xuICAgICAgICAgICAgLi4uKGZpZWxkIHx8IHt9KSxcbiAgICAgICAgICAgIF9mOiB7XG4gICAgICAgICAgICAgICAgLi4uKGZpZWxkICYmIGZpZWxkLl9mID8gZmllbGQuX2YgOiB7IHJlZjogeyBuYW1lIH0gfSksXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICBtb3VudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIF9uYW1lcy5tb3VudC5hZGQobmFtZSk7XG4gICAgICAgIGlmIChmaWVsZCkge1xuICAgICAgICAgICAgX3NldERpc2FibGVkRmllbGQoe1xuICAgICAgICAgICAgICAgIGRpc2FibGVkOiBpc0Jvb2xlYW4ob3B0aW9ucy5kaXNhYmxlZClcbiAgICAgICAgICAgICAgICAgICAgPyBvcHRpb25zLmRpc2FibGVkXG4gICAgICAgICAgICAgICAgICAgIDogX29wdGlvbnMuZGlzYWJsZWQsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdXBkYXRlVmFsaWRBbmRWYWx1ZShuYW1lLCB0cnVlLCBvcHRpb25zLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uKGRpc2FibGVkSXNEZWZpbmVkXG4gICAgICAgICAgICAgICAgPyB7IGRpc2FibGVkOiBvcHRpb25zLmRpc2FibGVkIHx8IF9vcHRpb25zLmRpc2FibGVkIH1cbiAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgIC4uLihfb3B0aW9ucy5wcm9ncmVzc2l2ZVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZDogISFvcHRpb25zLnJlcXVpcmVkLFxuICAgICAgICAgICAgICAgICAgICBtaW46IGdldFJ1bGVWYWx1ZShvcHRpb25zLm1pbiksXG4gICAgICAgICAgICAgICAgICAgIG1heDogZ2V0UnVsZVZhbHVlKG9wdGlvbnMubWF4KSxcbiAgICAgICAgICAgICAgICAgICAgbWluTGVuZ3RoOiBnZXRSdWxlVmFsdWUob3B0aW9ucy5taW5MZW5ndGgpLFxuICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGg6IGdldFJ1bGVWYWx1ZShvcHRpb25zLm1heExlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgIHBhdHRlcm46IGdldFJ1bGVWYWx1ZShvcHRpb25zLnBhdHRlcm4pLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBvbkNoYW5nZSxcbiAgICAgICAgICAgIG9uQmx1cjogb25DaGFuZ2UsXG4gICAgICAgICAgICByZWY6IChyZWYpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVmKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyKG5hbWUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBmaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRSZWYgPSBpc1VuZGVmaW5lZChyZWYudmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHJlZi5xdWVyeVNlbGVjdG9yQWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByZWYucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQsc2VsZWN0LHRleHRhcmVhJylbMF0gfHwgcmVmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZWZcbiAgICAgICAgICAgICAgICAgICAgICAgIDogcmVmO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByYWRpb09yQ2hlY2tib3ggPSBpc1JhZGlvT3JDaGVja2JveChmaWVsZFJlZik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZnMgPSBmaWVsZC5fZi5yZWZzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmFkaW9PckNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICA/IHJlZnMuZmluZCgob3B0aW9uKSA9PiBvcHRpb24gPT09IGZpZWxkUmVmKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBmaWVsZFJlZiA9PT0gZmllbGQuX2YucmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgc2V0KF9maWVsZHMsIG5hbWUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9mOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZmllbGQuX2YsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uKHJhZGlvT3JDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZnM6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yZWZzLmZpbHRlcihsaXZlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShnZXQoX2RlZmF1bHRWYWx1ZXMsIG5hbWUpKSA/IFt7fV0gOiBbXSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmOiB7IHR5cGU6IGZpZWxkUmVmLnR5cGUsIG5hbWUgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHsgcmVmOiBmaWVsZFJlZiB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB1cGRhdGVWYWxpZEFuZFZhbHVlKG5hbWUsIGZhbHNlLCB1bmRlZmluZWQsIGZpZWxkUmVmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUsIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkLl9mKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5fZi5tb3VudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIChfb3B0aW9ucy5zaG91bGRVbnJlZ2lzdGVyIHx8IG9wdGlvbnMuc2hvdWxkVW5yZWdpc3RlcikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICEoaXNOYW1lSW5GaWVsZEFycmF5KF9uYW1lcy5hcnJheSwgbmFtZSkgJiYgX3N0YXRlLmFjdGlvbikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIF9uYW1lcy51bk1vdW50LmFkZChuYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgX2ZvY3VzRXJyb3IgPSAoKSA9PiBfb3B0aW9ucy5zaG91bGRGb2N1c0Vycm9yICYmXG4gICAgICAgIGl0ZXJhdGVGaWVsZHNCeUFjdGlvbihfZmllbGRzLCBfZm9jdXNJbnB1dCwgX25hbWVzLm1vdW50KTtcbiAgICBjb25zdCBfZGlzYWJsZUZvcm0gPSAoZGlzYWJsZWQpID0+IHtcbiAgICAgICAgaWYgKGlzQm9vbGVhbihkaXNhYmxlZCkpIHtcbiAgICAgICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHsgZGlzYWJsZWQgfSk7XG4gICAgICAgICAgICBpdGVyYXRlRmllbGRzQnlBY3Rpb24oX2ZpZWxkcywgKHJlZiwgbmFtZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRGaWVsZCA9IGdldChfZmllbGRzLCBuYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZi5kaXNhYmxlZCA9IGN1cnJlbnRGaWVsZC5fZi5kaXNhYmxlZCB8fCBkaXNhYmxlZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudEZpZWxkLl9mLnJlZnMpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RmllbGQuX2YucmVmcy5mb3JFYWNoKChpbnB1dFJlZikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UmVmLmRpc2FibGVkID0gY3VycmVudEZpZWxkLl9mLmRpc2FibGVkIHx8IGRpc2FibGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAwLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IGhhbmRsZVN1Ym1pdCA9IChvblZhbGlkLCBvbkludmFsaWQpID0+IGFzeW5jIChlKSA9PiB7XG4gICAgICAgIGxldCBvblZhbGlkRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0ICYmIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGUucGVyc2lzdCAmJlxuICAgICAgICAgICAgICAgIGUucGVyc2lzdCgpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBmaWVsZFZhbHVlcyA9IGNsb25lT2JqZWN0KF9mb3JtVmFsdWVzKTtcbiAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgaXNTdWJtaXR0aW5nOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKF9vcHRpb25zLnJlc29sdmVyKSB7XG4gICAgICAgICAgICBjb25zdCB7IGVycm9ycywgdmFsdWVzIH0gPSBhd2FpdCBfcnVuU2NoZW1hKCk7XG4gICAgICAgICAgICBfZm9ybVN0YXRlLmVycm9ycyA9IGVycm9ycztcbiAgICAgICAgICAgIGZpZWxkVmFsdWVzID0gY2xvbmVPYmplY3QodmFsdWVzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGF3YWl0IGV4ZWN1dGVCdWlsdEluVmFsaWRhdGlvbihfZmllbGRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoX25hbWVzLmRpc2FibGVkLnNpemUpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBfbmFtZXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgICAgICB1bnNldChmaWVsZFZhbHVlcywgbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdW5zZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsICdyb290Jyk7XG4gICAgICAgIGlmIChpc0VtcHR5T2JqZWN0KF9mb3JtU3RhdGUuZXJyb3JzKSkge1xuICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgIGVycm9yczoge30sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgb25WYWxpZChmaWVsZFZhbHVlcywgZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBvblZhbGlkRXJyb3IgPSBlcnJvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChvbkludmFsaWQpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBvbkludmFsaWQoeyAuLi5fZm9ybVN0YXRlLmVycm9ycyB9LCBlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF9mb2N1c0Vycm9yKCk7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KF9mb2N1c0Vycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICBpc1N1Ym1pdHRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGlzU3VibWl0dGluZzogZmFsc2UsXG4gICAgICAgICAgICBpc1N1Ym1pdFN1Y2Nlc3NmdWw6IGlzRW1wdHlPYmplY3QoX2Zvcm1TdGF0ZS5lcnJvcnMpICYmICFvblZhbGlkRXJyb3IsXG4gICAgICAgICAgICBzdWJtaXRDb3VudDogX2Zvcm1TdGF0ZS5zdWJtaXRDb3VudCArIDEsXG4gICAgICAgICAgICBlcnJvcnM6IF9mb3JtU3RhdGUuZXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKG9uVmFsaWRFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgb25WYWxpZEVycm9yO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCByZXNldEZpZWxkID0gKG5hbWUsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgICAgICBpZiAoZ2V0KF9maWVsZHMsIG5hbWUpKSB7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQob3B0aW9ucy5kZWZhdWx0VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgc2V0VmFsdWUobmFtZSwgY2xvbmVPYmplY3QoZ2V0KF9kZWZhdWx0VmFsdWVzLCBuYW1lKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc2V0VmFsdWUobmFtZSwgb3B0aW9ucy5kZWZhdWx0VmFsdWUpO1xuICAgICAgICAgICAgICAgIHNldChfZGVmYXVsdFZhbHVlcywgbmFtZSwgY2xvbmVPYmplY3Qob3B0aW9ucy5kZWZhdWx0VmFsdWUpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5rZWVwVG91Y2hlZCkge1xuICAgICAgICAgICAgICAgIHVuc2V0KF9mb3JtU3RhdGUudG91Y2hlZEZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMua2VlcERpcnR5KSB7XG4gICAgICAgICAgICAgICAgdW5zZXQoX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgX2Zvcm1TdGF0ZS5pc0RpcnR5ID0gb3B0aW9ucy5kZWZhdWx0VmFsdWVcbiAgICAgICAgICAgICAgICAgICAgPyBfZ2V0RGlydHkobmFtZSwgY2xvbmVPYmplY3QoZ2V0KF9kZWZhdWx0VmFsdWVzLCBuYW1lKSkpXG4gICAgICAgICAgICAgICAgICAgIDogX2dldERpcnR5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMua2VlcEVycm9yKSB7XG4gICAgICAgICAgICAgICAgdW5zZXQoX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUpO1xuICAgICAgICAgICAgICAgIF9wcm94eUZvcm1TdGF0ZS5pc1ZhbGlkICYmIF9zZXRWYWxpZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX3N1YmplY3RzLnN0YXRlLm5leHQoeyAuLi5fZm9ybVN0YXRlIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBfcmVzZXQgPSAoZm9ybVZhbHVlcywga2VlcFN0YXRlT3B0aW9ucyA9IHt9KSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRWYWx1ZXMgPSBmb3JtVmFsdWVzID8gY2xvbmVPYmplY3QoZm9ybVZhbHVlcykgOiBfZGVmYXVsdFZhbHVlcztcbiAgICAgICAgY29uc3QgY2xvbmVVcGRhdGVkVmFsdWVzID0gY2xvbmVPYmplY3QodXBkYXRlZFZhbHVlcyk7XG4gICAgICAgIGNvbnN0IGlzRW1wdHlSZXNldFZhbHVlcyA9IGlzRW1wdHlPYmplY3QoZm9ybVZhbHVlcyk7XG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGlzRW1wdHlSZXNldFZhbHVlcyA/IF9kZWZhdWx0VmFsdWVzIDogY2xvbmVVcGRhdGVkVmFsdWVzO1xuICAgICAgICBpZiAoIWtlZXBTdGF0ZU9wdGlvbnMua2VlcERlZmF1bHRWYWx1ZXMpIHtcbiAgICAgICAgICAgIF9kZWZhdWx0VmFsdWVzID0gdXBkYXRlZFZhbHVlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWtlZXBTdGF0ZU9wdGlvbnMua2VlcFZhbHVlcykge1xuICAgICAgICAgICAgaWYgKGtlZXBTdGF0ZU9wdGlvbnMua2VlcERpcnR5VmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmllbGRzVG9DaGVjayA9IG5ldyBTZXQoW1xuICAgICAgICAgICAgICAgICAgICAuLi5fbmFtZXMubW91bnQsXG4gICAgICAgICAgICAgICAgICAgIC4uLk9iamVjdC5rZXlzKGdldERpcnR5RmllbGRzKF9kZWZhdWx0VmFsdWVzLCBfZm9ybVZhbHVlcykpLFxuICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGROYW1lIG9mIEFycmF5LmZyb20oZmllbGRzVG9DaGVjaykpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0KF9mb3JtU3RhdGUuZGlydHlGaWVsZHMsIGZpZWxkTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gc2V0KHZhbHVlcywgZmllbGROYW1lLCBnZXQoX2Zvcm1WYWx1ZXMsIGZpZWxkTmFtZSkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IHNldFZhbHVlKGZpZWxkTmFtZSwgZ2V0KHZhbHVlcywgZmllbGROYW1lKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzV2ViICYmIGlzVW5kZWZpbmVkKGZvcm1WYWx1ZXMpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBfbmFtZXMubW91bnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KF9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkICYmIGZpZWxkLl9mKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGRSZWZlcmVuY2UgPSBBcnJheS5pc0FycmF5KGZpZWxkLl9mLnJlZnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZmllbGQuX2YucmVmc1swXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGZpZWxkLl9mLnJlZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNIVE1MRWxlbWVudChmaWVsZFJlZmVyZW5jZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybSA9IGZpZWxkUmVmZXJlbmNlLmNsb3Nlc3QoJ2Zvcm0nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm0ucmVzZXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChrZWVwU3RhdGVPcHRpb25zLmtlZXBGaWVsZHNSZWYpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBmaWVsZE5hbWUgb2YgX25hbWVzLm1vdW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZShmaWVsZE5hbWUsIGdldCh2YWx1ZXMsIGZpZWxkTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBfZmllbGRzID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgX2Zvcm1WYWx1ZXMgPSBfb3B0aW9ucy5zaG91bGRVbnJlZ2lzdGVyXG4gICAgICAgICAgICAgICAgPyBrZWVwU3RhdGVPcHRpb25zLmtlZXBEZWZhdWx0VmFsdWVzXG4gICAgICAgICAgICAgICAgICAgID8gY2xvbmVPYmplY3QoX2RlZmF1bHRWYWx1ZXMpXG4gICAgICAgICAgICAgICAgICAgIDoge31cbiAgICAgICAgICAgICAgICA6IGNsb25lT2JqZWN0KHZhbHVlcyk7XG4gICAgICAgICAgICBfc3ViamVjdHMuYXJyYXkubmV4dCh7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiB7IC4uLnZhbHVlcyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiB7IC4uLnZhbHVlcyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgX25hbWVzID0ge1xuICAgICAgICAgICAgbW91bnQ6IGtlZXBTdGF0ZU9wdGlvbnMua2VlcERpcnR5VmFsdWVzID8gX25hbWVzLm1vdW50IDogbmV3IFNldCgpLFxuICAgICAgICAgICAgdW5Nb3VudDogbmV3IFNldCgpLFxuICAgICAgICAgICAgYXJyYXk6IG5ldyBTZXQoKSxcbiAgICAgICAgICAgIGRpc2FibGVkOiBuZXcgU2V0KCksXG4gICAgICAgICAgICB3YXRjaDogbmV3IFNldCgpLFxuICAgICAgICAgICAgd2F0Y2hBbGw6IGZhbHNlLFxuICAgICAgICAgICAgZm9jdXM6ICcnLFxuICAgICAgICB9O1xuICAgICAgICBfc3RhdGUubW91bnQgPVxuICAgICAgICAgICAgIV9wcm94eUZvcm1TdGF0ZS5pc1ZhbGlkIHx8XG4gICAgICAgICAgICAgICAgISFrZWVwU3RhdGVPcHRpb25zLmtlZXBJc1ZhbGlkIHx8XG4gICAgICAgICAgICAgICAgISFrZWVwU3RhdGVPcHRpb25zLmtlZXBEaXJ0eVZhbHVlcztcbiAgICAgICAgX3N0YXRlLndhdGNoID0gISFfb3B0aW9ucy5zaG91bGRVbnJlZ2lzdGVyO1xuICAgICAgICBfc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICBzdWJtaXRDb3VudDoga2VlcFN0YXRlT3B0aW9ucy5rZWVwU3VibWl0Q291bnRcbiAgICAgICAgICAgICAgICA/IF9mb3JtU3RhdGUuc3VibWl0Q291bnRcbiAgICAgICAgICAgICAgICA6IDAsXG4gICAgICAgICAgICBpc0RpcnR5OiBpc0VtcHR5UmVzZXRWYWx1ZXNcbiAgICAgICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICAgICAgOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBEaXJ0eVxuICAgICAgICAgICAgICAgICAgICA/IF9mb3JtU3RhdGUuaXNEaXJ0eVxuICAgICAgICAgICAgICAgICAgICA6ICEhKGtlZXBTdGF0ZU9wdGlvbnMua2VlcERlZmF1bHRWYWx1ZXMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFkZWVwRXF1YWwoZm9ybVZhbHVlcywgX2RlZmF1bHRWYWx1ZXMpKSxcbiAgICAgICAgICAgIGlzU3VibWl0dGVkOiBrZWVwU3RhdGVPcHRpb25zLmtlZXBJc1N1Ym1pdHRlZFxuICAgICAgICAgICAgICAgID8gX2Zvcm1TdGF0ZS5pc1N1Ym1pdHRlZFxuICAgICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICBkaXJ0eUZpZWxkczogaXNFbXB0eVJlc2V0VmFsdWVzXG4gICAgICAgICAgICAgICAgPyB7fVxuICAgICAgICAgICAgICAgIDoga2VlcFN0YXRlT3B0aW9ucy5rZWVwRGlydHlWYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgPyBrZWVwU3RhdGVPcHRpb25zLmtlZXBEZWZhdWx0VmFsdWVzICYmIF9mb3JtVmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGdldERpcnR5RmllbGRzKF9kZWZhdWx0VmFsdWVzLCBfZm9ybVZhbHVlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogX2Zvcm1TdGF0ZS5kaXJ0eUZpZWxkc1xuICAgICAgICAgICAgICAgICAgICA6IGtlZXBTdGF0ZU9wdGlvbnMua2VlcERlZmF1bHRWYWx1ZXMgJiYgZm9ybVZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgPyBnZXREaXJ0eUZpZWxkcyhfZGVmYXVsdFZhbHVlcywgZm9ybVZhbHVlcylcbiAgICAgICAgICAgICAgICAgICAgICAgIDoga2VlcFN0YXRlT3B0aW9ucy5rZWVwRGlydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9mb3JtU3RhdGUuZGlydHlGaWVsZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHt9LFxuICAgICAgICAgICAgdG91Y2hlZEZpZWxkczoga2VlcFN0YXRlT3B0aW9ucy5rZWVwVG91Y2hlZFxuICAgICAgICAgICAgICAgID8gX2Zvcm1TdGF0ZS50b3VjaGVkRmllbGRzXG4gICAgICAgICAgICAgICAgOiB7fSxcbiAgICAgICAgICAgIGVycm9yczoga2VlcFN0YXRlT3B0aW9ucy5rZWVwRXJyb3JzID8gX2Zvcm1TdGF0ZS5lcnJvcnMgOiB7fSxcbiAgICAgICAgICAgIGlzU3VibWl0U3VjY2Vzc2Z1bDoga2VlcFN0YXRlT3B0aW9ucy5rZWVwSXNTdWJtaXRTdWNjZXNzZnVsXG4gICAgICAgICAgICAgICAgPyBfZm9ybVN0YXRlLmlzU3VibWl0U3VjY2Vzc2Z1bFxuICAgICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICBpc1N1Ym1pdHRpbmc6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9O1xuICAgIGNvbnN0IHJlc2V0ID0gKGZvcm1WYWx1ZXMsIGtlZXBTdGF0ZU9wdGlvbnMpID0+IF9yZXNldChpc0Z1bmN0aW9uKGZvcm1WYWx1ZXMpXG4gICAgICAgID8gZm9ybVZhbHVlcyhfZm9ybVZhbHVlcylcbiAgICAgICAgOiBmb3JtVmFsdWVzLCBrZWVwU3RhdGVPcHRpb25zKTtcbiAgICBjb25zdCBzZXRGb2N1cyA9IChuYW1lLCBvcHRpb25zID0ge30pID0+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBnZXQoX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgIGNvbnN0IGZpZWxkUmVmZXJlbmNlID0gZmllbGQgJiYgZmllbGQuX2Y7XG4gICAgICAgIGlmIChmaWVsZFJlZmVyZW5jZSkge1xuICAgICAgICAgICAgY29uc3QgZmllbGRSZWYgPSBmaWVsZFJlZmVyZW5jZS5yZWZzXG4gICAgICAgICAgICAgICAgPyBmaWVsZFJlZmVyZW5jZS5yZWZzWzBdXG4gICAgICAgICAgICAgICAgOiBmaWVsZFJlZmVyZW5jZS5yZWY7XG4gICAgICAgICAgICBpZiAoZmllbGRSZWYuZm9jdXMpIHtcbiAgICAgICAgICAgICAgICBmaWVsZFJlZi5mb2N1cygpO1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2hvdWxkU2VsZWN0ICYmXG4gICAgICAgICAgICAgICAgICAgIGlzRnVuY3Rpb24oZmllbGRSZWYuc2VsZWN0KSAmJlxuICAgICAgICAgICAgICAgICAgICBmaWVsZFJlZi5zZWxlY3QoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgX3NldEZvcm1TdGF0ZSA9ICh1cGRhdGVkRm9ybVN0YXRlKSA9PiB7XG4gICAgICAgIF9mb3JtU3RhdGUgPSB7XG4gICAgICAgICAgICAuLi5fZm9ybVN0YXRlLFxuICAgICAgICAgICAgLi4udXBkYXRlZEZvcm1TdGF0ZSxcbiAgICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IF9yZXNldERlZmF1bHRWYWx1ZXMgPSAoKSA9PiBpc0Z1bmN0aW9uKF9vcHRpb25zLmRlZmF1bHRWYWx1ZXMpICYmXG4gICAgICAgIF9vcHRpb25zLmRlZmF1bHRWYWx1ZXMoKS50aGVuKCh2YWx1ZXMpID0+IHtcbiAgICAgICAgICAgIHJlc2V0KHZhbHVlcywgX29wdGlvbnMucmVzZXRPcHRpb25zKTtcbiAgICAgICAgICAgIF9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIGNvbnN0IG1ldGhvZHMgPSB7XG4gICAgICAgIGNvbnRyb2w6IHtcbiAgICAgICAgICAgIHJlZ2lzdGVyLFxuICAgICAgICAgICAgdW5yZWdpc3RlcixcbiAgICAgICAgICAgIGdldEZpZWxkU3RhdGUsXG4gICAgICAgICAgICBoYW5kbGVTdWJtaXQsXG4gICAgICAgICAgICBzZXRFcnJvcixcbiAgICAgICAgICAgIF9zdWJzY3JpYmUsXG4gICAgICAgICAgICBfcnVuU2NoZW1hLFxuICAgICAgICAgICAgX2ZvY3VzRXJyb3IsXG4gICAgICAgICAgICBfZ2V0V2F0Y2gsXG4gICAgICAgICAgICBfZ2V0RGlydHksXG4gICAgICAgICAgICBfc2V0VmFsaWQsXG4gICAgICAgICAgICBfc2V0RmllbGRBcnJheSxcbiAgICAgICAgICAgIF9zZXREaXNhYmxlZEZpZWxkLFxuICAgICAgICAgICAgX3NldEVycm9ycyxcbiAgICAgICAgICAgIF9nZXRGaWVsZEFycmF5LFxuICAgICAgICAgICAgX3Jlc2V0LFxuICAgICAgICAgICAgX3Jlc2V0RGVmYXVsdFZhbHVlcyxcbiAgICAgICAgICAgIF9yZW1vdmVVbm1vdW50ZWQsXG4gICAgICAgICAgICBfZGlzYWJsZUZvcm0sXG4gICAgICAgICAgICBfc3ViamVjdHMsXG4gICAgICAgICAgICBfcHJveHlGb3JtU3RhdGUsXG4gICAgICAgICAgICBnZXQgX2ZpZWxkcygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX2ZpZWxkcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgX2Zvcm1WYWx1ZXMoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9mb3JtVmFsdWVzO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBfc3RhdGUoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9zdGF0ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQgX3N0YXRlKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX3N0YXRlID0gdmFsdWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZ2V0IF9kZWZhdWx0VmFsdWVzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdFZhbHVlcztcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgX25hbWVzKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfbmFtZXM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0IF9uYW1lcyh2YWx1ZSkge1xuICAgICAgICAgICAgICAgIF9uYW1lcyA9IHZhbHVlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBfZm9ybVN0YXRlKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBfZm9ybVN0YXRlO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdldCBfb3B0aW9ucygpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gX29wdGlvbnM7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2V0IF9vcHRpb25zKHZhbHVlKSB7XG4gICAgICAgICAgICAgICAgX29wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgIC4uLl9vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAuLi52YWx1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc3Vic2NyaWJlLFxuICAgICAgICB0cmlnZ2VyLFxuICAgICAgICByZWdpc3RlcixcbiAgICAgICAgaGFuZGxlU3VibWl0LFxuICAgICAgICB3YXRjaCxcbiAgICAgICAgc2V0VmFsdWUsXG4gICAgICAgIGdldFZhbHVlcyxcbiAgICAgICAgcmVzZXQsXG4gICAgICAgIHJlc2V0RmllbGQsXG4gICAgICAgIGNsZWFyRXJyb3JzLFxuICAgICAgICB1bnJlZ2lzdGVyLFxuICAgICAgICBzZXRFcnJvcixcbiAgICAgICAgc2V0Rm9jdXMsXG4gICAgICAgIGdldEZpZWxkU3RhdGUsXG4gICAgfTtcbiAgICByZXR1cm4ge1xuICAgICAgICAuLi5tZXRob2RzLFxuICAgICAgICBmb3JtQ29udHJvbDogbWV0aG9kcyxcbiAgICB9O1xufVxuXG52YXIgZ2VuZXJhdGVJZCA9ICgpID0+IHtcbiAgICBpZiAodHlwZW9mIGNyeXB0byAhPT0gJ3VuZGVmaW5lZCcgJiYgY3J5cHRvLnJhbmRvbVVVSUQpIHtcbiAgICAgICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XG4gICAgfVxuICAgIGNvbnN0IGQgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICd1bmRlZmluZWQnID8gRGF0ZS5ub3coKSA6IHBlcmZvcm1hbmNlLm5vdygpICogMTAwMDtcbiAgICByZXR1cm4gJ3h4eHh4eHh4LXh4eHgtNHh4eC15eHh4LXh4eHh4eHh4eHh4eCcucmVwbGFjZSgvW3h5XS9nLCAoYykgPT4ge1xuICAgICAgICBjb25zdCByID0gKE1hdGgucmFuZG9tKCkgKiAxNiArIGQpICUgMTYgfCAwO1xuICAgICAgICByZXR1cm4gKGMgPT0gJ3gnID8gciA6IChyICYgMHgzKSB8IDB4OCkudG9TdHJpbmcoMTYpO1xuICAgIH0pO1xufTtcblxudmFyIGdldEZvY3VzRmllbGROYW1lID0gKG5hbWUsIGluZGV4LCBvcHRpb25zID0ge30pID0+IG9wdGlvbnMuc2hvdWxkRm9jdXMgfHwgaXNVbmRlZmluZWQob3B0aW9ucy5zaG91bGRGb2N1cylcbiAgICA/IG9wdGlvbnMuZm9jdXNOYW1lIHx8XG4gICAgICAgIGAke25hbWV9LiR7aXNVbmRlZmluZWQob3B0aW9ucy5mb2N1c0luZGV4KSA/IGluZGV4IDogb3B0aW9ucy5mb2N1c0luZGV4fS5gXG4gICAgOiAnJztcblxudmFyIGFwcGVuZEF0ID0gKGRhdGEsIHZhbHVlKSA9PiBbXG4gICAgLi4uZGF0YSxcbiAgICAuLi5jb252ZXJ0VG9BcnJheVBheWxvYWQodmFsdWUpLFxuXTtcblxudmFyIGZpbGxFbXB0eUFycmF5ID0gKHZhbHVlKSA9PiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLm1hcCgoKSA9PiB1bmRlZmluZWQpIDogdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpbnNlcnQoZGF0YSwgaW5kZXgsIHZhbHVlKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgLi4uZGF0YS5zbGljZSgwLCBpbmRleCksXG4gICAgICAgIC4uLmNvbnZlcnRUb0FycmF5UGF5bG9hZCh2YWx1ZSksXG4gICAgICAgIC4uLmRhdGEuc2xpY2UoaW5kZXgpLFxuICAgIF07XG59XG5cbnZhciBtb3ZlQXJyYXlBdCA9IChkYXRhLCBmcm9tLCB0bykgPT4ge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChpc1VuZGVmaW5lZChkYXRhW3RvXSkpIHtcbiAgICAgICAgZGF0YVt0b10gPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGRhdGEuc3BsaWNlKHRvLCAwLCBkYXRhLnNwbGljZShmcm9tLCAxKVswXSk7XG4gICAgcmV0dXJuIGRhdGE7XG59O1xuXG52YXIgcHJlcGVuZEF0ID0gKGRhdGEsIHZhbHVlKSA9PiBbXG4gICAgLi4uY29udmVydFRvQXJyYXlQYXlsb2FkKHZhbHVlKSxcbiAgICAuLi5jb252ZXJ0VG9BcnJheVBheWxvYWQoZGF0YSksXG5dO1xuXG5mdW5jdGlvbiByZW1vdmVBdEluZGV4ZXMoZGF0YSwgaW5kZXhlcykge1xuICAgIGxldCBpID0gMDtcbiAgICBjb25zdCB0ZW1wID0gWy4uLmRhdGFdO1xuICAgIGZvciAoY29uc3QgaW5kZXggb2YgaW5kZXhlcykge1xuICAgICAgICB0ZW1wLnNwbGljZShpbmRleCAtIGksIDEpO1xuICAgICAgICBpKys7XG4gICAgfVxuICAgIHJldHVybiBjb21wYWN0KHRlbXApLmxlbmd0aCA/IHRlbXAgOiBbXTtcbn1cbnZhciByZW1vdmVBcnJheUF0ID0gKGRhdGEsIGluZGV4KSA9PiBpc1VuZGVmaW5lZChpbmRleClcbiAgICA/IFtdXG4gICAgOiByZW1vdmVBdEluZGV4ZXMoZGF0YSwgY29udmVydFRvQXJyYXlQYXlsb2FkKGluZGV4KS5zb3J0KChhLCBiKSA9PiBhIC0gYikpO1xuXG52YXIgc3dhcEFycmF5QXQgPSAoZGF0YSwgaW5kZXhBLCBpbmRleEIpID0+IHtcbiAgICBbZGF0YVtpbmRleEFdLCBkYXRhW2luZGV4Ql1dID0gW2RhdGFbaW5kZXhCXSwgZGF0YVtpbmRleEFdXTtcbn07XG5cbnZhciB1cGRhdGVBdCA9IChmaWVsZFZhbHVlcywgaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgZmllbGRWYWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgcmV0dXJuIGZpZWxkVmFsdWVzO1xufTtcblxuLyoqXG4gKiBBIGN1c3RvbSBob29rIHRoYXQgZXhwb3NlcyBjb252ZW5pZW50IG1ldGhvZHMgdG8gcGVyZm9ybSBvcGVyYXRpb25zIHdpdGggYSBsaXN0IG9mIGR5bmFtaWMgaW5wdXRzIHRoYXQgbmVlZCB0byBiZSBhcHBlbmRlZCwgdXBkYXRlZCwgcmVtb3ZlZCBldGMuIOKAoiBbRGVtb10oaHR0cHM6Ly9jb2Rlc2FuZGJveC5pby9zL3JlYWN0LWhvb2stZm9ybS11c2VmaWVsZGFycmF5LXNzdWduKSDigKIgW1ZpZGVvXShodHRwczovL3lvdXR1LmJlLzRNcmJmR1NGWTJBKVxuICpcbiAqIEByZW1hcmtzXG4gKiBbQVBJXShodHRwczovL3JlYWN0LWhvb2stZm9ybS5jb20vZG9jcy91c2VmaWVsZGFycmF5KSDigKIgW0RlbW9dKGh0dHBzOi8vY29kZXNhbmRib3guaW8vcy9yZWFjdC1ob29rLWZvcm0tdXNlZmllbGRhcnJheS1zc3VnbilcbiAqXG4gKiBAcGFyYW0gcHJvcHMgLSB1c2VGaWVsZEFycmF5IHByb3BzXG4gKlxuICogQHJldHVybnMgbWV0aG9kcyAtIGZ1bmN0aW9ucyB0byBtYW5pcHVsYXRlIHdpdGggdGhlIEZpZWxkIEFycmF5cyAoZHluYW1pYyBpbnB1dHMpIHtAbGluayBVc2VGaWVsZEFycmF5UmV0dXJufVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFwcCgpIHtcbiAqICAgY29uc3QgeyByZWdpc3RlciwgY29udHJvbCwgaGFuZGxlU3VibWl0LCByZXNldCwgdHJpZ2dlciwgc2V0RXJyb3IgfSA9IHVzZUZvcm0oe1xuICogICAgIGRlZmF1bHRWYWx1ZXM6IHtcbiAqICAgICAgIHRlc3Q6IFtdXG4gKiAgICAgfVxuICogICB9KTtcbiAqICAgY29uc3QgeyBmaWVsZHMsIGFwcGVuZCB9ID0gdXNlRmllbGRBcnJheSh7XG4gKiAgICAgY29udHJvbCxcbiAqICAgICBuYW1lOiBcInRlc3RcIlxuICogICB9KTtcbiAqXG4gKiAgIHJldHVybiAoXG4gKiAgICAgPGZvcm0gb25TdWJtaXQ9e2hhbmRsZVN1Ym1pdChkYXRhID0+IGNvbnNvbGUubG9nKGRhdGEpKX0+XG4gKiAgICAgICB7ZmllbGRzLm1hcCgoaXRlbSwgaW5kZXgpID0+IChcbiAqICAgICAgICAgIDxpbnB1dCBrZXk9e2l0ZW0uaWR9IHsuLi5yZWdpc3RlcihgdGVzdC4ke2luZGV4fS5maXJzdE5hbWVgKX0gIC8+XG4gKiAgICAgICApKX1cbiAqICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG9uQ2xpY2s9eygpID0+IGFwcGVuZCh7IGZpcnN0TmFtZTogXCJiaWxsXCIgfSl9PlxuICogICAgICAgICBhcHBlbmRcbiAqICAgICAgIDwvYnV0dG9uPlxuICogICAgICAgPGlucHV0IHR5cGU9XCJzdWJtaXRcIiAvPlxuICogICAgIDwvZm9ybT5cbiAqICAgKTtcbiAqIH1cbiAqIGBgYFxuICovXG5mdW5jdGlvbiB1c2VGaWVsZEFycmF5KHByb3BzKSB7XG4gICAgY29uc3QgbWV0aG9kcyA9IHVzZUZvcm1Db250ZXh0KCk7XG4gICAgY29uc3QgeyBjb250cm9sID0gbWV0aG9kcy5jb250cm9sLCBuYW1lLCBrZXlOYW1lID0gJ2lkJywgc2hvdWxkVW5yZWdpc3RlciwgcnVsZXMsIH0gPSBwcm9wcztcbiAgICBjb25zdCBbZmllbGRzLCBzZXRGaWVsZHNdID0gUmVhY3RfX2RlZmF1bHQudXNlU3RhdGUoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKSk7XG4gICAgY29uc3QgaWRzID0gUmVhY3RfX2RlZmF1bHQudXNlUmVmKGNvbnRyb2wuX2dldEZpZWxkQXJyYXkobmFtZSkubWFwKGdlbmVyYXRlSWQpKTtcbiAgICBjb25zdCBfZmllbGRJZHMgPSBSZWFjdF9fZGVmYXVsdC51c2VSZWYoZmllbGRzKTtcbiAgICBjb25zdCBfbmFtZSA9IFJlYWN0X19kZWZhdWx0LnVzZVJlZihuYW1lKTtcbiAgICBjb25zdCBfYWN0aW9uZWQgPSBSZWFjdF9fZGVmYXVsdC51c2VSZWYoZmFsc2UpO1xuICAgIF9uYW1lLmN1cnJlbnQgPSBuYW1lO1xuICAgIF9maWVsZElkcy5jdXJyZW50ID0gZmllbGRzO1xuICAgIGNvbnRyb2wuX25hbWVzLmFycmF5LmFkZChuYW1lKTtcbiAgICBydWxlcyAmJlxuICAgICAgICBjb250cm9sLnJlZ2lzdGVyKG5hbWUsIHJ1bGVzKTtcbiAgICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IGNvbnRyb2wuX3N1YmplY3RzLmFycmF5LnN1YnNjcmliZSh7XG4gICAgICAgIG5leHQ6ICh7IHZhbHVlcywgbmFtZTogZmllbGRBcnJheU5hbWUsIH0pID0+IHtcbiAgICAgICAgICAgIGlmIChmaWVsZEFycmF5TmFtZSA9PT0gX25hbWUuY3VycmVudCB8fCAhZmllbGRBcnJheU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZFZhbHVlcyA9IGdldCh2YWx1ZXMsIF9uYW1lLmN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZpZWxkVmFsdWVzKSkge1xuICAgICAgICAgICAgICAgICAgICBzZXRGaWVsZHMoZmllbGRWYWx1ZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZHMuY3VycmVudCA9IGZpZWxkVmFsdWVzLm1hcChnZW5lcmF0ZUlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSkudW5zdWJzY3JpYmUsIFtjb250cm9sXSk7XG4gICAgY29uc3QgdXBkYXRlVmFsdWVzID0gUmVhY3RfX2RlZmF1bHQudXNlQ2FsbGJhY2soKHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzKSA9PiB7XG4gICAgICAgIF9hY3Rpb25lZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgY29udHJvbC5fc2V0RmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgfSwgW2NvbnRyb2wsIG5hbWVdKTtcbiAgICBjb25zdCBhcHBlbmQgPSAodmFsdWUsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgY29uc3QgYXBwZW5kVmFsdWUgPSBjb252ZXJ0VG9BcnJheVBheWxvYWQoY2xvbmVPYmplY3QodmFsdWUpKTtcbiAgICAgICAgY29uc3QgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMgPSBhcHBlbmRBdChjb250cm9sLl9nZXRGaWVsZEFycmF5KG5hbWUpLCBhcHBlbmRWYWx1ZSk7XG4gICAgICAgIGNvbnRyb2wuX25hbWVzLmZvY3VzID0gZ2V0Rm9jdXNGaWVsZE5hbWUobmFtZSwgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMubGVuZ3RoIC0gMSwgb3B0aW9ucyk7XG4gICAgICAgIGlkcy5jdXJyZW50ID0gYXBwZW5kQXQoaWRzLmN1cnJlbnQsIGFwcGVuZFZhbHVlLm1hcChnZW5lcmF0ZUlkKSk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIHNldEZpZWxkcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIGNvbnRyb2wuX3NldEZpZWxkQXJyYXkobmFtZSwgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMsIGFwcGVuZEF0LCB7XG4gICAgICAgICAgICBhcmdBOiBmaWxsRW1wdHlBcnJheSh2YWx1ZSksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgcHJlcGVuZCA9ICh2YWx1ZSwgb3B0aW9ucykgPT4ge1xuICAgICAgICBjb25zdCBwcmVwZW5kVmFsdWUgPSBjb252ZXJ0VG9BcnJheVBheWxvYWQoY2xvbmVPYmplY3QodmFsdWUpKTtcbiAgICAgICAgY29uc3QgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMgPSBwcmVwZW5kQXQoY29udHJvbC5fZ2V0RmllbGRBcnJheShuYW1lKSwgcHJlcGVuZFZhbHVlKTtcbiAgICAgICAgY29udHJvbC5fbmFtZXMuZm9jdXMgPSBnZXRGb2N1c0ZpZWxkTmFtZShuYW1lLCAwLCBvcHRpb25zKTtcbiAgICAgICAgaWRzLmN1cnJlbnQgPSBwcmVwZW5kQXQoaWRzLmN1cnJlbnQsIHByZXBlbmRWYWx1ZS5tYXAoZ2VuZXJhdGVJZCkpO1xuICAgICAgICB1cGRhdGVWYWx1ZXModXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMpO1xuICAgICAgICBzZXRGaWVsZHModXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMpO1xuICAgICAgICBjb250cm9sLl9zZXRGaWVsZEFycmF5KG5hbWUsIHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzLCBwcmVwZW5kQXQsIHtcbiAgICAgICAgICAgIGFyZ0E6IGZpbGxFbXB0eUFycmF5KHZhbHVlKSxcbiAgICAgICAgfSk7XG4gICAgfTtcbiAgICBjb25zdCByZW1vdmUgPSAoaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMgPSByZW1vdmVBcnJheUF0KGNvbnRyb2wuX2dldEZpZWxkQXJyYXkobmFtZSksIGluZGV4KTtcbiAgICAgICAgaWRzLmN1cnJlbnQgPSByZW1vdmVBcnJheUF0KGlkcy5jdXJyZW50LCBpbmRleCk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIHNldEZpZWxkcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgICFBcnJheS5pc0FycmF5KGdldChjb250cm9sLl9maWVsZHMsIG5hbWUpKSAmJlxuICAgICAgICAgICAgc2V0KGNvbnRyb2wuX2ZpZWxkcywgbmFtZSwgdW5kZWZpbmVkKTtcbiAgICAgICAgY29udHJvbC5fc2V0RmllbGRBcnJheShuYW1lLCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgcmVtb3ZlQXJyYXlBdCwge1xuICAgICAgICAgICAgYXJnQTogaW5kZXgsXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgaW5zZXJ0JDEgPSAoaW5kZXgsIHZhbHVlLCBvcHRpb25zKSA9PiB7XG4gICAgICAgIGNvbnN0IGluc2VydFZhbHVlID0gY29udmVydFRvQXJyYXlQYXlsb2FkKGNsb25lT2JqZWN0KHZhbHVlKSk7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzID0gaW5zZXJ0KGNvbnRyb2wuX2dldEZpZWxkQXJyYXkobmFtZSksIGluZGV4LCBpbnNlcnRWYWx1ZSk7XG4gICAgICAgIGNvbnRyb2wuX25hbWVzLmZvY3VzID0gZ2V0Rm9jdXNGaWVsZE5hbWUobmFtZSwgaW5kZXgsIG9wdGlvbnMpO1xuICAgICAgICBpZHMuY3VycmVudCA9IGluc2VydChpZHMuY3VycmVudCwgaW5kZXgsIGluc2VydFZhbHVlLm1hcChnZW5lcmF0ZUlkKSk7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIHNldEZpZWxkcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIGNvbnRyb2wuX3NldEZpZWxkQXJyYXkobmFtZSwgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMsIGluc2VydCwge1xuICAgICAgICAgICAgYXJnQTogaW5kZXgsXG4gICAgICAgICAgICBhcmdCOiBmaWxsRW1wdHlBcnJheSh2YWx1ZSksXG4gICAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3Qgc3dhcCA9IChpbmRleEEsIGluZGV4QikgPT4ge1xuICAgICAgICBjb25zdCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcyA9IGNvbnRyb2wuX2dldEZpZWxkQXJyYXkobmFtZSk7XG4gICAgICAgIHN3YXBBcnJheUF0KHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzLCBpbmRleEEsIGluZGV4Qik7XG4gICAgICAgIHN3YXBBcnJheUF0KGlkcy5jdXJyZW50LCBpbmRleEEsIGluZGV4Qik7XG4gICAgICAgIHVwZGF0ZVZhbHVlcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIHNldEZpZWxkcyh1cGRhdGVkRmllbGRBcnJheVZhbHVlcyk7XG4gICAgICAgIGNvbnRyb2wuX3NldEZpZWxkQXJyYXkobmFtZSwgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMsIHN3YXBBcnJheUF0LCB7XG4gICAgICAgICAgICBhcmdBOiBpbmRleEEsXG4gICAgICAgICAgICBhcmdCOiBpbmRleEIsXG4gICAgICAgIH0sIGZhbHNlKTtcbiAgICB9O1xuICAgIGNvbnN0IG1vdmUgPSAoZnJvbSwgdG8pID0+IHtcbiAgICAgICAgY29uc3QgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMgPSBjb250cm9sLl9nZXRGaWVsZEFycmF5KG5hbWUpO1xuICAgICAgICBtb3ZlQXJyYXlBdCh1cGRhdGVkRmllbGRBcnJheVZhbHVlcywgZnJvbSwgdG8pO1xuICAgICAgICBtb3ZlQXJyYXlBdChpZHMuY3VycmVudCwgZnJvbSwgdG8pO1xuICAgICAgICB1cGRhdGVWYWx1ZXModXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMpO1xuICAgICAgICBzZXRGaWVsZHModXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMpO1xuICAgICAgICBjb250cm9sLl9zZXRGaWVsZEFycmF5KG5hbWUsIHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzLCBtb3ZlQXJyYXlBdCwge1xuICAgICAgICAgICAgYXJnQTogZnJvbSxcbiAgICAgICAgICAgIGFyZ0I6IHRvLFxuICAgICAgICB9LCBmYWxzZSk7XG4gICAgfTtcbiAgICBjb25zdCB1cGRhdGUgPSAoaW5kZXgsIHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZVZhbHVlID0gY2xvbmVPYmplY3QodmFsdWUpO1xuICAgICAgICBjb25zdCB1cGRhdGVkRmllbGRBcnJheVZhbHVlcyA9IHVwZGF0ZUF0KGNvbnRyb2wuX2dldEZpZWxkQXJyYXkobmFtZSksIGluZGV4LCB1cGRhdGVWYWx1ZSk7XG4gICAgICAgIGlkcy5jdXJyZW50ID0gWy4uLnVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzXS5tYXAoKGl0ZW0sIGkpID0+ICFpdGVtIHx8IGkgPT09IGluZGV4ID8gZ2VuZXJhdGVJZCgpIDogaWRzLmN1cnJlbnRbaV0pO1xuICAgICAgICB1cGRhdGVWYWx1ZXModXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMpO1xuICAgICAgICBzZXRGaWVsZHMoWy4uLnVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzXSk7XG4gICAgICAgIGNvbnRyb2wuX3NldEZpZWxkQXJyYXkobmFtZSwgdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMsIHVwZGF0ZUF0LCB7XG4gICAgICAgICAgICBhcmdBOiBpbmRleCxcbiAgICAgICAgICAgIGFyZ0I6IHVwZGF0ZVZhbHVlLFxuICAgICAgICB9LCB0cnVlLCBmYWxzZSk7XG4gICAgfTtcbiAgICBjb25zdCByZXBsYWNlID0gKHZhbHVlKSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzID0gY29udmVydFRvQXJyYXlQYXlsb2FkKGNsb25lT2JqZWN0KHZhbHVlKSk7XG4gICAgICAgIGlkcy5jdXJyZW50ID0gdXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXMubWFwKGdlbmVyYXRlSWQpO1xuICAgICAgICB1cGRhdGVWYWx1ZXMoWy4uLnVwZGF0ZWRGaWVsZEFycmF5VmFsdWVzXSk7XG4gICAgICAgIHNldEZpZWxkcyhbLi4udXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXNdKTtcbiAgICAgICAgY29udHJvbC5fc2V0RmllbGRBcnJheShuYW1lLCBbLi4udXBkYXRlZEZpZWxkQXJyYXlWYWx1ZXNdLCAoZGF0YSkgPT4gZGF0YSwge30sIHRydWUsIGZhbHNlKTtcbiAgICB9O1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGNvbnRyb2wuX3N0YXRlLmFjdGlvbiA9IGZhbHNlO1xuICAgICAgICBpc1dhdGNoZWQobmFtZSwgY29udHJvbC5fbmFtZXMpICYmXG4gICAgICAgICAgICBjb250cm9sLl9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAuLi5jb250cm9sLl9mb3JtU3RhdGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgaWYgKF9hY3Rpb25lZC5jdXJyZW50ICYmXG4gICAgICAgICAgICAoIWdldFZhbGlkYXRpb25Nb2Rlcyhjb250cm9sLl9vcHRpb25zLm1vZGUpLmlzT25TdWJtaXQgfHxcbiAgICAgICAgICAgICAgICBjb250cm9sLl9mb3JtU3RhdGUuaXNTdWJtaXR0ZWQpICYmXG4gICAgICAgICAgICAhZ2V0VmFsaWRhdGlvbk1vZGVzKGNvbnRyb2wuX29wdGlvbnMucmVWYWxpZGF0ZU1vZGUpLmlzT25TdWJtaXQpIHtcbiAgICAgICAgICAgIGlmIChjb250cm9sLl9vcHRpb25zLnJlc29sdmVyKSB7XG4gICAgICAgICAgICAgICAgY29udHJvbC5fcnVuU2NoZW1hKFtuYW1lXSkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gZ2V0KHJlc3VsdC5lcnJvcnMsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0Vycm9yID0gZ2V0KGNvbnRyb2wuX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdFcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgPyAoIWVycm9yICYmIGV4aXN0aW5nRXJyb3IudHlwZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyb3IgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4aXN0aW5nRXJyb3IudHlwZSAhPT0gZXJyb3IudHlwZSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdFcnJvci5tZXNzYWdlICE9PSBlcnJvci5tZXNzYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZXJyb3IgJiYgZXJyb3IudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNldChjb250cm9sLl9mb3JtU3RhdGUuZXJyb3JzLCBuYW1lLCBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuc2V0KGNvbnRyb2wuX2Zvcm1TdGF0ZS5lcnJvcnMsIG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbC5fc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzOiBjb250cm9sLl9mb3JtU3RhdGUuZXJyb3JzLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gZ2V0KGNvbnRyb2wuX2ZpZWxkcywgbmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGZpZWxkICYmXG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLl9mICYmXG4gICAgICAgICAgICAgICAgICAgICEoZ2V0VmFsaWRhdGlvbk1vZGVzKGNvbnRyb2wuX29wdGlvbnMucmVWYWxpZGF0ZU1vZGUpLmlzT25TdWJtaXQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldFZhbGlkYXRpb25Nb2Rlcyhjb250cm9sLl9vcHRpb25zLm1vZGUpLmlzT25TdWJtaXQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlRmllbGQoZmllbGQsIGNvbnRyb2wuX25hbWVzLmRpc2FibGVkLCBjb250cm9sLl9mb3JtVmFsdWVzLCBjb250cm9sLl9vcHRpb25zLmNyaXRlcmlhTW9kZSA9PT0gVkFMSURBVElPTl9NT0RFLmFsbCwgY29udHJvbC5fb3B0aW9ucy5zaG91bGRVc2VOYXRpdmVWYWxpZGF0aW9uLCB0cnVlKS50aGVuKChlcnJvcikgPT4gIWlzRW1wdHlPYmplY3QoZXJyb3IpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sLl9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnM6IHVwZGF0ZUZpZWxkQXJyYXlSb290RXJyb3IoY29udHJvbC5fZm9ybVN0YXRlLmVycm9ycywgZXJyb3IsIG5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb250cm9sLl9zdWJqZWN0cy5zdGF0ZS5uZXh0KHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICB2YWx1ZXM6IGNsb25lT2JqZWN0KGNvbnRyb2wuX2Zvcm1WYWx1ZXMpLFxuICAgICAgICB9KTtcbiAgICAgICAgY29udHJvbC5fbmFtZXMuZm9jdXMgJiZcbiAgICAgICAgICAgIGl0ZXJhdGVGaWVsZHNCeUFjdGlvbihjb250cm9sLl9maWVsZHMsIChyZWYsIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjb250cm9sLl9uYW1lcy5mb2N1cyAmJlxuICAgICAgICAgICAgICAgICAgICBrZXkuc3RhcnRzV2l0aChjb250cm9sLl9uYW1lcy5mb2N1cykgJiZcbiAgICAgICAgICAgICAgICAgICAgcmVmLmZvY3VzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlZi5mb2N1cygpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNvbnRyb2wuX25hbWVzLmZvY3VzID0gJyc7XG4gICAgICAgIGNvbnRyb2wuX3NldFZhbGlkKCk7XG4gICAgICAgIF9hY3Rpb25lZC5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSwgW2ZpZWxkcywgbmFtZSwgY29udHJvbF0pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgICFnZXQoY29udHJvbC5fZm9ybVZhbHVlcywgbmFtZSkgJiYgY29udHJvbC5fc2V0RmllbGRBcnJheShuYW1lKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZU1vdW50ZWQgPSAobmFtZSwgdmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IGdldChjb250cm9sLl9maWVsZHMsIG5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChmaWVsZCAmJiBmaWVsZC5fZikge1xuICAgICAgICAgICAgICAgICAgICBmaWVsZC5fZi5tb3VudCA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb250cm9sLl9vcHRpb25zLnNob3VsZFVucmVnaXN0ZXIgfHwgc2hvdWxkVW5yZWdpc3RlclxuICAgICAgICAgICAgICAgID8gY29udHJvbC51bnJlZ2lzdGVyKG5hbWUpXG4gICAgICAgICAgICAgICAgOiB1cGRhdGVNb3VudGVkKG5hbWUsIGZhbHNlKTtcbiAgICAgICAgfTtcbiAgICB9LCBbbmFtZSwgY29udHJvbCwga2V5TmFtZSwgc2hvdWxkVW5yZWdpc3Rlcl0pO1xuICAgIHJldHVybiB7XG4gICAgICAgIHN3YXA6IFJlYWN0X19kZWZhdWx0LnVzZUNhbGxiYWNrKHN3YXAsIFt1cGRhdGVWYWx1ZXMsIG5hbWUsIGNvbnRyb2xdKSxcbiAgICAgICAgbW92ZTogUmVhY3RfX2RlZmF1bHQudXNlQ2FsbGJhY2sobW92ZSwgW3VwZGF0ZVZhbHVlcywgbmFtZSwgY29udHJvbF0pLFxuICAgICAgICBwcmVwZW5kOiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayhwcmVwZW5kLCBbdXBkYXRlVmFsdWVzLCBuYW1lLCBjb250cm9sXSksXG4gICAgICAgIGFwcGVuZDogUmVhY3RfX2RlZmF1bHQudXNlQ2FsbGJhY2soYXBwZW5kLCBbdXBkYXRlVmFsdWVzLCBuYW1lLCBjb250cm9sXSksXG4gICAgICAgIHJlbW92ZTogUmVhY3RfX2RlZmF1bHQudXNlQ2FsbGJhY2socmVtb3ZlLCBbdXBkYXRlVmFsdWVzLCBuYW1lLCBjb250cm9sXSksXG4gICAgICAgIGluc2VydDogUmVhY3RfX2RlZmF1bHQudXNlQ2FsbGJhY2soaW5zZXJ0JDEsIFt1cGRhdGVWYWx1ZXMsIG5hbWUsIGNvbnRyb2xdKSxcbiAgICAgICAgdXBkYXRlOiBSZWFjdF9fZGVmYXVsdC51c2VDYWxsYmFjayh1cGRhdGUsIFt1cGRhdGVWYWx1ZXMsIG5hbWUsIGNvbnRyb2xdKSxcbiAgICAgICAgcmVwbGFjZTogUmVhY3RfX2RlZmF1bHQudXNlQ2FsbGJhY2socmVwbGFjZSwgW3VwZGF0ZVZhbHVlcywgbmFtZSwgY29udHJvbF0pLFxuICAgICAgICBmaWVsZHM6IFJlYWN0X19kZWZhdWx0LnVzZU1lbW8oKCkgPT4gZmllbGRzLm1hcCgoZmllbGQsIGluZGV4KSA9PiAoe1xuICAgICAgICAgICAgLi4uZmllbGQsXG4gICAgICAgICAgICBba2V5TmFtZV06IGlkcy5jdXJyZW50W2luZGV4XSB8fCBnZW5lcmF0ZUlkKCksXG4gICAgICAgIH0pKSwgW2ZpZWxkcywga2V5TmFtZV0pLFxuICAgIH07XG59XG5cbi8qKlxuICogQ3VzdG9tIGhvb2sgdG8gbWFuYWdlIHRoZSBlbnRpcmUgZm9ybS5cbiAqXG4gKiBAcmVtYXJrc1xuICogW0FQSV0oaHR0cHM6Ly9yZWFjdC1ob29rLWZvcm0uY29tL2RvY3MvdXNlZm9ybSkg4oCiIFtEZW1vXShodHRwczovL2NvZGVzYW5kYm94LmlvL3MvcmVhY3QtaG9vay1mb3JtLWdldC1zdGFydGVkLXRzLTVrc21tKSDigKIgW1ZpZGVvXShodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PVJrWHY0QVhYQ180KVxuICpcbiAqIEBwYXJhbSBwcm9wcyAtIGZvcm0gY29uZmlndXJhdGlvbiBhbmQgdmFsaWRhdGlvbiBwYXJhbWV0ZXJzLlxuICpcbiAqIEByZXR1cm5zIG1ldGhvZHMgLSBpbmRpdmlkdWFsIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdGhlIGZvcm0gc3RhdGUuIHtAbGluayBVc2VGb3JtUmV0dXJufVxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c3hcbiAqIGZ1bmN0aW9uIEFwcCgpIHtcbiAqICAgY29uc3QgeyByZWdpc3RlciwgaGFuZGxlU3VibWl0LCB3YXRjaCwgZm9ybVN0YXRlOiB7IGVycm9ycyB9IH0gPSB1c2VGb3JtKCk7XG4gKiAgIGNvbnN0IG9uU3VibWl0ID0gZGF0YSA9PiBjb25zb2xlLmxvZyhkYXRhKTtcbiAqXG4gKiAgIGNvbnNvbGUubG9nKHdhdGNoKFwiZXhhbXBsZVwiKSk7XG4gKlxuICogICByZXR1cm4gKFxuICogICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVTdWJtaXQob25TdWJtaXQpfT5cbiAqICAgICAgIDxpbnB1dCBkZWZhdWx0VmFsdWU9XCJ0ZXN0XCIgey4uLnJlZ2lzdGVyKFwiZXhhbXBsZVwiKX0gLz5cbiAqICAgICAgIDxpbnB1dCB7Li4ucmVnaXN0ZXIoXCJleGFtcGxlUmVxdWlyZWRcIiwgeyByZXF1aXJlZDogdHJ1ZSB9KX0gLz5cbiAqICAgICAgIHtlcnJvcnMuZXhhbXBsZVJlcXVpcmVkICYmIDxzcGFuPlRoaXMgZmllbGQgaXMgcmVxdWlyZWQ8L3NwYW4+fVxuICogICAgICAgPGJ1dHRvbj5TdWJtaXQ8L2J1dHRvbj5cbiAqICAgICA8L2Zvcm0+XG4gKiAgICk7XG4gKiB9XG4gKiBgYGBcbiAqL1xuZnVuY3Rpb24gdXNlRm9ybShwcm9wcyA9IHt9KSB7XG4gICAgY29uc3QgX2Zvcm1Db250cm9sID0gUmVhY3RfX2RlZmF1bHQudXNlUmVmKHVuZGVmaW5lZCk7XG4gICAgY29uc3QgX3ZhbHVlcyA9IFJlYWN0X19kZWZhdWx0LnVzZVJlZih1bmRlZmluZWQpO1xuICAgIGNvbnN0IFtmb3JtU3RhdGUsIHVwZGF0ZUZvcm1TdGF0ZV0gPSBSZWFjdF9fZGVmYXVsdC51c2VTdGF0ZSh7XG4gICAgICAgIGlzRGlydHk6IGZhbHNlLFxuICAgICAgICBpc1ZhbGlkYXRpbmc6IGZhbHNlLFxuICAgICAgICBpc0xvYWRpbmc6IGlzRnVuY3Rpb24ocHJvcHMuZGVmYXVsdFZhbHVlcyksXG4gICAgICAgIGlzU3VibWl0dGVkOiBmYWxzZSxcbiAgICAgICAgaXNTdWJtaXR0aW5nOiBmYWxzZSxcbiAgICAgICAgaXNTdWJtaXRTdWNjZXNzZnVsOiBmYWxzZSxcbiAgICAgICAgaXNWYWxpZDogZmFsc2UsXG4gICAgICAgIHN1Ym1pdENvdW50OiAwLFxuICAgICAgICBkaXJ0eUZpZWxkczoge30sXG4gICAgICAgIHRvdWNoZWRGaWVsZHM6IHt9LFxuICAgICAgICB2YWxpZGF0aW5nRmllbGRzOiB7fSxcbiAgICAgICAgZXJyb3JzOiBwcm9wcy5lcnJvcnMgfHwge30sXG4gICAgICAgIGRpc2FibGVkOiBwcm9wcy5kaXNhYmxlZCB8fCBmYWxzZSxcbiAgICAgICAgaXNSZWFkeTogZmFsc2UsXG4gICAgICAgIGRlZmF1bHRWYWx1ZXM6IGlzRnVuY3Rpb24ocHJvcHMuZGVmYXVsdFZhbHVlcylcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IHByb3BzLmRlZmF1bHRWYWx1ZXMsXG4gICAgfSk7XG4gICAgaWYgKCFfZm9ybUNvbnRyb2wuY3VycmVudCkge1xuICAgICAgICBpZiAocHJvcHMuZm9ybUNvbnRyb2wpIHtcbiAgICAgICAgICAgIF9mb3JtQ29udHJvbC5jdXJyZW50ID0ge1xuICAgICAgICAgICAgICAgIC4uLnByb3BzLmZvcm1Db250cm9sLFxuICAgICAgICAgICAgICAgIGZvcm1TdGF0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpZiAocHJvcHMuZGVmYXVsdFZhbHVlcyAmJiAhaXNGdW5jdGlvbihwcm9wcy5kZWZhdWx0VmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIHByb3BzLmZvcm1Db250cm9sLnJlc2V0KHByb3BzLmRlZmF1bHRWYWx1ZXMsIHByb3BzLnJlc2V0T3B0aW9ucyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB7IGZvcm1Db250cm9sLCAuLi5yZXN0IH0gPSBjcmVhdGVGb3JtQ29udHJvbChwcm9wcyk7XG4gICAgICAgICAgICBfZm9ybUNvbnRyb2wuY3VycmVudCA9IHtcbiAgICAgICAgICAgICAgICAuLi5yZXN0LFxuICAgICAgICAgICAgICAgIGZvcm1TdGF0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY29udHJvbCA9IF9mb3JtQ29udHJvbC5jdXJyZW50LmNvbnRyb2w7XG4gICAgY29udHJvbC5fb3B0aW9ucyA9IHByb3BzO1xuICAgIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgICAgICBjb25zdCBzdWIgPSBjb250cm9sLl9zdWJzY3JpYmUoe1xuICAgICAgICAgICAgZm9ybVN0YXRlOiBjb250cm9sLl9wcm94eUZvcm1TdGF0ZSxcbiAgICAgICAgICAgIGNhbGxiYWNrOiAoKSA9PiB1cGRhdGVGb3JtU3RhdGUoeyAuLi5jb250cm9sLl9mb3JtU3RhdGUgfSksXG4gICAgICAgICAgICByZVJlbmRlclJvb3Q6IHRydWUsXG4gICAgICAgIH0pO1xuICAgICAgICB1cGRhdGVGb3JtU3RhdGUoKGRhdGEpID0+ICh7XG4gICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgaXNSZWFkeTogdHJ1ZSxcbiAgICAgICAgfSkpO1xuICAgICAgICBjb250cm9sLl9mb3JtU3RhdGUuaXNSZWFkeSA9IHRydWU7XG4gICAgICAgIHJldHVybiBzdWI7XG4gICAgfSwgW2NvbnRyb2xdKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4gY29udHJvbC5fZGlzYWJsZUZvcm0ocHJvcHMuZGlzYWJsZWQpLCBbY29udHJvbCwgcHJvcHMuZGlzYWJsZWRdKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAocHJvcHMubW9kZSkge1xuICAgICAgICAgICAgY29udHJvbC5fb3B0aW9ucy5tb2RlID0gcHJvcHMubW9kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcHMucmVWYWxpZGF0ZU1vZGUpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuX29wdGlvbnMucmVWYWxpZGF0ZU1vZGUgPSBwcm9wcy5yZVZhbGlkYXRlTW9kZTtcbiAgICAgICAgfVxuICAgIH0sIFtjb250cm9sLCBwcm9wcy5tb2RlLCBwcm9wcy5yZVZhbGlkYXRlTW9kZV0pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChwcm9wcy5lcnJvcnMpIHtcbiAgICAgICAgICAgIGNvbnRyb2wuX3NldEVycm9ycyhwcm9wcy5lcnJvcnMpO1xuICAgICAgICAgICAgY29udHJvbC5fZm9jdXNFcnJvcigpO1xuICAgICAgICB9XG4gICAgfSwgW2NvbnRyb2wsIHByb3BzLmVycm9yc10pO1xuICAgIFJlYWN0X19kZWZhdWx0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHByb3BzLnNob3VsZFVucmVnaXN0ZXIgJiZcbiAgICAgICAgICAgIGNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLm5leHQoe1xuICAgICAgICAgICAgICAgIHZhbHVlczogY29udHJvbC5fZ2V0V2F0Y2goKSxcbiAgICAgICAgICAgIH0pO1xuICAgIH0sIFtjb250cm9sLCBwcm9wcy5zaG91bGRVbnJlZ2lzdGVyXSk7XG4gICAgUmVhY3RfX2RlZmF1bHQudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaWYgKGNvbnRyb2wuX3Byb3h5Rm9ybVN0YXRlLmlzRGlydHkpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzRGlydHkgPSBjb250cm9sLl9nZXREaXJ0eSgpO1xuICAgICAgICAgICAgaWYgKGlzRGlydHkgIT09IGZvcm1TdGF0ZS5pc0RpcnR5KSB7XG4gICAgICAgICAgICAgICAgY29udHJvbC5fc3ViamVjdHMuc3RhdGUubmV4dCh7XG4gICAgICAgICAgICAgICAgICAgIGlzRGlydHksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCBbY29udHJvbCwgZm9ybVN0YXRlLmlzRGlydHldKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAocHJvcHMudmFsdWVzICYmICFkZWVwRXF1YWwocHJvcHMudmFsdWVzLCBfdmFsdWVzLmN1cnJlbnQpKSB7XG4gICAgICAgICAgICBjb250cm9sLl9yZXNldChwcm9wcy52YWx1ZXMsIHtcbiAgICAgICAgICAgICAgICBrZWVwRmllbGRzUmVmOiB0cnVlLFxuICAgICAgICAgICAgICAgIC4uLmNvbnRyb2wuX29wdGlvbnMucmVzZXRPcHRpb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBfdmFsdWVzLmN1cnJlbnQgPSBwcm9wcy52YWx1ZXM7XG4gICAgICAgICAgICB1cGRhdGVGb3JtU3RhdGUoKHN0YXRlKSA9PiAoeyAuLi5zdGF0ZSB9KSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb250cm9sLl9yZXNldERlZmF1bHRWYWx1ZXMoKTtcbiAgICAgICAgfVxuICAgIH0sIFtjb250cm9sLCBwcm9wcy52YWx1ZXNdKTtcbiAgICBSZWFjdF9fZGVmYXVsdC51c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoIWNvbnRyb2wuX3N0YXRlLm1vdW50KSB7XG4gICAgICAgICAgICBjb250cm9sLl9zZXRWYWxpZCgpO1xuICAgICAgICAgICAgY29udHJvbC5fc3RhdGUubW91bnQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250cm9sLl9zdGF0ZS53YXRjaCkge1xuICAgICAgICAgICAgY29udHJvbC5fc3RhdGUud2F0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnRyb2wuX3N1YmplY3RzLnN0YXRlLm5leHQoeyAuLi5jb250cm9sLl9mb3JtU3RhdGUgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29udHJvbC5fcmVtb3ZlVW5tb3VudGVkKCk7XG4gICAgfSk7XG4gICAgX2Zvcm1Db250cm9sLmN1cnJlbnQuZm9ybVN0YXRlID0gZ2V0UHJveHlGb3JtU3RhdGUoZm9ybVN0YXRlLCBjb250cm9sKTtcbiAgICByZXR1cm4gX2Zvcm1Db250cm9sLmN1cnJlbnQ7XG59XG5cbmV4cG9ydCB7IENvbnRyb2xsZXIsIEZvcm0sIEZvcm1Qcm92aWRlciwgYXBwZW5kRXJyb3JzLCBjcmVhdGVGb3JtQ29udHJvbCwgZ2V0LCBzZXQsIHVzZUNvbnRyb2xsZXIsIHVzZUZpZWxkQXJyYXksIHVzZUZvcm0sIHVzZUZvcm1Db250ZXh0LCB1c2VGb3JtU3RhdGUsIHVzZVdhdGNoIH07XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5lc20ubWpzLm1hcFxuIiwKICAgICIndXNlIGNsaWVudCdcblxuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgKiBhcyBMYWJlbFByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtbGFiZWwnXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmZ1bmN0aW9uIExhYmVsKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIExhYmVsUHJpbWl0aXZlLlJvb3Q+KSB7XG4gIHJldHVybiAoXG4gICAgPExhYmVsUHJpbWl0aXZlLlJvb3RcbiAgICAgIGRhdGEtc2xvdD1cImxhYmVsXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMiB0ZXh0LXNtIGxlYWRpbmctbm9uZSBmb250LW1lZGl1bSBzZWxlY3Qtbm9uZSBncm91cC1kYXRhLVtkaXNhYmxlZD10cnVlXTpwb2ludGVyLWV2ZW50cy1ub25lIGdyb3VwLWRhdGEtW2Rpc2FibGVkPXRydWVdOm9wYWNpdHktNTAgcGVlci1kaXNhYmxlZDpjdXJzb3Itbm90LWFsbG93ZWQgcGVlci1kaXNhYmxlZDpvcGFjaXR5LTUwJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IHsgTGFiZWwgfVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gSW5wdXQoeyBjbGFzc05hbWUsIHR5cGUsIC4uLnByb3BzIH06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdpbnB1dCc+KSB7XG4gIHJldHVybiAoXG4gICAgPGlucHV0XG4gICAgICB0eXBlPXt0eXBlfVxuICAgICAgZGF0YS1zbG90PVwiaW5wdXRcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2ZpbGU6dGV4dC1mb3JlZ3JvdW5kIHBsYWNlaG9sZGVyOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBzZWxlY3Rpb246YmctcHJpbWFyeSBzZWxlY3Rpb246dGV4dC1wcmltYXJ5LWZvcmVncm91bmQgZGFyazpiZy1pbnB1dC8zMCBib3JkZXItaW5wdXQgZmxleCBoLTkgdy1mdWxsIG1pbi13LTAgcm91bmRlZC1tZCBib3JkZXIgYmctdHJhbnNwYXJlbnQgcHgtMyBweS0xIHRleHQtYmFzZSBzaGFkb3cteHMgdHJhbnNpdGlvbi1bY29sb3IsYm94LXNoYWRvd10gb3V0bGluZS1ub25lIGZpbGU6aW5saW5lLWZsZXggZmlsZTpoLTcgZmlsZTpib3JkZXItMCBmaWxlOmJnLXRyYW5zcGFyZW50IGZpbGU6dGV4dC1zbSBmaWxlOmZvbnQtbWVkaXVtIGRpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmUgZGlzYWJsZWQ6Y3Vyc29yLW5vdC1hbGxvd2VkIGRpc2FibGVkOm9wYWNpdHktNTAgbWQ6dGV4dC1zbScsXG4gICAgICAgICdmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGZvY3VzLXZpc2libGU6cmluZy1bM3B4XScsXG4gICAgICAgICdhcmlhLWludmFsaWQ6cmluZy1kZXN0cnVjdGl2ZS8yMCBkYXJrOmFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzQwIGFyaWEtaW52YWxpZDpib3JkZXItZGVzdHJ1Y3RpdmUnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5leHBvcnQgeyBJbnB1dCB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgU2Nyb2xsQXJlYVByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3Qtc2Nyb2xsLWFyZWEnXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmZ1bmN0aW9uIFNjcm9sbEFyZWEoe1xuICBjbGFzc05hbWUsXG4gIGNoaWxkcmVuLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNjcm9sbEFyZWFQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2Nyb2xsQXJlYVByaW1pdGl2ZS5Sb290XG4gICAgICBkYXRhLXNsb3Q9XCJzY3JvbGwtYXJlYVwiXG4gICAgICBjbGFzc05hbWU9e2NuKCdyZWxhdGl2ZScsIGNsYXNzTmFtZSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgPlxuICAgICAgPFNjcm9sbEFyZWFQcmltaXRpdmUuVmlld3BvcnRcbiAgICAgICAgZGF0YS1zbG90PVwic2Nyb2xsLWFyZWEtdmlld3BvcnRcIlxuICAgICAgICBjbGFzc05hbWU9XCJmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBzaXplLWZ1bGwgcm91bmRlZC1baW5oZXJpdF0gdHJhbnNpdGlvbi1bY29sb3IsYm94LXNoYWRvd10gb3V0bGluZS1ub25lIGZvY3VzLXZpc2libGU6cmluZy1bM3B4XSBmb2N1cy12aXNpYmxlOm91dGxpbmUtMVwiXG4gICAgICA+XG4gICAgICAgIHtjaGlsZHJlbn1cbiAgICAgIDwvU2Nyb2xsQXJlYVByaW1pdGl2ZS5WaWV3cG9ydD5cbiAgICAgIDxTY3JvbGxCYXIgLz5cbiAgICAgIDxTY3JvbGxBcmVhUHJpbWl0aXZlLkNvcm5lciAvPlxuICAgIDwvU2Nyb2xsQXJlYVByaW1pdGl2ZS5Sb290PlxuICApXG59XG5cbmZ1bmN0aW9uIFNjcm9sbEJhcih7XG4gIGNsYXNzTmFtZSxcbiAgb3JpZW50YXRpb24gPSAndmVydGljYWwnLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNjcm9sbEFyZWFQcmltaXRpdmUuU2Nyb2xsQXJlYVNjcm9sbGJhcj4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2Nyb2xsQXJlYVByaW1pdGl2ZS5TY3JvbGxBcmVhU2Nyb2xsYmFyXG4gICAgICBkYXRhLXNsb3Q9XCJzY3JvbGwtYXJlYS1zY3JvbGxiYXJcIlxuICAgICAgb3JpZW50YXRpb249e29yaWVudGF0aW9ufVxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2ZsZXggdG91Y2gtbm9uZSBwLXB4IHRyYW5zaXRpb24tY29sb3JzIHNlbGVjdC1ub25lJyxcbiAgICAgICAgb3JpZW50YXRpb24gPT09ICd2ZXJ0aWNhbCcgJiZcbiAgICAgICAgICAnaC1mdWxsIHctMi41IGJvcmRlci1sIGJvcmRlci1sLXRyYW5zcGFyZW50JyxcbiAgICAgICAgb3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyAmJlxuICAgICAgICAgICdoLTIuNSBmbGV4LWNvbCBib3JkZXItdCBib3JkZXItdC10cmFuc3BhcmVudCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICA+XG4gICAgICA8U2Nyb2xsQXJlYVByaW1pdGl2ZS5TY3JvbGxBcmVhVGh1bWJcbiAgICAgICAgZGF0YS1zbG90PVwic2Nyb2xsLWFyZWEtdGh1bWJcIlxuICAgICAgICBjbGFzc05hbWU9XCJiZy1ib3JkZXIgcmVsYXRpdmUgZmxleC0xIHJvdW5kZWQtZnVsbFwiXG4gICAgICAvPlxuICAgIDwvU2Nyb2xsQXJlYVByaW1pdGl2ZS5TY3JvbGxBcmVhU2Nyb2xsYmFyPlxuICApXG59XG5cbmV4cG9ydCB7IFNjcm9sbEFyZWEsIFNjcm9sbEJhciB9XG4iLAogICAgImltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0ICogYXMgU2VsZWN0UHJpbWl0aXZlIGZyb20gJ0ByYWRpeC11aS9yZWFjdC1zZWxlY3QnXG5pbXBvcnQgeyBDaGVja0ljb24sIENoZXZyb25Eb3duSWNvbiwgQ2hldnJvblVwSWNvbiB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gU2VsZWN0KHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTZWxlY3RQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIDxTZWxlY3RQcmltaXRpdmUuUm9vdCBkYXRhLXNsb3Q9XCJzZWxlY3RcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIFNlbGVjdEdyb3VwKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTZWxlY3RQcmltaXRpdmUuR3JvdXA+KSB7XG4gIHJldHVybiA8U2VsZWN0UHJpbWl0aXZlLkdyb3VwIGRhdGEtc2xvdD1cInNlbGVjdC1ncm91cFwiIHsuLi5wcm9wc30gLz5cbn1cblxuZnVuY3Rpb24gU2VsZWN0VmFsdWUoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNlbGVjdFByaW1pdGl2ZS5WYWx1ZT4pIHtcbiAgcmV0dXJuIDxTZWxlY3RQcmltaXRpdmUuVmFsdWUgZGF0YS1zbG90PVwic2VsZWN0LXZhbHVlXCIgey4uLnByb3BzfSAvPlxufVxuXG5mdW5jdGlvbiBTZWxlY3RUcmlnZ2VyKHtcbiAgY2xhc3NOYW1lLFxuICBzaXplID0gJ2RlZmF1bHQnLFxuICBjaGlsZHJlbixcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTZWxlY3RQcmltaXRpdmUuVHJpZ2dlcj4gJiB7XG4gIHNpemU/OiAnc20nIHwgJ2RlZmF1bHQnXG59KSB7XG4gIHJldHVybiAoXG4gICAgPFNlbGVjdFByaW1pdGl2ZS5UcmlnZ2VyXG4gICAgICBkYXRhLXNsb3Q9XCJzZWxlY3QtdHJpZ2dlclwiXG4gICAgICBkYXRhLXNpemU9e3NpemV9XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICBcImJvcmRlci1pbnB1dCBkYXRhLVtwbGFjZWhvbGRlcl06dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIFsmX3N2Zzpub3QoW2NsYXNzKj0ndGV4dC0nXSldOnRleHQtbXV0ZWQtZm9yZWdyb3VuZCBmb2N1cy12aXNpYmxlOmJvcmRlci1yaW5nIGZvY3VzLXZpc2libGU6cmluZy1yaW5nLzUwIGFyaWEtaW52YWxpZDpyaW5nLWRlc3RydWN0aXZlLzIwIGRhcms6YXJpYS1pbnZhbGlkOnJpbmctZGVzdHJ1Y3RpdmUvNDAgYXJpYS1pbnZhbGlkOmJvcmRlci1kZXN0cnVjdGl2ZSBkYXJrOmJnLWlucHV0LzMwIGRhcms6aG92ZXI6YmctaW5wdXQvNTAgZmxleCB3LWZpdCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuIGdhcC0yIHJvdW5kZWQtbWQgYm9yZGVyIGJnLXRyYW5zcGFyZW50IHB4LTMgcHktMiB0ZXh0LXNtIHdoaXRlc3BhY2Utbm93cmFwIHNoYWRvdy14cyB0cmFuc2l0aW9uLVtjb2xvcixib3gtc2hhZG93XSBvdXRsaW5lLW5vbmUgZm9jdXMtdmlzaWJsZTpyaW5nLVszcHhdIGRpc2FibGVkOmN1cnNvci1ub3QtYWxsb3dlZCBkaXNhYmxlZDpvcGFjaXR5LTUwIGRhdGEtW3NpemU9ZGVmYXVsdF06aC05IGRhdGEtW3NpemU9c21dOmgtOCAqOmRhdGEtW3Nsb3Q9c2VsZWN0LXZhbHVlXTpsaW5lLWNsYW1wLTEgKjpkYXRhLVtzbG90PXNlbGVjdC12YWx1ZV06ZmxleCAqOmRhdGEtW3Nsb3Q9c2VsZWN0LXZhbHVlXTppdGVtcy1jZW50ZXIgKjpkYXRhLVtzbG90PXNlbGVjdC12YWx1ZV06Z2FwLTIgWyZfc3ZnXTpwb2ludGVyLWV2ZW50cy1ub25lIFsmX3N2Z106c2hyaW5rLTAgWyZfc3ZnOm5vdChbY2xhc3MqPSdzaXplLSddKV06c2l6ZS00XCIsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICA8U2VsZWN0UHJpbWl0aXZlLkljb24gYXNDaGlsZD5cbiAgICAgICAgPENoZXZyb25Eb3duSWNvbiBjbGFzc05hbWU9XCJzaXplLTQgb3BhY2l0eS01MFwiIC8+XG4gICAgICA8L1NlbGVjdFByaW1pdGl2ZS5JY29uPlxuICAgIDwvU2VsZWN0UHJpbWl0aXZlLlRyaWdnZXI+XG4gIClcbn1cblxuZnVuY3Rpb24gU2VsZWN0Q29udGVudCh7XG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIHBvc2l0aW9uID0gJ3BvcHBlcicsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2VsZWN0UHJpbWl0aXZlLkNvbnRlbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPFNlbGVjdFByaW1pdGl2ZS5Qb3J0YWw+XG4gICAgICA8U2VsZWN0UHJpbWl0aXZlLkNvbnRlbnRcbiAgICAgICAgZGF0YS1zbG90PVwic2VsZWN0LWNvbnRlbnRcIlxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdiZy1wb3BvdmVyIHRleHQtcG9wb3Zlci1mb3JlZ3JvdW5kIGRhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmZhZGUtb3V0LTAgZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wIGRhdGEtW3N0YXRlPWNsb3NlZF06em9vbS1vdXQtOTUgZGF0YS1bc3RhdGU9b3Blbl06em9vbS1pbi05NSBkYXRhLVtzaWRlPWJvdHRvbV06c2xpZGUtaW4tZnJvbS10b3AtMiBkYXRhLVtzaWRlPWxlZnRdOnNsaWRlLWluLWZyb20tcmlnaHQtMiBkYXRhLVtzaWRlPXJpZ2h0XTpzbGlkZS1pbi1mcm9tLWxlZnQtMiBkYXRhLVtzaWRlPXRvcF06c2xpZGUtaW4tZnJvbS1ib3R0b20tMiByZWxhdGl2ZSB6LTUwIG1heC1oLSgtLXJhZGl4LXNlbGVjdC1jb250ZW50LWF2YWlsYWJsZS1oZWlnaHQpIG1pbi13LVs4cmVtXSBvcmlnaW4tKC0tcmFkaXgtc2VsZWN0LWNvbnRlbnQtdHJhbnNmb3JtLW9yaWdpbikgb3ZlcmZsb3cteC1oaWRkZW4gb3ZlcmZsb3cteS1hdXRvIHJvdW5kZWQtbWQgYm9yZGVyIHNoYWRvdy1tZCcsXG4gICAgICAgICAgcG9zaXRpb24gPT09ICdwb3BwZXInICYmXG4gICAgICAgICAgICAnZGF0YS1bc2lkZT1ib3R0b21dOnRyYW5zbGF0ZS15LTEgZGF0YS1bc2lkZT1sZWZ0XTotdHJhbnNsYXRlLXgtMSBkYXRhLVtzaWRlPXJpZ2h0XTp0cmFuc2xhdGUteC0xIGRhdGEtW3NpZGU9dG9wXTotdHJhbnNsYXRlLXktMScsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICAgIHBvc2l0aW9uPXtwb3NpdGlvbn1cbiAgICAgICAgey4uLnByb3BzfVxuICAgICAgPlxuICAgICAgICA8U2VsZWN0U2Nyb2xsVXBCdXR0b24gLz5cbiAgICAgICAgPFNlbGVjdFByaW1pdGl2ZS5WaWV3cG9ydFxuICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAncC0xJyxcbiAgICAgICAgICAgIHBvc2l0aW9uID09PSAncG9wcGVyJyAmJlxuICAgICAgICAgICAgICAnaC1bdmFyKC0tcmFkaXgtc2VsZWN0LXRyaWdnZXItaGVpZ2h0KV0gdy1mdWxsIG1pbi13LVt2YXIoLS1yYWRpeC1zZWxlY3QtdHJpZ2dlci13aWR0aCldIHNjcm9sbC1teS0xJ1xuICAgICAgICAgICl9XG4gICAgICAgID5cbiAgICAgICAgICB7Y2hpbGRyZW59XG4gICAgICAgIDwvU2VsZWN0UHJpbWl0aXZlLlZpZXdwb3J0PlxuICAgICAgICA8U2VsZWN0U2Nyb2xsRG93bkJ1dHRvbiAvPlxuICAgICAgPC9TZWxlY3RQcmltaXRpdmUuQ29udGVudD5cbiAgICA8L1NlbGVjdFByaW1pdGl2ZS5Qb3J0YWw+XG4gIClcbn1cblxuZnVuY3Rpb24gU2VsZWN0TGFiZWwoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2VsZWN0UHJpbWl0aXZlLkxhYmVsPikge1xuICByZXR1cm4gKFxuICAgIDxTZWxlY3RQcmltaXRpdmUuTGFiZWxcbiAgICAgIGRhdGEtc2xvdD1cInNlbGVjdC1sYWJlbFwiXG4gICAgICBjbGFzc05hbWU9e2NuKCd0ZXh0LW11dGVkLWZvcmVncm91bmQgcHgtMiBweS0xLjUgdGV4dC14cycsIGNsYXNzTmFtZSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBTZWxlY3RJdGVtKHtcbiAgY2xhc3NOYW1lLFxuICBjaGlsZHJlbixcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTZWxlY3RQcmltaXRpdmUuSXRlbT4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0UHJpbWl0aXZlLkl0ZW1cbiAgICAgIGRhdGEtc2xvdD1cInNlbGVjdC1pdGVtXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgIFwiZm9jdXM6YmctYWNjZW50IGZvY3VzOnRleHQtYWNjZW50LWZvcmVncm91bmQgWyZfc3ZnOm5vdChbY2xhc3MqPSd0ZXh0LSddKV06dGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHJlbGF0aXZlIGZsZXggdy1mdWxsIGN1cnNvci1kZWZhdWx0IGl0ZW1zLWNlbnRlciBnYXAtMiByb3VuZGVkLXNtIHB5LTEuNSBwci04IHBsLTIgdGV4dC1zbSBvdXRsaW5lLWhpZGRlbiBzZWxlY3Qtbm9uZSBkYXRhLVtkaXNhYmxlZF06cG9pbnRlci1ldmVudHMtbm9uZSBkYXRhLVtkaXNhYmxlZF06b3BhY2l0eS01MCBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTQgKjpbc3Bhbl06bGFzdDpmbGV4ICo6W3NwYW5dOmxhc3Q6aXRlbXMtY2VudGVyICo6W3NwYW5dOmxhc3Q6Z2FwLTJcIixcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImFic29sdXRlIHJpZ2h0LTIgZmxleCBzaXplLTMuNSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgPFNlbGVjdFByaW1pdGl2ZS5JdGVtSW5kaWNhdG9yPlxuICAgICAgICAgIDxDaGVja0ljb24gY2xhc3NOYW1lPVwic2l6ZS00XCIgLz5cbiAgICAgICAgPC9TZWxlY3RQcmltaXRpdmUuSXRlbUluZGljYXRvcj5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxTZWxlY3RQcmltaXRpdmUuSXRlbVRleHQ+e2NoaWxkcmVufTwvU2VsZWN0UHJpbWl0aXZlLkl0ZW1UZXh0PlxuICAgIDwvU2VsZWN0UHJpbWl0aXZlLkl0ZW0+XG4gIClcbn1cblxuZnVuY3Rpb24gU2VsZWN0U2VwYXJhdG9yKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNlbGVjdFByaW1pdGl2ZS5TZXBhcmF0b3I+KSB7XG4gIHJldHVybiAoXG4gICAgPFNlbGVjdFByaW1pdGl2ZS5TZXBhcmF0b3JcbiAgICAgIGRhdGEtc2xvdD1cInNlbGVjdC1zZXBhcmF0b3JcIlxuICAgICAgY2xhc3NOYW1lPXtjbignYmctYm9yZGVyIHBvaW50ZXItZXZlbnRzLW5vbmUgLW14LTEgbXktMSBoLXB4JywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFNlbGVjdFNjcm9sbFVwQnV0dG9uKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNlbGVjdFByaW1pdGl2ZS5TY3JvbGxVcEJ1dHRvbj4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2VsZWN0UHJpbWl0aXZlLlNjcm9sbFVwQnV0dG9uXG4gICAgICBkYXRhLXNsb3Q9XCJzZWxlY3Qtc2Nyb2xsLXVwLWJ1dHRvblwiXG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZmxleCBjdXJzb3ItZGVmYXVsdCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgcHktMScsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICA+XG4gICAgICA8Q2hldnJvblVwSWNvbiBjbGFzc05hbWU9XCJzaXplLTRcIiAvPlxuICAgIDwvU2VsZWN0UHJpbWl0aXZlLlNjcm9sbFVwQnV0dG9uPlxuICApXG59XG5cbmZ1bmN0aW9uIFNlbGVjdFNjcm9sbERvd25CdXR0b24oe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2VsZWN0UHJpbWl0aXZlLlNjcm9sbERvd25CdXR0b24+KSB7XG4gIHJldHVybiAoXG4gICAgPFNlbGVjdFByaW1pdGl2ZS5TY3JvbGxEb3duQnV0dG9uXG4gICAgICBkYXRhLXNsb3Q9XCJzZWxlY3Qtc2Nyb2xsLWRvd24tYnV0dG9uXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdmbGV4IGN1cnNvci1kZWZhdWx0IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBweS0xJyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgID5cbiAgICAgIDxDaGV2cm9uRG93bkljb24gY2xhc3NOYW1lPVwic2l6ZS00XCIgLz5cbiAgICA8L1NlbGVjdFByaW1pdGl2ZS5TY3JvbGxEb3duQnV0dG9uPlxuICApXG59XG5cbmV4cG9ydCB7XG4gIFNlbGVjdCxcbiAgU2VsZWN0Q29udGVudCxcbiAgU2VsZWN0R3JvdXAsXG4gIFNlbGVjdEl0ZW0sXG4gIFNlbGVjdExhYmVsLFxuICBTZWxlY3RTY3JvbGxEb3duQnV0dG9uLFxuICBTZWxlY3RTY3JvbGxVcEJ1dHRvbixcbiAgU2VsZWN0U2VwYXJhdG9yLFxuICBTZWxlY3RUcmlnZ2VyLFxuICBTZWxlY3RWYWx1ZSxcbn1cbiIsCiAgICAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgKiBhcyBTZXBhcmF0b3JQcmltaXRpdmUgZnJvbSAnQHJhZGl4LXVpL3JlYWN0LXNlcGFyYXRvcidcblxuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZnVuY3Rpb24gU2VwYXJhdG9yKHtcbiAgY2xhc3NOYW1lLFxuICBvcmllbnRhdGlvbiA9ICdob3Jpem9udGFsJyxcbiAgZGVjb3JhdGl2ZSA9IHRydWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2VwYXJhdG9yUHJpbWl0aXZlLlJvb3Q+KSB7XG4gIHJldHVybiAoXG4gICAgPFNlcGFyYXRvclByaW1pdGl2ZS5Sb290XG4gICAgICBkYXRhLXNsb3Q9XCJzZXBhcmF0b3Itcm9vdFwiXG4gICAgICBkZWNvcmF0aXZlPXtkZWNvcmF0aXZlfVxuICAgICAgb3JpZW50YXRpb249e29yaWVudGF0aW9ufVxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2JnLWJvcmRlciBzaHJpbmstMCBkYXRhLVtvcmllbnRhdGlvbj1ob3Jpem9udGFsXTpoLXB4IGRhdGEtW29yaWVudGF0aW9uPWhvcml6b250YWxdOnctZnVsbCBkYXRhLVtvcmllbnRhdGlvbj12ZXJ0aWNhbF06aC1mdWxsIGRhdGEtW29yaWVudGF0aW9uPXZlcnRpY2FsXTp3LXB4JyxcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZXhwb3J0IHsgU2VwYXJhdG9yIH1cbiIsCiAgICAiaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgKiBhcyBTaGVldFByaW1pdGl2ZSBmcm9tICdAcmFkaXgtdWkvcmVhY3QtZGlhbG9nJ1xuaW1wb3J0IHsgWEljb24gfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmZ1bmN0aW9uIFNoZWV0KHsgLi4ucHJvcHMgfTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNoZWV0UHJpbWl0aXZlLlJvb3Q+KSB7XG4gIHJldHVybiA8U2hlZXRQcmltaXRpdmUuUm9vdCBkYXRhLXNsb3Q9XCJzaGVldFwiIHsuLi5wcm9wc30gLz5cbn1cblxuZnVuY3Rpb24gU2hlZXRUcmlnZ2VyKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTaGVldFByaW1pdGl2ZS5UcmlnZ2VyPikge1xuICByZXR1cm4gPFNoZWV0UHJpbWl0aXZlLlRyaWdnZXIgZGF0YS1zbG90PVwic2hlZXQtdHJpZ2dlclwiIHsuLi5wcm9wc30gLz5cbn1cblxuZnVuY3Rpb24gU2hlZXRDbG9zZSh7XG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgU2hlZXRQcmltaXRpdmUuQ2xvc2U+KSB7XG4gIHJldHVybiA8U2hlZXRQcmltaXRpdmUuQ2xvc2UgZGF0YS1zbG90PVwic2hlZXQtY2xvc2VcIiB7Li4ucHJvcHN9IC8+XG59XG5cbmZ1bmN0aW9uIFNoZWV0UG9ydGFsKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTaGVldFByaW1pdGl2ZS5Qb3J0YWw+KSB7XG4gIHJldHVybiA8U2hlZXRQcmltaXRpdmUuUG9ydGFsIGRhdGEtc2xvdD1cInNoZWV0LXBvcnRhbFwiIHsuLi5wcm9wc30gLz5cbn1cblxuZnVuY3Rpb24gU2hlZXRPdmVybGF5KHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNoZWV0UHJpbWl0aXZlLk92ZXJsYXk+KSB7XG4gIHJldHVybiAoXG4gICAgPFNoZWV0UHJpbWl0aXZlLk92ZXJsYXlcbiAgICAgIGRhdGEtc2xvdD1cInNoZWV0LW92ZXJsYXlcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2RhdGEtW3N0YXRlPW9wZW5dOmFuaW1hdGUtaW4gZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmZhZGUtb3V0LTAgZGF0YS1bc3RhdGU9b3Blbl06ZmFkZS1pbi0wIGZpeGVkIGluc2V0LTAgei01MCBiZy1ibGFjay81MCcsXG4gICAgICAgIGNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFNoZWV0Q29udGVudCh7XG4gIGNsYXNzTmFtZSxcbiAgY2hpbGRyZW4sXG4gIHNpZGUgPSAncmlnaHQnLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNoZWV0UHJpbWl0aXZlLkNvbnRlbnQ+ICYge1xuICBzaWRlPzogJ3RvcCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnbGVmdCdcbn0pIHtcbiAgcmV0dXJuIChcbiAgICA8U2hlZXRQb3J0YWw+XG4gICAgICA8U2hlZXRPdmVybGF5IC8+XG4gICAgICA8U2hlZXRQcmltaXRpdmUuQ29udGVudFxuICAgICAgICBkYXRhLXNsb3Q9XCJzaGVldC1jb250ZW50XCJcbiAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAnYmctYmFja2dyb3VuZCBkYXRhLVtzdGF0ZT1vcGVuXTphbmltYXRlLWluIGRhdGEtW3N0YXRlPWNsb3NlZF06YW5pbWF0ZS1vdXQgZml4ZWQgei01MCBmbGV4IGZsZXgtY29sIGdhcC00IHNoYWRvdy1sZyB0cmFuc2l0aW9uIGVhc2UtaW4tb3V0IGRhdGEtW3N0YXRlPWNsb3NlZF06ZHVyYXRpb24tMzAwIGRhdGEtW3N0YXRlPW9wZW5dOmR1cmF0aW9uLTUwMCcsXG4gICAgICAgICAgc2lkZSA9PT0gJ3JpZ2h0JyAmJlxuICAgICAgICAgICAgJ2RhdGEtW3N0YXRlPWNsb3NlZF06c2xpZGUtb3V0LXRvLXJpZ2h0IGRhdGEtW3N0YXRlPW9wZW5dOnNsaWRlLWluLWZyb20tcmlnaHQgaW5zZXQteS0wIHJpZ2h0LTAgaC1mdWxsIHctMy80IGJvcmRlci1sIHNtOm1heC13LXNtJyxcbiAgICAgICAgICBzaWRlID09PSAnbGVmdCcgJiZcbiAgICAgICAgICAgICdkYXRhLVtzdGF0ZT1jbG9zZWRdOnNsaWRlLW91dC10by1sZWZ0IGRhdGEtW3N0YXRlPW9wZW5dOnNsaWRlLWluLWZyb20tbGVmdCBpbnNldC15LTAgbGVmdC0wIGgtZnVsbCB3LTMvNCBib3JkZXItciBzbTptYXgtdy1zbScsXG4gICAgICAgICAgc2lkZSA9PT0gJ3RvcCcgJiZcbiAgICAgICAgICAgICdkYXRhLVtzdGF0ZT1jbG9zZWRdOnNsaWRlLW91dC10by10b3AgZGF0YS1bc3RhdGU9b3Blbl06c2xpZGUtaW4tZnJvbS10b3AgaW5zZXQteC0wIHRvcC0wIGgtYXV0byBib3JkZXItYicsXG4gICAgICAgICAgc2lkZSA9PT0gJ2JvdHRvbScgJiZcbiAgICAgICAgICAgICdkYXRhLVtzdGF0ZT1jbG9zZWRdOnNsaWRlLW91dC10by1ib3R0b20gZGF0YS1bc3RhdGU9b3Blbl06c2xpZGUtaW4tZnJvbS1ib3R0b20gaW5zZXQteC0wIGJvdHRvbS0wIGgtYXV0byBib3JkZXItdCcsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgID5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8U2hlZXRQcmltaXRpdmUuQ2xvc2UgY2xhc3NOYW1lPVwicmluZy1vZmZzZXQtYmFja2dyb3VuZCBmb2N1czpyaW5nLXJpbmcgZGF0YS1bc3RhdGU9b3Blbl06Ymctc2Vjb25kYXJ5IGFic29sdXRlIHRvcC00IHJpZ2h0LTQgcm91bmRlZC14cyBvcGFjaXR5LTcwIHRyYW5zaXRpb24tb3BhY2l0eSBob3ZlcjpvcGFjaXR5LTEwMCBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1vZmZzZXQtMiBmb2N1czpvdXRsaW5lLWhpZGRlbiBkaXNhYmxlZDpwb2ludGVyLWV2ZW50cy1ub25lXCI+XG4gICAgICAgICAgPFhJY29uIGNsYXNzTmFtZT1cInNpemUtNFwiIC8+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwic3Itb25seVwiPkNsb3NlPC9zcGFuPlxuICAgICAgICA8L1NoZWV0UHJpbWl0aXZlLkNsb3NlPlxuICAgICAgPC9TaGVldFByaW1pdGl2ZS5Db250ZW50PlxuICAgIDwvU2hlZXRQb3J0YWw+XG4gIClcbn1cblxuZnVuY3Rpb24gU2hlZXRIZWFkZXIoeyBjbGFzc05hbWUsIC4uLnByb3BzIH06IFJlYWN0LkNvbXBvbmVudFByb3BzPCdkaXYnPikge1xuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtc2xvdD1cInNoZWV0LWhlYWRlclwiXG4gICAgICBjbGFzc05hbWU9e2NuKCdmbGV4IGZsZXgtY29sIGdhcC0xLjUgcC00JywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFNoZWV0Rm9vdGVyKHsgY2xhc3NOYW1lLCAuLi5wcm9wcyB9OiBSZWFjdC5Db21wb25lbnRQcm9wczwnZGl2Jz4pIHtcbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBkYXRhLXNsb3Q9XCJzaGVldC1mb290ZXJcIlxuICAgICAgY2xhc3NOYW1lPXtjbignbXQtYXV0byBmbGV4IGZsZXgtY29sIGdhcC0yIHAtNCcsIGNsYXNzTmFtZSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBTaGVldFRpdGxlKHtcbiAgY2xhc3NOYW1lLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFNoZWV0UHJpbWl0aXZlLlRpdGxlPikge1xuICByZXR1cm4gKFxuICAgIDxTaGVldFByaW1pdGl2ZS5UaXRsZVxuICAgICAgZGF0YS1zbG90PVwic2hlZXQtdGl0bGVcIlxuICAgICAgY2xhc3NOYW1lPXtjbigndGV4dC1mb3JlZ3JvdW5kIGZvbnQtc2VtaWJvbGQnLCBjbGFzc05hbWUpfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gU2hlZXREZXNjcmlwdGlvbih7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBTaGVldFByaW1pdGl2ZS5EZXNjcmlwdGlvbj4pIHtcbiAgcmV0dXJuIChcbiAgICA8U2hlZXRQcmltaXRpdmUuRGVzY3JpcHRpb25cbiAgICAgIGRhdGEtc2xvdD1cInNoZWV0LWRlc2NyaXB0aW9uXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oJ3RleHQtbXV0ZWQtZm9yZWdyb3VuZCB0ZXh0LXNtJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmV4cG9ydCB7XG4gIFNoZWV0LFxuICBTaGVldFRyaWdnZXIsXG4gIFNoZWV0Q2xvc2UsXG4gIFNoZWV0Q29udGVudCxcbiAgU2hlZXRIZWFkZXIsXG4gIFNoZWV0Rm9vdGVyLFxuICBTaGVldFRpdGxlLFxuICBTaGVldERlc2NyaXB0aW9uLFxufVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIFRhYnNQcmltaXRpdmUgZnJvbSAnQHJhZGl4LXVpL3JlYWN0LXRhYnMnXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmZ1bmN0aW9uIFRhYnMoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgVGFic1ByaW1pdGl2ZS5Sb290Pikge1xuICByZXR1cm4gKFxuICAgIDxUYWJzUHJpbWl0aXZlLlJvb3RcbiAgICAgIGRhdGEtc2xvdD1cInRhYnNcIlxuICAgICAgY2xhc3NOYW1lPXtjbignZmxleCBmbGV4LWNvbCBnYXAtMicsIGNsYXNzTmFtZSl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBUYWJzTGlzdCh7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBUYWJzUHJpbWl0aXZlLkxpc3Q+KSB7XG4gIHJldHVybiAoXG4gICAgPFRhYnNQcmltaXRpdmUuTGlzdFxuICAgICAgZGF0YS1zbG90PVwidGFicy1saXN0XCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdiZy1tdXRlZCB0ZXh0LW11dGVkLWZvcmVncm91bmQgaW5saW5lLWZsZXggaC05IHctZml0IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLWxnIHAtWzNweF0nLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgICB7Li4ucHJvcHN9XG4gICAgLz5cbiAgKVxufVxuXG5mdW5jdGlvbiBUYWJzVHJpZ2dlcih7XG4gIGNsYXNzTmFtZSxcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBUYWJzUHJpbWl0aXZlLlRyaWdnZXI+KSB7XG4gIHJldHVybiAoXG4gICAgPFRhYnNQcmltaXRpdmUuVHJpZ2dlclxuICAgICAgZGF0YS1zbG90PVwidGFicy10cmlnZ2VyXCJcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgIFwiZGF0YS1bc3RhdGU9YWN0aXZlXTpiZy1iYWNrZ3JvdW5kIGRhcms6ZGF0YS1bc3RhdGU9YWN0aXZlXTp0ZXh0LWZvcmVncm91bmQgZm9jdXMtdmlzaWJsZTpib3JkZXItcmluZyBmb2N1cy12aXNpYmxlOnJpbmctcmluZy81MCBmb2N1cy12aXNpYmxlOm91dGxpbmUtcmluZyBkYXJrOmRhdGEtW3N0YXRlPWFjdGl2ZV06Ym9yZGVyLWlucHV0IGRhcms6ZGF0YS1bc3RhdGU9YWN0aXZlXTpiZy1pbnB1dC8zMCB0ZXh0LWZvcmVncm91bmQgZGFyazp0ZXh0LW11dGVkLWZvcmVncm91bmQgaW5saW5lLWZsZXggaC1bY2FsYygxMDAlLTFweCldIGZsZXgtMSBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTEuNSByb3VuZGVkLW1kIGJvcmRlciBib3JkZXItdHJhbnNwYXJlbnQgcHgtMiBweS0xIHRleHQtc20gZm9udC1tZWRpdW0gd2hpdGVzcGFjZS1ub3dyYXAgdHJhbnNpdGlvbi1bY29sb3IsYm94LXNoYWRvd10gZm9jdXMtdmlzaWJsZTpyaW5nLVszcHhdIGZvY3VzLXZpc2libGU6b3V0bGluZS0xIGRpc2FibGVkOnBvaW50ZXItZXZlbnRzLW5vbmUgZGlzYWJsZWQ6b3BhY2l0eS01MCBkYXRhLVtzdGF0ZT1hY3RpdmVdOnNoYWRvdy1zbSBbJl9zdmddOnBvaW50ZXItZXZlbnRzLW5vbmUgWyZfc3ZnXTpzaHJpbmstMCBbJl9zdmc6bm90KFtjbGFzcyo9J3NpemUtJ10pXTpzaXplLTRcIixcbiAgICAgICAgY2xhc3NOYW1lXG4gICAgICApfVxuICAgICAgey4uLnByb3BzfVxuICAgIC8+XG4gIClcbn1cblxuZnVuY3Rpb24gVGFic0NvbnRlbnQoe1xuICBjbGFzc05hbWUsXG4gIC4uLnByb3BzXG59OiBSZWFjdC5Db21wb25lbnRQcm9wczx0eXBlb2YgVGFic1ByaW1pdGl2ZS5Db250ZW50Pikge1xuICByZXR1cm4gKFxuICAgIDxUYWJzUHJpbWl0aXZlLkNvbnRlbnRcbiAgICAgIGRhdGEtc2xvdD1cInRhYnMtY29udGVudFwiXG4gICAgICBjbGFzc05hbWU9e2NuKCdmbGV4LTEgb3V0bGluZS1ub25lJywgY2xhc3NOYW1lKX1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmV4cG9ydCB7IFRhYnMsIFRhYnNMaXN0LCBUYWJzVHJpZ2dlciwgVGFic0NvbnRlbnQgfVxuIiwKICAgICJpbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCAqIGFzIFRvb2x0aXBQcmltaXRpdmUgZnJvbSAnQHJhZGl4LXVpL3JlYWN0LXRvb2x0aXAnXG5cbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmZ1bmN0aW9uIFRvb2x0aXBQcm92aWRlcih7XG4gIGRlbGF5RHVyYXRpb24gPSAwLFxuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFRvb2x0aXBQcmltaXRpdmUuUHJvdmlkZXI+KSB7XG4gIHJldHVybiAoXG4gICAgPFRvb2x0aXBQcmltaXRpdmUuUHJvdmlkZXJcbiAgICAgIGRhdGEtc2xvdD1cInRvb2x0aXAtcHJvdmlkZXJcIlxuICAgICAgZGVsYXlEdXJhdGlvbj17ZGVsYXlEdXJhdGlvbn1cbiAgICAgIHsuLi5wcm9wc31cbiAgICAvPlxuICApXG59XG5cbmZ1bmN0aW9uIFRvb2x0aXAoe1xuICAuLi5wcm9wc1xufTogUmVhY3QuQ29tcG9uZW50UHJvcHM8dHlwZW9mIFRvb2x0aXBQcmltaXRpdmUuUm9vdD4pIHtcbiAgcmV0dXJuIChcbiAgICA8VG9vbHRpcFByb3ZpZGVyPlxuICAgICAgPFRvb2x0aXBQcmltaXRpdmUuUm9vdCBkYXRhLXNsb3Q9XCJ0b29sdGlwXCIgey4uLnByb3BzfSAvPlxuICAgIDwvVG9vbHRpcFByb3ZpZGVyPlxuICApXG59XG5cbmZ1bmN0aW9uIFRvb2x0aXBUcmlnZ2VyKHtcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBUb29sdGlwUHJpbWl0aXZlLlRyaWdnZXI+KSB7XG4gIHJldHVybiA8VG9vbHRpcFByaW1pdGl2ZS5UcmlnZ2VyIGRhdGEtc2xvdD1cInRvb2x0aXAtdHJpZ2dlclwiIHsuLi5wcm9wc30gLz5cbn1cblxuZnVuY3Rpb24gVG9vbHRpcENvbnRlbnQoe1xuICBjbGFzc05hbWUsXG4gIHNpZGVPZmZzZXQgPSAwLFxuICBjaGlsZHJlbixcbiAgLi4ucHJvcHNcbn06IFJlYWN0LkNvbXBvbmVudFByb3BzPHR5cGVvZiBUb29sdGlwUHJpbWl0aXZlLkNvbnRlbnQ+KSB7XG4gIHJldHVybiAoXG4gICAgPFRvb2x0aXBQcmltaXRpdmUuUG9ydGFsPlxuICAgICAgPFRvb2x0aXBQcmltaXRpdmUuQ29udGVudFxuICAgICAgICBkYXRhLXNsb3Q9XCJ0b29sdGlwLWNvbnRlbnRcIlxuICAgICAgICBzaWRlT2Zmc2V0PXtzaWRlT2Zmc2V0fVxuICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGFuaW1hdGUtaW4gZmFkZS1pbi0wIHpvb20taW4tOTUgZGF0YS1bc3RhdGU9Y2xvc2VkXTphbmltYXRlLW91dCBkYXRhLVtzdGF0ZT1jbG9zZWRdOmZhZGUtb3V0LTAgZGF0YS1bc3RhdGU9Y2xvc2VkXTp6b29tLW91dC05NSBkYXRhLVtzaWRlPWJvdHRvbV06c2xpZGUtaW4tZnJvbS10b3AtMiBkYXRhLVtzaWRlPWxlZnRdOnNsaWRlLWluLWZyb20tcmlnaHQtMiBkYXRhLVtzaWRlPXJpZ2h0XTpzbGlkZS1pbi1mcm9tLWxlZnQtMiBkYXRhLVtzaWRlPXRvcF06c2xpZGUtaW4tZnJvbS1ib3R0b20tMiB6LTUwIHctZml0IG9yaWdpbi0oLS1yYWRpeC10b29sdGlwLWNvbnRlbnQtdHJhbnNmb3JtLW9yaWdpbikgcm91bmRlZC1tZCBweC0zIHB5LTEuNSB0ZXh0LXhzIHRleHQtYmFsYW5jZScsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICAgIHsuLi5wcm9wc31cbiAgICAgID5cbiAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8VG9vbHRpcFByaW1pdGl2ZS5BcnJvdyBjbGFzc05hbWU9XCJiZy1wcmltYXJ5IGZpbGwtcHJpbWFyeSB6LTUwIHNpemUtMi41IHRyYW5zbGF0ZS15LVtjYWxjKC01MCVfLV8ycHgpXSByb3RhdGUtNDUgcm91bmRlZC1bMnB4XVwiIC8+XG4gICAgICA8L1Rvb2x0aXBQcmltaXRpdmUuQ29udGVudD5cbiAgICA8L1Rvb2x0aXBQcmltaXRpdmUuUG9ydGFsPlxuICApXG59XG5cbmV4cG9ydCB7IFRvb2x0aXAsIFRvb2x0aXBUcmlnZ2VyLCBUb29sdGlwQ29udGVudCwgVG9vbHRpcFByb3ZpZGVyIH1cbiIsCiAgICAiaW1wb3J0IHtcbiAgRGlhbG9nLFxuICBEaWFsb2dDb250ZW50LFxuICBEaWFsb2dIZWFkZXIsXG4gIERpYWxvZ1RpdGxlLFxufSBmcm9tICdAL2NvbXBvbmVudHMvdWknXG5pbXBvcnQgUmVhY3QsIHsgdXNlSW1wZXJhdGl2ZUhhbmRsZSwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IERyYWdnYWJsZUV2ZW50IH0gZnJvbSAnQC9mZWF0dXJlcy9kcmFnZ2FibGUtZXZlbnQvZHJhZ2dhYmxlLWV2ZW50J1xuaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgdHlwZSB7IFNlbGVjdGVkRGF5RXZlbnRzIH0gZnJvbSAnLi4vdHlwZXMnXG5cbmludGVyZmFjZSBBbGxFdmVudERpYWxvZ1Byb3BzIHtcbiAgcmVmOiBSZWFjdC5SZWY8e1xuICAgIG9wZW46ICgpID0+IHZvaWRcbiAgICBjbG9zZTogKCkgPT4gdm9pZFxuICAgIHNldFNlbGVjdGVkRGF5RXZlbnRzOiAoZGF5RXZlbnRzOiBTZWxlY3RlZERheUV2ZW50cykgPT4gdm9pZFxuICB9PlxufVxuXG5leHBvcnQgY29uc3QgQWxsRXZlbnREaWFsb2c6IFJlYWN0LkZDPEFsbEV2ZW50RGlhbG9nUHJvcHM+ID0gKHsgcmVmIH0pID0+IHtcbiAgY29uc3QgW2RpYWxvZ09wZW4sIHNldERpYWxvZ09wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFtzZWxlY3RlZERheUV2ZW50cywgc2V0U2VsZWN0ZWREYXlFdmVudHNdID1cbiAgICB1c2VTdGF0ZTxTZWxlY3RlZERheUV2ZW50cyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHsgY3VycmVudERhdGUsIGZpcnN0RGF5T2ZXZWVrIH0gPSB1c2VDYWxlbmRhckNvbnRleHQoKVxuXG4gIHVzZUltcGVyYXRpdmVIYW5kbGUocmVmLCAoKSA9PiAoe1xuICAgIG9wZW46ICgpID0+IHNldERpYWxvZ09wZW4odHJ1ZSksXG4gICAgY2xvc2U6ICgpID0+IHNldERpYWxvZ09wZW4oZmFsc2UpLFxuICAgIHNldFNlbGVjdGVkRGF5RXZlbnRzOiAoZGF5RXZlbnRzOiBTZWxlY3RlZERheUV2ZW50cykgPT5cbiAgICAgIHNldFNlbGVjdGVkRGF5RXZlbnRzKGRheUV2ZW50cyksXG4gIH0pKVxuXG4gIC8vIEdldCBzdGFydCBkYXRlIGZvciB0aGUgY3VycmVudCBtb250aCB2aWV3IGJhc2VkIG9uIGZpcnN0RGF5T2ZXZWVrXG4gIGNvbnN0IGZpcnN0RGF5T2ZNb250aCA9IGN1cnJlbnREYXRlLnN0YXJ0T2YoJ21vbnRoJylcblxuICAvLyBDYWxjdWxhdGUgdGhlIGZpcnN0IGRheSBvZiB0aGUgY2FsZW5kYXIgZ3JpZCBjb3JyZWN0bHlcbiAgLy8gRmluZCB0aGUgZmlyc3QgZGF5IG9mIHdlZWsgKGUuZy4gU3VuZGF5IG9yIE1vbmRheSkgdGhhdCBjb21lcyBiZWZvcmUgb3Igb24gdGhlIGZpcnN0IGRheSBvZiB0aGUgbW9udGhcbiAgbGV0IGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyID0gZmlyc3REYXlPZk1vbnRoLmNsb25lKClcbiAgd2hpbGUgKGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyLmRheSgpICE9PSBmaXJzdERheU9mV2Vlaykge1xuICAgIGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyID0gYWRqdXN0ZWRGaXJzdERheU9mQ2FsZW5kYXIuc3VidHJhY3QoMSwgJ2RheScpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxEaWFsb2cgb3Blbj17ZGlhbG9nT3Blbn0gb25PcGVuQ2hhbmdlPXtzZXREaWFsb2dPcGVufT5cbiAgICAgIDxEaWFsb2dDb250ZW50IGNsYXNzTmFtZT1cIm1heC1oLVs4MHZoXSBtYXgtdy1tZCBvdmVyZmxvdy15LWF1dG9cIj5cbiAgICAgICAgPERpYWxvZ0hlYWRlcj5cbiAgICAgICAgICA8RGlhbG9nVGl0bGU+XG4gICAgICAgICAgICB7c2VsZWN0ZWREYXlFdmVudHMgJiYgc2VsZWN0ZWREYXlFdmVudHMuZGF5LmZvcm1hdCgnTU1NTSBELCBZWVlZJyl9XG4gICAgICAgICAgPC9EaWFsb2dUaXRsZT5cbiAgICAgICAgPC9EaWFsb2dIZWFkZXI+XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXQtNCBzcGFjZS15LTNcIj5cbiAgICAgICAgICB7c2VsZWN0ZWREYXlFdmVudHMgJiZcbiAgICAgICAgICAgIHNlbGVjdGVkRGF5RXZlbnRzLmV2ZW50cy5tYXAoKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPERyYWdnYWJsZUV2ZW50XG4gICAgICAgICAgICAgICAgICBlbGVtZW50SWQ9e2V2ZW50LmlkfSAvLyBVc2UgZXZlbnQgSUQgZm9yIHVuaXF1ZSBpZGVudGlmaWNhdGlvblxuICAgICAgICAgICAgICAgICAga2V5PXtldmVudC5pZH1cbiAgICAgICAgICAgICAgICAgIGV2ZW50PXtldmVudH1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIG15LTEgaC1bMzBweF1cIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0pfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvRGlhbG9nQ29udGVudD5cbiAgICA8L0RpYWxvZz5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgdHlwZSB7IENhbGVuZGFyRXZlbnQgfSBmcm9tICdAL2NvbXBvbmVudHMvdHlwZXMnXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5pbXBvcnQgeyB1c2VEcmFnZ2FibGUgfSBmcm9tICdAZG5kLWtpdC9jb3JlJ1xuaW1wb3J0IHsgQW5pbWF0ZVByZXNlbmNlLCBtb3Rpb24gfSBmcm9tICdtb3Rpb24vcmVhY3QnXG5pbXBvcnQgdHlwZSB7IENTU1Byb3BlcnRpZXMgfSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IG1lbW8gfSBmcm9tICdyZWFjdCdcblxuZnVuY3Rpb24gRHJhZ2dhYmxlRXZlbnRVbm1lbW9pemVkKHtcbiAgZWxlbWVudElkLFxuICBldmVudCxcbiAgY2xhc3NOYW1lLFxuICBzdHlsZSxcbiAgZGlzYWJsZURyYWcgPSBmYWxzZSxcbn06IHtcbiAgZWxlbWVudElkOiBzdHJpbmdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG4gIHN0eWxlPzogQ1NTUHJvcGVydGllc1xuICBldmVudDogQ2FsZW5kYXJFdmVudFxuICBkaXNhYmxlRHJhZz86IGJvb2xlYW5cbn0pIHtcbiAgY29uc3QgeyBvbkV2ZW50Q2xpY2ssIHJlbmRlckV2ZW50LCBkaXNhYmxlRXZlbnRDbGljaywgZGlzYWJsZURyYWdBbmREcm9wIH0gPVxuICAgIHVzZUNhbGVuZGFyQ29udGV4dCgpXG4gIGNvbnN0IHsgYXR0cmlidXRlcywgbGlzdGVuZXJzLCBzZXROb2RlUmVmLCBpc0RyYWdnaW5nIH0gPSB1c2VEcmFnZ2FibGUoe1xuICAgIGlkOiBlbGVtZW50SWQsXG4gICAgZGF0YToge1xuICAgICAgZXZlbnQsXG4gICAgICB0eXBlOiAnY2FsZW5kYXItZXZlbnQnLFxuICAgIH0sXG4gICAgZGlzYWJsZWQ6IGRpc2FibGVEcmFnIHx8IGRpc2FibGVEcmFnQW5kRHJvcCxcbiAgfSlcblxuICAvLyBEZWZhdWx0IGV2ZW50IGNvbnRlbnQgdG8gcmVuZGVyIGlmIGN1c3RvbSByZW5kZXJFdmVudCBpcyBub3QgcHJvdmlkZWRcbiAgY29uc3QgRGVmYXVsdEV2ZW50Q29udGVudCA9ICgpID0+IChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICBldmVudC5iYWNrZ3JvdW5kQ29sb3IgfHwgJ2JnLWJsdWUtNTAwJyxcbiAgICAgICAgZXZlbnQuY29sb3IgfHwgJ3RleHQtd2hpdGUnLFxuICAgICAgICAnaC1mdWxsIHctZnVsbCBweC0xIGJvcmRlci1bMS41cHhdIGJvcmRlci1jYXJkIHJvdW5kZWQtbWQgdGV4dC1sZWZ0IG92ZXJmbG93LWNsaXAnXG4gICAgICApfVxuICAgICAgc3R5bGU9e3sgYmFja2dyb3VuZENvbG9yOiBldmVudC5iYWNrZ3JvdW5kQ29sb3IsIGNvbG9yOiBldmVudC5jb2xvciB9fVxuICAgID5cbiAgICAgIDxwIGNsYXNzTmFtZT1cInRleHQtWzEwcHhdIGZvbnQtc2VtaWJvbGQgc206dGV4dC14cyBtdC0wLjVcIj5cbiAgICAgICAge2V2ZW50LnRpdGxlfVxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuICApXG5cbiAgcmV0dXJuIChcbiAgICA8QW5pbWF0ZVByZXNlbmNlIG1vZGU9XCJ3YWl0XCI+XG4gICAgICA8bW90aW9uLmRpdlxuICAgICAgICBrZXk9e2VsZW1lbnRJZH1cbiAgICAgICAgcmVmPXtzZXROb2RlUmVmfVxuICAgICAgICB7Li4uYXR0cmlidXRlc31cbiAgICAgICAgey4uLmxpc3RlbmVyc31cbiAgICAgICAgaW5pdGlhbD17eyBvcGFjaXR5OiAwLCB5OiAtNTAgfX1cbiAgICAgICAgYW5pbWF0ZT17eyBvcGFjaXR5OiAxLCB5OiAwIH19XG4gICAgICAgIGV4aXQ9e3sgb3BhY2l0eTogMCwgeTogLTUwIH19XG4gICAgICAgIGxheW91dFxuICAgICAgICBsYXlvdXRJZD17ZWxlbWVudElkfVxuICAgICAgICB0cmFuc2l0aW9uPXt7IGR1cmF0aW9uOiAwLjQsIGVhc2U6ICdlYXNlSW5PdXQnIH19XG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ3RydW5jYXRlIGgtZnVsbCB3LWZ1bGwnLFxuICAgICAgICAgIGRpc2FibGVEcmFnIHx8IGRpc2FibGVEcmFnQW5kRHJvcFxuICAgICAgICAgICAgPyBkaXNhYmxlRXZlbnRDbGlja1xuICAgICAgICAgICAgICA/ICdjdXJzb3ItZGVmYXVsdCdcbiAgICAgICAgICAgICAgOiAnY3Vyc29yLXBvaW50ZXInXG4gICAgICAgICAgICA6ICdjdXJzb3ItZ3JhYicsXG4gICAgICAgICAgaXNEcmFnZ2luZyAmJlxuICAgICAgICAgICAgIShkaXNhYmxlRHJhZyB8fCBkaXNhYmxlRHJhZ0FuZERyb3ApICYmXG4gICAgICAgICAgICAnY3Vyc29yLWdyYWJiaW5nIHNoYWRvdy1sZycsXG4gICAgICAgICAgY2xhc3NOYW1lXG4gICAgICAgICl9XG4gICAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG4gICAgICAgICAgb25FdmVudENsaWNrKGV2ZW50KVxuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICB7LyogVXNlIGN1c3RvbSByZW5kZXJFdmVudCBmcm9tIGNvbnRleHQgaWYgYXZhaWxhYmxlLCBvdGhlcndpc2UgdXNlIGRlZmF1bHQgKi99XG4gICAgICAgIHtyZW5kZXJFdmVudCA/IHJlbmRlckV2ZW50KGV2ZW50KSA6IDxEZWZhdWx0RXZlbnRDb250ZW50IC8+fVxuICAgICAgPC9tb3Rpb24uZGl2PlxuICAgIDwvQW5pbWF0ZVByZXNlbmNlPlxuICApXG59XG5cbmV4cG9ydCBjb25zdCBEcmFnZ2FibGVFdmVudCA9IG1lbW8oXG4gIERyYWdnYWJsZUV2ZW50VW5tZW1vaXplZCxcbiAgKHByZXZQcm9wcywgbmV4dFByb3BzKSA9PiB7XG4gICAgLy8gQ29tcGFyZSB0aGUgZXNzZW50aWFsIHByb3BzIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmUtcmVuZGVyc1xuICAgIHJldHVybiAoXG4gICAgICBwcmV2UHJvcHMuZWxlbWVudElkID09PSBuZXh0UHJvcHMuZWxlbWVudElkICYmXG4gICAgICBwcmV2UHJvcHMuZGlzYWJsZURyYWcgPT09IG5leHRQcm9wcy5kaXNhYmxlRHJhZyAmJlxuICAgICAgcHJldlByb3BzLmNsYXNzTmFtZSA9PT0gbmV4dFByb3BzLmNsYXNzTmFtZSAmJlxuICAgICAgcHJldlByb3BzLmV2ZW50LmlkID09PSBuZXh0UHJvcHMuZXZlbnQuaWRcbiAgICApXG4gIH1cbilcbiIsCiAgICAiaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB7IERyb3BwYWJsZUNlbGwgfSBmcm9tICdAL2ZlYXR1cmVzL2Ryb3BwYWJsZS1jZWxsL2Ryb3BwYWJsZS1jZWxsJ1xuaW1wb3J0IHsgQWxsRXZlbnREaWFsb2cgfSBmcm9tICcuL2FsbC1ldmVudHMtZGlhbG9nJ1xuaW1wb3J0IHR5cGUgeyBTZWxlY3RlZERheUV2ZW50cyB9IGZyb20gJy4uL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSAnQC9jb21wb25lbnRzL3R5cGVzJ1xuXG5pbnRlcmZhY2UgRGF5Q2VsbFByb3BzIHtcbiAgaW5kZXg6IG51bWJlciAvLyBJbmRleCBvZiB0aGUgZGF5IGluIHRoZSB3ZWVrICgwLTYpXG4gIGRheTogZGF5anMuRGF5anNcbiAgZGF5TWF4RXZlbnRzPzogbnVtYmVyXG4gIGNsYXNzTmFtZT86IHN0cmluZyAvLyBPcHRpb25hbCBjbGFzc05hbWUgZm9yIGN1c3RvbSBzdHlsaW5nXG59XG5cbmV4cG9ydCBjb25zdCBEYXlDZWxsOiBSZWFjdC5GQzxEYXlDZWxsUHJvcHM+ID0gKHtcbiAgaW5kZXgsXG4gIGRheSxcbiAgY2xhc3NOYW1lID0gJycsXG59KSA9PiB7XG4gIGNvbnN0IGFsbEV2ZW50c0RpYWxvZ1JlZiA9IFJlYWN0LnVzZVJlZjx7XG4gICAgb3BlbjogKCkgPT4gdm9pZFxuICAgIGNsb3NlOiAoKSA9PiB2b2lkXG4gICAgc2V0U2VsZWN0ZWREYXlFdmVudHM6IChkYXlFdmVudHM6IFNlbGVjdGVkRGF5RXZlbnRzKSA9PiB2b2lkXG4gIH0+KG51bGwpXG4gIGNvbnN0IHtcbiAgICBldmVudHMsXG4gICAgY3VycmVudERhdGUsXG4gICAgZmlyc3REYXlPZldlZWssXG4gICAgZGF5TWF4RXZlbnRzID0gMCxcbiAgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG4gIGNvbnN0IHRvZGF5RXZlbnRzID0gZXZlbnRzLmZpbHRlcigoZSkgPT4ge1xuICAgIGNvbnN0IHN0YXJ0c1RvZGF5ID0gZS5zdGFydC5pc1NhbWUoZGF5LCAnZGF5JylcbiAgICBjb25zdCBlbmRzVG9kYXkgPSBlLmVuZC5pc1NhbWUoZGF5LCAnZGF5JylcbiAgICBjb25zdCBzcGFuc1RvZGF5ID0gZS5zdGFydC5pc0JlZm9yZShkYXksICdkYXknKSAmJiBlLmVuZC5pc0FmdGVyKGRheSwgJ2RheScpXG5cbiAgICByZXR1cm4gc3RhcnRzVG9kYXkgfHwgZW5kc1RvZGF5IHx8IHNwYW5zVG9kYXlcbiAgfSlcblxuICAvLyBHZXQgc3RhcnQgZGF0ZSBmb3IgdGhlIGN1cnJlbnQgbW9udGggdmlldyBiYXNlZCBvbiBmaXJzdERheU9mV2Vla1xuICBjb25zdCBmaXJzdERheU9mTW9udGggPSBjdXJyZW50RGF0ZS5zdGFydE9mKCdtb250aCcpXG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBmaXJzdCBkYXkgb2YgdGhlIGNhbGVuZGFyIGdyaWQgY29ycmVjdGx5XG4gIC8vIEZpbmQgdGhlIGZpcnN0IGRheSBvZiB3ZWVrIChlLmcuIFN1bmRheSBvciBNb25kYXkpIHRoYXQgY29tZXMgYmVmb3JlIG9yIG9uIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoXG4gIGxldCBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhciA9IGZpcnN0RGF5T2ZNb250aC5jbG9uZSgpXG4gIHdoaWxlIChhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhci5kYXkoKSAhPT0gZmlyc3REYXlPZldlZWspIHtcbiAgICBhZGp1c3RlZEZpcnN0RGF5T2ZDYWxlbmRhciA9IGFkanVzdGVkRmlyc3REYXlPZkNhbGVuZGFyLnN1YnRyYWN0KDEsICdkYXknKVxuICB9XG5cbiAgLy8gSGFuZGxlciBmb3Igc2hvd2luZyBhbGwgZXZlbnRzIGluIGEgZGlhbG9nXG4gIGNvbnN0IHNob3dBbGxFdmVudHMgPSAoZGF5OiBkYXlqcy5EYXlqcywgZXZlbnRzOiBDYWxlbmRhckV2ZW50W10pID0+IHtcbiAgICBhbGxFdmVudHNEaWFsb2dSZWYuY3VycmVudD8uc2V0U2VsZWN0ZWREYXlFdmVudHMoe1xuICAgICAgZGF5LFxuICAgICAgZXZlbnRzLFxuICAgIH0pXG4gICAgYWxsRXZlbnRzRGlhbG9nUmVmLmN1cnJlbnQ/Lm9wZW4oKVxuICB9XG5cbiAgY29uc3QgaXNUb2RheSA9IGRheS5pc1NhbWUoZGF5anMoKSwgJ2RheScpXG4gIGNvbnN0IGlzQ3VycmVudE1vbnRoID0gZGF5Lm1vbnRoKCkgPT09IGN1cnJlbnREYXRlLm1vbnRoKClcbiAgY29uc3QgaXNMYXN0Q29sdW1uID0gaW5kZXggPT09IDYgLy8gU2F0dXJkYXkgaXMgdGhlIGxhc3QgY29sdW1uIGluIGEgd2Vla1xuXG4gIGNvbnN0IGhpZGRlbkV2ZW50c0NvdW50ID0gdG9kYXlFdmVudHMubGVuZ3RoIC0gZGF5TWF4RXZlbnRzXG4gIGNvbnN0IGhhc0hpZGRlbkV2ZW50cyA9IGhpZGRlbkV2ZW50c0NvdW50ID4gMFxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIDxEcm9wcGFibGVDZWxsXG4gICAgICAgIGlkPXtgZGF5LWNlbGwtJHtkYXkuZm9ybWF0KCdZWVlZLU1NLUREJyl9YH1cbiAgICAgICAgdHlwZT1cImRheS1jZWxsXCJcbiAgICAgICAgZGF0YS10ZXN0aWQ9e2BkYXktY2VsbC0ke2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgICBkYXRlPXtkYXl9XG4gICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgJ2N1cnNvci1wb2ludGVyIG92ZXJmbG93LWNsaXAgcC0xIGhvdmVyOmJnLWFjY2VudCcsXG4gICAgICAgICAgIWlzQ3VycmVudE1vbnRoICYmICdiZy1zZWNvbmRhcnkgdGV4dC1tdXRlZC1mb3JlZ3JvdW5kJyxcbiAgICAgICAgICBpc0xhc3RDb2x1bW4gJiYgJ2JvcmRlci1yLTAnLFxuICAgICAgICAgIGNsYXNzTmFtZVxuICAgICAgICApfVxuICAgICAgPlxuICAgICAgICB7LyogQWJzb2x1dGVseSBwb3NpdGlvbmVkIG11bHRpLWRheSBiYXJzIChHb29nbGUgQ2FsZW5kYXIgc3R5bGUpICovfVxuXG4gICAgICAgIHsvKiBTaW5nbGUtZGF5IGV2ZW50cyBjb250YWluZXIgcG9zaXRpb25lZCBiZWxvdyBtdWx0aS1kYXkgZXZlbnRzICovfVxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgZ2FwLTFcIj5cbiAgICAgICAgICB7LyogRGF5IG51bWJlciAqL31cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAnZmxleCBoLTUgdy01IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLWZ1bGwgdGV4dC14cyBzbTpoLTYgc206dy02IHNtOnRleHQtc20nLFxuICAgICAgICAgICAgICBpc1RvZGF5ICYmICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIGZvbnQtbWVkaXVtJ1xuICAgICAgICAgICAgKX1cbiAgICAgICAgICA+XG4gICAgICAgICAgICB7ZGF5LmRhdGUoKX1cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIHsvKiBSZW5kZXIgcGxhY2Vob2xkZXJzIGZvciBldmVudHMgdGhhdCBvY2N1ciB0b2RheSBzbyB0aGF0IHRoZSBjZWxsIGhlaWdodCBpcyBhY2NvcmRpbmcgdG8gZGF5TWF4RXZlbnRzLiAqL31cbiAgICAgICAgICB7dG9kYXlFdmVudHMuc2xpY2UoMCwgZGF5TWF4RXZlbnRzKS5tYXAoKGV2ZW50LCByb3dJbmRleCkgPT4gKFxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBrZXk9e2BlbXB0eS0ke3Jvd0luZGV4fWB9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtWzIwcHhdIHctZnVsbFwiXG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtldmVudD8udGl0bGV9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICkpfVxuXG4gICAgICAgICAgey8qIFNob3cgbW9yZSBldmVudHMgYnV0dG9uIHdpdGggYWNjdXJhdGUgY291bnQgKi99XG4gICAgICAgICAge2hhc0hpZGRlbkV2ZW50cyAmJiAoXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInRleHQtbXV0ZWQtZm9yZWdyb3VuZCBob3Zlcjp0ZXh0LWZvcmVncm91bmQgY3Vyc29yLXBvaW50ZXIgdGV4dC1bMTBweF0gd2hpdGVzcGFjZS1ub3dyYXAgc206dGV4dC14cyBtdC0xXCJcbiAgICAgICAgICAgICAgb25DbGljaz17KGUpID0+IHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpXG5cbiAgICAgICAgICAgICAgICBzaG93QWxsRXZlbnRzKGRheSwgdG9kYXlFdmVudHMpXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICt7aGlkZGVuRXZlbnRzQ291bnR9IG1vcmVcbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9Ecm9wcGFibGVDZWxsPlxuXG4gICAgICB7LyogRGlhbG9nIGZvciBzaG93aW5nIGFsbCBldmVudHMgKi99XG4gICAgICA8QWxsRXZlbnREaWFsb2cgcmVmPXthbGxFdmVudHNEaWFsb2dSZWZ9IC8+XG4gICAgPC8+XG4gIClcbn1cbiIsCiAgICAiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlRHJvcHBhYmxlIH0gZnJvbSAnQGRuZC1raXQvY29yZSdcbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5pbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCB0eXBlIGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcblxuaW50ZXJmYWNlIERyb3BwYWJsZUNlbGxQcm9wcyB7XG4gIGlkOiBzdHJpbmdcbiAgdHlwZTogJ2RheS1jZWxsJyB8ICd0aW1lLWNlbGwnXG4gIGRhdGU6IGRheWpzLkRheWpzXG4gIGhvdXI/OiBudW1iZXJcbiAgbWludXRlPzogbnVtYmVyXG4gIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlXG4gIGNsYXNzTmFtZT86IHN0cmluZ1xuICBzdHlsZT86IFJlYWN0LkNTU1Byb3BlcnRpZXNcbiAgJ2RhdGEtdGVzdGlkJz86IHN0cmluZ1xufVxuXG5leHBvcnQgZnVuY3Rpb24gRHJvcHBhYmxlQ2VsbCh7XG4gIGlkLFxuICB0eXBlLFxuICBkYXRlLFxuICBob3VyLFxuICBtaW51dGUsXG4gIGNoaWxkcmVuLFxuICBjbGFzc05hbWUsXG4gIHN0eWxlLFxuICAnZGF0YS10ZXN0aWQnOiBkYXRhVGVzdElkLFxufTogRHJvcHBhYmxlQ2VsbFByb3BzKSB7XG4gIGNvbnN0IHsgb25DZWxsQ2xpY2ssIGRpc2FibGVEcmFnQW5kRHJvcCwgZGlzYWJsZUNlbGxDbGljayB9ID1cbiAgICB1c2VDYWxlbmRhckNvbnRleHQoKVxuICBjb25zdCB7IGlzT3Zlciwgc2V0Tm9kZVJlZiB9ID0gdXNlRHJvcHBhYmxlKHtcbiAgICBpZCxcbiAgICBkYXRhOiB7XG4gICAgICB0eXBlLFxuICAgICAgZGF0ZSxcbiAgICAgIGhvdXIsXG4gICAgICBtaW51dGUsXG4gICAgfSxcbiAgICBkaXNhYmxlZDogZGlzYWJsZURyYWdBbmREcm9wLFxuICB9KVxuXG4gIGNvbnN0IGhhbmRsZUNlbGxDbGljayA9IChlOiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKVxuICAgIGlmIChkaXNhYmxlQ2VsbENsaWNrKSByZXR1cm5cblxuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IGRhdGUuaG91cihob3VyID8/IDApLm1pbnV0ZShtaW51dGUgPz8gMClcbiAgICBsZXQgZW5kRGF0ZSA9IHN0YXJ0RGF0ZS5jbG9uZSgpXG4gICAgaWYgKGhvdXIgIT09IHVuZGVmaW5lZCAmJiBtaW51dGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW5kRGF0ZSA9IGVuZERhdGUuaG91cihob3VyKS5taW51dGUobWludXRlICsgMTUpIC8vIGRheSB2aWV3IHRpbWUgc2xvdHMgYXJlIDE1IG1pbnV0ZXNcbiAgICB9IGVsc2UgaWYgKGhvdXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW5kRGF0ZSA9IGVuZERhdGUuaG91cihob3VyICsgMSkubWludXRlKDApIC8vIHdlZWsgdmlldyB0aW1lIHNsb3RzIGFyZSAxIGhvdXJcbiAgICB9IGVsc2Uge1xuICAgICAgZW5kRGF0ZSA9IGVuZERhdGUuaG91cigyMykubWludXRlKDU5KSAvLyBtb250aCB2aWV3IGZ1bGwgZGF5XG4gICAgfVxuXG4gICAgb25DZWxsQ2xpY2soc3RhcnREYXRlLCBlbmREYXRlKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICByZWY9e3NldE5vZGVSZWZ9XG4gICAgICBkYXRhLXRlc3RpZD17ZGF0YVRlc3RJZH1cbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgIGNsYXNzTmFtZSxcbiAgICAgICAgaXNPdmVyICYmICFkaXNhYmxlRHJhZ0FuZERyb3AgJiYgJ2JnLWFjY2VudCcsXG4gICAgICAgIGRpc2FibGVDZWxsQ2xpY2sgPyAnY3Vyc29yLWRlZmF1bHQnIDogJ2N1cnNvci1wb2ludGVyJ1xuICAgICAgKX1cbiAgICAgIG9uQ2xpY2s9e2hhbmRsZUNlbGxDbGlja31cbiAgICAgIHN0eWxlPXtzdHlsZX1cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsCiAgICAiaW1wb3J0IHsgQW5pbWF0ZVByZXNlbmNlLCBtb3Rpb24gfSBmcm9tICdtb3Rpb24vcmVhY3QnXG5pbXBvcnQgUmVhY3QsIHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcblxuZXhwb3J0IGNvbnN0IE1vbnRoSGVhZGVyOiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3Qge1xuICAgIGZpcnN0RGF5T2ZXZWVrLFxuICAgIGN1cnJlbnRMb2NhbGUsXG4gICAgc3RpY2t5Vmlld0hlYWRlcixcbiAgICB2aWV3SGVhZGVyQ2xhc3NOYW1lLFxuICB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICAvLyBSZW9yZGVyIHdlZWsgZGF5cyBiYXNlZCBvbiBmaXJzdERheU9mV2Vla1xuICBjb25zdCB3ZWVrRGF5cyA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIGNvbnN0IGRheXMgPSBkYXlqcy53ZWVrZGF5cygpLm1hcCgoZGF5KSA9PiBkYXkudG9Mb3dlckNhc2UoKSlcbiAgICBjb25zdCBzaG9ydERheXMgPSBkYXlqcy53ZWVrZGF5c1Nob3J0KCkubWFwKChkYXkpID0+IGRheS50b0xvd2VyQ2FzZSgpKVxuXG4gICAgLy8gUm90YXRlIHRoZSBhcnJheSBiYXNlZCBvbiBmaXJzdERheU9mV2Vla1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlyc3REYXlPZldlZWs7IGkrKykge1xuICAgICAgY29uc3QgZGF5VG9Nb3ZlID0gZGF5cy5zaGlmdCgpXG4gICAgICBjb25zdCBzaG9ydERheVRvTW92ZSA9IHNob3J0RGF5cy5zaGlmdCgpXG4gICAgICBpZiAoZGF5VG9Nb3ZlKSBkYXlzLnB1c2goZGF5VG9Nb3ZlKVxuICAgICAgaWYgKHNob3J0RGF5VG9Nb3ZlKSBzaG9ydERheXMucHVzaChzaG9ydERheVRvTW92ZSlcbiAgICB9XG5cbiAgICByZXR1cm4geyBkYXlzLCBzaG9ydERheXMgfVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHNcbiAgfSwgW2ZpcnN0RGF5T2ZXZWVrLCBjdXJyZW50TG9jYWxlXSlcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICdncmlkIGdyaWQtY29scy03IGJvcmRlci1iJyxcbiAgICAgICAgc3RpY2t5Vmlld0hlYWRlciAmJiAnc3RpY2t5IHRvcC0wIHotMTAwJyxcbiAgICAgICAgdmlld0hlYWRlckNsYXNzTmFtZVxuICAgICAgKX1cbiAgICAgIGRhdGEtdGVzdGlkPVwibW9udGgtaGVhZGVyXCJcbiAgICA+XG4gICAgICB7d2Vla0RheXMuZGF5cy5tYXAoKHdlZWtEYXksIGluZGV4KSA9PiAoXG4gICAgICAgIDxBbmltYXRlUHJlc2VuY2Uga2V5PXt3ZWVrRGF5fSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgIDxtb3Rpb24uZGl2XG4gICAgICAgICAgICBrZXk9e3dlZWtEYXl9XG4gICAgICAgICAgICBpbml0aWFsPXt7IG9wYWNpdHk6IDAsIHk6IC0xMCB9fVxuICAgICAgICAgICAgYW5pbWF0ZT17eyBvcGFjaXR5OiAxLCB5OiAwIH19XG4gICAgICAgICAgICBleGl0PXt7IG9wYWNpdHk6IDAsIHk6IC0xMCB9fVxuICAgICAgICAgICAgdHJhbnNpdGlvbj17e1xuICAgICAgICAgICAgICBkdXJhdGlvbjogMC4yNSxcbiAgICAgICAgICAgICAgZWFzZTogJ2Vhc2VJbk91dCcsXG4gICAgICAgICAgICAgIGRlbGF5OiBpbmRleCAqIDAuMDUsXG4gICAgICAgICAgICB9fVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwicHktMiB0ZXh0LWNlbnRlciBmb250LW1lZGl1bSBib3JkZXItciBmaXJzdDpib3JkZXItbFwiXG4gICAgICAgICAgICBkYXRhLXRlc3RpZD17YHdlZWtkYXktaGVhZGVyLSR7d2Vla0RheX1gfVxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiB0ZXh0LXNtIHNtOmlubGluZVwiPnt3ZWVrRGF5fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQteHMgc206aGlkZGVuXCI+XG4gICAgICAgICAgICAgIHt3ZWVrRGF5cy5zaG9ydERheXNbaW5kZXhdfVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvbW90aW9uLmRpdj5cbiAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICApKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwKICAgICJleHBvcnQgY29uc3QgR0FQX0JFVFdFRU5fRUxFTUVOVFMgPSAxIC8vIHB4IChnYXAtMSlcbmV4cG9ydCBjb25zdCBEQVlfTlVNQkVSX0hFSUdIVCA9IDI4IC8vIHB4IChoLTcpXG5leHBvcnQgY29uc3QgRVZFTlRfQkFSX0hFSUdIVCA9IDI0IC8vIHB4IChoLVsyNHB4XSlcbiIsCiAgICAiaW1wb3J0IHR5cGUgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSAnQC9jb21wb25lbnRzL3R5cGVzJ1xuaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IHsgRHJhZ2dhYmxlRXZlbnQgfSBmcm9tICdAL2ZlYXR1cmVzL2RyYWdnYWJsZS1ldmVudC9kcmFnZ2FibGUtZXZlbnQnXG5pbXBvcnQge1xuICBEQVlfTlVNQkVSX0hFSUdIVCxcbiAgRVZFTlRfQkFSX0hFSUdIVCxcbiAgR0FQX0JFVFdFRU5fRUxFTUVOVFMsXG59IGZyb20gJ0AvbGliL2NvbnN0YW50cydcblxuaW50ZXJmYWNlIFByb2Nlc3NlZEV2ZW50IGV4dGVuZHMgQ2FsZW5kYXJFdmVudCB7XG4gIGxlZnQ6IG51bWJlciAvLyBMZWZ0IHBvc2l0aW9uIGluIHBlcmNlbnRhZ2VcbiAgd2lkdGg6IG51bWJlciAvLyBXaWR0aCBpbiBwZXJjZW50YWdlXG4gIHRvcDogbnVtYmVyIC8vIFRvcCBwb3NpdGlvbiBpbiBwZXJjZW50YWdlXG4gIGhlaWdodDogbnVtYmVyIC8vIEhlaWdodCBpbiBwZXJjZW50YWdlXG4gIHBvc2l0aW9uOiBudW1iZXIgLy8gUG9zaXRpb24gaW4gdGhlIHJvdyAoMCBmb3IgZmlyc3QsIDEgZm9yIHNlY29uZCwgZXRjLilcbn1cblxuaW50ZXJmYWNlIFdlZWtFdmVudHNMYXllclByb3BzIHtcbiAgZGF5czogZGF5anMuRGF5anNbXVxufVxuXG5leHBvcnQgY29uc3QgV2Vla0V2ZW50c0xheWVyOiBSZWFjdC5GQzxXZWVrRXZlbnRzTGF5ZXJQcm9wcz4gPSAoeyBkYXlzIH0pID0+IHtcbiAgY29uc3QgeyBldmVudHMsIGRheU1heEV2ZW50cyB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICBjb25zdCB3ZWVrU3RhcnQgPSBkYXlzWzBdXG4gIGNvbnN0IHdlZWtFbmQgPSBkYXlzWzZdXG5cbiAgLy8gR2V0IGFsbCBldmVudHMgdGhhdCBpbnRlcnNlY3Qgd2l0aCB0aGlzIHdlZWtcbiAgY29uc3Qgd2Vla0V2ZW50cyA9IGV2ZW50cy5maWx0ZXIoKGUpID0+IHtcbiAgICBjb25zdCBzdGFydHNJbldlZWsgPVxuICAgICAgZS5zdGFydC5pc1NhbWVPckFmdGVyKHdlZWtTdGFydC5zdGFydE9mKCdkYXknKSkgJiZcbiAgICAgIGUuc3RhcnQuaXNTYW1lT3JCZWZvcmUod2Vla0VuZC5lbmRPZignZGF5JykpXG4gICAgY29uc3QgZW5kc0luV2VlayA9XG4gICAgICBlLmVuZC5pc1NhbWVPckFmdGVyKHdlZWtTdGFydC5zdGFydE9mKCdkYXknKSkgJiZcbiAgICAgIGUuZW5kLmlzU2FtZU9yQmVmb3JlKHdlZWtFbmQuZW5kT2YoJ2RheScpKVxuICAgIGNvbnN0IHNwYW5zV2VlayA9XG4gICAgICBlLnN0YXJ0LmlzQmVmb3JlKHdlZWtTdGFydC5zdGFydE9mKCdkYXknKSkgJiZcbiAgICAgIGUuZW5kLmlzQWZ0ZXIod2Vla0VuZC5lbmRPZignZGF5JykpXG4gICAgcmV0dXJuIHN0YXJ0c0luV2VlayB8fCBlbmRzSW5XZWVrIHx8IHNwYW5zV2Vla1xuICB9KVxuXG4gIC8vIFNlcGFyYXRlIG11bHRpLWRheSBhbmQgc2luZ2xlLWRheSBldmVudHNcbiAgY29uc3QgbXVsdGlEYXlFdmVudHMgPSB3ZWVrRXZlbnRzLmZpbHRlcihcbiAgICAoZSkgPT4gZS5lbmQuZGlmZihlLnN0YXJ0LCAnZGF5JykgPiAwXG4gIClcbiAgY29uc3Qgc2luZ2xlRGF5RXZlbnRzID0gd2Vla0V2ZW50cy5maWx0ZXIoXG4gICAgKGUpID0+IGUuZW5kLmRpZmYoZS5zdGFydCwgJ2RheScpID09PSAwXG4gIClcblxuICAvLyBTb3J0IG11bHRpLWRheSBldmVudHMgYnkgc3RhcnQgZGF0ZSwgdGhlbiBieSBkdXJhdGlvblxuICBjb25zdCBzb3J0ZWRNdWx0aURheSA9IFsuLi5tdWx0aURheUV2ZW50c10uc29ydCgoYSwgYikgPT4ge1xuICAgIGNvbnN0IHN0YXJ0RGlmZiA9IGEuc3RhcnQuZGlmZihiLnN0YXJ0KVxuICAgIGlmIChzdGFydERpZmYgIT09IDApIHJldHVybiBzdGFydERpZmZcbiAgICByZXR1cm4gYi5lbmQuZGlmZihiLnN0YXJ0KSAtIGEuZW5kLmRpZmYoYS5zdGFydCkgLy8gTG9uZ2VyIGV2ZW50cyBmaXJzdFxuICB9KVxuXG4gIC8vIFNvcnQgc2luZ2xlLWRheSBldmVudHMgYnkgc3RhcnQgdGltZVxuICBjb25zdCBzb3J0ZWRTaW5nbGVEYXkgPSBbLi4uc2luZ2xlRGF5RXZlbnRzXS5zb3J0KChhLCBiKSA9PlxuICAgIGEuc3RhcnQuZGlmZihiLnN0YXJ0KVxuICApXG5cbiAgLy8gQ3JlYXRlIDcgeCBkYXlNYXhFdmVudHMgZ3JpZCB3aXRoIGZsYWdzXG4gIGNvbnN0IGdyaWQ6IEFycmF5PEFycmF5PHsgdGFrZW46IGJvb2xlYW47IGV2ZW50OiBDYWxlbmRhckV2ZW50IHwgbnVsbCB9Pj4gPSBbXVxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBkYXlNYXhFdmVudHM7IHJvdysrKSB7XG4gICAgZ3JpZFtyb3ddID0gW11cbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCA3OyBjb2wrKykge1xuICAgICAgZ3JpZFtyb3ddW2NvbF0gPSB7IHRha2VuOiBmYWxzZSwgZXZlbnQ6IG51bGwgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGV2ZW50UG9zaXRpb25zOiBQcm9jZXNzZWRFdmVudFtdID0gW11cblxuICAvLyBTdGVwIDE6IEFzc2lnbiBwb3NpdGlvbnMgdG8gbXVsdGktZGF5IGV2ZW50cyBmaXJzdFxuICBmb3IgKGNvbnN0IGV2ZW50IG9mIHNvcnRlZE11bHRpRGF5KSB7XG4gICAgY29uc3QgZXZlbnRTdGFydCA9IGRheWpzLm1heChldmVudC5zdGFydC5zdGFydE9mKCdkYXknKSwgd2Vla1N0YXJ0KVxuICAgIGNvbnN0IGV2ZW50RW5kID0gZGF5anMubWluKGV2ZW50LmVuZC5zdGFydE9mKCdkYXknKSwgd2Vla0VuZClcbiAgICBjb25zdCBzdGFydENvbCA9IE1hdGgubWF4KDAsIGV2ZW50U3RhcnQuZGlmZih3ZWVrU3RhcnQsICdkYXknKSlcbiAgICBjb25zdCBlbmRDb2wgPSBNYXRoLm1pbig2LCBldmVudEVuZC5kaWZmKHdlZWtTdGFydCwgJ2RheScpKVxuXG4gICAgLy8gVHJ5IHRvIHBsYWNlIHRoZSBldmVudCBzdGFydGluZyBmcm9tIGl0cyBvcmlnaW5hbCBzdGFydCBjb2x1bW5cbiAgICBsZXQgcGxhY2VkU3VjY2Vzc2Z1bGx5ID0gZmFsc2VcblxuICAgIC8vIEZpcnN0IHRyeTogcGxhY2UgZnJvbSBvcmlnaW5hbCBzdGFydCBwb3NpdGlvblxuICAgIGxldCBhc3NpZ25lZFJvdyA9IC0xXG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgZGF5TWF4RXZlbnRzOyByb3crKykge1xuICAgICAgbGV0IGNhblBsYWNlID0gdHJ1ZVxuICAgICAgZm9yIChsZXQgY29sID0gc3RhcnRDb2w7IGNvbCA8PSBlbmRDb2w7IGNvbCsrKSB7XG4gICAgICAgIGlmIChncmlkW3Jvd11bY29sXS50YWtlbikge1xuICAgICAgICAgIGNhblBsYWNlID0gZmFsc2VcbiAgICAgICAgICBicmVha1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoY2FuUGxhY2UpIHtcbiAgICAgICAgYXNzaWduZWRSb3cgPSByb3dcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBmb3VuZCBhIHJvdywgYXNzaWduIHRoZSBldmVudCB0byBhbGwgaXRzIGNvbHVtbnNcbiAgICBpZiAoYXNzaWduZWRSb3cgIT09IC0xKSB7XG4gICAgICBmb3IgKGxldCBjb2wgPSBzdGFydENvbDsgY29sIDw9IGVuZENvbDsgY29sKyspIHtcbiAgICAgICAgZ3JpZFthc3NpZ25lZFJvd11bY29sXSA9IHsgdGFrZW46IHRydWUsIGV2ZW50IH1cbiAgICAgIH1cblxuICAgICAgLy8gQ3JlYXRlIHBvc2l0aW9uIGRhdGEgZm9yIHJlbmRlcmluZ1xuICAgICAgY29uc3Qgc3BhbkRheXMgPSBlbmRDb2wgLSBzdGFydENvbCArIDFcbiAgICAgIGV2ZW50UG9zaXRpb25zLnB1c2goe1xuICAgICAgICBsZWZ0OiAoc3RhcnRDb2wgLyA3KSAqIDEwMCxcbiAgICAgICAgd2lkdGg6IChzcGFuRGF5cyAvIDcpICogMTAwLFxuICAgICAgICB0b3A6XG4gICAgICAgICAgREFZX05VTUJFUl9IRUlHSFQgK1xuICAgICAgICAgIEdBUF9CRVRXRUVOX0VMRU1FTlRTICtcbiAgICAgICAgICBhc3NpZ25lZFJvdyAqIChFVkVOVF9CQVJfSEVJR0hUICsgR0FQX0JFVFdFRU5fRUxFTUVOVFMpLFxuICAgICAgICBoZWlnaHQ6IEVWRU5UX0JBUl9IRUlHSFQsXG4gICAgICAgIHBvc2l0aW9uOiBhc3NpZ25lZFJvdyxcbiAgICAgICAgLi4uZXZlbnQsXG4gICAgICB9KVxuICAgICAgcGxhY2VkU3VjY2Vzc2Z1bGx5ID0gdHJ1ZVxuICAgIH1cblxuICAgIC8vIElmIGNvdWxkbid0IHBsYWNlIGF0IG9yaWdpbmFsIHBvc2l0aW9uLCB0cnkgdHJ1bmNhdGVkIHZlcnNpb25zIHN0YXJ0aW5nIGZyb20gbGF0ZXIgZGF5c1xuICAgIGlmICghcGxhY2VkU3VjY2Vzc2Z1bGx5KSB7XG4gICAgICBmb3IgKFxuICAgICAgICBsZXQgdHJ5U3RhcnRDb2wgPSBzdGFydENvbCArIDE7XG4gICAgICAgIHRyeVN0YXJ0Q29sIDw9IGVuZENvbDtcbiAgICAgICAgdHJ5U3RhcnRDb2wrK1xuICAgICAgKSB7XG4gICAgICAgIC8vIFRyeSB0byBwbGFjZSB0aGUgdHJ1bmNhdGVkIGV2ZW50IHN0YXJ0aW5nIGZyb20gdGhpcyBjb2x1bW5cbiAgICAgICAgbGV0IHRydW5jYXRlZEFzc2lnbmVkUm93ID0gLTFcbiAgICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgZGF5TWF4RXZlbnRzOyByb3crKykge1xuICAgICAgICAgIGxldCBjYW5QbGFjZSA9IHRydWVcbiAgICAgICAgICBmb3IgKGxldCBjb2wgPSB0cnlTdGFydENvbDsgY29sIDw9IGVuZENvbDsgY29sKyspIHtcbiAgICAgICAgICAgIGlmIChncmlkW3Jvd11bY29sXS50YWtlbikge1xuICAgICAgICAgICAgICBjYW5QbGFjZSA9IGZhbHNlXG4gICAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjYW5QbGFjZSkge1xuICAgICAgICAgICAgdHJ1bmNhdGVkQXNzaWduZWRSb3cgPSByb3dcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgd2UgZm91bmQgYSByb3cgZm9yIHRoZSB0cnVuY2F0ZWQgdmVyc2lvbiwgcGxhY2UgaXRcbiAgICAgICAgaWYgKHRydW5jYXRlZEFzc2lnbmVkUm93ICE9PSAtMSkge1xuICAgICAgICAgIGZvciAobGV0IGNvbCA9IHRyeVN0YXJ0Q29sOyBjb2wgPD0gZW5kQ29sOyBjb2wrKykge1xuICAgICAgICAgICAgZ3JpZFt0cnVuY2F0ZWRBc3NpZ25lZFJvd11bY29sXSA9IHsgdGFrZW46IHRydWUsIGV2ZW50IH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDcmVhdGUgcG9zaXRpb24gZGF0YSBmb3IgdGhlIHRydW5jYXRlZCByZW5kZXJpbmdcbiAgICAgICAgICBjb25zdCB0cnVuY2F0ZWRTcGFuRGF5cyA9IGVuZENvbCAtIHRyeVN0YXJ0Q29sICsgMVxuICAgICAgICAgIGV2ZW50UG9zaXRpb25zLnB1c2goe1xuICAgICAgICAgICAgbGVmdDogKHRyeVN0YXJ0Q29sIC8gNykgKiAxMDAsXG4gICAgICAgICAgICB3aWR0aDogKHRydW5jYXRlZFNwYW5EYXlzIC8gNykgKiAxMDAsXG4gICAgICAgICAgICB0b3A6XG4gICAgICAgICAgICAgIERBWV9OVU1CRVJfSEVJR0hUICtcbiAgICAgICAgICAgICAgR0FQX0JFVFdFRU5fRUxFTUVOVFMgK1xuICAgICAgICAgICAgICB0cnVuY2F0ZWRBc3NpZ25lZFJvdyAqIChFVkVOVF9CQVJfSEVJR0hUICsgR0FQX0JFVFdFRU5fRUxFTUVOVFMpLFxuICAgICAgICAgICAgaGVpZ2h0OiBFVkVOVF9CQVJfSEVJR0hULFxuICAgICAgICAgICAgcG9zaXRpb246IHRydW5jYXRlZEFzc2lnbmVkUm93LFxuICAgICAgICAgICAgLi4uZXZlbnQsXG4gICAgICAgICAgfSlcbiAgICAgICAgICBwbGFjZWRTdWNjZXNzZnVsbHkgPSB0cnVlXG4gICAgICAgICAgYnJlYWsgLy8gU3VjY2Vzc2Z1bGx5IHBsYWNlZCwgc3RvcCB0cnlpbmcgb3RoZXIgc3RhcnQgcG9zaXRpb25zXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBTdGVwIDI6IEZpbGwgZ2FwcyB3aXRoIHNpbmdsZS1kYXkgZXZlbnRzXG4gIGZvciAoY29uc3QgZXZlbnQgb2Ygc29ydGVkU2luZ2xlRGF5KSB7XG4gICAgY29uc3QgZXZlbnRTdGFydCA9IGRheWpzLm1heChldmVudC5zdGFydC5zdGFydE9mKCdkYXknKSwgd2Vla1N0YXJ0KVxuICAgIGNvbnN0IGNvbCA9IE1hdGgubWF4KDAsIGV2ZW50U3RhcnQuZGlmZih3ZWVrU3RhcnQsICdkYXknKSlcblxuICAgIC8vIEZpbmQgdGhlIGZpcnN0IGF2YWlsYWJsZSByb3cgaW4gdGhpcyBjb2x1bW5cbiAgICBsZXQgYXNzaWduZWRSb3cgPSAtMVxuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGRheU1heEV2ZW50czsgcm93KyspIHtcbiAgICAgIGlmICghZ3JpZFtyb3ddW2NvbF0udGFrZW4pIHtcbiAgICAgICAgYXNzaWduZWRSb3cgPSByb3dcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBJZiB3ZSBmb3VuZCBhIHJvdywgYXNzaWduIHRoZSBldmVudFxuICAgIGlmIChhc3NpZ25lZFJvdyAhPT0gLTEpIHtcbiAgICAgIGdyaWRbYXNzaWduZWRSb3ddW2NvbF0gPSB7IHRha2VuOiB0cnVlLCBldmVudCB9XG5cbiAgICAgIC8vIENyZWF0ZSBwb3NpdGlvbiBkYXRhIGZvciByZW5kZXJpbmdcbiAgICAgIGV2ZW50UG9zaXRpb25zLnB1c2goe1xuICAgICAgICBsZWZ0OiAoY29sIC8gNykgKiAxMDAsXG4gICAgICAgIHdpZHRoOiAoMSAvIDcpICogMTAwLFxuICAgICAgICB0b3A6XG4gICAgICAgICAgREFZX05VTUJFUl9IRUlHSFQgK1xuICAgICAgICAgIEdBUF9CRVRXRUVOX0VMRU1FTlRTICtcbiAgICAgICAgICBhc3NpZ25lZFJvdyAqIChFVkVOVF9CQVJfSEVJR0hUICsgR0FQX0JFVFdFRU5fRUxFTUVOVFMpLFxuICAgICAgICBoZWlnaHQ6IEVWRU5UX0JBUl9IRUlHSFQsXG4gICAgICAgIHBvc2l0aW9uOiBhc3NpZ25lZFJvdyxcbiAgICAgICAgLi4uZXZlbnQsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJyZWxhdGl2ZSB3LWZ1bGwgaC1mdWxsIHBvaW50ZXItZXZlbnRzLW5vbmUgei0yMCBvdmVyZmxvdy1jbGlwXCI+XG4gICAgICB7ZXZlbnRQb3NpdGlvbnMubWFwKChldmVudCkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGtleT17YGV2ZW50LSR7ZXZlbnQuaWR9LSR7ZXZlbnQucG9zaXRpb259LSR7d2Vla1N0YXJ0LmZvcm1hdChcbiAgICAgICAgICAgICAgJ1lZWVktTU0tREQnXG4gICAgICAgICAgICApfWB9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSB6LTEwIHBvaW50ZXItZXZlbnRzLWF1dG8gb3ZlcmZsb3ctY2xpcFwiXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBsZWZ0OiBgY2FsYygke2V2ZW50LmxlZnR9JSArIHZhcigtLXNwYWNpbmcpICogMC4yNSlgLFxuICAgICAgICAgICAgICB3aWR0aDogYGNhbGMoJHtldmVudC53aWR0aH0lIC0gdmFyKC0tc3BhY2luZykgKiAxKWAsXG4gICAgICAgICAgICAgIHRvcDogYCR7ZXZlbnQudG9wfXB4YCxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBgJHtFVkVOVF9CQVJfSEVJR0hUfXB4YCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPERyYWdnYWJsZUV2ZW50XG4gICAgICAgICAgICAgIGVsZW1lbnRJZD17YGV2ZW50LSR7ZXZlbnQuaWR9LSR7XG4gICAgICAgICAgICAgICAgZXZlbnQucG9zaXRpb25cbiAgICAgICAgICAgICAgfS0ke3dlZWtTdGFydC5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgICAgICAgICBldmVudD17ZXZlbnR9XG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtZnVsbCB3LWZ1bGwgc2hhZG93XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIClcbiAgICAgIH0pfVxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB7IFNjcm9sbEFyZWEgfSBmcm9tICdAL2NvbXBvbmVudHMvdWknXG5pbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuaW1wb3J0IHdlZWtPZlllYXIgZnJvbSAnZGF5anMvcGx1Z2luL3dlZWtPZlllYXInXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBXZWVrQWxsRGF5Um93IH0gZnJvbSAnLi93ZWVrLWFsbC1kYXktcm93J1xuaW1wb3J0IHsgV2Vla0hlYWRlciB9IGZyb20gJy4vd2Vlay1oZWFkZXInXG5pbXBvcnQgeyBXZWVrVGltZUdyaWQgfSBmcm9tICcuL3dlZWstdGltZS1ncmlkJ1xuLy8gQWRkIHdlZWtPZlllYXIgcGx1Z2luIHRvIGRheWpzXG5kYXlqcy5leHRlbmQod2Vla09mWWVhcilcblxuY29uc3QgV2Vla1ZpZXc6IFJlYWN0LkZDID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBoLWZ1bGwgZmxleC1jb2xcIiBkYXRhLXRlc3RpZD1cIndlZWstdmlld1wiPlxuICAgICAgey8qIFdlZWsgaGVhZGVyIHJvdyAtIGZpeGVkICovfVxuICAgICAgPFdlZWtIZWFkZXIgLz5cblxuICAgICAgey8qIFNjcm9sbGFibGUgdGltZSBncmlkICovfVxuICAgICAgPFNjcm9sbEFyZWFcbiAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBmbGV4LTEgb3ZlcmZsb3ctYXV0b1wiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwid2Vlay1zY3JvbGwtYXJlYVwiXG4gICAgICA+XG4gICAgICAgIHsvKiBBbGwtZGF5IGV2ZW50cyByb3cgLSBkeW5hbWljIGhlaWdodCBiYXNlZCBvbiBjb250ZW50ICovfVxuICAgICAgICA8V2Vla0FsbERheVJvdyAvPlxuICAgICAgICA8V2Vla1RpbWVHcmlkIC8+XG4gICAgICA8L1Njcm9sbEFyZWE+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgV2Vla1ZpZXdcbiIsCiAgICAiaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgdHlwZSBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgUmVhY3QsIHsgdXNlTWVtbyB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgRHJhZ2dhYmxlRXZlbnQgfSBmcm9tICcuLi9kcmFnZ2FibGUtZXZlbnQvZHJhZ2dhYmxlLWV2ZW50J1xuaW1wb3J0IHsgRHJvcHBhYmxlQ2VsbCB9IGZyb20gJy4uL2Ryb3BwYWJsZS1jZWxsL2Ryb3BwYWJsZS1jZWxsJ1xuaW1wb3J0IHR5cGUgeyBDYWxlbmRhckV2ZW50LCBQcm9jZXNzZWRDYWxlbmRhckV2ZW50IH0gZnJvbSAnQC9jb21wb25lbnRzL3R5cGVzJ1xuaW1wb3J0IHsgRVZFTlRfQkFSX0hFSUdIVCwgR0FQX0JFVFdFRU5fRUxFTUVOVFMgfSBmcm9tICdAL2xpYi9jb25zdGFudHMnXG5cbmV4cG9ydCBjb25zdCBXZWVrQWxsRGF5Um93OiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3QgeyBjdXJyZW50RGF0ZSwgZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlLCBmaXJzdERheU9mV2VlayB9ID1cbiAgICB1c2VDYWxlbmRhckNvbnRleHQoKVxuXG4gIC8vIEdldCBzdGFydCBhbmQgZW5kIG9mIGN1cnJlbnQgd2VlayBiYXNlZCBvbiBmaXJzdERheU9mV2VlayBzZXR0aW5nXG4gIGNvbnN0IHN0YXJ0T2ZXZWVrID0gY3VycmVudERhdGUuc3RhcnRPZignd2VlaycpLmRheShmaXJzdERheU9mV2VlaylcbiAgLy8gSWYgY3VycmVudCBkYXRlIGlzIGJlZm9yZSB0aGUgc3RhcnQgb2Ygd2VlaywgbW92ZSBiYWNrIG9uZSB3ZWVrXG4gIGNvbnN0IGFkanVzdGVkU3RhcnRPZldlZWsgPSBjdXJyZW50RGF0ZS5pc0JlZm9yZShzdGFydE9mV2VlaylcbiAgICA/IHN0YXJ0T2ZXZWVrLnN1YnRyYWN0KDEsICd3ZWVrJylcbiAgICA6IHN0YXJ0T2ZXZWVrXG4gIGNvbnN0IGVuZE9mV2VlayA9IGFkanVzdGVkU3RhcnRPZldlZWsuYWRkKDYsICdkYXknKVxuXG4gIC8vIENyZWF0ZSBhbiBhcnJheSBvZiBkYXlzIGZvciB0aGUgY3VycmVudCB3ZWVrXG4gIGNvbnN0IHdlZWtEYXlzID0gW11cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICB3ZWVrRGF5cy5wdXNoKGFkanVzdGVkU3RhcnRPZldlZWsuYWRkKGksICdkYXknKSlcbiAgfVxuXG4gIC8vIEdldCBldmVudHMgdGhhdCBtaWdodCBvdmVybGFwIHdpdGggdGhpcyB3ZWVrIChleHBhbmQgc2VhcmNoIHJhbmdlKVxuICBjb25zdCBleHBhbmRlZFN0YXJ0RGF0ZSA9IGFkanVzdGVkU3RhcnRPZldlZWsuc3VidHJhY3QoNiwgJ2RheScpIC8vIExvb2sgNiBkYXlzIGJlZm9yZSB3ZWVrIHN0YXJ0XG4gIGNvbnN0IGV4cGFuZGVkRW5kRGF0ZSA9IGVuZE9mV2Vlay5hZGQoNiwgJ2RheScpIC8vIExvb2sgNiBkYXlzIGFmdGVyIHdlZWsgZW5kXG4gIGNvbnN0IGFsbEV2ZW50cyA9IGdldEV2ZW50c0ZvckRhdGVSYW5nZShleHBhbmRlZFN0YXJ0RGF0ZSwgZXhwYW5kZWRFbmREYXRlKVxuXG4gIC8vIEZpbHRlciBldmVudHMgdGhhdCBhY3R1YWxseSBvdmVybGFwIHdpdGggdGhlIGN1cnJlbnQgd2Vla1xuICBjb25zdCB3ZWVrRXZlbnRzID0gYWxsRXZlbnRzLmZpbHRlcigoZXZlbnQpID0+IHtcbiAgICAvLyBGaXhlZCBsb2dpYzogQW4gZXZlbnQgb3ZlcmxhcHMgd2l0aCB0aGlzIHdlZWsgaWY6XG4gICAgcmV0dXJuIChcbiAgICAgIC8vIEVpdGhlciB0aGUgZXZlbnQgc3RhcnRzIGR1cmluZyB0aGlzIHdlZWtcbiAgICAgIChldmVudC5zdGFydC5pc1NhbWVPckFmdGVyKGFkanVzdGVkU3RhcnRPZldlZWspICYmXG4gICAgICAgIGV2ZW50LnN0YXJ0LmlzU2FtZU9yQmVmb3JlKGVuZE9mV2VlaykpIHx8XG4gICAgICAvLyBPciB0aGUgZXZlbnQgZW5kcyBkdXJpbmcgdGhpcyB3ZWVrXG4gICAgICAoZXZlbnQuZW5kLmlzU2FtZU9yQWZ0ZXIoYWRqdXN0ZWRTdGFydE9mV2VlaykgJiZcbiAgICAgICAgZXZlbnQuZW5kLmlzU2FtZU9yQmVmb3JlKGVuZE9mV2VlaykpIHx8XG4gICAgICAvLyBPciB0aGUgZXZlbnQgc3BhbnMgdGhlIGVudGlyZSB3ZWVrIChzdGFydHMgYmVmb3JlIGFuZCBlbmRzIGFmdGVyKVxuICAgICAgKGV2ZW50LnN0YXJ0LmlzQmVmb3JlKGFkanVzdGVkU3RhcnRPZldlZWspICYmXG4gICAgICAgIGV2ZW50LmVuZC5pc0FmdGVyKGVuZE9mV2VlaykpXG4gICAgKVxuICB9KVxuXG4gIC8vIFNlcGFyYXRlIGFsbC1kYXkgZXZlbnRzIGZyb20gcmVndWxhciBldmVudHMgKGluY2x1ZGluZyBtdWx0aS1kYXkgZXZlbnRzKVxuICBjb25zdCBhbGxEYXlFdmVudHMgPSB3ZWVrRXZlbnRzLmZpbHRlcigoZXZlbnQpID0+IGV2ZW50LmFsbERheSlcblxuICAvLyBQcm9jZXNzIGFuZCBsYXlvdXQgYWxsLWRheSBldmVudHMgdG8gYXZvaWQgb3ZlcmxhcHBpbmdcbiAgY29uc3QgeyBwcm9jZXNzZWRBbGxEYXlFdmVudHMgfSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIC8vIFNvcnQgYWxsLWRheSBldmVudHMgYnkgc3RhcnQgZGF0ZSBhbmQgdGhlbiBieSBkdXJhdGlvbiAobG9uZ2VyIGV2ZW50cyBmaXJzdClcbiAgICBjb25zdCBzb3J0ZWRFdmVudHMgPSBbLi4uYWxsRGF5RXZlbnRzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAvLyBGaXJzdCBjb21wYXJlIGJ5IHN0YXJ0IGRhdGVcbiAgICAgIGNvbnN0IHN0YXJ0RGlmZiA9IGEuc3RhcnQuZGlmZihiLnN0YXJ0KVxuICAgICAgaWYgKHN0YXJ0RGlmZiAhPT0gMCkgcmV0dXJuIHN0YXJ0RGlmZlxuXG4gICAgICAvLyBJZiBzdGFydCBkYXRlcyBhcmUgdGhlIHNhbWUsIGxvbmdlciBldmVudHMgY29tZSBmaXJzdFxuICAgICAgY29uc3QgYUR1cmF0aW9uID0gYS5lbmQuZGlmZihhLnN0YXJ0KVxuICAgICAgY29uc3QgYkR1cmF0aW9uID0gYi5lbmQuZGlmZihiLnN0YXJ0KVxuICAgICAgcmV0dXJuIGJEdXJhdGlvbiAtIGFEdXJhdGlvblxuICAgIH0pXG5cbiAgICAvLyBUcmFjayBwb3NpdGlvbnMgaW4gcm93c1xuICAgIGNvbnN0IHJvd3M6IHsgZW5kOiBkYXlqcy5EYXlqczsgZXZlbnQ6IENhbGVuZGFyRXZlbnQgfVtdW10gPSBbXVxuICAgIGNvbnN0IHByb2Nlc3NlZEV2ZW50czogUHJvY2Vzc2VkQ2FsZW5kYXJFdmVudFtdID0gW11cblxuICAgIHNvcnRlZEV2ZW50cy5mb3JFYWNoKChldmVudCkgPT4ge1xuICAgICAgLy8gQ2FsY3VsYXRlIHdoaWNoIGRheXMgdGhpcyBldmVudCBzcGFuc1xuICAgICAgY29uc3QgZXZlbnRTdGFydCA9IGV2ZW50LnN0YXJ0LmlzQmVmb3JlKGFkanVzdGVkU3RhcnRPZldlZWspXG4gICAgICAgID8gYWRqdXN0ZWRTdGFydE9mV2Vla1xuICAgICAgICA6IGV2ZW50LnN0YXJ0XG4gICAgICBjb25zdCBldmVudEVuZCA9IGV2ZW50LmVuZC5pc0FmdGVyKGVuZE9mV2VlaykgPyBlbmRPZldlZWsgOiBldmVudC5lbmRcblxuICAgICAgLy8gQ2FsY3VsYXRlIHBvc2l0aW9uIGFzIHBlcmNlbnRhZ2Ugb2YgdGhlIHdlZWsgd2lkdGhcbiAgICAgIGNvbnN0IHN0YXJ0RGF5SW5kZXggPSBNYXRoLm1heChcbiAgICAgICAgMCxcbiAgICAgICAgZXZlbnRTdGFydC5kaWZmKGFkanVzdGVkU3RhcnRPZldlZWssICdkYXknKVxuICAgICAgKVxuICAgICAgY29uc3QgZW5kRGF5SW5kZXggPSBNYXRoLm1pbig2LCBldmVudEVuZC5kaWZmKGFkanVzdGVkU3RhcnRPZldlZWssICdkYXknKSlcblxuICAgICAgY29uc3QgbGVmdCA9IChzdGFydERheUluZGV4IC8gNykgKiAxMDBcbiAgICAgIGNvbnN0IHdpZHRoID0gKChlbmREYXlJbmRleCAtIHN0YXJ0RGF5SW5kZXggKyAxKSAvIDcpICogMTAwXG5cbiAgICAgIC8vIEZpbmQgYSByb3cgd2hlcmUgdGhpcyBldmVudCBjYW4gZml0XG4gICAgICBsZXQgcm93SW5kZXggPSAwXG4gICAgICBsZXQgcGxhY2VkID0gZmFsc2VcblxuICAgICAgd2hpbGUgKCFwbGFjZWQpIHtcbiAgICAgICAgaWYgKHJvd0luZGV4ID49IHJvd3MubGVuZ3RoKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IHJvdyBpZiBuZWVkZWRcbiAgICAgICAgICByb3dzLnB1c2goW10pXG4gICAgICAgICAgcGxhY2VkID0gdHJ1ZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZXZlbnQgY2FuIGZpdCBpbiB0aGUgY3VycmVudCByb3dcbiAgICAgICAgICBjb25zdCByb3cgPSByb3dzW3Jvd0luZGV4XVxuICAgICAgICAgIGNvbnN0IGNhbkZpdCA9IHJvdy5ldmVyeSgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgZXZlbnRTdGFydC5pc0FmdGVyKGl0ZW0uZW5kKSB8fFxuICAgICAgICAgICAgICBldmVudEVuZC5pc0JlZm9yZShpdGVtLmV2ZW50LnN0YXJ0KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pXG5cbiAgICAgICAgICBpZiAoY2FuRml0KSB7XG4gICAgICAgICAgICBwbGFjZWQgPSB0cnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvd0luZGV4KytcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGV2ZW50IHRvIHRoZSByb3dcbiAgICAgIHJvd3Nbcm93SW5kZXhdLnB1c2goeyBlbmQ6IGV2ZW50RW5kLCBldmVudCB9KVxuXG4gICAgICAvLyBBZGQgcHJvY2Vzc2VkIGV2ZW50IHdpdGggY29ycmVjdCBwb3NpdGlvbmluZ1xuICAgICAgcHJvY2Vzc2VkRXZlbnRzLnB1c2goe1xuICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgbGVmdCxcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIHRvcDogcm93SW5kZXggKiAoRVZFTlRfQkFSX0hFSUdIVCArIEdBUF9CRVRXRUVOX0VMRU1FTlRTKSxcbiAgICAgICAgaGVpZ2h0OiBFVkVOVF9CQVJfSEVJR0hULFxuICAgICAgICBhbGxEYXk6IHRydWUsXG4gICAgICB9KVxuICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgcHJvY2Vzc2VkQWxsRGF5RXZlbnRzOiBwcm9jZXNzZWRFdmVudHMsXG4gICAgICBhbGxEYXlSb3dzQ291bnQ6IE1hdGgubWF4KDEsIHJvd3MubGVuZ3RoKSwgLy8gQXQgbGVhc3QgMSByb3csIGV2ZW4gaWYgZW1wdHlcbiAgICB9XG4gIH0sIFthbGxEYXlFdmVudHMsIGFkanVzdGVkU3RhcnRPZldlZWssIGVuZE9mV2Vla10pXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy1bYXV0b18xZnJfMWZyXzFmcl8xZnJfMWZyXzFmcl8xZnJdIGdyaWQtcm93cy0xIHJlbGF0aXZlXCJcbiAgICAgIGRhdGEtdGVzdGlkPVwid2Vlay1hbGwtZGF5LXJvd1wiXG4gICAgPlxuICAgICAgey8qIExlZnQgbGFiZWwgZm9yIGFsbC1kYXkgZXZlbnRzICovfVxuICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LTE0IGZsZXggc2hyaW5rLTAgaXRlbXMtY2VudGVyIGp1c3RpZnktZW5kIGJvcmRlci14IGJvcmRlci1iIHByLTIgbWluLWgtMTZcIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRleHQtWzEwcHhdIHdoaXRlc3BhY2Utbm93cmFwIHNtOnRleHQteHNcIj5cbiAgICAgICAgICBBbGwtZGF5XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogRHJvcHBhYmxlIGNlbGxzIGZvciBlYWNoIGRheSAqL31cbiAgICAgIHt3ZWVrRGF5cy5tYXAoKGRheSkgPT4gKFxuICAgICAgICA8RHJvcHBhYmxlQ2VsbFxuICAgICAgICAgIGtleT17YGFsbC1kYXktJHtkYXkuZm9ybWF0KCdZWVlZLU1NLUREJyl9YH1cbiAgICAgICAgICBpZD17YGFsbC1kYXktY2VsbC0ke2RheS5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgICAgIHR5cGU9XCJkYXktY2VsbFwiXG4gICAgICAgICAgZGF0ZT17ZGF5fVxuICAgICAgICAgIGNsYXNzTmFtZT1cImhvdmVyOmJnLWFjY2VudCBoLWZ1bGwgZmxleC0xIGN1cnNvci1wb2ludGVyIGJvcmRlci1yIGJvcmRlci1iXCJcbiAgICAgICAgLz5cbiAgICAgICkpfVxuXG4gICAgICB7LyogQWxsLWRheSBldmVudCBibG9ja3MgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cImFic29sdXRlIGluc2V0LTAgei0xMCBwLTEgY29sLXNwYW4tNyBjb2wtc3RhcnQtMlwiPlxuICAgICAgICB7cHJvY2Vzc2VkQWxsRGF5RXZlbnRzLm1hcCgoZXZlbnQsIGluZGV4KSA9PiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtgYWxsLWRheS1jb250YWluZXItJHtldmVudC5pZH1gfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiYWJzb2x1dGVcIlxuICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgbGVmdDogYCR7ZXZlbnQubGVmdH0lYCxcbiAgICAgICAgICAgICAgd2lkdGg6IGBjYWxjKCR7ZXZlbnQud2lkdGh9JSAtIHZhcigtLXNwYWNpbmcpICogMilgLFxuICAgICAgICAgICAgICB0b3A6IGAke2V2ZW50LnRvcH1weGAsXG4gICAgICAgICAgICAgIGhlaWdodDogYCR7ZXZlbnQuaGVpZ2h0fXB4YCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPERyYWdnYWJsZUV2ZW50XG4gICAgICAgICAgICAgIGVsZW1lbnRJZD17YGFsbC1kYXktJHtldmVudC5pZH0tJHtpbmRleH1gfVxuICAgICAgICAgICAgICBldmVudD17ZXZlbnR9XG4gICAgICAgICAgICAgIGtleT17YGFsbC1kYXktJHtldmVudC5pZH0tJHtpbmRleH1gfVxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLWZ1bGwgdy1mdWxsIG92ZXJmbG93LWNsaXAgdGV4dC14cyBhYnNvbHV0ZVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApKX1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICApXG59XG4iLAogICAgImltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcblxuZXhwb3J0IGNvbnN0IFdlZWtIZWFkZXI6IFJlYWN0LkZDID0gKCkgPT4ge1xuICBjb25zdCB7XG4gICAgY3VycmVudERhdGUsXG4gICAgc2VsZWN0RGF0ZSxcbiAgICBvcGVuRXZlbnRGb3JtLFxuICAgIGZpcnN0RGF5T2ZXZWVrLFxuICAgIHN0aWNreVZpZXdIZWFkZXIsXG4gICAgdmlld0hlYWRlckNsYXNzTmFtZSxcbiAgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgLy8gR2V0IHN0YXJ0IGFuZCBlbmQgb2YgY3VycmVudCB3ZWVrIGJhc2VkIG9uIGZpcnN0RGF5T2ZXZWVrIHNldHRpbmdcbiAgY29uc3Qgc3RhcnRPZldlZWsgPSBjdXJyZW50RGF0ZS5zdGFydE9mKCd3ZWVrJykuZGF5KGZpcnN0RGF5T2ZXZWVrKVxuICAvLyBJZiBjdXJyZW50IGRhdGUgaXMgYmVmb3JlIHRoZSBzdGFydCBvZiB3ZWVrLCBtb3ZlIGJhY2sgb25lIHdlZWtcbiAgY29uc3QgYWRqdXN0ZWRTdGFydE9mV2VlayA9IGN1cnJlbnREYXRlLmlzQmVmb3JlKHN0YXJ0T2ZXZWVrKVxuICAgID8gc3RhcnRPZldlZWsuc3VidHJhY3QoMSwgJ3dlZWsnKVxuICAgIDogc3RhcnRPZldlZWtcblxuICAvLyBDcmVhdGUgYW4gYXJyYXkgb2YgZGF5cyBmb3IgdGhlIGN1cnJlbnQgd2Vla1xuICBjb25zdCB3ZWVrRGF5cyA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgd2Vla0RheXMucHVzaChhZGp1c3RlZFN0YXJ0T2ZXZWVrLmFkZChpLCAnZGF5JykpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIC8vIGNzcyBncmlkIGhlYWRlciB3aXRoIGxlZiBjb3JuZXIgY2VsbCBzaG9ydGVyIHRoYW4gdGhlIHJlc3RcbiAgICA8ZGl2XG4gICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZ3JpZCBncmlkLWNvbHMtW2F1dG9fMWZyXzFmcl8xZnJfMWZyXzFmcl8xZnJfMWZyXSBncmlkLXJvd3MtMScsXG4gICAgICAgIHN0aWNreVZpZXdIZWFkZXIgJiYgJ3N0aWNreSB0b3AtMCB6LTEwMCcsXG4gICAgICAgIHZpZXdIZWFkZXJDbGFzc05hbWVcbiAgICAgICl9XG4gICAgICBkYXRhLXRlc3RpZD1cIndlZWstaGVhZGVyXCJcbiAgICA+XG4gICAgICB7LyogQ29ybmVyIGNlbGwgd2l0aCB3ZWVrIG51bWJlciAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNwYW4tMSB3LTE0IHNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBib3JkZXIteCBib3JkZXItYiBwLTJcIj5cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtbXV0ZWQtZm9yZWdyb3VuZCB0ZXh0LXhzXCI+V2Vlazwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJmb250LW1lZGl1bVwiPntjdXJyZW50RGF0ZS53ZWVrKCl9PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogRGF5IGhlYWRlciBjZWxscyAqL31cbiAgICAgIHt3ZWVrRGF5cy5tYXAoKGRheSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgaXNUb2RheSA9IGRheS5pc1NhbWUoZGF5anMoKSwgJ2RheScpXG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8QW5pbWF0ZVByZXNlbmNlIGtleT17ZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpfSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgPG1vdGlvbi5kaXZcbiAgICAgICAgICAgICAga2V5PXtkYXkuZm9ybWF0KCdZWVlZLU1NLUREJyl9XG4gICAgICAgICAgICAgIGluaXRpYWw9e3sgb3BhY2l0eTogMCwgeTogLTEwIH19XG4gICAgICAgICAgICAgIGFuaW1hdGU9e3sgb3BhY2l0eTogMSwgeTogMCB9fVxuICAgICAgICAgICAgICBleGl0PXt7IG9wYWNpdHk6IDAsIHk6IC0xMCB9fVxuICAgICAgICAgICAgICB0cmFuc2l0aW9uPXt7XG4gICAgICAgICAgICAgICAgZHVyYXRpb246IDAuMjUsXG4gICAgICAgICAgICAgICAgZWFzZTogJ2Vhc2VJbk91dCcsXG4gICAgICAgICAgICAgICAgZGVsYXk6IGluZGV4ICogMC4wNSxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAnaG92ZXI6YmctYWNjZW50IGZsZXgtMSBjdXJzb3ItcG9pbnRlciBwLTEgdGV4dC1jZW50ZXIgc206cC0yIGJvcmRlci1yIGJvcmRlci1iJyxcbiAgICAgICAgICAgICAgICBpc1RvZGF5ICYmICdiZy1wcmltYXJ5LzEwIGZvbnQtYm9sZCdcbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgIHNlbGVjdERhdGUoZGF5KVxuICAgICAgICAgICAgICAgIG9wZW5FdmVudEZvcm0oZGF5KVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBkYXRhLXRlc3RpZD17YHdlZWstZGF5LWhlYWRlci0ke2RheS5mb3JtYXQoJ2RkZGQnKS50b0xvd2VyQ2FzZSgpfWB9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwidGV4dC14cyBzbTp0ZXh0LXNtXCI+e2RheS5mb3JtYXQoJ2RkZCcpfTwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICdteC1hdXRvIG10LTEgZmxleCBoLTUgdy01IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciByb3VuZGVkLWZ1bGwgdGV4dC14cyBzbTpoLTcgc206dy03IHNtOnRleHQtc20nLFxuICAgICAgICAgICAgICAgICAgaXNUb2RheSAmJiAnYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCdcbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2RheS5kYXRlKCl9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9tb3Rpb24uZGl2PlxuICAgICAgICAgIDwvQW5pbWF0ZVByZXNlbmNlPlxuICAgICAgICApXG4gICAgICB9KX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgdHlwZSB7IENhbGVuZGFyRXZlbnQgfSBmcm9tICdAL2NvbXBvbmVudHMvdHlwZXMnXG5cbmludGVyZmFjZSBQcm9jZXNzZWRFdmVudCBleHRlbmRzIENhbGVuZGFyRXZlbnQge1xuICBsZWZ0OiBudW1iZXIgLy8gTGVmdCBwb3NpdGlvbiBpbiBwZXJjZW50YWdlXG4gIHdpZHRoOiBudW1iZXIgLy8gV2lkdGggaW4gcGVyY2VudGFnZVxuICB0b3A6IG51bWJlciAvLyBUb3AgcG9zaXRpb24gaW4gcGVyY2VudGFnZVxuICBoZWlnaHQ6IG51bWJlciAvLyBIZWlnaHQgaW4gcGVyY2VudGFnZVxuICB6SW5kZXg/OiBudW1iZXIgLy8gWi1pbmRleCBmb3IgbGF5ZXJpbmcgb3ZlcmxhcHBpbmcgZXZlbnRzXG59XG5cbmludGVyZmFjZSBVc2VQcm9jZXNzZWREYXlFdmVudHNQcm9wcyB7XG4gIGRheTogZGF5anMuRGF5anMgLy8gVGhlIHNwZWNpZmljIGRheSB0aGlzIGNvbHVtbiByZXByZXNlbnRzXG59XG5cbmV4cG9ydCBjb25zdCB1c2VQcm9jZXNzZWREYXlFdmVudHMgPSAoeyBkYXkgfTogVXNlUHJvY2Vzc2VkRGF5RXZlbnRzUHJvcHMpID0+IHtcbiAgY29uc3QgeyBnZXRFdmVudHNGb3JEYXRlUmFuZ2UgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgY29uc3QgdG9kYXlFdmVudHMgPSB1c2VNZW1vPFByb2Nlc3NlZEV2ZW50W10+KCgpID0+IHtcbiAgICBsZXQgZXZlbnRzRm9yRGF5ID0gZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlKFxuICAgICAgZGF5LnN0YXJ0T2YoJ2RheScpLFxuICAgICAgZGF5LmVuZE9mKCdkYXknKVxuICAgIClcblxuICAgIC8vIEZpbHRlciBvdXQgYWxsLWRheSBldmVudHMgYW5kIHNvcnQgYnkgc3RhcnQgdGltZVxuICAgIGV2ZW50c0ZvckRheSA9IGV2ZW50c0ZvckRheVxuICAgICAgLmZpbHRlcigoZSkgPT4gIWUuYWxsRGF5KVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLnN0YXJ0LmRpZmYoYi5zdGFydCkpXG5cbiAgICBpZiAoZXZlbnRzRm9yRGF5Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtdXG4gICAgfVxuXG4gICAgLy8gU3RlcCAxOiBHcm91cCBldmVudHMgaW50byBjbHVzdGVycyBvZiBvdmVybGFwcGluZyBldmVudHNcbiAgICBjb25zdCBjbHVzdGVyczogQ2FsZW5kYXJFdmVudFtdW10gPSBbXVxuICAgIGxldCBjdXJyZW50Q2x1c3RlcjogQ2FsZW5kYXJFdmVudFtdID0gW11cbiAgICBsZXQgbGFzdEV2ZW50RW5kOiBkYXlqcy5EYXlqcyB8IG51bGwgPSBudWxsXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBldmVudHNGb3JEYXkpIHtcbiAgICAgIGlmIChsYXN0RXZlbnRFbmQgJiYgZXZlbnQuc3RhcnQuaXNTYW1lT3JBZnRlcihsYXN0RXZlbnRFbmQpKSB7XG4gICAgICAgIGlmIChjdXJyZW50Q2x1c3Rlci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY2x1c3RlcnMucHVzaChjdXJyZW50Q2x1c3RlcilcbiAgICAgICAgfVxuICAgICAgICBjdXJyZW50Q2x1c3RlciA9IFtdXG4gICAgICB9XG4gICAgICBjdXJyZW50Q2x1c3Rlci5wdXNoKGV2ZW50KVxuICAgICAgbGFzdEV2ZW50RW5kID0gbGFzdEV2ZW50RW5kXG4gICAgICAgID8gZGF5anMubWF4KGxhc3RFdmVudEVuZCwgZXZlbnQuZW5kKVxuICAgICAgICA6IGV2ZW50LmVuZFxuICAgIH1cbiAgICBpZiAoY3VycmVudENsdXN0ZXIubGVuZ3RoID4gMCkge1xuICAgICAgY2x1c3RlcnMucHVzaChjdXJyZW50Q2x1c3RlcilcbiAgICB9XG5cbiAgICAvLyBTdGVwIDI6IEZvciBlYWNoIGNsdXN0ZXIsIHVzZSBhIG1vcmUgaW50ZWxsaWdlbnQgY29sdW1uIGFzc2lnbm1lbnRcbiAgICBjb25zdCBwcm9jZXNzZWRFdmVudHM6IFByb2Nlc3NlZEV2ZW50W10gPSBbXVxuICAgIGZvciAoY29uc3QgY2x1c3RlciBvZiBjbHVzdGVycykge1xuICAgICAgaWYgKGNsdXN0ZXIubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIFNpbmdsZSBldmVudCB0YWtlcyBmdWxsIHdpZHRoXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gY2x1c3RlclswXVxuICAgICAgICBjb25zdCBzdGFydFRpbWUgPSBldmVudC5zdGFydC5ob3VyKCkgKyBldmVudC5zdGFydC5taW51dGUoKSAvIDYwXG4gICAgICAgIGxldCBlbmRUaW1lID0gZXZlbnQuZW5kLmhvdXIoKSArIGV2ZW50LmVuZC5taW51dGUoKSAvIDYwXG4gICAgICAgIGlmIChlbmRUaW1lIDwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGV2ZW50IGVuZHMgb24gdGhlIG5leHQgZGF5LCBzZXQgZW5kIHRpbWUgdG8gMjQgaG91cnNcbiAgICAgICAgICBlbmRUaW1lID0gMjRcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0b3RhbER1cmF0aW9uID0gZW5kVGltZSAtIHN0YXJ0VGltZVxuICAgICAgICBjb25zdCB0b3AgPSAoc3RhcnRUaW1lIC8gMjQpICogMTAwXG4gICAgICAgIGNvbnN0IGhlaWdodCA9ICh0b3RhbER1cmF0aW9uIC8gMjQpICogMTAwXG4gICAgICAgIHByb2Nlc3NlZEV2ZW50cy5wdXNoKHsgLi4uZXZlbnQsIGxlZnQ6IDAsIHdpZHRoOiAxMDAsIHRvcCwgaGVpZ2h0IH0pXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIE11bHRpcGxlIGV2ZW50cyAtIHVzZSBsYXllcmVkIHBvc2l0aW9uaW5nIGFwcHJvYWNoXG4gICAgICAvLyBTb3J0IGJ5IGR1cmF0aW9uIChsb25nZXN0IGZpcnN0KSwgdGhlbiBieSBzdGFydCB0aW1lXG4gICAgICBjb25zdCBzb3J0ZWRFdmVudHMgPSBbLi4uY2x1c3Rlcl0uc29ydCgoYSwgYikgPT4ge1xuICAgICAgICBjb25zdCBhRHVyYXRpb24gPSBhLmVuZC5kaWZmKGEuc3RhcnQsICdtaW51dGUnKVxuICAgICAgICBjb25zdCBiRHVyYXRpb24gPSBiLmVuZC5kaWZmKGIuc3RhcnQsICdtaW51dGUnKVxuXG4gICAgICAgIC8vIExvbmdlciBldmVudHMgZmlyc3RcbiAgICAgICAgaWYgKGFEdXJhdGlvbiAhPT0gYkR1cmF0aW9uKSB7XG4gICAgICAgICAgcmV0dXJuIGJEdXJhdGlvbiAtIGFEdXJhdGlvblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgc2FtZSBkdXJhdGlvbiwgZWFybGllciBzdGFydCB0aW1lIGZpcnN0XG4gICAgICAgIHJldHVybiBhLnN0YXJ0LmRpZmYoYi5zdGFydClcbiAgICAgIH0pXG5cbiAgICAgIC8vIFByb2Nlc3MgZXZlbnRzIHdpdGggbGF5ZXJlZCBwb3NpdGlvbmluZ1xuICAgICAgY29uc3QgdG90YWxFdmVudHMgPSBzb3J0ZWRFdmVudHMubGVuZ3RoXG5cbiAgICAgIC8vIENhbGN1bGF0ZSBkeW5hbWljIG9mZnNldCBiYXNlZCBvbiBudW1iZXIgb2Ygb3ZlcmxhcHBpbmcgZXZlbnRzXG4gICAgICAvLyBGZXdlciBldmVudHMgPSBsYXJnZXIgaW5kaXZpZHVhbCBvZmZzZXRzLCBtb3JlIGV2ZW50cyA9IHNtYWxsZXIgb2Zmc2V0c1xuICAgICAgbGV0IG1heE9mZnNldDogbnVtYmVyXG4gICAgICBpZiAodG90YWxFdmVudHMgPT09IDIpIHtcbiAgICAgICAgbWF4T2Zmc2V0ID0gMjUgLy8gMjUlIG9mZnNldCBmb3IgMiBldmVudHNcbiAgICAgIH0gZWxzZSBpZiAodG90YWxFdmVudHMgPT09IDMpIHtcbiAgICAgICAgbWF4T2Zmc2V0ID0gNTAgLy8gNTAlIHRvdGFsIGZvciAzIGV2ZW50cyAoMjUlIGVhY2gpXG4gICAgICB9IGVsc2UgaWYgKHRvdGFsRXZlbnRzID09PSA0KSB7XG4gICAgICAgIG1heE9mZnNldCA9IDYwIC8vIDYwJSB0b3RhbCBmb3IgNCBldmVudHMgKDIwJSBlYWNoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWF4T2Zmc2V0ID0gNzAgLy8gNzAlIHRvdGFsIGZvciA1KyBldmVudHNcbiAgICAgIH1cblxuICAgICAgY29uc3Qgb2Zmc2V0UGVyRXZlbnQgPSB0b3RhbEV2ZW50cyA+IDEgPyBtYXhPZmZzZXQgLyAodG90YWxFdmVudHMgLSAxKSA6IDBcblxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWRFdmVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBzb3J0ZWRFdmVudHNbaV1cbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gZXZlbnQuc3RhcnQuaG91cigpICsgZXZlbnQuc3RhcnQubWludXRlKCkgLyA2MFxuICAgICAgICBsZXQgZW5kVGltZSA9IGV2ZW50LmVuZC5ob3VyKCkgKyBldmVudC5lbmQubWludXRlKCkgLyA2MFxuXG4gICAgICAgIGlmIChlbmRUaW1lIDwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgLy8gSWYgdGhlIGV2ZW50IGVuZHMgb24gdGhlIG5leHQgZGF5LCBzZXQgZW5kIHRpbWUgdG8gMjQgaG91cnNcbiAgICAgICAgICBlbmRUaW1lID0gMjRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsRHVyYXRpb24gPSBlbmRUaW1lIC0gc3RhcnRUaW1lXG4gICAgICAgIGNvbnN0IHRvcCA9IChzdGFydFRpbWUgLyAyNCkgKiAxMDBcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gKHRvdGFsRHVyYXRpb24gLyAyNCkgKiAxMDBcblxuICAgICAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb25pbmcgYmFzZWQgb24gbGF5ZXIgYW5kIHRvdGFsIGV2ZW50c1xuICAgICAgICBsZXQgbGVmdDogbnVtYmVyXG4gICAgICAgIGxldCB3aWR0aDogbnVtYmVyXG4gICAgICAgIGxldCB6SW5kZXg6IG51bWJlclxuXG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgLy8gRmlyc3QgZXZlbnQgKGxvbmdlc3QpIHRha2VzIGZ1bGwgd2lkdGggYXQgYm90dG9tXG4gICAgICAgICAgbGVmdCA9IDBcbiAgICAgICAgICB3aWR0aCA9IDEwMFxuICAgICAgICAgIHpJbmRleCA9IDFcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBTdWJzZXF1ZW50IGV2ZW50cyBhcmUgb2Zmc2V0IGR5bmFtaWNhbGx5IGJhc2VkIG9uIHRvdGFsIGV2ZW50IGNvdW50XG4gICAgICAgICAgbGVmdCA9IG9mZnNldFBlckV2ZW50ICogaVxuICAgICAgICAgIHdpZHRoID0gMTAwIC0gbGVmdCAvLyBSZW1haW5pbmcgd2lkdGhcbiAgICAgICAgICB6SW5kZXggPSBpICsgMSAvLyBIaWdoZXIgei1pbmRleCBmb3IgZXZlbnRzIG9uIHRvcFxuICAgICAgICB9XG5cbiAgICAgICAgcHJvY2Vzc2VkRXZlbnRzLnB1c2goe1xuICAgICAgICAgIC4uLmV2ZW50LFxuICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIGhlaWdodCxcbiAgICAgICAgICB6SW5kZXgsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHByb2Nlc3NlZEV2ZW50c1xuICB9LCBbZGF5LCBnZXRFdmVudHNGb3JEYXRlUmFuZ2VdKVxuXG4gIHJldHVybiB0b2RheUV2ZW50c1xufVxuIiwKICAgICJpbXBvcnQgeyB1c2VQcm9jZXNzZWREYXlFdmVudHMgfSBmcm9tICdAL2hvb2tzL3VzZVByb2Nlc3NlZERheUV2ZW50cydcbmltcG9ydCB7IERyYWdnYWJsZUV2ZW50IH0gZnJvbSAnLi4vZHJhZ2dhYmxlLWV2ZW50L2RyYWdnYWJsZS1ldmVudCdcbmltcG9ydCB0eXBlIGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IGNuIH0gZnJvbSAnQC9saWIvdXRpbHMnXG5cbmludGVyZmFjZSBEYXlFdmVudHNMYXllclByb3BzIHtcbiAgZGF5OiBkYXlqcy5EYXlqcyAvLyBUaGUgc3BlY2lmaWMgZGF5IHRoaXMgbGF5ZXIgcmVwcmVzZW50c1xuICAnZGF0YS10ZXN0aWQnPzogc3RyaW5nXG59XG5cbmV4cG9ydCBjb25zdCBEYXlFdmVudHNMYXllcjogUmVhY3QuRkM8RGF5RXZlbnRzTGF5ZXJQcm9wcz4gPSAoe1xuICBkYXksXG4gICdkYXRhLXRlc3RpZCc6IGRhdGFUZXN0SWQsXG59KSA9PiB7XG4gIGNvbnN0IHRvZGF5RXZlbnRzID0gdXNlUHJvY2Vzc2VkRGF5RXZlbnRzKHsgZGF5IH0pXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBkYXRhLXRlc3RpZD17ZGF0YVRlc3RJZH1cbiAgICAgIGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgaW5zZXQtMCB6LTMwXCJcbiAgICA+XG4gICAgICB7dG9kYXlFdmVudHMubWFwKChldmVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgdmVyeVZlcnlVbmlxdWVLZXkgPSBgZXZlbnQtJHtldmVudC5pZH0tJHtpbmRleH0tJHtkYXkuZm9ybWF0KFxuICAgICAgICAgICdZWVlZLU1NLUREJ1xuICAgICAgICApfWBcbiAgICAgICAgY29uc3QgaXNTaG9ydEV2ZW50ID0gZXZlbnQuZW5kLmRpZmYoZXZlbnQuc3RhcnQsICdtaW51dGUnKSA8PSAxNVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGtleT17YGNvbnRhaW5lci0ke3ZlcnlWZXJ5VW5pcXVlS2V5fWB9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZVwiXG4gICAgICAgICAgICBzdHlsZT17e1xuICAgICAgICAgICAgICBsZWZ0OiBgJHtldmVudC5sZWZ0fSVgLFxuICAgICAgICAgICAgICB3aWR0aDogYGNhbGMoJHtldmVudC53aWR0aH0lIC0gdmFyKC0tc3BhY2luZykgKiAyKWAsXG4gICAgICAgICAgICAgIHRvcDogYCR7ZXZlbnQudG9wfSVgLFxuICAgICAgICAgICAgICBoZWlnaHQ6IGAke2V2ZW50LmhlaWdodH0lYCxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPERyYWdnYWJsZUV2ZW50XG4gICAgICAgICAgICAgIGVsZW1lbnRJZD17YGRyYWdnYWJsZS0ke3ZlcnlWZXJ5VW5pcXVlS2V5fWB9XG4gICAgICAgICAgICAgIGV2ZW50PXtldmVudH1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbigncG9pbnRlci1ldmVudHMtYXV0byBhYnNvbHV0ZScsIHtcbiAgICAgICAgICAgICAgICAnWyZfcF06dGV4dC1bMTBweF0gWyZfcF06bXQtMCc6IGlzU2hvcnRFdmVudCxcbiAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICApXG4gICAgICB9KX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IERheUV2ZW50c0xheWVyIH0gZnJvbSAnLi4vZGF5LXZpZXcvZGF5LWV2ZW50cy1sYXllcidcbmltcG9ydCB7IERyb3BwYWJsZUNlbGwgfSBmcm9tICcuLi9kcm9wcGFibGUtY2VsbC9kcm9wcGFibGUtY2VsbCdcblxuY29uc3QgaG91cnMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoOiAyNCB9LCAoXywgaSkgPT4gaSkubWFwKChob3VyKSA9PlxuICBkYXlqcygpLmhvdXIoaG91cikubWludXRlKDApXG4pXG5cbmludGVyZmFjZSBXZWVrRGF5Q29sUHJvcHMge1xuICBkYXk6IGRheWpzLkRheWpzIC8vIFRoZSBzcGVjaWZpYyBkYXkgdGhpcyBjb2x1bW4gcmVwcmVzZW50c1xufVxuXG5leHBvcnQgY29uc3QgV2Vla0RheUNvbDogUmVhY3QuRkM8V2Vla0RheUNvbFByb3BzPiA9ICh7IGRheSB9KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgZGF0YS10ZXN0aWQ9e2B3ZWVrLWRheS1jb2wtJHtkYXkuZm9ybWF0KCdZWVlZLU1NLUREJyl9YH1cbiAgICAgIGNsYXNzTmFtZT1cImNvbC1zcGFuLTEgcmVsYXRpdmUgZ3JpZCBncmlkLXJvd3MtMjQgYm9yZGVyLXJcIlxuICAgID5cbiAgICAgIHtob3Vycy5tYXAoKHRpbWUpID0+IHtcbiAgICAgICAgY29uc3QgaG91ciA9IHRpbWUuaG91cigpXG4gICAgICAgIGNvbnN0IGNlbGxEYXRlID0gZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpXG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICA8RHJvcHBhYmxlQ2VsbFxuICAgICAgICAgICAga2V5PXtgJHtjZWxsRGF0ZX0tJHt0aW1lLmZvcm1hdCgnSEgnKX1gfVxuICAgICAgICAgICAgaWQ9e2B0aW1lLWNlbGwtJHtjZWxsRGF0ZX0tJHt0aW1lLmZvcm1hdCgnSEgnKX1gfVxuICAgICAgICAgICAgdHlwZT1cInRpbWUtY2VsbFwiXG4gICAgICAgICAgICBkYXRlPXtkYXl9XG4gICAgICAgICAgICBob3VyPXtob3VyfVxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2B3ZWVrLXRpbWUtY2VsbC0ke2NlbGxEYXRlfS0ke3RpbWUuZm9ybWF0KCdISCcpfWB9XG4gICAgICAgICAgICBjbGFzc05hbWU9e2NuKFxuICAgICAgICAgICAgICAnaG92ZXI6YmctYWNjZW50IHJlbGF0aXZlIHotMjAgaC1bNjBweF0gY3Vyc29yLXBvaW50ZXIgYm9yZGVyLWInXG4gICAgICAgICAgICApfVxuICAgICAgICAgIC8+XG4gICAgICAgIClcbiAgICAgIH0pfVxuXG4gICAgICB7LyogRXZlbnQgYmxvY2tzIGxheWVyICovfVxuICAgICAgPERheUV2ZW50c0xheWVyXG4gICAgICAgIGRhdGEtdGVzdGlkPXtgd2Vlay1kYXktZXZlbnRzLSR7ZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgIGRheT17ZGF5fVxuICAgICAgLz5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgeyB1c2VDYWxlbmRhckNvbnRleHQgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvY29udGV4dCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBXZWVrRGF5Q29sIH0gZnJvbSAnLi93ZWVrLWRheS1jb2wnXG5cbmNvbnN0IGhvdXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjQgfSwgKF8sIGkpID0+IGkpLm1hcCgoaG91cikgPT5cbiAgZGF5anMoKS5ob3VyKGhvdXIpLm1pbnV0ZSgwKVxuKVxuXG5leHBvcnQgY29uc3QgV2Vla1RpbWVHcmlkOiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3QgeyBjdXJyZW50RGF0ZSwgZmlyc3REYXlPZldlZWsgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgLy8gR2V0IHN0YXJ0IGFuZCBlbmQgb2YgY3VycmVudCB3ZWVrIGJhc2VkIG9uIGZpcnN0RGF5T2ZXZWVrIHNldHRpbmdcbiAgY29uc3Qgc3RhcnRPZldlZWsgPSBjdXJyZW50RGF0ZS5zdGFydE9mKCd3ZWVrJykuZGF5KGZpcnN0RGF5T2ZXZWVrKVxuICAvLyBJZiBjdXJyZW50IGRhdGUgaXMgYmVmb3JlIHRoZSBzdGFydCBvZiB3ZWVrLCBtb3ZlIGJhY2sgb25lIHdlZWtcbiAgY29uc3QgYWRqdXN0ZWRTdGFydE9mV2VlayA9IGN1cnJlbnREYXRlLmlzQmVmb3JlKHN0YXJ0T2ZXZWVrKVxuICAgID8gc3RhcnRPZldlZWsuc3VidHJhY3QoMSwgJ3dlZWsnKVxuICAgIDogc3RhcnRPZldlZWtcblxuICAvLyBDcmVhdGUgYW4gYXJyYXkgb2YgZGF5cyBmb3IgdGhlIGN1cnJlbnQgd2Vla1xuICBjb25zdCB3ZWVrRGF5cyA9IFtdXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgd2Vla0RheXMucHVzaChhZGp1c3RlZFN0YXJ0T2ZXZWVrLmFkZChpLCAnZGF5JykpXG4gIH1cblxuICAvLyBTZXBhcmF0ZSBhbGwtZGF5IGV2ZW50cyBmcm9tIHJlZ3VsYXIgZXZlbnRzIChpbmNsdWRpbmcgbXVsdGktZGF5IGV2ZW50cylcblxuICAvLyBGaW5kIGlmIGN1cnJlbnQgZGF5IGlzIGluIHRoZSBkaXNwbGF5ZWQgd2Vla1xuICBjb25zdCB0b2RheUluZGV4ID0gd2Vla0RheXMuZmluZEluZGV4KChkYXkpID0+IGRheS5pc1NhbWUoZGF5anMoKSwgJ2RheScpKVxuICBjb25zdCBpc0N1cnJlbnRXZWVrID0gdG9kYXlJbmRleCAhPT0gLTFcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdGVzdGlkPVwid2Vlay10aW1lLWdyaWRcIlxuICAgICAgY2xhc3NOYW1lPVwicmVsYXRpdmUgaC1mdWxsIGdyaWQgZ3JpZC1jb2xzLVthdXRvX3JlcGVhdCg3LDFmcildIGdyaWQtcm93cy1bcmVwZWF0KDI0LG1pbm1heCg2MHB4LCAxZnIpKV1cIlxuICAgID5cbiAgICAgIHsvKiBUaW1lIGxhYmVscyBjb2x1bW4gLSBmaXhlZCAqL31cbiAgICAgIDxkaXZcbiAgICAgICAgZGF0YS10ZXN0aWQ9XCJ3ZWVrLXRpbWUtbGFiZWxzXCJcbiAgICAgICAgY2xhc3NOYW1lPVwiei0xMCBjb2wtc3Bhbi0xIHctMTQgZ3JpZCBncmlkLXJvd3MtMjQgYm9yZGVyLXhcIlxuICAgICAgPlxuICAgICAgICB7aG91cnMubWFwKCh0aW1lKSA9PiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXt0aW1lLmZvcm1hdCgnSEg6bW0nKX1cbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgd2Vlay10aW1lLWhvdXItJHt0aW1lLmZvcm1hdCgnSEgnKX1gfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC1bNjBweF0gYm9yZGVyLWIgdGV4dC1yaWdodFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHByLTIgdGV4dC1yaWdodCB0ZXh0LVsxMHB4XSBzbTp0ZXh0LXhzXCI+XG4gICAgICAgICAgICAgIHt0aW1lLmZvcm1hdCgnaCBBJyl9XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG5cbiAgICAgIHsvKiBEYXkgY29sdW1ucyB3aXRoIHRpbWUgc2xvdHMgKi99XG4gICAgICB7d2Vla0RheXMubWFwKChkYXkpID0+IChcbiAgICAgICAgPFdlZWtEYXlDb2wga2V5PXtkYXkuZm9ybWF0KCdZWVlZLU1NLUREJyl9IGRheT17ZGF5fSAvPlxuICAgICAgKSl9XG5cbiAgICAgIHsvKiBDdXJyZW50IHRpbWUgaW5kaWNhdG9yICovfVxuICAgICAge2lzQ3VycmVudFdlZWsgJiYgKFxuICAgICAgICA8ZGl2XG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJ3ZWVrLWN1cnJlbnQtdGltZS1pbmRpY2F0b3JcIlxuICAgICAgICAgIGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLW5vbmUgYWJzb2x1dGUgei0yMFwiXG4gICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgIHRvcDogYCR7KGRheWpzKCkuaG91cigpICsgZGF5anMoKS5taW51dGUoKSAvIDYwKSAqIDYwfXB4YCxcbiAgICAgICAgICAgIGxlZnQ6IGAke3RvZGF5SW5kZXggKiAoMTAwIC8gNyl9JWAsXG4gICAgICAgICAgICB3aWR0aDogYCR7MTAwIC8gN30lYCxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJ3LWZ1bGwgYm9yZGVyLXQgYm9yZGVyLXJlZC01MDBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiLW10LTEgbWwtMSBoLTIgdy0yIHJvdW5kZWQtZnVsbCBiZy1yZWQtNTAwXCI+PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgeyBTY3JvbGxBcmVhIH0gZnJvbSAnQC9jb21wb25lbnRzL3VpJ1xuaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCB7IEZyYWdtZW50IH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBEcm9wcGFibGVDZWxsIH0gZnJvbSAnLi4vZHJvcHBhYmxlLWNlbGwvZHJvcHBhYmxlLWNlbGwnXG5pbXBvcnQgeyBEYXlBbGxEYXlSb3cgfSBmcm9tICcuL2RheS1hbGwtZGF5LXJvdydcbmltcG9ydCB7IERheUV2ZW50c0xheWVyIH0gZnJvbSAnLi9kYXktZXZlbnRzLWxheWVyJ1xuaW1wb3J0IHsgRGF5SGVhZGVyIH0gZnJvbSAnLi9kYXktaGVhZGVyJ1xuaW1wb3J0IHsgRGF5VGltZUNvbCB9IGZyb20gJy4vZGF5LXRpbWUtY29sJ1xuXG5jb25zdCBEYXlWaWV3ID0gKCkgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREYXRlIH0gPSB1c2VDYWxlbmRhckNvbnRleHQoKVxuXG4gIC8vIEhvdXJzIHRvIGRpc3BsYXkgKGFsbCAyNCBob3VycyBvZiB0aGUgZGF5KVxuICBjb25zdCBob3VycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDI0IH0sIChfLCBpKSA9PiBpKS5tYXAoKGhvdXIpID0+IHtcbiAgICByZXR1cm4gZGF5anMoKS5ob3VyKGhvdXIpLm1pbnV0ZSgwKVxuICB9KVxuXG4gIC8vIEZvciBtb3JlIGdyYW51bGFyIHRpbWUgc2xvdHMsIHdlJ2xsIGRpdmlkZSBlYWNoIGhvdXIgaW50byAxNS1taW51dGUgc2VnbWVudHNcbiAgY29uc3QgdGltZVNlZ21lbnRzID0gWzAsIDE1LCAzMCwgNDVdXG5cbiAgLy8gR2V0IGN1cnJlbnQgZGF5J3MgZXZlbnRzIC0gdGhpcyB3aWxsIHJlZnJlc2ggYXV0b21hdGljYWxseSB3aGVuIHN0b3JlIHVwZGF0ZXNcbiAgLy8gYmVjYXVzZSBnZXRFdmVudHNGb3JEYXRlIGlzIGEgc2VsZWN0b3IgZnVuY3Rpb24gZnJvbSB0aGUgc3RvcmUgdGhhdCBydW5zIHdoZW5ldmVyIGV2ZW50cyBjaGFuZ2VcblxuICBjb25zdCBpc1RvZGF5ID0gY3VycmVudERhdGUuaXNTYW1lKGRheWpzKCksICdkYXknKVxuICBjb25zdCBjZWxsRGF0ZSA9IGN1cnJlbnREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGRhdGEtdGVzdGlkPVwiZGF5LXZpZXdcIiBjbGFzc05hbWU9XCJmbGV4IGgtZnVsbCBmbGV4LWNvbFwiPlxuICAgICAgey8qIERheSBoZWFkZXIgKi99XG4gICAgICA8RGF5SGVhZGVyIC8+XG5cbiAgICAgIHsvKiBUaW1lIGdyaWQgd2l0aG91dCBzY3JvbGxiYXIgKi99XG4gICAgICA8U2Nyb2xsQXJlYVxuICAgICAgICBkYXRhLXRlc3RpZD1cImRheS1zY3JvbGwtYXJlYVwiXG4gICAgICAgIGNsYXNzTmFtZT1cInJlbGF0aXZlIGZsZXgtMSBvdmVyZmxvdy15LWF1dG9cIlxuICAgICAgPlxuICAgICAgICB7LyogQWxsLWRheSBldmVudHMgcm93ICovfVxuICAgICAgICA8RGF5QWxsRGF5Um93IC8+XG5cbiAgICAgICAgey8qIFNldCBhIGZpeGVkIGhlaWdodCBjb250YWluZXIgdGhhdCBtYXRjaGVzIGV4YWN0bHkgdGhlIHRvdGFsIGhlaWdodCBvZiBhbGwgaG91ciBibG9ja3MgKi99XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImRheS10aW1lLWdyaWRcIlxuICAgICAgICAgIGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTggZGl2aWRlLXggYm9yZGVyLXhcIlxuICAgICAgICAgIHN0eWxlPXt7IGhlaWdodDogYCR7aG91cnMubGVuZ3RoICogNjB9cHhgIH19XG4gICAgICAgID5cbiAgICAgICAgICB7LyogVGltZSBsYWJlbHMgY29sdW1uICovfVxuICAgICAgICAgIDxEYXlUaW1lQ29sIGNsYXNzTmFtZT1cImNvbC1zcGFuLTIgaC1mdWxsIG1kOmNvbC1zcGFuLTFcIiAvPlxuXG4gICAgICAgICAgey8qIERheSBjb2x1bW4gd2l0aCBldmVudHMgKi99XG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9XCJkYXktZXZlbnRzLWNvbHVtblwiXG4gICAgICAgICAgICBjbGFzc05hbWU9XCJyZWxhdGl2ZSBjb2wtc3Bhbi02IGgtZnVsbCBtZDpjb2wtc3Bhbi03XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7LyogQmFja2dyb3VuZCBncmlkIGZvciB0aW1lIHNsb3RzIC0gbG93ZXN0IGxheWVyICovfVxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImRheS1iYWNrZ3JvdW5kLWdyaWRcIlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJhYnNvbHV0ZSBpbnNldC0wIHotMFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIHtob3Vycy5tYXAoKGhvdXIsIGluZGV4KSA9PiAoXG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAga2V5PXtgYmctJHtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX0tJHtob3VyLmZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgJ0hIJ1xuICAgICAgICAgICAgICAgICAgKX1gfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC1bNjBweF0gYm9yZGVyLWJcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHsvKiAxNS1taW51dGUgbWFya2VyIGxpbmVzICovfVxuICAgICAgICAgICAgICAgICAge3RpbWVTZWdtZW50cy5zbGljZSgxKS5tYXAoKG1pbnV0ZXMpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgIGtleT17YGJnLSR7aG91ci5mb3JtYXQoJ0hIJyl9LSR7bWludXRlc31gfVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImJvcmRlci1ib3JkZXIgYWJzb2x1dGUgdy1mdWxsIGJvcmRlci10IGJvcmRlci1kYXNoZWRcIlxuICAgICAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IHRvcDogYCR7aW5kZXggKiA2MCArIG1pbnV0ZXN9cHhgIH19XG4gICAgICAgICAgICAgICAgICAgID48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICApKX1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICB7LyogSW50ZXJhY3RpdmUgbGF5ZXIgZm9yIHRpbWUgc2xvdHMgLSBtaWRkbGUgbGF5ZXIgd2l0aCBubyBib3JkZXJzICovfVxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImRheS1pbnRlcmFjdGl2ZS1sYXllclwiXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT1cInBvaW50ZXItZXZlbnRzLWF1dG8gYWJzb2x1dGUgaW5zZXQtMCB6LTIwXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAge2hvdXJzLm1hcCgodGltZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGhvdXIgPSB0aW1lLmhvdXIoKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxGcmFnbWVudCBrZXk9e2Ake2NlbGxEYXRlfS0ke3RpbWUuZm9ybWF0KCdISCcpfWB9PlxuICAgICAgICAgICAgICAgICAgICA8RHJvcHBhYmxlQ2VsbFxuICAgICAgICAgICAgICAgICAgICAgIGlkPXtgdGltZS1jZWxsLSR7Y2VsbERhdGV9LSR7dGltZS5mb3JtYXQoJ0hIJyl9LTAwYH1cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGltZS1jZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRlPXtjdXJyZW50RGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgICBob3VyPXtob3VyfVxuICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZT17MH1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NuKCdob3ZlcjpiZy1hY2NlbnQgaC1bMTVweF0gY3Vyc29yLXBvaW50ZXInKX1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPERyb3BwYWJsZUNlbGxcbiAgICAgICAgICAgICAgICAgICAgICBpZD17YHRpbWUtY2VsbC0ke2NlbGxEYXRlfS0ke3RpbWUuZm9ybWF0KCdISCcpfS0xNWB9XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRpbWUtY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgZGF0ZT17Y3VycmVudERhdGV9XG4gICAgICAgICAgICAgICAgICAgICAgaG91cj17aG91cn1cbiAgICAgICAgICAgICAgICAgICAgICBtaW51dGU9ezE1fVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImhvdmVyOmJnLWFjY2VudCBoLVsxNXB4XSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxEcm9wcGFibGVDZWxsXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9e2B0aW1lLWNlbGwtJHtjZWxsRGF0ZX0tJHt0aW1lLmZvcm1hdCgnSEgnKX0tMzBgfVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0aW1lLWNlbGxcIlxuICAgICAgICAgICAgICAgICAgICAgIGRhdGU9e2N1cnJlbnREYXRlfVxuICAgICAgICAgICAgICAgICAgICAgIGhvdXI9e2hvdXJ9XG4gICAgICAgICAgICAgICAgICAgICAgbWludXRlPXszMH1cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJob3ZlcjpiZy1hY2NlbnQgaC1bMTVweF0gY3Vyc29yLXBvaW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8RHJvcHBhYmxlQ2VsbFxuICAgICAgICAgICAgICAgICAgICAgIGlkPXtgdGltZS1jZWxsLSR7Y2VsbERhdGV9LSR7dGltZS5mb3JtYXQoJ0hIJyl9LTQ1YH1cbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGltZS1jZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICBkYXRlPXtjdXJyZW50RGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgICBob3VyPXtob3VyfVxuICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZT17NDV9XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaG92ZXI6YmctYWNjZW50IGgtWzE1cHhdIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICB7LyogRXZlbnRzIGxheWVyIC0gbWlkZGxlLXRvcCBsYXllciAqL31cbiAgICAgICAgICAgIDxEYXlFdmVudHNMYXllciBkYXk9e2N1cnJlbnREYXRlfSAvPlxuXG4gICAgICAgICAgICB7LyogQ3VycmVudCB0aW1lIGluZGljYXRvciAtIHRvcCBsYXllciAqL31cbiAgICAgICAgICAgIHtpc1RvZGF5ICYmIChcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LWN1cnJlbnQtdGltZS1pbmRpY2F0b3JcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImFic29sdXRlIHJpZ2h0LTAgbGVmdC0wIHotNDAgYm9yZGVyLXQgYm9yZGVyLXJlZC01MDBcIlxuICAgICAgICAgICAgICAgIHN0eWxlPXt7XG4gICAgICAgICAgICAgICAgICB0b3A6IGAkeyhkYXlqcygpLmhvdXIoKSArIGRheWpzKCkubWludXRlKCkgLyA2MCkgKiA2MH1weGAsXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiLW10LTEgLW1sLTEgaC0yIHctMiByb3VuZGVkLWZ1bGwgYmctcmVkLTUwMFwiPjwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9TY3JvbGxBcmVhPlxuICAgIDwvZGl2PlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IERheVZpZXdcbiIsCiAgICAiaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgeyB1c2VNZW1vIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgeyBEcmFnZ2FibGVFdmVudCB9IGZyb20gJy4uL2RyYWdnYWJsZS1ldmVudC9kcmFnZ2FibGUtZXZlbnQnXG5pbXBvcnQgeyBEcm9wcGFibGVDZWxsIH0gZnJvbSAnLi4vZHJvcHBhYmxlLWNlbGwvZHJvcHBhYmxlLWNlbGwnXG5pbXBvcnQgdHlwZSB7IENhbGVuZGFyRXZlbnQsIFByb2Nlc3NlZENhbGVuZGFyRXZlbnQgfSBmcm9tICdAL2NvbXBvbmVudHMvdHlwZXMnXG5pbXBvcnQgeyBFVkVOVF9CQVJfSEVJR0hUIH0gZnJvbSAnQC9saWIvY29uc3RhbnRzJ1xuXG5leHBvcnQgY29uc3QgRGF5QWxsRGF5Um93ID0gKCkgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREYXRlLCBnZXRFdmVudHNGb3JEYXRlIH0gPSB1c2VDYWxlbmRhckNvbnRleHQoKVxuXG4gIC8vIEdldCBjdXJyZW50IGRheSdzIGV2ZW50cyAtIHRoaXMgd2lsbCByZWZyZXNoIGF1dG9tYXRpY2FsbHkgd2hlbiBzdG9yZSB1cGRhdGVzXG4gIC8vIGJlY2F1c2UgZ2V0RXZlbnRzRm9yRGF0ZSBpcyBhIHNlbGVjdG9yIGZ1bmN0aW9uIGZyb20gdGhlIHN0b3JlIHRoYXQgcnVucyB3aGVuZXZlciBldmVudHMgY2hhbmdlXG4gIGNvbnN0IGRheUV2ZW50cyA9IGdldEV2ZW50c0ZvckRhdGUoY3VycmVudERhdGUpXG5cbiAgLy8gU2VwYXJhdGUgYWxsLWRheSBldmVudHMgZnJvbSByZWd1bGFyIGV2ZW50c1xuICBjb25zdCB7IGFsbERheUV2ZW50cyB9ID0gdXNlTWVtbygoKSA9PiB7XG4gICAgLy8gT25seSBldmVudHMgZXhwbGljaXRseSBtYXJrZWQgYXMgYWxsRGF5IHNob3VsZCBiZSBpbiB0aGUgYWxsLWRheSBzZWN0aW9uXG4gICAgY29uc3QgYWxsRGF5RXZ0cyA9IGRheUV2ZW50cy5maWx0ZXIoKGV2ZW50KSA9PiBldmVudC5hbGxEYXkpXG5cbiAgICAvLyBSZWd1bGFyIGV2ZW50cyAoaW5jbHVkaW5nIG11bHRpLWRheSBldmVudHMpXG4gICAgY29uc3QgcmVndWxhckV2dHMgPSBkYXlFdmVudHMuZmlsdGVyKChldmVudCkgPT4gIWV2ZW50LmFsbERheSlcblxuICAgIHJldHVybiB7IGFsbERheUV2ZW50czogYWxsRGF5RXZ0cywgcmVndWxhckV2ZW50czogcmVndWxhckV2dHMgfVxuICB9LCBbZGF5RXZlbnRzXSkgLy8gT25seSBkZXBlbmQgb24gdGhlIGRheUV2ZW50cyB3aGljaCBpcyByZWZyZXNoZWQgYXV0b21hdGljYWxseVxuXG4gIC8vIFByb2Nlc3MgYWxsLWRheSBldmVudHMgZm9yIGRpc3BsYXlcbiAgY29uc3QgeyBwcm9jZXNzZWRBbGxEYXlFdmVudHMgfSA9IHVzZU1lbW8oKCkgPT4ge1xuICAgIC8vIFNvcnQgYWxsLWRheSBldmVudHMgKGlmIG5lZWRlZClcbiAgICBjb25zdCBzb3J0ZWRFdmVudHMgPSBbLi4uYWxsRGF5RXZlbnRzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICByZXR1cm4gYS5zdGFydC5kaWZmKGIuc3RhcnQpXG4gICAgfSlcblxuICAgIC8vIFRyYWNrIHBvc2l0aW9ucyBpbiByb3dzIGZvciBzdGFja2luZ1xuICAgIGNvbnN0IHJvd3M6IHsgZXZlbnQ6IENhbGVuZGFyRXZlbnQgfVtdW10gPSBbXVxuICAgIGNvbnN0IHByb2Nlc3NlZEV2ZW50czogUHJvY2Vzc2VkQ2FsZW5kYXJFdmVudFtdID0gW11cblxuICAgIHNvcnRlZEV2ZW50cy5mb3JFYWNoKChldmVudCwgcm93SW5kZXgpID0+IHtcbiAgICAgIGxldCBwbGFjZWQgPSBmYWxzZVxuXG4gICAgICB3aGlsZSAoIXBsYWNlZCkge1xuICAgICAgICBpZiAocm93SW5kZXggPj0gcm93cy5sZW5ndGgpIHtcbiAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcm93IGlmIG5lZWRlZFxuICAgICAgICAgIHJvd3MucHVzaChbXSlcbiAgICAgICAgICBwbGFjZWQgPSB0cnVlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gSW4gZGF5IHZpZXcsIHdlIGNhbiBwbGFjZSBvbmUgZXZlbnQgcGVyIHJvdyBhcyB0aGV5IGRvbid0IG92ZXJsYXAgaG9yaXpvbnRhbGx5XG4gICAgICAgICAgLy8gVGhpcyBpcyBzaW1wbGVyIHRoYW4gd2VlayB2aWV3IHdoZXJlIHdlIG5lZWRlZCB0byBjaGVjayBmb3Igb3ZlcmxhcHNcbiAgICAgICAgICBwbGFjZWQgPSB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gQWRkIGV2ZW50IHRvIHRoZSByb3dcbiAgICAgIHJvd3Nbcm93SW5kZXhdLnB1c2goeyBldmVudCB9KVxuXG4gICAgICAvLyBBZGQgcHJvY2Vzc2VkIGV2ZW50IHdpdGggY29ycmVjdCBwb3NpdGlvbmluZ1xuICAgICAgcHJvY2Vzc2VkRXZlbnRzLnB1c2goe1xuICAgICAgICAuLi5ldmVudCxcbiAgICAgICAgbGVmdDogMCxcbiAgICAgICAgd2lkdGg6IDEwMCxcbiAgICAgICAgdG9wOiByb3dJbmRleCAqIEVWRU5UX0JBUl9IRUlHSFQsXG4gICAgICAgIGhlaWdodDogRVZFTlRfQkFSX0hFSUdIVCxcbiAgICAgICAgYWxsRGF5OiB0cnVlLFxuICAgICAgfSlcbiAgICB9KVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2Nlc3NlZEFsbERheUV2ZW50czogcHJvY2Vzc2VkRXZlbnRzLFxuICAgICAgYWxsRGF5Um93c0NvdW50OiBNYXRoLm1heCgxLCByb3dzLmxlbmd0aCksIC8vIEF0IGxlYXN0IDEgcm93LCBldmVuIGlmIGVtcHR5XG4gICAgfVxuICB9LCBbYWxsRGF5RXZlbnRzXSlcblxuICByZXR1cm4gKFxuICAgIDxkaXZcbiAgICAgIGRhdGEtdGVzdGlkPVwiZGF5LWFsbC1kYXktcm93XCJcbiAgICAgIGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTggYm9yZGVyLWIgYm9yZGVyLXhcIlxuICAgID5cbiAgICAgIHsvKiBMZWZ0IGxhYmVsIGZvciBhbGwtZGF5IGV2ZW50cyAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNwYW4tMiBmbGV4IHNocmluay0wIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZCBib3JkZXItciBwci0yIG1kOmNvbC1zcGFuLTFcIj5cbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1tdXRlZC1mb3JlZ3JvdW5kIHRleHQtWzEwcHhdIHdoaXRlc3BhY2Utbm93cmFwIHNtOnRleHQteHNcIj5cbiAgICAgICAgICBBbGwtZGF5XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICB7LyogQWxsLWRheSBldmVudHMgY29udGFpbmVyIHdpdGggZHluYW1pYyBoZWlnaHQgKi99XG4gICAgICA8ZGl2IGNsYXNzTmFtZT1cInJlbGF0aXZlIGNvbC1zcGFuLTYgbWQ6Y29sLXNwYW4tNyBcIj5cbiAgICAgICAgPERyb3BwYWJsZUNlbGxcbiAgICAgICAgICBpZD17YGFsbC1kYXktJHtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgICAgIHR5cGU9XCJkYXktY2VsbFwiXG4gICAgICAgICAgZGF0ZT17Y3VycmVudERhdGV9XG4gICAgICAgICAgY2xhc3NOYW1lPVwiaG92ZXI6YmctYWNjZW50IHctZnVsbCBjdXJzb3ItcG9pbnRlciBtaW4taC0xMCBmbGV4IGZsZXgtY29sXCJcbiAgICAgICAgPlxuICAgICAgICAgIHtwcm9jZXNzZWRBbGxEYXlFdmVudHMubWFwKChldmVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBrZXk9e2BhbGwtZGF5LSR7ZXZlbnQuaWR9LSR7aW5kZXh9YH1cbiAgICAgICAgICAgICAgICBzdHlsZT17eyBoZWlnaHQ6IEVWRU5UX0JBUl9IRUlHSFQgKyAncHgnIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8RHJhZ2dhYmxlRXZlbnRcbiAgICAgICAgICAgICAgICAgIGVsZW1lbnRJZD17YGFsbC1kYXktJHtldmVudC5pZH0tJHtpbmRleH1gfVxuICAgICAgICAgICAgICAgICAgZXZlbnQ9e2V2ZW50fVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwib3ZlcmZsb3ctY2xpcCB0ZXh0LXhzXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPXt7IHdpZHRoOiBgY2FsYygxMDAlIC0gdmFyKC0tc3BhY2luZykgKiAyKWAgfX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIClcbiAgICAgICAgICB9KX1cbiAgICAgICAgPC9Ecm9wcGFibGVDZWxsPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsCiAgICAiaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHsgQW5pbWF0ZVByZXNlbmNlLCBtb3Rpb24gfSBmcm9tICdtb3Rpb24vcmVhY3QnXG5pbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuXG5leHBvcnQgY29uc3QgRGF5SGVhZGVyID0gKCkgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREYXRlLCBzdGlja3lWaWV3SGVhZGVyLCB2aWV3SGVhZGVyQ2xhc3NOYW1lIH0gPVxuICAgIHVzZUNhbGVuZGFyQ29udGV4dCgpXG4gIGNvbnN0IGlzVG9kYXkgPSBjdXJyZW50RGF0ZS5pc1NhbWUoZGF5anMoKSwgJ2RheScpXG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2XG4gICAgICBkYXRhLXRlc3RpZD1cImRheS1oZWFkZXJcIlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgJ2ZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyIGJvcmRlci1iIHAtMiBib3JkZXIteCcsXG4gICAgICAgIHN0aWNreVZpZXdIZWFkZXIgJiYgJ3N0aWNreSB0b3AtMCB6LTEwMCcsXG4gICAgICAgIHZpZXdIZWFkZXJDbGFzc05hbWVcbiAgICAgICl9XG4gICAgPlxuICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICA8bW90aW9uLmRpdlxuICAgICAgICAgIGtleT17Y3VycmVudERhdGUuZm9ybWF0KCdZWVlZLU1NLUREJyl9XG4gICAgICAgICAgaW5pdGlhbD17eyBvcGFjaXR5OiAwLCB5OiAtMTAgfX1cbiAgICAgICAgICBhbmltYXRlPXt7IG9wYWNpdHk6IDEsIHk6IDAgfX1cbiAgICAgICAgICBleGl0PXt7IG9wYWNpdHk6IDAsIHk6IC0xMCB9fVxuICAgICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuMjUsIGVhc2U6ICdlYXNlSW5PdXQnIH19XG4gICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICdmbGV4IGl0ZW1zLWNlbnRlciB0ZXh0LWNlbnRlciB0ZXh0LWJhc2UgZm9udC1zZW1pYm9sZCBzbTp0ZXh0LXhsJyxcbiAgICAgICAgICAgIGlzVG9kYXkgJiYgJ3RleHQtcHJpbWFyeSdcbiAgICAgICAgICApfVxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwieHM6aW5saW5lIGhpZGRlblwiPlxuICAgICAgICAgICAge2N1cnJlbnREYXRlLmZvcm1hdCgnZGRkZCwgJyl9XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIHtjdXJyZW50RGF0ZS5mb3JtYXQoJ01NTU0gRCwgWVlZWScpfVxuICAgICAgICAgIHtpc1RvZGF5ICYmIChcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImJnLXByaW1hcnkgdGV4dC1wcmltYXJ5LWZvcmVncm91bmQgbWwtMiByb3VuZGVkLWZ1bGwgcHgtMSBweS0wLjUgdGV4dC14cyBzbTpweC0yIHNtOnRleHQtc21cIj5cbiAgICAgICAgICAgICAgVG9kYXlcbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICApfVxuICAgICAgICA8L21vdGlvbi5kaXY+XG4gICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cbiAgICA8L2Rpdj5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuXG4vLyBIb3VycyB0byBkaXNwbGF5IChhbGwgMjQgaG91cnMgb2YgdGhlIGRheSlcbmNvbnN0IGhvdXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMjQgfSwgKF8sIGkpID0+IGkpLm1hcCgoaG91cikgPT4ge1xuICByZXR1cm4gZGF5anMoKS5ob3VyKGhvdXIpLm1pbnV0ZSgwKVxufSlcblxuaW50ZXJmYWNlIERheVRpbWVDb2xQcm9wcyB7XG4gIGNsYXNzTmFtZT86IHN0cmluZ1xufVxuXG5leHBvcnQgY29uc3QgRGF5VGltZUNvbDogUmVhY3QuRkM8RGF5VGltZUNvbFByb3BzPiA9ICh7IGNsYXNzTmFtZSB9KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgZGF0YS10ZXN0aWQ9XCJkYXktdGltZS1jb2xcIlxuICAgICAgY2xhc3NOYW1lPXtgY29sLXNwYW4tMiBoLWZ1bGwgbWQ6Y29sLXNwYW4tMSAke2NsYXNzTmFtZX1gfVxuICAgID5cbiAgICAgIHtob3Vycy5tYXAoKHRpbWUpID0+IChcbiAgICAgICAgPGRpdlxuICAgICAgICAgIGtleT17dGltZS5mb3JtYXQoJ0hIOm1tJyl9XG4gICAgICAgICAgZGF0YS10ZXN0aWQ9e2BkYXktdGltZS1ob3VyLSR7dGltZS5mb3JtYXQoJ0hIJyl9YH1cbiAgICAgICAgICBjbGFzc05hbWU9XCJoLVs2MHB4XSBib3JkZXItYiB0ZXh0LXJpZ2h0XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cInRleHQtbXV0ZWQtZm9yZWdyb3VuZCBwci0yIHRleHQtcmlnaHQgdGV4dC1bMTBweF0gc206dGV4dC14c1wiPlxuICAgICAgICAgICAge3RpbWUuZm9ybWF0KCdoIEEnKX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKSl9XG4gICAgPC9kaXY+XG4gIClcbn1cbiIsCiAgICAiaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5cbmltcG9ydCB7XG4gIEJ1dHRvbixcbiAgQ2hlY2tib3gsXG4gIERhdGVQaWNrZXIsXG4gIERpYWxvZyxcbiAgRGlhbG9nQ29udGVudCxcbiAgRGlhbG9nRGVzY3JpcHRpb24sXG4gIERpYWxvZ0Zvb3RlcixcbiAgRGlhbG9nSGVhZGVyLFxuICBEaWFsb2dUaXRsZSxcbiAgSW5wdXQsXG4gIExhYmVsLFxuICBUb29sdGlwLFxuICBUb29sdGlwQ29udGVudCxcbiAgVG9vbHRpcFByb3ZpZGVyLFxuICBUb29sdGlwVHJpZ2dlcixcbn0gZnJvbSAnQC9jb21wb25lbnRzL3VpJ1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcblxuY29uc3QgY29sb3JPcHRpb25zID0gW1xuICB7IHZhbHVlOiAnYmctYmx1ZS0xMDAgdGV4dC1ibHVlLTgwMCcsIGxhYmVsOiAnQmx1ZScgfSxcbiAgeyB2YWx1ZTogJ2JnLWdyZWVuLTEwMCB0ZXh0LWdyZWVuLTgwMCcsIGxhYmVsOiAnR3JlZW4nIH0sXG4gIHsgdmFsdWU6ICdiZy1wdXJwbGUtMTAwIHRleHQtcHVycGxlLTgwMCcsIGxhYmVsOiAnUHVycGxlJyB9LFxuICB7IHZhbHVlOiAnYmctcmVkLTEwMCB0ZXh0LXJlZC04MDAnLCBsYWJlbDogJ1JlZCcgfSxcbiAgeyB2YWx1ZTogJ2JnLXllbGxvdy0xMDAgdGV4dC15ZWxsb3ctODAwJywgbGFiZWw6ICdZZWxsb3cnIH0sXG4gIHsgdmFsdWU6ICdiZy1waW5rLTEwMCB0ZXh0LXBpbmstODAwJywgbGFiZWw6ICdQaW5rJyB9LFxuICB7IHZhbHVlOiAnYmctaW5kaWdvLTEwMCB0ZXh0LWluZGlnby04MDAnLCBsYWJlbDogJ0luZGlnbycgfSxcbiAgeyB2YWx1ZTogJ2JnLWFtYmVyLTEwMCB0ZXh0LWFtYmVyLTgwMCcsIGxhYmVsOiAnQW1iZXInIH0sXG4gIHsgdmFsdWU6ICdiZy1lbWVyYWxkLTEwMCB0ZXh0LWVtZXJhbGQtODAwJywgbGFiZWw6ICdFbWVyYWxkJyB9LFxuICB7IHZhbHVlOiAnYmctc2t5LTEwMCB0ZXh0LXNreS04MDAnLCBsYWJlbDogJ1NreScgfSxcbiAgeyB2YWx1ZTogJ2JnLXZpb2xldC0xMDAgdGV4dC12aW9sZXQtODAwJywgbGFiZWw6ICdWaW9sZXQnIH0sXG4gIHsgdmFsdWU6ICdiZy1yb3NlLTEwMCB0ZXh0LXJvc2UtODAwJywgbGFiZWw6ICdSb3NlJyB9LFxuICB7IHZhbHVlOiAnYmctdGVhbC0xMDAgdGV4dC10ZWFsLTgwMCcsIGxhYmVsOiAnVGVhbCcgfSxcbiAgeyB2YWx1ZTogJ2JnLW9yYW5nZS0xMDAgdGV4dC1vcmFuZ2UtODAwJywgbGFiZWw6ICdPcmFuZ2UnIH0sXG5dXG5cbmludGVyZmFjZSBFdmVudEZvcm1Qcm9wcyB7XG4gIHNlbGVjdGVkRXZlbnQ/OiBDYWxlbmRhckV2ZW50IHwgbnVsbFxuICBzZWxlY3RlZERhdGU/OiBkYXlqcy5EYXlqcyB8IG51bGxcbiAgb25BZGQ/OiAoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHZvaWRcbiAgb25VcGRhdGU/OiAoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHZvaWRcbiAgb25EZWxldGU/OiAoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHZvaWRcbiAgb25DbG9zZTogKCkgPT4gdm9pZFxufVxuXG5leHBvcnQgY29uc3QgRXZlbnRGb3JtOiBSZWFjdC5GQzxFdmVudEZvcm1Qcm9wcz4gPSAoe1xuICBzZWxlY3RlZEV2ZW50LFxuICBzZWxlY3RlZERhdGUsXG4gIG9uQ2xvc2UsXG4gIG9uVXBkYXRlLFxuICBvbkRlbGV0ZSxcbiAgb25BZGQsXG59KSA9PiB7XG4gIGNvbnN0IHN0YXJ0ID0gc2VsZWN0ZWRFdmVudD8ub3JpZ2luYWxTdGFydCA/PyBzZWxlY3RlZEV2ZW50Py5zdGFydFxuICBjb25zdCBlbmQgPSBzZWxlY3RlZEV2ZW50Py5vcmlnaW5hbEVuZCA/PyBzZWxlY3RlZEV2ZW50Py5lbmRcblxuICAvLyBGb3JtIGRlZmF1bHQgdmFsdWVzXG4gIGNvbnN0IGRlZmF1bHRTdGFydERhdGUgPSBzZWxlY3RlZERhdGU/LnRvRGF0ZSgpIHx8IG5ldyBEYXRlKClcbiAgY29uc3QgZGVmYXVsdEVuZERhdGUgPVxuICAgIHNlbGVjdGVkRGF0ZT8uYWRkKDEsICdob3VyJykudG9EYXRlKCkgfHwgZGF5anMoKS5hZGQoMSwgJ2hvdXInKS50b0RhdGUoKVxuXG4gIC8vIEZvcm0gc3RhdGVcbiAgY29uc3QgW3N0YXJ0RGF0ZSwgc2V0U3RhcnREYXRlXSA9IHVzZVN0YXRlKFxuICAgIHN0YXJ0Py50b0RhdGUoKSB8fCBkZWZhdWx0U3RhcnREYXRlXG4gIClcbiAgY29uc3QgW2VuZERhdGUsIHNldEVuZERhdGVdID0gdXNlU3RhdGUoZW5kPy50b0RhdGUoKSB8fCBkZWZhdWx0RW5kRGF0ZSlcbiAgY29uc3QgW2lzQWxsRGF5LCBzZXRJc0FsbERheV0gPSB1c2VTdGF0ZShzZWxlY3RlZEV2ZW50Py5hbGxEYXkgfHwgZmFsc2UpXG4gIGNvbnN0IFtzZWxlY3RlZENvbG9yLCBzZXRTZWxlY3RlZENvbG9yXSA9IHVzZVN0YXRlKFxuICAgIHNlbGVjdGVkRXZlbnQ/LmNvbG9yIHx8IGNvbG9yT3B0aW9uc1swXS52YWx1ZVxuICApXG5cbiAgLy8gVGltZSBzdGF0ZVxuICBjb25zdCBbc3RhcnRUaW1lLCBzZXRTdGFydFRpbWVdID0gdXNlU3RhdGUoXG4gICAgc2VsZWN0ZWRFdmVudFxuICAgICAgPyBzZWxlY3RlZEV2ZW50LnN0YXJ0LmZvcm1hdCgnSEg6bW0nKVxuICAgICAgOiBkYXlqcyhkZWZhdWx0U3RhcnREYXRlKS5mb3JtYXQoJ0hIOm1tJylcbiAgKVxuICBjb25zdCBbZW5kVGltZSwgc2V0RW5kVGltZV0gPSB1c2VTdGF0ZShcbiAgICBzZWxlY3RlZEV2ZW50XG4gICAgICA/IHNlbGVjdGVkRXZlbnQuZW5kLmZvcm1hdCgnSEg6bW0nKVxuICAgICAgOiBkYXlqcyhkZWZhdWx0RW5kRGF0ZSkuZm9ybWF0KCdISDptbScpXG4gIClcblxuICAvLyBJbml0aWFsaXplIGZvcm0gdmFsdWVzIGZyb20gc2VsZWN0ZWQgZXZlbnQgb3IgZGVmYXVsdHNcbiAgY29uc3QgW2Zvcm1WYWx1ZXMsIHNldEZvcm1WYWx1ZXNdID0gdXNlU3RhdGUoe1xuICAgIHRpdGxlOiBzZWxlY3RlZEV2ZW50Py50aXRsZSB8fCAnJyxcbiAgICBkZXNjcmlwdGlvbjogc2VsZWN0ZWRFdmVudD8uZGVzY3JpcHRpb24gfHwgJycsXG4gICAgbG9jYXRpb246IHNlbGVjdGVkRXZlbnQ/LmxvY2F0aW9uIHx8ICcnLFxuICB9KVxuXG4gIC8vIENyZWF0ZSB3cmFwcGVyIGZ1bmN0aW9ucyB0byBmaXggVHlwZVNjcmlwdCBlcnJvcnMgd2l0aCBEYXRlUGlja2VyXG4gIGNvbnN0IGhhbmRsZVN0YXJ0RGF0ZUNoYW5nZSA9IChkYXRlOiBEYXRlIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKGRhdGUpIHNldFN0YXJ0RGF0ZShkYXRlKVxuICB9XG5cbiAgY29uc3QgaGFuZGxlRW5kRGF0ZUNoYW5nZSA9IChkYXRlOiBEYXRlIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKGRhdGUpIHNldEVuZERhdGUoZGF0ZSlcbiAgfVxuXG4gIC8vIFVwZGF0ZSBmb3JtIHZhbHVlcyB3aGVuIGlucHV0IGNoYW5nZXNcbiAgY29uc3QgaGFuZGxlSW5wdXRDaGFuZ2UgPSAoXG4gICAgZTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudCB8IEhUTUxUZXh0QXJlYUVsZW1lbnQ+XG4gICkgPT4ge1xuICAgIGNvbnN0IHsgbmFtZSwgdmFsdWUgfSA9IGUudGFyZ2V0XG4gICAgc2V0Rm9ybVZhbHVlcygocHJldikgPT4gKHsgLi4ucHJldiwgW25hbWVdOiB2YWx1ZSB9KSlcbiAgfVxuXG4gIC8vIEhhbmRsZSB0aW1lIGNoYW5nZXNcbiAgY29uc3QgaGFuZGxlVGltZUNoYW5nZSA9IChcbiAgICBlOiBSZWFjdC5DaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PixcbiAgICBpc1N0YXJ0OiBib29sZWFuXG4gICkgPT4ge1xuICAgIGNvbnN0IHRpbWVWYWx1ZSA9IGUudGFyZ2V0LnZhbHVlXG4gICAgaWYgKGlzU3RhcnQpIHtcbiAgICAgIHNldFN0YXJ0VGltZSh0aW1lVmFsdWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEVuZFRpbWUodGltZVZhbHVlKVxuICAgIH1cbiAgfVxuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgLy8gUmVzZXQgZW5kIHRpbWUgd2hlbiBhbGwgZGF5IGlzIHRvZ2dsZWQgdG8gb25cbiAgICBpZiAoaXNBbGxEYXkpIHtcbiAgICAgIHNldEVuZFRpbWUoJzIzOjU5JylcbiAgICB9XG4gIH0sIFtpc0FsbERheV0pXG5cbiAgLy8gSGFuZGxlIGZvcm0gc3VibWlzc2lvblxuICBjb25zdCBoYW5kbGVTdWJtaXQgPSAoZTogUmVhY3QuRm9ybUV2ZW50KSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpXG5cbiAgICAvLyBDcmVhdGUgZnVsbCBkYXRldGltZSBvYmplY3RzIGJ5IGNvbWJpbmluZyBkYXRlIGFuZCB0aW1lXG4gICAgY29uc3QgW3N0YXJ0SG91cnMsIHN0YXJ0TWludXRlc10gPSBzdGFydFRpbWUuc3BsaXQoJzonKS5tYXAoTnVtYmVyKVxuICAgIGNvbnN0IFtlbmRIb3VycywgZW5kTWludXRlc10gPSBlbmRUaW1lLnNwbGl0KCc6JykubWFwKE51bWJlcilcblxuICAgIGxldCBzdGFydERhdGVUaW1lID0gZGF5anMoc3RhcnREYXRlKS5ob3VyKHN0YXJ0SG91cnMpLm1pbnV0ZShzdGFydE1pbnV0ZXMpXG5cbiAgICBsZXQgZW5kRGF0ZVRpbWUgPSBkYXlqcyhlbmREYXRlKS5ob3VyKGVuZEhvdXJzKS5taW51dGUoZW5kTWludXRlcylcblxuICAgIC8vIEZvciBhbGwtZGF5IGV2ZW50cywgc2V0IGFwcHJvcHJpYXRlIHRpbWVzXG4gICAgaWYgKGlzQWxsRGF5KSB7XG4gICAgICBzdGFydERhdGVUaW1lID0gc3RhcnREYXRlVGltZS5ob3VyKDApLm1pbnV0ZSgwKVxuICAgICAgZW5kRGF0ZVRpbWUgPSBlbmREYXRlVGltZS5ob3VyKDIzKS5taW51dGUoNTkpXG4gICAgfVxuXG4gICAgY29uc3QgZXZlbnREYXRhOiBDYWxlbmRhckV2ZW50ID0ge1xuICAgICAgaWQ6IHNlbGVjdGVkRXZlbnQ/LmlkIHx8IGRheWpzKCkuZm9ybWF0KCdZWVlZTU1EREhIbW1zcycpLFxuICAgICAgdGl0bGU6IGZvcm1WYWx1ZXMudGl0bGUsXG4gICAgICBzdGFydDogc3RhcnREYXRlVGltZSxcbiAgICAgIGVuZDogZW5kRGF0ZVRpbWUsXG4gICAgICBkZXNjcmlwdGlvbjogZm9ybVZhbHVlcy5kZXNjcmlwdGlvbixcbiAgICAgIGxvY2F0aW9uOiBmb3JtVmFsdWVzLmxvY2F0aW9uLFxuICAgICAgYWxsRGF5OiBpc0FsbERheSxcbiAgICAgIGNvbG9yOiBzZWxlY3RlZENvbG9yLFxuICAgIH1cblxuICAgIGlmIChzZWxlY3RlZEV2ZW50LmlkKSB7XG4gICAgICBvblVwZGF0ZT8uKGV2ZW50RGF0YSlcbiAgICB9IGVsc2Uge1xuICAgICAgb25BZGQ/LihldmVudERhdGEpXG4gICAgfVxuXG4gICAgb25DbG9zZSgpXG4gIH1cblxuICBjb25zdCBoYW5kbGVEZWxldGUgPSAoKSA9PiB7XG4gICAgaWYgKHNlbGVjdGVkRXZlbnQuaWQpIHtcbiAgICAgIG9uRGVsZXRlPy4oc2VsZWN0ZWRFdmVudClcbiAgICAgIG9uQ2xvc2UoKVxuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGVuZCBkYXRlIGlzIG5vdCBiZWZvcmUgc3RhcnQgZGF0ZVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChkYXlqcyhzdGFydERhdGUpLmlzQWZ0ZXIoZGF5anMoZW5kRGF0ZSkpKSB7XG4gICAgICBzZXRFbmREYXRlKHN0YXJ0RGF0ZSlcbiAgICB9XG4gIH0sIFtzdGFydERhdGUsIGVuZERhdGVdKVxuXG4gIHJldHVybiAoXG4gICAgPERpYWxvZyBvcGVuPXt0cnVlfSBvbk9wZW5DaGFuZ2U9e29uQ2xvc2V9PlxuICAgICAgPERpYWxvZ0NvbnRlbnQgY2xhc3NOYW1lPVwidy1bOTB2d10gbWF4LXctWzUwMHB4XSBwLTQgc206cC02XCI+XG4gICAgICAgIDxmb3JtIG9uU3VibWl0PXtoYW5kbGVTdWJtaXR9PlxuICAgICAgICAgIDxEaWFsb2dIZWFkZXIgY2xhc3NOYW1lPVwibWItMiBzbTptYi00XCI+XG4gICAgICAgICAgICA8RGlhbG9nVGl0bGUgY2xhc3NOYW1lPVwidGV4dC1iYXNlIHNtOnRleHQtbGdcIj5cbiAgICAgICAgICAgICAge3NlbGVjdGVkRXZlbnQuaWQgPyAnRWRpdCBFdmVudCcgOiAnQ3JlYXRlIEV2ZW50J31cbiAgICAgICAgICAgIDwvRGlhbG9nVGl0bGU+XG4gICAgICAgICAgICA8RGlhbG9nRGVzY3JpcHRpb24gY2xhc3NOYW1lPVwidGV4dC14cyBzbTp0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgIHtzZWxlY3RlZEV2ZW50LmlkXG4gICAgICAgICAgICAgICAgPyAnRWRpdCB5b3VyIGV2ZW50IGRldGFpbHMnXG4gICAgICAgICAgICAgICAgOiAnQWRkIGEgbmV3IGV2ZW50IHRvIHlvdXIgY2FsZW5kYXInfVxuICAgICAgICAgICAgPC9EaWFsb2dEZXNjcmlwdGlvbj5cbiAgICAgICAgICA8L0RpYWxvZ0hlYWRlcj5cblxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtMyBweS0yIHNtOmdhcC00IHNtOnB5LTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZ3JpZCBnYXAtMlwiPlxuICAgICAgICAgICAgICA8TGFiZWwgaHRtbEZvcj1cInRpdGxlXCIgY2xhc3NOYW1lPVwidGV4dC14cyBzbTp0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgVGl0bGVcbiAgICAgICAgICAgICAgPC9MYWJlbD5cbiAgICAgICAgICAgICAgPElucHV0XG4gICAgICAgICAgICAgICAgaWQ9XCJ0aXRsZVwiXG4gICAgICAgICAgICAgICAgbmFtZT1cInRpdGxlXCJcbiAgICAgICAgICAgICAgICB2YWx1ZT17Zm9ybVZhbHVlcy50aXRsZX1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17aGFuZGxlSW5wdXRDaGFuZ2V9XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJFdmVudCB0aXRsZVwiXG4gICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICBhdXRvRm9jdXNcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJoLTggdGV4dC1zbSBzbTpoLTlcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgc3BhY2UteC0yXCI+XG4gICAgICAgICAgICAgIDxDaGVja2JveFxuICAgICAgICAgICAgICAgIGlkPVwiYWxsRGF5XCJcbiAgICAgICAgICAgICAgICBjaGVja2VkPXtpc0FsbERheX1cbiAgICAgICAgICAgICAgICBvbkNoZWNrZWRDaGFuZ2U9eyhjaGVja2VkKSA9PiBzZXRJc0FsbERheShjaGVja2VkID09PSB0cnVlKX1cbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPExhYmVsIGh0bWxGb3I9XCJhbGxEYXlcIiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj5cbiAgICAgICAgICAgICAgICBBbGwgZGF5XG4gICAgICAgICAgICAgIDwvTGFiZWw+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdyaWQtY29scy0yIGdhcC0yIHNtOmdhcC00XCI+XG4gICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPExhYmVsIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbVwiPlN0YXJ0IERhdGU8L0xhYmVsPlxuICAgICAgICAgICAgICAgIDxEYXRlUGlja2VyXG4gICAgICAgICAgICAgICAgICBkYXRlPXtzdGFydERhdGV9XG4gICAgICAgICAgICAgICAgICBzZXREYXRlPXtoYW5kbGVTdGFydERhdGVDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJtdC0xXCJcbiAgICAgICAgICAgICAgICAgIGNsb3NlT25TZWxlY3RcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8TGFiZWwgY2xhc3NOYW1lPVwidGV4dC14cyBzbTp0ZXh0LXNtXCI+RW5kIERhdGU8L0xhYmVsPlxuICAgICAgICAgICAgICAgIDxEYXRlUGlja2VyXG4gICAgICAgICAgICAgICAgICBkYXRlPXtlbmREYXRlfVxuICAgICAgICAgICAgICAgICAgc2V0RGF0ZT17aGFuZGxlRW5kRGF0ZUNoYW5nZX1cbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTFcIlxuICAgICAgICAgICAgICAgICAgY2xvc2VPblNlbGVjdFxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIHshaXNBbGxEYXkgJiYgKFxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ3JpZC1jb2xzLTIgZ2FwLTIgc206Z2FwLTRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgPExhYmVsIGh0bWxGb3I9XCJzdGFydC10aW1lXCIgY2xhc3NOYW1lPVwidGV4dC14cyBzbTp0ZXh0LXNtXCI+XG4gICAgICAgICAgICAgICAgICAgIFN0YXJ0IFRpbWVcbiAgICAgICAgICAgICAgICAgIDwvTGFiZWw+XG4gICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJzdGFydC10aW1lXCJcbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRpbWVcIlxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17c3RhcnRUaW1lfVxuICAgICAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IGhhbmRsZVRpbWVDaGFuZ2UoZSwgdHJ1ZSl9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTEgaC04IHRleHQtc20gc206aC05XCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgIDxMYWJlbCBodG1sRm9yPVwiZW5kLXRpbWVcIiBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj5cbiAgICAgICAgICAgICAgICAgICAgRW5kIFRpbWVcbiAgICAgICAgICAgICAgICAgIDwvTGFiZWw+XG4gICAgICAgICAgICAgICAgICA8SW5wdXRcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJlbmQtdGltZVwiXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0aW1lXCJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU9e2VuZFRpbWV9XG4gICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gaGFuZGxlVGltZUNoYW5nZShlLCBmYWxzZSl9XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm10LTEgaC04IHRleHQtc20gc206aC05XCJcbiAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJncmlkIGdhcC0xIHNtOmdhcC0yXCI+XG4gICAgICAgICAgICAgIDxMYWJlbCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj5Db2xvcjwvTGFiZWw+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBmbGV4LXdyYXAgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICA8VG9vbHRpcFByb3ZpZGVyPlxuICAgICAgICAgICAgICAgICAge2NvbG9yT3B0aW9ucy5tYXAoKGNvbG9yKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDxUb29sdGlwIGtleT17Y29sb3IudmFsdWV9PlxuICAgICAgICAgICAgICAgICAgICAgIDxUb29sdGlwVHJpZ2dlciBhc0NoaWxkPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICBrZXk9e2NvbG9yLnZhbHVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtjb2xvci52YWx1ZX0gaC02IHctNiByb3VuZGVkLWZ1bGwgc206aC04IHNtOnctOGAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb2xvciA9PT0gY29sb3IudmFsdWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyaW5nLTIgcmluZy1ibGFjayByaW5nLW9mZnNldC0xIHNtOnJpbmctb2Zmc2V0LTInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFNlbGVjdGVkQ29sb3IoY29sb3IudmFsdWUpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPXtjb2xvci5sYWJlbH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9Ub29sdGlwVHJpZ2dlcj5cbiAgICAgICAgICAgICAgICAgICAgICA8VG9vbHRpcENvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJ0ZXh0LXhzIHNtOnRleHQtc21cIj57Y29sb3IubGFiZWx9PC9wPlxuICAgICAgICAgICAgICAgICAgICAgIDwvVG9vbHRpcENvbnRlbnQ+XG4gICAgICAgICAgICAgICAgICAgIDwvVG9vbHRpcD5cbiAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgIDwvVG9vbHRpcFByb3ZpZGVyPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTEgc206Z2FwLTJcIj5cbiAgICAgICAgICAgICAgPExhYmVsIGh0bWxGb3I9XCJsb2NhdGlvblwiIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgIExvY2F0aW9uXG4gICAgICAgICAgICAgIDwvTGFiZWw+XG4gICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgIGlkPVwibG9jYXRpb25cIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJsb2NhdGlvblwiXG4gICAgICAgICAgICAgICAgdmFsdWU9e2Zvcm1WYWx1ZXMubG9jYXRpb259XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRXZlbnQgbG9jYXRpb24gKG9wdGlvbmFsKVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC04IHRleHQtc20gc206aC05XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImdyaWQgZ2FwLTEgc206Z2FwLTJcIj5cbiAgICAgICAgICAgICAgPExhYmVsIGh0bWxGb3I9XCJkZXNjcmlwdGlvblwiIGNsYXNzTmFtZT1cInRleHQteHMgc206dGV4dC1zbVwiPlxuICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uXG4gICAgICAgICAgICAgIDwvTGFiZWw+XG4gICAgICAgICAgICAgIDxJbnB1dFxuICAgICAgICAgICAgICAgIGlkPVwiZGVzY3JpcHRpb25cIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgICAgICAgICAgdmFsdWU9e2Zvcm1WYWx1ZXMuZGVzY3JpcHRpb259XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9e2hhbmRsZUlucHV0Q2hhbmdlfVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRXZlbnQgZGVzY3JpcHRpb24gKG9wdGlvbmFsKVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiaC04IHRleHQtc20gc206aC05XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPERpYWxvZ0Zvb3RlciBjbGFzc05hbWU9XCJtdC0yIGZsZXggZmxleC1jb2wtcmV2ZXJzZSBnYXAtMiBzbTptdC00IHNtOmZsZXgtcm93IHNtOmdhcC0wXCI+XG4gICAgICAgICAgICB7c2VsZWN0ZWRFdmVudC5pZCAmJiAoXG4gICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICB2YXJpYW50PVwiZGVzdHJ1Y3RpdmVcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2hhbmRsZURlbGV0ZX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJ3LWZ1bGwgc206bXItYXV0byBzbTp3LWF1dG9cIlxuICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBEZWxldGVcbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHctZnVsbCBnYXAtMiBzbTp3LWF1dG9cIj5cbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgIHZhcmlhbnQ9XCJvdXRsaW5lXCJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtvbkNsb3NlfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXgtMSBzbTpmbGV4LW5vbmVcIlxuICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICBDYW5jZWxcbiAgICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgICAgIDxCdXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzTmFtZT1cImZsZXgtMSBzbTpmbGV4LW5vbmVcIiBzaXplPVwic21cIj5cbiAgICAgICAgICAgICAgICB7c2VsZWN0ZWRFdmVudC5pZCA/ICdVcGRhdGUnIDogJ0NyZWF0ZSd9XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9EaWFsb2dGb290ZXI+XG4gICAgICAgIDwvZm9ybT5cbiAgICAgIDwvRGlhbG9nQ29udGVudD5cbiAgICA8L0RpYWxvZz5cbiAgKVxufVxuIiwKICAgICJpbXBvcnQge1xuICBCdXR0b24sXG4gIFBvcG92ZXIsXG4gIFBvcG92ZXJDb250ZW50LFxuICBQb3BvdmVyVHJpZ2dlcixcbn0gZnJvbSAnQC9jb21wb25lbnRzL3VpJ1xuaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgeyBDYWxlbmRhciBhcyBDYWxlbmRhckljb24sIE1lbnUsIFBsdXMgfSBmcm9tICdsdWNpZGUtcmVhY3QnXG5pbXBvcnQgUmVhY3QsIHsgdXNlQ2FsbGJhY2ssIHVzZVN0YXRlIH0gZnJvbSAncmVhY3QnXG5pbXBvcnQgVGl0bGVDb250ZW50IGZyb20gJy4vdGl0bGUtY29udGVudCdcbmltcG9ydCBWaWV3Q29udHJvbHMgZnJvbSAnLi92aWV3LWNvbnRyb2xzJ1xuXG50eXBlIEhlYWRlclByb3BzID0gb2JqZWN0XG5cbmNvbnN0IEhlYWRlcjogUmVhY3QuRkM8SGVhZGVyUHJvcHM+ID0gKCkgPT4ge1xuICBjb25zdCB7XG4gICAgY3VycmVudERhdGUsXG4gICAgdmlldyxcbiAgICBzZXRWaWV3LFxuICAgIG5leHRQZXJpb2QsXG4gICAgcHJldlBlcmlvZCxcbiAgICB0b2RheSxcbiAgICBvcGVuRXZlbnRGb3JtLFxuICAgIGhlYWRlckNvbXBvbmVudCxcbiAgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgLy8gU3RhdGUgZm9yIG1vYmlsZSBtZW51IHBvcG92ZXJcbiAgY29uc3QgW21vYmlsZVBvcG92ZXJPcGVuLCBzZXRNb2JpbGVQb3BvdmVyT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcblxuICAvLyBIYW5kbGUgdmlldyBjaGFuZ2Ugd2l0aCBvcHRpb25hbCBwb3BvdmVyIGNsb3NpbmdcbiAgY29uc3QgaGFuZGxlVmlld0NoYW5nZSA9IChcbiAgICBuZXdWaWV3OiAnZGF5JyB8ICd3ZWVrJyB8ICdtb250aCcgfCAneWVhcicsXG4gICAgY2xvc2VQb3BvdmVyID0gZmFsc2VcbiAgKSA9PiB7XG4gICAgc2V0VmlldyhuZXdWaWV3KVxuICAgIGlmIChjbG9zZVBvcG92ZXIpIHtcbiAgICAgIHNldE1vYmlsZVBvcG92ZXJPcGVuKGZhbHNlKVxuICAgIH1cbiAgfVxuXG4gIC8vIENhbGxiYWNrIGZvciBuYXZpZ2F0aW9uIHRoYXQgYWxzbyBjbG9zZXMgdGhlIG1vYmlsZSBwb3BvdmVyXG4gIGNvbnN0IGhhbmRsZU5hdmlnYXRpb24gPSB7XG4gICAgdG9kYXk6ICgpID0+IHtcbiAgICAgIHRvZGF5KClcbiAgICAgIHNldE1vYmlsZVBvcG92ZXJPcGVuKGZhbHNlKVxuICAgIH0sXG4gICAgcHJldmlvdXM6ICgpID0+IHtcbiAgICAgIHByZXZQZXJpb2QoKVxuICAgICAgc2V0TW9iaWxlUG9wb3Zlck9wZW4oZmFsc2UpXG4gICAgfSxcbiAgICBuZXh0OiAoKSA9PiB7XG4gICAgICBuZXh0UGVyaW9kKClcbiAgICAgIHNldE1vYmlsZVBvcG92ZXJPcGVuKGZhbHNlKVxuICAgIH0sXG4gIH1cblxuICBjb25zdCBOZXdFdmVudEJ1dHRvbiA9IHVzZUNhbGxiYWNrKFxuICAgICgpID0+IChcbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgPEJ1dHRvblxuICAgICAgICAgIG9uQ2xpY2s9eygpID0+IG9wZW5FdmVudEZvcm0oY3VycmVudERhdGUpfVxuICAgICAgICAgIHZhcmlhbnQ9XCJkZWZhdWx0XCJcbiAgICAgICAgICBzaXplPVwic21cIlxuICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxQbHVzIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cImhpZGRlbiBtZDppbmxpbmVcIj5OZXcgRXZlbnQ8L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWQ6aGlkZGVuXCI+TmV3PC9zcGFuPlxuICAgICAgICA8L0J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICksXG4gICAgW2N1cnJlbnREYXRlLCBvcGVuRXZlbnRGb3JtXVxuICApXG5cbiAgaWYgKGhlYWRlckNvbXBvbmVudCkge1xuICAgIC8vIFJlbmRlciBjdXN0b20gaGVhZGVyIGNvbXBvbmVudCBpZiBwcm92aWRlZFxuICAgIHJldHVybiBoZWFkZXJDb21wb25lbnRcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPD5cbiAgICAgIHsvKiBDYWxlbmRhciBIZWFkZXIgd2l0aCBncmlkIGxheW91dCAqL31cbiAgICAgIDxkaXYgY2xhc3NOYW1lPVwiQGNvbnRhaW5lciBncmlkIGdyaWQtY29scy0xMiBpdGVtcy1jZW50ZXIgZ2FwLTIgYm9yZGVyLWIgcC0yIHNtOnAtNFwiPlxuICAgICAgICB7LyogVGl0bGUgYXJlYSAtIExlZnQgc2VjdGlvbiAqL31cbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJjb2wtc3Bhbi0xMiBmbGV4IGZsZXgtd3JhcCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXIgZ2FwLTIgQDR4bDpjb2wtc3Bhbi01IEA0eGw6anVzdGlmeS1zdGFydFwiPlxuICAgICAgICAgIDxDYWxlbmRhckljb24gY2xhc3NOYW1lPVwiaC01IHctNVwiIC8+XG4gICAgICAgICAgPFRpdGxlQ29udGVudCAvPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICB7LyogTmV3IGV2ZW50IGJ1dHRvbiAtIE1vYmlsZSAmIERlc2t0b3AgKi99XG4gICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiY29sLXNwYW4tMTIgZmxleCBmbGV4LXdyYXAganVzdGlmeS1jZW50ZXIgZ2FwLTEgQDR4bDpjb2wtc3Bhbi03IEA0eGw6anVzdGlmeS1lbmRcIj5cbiAgICAgICAgICB7LyogRGVza3RvcCBjb250cm9scyAtIGNlbnRyYWxpemVkICovfVxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiaGlkZGVuIGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZCBnYXAtMSBzbTpmbGV4XCI+XG4gICAgICAgICAgICA8Vmlld0NvbnRyb2xzXG4gICAgICAgICAgICAgIGN1cnJlbnRWaWV3PXt2aWV3fVxuICAgICAgICAgICAgICBvbkNoYW5nZT17c2V0Vmlld31cbiAgICAgICAgICAgICAgb25Ub2RheT17dG9kYXl9XG4gICAgICAgICAgICAgIG9uTmV4dD17bmV4dFBlcmlvZH1cbiAgICAgICAgICAgICAgb25QcmV2aW91cz17cHJldlBlcmlvZH1cbiAgICAgICAgICAgICAgdmFyaWFudD1cImRlZmF1bHRcIlxuICAgICAgICAgICAgICBjbGFzc05hbWU9XCJqdXN0aWZ5LWVuZFwiXG4gICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICB7LyogTmV3IGV2ZW50IGJ1dHRvbiAtIERlc2t0b3AgKi99XG4gICAgICAgICAgICA8TmV3RXZlbnRCdXR0b24gLz5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIHsvKiBNb2JpbGUgbmF2aWdhdGlvbiBtZW51IGJ1dHRvbiAtIFJpZ2h0IGFsaWduZWQgKi99XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZCBnYXAtMSBzbTpoaWRkZW5cIj5cbiAgICAgICAgICAgIHsvKiBOZXcgZXZlbnQgYnV0dG9uIC0gTW9iaWxlICovfVxuICAgICAgICAgICAgPE5ld0V2ZW50QnV0dG9uIC8+XG5cbiAgICAgICAgICAgIDxQb3BvdmVyXG4gICAgICAgICAgICAgIG9wZW49e21vYmlsZVBvcG92ZXJPcGVufVxuICAgICAgICAgICAgICBvbk9wZW5DaGFuZ2U9e3NldE1vYmlsZVBvcG92ZXJPcGVufVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgICAgICA8QnV0dG9uIHZhcmlhbnQ9XCJvdXRsaW5lXCIgc2l6ZT1cInNtXCI+XG4gICAgICAgICAgICAgICAgICA8TWVudSBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgPC9Qb3BvdmVyVHJpZ2dlcj5cbiAgICAgICAgICAgICAgPFBvcG92ZXJDb250ZW50IGFsaWduPVwiZW5kXCIgY2xhc3NOYW1lPVwidy1bMjQwcHhdIHAtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwic3BhY2UteS0yXCI+XG4gICAgICAgICAgICAgICAgICA8aDMgY2xhc3NOYW1lPVwibWItMSB0ZXh0LXNtIGZvbnQtbWVkaXVtXCI+XG4gICAgICAgICAgICAgICAgICAgIFZpZXcgJiBOYXZpZ2F0aW9uXG4gICAgICAgICAgICAgICAgICA8L2gzPlxuICAgICAgICAgICAgICAgICAgPFZpZXdDb250cm9sc1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Vmlldz17dmlld31cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhuZXdWaWV3KSA9PiBoYW5kbGVWaWV3Q2hhbmdlKG5ld1ZpZXcsIHRydWUpfVxuICAgICAgICAgICAgICAgICAgICBvblRvZGF5PXtoYW5kbGVOYXZpZ2F0aW9uLnRvZGF5fVxuICAgICAgICAgICAgICAgICAgICBvbk5leHQ9e2hhbmRsZU5hdmlnYXRpb24ubmV4dH1cbiAgICAgICAgICAgICAgICAgICAgb25QcmV2aW91cz17aGFuZGxlTmF2aWdhdGlvbi5wcmV2aW91c31cbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImdyaWRcIlxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9Qb3BvdmVyQ29udGVudD5cbiAgICAgICAgICAgIDwvUG9wb3Zlcj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8Lz5cbiAgKVxufVxuXG5leHBvcnQgZGVmYXVsdCBIZWFkZXJcbiIsCiAgICAiaW1wb3J0IHtcbiAgQnV0dG9uLFxuICBQb3BvdmVyLFxuICBQb3BvdmVyQ29udGVudCxcbiAgUG9wb3ZlclRyaWdnZXIsXG59IGZyb20gJ0AvY29tcG9uZW50cy91aSdcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgY24gfSBmcm9tICdAL2xpYi91dGlscydcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCB7IENoZXZyb25Eb3duIH0gZnJvbSAnbHVjaWRlLXJlYWN0J1xuaW1wb3J0IHsgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCdcblxuLy8gQ3JlYXRlIGFycmF5cyBmb3IgbW9udGggYW5kIHllYXIgb3B0aW9uc1xuY29uc3QgbW9udGhzID0gW1xuICAnSmFudWFyeScsXG4gICdGZWJydWFyeScsXG4gICdNYXJjaCcsXG4gICdBcHJpbCcsXG4gICdNYXknLFxuICAnSnVuZScsXG4gICdKdWx5JyxcbiAgJ0F1Z3VzdCcsXG4gICdTZXB0ZW1iZXInLFxuICAnT2N0b2JlcicsXG4gICdOb3ZlbWJlcicsXG4gICdEZWNlbWJlcicsXG5dXG5cbi8vIEFuaW1hdGlvbiB2YXJpYW50cyBmb3IgbnVtYmVyIHRyYW5zaXRpb25zXG5jb25zdCBhbmltYXRpb25WYXJpYW50cyA9IHtcbiAgaW5pdGlhbDogeyBvcGFjaXR5OiAwLCB5OiAxMCB9LFxuICBhbmltYXRlOiB7IG9wYWNpdHk6IDEsIHk6IDAgfSxcbiAgZXhpdDogeyBvcGFjaXR5OiAwLCB5OiAtMTAgfSxcbn1cblxuY29uc3QgVGl0bGVDb250ZW50ID0gKCkgPT4ge1xuICBjb25zdCB7IGN1cnJlbnREYXRlLCB2aWV3LCBzZXRDdXJyZW50RGF0ZSB9ID0gdXNlQ2FsZW5kYXJDb250ZXh0KClcblxuICAvLyBTdGF0ZSBmb3IgbW9iaWxlIG1lbnUgYW5kIHBvcG92ZXJzXG4gIGNvbnN0IFttb250aFBvcG92ZXJPcGVuLCBzZXRNb250aFBvcG92ZXJPcGVuXSA9IHVzZVN0YXRlKGZhbHNlKVxuICBjb25zdCBbeWVhclBvcG92ZXJPcGVuLCBzZXRZZWFyUG9wb3Zlck9wZW5dID0gdXNlU3RhdGUoZmFsc2UpXG4gIGNvbnN0IFt3ZWVrUG9wb3Zlck9wZW4sIHNldFdlZWtQb3BvdmVyT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcbiAgY29uc3QgW2RheVBvcG92ZXJPcGVuLCBzZXREYXlQb3BvdmVyT3Blbl0gPSB1c2VTdGF0ZShmYWxzZSlcblxuICBjb25zdCBjdXJyZW50WWVhciA9IGN1cnJlbnREYXRlLnllYXIoKVxuICBjb25zdCB5ZWFycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDExIH0sIChfLCBpKSA9PiBjdXJyZW50WWVhciAtIDUgKyBpKVxuXG4gIC8vIEhhbmRsZSBtb250aCBhbmQgeWVhciBzZWxlY3Rpb25cbiAgY29uc3QgaGFuZGxlTW9udGhDaGFuZ2UgPSAobW9udGg6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG5ld0RhdGUgPSBjdXJyZW50RGF0ZS5tb250aChtb250aClcbiAgICBzZXRDdXJyZW50RGF0ZShuZXdEYXRlKVxuICAgIHNldE1vbnRoUG9wb3Zlck9wZW4oZmFsc2UpXG4gIH1cblxuICBjb25zdCBoYW5kbGVZZWFyQ2hhbmdlID0gKHllYXI6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IG5ld0RhdGUgPSBjdXJyZW50RGF0ZS55ZWFyKHllYXIpXG4gICAgc2V0Q3VycmVudERhdGUobmV3RGF0ZSlcbiAgICBzZXRZZWFyUG9wb3Zlck9wZW4oZmFsc2UpXG4gIH1cblxuICByZXR1cm4gKFxuICAgIDw+XG4gICAgICB7dmlldyAhPT0gJ3llYXInICYmIChcbiAgICAgICAgPFBvcG92ZXIgb3Blbj17bW9udGhQb3BvdmVyT3Blbn0gb25PcGVuQ2hhbmdlPXtzZXRNb250aFBvcG92ZXJPcGVufT5cbiAgICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcHgtMiBmb250LXNlbWlib2xkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgICAgIDxtb3Rpb24uc3BhblxuICAgICAgICAgICAgICAgICAga2V5PXtgbW9udGgtJHtjdXJyZW50RGF0ZS5tb250aCgpfWB9XG4gICAgICAgICAgICAgICAgICBpbml0aWFsPVwiaW5pdGlhbFwiXG4gICAgICAgICAgICAgICAgICBhbmltYXRlPVwiYW5pbWF0ZVwiXG4gICAgICAgICAgICAgICAgICBleGl0PVwiZXhpdFwiXG4gICAgICAgICAgICAgICAgICB2YXJpYW50cz17YW5pbWF0aW9uVmFyaWFudHN9XG4gICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uPXt7IGR1cmF0aW9uOiAwLjI1LCBlYXNlOiAnZWFzZUluT3V0JyB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtjdXJyZW50RGF0ZS5mb3JtYXQoJ01NTU0nKX1cbiAgICAgICAgICAgICAgICA8L21vdGlvbi5zcGFuPlxuICAgICAgICAgICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cbiAgICAgICAgICAgICAgPENoZXZyb25Eb3duIGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgICAgICAgPC9CdXR0b24+XG4gICAgICAgICAgPC9Qb3BvdmVyVHJpZ2dlcj5cbiAgICAgICAgICA8UG9wb3ZlckNvbnRlbnQgY2xhc3NOYW1lPVwidy00MCBwLTBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCBtYXgtaC02MCBmbGV4LWNvbCBvdmVyZmxvdy1hdXRvXCI+XG4gICAgICAgICAgICAgIHttb250aHMubWFwKChtb250aCwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICA8QnV0dG9uXG4gICAgICAgICAgICAgICAgICBrZXk9e21vbnRofVxuICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgICdqdXN0aWZ5LXN0YXJ0IGZvbnQtbm9ybWFsJyxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudERhdGUubW9udGgoKSA9PT0gaW5kZXggJiYgJ2JnLXByaW1hcnkvMTAnXG4gICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4gaGFuZGxlTW9udGhDaGFuZ2UoaW5kZXgpfVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHttb250aH1cbiAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgKSl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L1BvcG92ZXJDb250ZW50PlxuICAgICAgICA8L1BvcG92ZXI+XG4gICAgICApfVxuXG4gICAgICA8UG9wb3ZlciBvcGVuPXt5ZWFyUG9wb3Zlck9wZW59IG9uT3BlbkNoYW5nZT17c2V0WWVhclBvcG92ZXJPcGVufT5cbiAgICAgICAgPFBvcG92ZXJUcmlnZ2VyIGFzQ2hpbGQ+XG4gICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0xIHB4LTIgZm9udC1zZW1pYm9sZFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgICA8bW90aW9uLnNwYW5cbiAgICAgICAgICAgICAgICBrZXk9e2B5ZWFyLSR7Y3VycmVudERhdGUueWVhcigpfWB9XG4gICAgICAgICAgICAgICAgaW5pdGlhbD1cImluaXRpYWxcIlxuICAgICAgICAgICAgICAgIGFuaW1hdGU9XCJhbmltYXRlXCJcbiAgICAgICAgICAgICAgICBleGl0PVwiZXhpdFwiXG4gICAgICAgICAgICAgICAgdmFyaWFudHM9e2FuaW1hdGlvblZhcmlhbnRzfVxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuMjUsIGVhc2U6ICdlYXNlSW5PdXQnIH19XG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7Y3VycmVudERhdGUuZm9ybWF0KCdZWVlZJyl9XG4gICAgICAgICAgICAgIDwvbW90aW9uLnNwYW4+XG4gICAgICAgICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cbiAgICAgICAgICAgIDxDaGV2cm9uRG93biBjbGFzc05hbWU9XCJoLTQgdy00XCIgLz5cbiAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgPC9Qb3BvdmVyVHJpZ2dlcj5cbiAgICAgICAgPFBvcG92ZXJDb250ZW50IGNsYXNzTmFtZT1cInctMjQgcC0wXCI+XG4gICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG1heC1oLTYwIGZsZXgtY29sIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgICAgIHt5ZWFycy5tYXAoKHllYXIpID0+IChcbiAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgIGtleT17eWVhcn1cbiAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAnanVzdGlmeS1zdGFydCBmb250LW5vcm1hbCcsXG4gICAgICAgICAgICAgICAgICBjdXJyZW50RGF0ZS55ZWFyKCkgPT09IHllYXIgJiYgJ2JnLXByaW1hcnkvMTAnXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVZZWFyQ2hhbmdlKHllYXIpfVxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge3llYXJ9XG4gICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgKSl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvUG9wb3ZlckNvbnRlbnQ+XG4gICAgICA8L1BvcG92ZXI+XG5cbiAgICAgIHsvKiBEaXNwbGF5IGFkZGl0aW9uYWwgdmlldy1zcGVjaWZpYyBpbmZvcm1hdGlvbiAqL31cbiAgICAgIHt2aWV3ID09PSAnd2VlaycgJiYgKFxuICAgICAgICA8UG9wb3ZlciBvcGVuPXt3ZWVrUG9wb3Zlck9wZW59IG9uT3BlbkNoYW5nZT17c2V0V2Vla1BvcG92ZXJPcGVufT5cbiAgICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcHgtMiBmb250LXNlbWlib2xkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgICAgIDxtb3Rpb24uc3BhblxuICAgICAgICAgICAgICAgICAga2V5PXtgd2Vlay1yYW5nZS0ke2N1cnJlbnREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgICAgICAgICBpbml0aWFsPVwiaW5pdGlhbFwiXG4gICAgICAgICAgICAgICAgICBhbmltYXRlPVwiYW5pbWF0ZVwiXG4gICAgICAgICAgICAgICAgICBleGl0PVwiZXhpdFwiXG4gICAgICAgICAgICAgICAgICB2YXJpYW50cz17YW5pbWF0aW9uVmFyaWFudHN9XG4gICAgICAgICAgICAgICAgICB0cmFuc2l0aW9uPXt7IGR1cmF0aW9uOiAwLjI1LCBlYXNlOiAnZWFzZUluT3V0JyB9fVxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIHtgJHtjdXJyZW50RGF0ZVxuICAgICAgICAgICAgICAgICAgICAuc3RhcnRPZignd2VlaycpXG4gICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoJ01NTSBEJyl9IC0gJHtjdXJyZW50RGF0ZVxuICAgICAgICAgICAgICAgICAgICAuZW5kT2YoJ3dlZWsnKVxuICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KCdNTU0gRCcpfWB9XG4gICAgICAgICAgICAgICAgPC9tb3Rpb24uc3Bhbj5cbiAgICAgICAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICAgICAgICAgIDxDaGV2cm9uRG93biBjbGFzc05hbWU9XCJtbC0xIGgtMyB3LTMgb3BhY2l0eS03MFwiIC8+XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8L1BvcG92ZXJUcmlnZ2VyPlxuICAgICAgICAgIDxQb3BvdmVyQ29udGVudCBjbGFzc05hbWU9XCJ3LTU2IHAtMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG1heC1oLTYwIGZsZXgtY29sIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgICAgICAgey8qIFNob3cgNyB3ZWVrcyAoMyBwYXN0LCBjdXJyZW50LCAzIGZ1dHVyZSkgKi99XG4gICAgICAgICAgICAgIHtBcnJheS5mcm9tKHsgbGVuZ3RoOiA3IH0sIChfLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2Vla0RhdGUgPSBjdXJyZW50RGF0ZS5zdWJ0cmFjdCgzLCAnd2VlaycpLmFkZChpLCAnd2VlaycpXG4gICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRPZldlZWsgPSB3ZWVrRGF0ZS5zdGFydE9mKCd3ZWVrJylcbiAgICAgICAgICAgICAgICBjb25zdCBlbmRPZldlZWsgPSB3ZWVrRGF0ZS5lbmRPZignd2VlaycpXG4gICAgICAgICAgICAgICAgY29uc3QgaXNDdXJyZW50V2VlayA9IHdlZWtEYXRlLmlzU2FtZShjdXJyZW50RGF0ZSwgJ3dlZWsnKVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgICAgICAga2V5PXtzdGFydE9mV2Vlay5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAnanVzdGlmeS1zdGFydCBmb250LW5vcm1hbCcsXG4gICAgICAgICAgICAgICAgICAgICAgaXNDdXJyZW50V2VlayAmJiAnYmctcHJpbWFyeS8xMCdcbiAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgb25DbGljaz17KCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIHNldEN1cnJlbnREYXRlKHN0YXJ0T2ZXZWVrKVxuICAgICAgICAgICAgICAgICAgICAgIHNldFdlZWtQb3BvdmVyT3BlbihmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHctZnVsbCBpdGVtcy1jZW50ZXIganVzdGlmeS1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2Ake3N0YXJ0T2ZXZWVrLmZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgICAgICdNTU0gRCdcbiAgICAgICAgICAgICAgICAgICAgICApfSAtICR7ZW5kT2ZXZWVrLmZvcm1hdCgnRCcpfWB9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIHtzdGFydE9mV2Vlay5tb250aCgpICE9PSBlbmRPZldlZWsubW9udGgoKSAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJ0ZXh0LXhzIG9wYWNpdHktNzBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAge2Ake3N0YXJ0T2ZXZWVrLmZvcm1hdCgnTU1NJyl9LSR7ZW5kT2ZXZWVrLmZvcm1hdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTU1NJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9Qb3BvdmVyQ29udGVudD5cbiAgICAgICAgPC9Qb3BvdmVyPlxuICAgICAgKX1cbiAgICAgIHt2aWV3ID09PSAnZGF5JyAmJiAoXG4gICAgICAgIDxQb3BvdmVyIG9wZW49e2RheVBvcG92ZXJPcGVufSBvbk9wZW5DaGFuZ2U9e3NldERheVBvcG92ZXJPcGVufT5cbiAgICAgICAgICA8UG9wb3ZlclRyaWdnZXIgYXNDaGlsZD5cbiAgICAgICAgICAgIDxCdXR0b25cbiAgICAgICAgICAgICAgdmFyaWFudD1cImdob3N0XCJcbiAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTEgcHgtMiBmb250LXNlbWlib2xkXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPEFuaW1hdGVQcmVzZW5jZSBtb2RlPVwid2FpdFwiPlxuICAgICAgICAgICAgICAgIDxtb3Rpb24uc3BhblxuICAgICAgICAgICAgICAgICAga2V5PXtgZGF5LWluZm8tJHtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX1gfVxuICAgICAgICAgICAgICAgICAgaW5pdGlhbD1cImluaXRpYWxcIlxuICAgICAgICAgICAgICAgICAgYW5pbWF0ZT1cImFuaW1hdGVcIlxuICAgICAgICAgICAgICAgICAgZXhpdD1cImV4aXRcIlxuICAgICAgICAgICAgICAgICAgdmFyaWFudHM9e2FuaW1hdGlvblZhcmlhbnRzfVxuICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbj17eyBkdXJhdGlvbjogMC4yNSwgZWFzZTogJ2Vhc2VJbk91dCcgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICB7Y3VycmVudERhdGUuZm9ybWF0KCdkZGRkLCBEJyl9XG4gICAgICAgICAgICAgICAgPC9tb3Rpb24uc3Bhbj5cbiAgICAgICAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICAgICAgICAgIDxDaGV2cm9uRG93biBjbGFzc05hbWU9XCJtbC0xIGgtMyB3LTMgb3BhY2l0eS03MFwiIC8+XG4gICAgICAgICAgICA8L0J1dHRvbj5cbiAgICAgICAgICA8L1BvcG92ZXJUcmlnZ2VyPlxuICAgICAgICAgIDxQb3BvdmVyQ29udGVudCBjbGFzc05hbWU9XCJ3LTU2IHAtMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IG1heC1oLTYwIGZsZXgtY29sIG92ZXJmbG93LWF1dG9cIj5cbiAgICAgICAgICAgICAgey8qIFNob3cgYWxsIGRheXMgb2YgdGhlIGN1cnJlbnQgbW9udGggKi99XG4gICAgICAgICAgICAgIHsoKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEdldCBmaXJzdCBkYXkgb2YgbW9udGggYW5kIGxhc3QgZGF5IG9mIG1vbnRoXG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3REYXlPZk1vbnRoID0gY3VycmVudERhdGUuc3RhcnRPZignbW9udGgnKVxuICAgICAgICAgICAgICAgIGNvbnN0IGRheXNJbk1vbnRoID0gY3VycmVudERhdGUuZGF5c0luTW9udGgoKVxuXG4gICAgICAgICAgICAgICAgLy8gR2VuZXJhdGUgYXJyYXkgb2YgZGF5cyBpbiB0aGUgbW9udGhcbiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogZGF5c0luTW9udGggfSwgKF8sIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGRheURhdGUgPSBmaXJzdERheU9mTW9udGguZGF0ZShpICsgMSkgLy8gaSArIDEgYmVjYXVzZSBkYXlzIHN0YXJ0IGF0IDFcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ3VycmVudERheSA9IGRheURhdGUuaXNTYW1lKGN1cnJlbnREYXRlLCAnZGF5JylcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGlzVG9kYXkgPSBkYXlEYXRlLmlzU2FtZShkYXlqcygpLCAnZGF5JylcblxuICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgPEJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGtleT17ZGF5RGF0ZS5mb3JtYXQoJ1lZWVktTU0tREQnKX1cbiAgICAgICAgICAgICAgICAgICAgICB2YXJpYW50PVwiZ2hvc3RcIlxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgICAgICAnanVzdGlmeS1zdGFydCBmb250LW5vcm1hbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc0N1cnJlbnREYXkgJiYgJ2JnLXByaW1hcnkvMTAnXG4gICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRDdXJyZW50RGF0ZShkYXlEYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGF5UG9wb3Zlck9wZW4oZmFsc2UpXG4gICAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwiZmxleCB3LWZ1bGwgaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e2RheURhdGUuZm9ybWF0KCdkZGRkLCBNTU0gRCcpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtpc1RvZGF5ICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwiYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCByb3VuZGVkLXNtIHB4LTEgdGV4dC14c1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvZGF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIH0pKCl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L1BvcG92ZXJDb250ZW50PlxuICAgICAgICA8L1BvcG92ZXI+XG4gICAgICApfVxuICAgIDwvPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IFRpdGxlQ29udGVudFxuIiwKICAgICJpbXBvcnQgeyBCdXR0b24gfSBmcm9tICdAL2NvbXBvbmVudHMvdWknXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHsgQ2hldnJvbkxlZnQsIENoZXZyb25SaWdodCB9IGZyb20gJ2x1Y2lkZS1yZWFjdCdcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcblxudHlwZSBWaWV3Q29udHJvbHNQcm9wcyA9IHtcbiAgY3VycmVudFZpZXc6ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICd5ZWFyJ1xuICBvbkNoYW5nZTogKHZpZXc6ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICd5ZWFyJykgPT4gdm9pZFxuICBvblRvZGF5PzogKCkgPT4gdm9pZFxuICBvbk5leHQ/OiAoKSA9PiB2b2lkXG4gIG9uUHJldmlvdXM/OiAoKSA9PiB2b2lkXG4gIHZhcmlhbnQ/OiAnZGVmYXVsdCcgfCAnZ3JpZCdcbiAgc2l6ZT86ICdzbScgfCAnZGVmYXVsdCdcbiAgY2xhc3NOYW1lPzogc3RyaW5nXG59XG5cbmNvbnN0IFZpZXdDb250cm9sczogUmVhY3QuRkM8Vmlld0NvbnRyb2xzUHJvcHM+ID0gKHtcbiAgY3VycmVudFZpZXcsXG4gIG9uQ2hhbmdlLFxuICB2YXJpYW50ID0gJ2RlZmF1bHQnLFxuICBzaXplID0gJ3NtJyxcbiAgY2xhc3NOYW1lLFxuICBvblRvZGF5LFxuICBvbk5leHQsXG4gIG9uUHJldmlvdXMsXG59KSA9PiB7XG4gIGNvbnN0IGlzR3JpZCA9IHZhcmlhbnQgPT09ICdncmlkJ1xuXG4gIC8vIEV4dHJhY3QgY29tbW9uIGJ1dHRvbiBjbGFzc05hbWUgbG9naWMgdG8gYSBmdW5jdGlvblxuICBjb25zdCBnZXRCdXR0b25DbGFzc05hbWUgPSAodmlld1R5cGU6ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICd5ZWFyJykgPT4ge1xuICAgIHJldHVybiBjbihcbiAgICAgIC8vIEJhc2Ugd2lkdGggZm9yIGdyaWQgbGF5b3V0XG4gICAgICBpc0dyaWQgPyAndy1mdWxsJyA6ICcnLFxuICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciB5ZWFyIGJ1dHRvbiB2aXNpYmlsaXR5IG9uIG1vYmlsZVxuICAgICAgdmlld1R5cGUgPT09ICd5ZWFyJyA/IChpc0dyaWQgPyAndy1mdWxsJyA6ICdoaWRkZW4gbWQ6aW5saW5lLWZsZXgnKSA6ICcnLFxuICAgICAgLy8gQWN0aXZlIHZpZXcgc3R5bGluZ1xuICAgICAgY3VycmVudFZpZXcgPT09IHZpZXdUeXBlICYmICdiZy1wcmltYXJ5LzgwJ1xuICAgIClcbiAgfVxuXG4gIGNvbnN0IGdldEJ0blZhcmlhbnQgPSAodmlld1R5cGU6ICdkYXknIHwgJ3dlZWsnIHwgJ21vbnRoJyB8ICd5ZWFyJykgPT4ge1xuICAgIHJldHVybiBjdXJyZW50VmlldyA9PT0gdmlld1R5cGUgPyAnZGVmYXVsdCcgOiAnb3V0bGluZSdcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdlxuICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgaXNHcmlkID8gJ2dyaWQgZ3JpZC1jb2xzLTIgZ2FwLTInIDogJ2ZsZXggZ2FwLTEnLFxuICAgICAgICBjbGFzc05hbWVcbiAgICAgICl9XG4gICAgPlxuICAgICAgPEJ1dHRvbiBvbkNsaWNrPXtvblByZXZpb3VzfSB2YXJpYW50PVwib3V0bGluZVwiIHNpemU9e3NpemV9PlxuICAgICAgICA8Q2hldnJvbkxlZnQgY2xhc3NOYW1lPVwiaC00IHctNFwiIC8+XG4gICAgICA8L0J1dHRvbj5cbiAgICAgIDxCdXR0b24gb25DbGljaz17b25OZXh0fSB2YXJpYW50PVwib3V0bGluZVwiIHNpemU9e3NpemV9PlxuICAgICAgICA8Q2hldnJvblJpZ2h0IGNsYXNzTmFtZT1cImgtNCB3LTRcIiAvPlxuICAgICAgPC9CdXR0b24+XG5cbiAgICAgIDxCdXR0b25cbiAgICAgICAgb25DbGljaz17KCkgPT4gb25DaGFuZ2UoJ2RheScpfVxuICAgICAgICB2YXJpYW50PXtnZXRCdG5WYXJpYW50KCdkYXknKX1cbiAgICAgICAgc2l6ZT17c2l6ZX1cbiAgICAgICAgY2xhc3NOYW1lPXtnZXRCdXR0b25DbGFzc05hbWUoJ2RheScpfVxuICAgICAgPlxuICAgICAgICBEYXlcbiAgICAgIDwvQnV0dG9uPlxuICAgICAgPEJ1dHRvblxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBvbkNoYW5nZSgnd2VlaycpfVxuICAgICAgICB2YXJpYW50PXtnZXRCdG5WYXJpYW50KCd3ZWVrJyl9XG4gICAgICAgIHNpemU9e3NpemV9XG4gICAgICAgIGNsYXNzTmFtZT17Z2V0QnV0dG9uQ2xhc3NOYW1lKCd3ZWVrJyl9XG4gICAgICA+XG4gICAgICAgIFdlZWtcbiAgICAgIDwvQnV0dG9uPlxuICAgICAgPEJ1dHRvblxuICAgICAgICBvbkNsaWNrPXsoKSA9PiBvbkNoYW5nZSgnbW9udGgnKX1cbiAgICAgICAgdmFyaWFudD17Z2V0QnRuVmFyaWFudCgnbW9udGgnKX1cbiAgICAgICAgc2l6ZT17c2l6ZX1cbiAgICAgICAgY2xhc3NOYW1lPXtnZXRCdXR0b25DbGFzc05hbWUoJ21vbnRoJyl9XG4gICAgICA+XG4gICAgICAgIE1vbnRoXG4gICAgICA8L0J1dHRvbj5cbiAgICAgIDxCdXR0b25cbiAgICAgICAgb25DbGljaz17KCkgPT4gb25DaGFuZ2UoJ3llYXInKX1cbiAgICAgICAgdmFyaWFudD17Z2V0QnRuVmFyaWFudCgneWVhcicpfVxuICAgICAgICBzaXplPXtzaXplfVxuICAgICAgICBjbGFzc05hbWU9e2dldEJ1dHRvbkNsYXNzTmFtZSgneWVhcicpfVxuICAgICAgPlxuICAgICAgICBZZWFyXG4gICAgICA8L0J1dHRvbj5cblxuICAgICAgPEJ1dHRvbiBvbkNsaWNrPXtvblRvZGF5fSB2YXJpYW50PVwib3V0bGluZVwiIHNpemU9e3NpemV9PlxuICAgICAgICBUb2RheVxuICAgICAgPC9CdXR0b24+XG4gICAgPC9kaXY+XG4gIClcbn1cblxuZXhwb3J0IGRlZmF1bHQgVmlld0NvbnRyb2xzXG4iLAogICAgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IHsgU2Nyb2xsQXJlYSB9IGZyb20gJ0AvY29tcG9uZW50cy91aSdcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0IHsgQW5pbWF0ZVByZXNlbmNlLCBtb3Rpb24gfSBmcm9tICdtb3Rpb24vcmVhY3QnXG5cbmNvbnN0IFllYXJWaWV3OiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3QgeyBjdXJyZW50RGF0ZSwgc2VsZWN0RGF0ZSwgZXZlbnRzLCBzZXRWaWV3LCBnZXRFdmVudHNGb3JEYXRlIH0gPVxuICAgIHVzZUNhbGVuZGFyQ29udGV4dCgpXG4gIGNvbnN0IHllYXIgPSBjdXJyZW50RGF0ZS55ZWFyKClcblxuICAvLyBHZW5lcmF0ZSBhbiBhcnJheSBvZiAxMiBtb250aHMgZm9yIHRoZSBjdXJyZW50IHllYXJcbiAgY29uc3QgbW9udGhzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogMTIgfSwgKF8sIGkpID0+IHtcbiAgICBjb25zdCBtb250aERhdGUgPSBkYXlqcygpLnllYXIoeWVhcikubW9udGgoaSkuc3RhcnRPZignbW9udGgnKVxuICAgIHJldHVybiB7XG4gICAgICBkYXRlOiBtb250aERhdGUsXG4gICAgICBuYW1lOiBtb250aERhdGUuZm9ybWF0KCdNTU1NJyksXG4gICAgICBkYXlzSW5Nb250aDogbW9udGhEYXRlLmRheXNJbk1vbnRoKCksXG4gICAgICBmaXJzdERheU9mTW9udGg6IG1vbnRoRGF0ZS5zdGFydE9mKCdtb250aCcpLmRheSgpLCAvLyAwLTYsIDAgaXMgU3VuZGF5XG4gICAgfVxuICB9KVxuXG4gIC8vIENhbGN1bGF0ZSBldmVudHMgZm9yIGVhY2ggbW9udGhcbiAgY29uc3QgbW9udGhzV2l0aEV2ZW50Q291bnQgPSBtb250aHMubWFwKChtb250aCkgPT4ge1xuICAgIGNvbnN0IGV2ZW50c0luTW9udGggPSBldmVudHMuZmlsdGVyKFxuICAgICAgKGV2ZW50KSA9PlxuICAgICAgICBldmVudC5zdGFydC55ZWFyKCkgPT09IHllYXIgJiZcbiAgICAgICAgZXZlbnQuc3RhcnQubW9udGgoKSA9PT0gbW9udGguZGF0ZS5tb250aCgpXG4gICAgKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm1vbnRoLFxuICAgICAgZXZlbnRDb3VudDogZXZlbnRzSW5Nb250aC5sZW5ndGgsXG4gICAgfVxuICB9KVxuXG4gIC8vIEhhbmRsZSBtb250aCBjbGljayB0byBuYXZpZ2F0ZSB0byBtb250aCB2aWV3XG4gIGNvbnN0IGhhbmRsZU1vbnRoQ2xpY2sgPSAoZGF0ZTogZGF5anMuRGF5anMpID0+IHtcbiAgICBzZWxlY3REYXRlKGRhdGUpXG4gICAgc2V0VmlldygnbW9udGgnKVxuICB9XG5cbiAgLy8gSGFuZGxlIGRheSBjbGljayB3aXRoaW4gdGhlIG1pbmkgY2FsZW5kYXJcbiAgY29uc3QgaGFuZGxlRGF5Q2xpY2sgPSAoZGF0ZTogZGF5anMuRGF5anMsIGV2ZW50OiBSZWFjdC5Nb3VzZUV2ZW50KSA9PiB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCkgLy8gUHJldmVudCB0cmlnZ2VyaW5nIHRoZSBtb250aCBjbGlja1xuICAgIHNlbGVjdERhdGUoZGF0ZSlcbiAgICBzZXRWaWV3KCdkYXknKSAvLyBOYXZpZ2F0ZSBkaXJlY3RseSB0byBkYXkgdmlldyB3aGVuIGNsaWNraW5nIG9uIGEgc3BlY2lmaWMgZGF5XG4gIH1cblxuICAvLyBHZW5lcmF0ZSBkYXlzIGZvciBtaW5pIGNhbGVuZGFyIGluIGVhY2ggbW9udGhcbiAgY29uc3QgcmVuZGVyTWluaUNhbGVuZGFyID0gKG1vbnRoOiAodHlwZW9mIG1vbnRoc1dpdGhFdmVudENvdW50KVswXSkgPT4ge1xuICAgIC8vIEdldCB0aGUgZmlyc3QgZGF5IG9mIHRoZSBtb250aCdzIGNhbGVuZGFyICh3aGljaCBjb3VsZCBiZSBpbiB0aGUgcHJldmlvdXMgbW9udGgpXG4gICAgY29uc3QgZmlyc3REYXlPZkNhbGVuZGFyID0gbW9udGguZGF0ZS5zdGFydE9mKCdtb250aCcpLnN0YXJ0T2YoJ3dlZWsnKVxuXG4gICAgLy8gQ3JlYXRlIDQyIGRheXMgKDYgcm93cyBvZiA3IGRheXMpIGZvciBjb25zaXN0ZW5jeVxuICAgIGNvbnN0IGRheXNBcnJheSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IDQyIH0sIChfLCBpKSA9PiB7XG4gICAgICBjb25zdCBkYXkgPSBmaXJzdERheU9mQ2FsZW5kYXIuYWRkKGksICdkYXknKVxuICAgICAgY29uc3QgaXNDdXJyZW50TW9udGggPSBkYXkubW9udGgoKSA9PT0gbW9udGguZGF0ZS5tb250aCgpXG4gICAgICBjb25zdCBpc1RvZGF5ID0gZGF5LmlzU2FtZShkYXlqcygpLCAnZGF5JylcbiAgICAgIGNvbnN0IGlzQ3VycmVudERhdGUgPSBkYXkuaXNTYW1lKGN1cnJlbnREYXRlLCAnZGF5JylcblxuICAgICAgLy8gR2V0IGV2ZW50cyBmb3IgdGhpcyBkYXlcbiAgICAgIGNvbnN0IGRheUV2ZW50cyA9IGdldEV2ZW50c0ZvckRhdGUoZGF5KVxuICAgICAgY29uc3QgaGFzRXZlbnRzID0gZGF5RXZlbnRzLmxlbmd0aCA+IDBcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF5LFxuICAgICAgICBpc0N1cnJlbnRNb250aCxcbiAgICAgICAgaXNUb2RheSxcbiAgICAgICAgaXNDdXJyZW50RGF0ZSxcbiAgICAgICAgaGFzRXZlbnRzLFxuICAgICAgICBldmVudENvdW50OiBkYXlFdmVudHMubGVuZ3RoLFxuICAgICAgICAvLyBHcm91cCBldmVudHMgYnkgdGhlaXIgY2F0ZWdvcmllcyB0byBzaG93IGRpZmZlcmVudCBjb2xvcnNcbiAgICAgICAgZXZlbnRzOiBkYXlFdmVudHMsXG4gICAgICB9XG4gICAgfSlcblxuICAgIHJldHVybiAoXG4gICAgICA8ZGl2XG4gICAgICAgIGRhdGEtdGVzdGlkPXtgeWVhci1taW5pLWNhbGVuZGFyLSR7bW9udGguZGF0ZS5mb3JtYXQoJ01NJyl9YH1cbiAgICAgICAgY2xhc3NOYW1lPVwiZ3JpZCBncmlkLWNvbHMtNyBnYXAtWzFweF0gdGV4dC1bMC42cmVtXVwiXG4gICAgICA+XG4gICAgICAgIHsvKiBEYXkgbmFtZXMgKi99XG4gICAgICAgIHtbJ1MnLCAnTScsICdUJywgJ1cnLCAnVCcsICdGJywgJ1MnXS5tYXAoKGRheU5hbWUsIGkpID0+IChcbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBrZXk9e2BoZWFkZXItJHtpfWB9XG4gICAgICAgICAgICBjbGFzc05hbWU9XCJ0ZXh0LW11dGVkLWZvcmVncm91bmQgaC0zIHRleHQtY2VudGVyXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7ZGF5TmFtZX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKSl9XG5cbiAgICAgICAgey8qIENhbGVuZGFyIGRheXMgKi99XG4gICAgICAgIHtkYXlzQXJyYXkubWFwKChkYXlJbmZvLCBpKSA9PiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAga2V5PXtgZGF5LSR7aX1gfVxuICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2B5ZWFyLWRheS0ke2RheUluZm8uZGF5LmZvcm1hdCgnWVlZWS1NTS1ERCcpfWB9XG4gICAgICAgICAgICBvbkNsaWNrPXsoZSkgPT4gaGFuZGxlRGF5Q2xpY2soZGF5SW5mby5kYXksIGUpfVxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgJ3JlbGF0aXZlIGZsZXggYXNwZWN0LXNxdWFyZSB3LWZ1bGwgY3Vyc29yLXBvaW50ZXIgZmxleC1jb2wgaXRlbXMtY2VudGVyIGp1c3RpZnktY2VudGVyJyxcbiAgICAgICAgICAgICAgJ2hvdmVyOmJnLWFjY2VudCByb3VuZGVkLXNtIHRyYW5zaXRpb24tY29sb3JzIGR1cmF0aW9uLTIwMCcsXG4gICAgICAgICAgICAgICFkYXlJbmZvLmlzQ3VycmVudE1vbnRoICYmICd0ZXh0LW11dGVkLWZvcmVncm91bmQgb3BhY2l0eS01MCcsXG4gICAgICAgICAgICAgIGRheUluZm8uaXNUb2RheSAmJlxuICAgICAgICAgICAgICAgICdiZy1wcmltYXJ5IHRleHQtcHJpbWFyeS1mb3JlZ3JvdW5kIHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICAgICAgIGRheUluZm8uaXNDdXJyZW50RGF0ZSAmJlxuICAgICAgICAgICAgICAgICFkYXlJbmZvLmlzVG9kYXkgJiZcbiAgICAgICAgICAgICAgICAnYmctbXV0ZWQgcm91bmRlZC1mdWxsIGZvbnQtYm9sZCcsXG4gICAgICAgICAgICAgIGRheUluZm8uaGFzRXZlbnRzICYmXG4gICAgICAgICAgICAgICAgIWRheUluZm8uaXNUb2RheSAmJlxuICAgICAgICAgICAgICAgICFkYXlJbmZvLmlzQ3VycmVudERhdGUgJiZcbiAgICAgICAgICAgICAgICAnZm9udC1tZWRpdW0nXG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgdGl0bGU9e1xuICAgICAgICAgICAgICBkYXlJbmZvLmhhc0V2ZW50c1xuICAgICAgICAgICAgICAgID8gYCR7ZGF5SW5mby5ldmVudENvdW50fSBldmVudCR7XG4gICAgICAgICAgICAgICAgICAgIGRheUluZm8uZXZlbnRDb3VudCA+IDEgPyAncycgOiAnJ1xuICAgICAgICAgICAgICAgICAgfWBcbiAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwidGV4dC1jZW50ZXIgbGVhZGluZy1ub25lXCI+XG4gICAgICAgICAgICAgIHtkYXlJbmZvLmRheS5kYXRlKCl9XG4gICAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgICAgIHsvKiBFbmhhbmNlZCBldmVudCBpbmRpY2F0b3IgLSBzaG93IG11bHRpcGxlIGNvbG9yZWQgZG90cyBmb3IgZGlmZmVyZW50IGV2ZW50IHR5cGVzICovfVxuICAgICAgICAgICAge2RheUluZm8uaGFzRXZlbnRzICYmIChcbiAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAnYWJzb2x1dGUgYm90dG9tLTAgZmxleCB3LWZ1bGwganVzdGlmeS1jZW50ZXIgc3BhY2UteC1bMXB4XScsXG4gICAgICAgICAgICAgICAgICBkYXlJbmZvLmlzVG9kYXkgPyAnYm90dG9tLVsxcHhdJyA6ICcnXG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHsvKiBTaG93IHVwIHRvIDMgZXZlbnQgZG90cyB3aXRoIGRpZmZlcmVudCBjb2xvcnMgaWYgYXZhaWxhYmxlICovfVxuICAgICAgICAgICAgICAgIHtkYXlJbmZvLmV2ZW50Q291bnQgPiAwICYmIChcbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAgICAgICAgICAgICAgICAgJ2gtWzNweF0gdy1bM3B4XSByb3VuZGVkLWZ1bGwnLFxuICAgICAgICAgICAgICAgICAgICAgIGRheUluZm8uaXNUb2RheSA/ICdiZy1wcmltYXJ5LWZvcmVncm91bmQnIDogJ2JnLXByaW1hcnknXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge2RheUluZm8uZXZlbnRDb3VudCA+IDEgJiYgKFxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAnaC1bM3B4XSB3LVszcHhdIHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgZGF5SW5mby5pc1RvZGF5ID8gJ2JnLXByaW1hcnktZm9yZWdyb3VuZCcgOiAnYmctYmx1ZS01MDAnXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAge2RheUluZm8uZXZlbnRDb3VudCA+IDIgJiYgKFxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgICAgICAgICAnaC1bM3B4XSB3LVszcHhdIHJvdW5kZWQtZnVsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgZGF5SW5mby5pc1RvZGF5ID8gJ2JnLXByaW1hcnktZm9yZWdyb3VuZCcgOiAnYmctZ3JlZW4tNTAwJ1xuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIChcbiAgICA8U2Nyb2xsQXJlYSBkYXRhLXRlc3RpZD1cInllYXItdmlld1wiIGNsYXNzTmFtZT1cImgtZnVsbFwiPlxuICAgICAgPGRpdlxuICAgICAgICBkYXRhLXRlc3RpZD1cInllYXItZ3JpZFwiXG4gICAgICAgIGNsYXNzTmFtZT1cImdyaWQgYXV0by1yb3dzLWZyIGdyaWQtY29scy0xIGdhcC00IHAtNCBzbTpncmlkLWNvbHMtMiBsZzpncmlkLWNvbHMtM1wiXG4gICAgICA+XG4gICAgICAgIHttb250aHNXaXRoRXZlbnRDb3VudC5tYXAoKG1vbnRoLCBpbmRleCkgPT4gKFxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGtleT17bW9udGgubmFtZX1cbiAgICAgICAgICAgIGRhdGEtdGVzdGlkPXtgeWVhci1tb250aC0ke21vbnRoLmRhdGUuZm9ybWF0KCdNTScpfWB9XG4gICAgICAgICAgICBvbkNsaWNrPXsoKSA9PiBoYW5kbGVNb250aENsaWNrKG1vbnRoLmRhdGUpfVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwiaG92ZXI6Ym9yZGVyLXByaW1hcnkgZmxleCBjdXJzb3ItcG9pbnRlciBmbGV4LWNvbCByb3VuZGVkLWxnIGJvcmRlciBwLTMgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwIGhvdmVyOnNjYWxlLVsxLjAxXSBob3ZlcjpzaGFkb3ctbWRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxBbmltYXRlUHJlc2VuY2UgbW9kZT1cIndhaXRcIj5cbiAgICAgICAgICAgICAgPG1vdGlvbi5kaXZcbiAgICAgICAgICAgICAgICBrZXk9e2Btb250aC0ke2luZGV4fWB9XG4gICAgICAgICAgICAgICAgaW5pdGlhbD17eyBvcGFjaXR5OiAwLCB5OiAtMTAgfX1cbiAgICAgICAgICAgICAgICBhbmltYXRlPXt7IG9wYWNpdHk6IDEsIHk6IDAgfX1cbiAgICAgICAgICAgICAgICBleGl0PXt7IG9wYWNpdHk6IDAsIHk6IC0xMCB9fVxuICAgICAgICAgICAgICAgIHRyYW5zaXRpb249e3tcbiAgICAgICAgICAgICAgICAgIGR1cmF0aW9uOiAwLjI1LFxuICAgICAgICAgICAgICAgICAgZWFzZTogJ2Vhc2VJbk91dCcsXG4gICAgICAgICAgICAgICAgICBkZWxheTogaW5kZXggKiAwLjA1LFxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibWItMiBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWJldHdlZW5cIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGgzXG4gICAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD17YHllYXItbW9udGgtdGl0bGUtJHttb250aC5kYXRlLmZvcm1hdCgnTU0nKX1gfVxuICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwidGV4dC1sZyBmb250LW1lZGl1bVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge21vbnRoLm5hbWV9XG4gICAgICAgICAgICAgICAgPC9oMz5cbiAgICAgICAgICAgICAgICB7bW9udGguZXZlbnRDb3VudCA+IDAgJiYgKFxuICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgZGF0YS10ZXN0aWQ9e2B5ZWFyLW1vbnRoLWV2ZW50LWNvdW50LSR7bW9udGguZGF0ZS5mb3JtYXQoJ01NJyl9YH1cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwiYmctcHJpbWFyeSB0ZXh0LXByaW1hcnktZm9yZWdyb3VuZCByb3VuZGVkLWZ1bGwgcHgtMiBweS0xIHRleHQteHNcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7bW9udGguZXZlbnRDb3VudH17JyAnfVxuICAgICAgICAgICAgICAgICAgICB7bW9udGguZXZlbnRDb3VudCA9PT0gMSA/ICdldmVudCcgOiAnZXZlbnRzJ31cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICA8L21vdGlvbi5kaXY+XG4gICAgICAgICAgICA8L0FuaW1hdGVQcmVzZW5jZT5cblxuICAgICAgICAgICAge3JlbmRlck1pbmlDYWxlbmRhcihtb250aCl9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICkpfVxuICAgICAgPC9kaXY+XG4gICAgPC9TY3JvbGxBcmVhPlxuICApXG59XG5cbmV4cG9ydCBkZWZhdWx0IFllYXJWaWV3XG4iLAogICAgImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB7IE1vbnRoVmlldyB9IGZyb20gJ0AvZmVhdHVyZXMvbW9udGgtdmlldy9jb21wb25lbnRzL21vbnRoLXZpZXcnXG5pbXBvcnQgV2Vla1ZpZXcgZnJvbSAnQC9mZWF0dXJlcy93ZWVrLXZpZXcvd2Vlay12aWV3J1xuaW1wb3J0IERheVZpZXcgZnJvbSAnQC9mZWF0dXJlcy9kYXktdmlldy9kYXktdmlldydcbmltcG9ydCB7IEV2ZW50Rm9ybSB9IGZyb20gJy4uL2V2ZW50LWZvcm0vZXZlbnQtZm9ybSdcbmltcG9ydCB7IEhlYWRlciB9IGZyb20gJy4uL2hlYWRlcidcbmltcG9ydCBZZWFyVmlldyBmcm9tICdAL2ZlYXR1cmVzL3llYXItdmlldy95ZWFyLXZpZXcnXG5pbXBvcnQgeyBBbmltYXRlUHJlc2VuY2UsIG1vdGlvbiB9IGZyb20gJ21vdGlvbi9yZWFjdCdcbmltcG9ydCB7IENhbGVuZGFyRG5kQ29udGV4dCB9IGZyb20gJ0AvZmVhdHVyZXMvZHJhZy1hbmQtZHJvcC9jYWxlbmRhci1kbmQtY29udGV4dCdcbmltcG9ydCB7IENhbGVuZGFyUHJvdmlkZXIgfSBmcm9tICdAL2NvbnRleHRzL2NhbGVuZGFyLWNvbnRleHQvcHJvdmlkZXInXG5pbXBvcnQgdHlwZSB7XG4gIENhbGVuZGFyRXZlbnQsXG4gIEV2ZW50UmVjdXJyZW5jZSxcbiAgV2Vla0RheXMsXG59IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcbmltcG9ydCB7IHVzZUNhbGVuZGFyQ29udGV4dCB9IGZyb20gJ0AvY29udGV4dHMvY2FsZW5kYXItY29udGV4dC9jb250ZXh0J1xuaW1wb3J0ICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgZGF5anMgZnJvbSAnQC9saWIvZGF5anMtY29uZmlnJ1xuXG5pbnRlcmZhY2UgQ2FsZW5kYXJFdmVudHNcbiAgZXh0ZW5kcyBPbWl0PFxuICAgIENhbGVuZGFyRXZlbnQsXG4gICAgJ3N0YXJ0JyB8ICdlbmQnIHwgJ3JlY3VycmVuY2UnIHwgJ29yaWdpbmFsU3RhcnQnIHwgJ29yaWdpbmFsRW5kJ1xuICA+IHtcbiAgc3RhcnQ6IGRheWpzLkRheWpzIHwgRGF0ZSB8IHN0cmluZ1xuICBlbmQ6IGRheWpzLkRheWpzIHwgRGF0ZSB8IHN0cmluZ1xuICBvcmlnaW5hbFN0YXJ0PzogZGF5anMuRGF5anMgfCBEYXRlIHwgc3RyaW5nXG4gIG9yaWdpbmFsRW5kPzogZGF5anMuRGF5anMgfCBEYXRlIHwgc3RyaW5nXG4gIHJlY3VycmVuY2U/OiBFdmVudFJlY3VycmVuY2Vcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUNhbGVuZGFyRXZlbnRzKFxuICBldmVudHM6IENhbGVuZGFyRXZlbnRzW11cbik6IENhbGVuZGFyRXZlbnRbXSB7XG4gIHJldHVybiBldmVudHMubWFwKChldmVudCkgPT4ge1xuICAgIGNvbnN0IHJlY3VycmVuY2UgPSBldmVudC5yZWN1cnJlbmNlXG4gICAgaWYgKHJlY3VycmVuY2UpIHtcbiAgICAgIHJlY3VycmVuY2UuZW5kRGF0ZSA9IHJlY3VycmVuY2U/LmVuZERhdGVcbiAgICAgICAgPyBkYXlqcy5pc0RheWpzKHJlY3VycmVuY2UuZW5kRGF0ZSlcbiAgICAgICAgICA/IHJlY3VycmVuY2UuZW5kRGF0ZVxuICAgICAgICAgIDogZGF5anMocmVjdXJyZW5jZS5lbmREYXRlKVxuICAgICAgICA6IHVuZGVmaW5lZFxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5ldmVudCxcbiAgICAgIHN0YXJ0OiBkYXlqcy5pc0RheWpzKGV2ZW50LnN0YXJ0KSA/IGV2ZW50LnN0YXJ0IDogZGF5anMoZXZlbnQuc3RhcnQpLFxuICAgICAgZW5kOiBkYXlqcy5pc0RheWpzKGV2ZW50LmVuZCkgPyBldmVudC5lbmQgOiBkYXlqcyhldmVudC5lbmQpLFxuICAgICAgb3JpZ2luYWxTdGFydDogZXZlbnQub3JpZ2luYWxTdGFydFxuICAgICAgICA/IGRheWpzLmlzRGF5anMoZXZlbnQub3JpZ2luYWxTdGFydClcbiAgICAgICAgICA/IGV2ZW50Lm9yaWdpbmFsU3RhcnRcbiAgICAgICAgICA6IGRheWpzKGV2ZW50Lm9yaWdpbmFsU3RhcnQpXG4gICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgb3JpZ2luYWxFbmQ6IGV2ZW50Lm9yaWdpbmFsRW5kXG4gICAgICAgID8gZGF5anMuaXNEYXlqcyhldmVudC5vcmlnaW5hbEVuZClcbiAgICAgICAgICA/IGV2ZW50Lm9yaWdpbmFsRW5kXG4gICAgICAgICAgOiBkYXlqcyhldmVudC5vcmlnaW5hbEVuZClcbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICByZWN1cnJlbmNlOiByZWN1cnJlbmNlLFxuICAgIH1cbiAgfSlcbn1cblxuY29uc3QgQ2FsZW5kYXJDb250ZW50OiBSZWFjdC5GQyA9ICgpID0+IHtcbiAgY29uc3Qge1xuICAgIHZpZXcsXG4gICAgaXNFdmVudEZvcm1PcGVuLFxuICAgIGNsb3NlRXZlbnRGb3JtLFxuICAgIHNlbGVjdGVkRXZlbnQsXG4gICAgc2VsZWN0ZWREYXRlLFxuICAgIGFkZEV2ZW50LFxuICAgIHVwZGF0ZUV2ZW50LFxuICAgIGRlbGV0ZUV2ZW50LFxuICAgIGRheU1heEV2ZW50cyxcbiAgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG5cbiAgY29uc3Qgdmlld01hcCA9IHtcbiAgICBtb250aDogPE1vbnRoVmlldyBrZXk9XCJtb250aFwiIGRheU1heEV2ZW50cz17ZGF5TWF4RXZlbnRzfSAvPixcbiAgICB3ZWVrOiA8V2Vla1ZpZXcga2V5PVwid2Vla1wiIC8+LFxuICAgIGRheTogPERheVZpZXcga2V5PVwiZGF5XCIgLz4sXG4gICAgeWVhcjogPFllYXJWaWV3IGtleT1cInllYXJcIiAvPixcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZU9uVXBkYXRlID0gKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgdXBkYXRlRXZlbnQoZXZlbnQuaWQsIGV2ZW50KVxuICB9XG5cbiAgY29uc3QgaGFuZGxlT25EZWxldGUgPSAoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHtcbiAgICBkZWxldGVFdmVudChldmVudC5pZClcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IGZsZXgtY29sIHctZnVsbCBoLWZ1bGxcIj5cbiAgICAgIDxIZWFkZXIgLz5cblxuICAgICAgey8qIENhbGVuZGFyIEJvZHkgd2l0aCBBbmltYXRlUHJlc2VuY2UgZm9yIHZpZXcgdHJhbnNpdGlvbnMgKi99XG4gICAgICA8Q2FsZW5kYXJEbmRDb250ZXh0PlxuICAgICAgICA8QW5pbWF0ZVByZXNlbmNlIG1vZGU9XCJ3YWl0XCI+XG4gICAgICAgICAgPG1vdGlvbi5kaXZcbiAgICAgICAgICAgIGtleT17dmlld31cbiAgICAgICAgICAgIGluaXRpYWw9e3sgb3BhY2l0eTogMCwgeDogMjAgfX1cbiAgICAgICAgICAgIGFuaW1hdGU9e3sgb3BhY2l0eTogMSwgeDogMCB9fVxuICAgICAgICAgICAgZXhpdD17eyBvcGFjaXR5OiAwLCB4OiAtMjAgfX1cbiAgICAgICAgICAgIHRyYW5zaXRpb249e3sgZHVyYXRpb246IDAuMSwgZWFzZTogJ2Vhc2VJbk91dCcgfX1cbiAgICAgICAgICAgIGNsYXNzTmFtZT1cImgtZnVsbCB3LWZ1bGxcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt2aWV3TWFwW3ZpZXddfVxuICAgICAgICAgIDwvbW90aW9uLmRpdj5cbiAgICAgICAgPC9BbmltYXRlUHJlc2VuY2U+XG4gICAgICA8L0NhbGVuZGFyRG5kQ29udGV4dD5cblxuICAgICAgey8qIEV2ZW50IEZvcm0gRGlhbG9nICovfVxuICAgICAge2lzRXZlbnRGb3JtT3BlbiAmJiAoXG4gICAgICAgIDxFdmVudEZvcm1cbiAgICAgICAgICBvbkNsb3NlPXtjbG9zZUV2ZW50Rm9ybX1cbiAgICAgICAgICBzZWxlY3RlZEV2ZW50PXtzZWxlY3RlZEV2ZW50fVxuICAgICAgICAgIHNlbGVjdGVkRGF0ZT17c2VsZWN0ZWREYXRlfVxuICAgICAgICAgIG9uQWRkPXthZGRFdmVudH1cbiAgICAgICAgICBvblVwZGF0ZT17aGFuZGxlT25VcGRhdGV9XG4gICAgICAgICAgb25EZWxldGU9e2hhbmRsZU9uRGVsZXRlfVxuICAgICAgICAvPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKVxufVxuXG5pbnRlcmZhY2UgQ2FsZW5kYXJQcm9wcyB7XG4gIC8qKlxuICAgKiBBcnJheSBvZiBldmVudHMgdG8gZGlzcGxheSBpbiB0aGUgY2FsZW5kYXIuXG4gICAqL1xuICBldmVudHM/OiBDYWxlbmRhckV2ZW50c1tdXG4gIC8qKlxuICAgKiBUaGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIHRvIGRpc3BsYXkgaW4gdGhlIGNhbGVuZGFyLlxuICAgKiBDYW4gYmUgJ3N1bmRheScsICdtb25kYXknLCBldGMuIERlZmF1bHRzIHRvICdzdW5kYXknLlxuICAgKi9cbiAgZmlyc3REYXlPZldlZWs/OiBXZWVrRGF5c1xuICAvKipcbiAgICogQ3VzdG9tIHJlbmRlciBmdW5jdGlvbiBmb3IgY2FsZW5kYXIgZXZlbnRzLlxuICAgKiBJZiBwcm92aWRlZCwgaXQgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBldmVudCByZW5kZXJpbmcuXG4gICAqL1xuICByZW5kZXJFdmVudD86IChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gUmVhY3QuUmVhY3ROb2RlXG4gIC8qKlxuICAgKiBDYWxsYmFjayB3aGVuIGFuIGV2ZW50IGlzIGNsaWNrZWQuXG4gICAqIFByb3ZpZGVzIHRoZSBjbGlja2VkIGV2ZW50IG9iamVjdC5cbiAgICovXG4gIG9uRXZlbnRDbGljaz86IChldmVudDogQ2FsZW5kYXJFdmVudCkgPT4gdm9pZFxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiBhIGNhbGVuZGFyIGNlbGwgaXMgY2xpY2tlZC5cbiAgICogUHJvdmlkZXMgdGhlIHN0YXJ0IGFuZCBlbmQgZGF0ZSBvZiB0aGUgY2xpY2tlZCBjZWxsLlxuICAgKi9cbiAgb25DZWxsQ2xpY2s/OiAoc3RhcnREYXRlOiBkYXlqcy5EYXlqcywgZW5kRGF0ZTogZGF5anMuRGF5anMpID0+IHZvaWRcbiAgLyoqXG4gICAqIENhbGxiYWNrIHdoZW4gdGhlIGNhbGVuZGFyIHZpZXcgY2hhbmdlcyAobW9udGgsIHdlZWssIGRheSwgeWVhcikuXG4gICAqIFVzZWZ1bCBmb3Igc3luY2luZyB3aXRoIGV4dGVybmFsIHN0YXRlIG9yIGFuYWx5dGljcy5cbiAgICovXG4gIG9uVmlld0NoYW5nZT86ICh2aWV3OiAnbW9udGgnIHwgJ3dlZWsnIHwgJ2RheScgfCAneWVhcicpID0+IHZvaWRcbiAgLyoqXG4gICAqIExvY2FsZSB0byB1c2UgZm9yIGZvcm1hdHRpbmcgZGF0ZXMgYW5kIHRpbWVzLlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IGxvY2FsZSB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBsb2NhbGU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFRpbWV6b25lIHRvIHVzZSBmb3IgZGlzcGxheWluZyBkYXRlcyBhbmQgdGltZXMuXG4gICAqIElmIG5vdCBwcm92aWRlZCwgdGhlIGxvY2FsIHRpbWV6b25lIHdpbGwgYmUgdXNlZC5cbiAgICovXG4gIHRpbWV6b25lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGRpc2FibGUgY2xpY2sgZXZlbnRzIG9uIGNhbGVuZGFyIGNlbGxzLlxuICAgKiBVc2VmdWwgZm9yIHJlYWQtb25seSB2aWV3cyBvciB3aGVuIGNlbGwgY2xpY2tzIGFyZSBub3QgbmVlZGVkLlxuICAgKi9cbiAgZGlzYWJsZUNlbGxDbGljaz86IGJvb2xlYW5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZGlzYWJsZSBjbGljayBldmVudHMgb24gY2FsZW5kYXIgZXZlbnRzLlxuICAgKiBVc2VmdWwgZm9yIHJlYWQtb25seSB2aWV3cyBvciB3aGVuIGV2ZW50IGNsaWNrcyBhcmUgbm90IG5lZWRlZC5cbiAgICovXG4gIGRpc2FibGVFdmVudENsaWNrPzogYm9vbGVhblxuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIGRyYWctYW5kLWRyb3AgZnVuY3Rpb25hbGl0eSBmb3IgY2FsZW5kYXIgZXZlbnRzLlxuICAgKiBVc2VmdWwgZm9yIHJlYWQtb25seSB2aWV3cyBvciB3aGVuIGRyYWctYW5kLWRyb3AgaXMgbm90IG5lZWRlZC5cbiAgICovXG4gIGRpc2FibGVEcmFnQW5kRHJvcD86IGJvb2xlYW5cbiAgZGF5TWF4RXZlbnRzPzogbnVtYmVyXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHN0aWNrIHRoZSB2aWV3IGhlYWRlciB0byB0aGUgdG9wIG9mIHRoZSBjYWxlbmRhci5cbiAgICogVXNlZnVsIGZvciBrZWVwaW5nIHRoZSBoZWFkZXIgdmlzaWJsZSB3aGlsZSBzY3JvbGxpbmcuXG4gICAqL1xuICBzdGlja3lWaWV3SGVhZGVyPzogYm9vbGVhblxuICAvKipcbiAgICogQ3VzdG9tIGNsYXNzIG5hbWUgZm9yIHRoZSB2aWV3IGhlYWRlci5cbiAgICogVXNlZnVsIGZvciBhcHBseWluZyBjdXN0b20gc3R5bGVzIG9yIHRoZW1lcy5cbiAgICovXG4gIHZpZXdIZWFkZXJDbGFzc05hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIEN1c3RvbSBoZWFkZXIgY29tcG9uZW50IHRvIHJlcGxhY2UgdGhlIGRlZmF1bHQgY2FsZW5kYXIgaGVhZGVyLlxuICAgKiBVc2VmdWwgZm9yIGFkZGluZyBjdXN0b20gYnJhbmRpbmcgb3IgYWRkaXRpb25hbCBjb250cm9scy5cbiAgICovXG4gIGhlYWRlckNvbXBvbmVudD86IFJlYWN0LlJlYWN0Tm9kZVxufVxuXG5jb25zdCBkYXlOdW1iZXJNYXA6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gIHN1bmRheTogMCxcbiAgbW9uZGF5OiAxLFxuICB0dWVzZGF5OiAyLFxuICB3ZWRuZXNkYXk6IDMsXG4gIHRodXJzZGF5OiA0LFxuICBmcmlkYXk6IDUsXG4gIHNhdHVyZGF5OiA2LFxufVxuXG5jb25zdCBERUZBVUxUX0RBWV9NQVhfRVZFTlRTID0gNFxuZXhwb3J0IGNvbnN0IElsYW15Q2FsZW5kYXI6IFJlYWN0LkZDPENhbGVuZGFyUHJvcHM+ID0gKHtcbiAgZXZlbnRzLFxuICBmaXJzdERheU9mV2VlayA9ICdzdW5kYXknLFxuICByZW5kZXJFdmVudCxcbiAgb25FdmVudENsaWNrLFxuICBvbkNlbGxDbGljayxcbiAgb25WaWV3Q2hhbmdlLFxuICBsb2NhbGUsXG4gIHRpbWV6b25lLFxuICBkaXNhYmxlQ2VsbENsaWNrLFxuICBkaXNhYmxlRXZlbnRDbGljayxcbiAgZGlzYWJsZURyYWdBbmREcm9wLFxuICBkYXlNYXhFdmVudHMgPSBERUZBVUxUX0RBWV9NQVhfRVZFTlRTLFxuICBzdGlja3lWaWV3SGVhZGVyID0gdHJ1ZSxcbiAgdmlld0hlYWRlckNsYXNzTmFtZSA9ICcnLFxuICBoZWFkZXJDb21wb25lbnQsXG59KSA9PiB7XG4gIHJldHVybiAoXG4gICAgPENhbGVuZGFyUHJvdmlkZXJcbiAgICAgIGV2ZW50cz17bm9ybWFsaXplQ2FsZW5kYXJFdmVudHMoZXZlbnRzIHx8IFtdKX1cbiAgICAgIGZpcnN0RGF5T2ZXZWVrPXtkYXlOdW1iZXJNYXBbZmlyc3REYXlPZldlZWtdfVxuICAgICAgcmVuZGVyRXZlbnQ9e3JlbmRlckV2ZW50fVxuICAgICAgb25FdmVudENsaWNrPXtvbkV2ZW50Q2xpY2t9XG4gICAgICBvbkNlbGxDbGljaz17b25DZWxsQ2xpY2t9XG4gICAgICBvblZpZXdDaGFuZ2U9e29uVmlld0NoYW5nZX1cbiAgICAgIGxvY2FsZT17bG9jYWxlfVxuICAgICAgdGltZXpvbmU9e3RpbWV6b25lfVxuICAgICAgZGlzYWJsZUNlbGxDbGljaz17ZGlzYWJsZUNlbGxDbGlja31cbiAgICAgIGRpc2FibGVFdmVudENsaWNrPXtkaXNhYmxlRXZlbnRDbGlja31cbiAgICAgIGRpc2FibGVEcmFnQW5kRHJvcD17ZGlzYWJsZURyYWdBbmREcm9wfVxuICAgICAgZGF5TWF4RXZlbnRzPXtkYXlNYXhFdmVudHN9XG4gICAgICBzdGlja3lWaWV3SGVhZGVyPXtzdGlja3lWaWV3SGVhZGVyfVxuICAgICAgdmlld0hlYWRlckNsYXNzTmFtZT17dmlld0hlYWRlckNsYXNzTmFtZX1cbiAgICAgIGhlYWRlckNvbXBvbmVudD17aGVhZGVyQ29tcG9uZW50fVxuICAgID5cbiAgICAgIDxDYWxlbmRhckNvbnRlbnQgLz5cbiAgICA8L0NhbGVuZGFyUHJvdmlkZXI+XG4gIClcbn1cbiIsCiAgICAiaW1wb3J0IHtcbiAgRG5kQ29udGV4dCxcbiAgRHJhZ092ZXJsYXksXG4gIE1vdXNlU2Vuc29yLFxuICBwb2ludGVyV2l0aGluLFxuICBUb3VjaFNlbnNvcixcbiAgdXNlU2Vuc29yLFxuICB1c2VTZW5zb3JzLFxufSBmcm9tICdAZG5kLWtpdC9jb3JlJ1xuaW1wb3J0IHsgdXNlQ2FsZW5kYXJDb250ZXh0IH0gZnJvbSAnQC9jb250ZXh0cy9jYWxlbmRhci1jb250ZXh0L2NvbnRleHQnXG5pbXBvcnQgeyBjbiB9IGZyb20gJ0AvbGliL3V0aWxzJ1xuaW1wb3J0IGRheWpzIGZyb20gJ0AvbGliL2RheWpzLWNvbmZpZydcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCdcbmltcG9ydCB0eXBlIHtcbiAgRHJhZ0NhbmNlbEV2ZW50LFxuICBEcmFnRW5kRXZlbnQsXG4gIERyYWdTdGFydEV2ZW50LFxufSBmcm9tICdAZG5kLWtpdC9jb3JlJ1xuaW1wb3J0IHsgc25hcENlbnRlclRvQ3Vyc29yIH0gZnJvbSAnQGRuZC1raXQvbW9kaWZpZXJzJ1xuaW1wb3J0IHR5cGUgeyBDYWxlbmRhckV2ZW50IH0gZnJvbSAnQC9jb21wb25lbnRzL3R5cGVzJ1xuXG5pbnRlcmZhY2UgQ2FsZW5kYXJEbmRDb250ZXh0UHJvcHMge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBDYWxlbmRhckRuZENvbnRleHQoeyBjaGlsZHJlbiB9OiBDYWxlbmRhckRuZENvbnRleHRQcm9wcykge1xuICBjb25zdCB7IHVwZGF0ZUV2ZW50LCB2aWV3LCBkaXNhYmxlRHJhZ0FuZERyb3AgfSA9IHVzZUNhbGVuZGFyQ29udGV4dCgpXG4gIGNvbnN0IFthY3RpdmVFdmVudCwgc2V0QWN0aXZlRXZlbnRdID0gUmVhY3QudXNlU3RhdGU8Q2FsZW5kYXJFdmVudCB8IG51bGw+KFxuICAgIG51bGxcbiAgKVxuXG4gIC8vIENvbmZpZ3VyZSBzZW5zb3JzIHdpdGggcmVkdWNlZCBhY3RpdmF0aW9uIGNvbnN0cmFpbnRzIGZvciBlYXNpZXIgZHJhZ2dpbmdcbiAgY29uc3QgbW91c2VTZW5zb3IgPSB1c2VTZW5zb3IoTW91c2VTZW5zb3IsIHtcbiAgICAvLyBSZXF1aXJlIG1pbmltYWwgbW92ZW1lbnQgYmVmb3JlIGFjdGl2YXRpbmdcbiAgICBhY3RpdmF0aW9uQ29uc3RyYWludDoge1xuICAgICAgZGlzdGFuY2U6IDIsXG4gICAgfSxcbiAgfSlcblxuICBjb25zdCB0b3VjaFNlbnNvciA9IHVzZVNlbnNvcihUb3VjaFNlbnNvciwge1xuICAgIC8vIFJlZHVjZSBkZWxheSBmb3IgdG91Y2ggZGV2aWNlc1xuICAgIGFjdGl2YXRpb25Db25zdHJhaW50OiB7XG4gICAgICBkZWxheTogMTAwLFxuICAgICAgdG9sZXJhbmNlOiA1LFxuICAgIH0sXG4gIH0pXG5cbiAgY29uc3Qgc2Vuc29ycyA9IHVzZVNlbnNvcnMobW91c2VTZW5zb3IsIHRvdWNoU2Vuc29yKVxuXG4gIGNvbnN0IGhhbmRsZURyYWdTdGFydCA9IChldmVudDogRHJhZ1N0YXJ0RXZlbnQpID0+IHtcbiAgICBjb25zdCB7IGFjdGl2ZSB9ID0gZXZlbnRcblxuICAgIC8vIFNldCB0aGUgYWN0aXZlIGV2ZW50IGJhc2VkIG9uIHRoZSBldmVudCBkYXRhXG4gICAgaWYgKGFjdGl2ZS5kYXRhLmN1cnJlbnQ/LnR5cGUgPT09ICdjYWxlbmRhci1ldmVudCcpIHtcbiAgICAgIHNldEFjdGl2ZUV2ZW50KGFjdGl2ZS5kYXRhLmN1cnJlbnQuZXZlbnQpXG4gICAgfVxuICB9XG5cbiAgY29uc3QgaGFuZGxlRHJhZ0VuZCA9IChldmVudDogRHJhZ0VuZEV2ZW50KSA9PiB7XG4gICAgY29uc3QgeyBhY3RpdmUsIG92ZXIgfSA9IGV2ZW50XG5cbiAgICBpZiAoIWFjdGl2ZSB8fCAhb3ZlciB8fCAhYWN0aXZlRXZlbnQpIHtcbiAgICAgIHNldEFjdGl2ZUV2ZW50KG51bGwpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAob3Zlci5kYXRhLmN1cnJlbnQ/LnR5cGUgPT09ICd0aW1lLWNlbGwnKSB7XG4gICAgICBjb25zdCB7IGRhdGUsIGhvdXIgPSAwLCBtaW51dGUgPSAwIH0gPSBvdmVyLmRhdGEuY3VycmVudFxuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGV2ZW50IGR1cmF0aW9uIGluIG1pbnV0ZXNcbiAgICAgIGNvbnN0IG9yaWdpbmFsU3RhcnQgPSBhY3RpdmVFdmVudC5vcmlnaW5hbFN0YXJ0ID8/IGFjdGl2ZUV2ZW50LnN0YXJ0XG4gICAgICBjb25zdCBvcmlnaW5hbEVuZCA9IGFjdGl2ZUV2ZW50Lm9yaWdpbmFsRW5kID8/IGFjdGl2ZUV2ZW50LmVuZFxuICAgICAgY29uc3QgZHVyYXRpb25NaW51dGVzID0gb3JpZ2luYWxFbmQuZGlmZihvcmlnaW5hbFN0YXJ0LCAnbWludXRlJylcblxuICAgICAgLy8gQ3JlYXRlIG5ldyBzdGFydCB0aW1lIGJhc2VkIG9uIHRoZSBkcm9wIHRhcmdldFxuICAgICAgY29uc3QgbmV3U3RhcnQgPSBkYXlqcyhkYXRlKVxuICAgICAgICAuaG91cihob3VyKVxuICAgICAgICAubWludXRlKG1pbnV0ZSB8fCAwKVxuXG4gICAgICAvLyBDcmVhdGUgbmV3IGVuZCB0aW1lIGJ5IGFkZGluZyB0aGUgb3JpZ2luYWwgZHVyYXRpb25cbiAgICAgIGxldCBuZXdFbmQgPSBuZXdTdGFydC5hZGQoZHVyYXRpb25NaW51dGVzLCAnbWludXRlJylcbiAgICAgIGlmIChuZXdFbmQuaXNTYW1lKG5ld0VuZC5zdGFydE9mKCdkYXknKSkpIHtcbiAgICAgICAgLy8gSWYgdGhlIG5ldyBlbmQgdGltZSBpcyBhdCBtaWRuaWdodCwgc2V0IGl0IHRvIDI0IGhvdXJzIG9mIHBhcnRpYWwgZGF5XG4gICAgICAgIG5ld0VuZCA9IG5ld0VuZC5zdWJ0cmFjdCgxLCAnZGF5JykuZW5kT2YoJ2RheScpXG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSB0aGUgZXZlbnQgd2l0aCBuZXcgdGltZXNcbiAgICAgIHVwZGF0ZUV2ZW50KGFjdGl2ZUV2ZW50LmlkLCB7XG4gICAgICAgIHN0YXJ0OiBuZXdTdGFydCxcbiAgICAgICAgZW5kOiBuZXdFbmQsXG4gICAgICB9KVxuICAgIH0gZWxzZSBpZiAob3Zlci5kYXRhLmN1cnJlbnQ/LnR5cGUgPT09ICdkYXktY2VsbCcpIHtcbiAgICAgIGNvbnN0IHsgZGF0ZSB9ID0gb3Zlci5kYXRhLmN1cnJlbnRcbiAgICAgIGNvbnN0IG5ld0RhdGUgPSBkYXlqcyhkYXRlKVxuXG4gICAgICAvLyBGb3IgbXVsdGktZGF5IGV2ZW50cywgd2UgbmVlZCB0byBwcmVzZXJ2ZSB0aGUgZHVyYXRpb24gaW4gZGF5c1xuICAgICAgY29uc3QgaXNNdWx0aURheUV2ZW50ID0gIWFjdGl2ZUV2ZW50LnN0YXJ0LmlzU2FtZShhY3RpdmVFdmVudC5lbmQsICdkYXknKVxuICAgICAgY29uc3Qgb3JpZ2luYWxTdGFydCA9IGFjdGl2ZUV2ZW50Lm9yaWdpbmFsU3RhcnQgPz8gYWN0aXZlRXZlbnQuc3RhcnRcbiAgICAgIGNvbnN0IG9yaWdpbmFsRW5kID0gYWN0aXZlRXZlbnQub3JpZ2luYWxFbmQgPz8gYWN0aXZlRXZlbnQuZW5kXG5cbiAgICAgIGlmIChpc011bHRpRGF5RXZlbnQpIHtcbiAgICAgICAgaWYgKHZpZXcgPT09ICd3ZWVrJykge1xuICAgICAgICAgIC8vIEdldCB0aW1lIGNvbXBvbmVudHMgdG8gcHJlc2VydmVcbiAgICAgICAgICBjb25zdCBzdGFydEhvdXIgPSBvcmlnaW5hbFN0YXJ0LmhvdXIoKVxuICAgICAgICAgIGNvbnN0IHN0YXJ0TWludXRlID0gb3JpZ2luYWxTdGFydC5taW51dGUoKVxuICAgICAgICAgIGNvbnN0IGVuZEhvdXIgPSBvcmlnaW5hbEVuZC5ob3VyKClcbiAgICAgICAgICBjb25zdCBlbmRNaW51dGUgPSBvcmlnaW5hbEVuZC5taW51dGUoKVxuXG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIGR1cmF0aW9uIGluIGRheXMgdG8gcHJlc2VydmVcbiAgICAgICAgICBjb25zdCBkdXJhdGlvbkRheXMgPSBvcmlnaW5hbEVuZC5kaWZmKG9yaWdpbmFsU3RhcnQsICdkYXknKVxuXG4gICAgICAgICAgLy8gQ3JlYXRlIG5ldyBzdGFydCBhbmQgZW5kIGRhdGVzXG4gICAgICAgICAgY29uc3QgbmV3U3RhcnQgPSBuZXdEYXRlXG4gICAgICAgICAgICAuc3RhcnRPZignZGF5JylcbiAgICAgICAgICAgIC5ob3VyKHN0YXJ0SG91cilcbiAgICAgICAgICAgIC5taW51dGUoc3RhcnRNaW51dGUpXG4gICAgICAgICAgY29uc3QgbmV3RW5kID0gbmV3U3RhcnRcbiAgICAgICAgICAgIC5hZGQoZHVyYXRpb25EYXlzLCAnZGF5JylcbiAgICAgICAgICAgIC5ob3VyKGVuZEhvdXIpXG4gICAgICAgICAgICAubWludXRlKGVuZE1pbnV0ZSlcblxuICAgICAgICAgIHVwZGF0ZUV2ZW50KGFjdGl2ZUV2ZW50LmlkLCB7XG4gICAgICAgICAgICBzdGFydDogbmV3U3RhcnQsXG4gICAgICAgICAgICBlbmQ6IG5ld0VuZCxcbiAgICAgICAgICAgIG9yaWdpbmFsU3RhcnQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9yaWdpbmFsRW5kOiB1bmRlZmluZWQsXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBGb3Igb3RoZXIgdmlld3MgbGlrZSBtb250aCB2aWV3XG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBkYXRlIHNoaWZ0IChob3cgbWFueSBkYXlzIHdlJ3JlIG1vdmluZyB0aGUgZXZlbnQpXG4gICAgICAgICAgY29uc3QgZGF5c0RpZmZlcmVuY2UgPSBuZXdEYXRlLmRpZmYoXG4gICAgICAgICAgICBvcmlnaW5hbFN0YXJ0LnN0YXJ0T2YoJ2RheScpLFxuICAgICAgICAgICAgJ2RheSdcbiAgICAgICAgICApXG5cbiAgICAgICAgICAvLyBDYWxjdWxhdGUgbmV3IHN0YXJ0IGFuZCBlbmQgd2hpbGUgcHJlc2VydmluZyB0aW1lIGNvbXBvbmVudHNcbiAgICAgICAgICBjb25zdCBuZXdTdGFydCA9IG9yaWdpbmFsU3RhcnQuYWRkKGRheXNEaWZmZXJlbmNlLCAnZGF5JylcbiAgICAgICAgICBjb25zdCBuZXdFbmQgPSBvcmlnaW5hbEVuZC5hZGQoZGF5c0RpZmZlcmVuY2UsICdkYXknKVxuXG4gICAgICAgICAgdXBkYXRlRXZlbnQoYWN0aXZlRXZlbnQuaWQsIHtcbiAgICAgICAgICAgIHN0YXJ0OiBuZXdTdGFydCxcbiAgICAgICAgICAgIGVuZDogbmV3RW5kLFxuICAgICAgICAgICAgb3JpZ2luYWxTdGFydDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgb3JpZ2luYWxFbmQ6IHVuZGVmaW5lZCxcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBGb3Igc2luZ2xlLWRheSBldmVudHMsIG1haW50YWluIHRoZSB0aW1lIGJ1dCBjaGFuZ2UgdGhlIGRhdGVcbiAgICAgICAgY29uc3QgbmV3U3RhcnQgPSBuZXdEYXRlXG4gICAgICAgICAgLmhvdXIoYWN0aXZlRXZlbnQuc3RhcnQuaG91cigpKVxuICAgICAgICAgIC5taW51dGUoYWN0aXZlRXZlbnQuc3RhcnQubWludXRlKCkpXG5cbiAgICAgICAgLy8gQ2FsY3VsYXRlIGV2ZW50IGR1cmF0aW9uIGFuZCBzZXQgbmV3IGVuZCB0aW1lXG4gICAgICAgIGNvbnN0IGR1cmF0aW9uTWludXRlcyA9IGFjdGl2ZUV2ZW50LmVuZC5kaWZmKFxuICAgICAgICAgIGFjdGl2ZUV2ZW50LnN0YXJ0LFxuICAgICAgICAgICdtaW51dGUnXG4gICAgICAgIClcbiAgICAgICAgY29uc3QgbmV3RW5kID0gbmV3U3RhcnQuYWRkKGR1cmF0aW9uTWludXRlcywgJ21pbnV0ZScpXG5cbiAgICAgICAgdXBkYXRlRXZlbnQoYWN0aXZlRXZlbnQuaWQsIHtcbiAgICAgICAgICBzdGFydDogbmV3U3RhcnQsXG4gICAgICAgICAgZW5kOiBuZXdFbmQsXG4gICAgICAgICAgb3JpZ2luYWxTdGFydDogdW5kZWZpbmVkLFxuICAgICAgICAgIG9yaWdpbmFsRW5kOiB1bmRlZmluZWQsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0QWN0aXZlRXZlbnQobnVsbClcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZURyYWdDYW5jZWwgPSAoX2V2ZW50OiBEcmFnQ2FuY2VsRXZlbnQpID0+IHtcbiAgICBzZXRBY3RpdmVFdmVudChudWxsKVxuICB9XG5cbiAgLy8gSWYgZHJhZyBhbmQgZHJvcCBpcyBkaXNhYmxlZCwganVzdCByZXR1cm4gY2hpbGRyZW4gd2l0aG91dCBEbmRDb250ZXh0XG4gIGlmIChkaXNhYmxlRHJhZ0FuZERyb3ApIHtcbiAgICByZXR1cm4gY2hpbGRyZW4gYXMgUmVhY3QuUmVhY3RFbGVtZW50XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxEbmRDb250ZXh0XG4gICAgICBzZW5zb3JzPXtzZW5zb3JzfVxuICAgICAgb25EcmFnU3RhcnQ9e2hhbmRsZURyYWdTdGFydH1cbiAgICAgIG9uRHJhZ0VuZD17aGFuZGxlRHJhZ0VuZH1cbiAgICAgIG9uRHJhZ0NhbmNlbD17aGFuZGxlRHJhZ0NhbmNlbH1cbiAgICAgIGNvbGxpc2lvbkRldGVjdGlvbj17cG9pbnRlcldpdGhpbn1cbiAgICA+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgICA8RHJhZ092ZXJsYXkgbW9kaWZpZXJzPXtbc25hcENlbnRlclRvQ3Vyc29yXX0+XG4gICAgICAgIHthY3RpdmVFdmVudCAmJiAoXG4gICAgICAgICAgPGRpdlxuICAgICAgICAgICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICAgICAgICAgJ2N1cnNvci1ncmFiIHRydW5jYXRlIHJvdW5kZWQgYmctYW1iZXItMjAwIHAtMiB0ZXh0LVsxMHB4XSBzaGFkb3ctbGcgc206dGV4dC14cycsXG4gICAgICAgICAgICAgIGFjdGl2ZUV2ZW50LmJhY2tncm91bmRDb2xvciB8fCAnYmctYmx1ZS01MDAnLFxuICAgICAgICAgICAgICBhY3RpdmVFdmVudC5jb2xvciB8fCAndGV4dC13aGl0ZSdcbiAgICAgICAgICAgICl9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2FjdGl2ZUV2ZW50Py50aXRsZX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKX1cbiAgICAgIDwvRHJhZ092ZXJsYXk+XG4gICAgPC9EbmRDb250ZXh0PlxuICApXG59XG4iLAogICAgImltcG9ydCBkYXlqcyBmcm9tICdAL2xpYi9kYXlqcy1jb25maWcnXG5pbXBvcnQgUmVhY3QsIHtcbiAgdXNlQ2FsbGJhY2ssXG4gIHVzZUVmZmVjdCxcbiAgdXNlTWVtbyxcbiAgdXNlU3RhdGUsXG4gIHR5cGUgUmVhY3ROb2RlLFxufSBmcm9tICdyZWFjdCdcbmltcG9ydCB7IENhbGVuZGFyQ29udGV4dCB9IGZyb20gJy4vY29udGV4dCdcbmltcG9ydCB0eXBlIHsgQ2FsZW5kYXJFdmVudCB9IGZyb20gJ0AvY29tcG9uZW50cy90eXBlcydcblxuaW50ZXJmYWNlIENhbGVuZGFyUHJvdmlkZXJQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdE5vZGVcbiAgZXZlbnRzPzogQ2FsZW5kYXJFdmVudFtdXG4gIGZpcnN0RGF5T2ZXZWVrPzogbnVtYmVyIC8vIDAgZm9yIFN1bmRheSwgMSBmb3IgTW9uZGF5LCBldGMuXG4gIHJlbmRlckV2ZW50PzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiBSZWFjdE5vZGVcbiAgb25FdmVudENsaWNrPzogKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB2b2lkXG4gIG9uQ2VsbENsaWNrPzogKHN0YXJ0RGF0ZTogZGF5anMuRGF5anMsIGVuZERhdGU6IGRheWpzLkRheWpzKSA9PiB2b2lkXG4gIG9uVmlld0NoYW5nZT86ICh2aWV3OiAnbW9udGgnIHwgJ3dlZWsnIHwgJ2RheScgfCAneWVhcicpID0+IHZvaWRcbiAgbG9jYWxlPzogc3RyaW5nXG4gIHRpbWV6b25lPzogc3RyaW5nXG4gIGRpc2FibGVDZWxsQ2xpY2s/OiBib29sZWFuXG4gIGRpc2FibGVFdmVudENsaWNrPzogYm9vbGVhblxuICBkaXNhYmxlRHJhZ0FuZERyb3A/OiBib29sZWFuXG4gIGRheU1heEV2ZW50czogbnVtYmVyXG4gIHN0aWNreVZpZXdIZWFkZXI6IGJvb2xlYW5cbiAgdmlld0hlYWRlckNsYXNzTmFtZTogc3RyaW5nXG4gIGhlYWRlckNvbXBvbmVudD86IFJlYWN0Tm9kZSAvLyBPcHRpb25hbCBjdXN0b20gaGVhZGVyIGNvbXBvbmVudFxufVxuXG5leHBvcnQgY29uc3QgQ2FsZW5kYXJQcm92aWRlcjogUmVhY3QuRkM8Q2FsZW5kYXJQcm92aWRlclByb3BzPiA9ICh7XG4gIGNoaWxkcmVuLFxuICBldmVudHMgPSBbXSxcbiAgZmlyc3REYXlPZldlZWsgPSAwLCAvLyBEZWZhdWx0IHRvIFN1bmRheSxcbiAgcmVuZGVyRXZlbnQsXG4gIG9uRXZlbnRDbGljayxcbiAgb25DZWxsQ2xpY2ssXG4gIG9uVmlld0NoYW5nZSxcbiAgbG9jYWxlLFxuICB0aW1lem9uZSxcbiAgZGlzYWJsZUNlbGxDbGljayxcbiAgZGlzYWJsZUV2ZW50Q2xpY2ssXG4gIGRpc2FibGVEcmFnQW5kRHJvcCxcbiAgZGF5TWF4RXZlbnRzLFxuICBzdGlja3lWaWV3SGVhZGVyLFxuICB2aWV3SGVhZGVyQ2xhc3NOYW1lLFxuICBoZWFkZXJDb21wb25lbnQsXG59KSA9PiB7XG4gIC8vIFN0YXRlXG4gIGNvbnN0IFtjdXJyZW50RGF0ZSwgc2V0Q3VycmVudERhdGVdID0gdXNlU3RhdGU8ZGF5anMuRGF5anM+KGRheWpzKCkpXG4gIGNvbnN0IFt2aWV3LCBzZXRWaWV3XSA9IHVzZVN0YXRlPCdtb250aCcgfCAnd2VlaycgfCAnZGF5JyB8ICd5ZWFyJz4oJ21vbnRoJylcbiAgY29uc3QgW2N1cnJlbnRFdmVudHMsIHNldEN1cnJlbnRFdmVudHNdID0gdXNlU3RhdGU8Q2FsZW5kYXJFdmVudFtdPihldmVudHMpXG4gIGNvbnN0IFtpc0V2ZW50Rm9ybU9wZW4sIHNldElzRXZlbnRGb3JtT3Blbl0gPSB1c2VTdGF0ZTxib29sZWFuPihmYWxzZSlcbiAgY29uc3QgW3NlbGVjdGVkRXZlbnQsIHNldFNlbGVjdGVkRXZlbnRdID0gdXNlU3RhdGU8Q2FsZW5kYXJFdmVudCB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtzZWxlY3RlZERhdGUsIHNldFNlbGVjdGVkRGF0ZV0gPSB1c2VTdGF0ZTxkYXlqcy5EYXlqcyB8IG51bGw+KG51bGwpXG4gIGNvbnN0IFtjdXJyZW50TG9jYWxlLCBzZXRDdXJyZW50TG9jYWxlXSA9IHVzZVN0YXRlPHN0cmluZz4obG9jYWxlIHx8ICdlbicpXG4gIGNvbnN0IFtjdXJyZW50VGltZXpvbmUsIHNldEN1cnJlbnRUaW1lem9uZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KHRpbWV6b25lIHx8ICcnKVxuXG4gIC8vIFVwZGF0ZSBldmVudHMgd2hlbiBldmVudHMgcHJvcCBjaGFuZ2VzXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKGV2ZW50cykge1xuICAgICAgc2V0Q3VycmVudEV2ZW50cyhldmVudHMpXG4gICAgfVxuICB9LCBbZXZlbnRzXSlcblxuICAvLyBDb25maWd1cmUgbG9jYWxlIHdoZW4gbG9jYWxlIHByb3AgY2hhbmdlc1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmIChsb2NhbGUpIHtcbiAgICAgIHNldEN1cnJlbnRMb2NhbGUobG9jYWxlKVxuICAgICAgZGF5anMubG9jYWxlKGxvY2FsZSlcbiAgICB9XG4gIH0sIFtsb2NhbGVdKVxuXG4gIC8vIENvbmZpZ3VyZSB0aW1lem9uZSBmb3IgY3VycmVudERhdGUgd2hlbiB0aW1lem9uZSBwcm9wIGNoYW5nZXNcbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAodGltZXpvbmUpIHtcbiAgICAgIHNldEN1cnJlbnRUaW1lem9uZSh0aW1lem9uZSlcbiAgICAgIGRheWpzLnR6LnNldERlZmF1bHQodGltZXpvbmUpXG4gICAgfVxuICB9LCBbdGltZXpvbmVdKVxuXG4gIC8vIEhhbmRsZXJzXG4gIGNvbnN0IHNlbGVjdERhdGUgPSB1c2VDYWxsYmFjaygoZGF0ZTogZGF5anMuRGF5anMpID0+IHtcbiAgICBzZXRDdXJyZW50RGF0ZShkYXRlKVxuICB9LCBbXSlcblxuICBjb25zdCBuZXh0UGVyaW9kID0gdXNlQ2FsbGJhY2soKCkgPT4ge1xuICAgIHN3aXRjaCAodmlldykge1xuICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLmFkZCgxLCAnbW9udGgnKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLmFkZCgxLCAnd2VlaycpKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgc2V0Q3VycmVudERhdGUoKGN1cnJlbnREYXRlKSA9PiBjdXJyZW50RGF0ZS5hZGQoMSwgJ2RheScpKVxuICAgICAgICBicmVha1xuICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgIHNldEN1cnJlbnREYXRlKChjdXJyZW50RGF0ZSkgPT4gY3VycmVudERhdGUuYWRkKDEsICd5ZWFyJykpXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9LCBbdmlld10pXG5cbiAgY29uc3QgcHJldlBlcmlvZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzd2l0Y2ggKHZpZXcpIHtcbiAgICAgIGNhc2UgJ21vbnRoJzpcbiAgICAgICAgc2V0Q3VycmVudERhdGUoKGN1cnJlbnREYXRlKSA9PiBjdXJyZW50RGF0ZS5zdWJ0cmFjdCgxLCAnbW9udGgnKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLnN1YnRyYWN0KDEsICd3ZWVrJykpXG4gICAgICAgIGJyZWFrXG4gICAgICBjYXNlICdkYXknOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLnN1YnRyYWN0KDEsICdkYXknKSlcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICBzZXRDdXJyZW50RGF0ZSgoY3VycmVudERhdGUpID0+IGN1cnJlbnREYXRlLnN1YnRyYWN0KDEsICd5ZWFyJykpXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9LCBbdmlld10pXG5cbiAgY29uc3QgdG9kYXkgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgc2V0Q3VycmVudERhdGUoZGF5anMoKSlcbiAgfSwgW10pXG5cbiAgY29uc3QgYWRkRXZlbnQgPSB1c2VDYWxsYmFjaygoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHtcbiAgICBzZXRDdXJyZW50RXZlbnRzKChwcmV2RXZlbnRzKSA9PiBbLi4ucHJldkV2ZW50cywgZXZlbnRdKVxuICB9LCBbXSlcblxuICBjb25zdCB1cGRhdGVFdmVudCA9IHVzZUNhbGxiYWNrKFxuICAgIChldmVudElkOiBzdHJpbmcsIHVwZGF0ZWRFdmVudDogUGFydGlhbDxDYWxlbmRhckV2ZW50PikgPT4ge1xuICAgICAgc2V0Q3VycmVudEV2ZW50cygocHJldkV2ZW50cykgPT5cbiAgICAgICAgcHJldkV2ZW50cy5tYXAoKGV2ZW50KSA9PlxuICAgICAgICAgIGV2ZW50LmlkID09PSBldmVudElkID8geyAuLi5ldmVudCwgLi4udXBkYXRlZEV2ZW50IH0gOiBldmVudFxuICAgICAgICApXG4gICAgICApXG4gICAgfSxcbiAgICBbXVxuICApXG5cbiAgY29uc3QgZGVsZXRlRXZlbnQgPSB1c2VDYWxsYmFjaygoZXZlbnRJZDogc3RyaW5nKSA9PiB7XG4gICAgc2V0Q3VycmVudEV2ZW50cygocHJldkV2ZW50cykgPT5cbiAgICAgIHByZXZFdmVudHMuZmlsdGVyKChldmVudCkgPT4gZXZlbnQuaWQgIT09IGV2ZW50SWQpXG4gICAgKVxuICB9LCBbXSlcblxuICBjb25zdCBlZGl0RXZlbnQgPSB1c2VDYWxsYmFjaygoZXZlbnQ6IENhbGVuZGFyRXZlbnQpID0+IHtcbiAgICBzZXRTZWxlY3RlZEV2ZW50KGV2ZW50KVxuICAgIHNldElzRXZlbnRGb3JtT3Blbih0cnVlKVxuICB9LCBbXSlcblxuICBjb25zdCBjbG9zZUV2ZW50Rm9ybSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICBzZXRTZWxlY3RlZERhdGUobnVsbClcbiAgICBzZXRTZWxlY3RlZEV2ZW50KG51bGwpXG4gICAgc2V0SXNFdmVudEZvcm1PcGVuKGZhbHNlKVxuICB9LCBbXSlcblxuICAvLyBDdXN0b20gaGFuZGxlcnMgdGhhdCBjYWxsIGV4dGVybmFsIGNhbGxiYWNrc1xuICBjb25zdCBoYW5kbGVWaWV3Q2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKG5ld1ZpZXc6ICdtb250aCcgfCAnd2VlaycgfCAnZGF5JyB8ICd5ZWFyJykgPT4ge1xuICAgICAgc2V0VmlldyhuZXdWaWV3KVxuICAgICAgb25WaWV3Q2hhbmdlPy4obmV3VmlldylcbiAgICB9LFxuICAgIFtvblZpZXdDaGFuZ2VdXG4gIClcblxuICBjb25zdCBoYW5kbGVFdmVudENsaWNrID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgICBpZiAoZGlzYWJsZUNlbGxDbGljaykgcmV0dXJuXG4gICAgICBpZiAob25FdmVudENsaWNrKSB7XG4gICAgICAgIG9uRXZlbnRDbGljayhldmVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVkaXRFdmVudChldmVudClcbiAgICAgIH1cbiAgICB9LFxuICAgIFtkaXNhYmxlQ2VsbENsaWNrLCBvbkV2ZW50Q2xpY2ssIGVkaXRFdmVudF1cbiAgKVxuXG4gIGNvbnN0IGhhbmRsZURhdGVDbGljayA9IHVzZUNhbGxiYWNrKFxuICAgIChzdGFydERhdGU6IGRheWpzLkRheWpzLCBlbmREYXRlOiBkYXlqcy5EYXlqcykgPT4ge1xuICAgICAgaWYgKGRpc2FibGVDZWxsQ2xpY2spIHJldHVyblxuXG4gICAgICBpZiAob25DZWxsQ2xpY2spIHtcbiAgICAgICAgb25DZWxsQ2xpY2soc3RhcnREYXRlLCBlbmREYXRlKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0U2VsZWN0ZWREYXRlKHN0YXJ0RGF0ZSlcbiAgICAgICAgc2V0U2VsZWN0ZWRFdmVudCh7XG4gICAgICAgICAgdGl0bGU6IGBOZXcgRXZlbnRgLFxuICAgICAgICAgIHN0YXJ0OiBzdGFydERhdGUsXG4gICAgICAgICAgZW5kOiBlbmREYXRlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICBhbGxEYXk6IGZhbHNlLFxuICAgICAgICAgIGlzUmVjdXJyaW5nOiBmYWxzZSxcbiAgICAgICAgICByZWN1cnJlbmNlOiBudWxsLFxuICAgICAgICAgIHBhcmVudEV2ZW50SWQ6IG51bGwsXG4gICAgICAgIH0gYXMgQ2FsZW5kYXJFdmVudClcbiAgICAgICAgc2V0SXNFdmVudEZvcm1PcGVuKHRydWUpXG4gICAgICB9XG4gICAgfSxcbiAgICBbb25DZWxsQ2xpY2ssIGRpc2FibGVDZWxsQ2xpY2tdXG4gIClcblxuICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBuZXh0IG9jY3VycmVuY2UgYmFzZWQgb24gZnJlcXVlbmN5XG4gIGNvbnN0IGdldE5leHRPY2N1cnJlbmNlID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgZGF0ZTogZGF5anMuRGF5anMsXG4gICAgICBmcmVxOiAnZGFpbHknIHwgJ3dlZWtseScgfCAnbW9udGhseScgfCAneWVhcmx5JyxcbiAgICAgIGludDogbnVtYmVyLFxuICAgICAgZGF5cz86IG51bWJlcltdXG4gICAgKTogZGF5anMuRGF5anMgPT4ge1xuICAgICAgc3dpdGNoIChmcmVxKSB7XG4gICAgICAgIGNhc2UgJ2RhaWx5JzpcbiAgICAgICAgICByZXR1cm4gZGF0ZS5hZGQoaW50LCAnZGF5JylcbiAgICAgICAgY2FzZSAnd2Vla2x5JzpcbiAgICAgICAgICBpZiAoZGF5cyAmJiBkYXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgc3BlY2lmaWMgZGF5cyBvZiB0aGUgd2VlaywgZmluZCB0aGUgbmV4dCBkYXkgaW4gdGhlIGxpc3RcbiAgICAgICAgICAgIGxldCBuZXh0RGF0ZSA9IGRhdGUuYWRkKDEsICdkYXknKVxuICAgICAgICAgICAgbGV0IGxvb3BDb3VudCA9IDBcblxuICAgICAgICAgICAgLy8gUHJldmVudCBpbmZpbml0ZSBsb29wIC0gbWF4aW11bSA3IGl0ZXJhdGlvbnMgdG8gZmluZCB0aGUgbmV4dCBkYXlcbiAgICAgICAgICAgIHdoaWxlIChsb29wQ291bnQgPCA3KSB7XG4gICAgICAgICAgICAgIGlmIChkYXlzLmluY2x1ZGVzKG5leHREYXRlLmRheSgpKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXh0RGF0ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG5leHREYXRlID0gbmV4dERhdGUuYWRkKDEsICdkYXknKVxuICAgICAgICAgICAgICBsb29wQ291bnQrK1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBmaW5kIHRoZSBuZXh0IGRheSwganVzdCBhZGQgdGhlIGludGVydmFsIHdlZWtzXG4gICAgICAgICAgICByZXR1cm4gZGF0ZS5hZGQoaW50LCAnd2VlaycpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwganVzdCBhZGQgdGhlIGludGVydmFsIHdlZWtzXG4gICAgICAgICAgICByZXR1cm4gZGF0ZS5hZGQoaW50LCAnd2VlaycpXG4gICAgICAgICAgfVxuICAgICAgICBjYXNlICdtb250aGx5JzpcbiAgICAgICAgICByZXR1cm4gZGF0ZS5hZGQoaW50LCAnbW9udGgnKVxuICAgICAgICBjYXNlICd5ZWFybHknOlxuICAgICAgICAgIHJldHVybiBkYXRlLmFkZChpbnQsICd5ZWFyJylcbiAgICAgIH1cbiAgICB9LFxuICAgIFtdXG4gIClcblxuICAvLyBFeHBhbmQgcmVjdXJyaW5nIGV2ZW50cyBmb3IgYSBkYXRlIHJhbmdlXG4gIGNvbnN0IGV4cGFuZFJlY3VycmluZ0V2ZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgYmFzZUV2ZW50OiBDYWxlbmRhckV2ZW50LFxuICAgICAgc3RhcnREYXRlOiBkYXlqcy5EYXlqcyxcbiAgICAgIGVuZERhdGU6IGRheWpzLkRheWpzXG4gICAgKTogQ2FsZW5kYXJFdmVudFtdID0+IHtcbiAgICAgIGNvbnN0IGV4cGFuZGVkRXZlbnRzOiBDYWxlbmRhckV2ZW50W10gPSBbXVxuICAgICAgaWYgKCFiYXNlRXZlbnQucmVjdXJyZW5jZSkgcmV0dXJuIFtiYXNlRXZlbnRdXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZnJlcXVlbmN5LFxuICAgICAgICBpbnRlcnZhbCxcbiAgICAgICAgZW5kRGF0ZTogcmVjdXJyZW5jZUVuZERhdGUsXG4gICAgICAgIGNvdW50LFxuICAgICAgICBkYXlzT2ZXZWVrLFxuICAgICAgICBleGNlcHRpb25zID0gW10sXG4gICAgICB9ID0gYmFzZUV2ZW50LnJlY3VycmVuY2VcblxuICAgICAgLy8gR2V0IGV4aXN0aW5nIGV4Y2VwdGlvbnMgZnJvbSB0aGUgZXZlbnRzIGFycmF5XG4gICAgICBjb25zdCBleGlzdGluZ0V4Y2VwdGlvbnMgPSBldmVudHMuZmlsdGVyKFxuICAgICAgICAoZXZlbnQpID0+IGV2ZW50LnBhcmVudEV2ZW50SWQgPT09IGJhc2VFdmVudC5pZCAmJiBldmVudC5pc0V4Y2VwdGlvblxuICAgICAgKVxuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIGR1cmF0aW9uIG9mIHRoZSBldmVudFxuICAgICAgY29uc3QgZHVyYXRpb24gPSBiYXNlRXZlbnQuZW5kLmRpZmYoYmFzZUV2ZW50LnN0YXJ0LCAnbWludXRlJylcblxuICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIGVuZCBkYXRlIGZvciByZWN1cnJlbmNlXG4gICAgICBjb25zdCBtYXhFbmREYXRlID1cbiAgICAgICAgcmVjdXJyZW5jZUVuZERhdGUgJiYgcmVjdXJyZW5jZUVuZERhdGUuaXNCZWZvcmUoZW5kRGF0ZSlcbiAgICAgICAgICA/IHJlY3VycmVuY2VFbmREYXRlXG4gICAgICAgICAgOiBlbmREYXRlXG5cbiAgICAgIGxldCBjdXJyZW50RGF0ZSA9IGJhc2VFdmVudC5zdGFydC5jbG9uZSgpXG4gICAgICBsZXQgb2NjdXJyZW5jZXMgPSAwXG5cbiAgICAgIC8vIElmIHRoZSByZWN1cnJpbmcgZXZlbnQgc3RhcnRzIGFmdGVyIHRoZSBlbmQgb2Ygb3VyIHJhbmdlLCBubyBldmVudHMgdG8gZ2VuZXJhdGVcbiAgICAgIGlmIChjdXJyZW50RGF0ZS5pc0FmdGVyKG1heEVuZERhdGUpKSB7XG4gICAgICAgIHJldHVybiBbXVxuICAgICAgfVxuXG4gICAgICAvLyBJZiB3ZSBuZWVkIHRvIHN0YXJ0IGluIHRoZSBtaWRkbGUgb2YgYSByZWN1cnJlbmNlIHBhdHRlcm4sXG4gICAgICAvLyBmYXN0LWZvcndhcmQgdG8gZmluZCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBpbiBvdXIgZGF0ZSByYW5nZVxuICAgICAgaWYgKGN1cnJlbnREYXRlLmlzQmVmb3JlKHN0YXJ0RGF0ZSkpIHtcbiAgICAgICAgc3dpdGNoIChmcmVxdWVuY3kpIHtcbiAgICAgICAgICBjYXNlICdkYWlseSc6IHtcbiAgICAgICAgICAgIGNvbnN0IGRheXNUb0FkZCA9XG4gICAgICAgICAgICAgIE1hdGguZmxvb3Ioc3RhcnREYXRlLmRpZmYoY3VycmVudERhdGUsICdkYXknKSAvIGludGVydmFsKSAqXG4gICAgICAgICAgICAgIGludGVydmFsXG4gICAgICAgICAgICBpZiAoZGF5c1RvQWRkID4gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlLmFkZChkYXlzVG9BZGQsICdkYXknKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnd2Vla2x5Jzoge1xuICAgICAgICAgICAgaWYgKCFkYXlzT2ZXZWVrIHx8IGRheXNPZldlZWsubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHdlZWtzVG9BZGQgPVxuICAgICAgICAgICAgICAgIE1hdGguZmxvb3Ioc3RhcnREYXRlLmRpZmYoY3VycmVudERhdGUsICd3ZWVrJykgLyBpbnRlcnZhbCkgKlxuICAgICAgICAgICAgICAgIGludGVydmFsXG4gICAgICAgICAgICAgIGlmICh3ZWVrc1RvQWRkID4gMCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGUuYWRkKHdlZWtzVG9BZGQsICd3ZWVrJylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnbW9udGhseSc6IHtcbiAgICAgICAgICAgIGNvbnN0IG1vbnRoc1RvQWRkID1cbiAgICAgICAgICAgICAgTWF0aC5mbG9vcihzdGFydERhdGUuZGlmZihjdXJyZW50RGF0ZSwgJ21vbnRoJykgLyBpbnRlcnZhbCkgKlxuICAgICAgICAgICAgICBpbnRlcnZhbFxuICAgICAgICAgICAgaWYgKG1vbnRoc1RvQWRkID4gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlLmFkZChtb250aHNUb0FkZCwgJ21vbnRoJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ3llYXJseSc6IHtcbiAgICAgICAgICAgIGNvbnN0IHllYXJzVG9BZGQgPVxuICAgICAgICAgICAgICBNYXRoLmZsb29yKHN0YXJ0RGF0ZS5kaWZmKGN1cnJlbnREYXRlLCAneWVhcicpIC8gaW50ZXJ2YWwpICpcbiAgICAgICAgICAgICAgaW50ZXJ2YWxcbiAgICAgICAgICAgIGlmICh5ZWFyc1RvQWRkID4gMCkge1xuICAgICAgICAgICAgICBjdXJyZW50RGF0ZSA9IGN1cnJlbnREYXRlLmFkZCh5ZWFyc1RvQWRkLCAneWVhcicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVha1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB3aGlsZSAoXG4gICAgICAgIChjdXJyZW50RGF0ZS5pc0JlZm9yZShtYXhFbmREYXRlKSB8fFxuICAgICAgICAgIGN1cnJlbnREYXRlLmlzU2FtZShtYXhFbmREYXRlLCAnZGF5JykpICYmXG4gICAgICAgIChjb3VudCA9PT0gdW5kZWZpbmVkIHx8IG9jY3VycmVuY2VzIDwgY291bnQpXG4gICAgICApIHtcbiAgICAgICAgLy8gRm9ybWF0IGN1cnJlbnQgZGF0ZSBmb3IgY29tcGFyaXNvblxuICAgICAgICBjb25zdCBjdXJyZW50RGF0ZVN0ciA9IGN1cnJlbnREYXRlLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG5cbiAgICAgICAgLy8gU2tpcCBpZiB0aGlzIGRhdGUgaXMgaW4gZXhjZXB0aW9uc1xuICAgICAgICBpZiAoXG4gICAgICAgICAgZXhjZXB0aW9ucy5zb21lKFxuICAgICAgICAgICAgKGRhdGUpID0+IGRhdGUuZm9ybWF0KCdZWVlZLU1NLUREJykgPT09IGN1cnJlbnREYXRlU3RyXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IG9jY3VycmVuY2VcbiAgICAgICAgICBjdXJyZW50RGF0ZSA9IGdldE5leHRPY2N1cnJlbmNlKFxuICAgICAgICAgICAgY3VycmVudERhdGUsXG4gICAgICAgICAgICBmcmVxdWVuY3ksXG4gICAgICAgICAgICBpbnRlcnZhbCxcbiAgICAgICAgICAgIGRheXNPZldlZWtcbiAgICAgICAgICApXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNraXAgaWYgaXQncyBhIHdlZWtseSByZWN1cnJlbmNlIHdpdGggc3BlY2lmaWVkIGRheXMgYW5kIGN1cnJlbnQgZGF5IGlzIG5vdCBpbmNsdWRlZFxuICAgICAgICBpZiAoXG4gICAgICAgICAgZnJlcXVlbmN5ID09PSAnd2Vla2x5JyAmJlxuICAgICAgICAgIGRheXNPZldlZWsgJiZcbiAgICAgICAgICBkYXlzT2ZXZWVrLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAhZGF5c09mV2Vlay5pbmNsdWRlcyhjdXJyZW50RGF0ZS5kYXkoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY3VycmVudERhdGUgPSBjdXJyZW50RGF0ZS5hZGQoMSwgJ2RheScpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYSBjdXN0b20gZXhjZXB0aW9uIGZvciB0aGlzIG9jY3VycmVuY2VcbiAgICAgICAgY29uc3QgZXhjZXB0aW9uRXZlbnQgPSBleGlzdGluZ0V4Y2VwdGlvbnMuZmluZChcbiAgICAgICAgICAoZXZlbnQpID0+IGV2ZW50LnN0YXJ0LmZvcm1hdCgnWVlZWS1NTS1ERCcpID09PSBjdXJyZW50RGF0ZVN0clxuICAgICAgICApXG5cbiAgICAgICAgaWYgKGV4Y2VwdGlvbkV2ZW50KSB7XG4gICAgICAgICAgLy8gVXNlIHRoZSBleGNlcHRpb24gaW5zdGVhZCBvZiBnZW5lcmF0aW5nIGEgbmV3IGV2ZW50XG4gICAgICAgICAgZXhwYW5kZWRFdmVudHMucHVzaChleGNlcHRpb25FdmVudClcbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50RGF0ZS5pc0FmdGVyKHN0YXJ0RGF0ZS5zdWJ0cmFjdCgxLCAnZGF5JykpKSB7XG4gICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IG9jY3VycmVuY2UgaWYgaXQgZmFsbHMgd2l0aGluIHRoZSByZXF1ZXN0ZWQgcmFuZ2VcbiAgICAgICAgICBjb25zdCBldmVudEluc3RhbmNlOiBDYWxlbmRhckV2ZW50ID0ge1xuICAgICAgICAgICAgLi4uYmFzZUV2ZW50LFxuICAgICAgICAgICAgaWQ6IGAke2Jhc2VFdmVudC5pZH0tJHtjdXJyZW50RGF0ZS5mb3JtYXQoJ1lZWVlNTUREJyl9YCxcbiAgICAgICAgICAgIHN0YXJ0OiBjdXJyZW50RGF0ZS5jbG9uZSgpLFxuICAgICAgICAgICAgZW5kOiBjdXJyZW50RGF0ZS5jbG9uZSgpLmFkZChkdXJhdGlvbiwgJ21pbnV0ZScpLFxuICAgICAgICAgICAgaXNSZWN1cnJpbmc6IHRydWUsXG4gICAgICAgICAgICBwYXJlbnRFdmVudElkOiBiYXNlRXZlbnQuaWQsXG4gICAgICAgICAgfVxuICAgICAgICAgIGV4cGFuZGVkRXZlbnRzLnB1c2goZXZlbnRJbnN0YW5jZSlcbiAgICAgICAgfVxuXG4gICAgICAgIG9jY3VycmVuY2VzKytcbiAgICAgICAgY3VycmVudERhdGUgPSBnZXROZXh0T2NjdXJyZW5jZShcbiAgICAgICAgICBjdXJyZW50RGF0ZSxcbiAgICAgICAgICBmcmVxdWVuY3ksXG4gICAgICAgICAgaW50ZXJ2YWwsXG4gICAgICAgICAgZGF5c09mV2Vla1xuICAgICAgICApXG4gICAgICB9XG5cbiAgICAgIHJldHVybiBleHBhbmRlZEV2ZW50c1xuICAgIH0sXG4gICAgW2V2ZW50cywgZ2V0TmV4dE9jY3VycmVuY2VdXG4gIClcblxuICAvLyBFdmVudCBxdWVyeSBmdW5jdGlvbnNcbiAgY29uc3QgZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKHN0YXJ0OiBkYXlqcy5EYXlqcywgZW5kOiBkYXlqcy5EYXlqcyk6IENhbGVuZGFyRXZlbnRbXSA9PiB7XG4gICAgICBjb25zdCBzdGFydERhdGUgPSBzdGFydC5zdGFydE9mKCdkYXknKVxuICAgICAgY29uc3QgZW5kRGF0ZSA9IGVuZC5lbmRPZignZGF5JylcblxuICAgICAgLy8gRmlsdGVyIHJlZ3VsYXIgZXZlbnRzIGZpcnN0XG4gICAgICBjb25zdCByZWd1bGFyRXZlbnRzID0gZXZlbnRzLmZpbHRlcigoZXZlbnQpID0+IHtcbiAgICAgICAgLy8gRml4ZWQgbG9naWMgZm9yIGNoZWNraW5nIGlmIGV2ZW50IG92ZXJsYXBzIHdpdGggdGhlIGRhdGUgcmFuZ2VcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAvLyBDYXNlIDE6IEV2ZW50IHN0YXJ0cyB3aXRoaW4gdGhlIHJhbmdlXG4gICAgICAgICAgKChldmVudC5zdGFydC5pc0FmdGVyKHN0YXJ0RGF0ZSkgfHwgZXZlbnQuc3RhcnQuaXNTYW1lKHN0YXJ0RGF0ZSkpICYmXG4gICAgICAgICAgICAoZXZlbnQuc3RhcnQuaXNCZWZvcmUoZW5kRGF0ZSkgfHwgZXZlbnQuc3RhcnQuaXNTYW1lKGVuZERhdGUpKSkgfHxcbiAgICAgICAgICAvLyBDYXNlIDI6IEV2ZW50IGVuZHMgd2l0aGluIHRoZSByYW5nZVxuICAgICAgICAgICgoZXZlbnQuZW5kLmlzQWZ0ZXIoc3RhcnREYXRlKSB8fCBldmVudC5lbmQuaXNTYW1lKHN0YXJ0RGF0ZSkpICYmXG4gICAgICAgICAgICAoZXZlbnQuZW5kLmlzQmVmb3JlKGVuZERhdGUpIHx8IGV2ZW50LmVuZC5pc1NhbWUoZW5kRGF0ZSkpKSB8fFxuICAgICAgICAgIC8vIENhc2UgMzogRXZlbnQgc3BhbnMgYWNyb3NzIHRoZSBlbnRpcmUgcmFuZ2VcbiAgICAgICAgICAoZXZlbnQuc3RhcnQuaXNCZWZvcmUoc3RhcnREYXRlKSAmJiBldmVudC5lbmQuaXNBZnRlcihlbmREYXRlKSlcbiAgICAgICAgKVxuICAgICAgfSlcblxuICAgICAgLy8gRmluZCBwYXJlbnQgcmVjdXJyaW5nIGV2ZW50cyB0aGF0IG5lZWQgdG8gYmUgZXhwYW5kZWRcbiAgICAgIGNvbnN0IHJlY3VycmluZ1BhcmVudEV2ZW50cyA9IGV2ZW50cy5maWx0ZXIoXG4gICAgICAgIChldmVudCkgPT4gZXZlbnQucmVjdXJyZW5jZSAmJiAhZXZlbnQucGFyZW50RXZlbnRJZFxuICAgICAgKVxuXG4gICAgICAvLyBFeHBhbmQgcmVjdXJyaW5nIGV2ZW50cyBmb3IgdGhpcyByYW5nZVxuICAgICAgbGV0IHJlY3VycmluZ0V2ZW50czogQ2FsZW5kYXJFdmVudFtdID0gW11cbiAgICAgIHJlY3VycmluZ1BhcmVudEV2ZW50cy5mb3JFYWNoKChwYXJlbnRFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCBleHBhbmRlZCA9IGV4cGFuZFJlY3VycmluZ0V2ZW50KHBhcmVudEV2ZW50LCBzdGFydERhdGUsIGVuZERhdGUpXG4gICAgICAgIHJlY3VycmluZ0V2ZW50cyA9IFsuLi5yZWN1cnJpbmdFdmVudHMsIC4uLmV4cGFuZGVkXVxuICAgICAgfSlcblxuICAgICAgLy8gQ29tYmluZSBhbGwgZXZlbnRzIGFuZCByZW1vdmUgYW55IGR1cGxpY2F0ZXNcbiAgICAgIHJldHVybiBbLi4ucmVndWxhckV2ZW50cywgLi4ucmVjdXJyaW5nRXZlbnRzXS5maWx0ZXIoXG4gICAgICAgIChldmVudCwgaW5kZXgsIHNlbGYpID0+XG4gICAgICAgICAgaW5kZXggPT09IHNlbGYuZmluZEluZGV4KChlKSA9PiBlLmlkID09PSBldmVudC5pZClcbiAgICAgIClcbiAgICB9LFxuICAgIFtldmVudHMsIGV4cGFuZFJlY3VycmluZ0V2ZW50XVxuICApXG5cbiAgY29uc3QgZ2V0RXZlbnRzRm9yRGF0ZSA9IHVzZUNhbGxiYWNrKFxuICAgIChkYXRlOiBkYXlqcy5EYXlqcyk6IENhbGVuZGFyRXZlbnRbXSA9PiB7XG4gICAgICBjb25zdCBkYXkgPSBkYXRlLnN0YXJ0T2YoJ2RheScpXG4gICAgICBjb25zdCBuZXh0RGF5ID0gZGF5LmFkZCgxLCAnZGF5JylcbiAgICAgIHJldHVybiBnZXRFdmVudHNGb3JEYXRlUmFuZ2UoZGF5LCBuZXh0RGF5KVxuICAgIH0sXG4gICAgW2dldEV2ZW50c0ZvckRhdGVSYW5nZV1cbiAgKVxuXG4gIC8vIFJlY3VycmluZyBldmVudCBvcGVyYXRpb25zXG4gIGNvbnN0IGFkZFJlY3VycmluZ0V2ZW50ID0gdXNlQ2FsbGJhY2soKGV2ZW50OiBDYWxlbmRhckV2ZW50KSA9PiB7XG4gICAgc2V0Q3VycmVudEV2ZW50cygocHJldkV2ZW50cykgPT4gWy4uLnByZXZFdmVudHMsIGV2ZW50XSlcbiAgfSwgW10pXG5cbiAgY29uc3QgZGVsZXRlUmVjdXJyaW5nRXZlbnQgPSB1c2VDYWxsYmFjayhcbiAgICAoZXZlbnRJZDogc3RyaW5nLCBkZWxldGVBbGw6IGJvb2xlYW4pID0+IHtcbiAgICAgIHNldEN1cnJlbnRFdmVudHMoKHByZXZFdmVudHMpID0+IHtcbiAgICAgICAgLy8gRmluZCB0aGUgZXZlbnQgYnkgSURcbiAgICAgICAgY29uc3QgZXZlbnQgPSBwcmV2RXZlbnRzLmZpbmQoKGUpID0+IGUuaWQgPT09IGV2ZW50SWQpXG4gICAgICAgIGlmICghZXZlbnQpIHJldHVybiBwcmV2RXZlbnRzXG5cbiAgICAgICAgaWYgKGV2ZW50LnBhcmVudEV2ZW50SWQgJiYgIWRlbGV0ZUFsbCkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSByZWN1cnJpbmcgaW5zdGFuY2UsIGFuZCB3ZSBvbmx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgaW5zdGFuY2VcblxuICAgICAgICAgIC8vIEZpbmQgdGhlIHBhcmVudCBldmVudFxuICAgICAgICAgIGNvbnN0IHBhcmVudEV2ZW50ID0gcHJldkV2ZW50cy5maW5kKFxuICAgICAgICAgICAgKGUpID0+IGUuaWQgPT09IGV2ZW50LnBhcmVudEV2ZW50SWRcbiAgICAgICAgICApXG4gICAgICAgICAgaWYgKCFwYXJlbnRFdmVudCB8fCAhcGFyZW50RXZlbnQucmVjdXJyZW5jZSkgcmV0dXJuIHByZXZFdmVudHNcblxuICAgICAgICAgIC8vIEFkZCB0aGlzIGRhdGUgdG8gdGhlIGV4Y2VwdGlvbnMgbGlzdFxuICAgICAgICAgIHJldHVybiBwcmV2RXZlbnRzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuaWQgPT09IGV2ZW50LnBhcmVudEV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5lLFxuICAgICAgICAgICAgICAgIHJlY3VycmVuY2U6IHtcbiAgICAgICAgICAgICAgICAgIC4uLmUucmVjdXJyZW5jZSEsXG4gICAgICAgICAgICAgICAgICBleGNlcHRpb25zOiBbXG4gICAgICAgICAgICAgICAgICAgIC4uLihlLnJlY3VycmVuY2UhLmV4Y2VwdGlvbnMgfHwgW10pLFxuICAgICAgICAgICAgICAgICAgICBldmVudC5zdGFydC5zdGFydE9mKCdkYXknKSxcbiAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVcbiAgICAgICAgICB9KVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnBhcmVudEV2ZW50SWQgJiYgZGVsZXRlQWxsKSB7XG4gICAgICAgICAgLy8gV2Ugd2FudCB0byBkZWxldGUgYWxsIG9jY3VycmVuY2VzIG9mIHRoaXMgcmVjdXJyaW5nIGV2ZW50XG4gICAgICAgICAgLy8gRmluZCB0aGUgcGFyZW50IElEIGFuZCBkZWxldGUgaXQgYW5kIGFsbCBpdHMgY2hpbGRyZW5cbiAgICAgICAgICByZXR1cm4gcHJldkV2ZW50cy5maWx0ZXIoXG4gICAgICAgICAgICAoZSkgPT5cbiAgICAgICAgICAgICAgZS5pZCAhPT0gZXZlbnQucGFyZW50RXZlbnRJZCAmJlxuICAgICAgICAgICAgICBlLnBhcmVudEV2ZW50SWQgIT09IGV2ZW50LnBhcmVudEV2ZW50SWRcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQucmVjdXJyZW5jZSkge1xuICAgICAgICAgIC8vIFRoaXMgaXMgYSBwYXJlbnQgcmVjdXJyaW5nIGV2ZW50LCBkZWxldGUgaXQgYW5kIGFsbCBpdHMgaW5zdGFuY2VzXG4gICAgICAgICAgcmV0dXJuIHByZXZFdmVudHMuZmlsdGVyKFxuICAgICAgICAgICAgKGUpID0+IGUuaWQgIT09IGV2ZW50LmlkICYmIGUucGFyZW50RXZlbnRJZCAhPT0gZXZlbnQuaWRcbiAgICAgICAgICApXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVndWxhciBldmVudCwganVzdCBkZWxldGUgaXRcbiAgICAgICAgICByZXR1cm4gcHJldkV2ZW50cy5maWx0ZXIoKGUpID0+IGUuaWQgIT09IGV2ZW50LmlkKVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG4gICAgW11cbiAgKVxuXG4gIGNvbnN0IHVwZGF0ZVJlY3VycmluZ0V2ZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgZXZlbnRJZDogc3RyaW5nLFxuICAgICAgdXBkYXRlZEV2ZW50OiBQYXJ0aWFsPENhbGVuZGFyRXZlbnQ+LFxuICAgICAgdXBkYXRlQWxsOiBib29sZWFuXG4gICAgKSA9PiB7XG4gICAgICBzZXRDdXJyZW50RXZlbnRzKChwcmV2RXZlbnRzKSA9PiB7XG4gICAgICAgIC8vIEZpbmQgdGhlIGV2ZW50IGJ5IElEXG4gICAgICAgIGNvbnN0IGV2ZW50ID0gcHJldkV2ZW50cy5maW5kKChlKSA9PiBlLmlkID09PSBldmVudElkKVxuICAgICAgICBpZiAoIWV2ZW50KSByZXR1cm4gcHJldkV2ZW50c1xuXG4gICAgICAgIGlmIChldmVudC5wYXJlbnRFdmVudElkICYmICF1cGRhdGVBbGwpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGEgcmVjdXJyaW5nIGluc3RhbmNlIGJlaW5nIHVwZGF0ZWQgaW5kaXZpZHVhbGx5XG5cbiAgICAgICAgICAvLyBDcmVhdGUgYW4gZXhjZXB0aW9uIHdpdGggdGhlIHVwZGF0ZXNcbiAgICAgICAgICBjb25zdCBleGNlcHRpb25FdmVudDogQ2FsZW5kYXJFdmVudCA9IHtcbiAgICAgICAgICAgIC4uLmV2ZW50LFxuICAgICAgICAgICAgLi4udXBkYXRlZEV2ZW50LFxuICAgICAgICAgICAgaXNFeGNlcHRpb246IHRydWUsXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQWRkIHRoZSBleGNlcHRpb24gdG8gdGhlIHN0b3JlIGFuZCBhZGQgdGhpcyBkYXRlIHRvIHRoZSBwYXJlbnQncyBleGNlcHRpb25zIGxpc3RcbiAgICAgICAgICBjb25zdCB1cGRhdGVkRXZlbnRzID0gcHJldkV2ZW50cy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChlLmlkID09PSBldmVudC5wYXJlbnRFdmVudElkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLi4uZSxcbiAgICAgICAgICAgICAgICByZWN1cnJlbmNlOiB7XG4gICAgICAgICAgICAgICAgICAuLi5lLnJlY3VycmVuY2UhLFxuICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICAuLi4oZS5yZWN1cnJlbmNlIS5leGNlcHRpb25zIHx8IFtdKSxcbiAgICAgICAgICAgICAgICAgICAgZXZlbnQuc3RhcnQuc3RhcnRPZignZGF5JyksXG4gICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlXG4gICAgICAgICAgfSlcblxuICAgICAgICAgIHJldHVybiBbLi4udXBkYXRlZEV2ZW50cywgZXhjZXB0aW9uRXZlbnRdXG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQucGFyZW50RXZlbnRJZCAmJiB1cGRhdGVBbGwpIHtcbiAgICAgICAgICAvLyBVcGRhdGUgYWxsIG9jY3VycmVuY2VzIGJ5IHVwZGF0aW5nIHRoZSBwYXJlbnRcbiAgICAgICAgICAvLyBGaW5kIHRoZSBwYXJlbnQgYW5kIHVwZGF0ZSBpdFxuICAgICAgICAgIHJldHVybiBwcmV2RXZlbnRzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuaWQgPT09IGV2ZW50LnBhcmVudEV2ZW50SWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHsgLi4uZSwgLi4udXBkYXRlZEV2ZW50IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC5yZWN1cnJlbmNlKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyBhIHBhcmVudCByZWN1cnJpbmcgZXZlbnQsIHVwZGF0ZSBpdCBkaXJlY3RseVxuICAgICAgICAgIHJldHVybiBwcmV2RXZlbnRzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUuaWQgPT09IGV2ZW50LmlkKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7IC4uLmUsIC4uLnVwZGF0ZWRFdmVudCB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gUmVndWxhciBldmVudCwganVzdCB1cGRhdGUgaXRcbiAgICAgICAgICByZXR1cm4gcHJldkV2ZW50cy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChlLmlkID09PSBldmVudC5pZCkge1xuICAgICAgICAgICAgICByZXR1cm4geyAuLi5lLCAuLi51cGRhdGVkRXZlbnQgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGVcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH0sXG4gICAgW11cbiAgKVxuXG4gIGNvbnN0IGNyZWF0ZUV4Y2VwdGlvbkZvclJlY3VycmluZ0V2ZW50ID0gdXNlQ2FsbGJhY2soXG4gICAgKGV2ZW50SWQ6IHN0cmluZywgZGF0ZTogZGF5anMuRGF5anMpID0+IHtcbiAgICAgIHNldEN1cnJlbnRFdmVudHMoKHByZXZFdmVudHMpID0+IHtcbiAgICAgICAgLy8gRmluZCB0aGUgZXZlbnQgZmlyc3RcbiAgICAgICAgY29uc3QgZXZlbnQgPSBwcmV2RXZlbnRzLmZpbmQoKGUpID0+IGUuaWQgPT09IGV2ZW50SWQpXG4gICAgICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LnJlY3VycmVuY2UpIHJldHVybiBwcmV2RXZlbnRzXG5cbiAgICAgICAgLy8gQWRkIHRoZSBkYXRlIHRvIGV4Y2VwdGlvbnNcbiAgICAgICAgcmV0dXJuIHByZXZFdmVudHMubWFwKChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUuaWQgPT09IGV2ZW50SWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmUsXG4gICAgICAgICAgICAgIHJlY3VycmVuY2U6IHtcbiAgICAgICAgICAgICAgICAuLi5lLnJlY3VycmVuY2UhLFxuICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnM6IFtcbiAgICAgICAgICAgICAgICAgIC4uLihlLnJlY3VycmVuY2UhLmV4Y2VwdGlvbnMgfHwgW10pLFxuICAgICAgICAgICAgICAgICAgZGF0ZS5zdGFydE9mKCdkYXknKSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9LFxuICAgIFtdXG4gIClcblxuICAvLyBDcmVhdGUgdGhlIGNvbnRleHQgdmFsdWVcbiAgY29uc3QgY29udGV4dFZhbHVlID0gdXNlTWVtbyhcbiAgICAoKSA9PiAoe1xuICAgICAgY3VycmVudERhdGUsXG4gICAgICB2aWV3LFxuICAgICAgZXZlbnRzOiBjdXJyZW50RXZlbnRzLFxuICAgICAgY3VycmVudExvY2FsZSxcbiAgICAgIGlzRXZlbnRGb3JtT3BlbixcbiAgICAgIHNlbGVjdGVkRXZlbnQsXG4gICAgICBzZWxlY3RlZERhdGUsXG4gICAgICBmaXJzdERheU9mV2VlayxcbiAgICAgIHNldEN1cnJlbnREYXRlLFxuICAgICAgc2VsZWN0RGF0ZSxcbiAgICAgIHNldFZpZXc6IGhhbmRsZVZpZXdDaGFuZ2UsXG4gICAgICBuZXh0UGVyaW9kLFxuICAgICAgcHJldlBlcmlvZCxcbiAgICAgIHRvZGF5LFxuICAgICAgYWRkRXZlbnQsXG4gICAgICB1cGRhdGVFdmVudCxcbiAgICAgIGRlbGV0ZUV2ZW50LFxuICAgICAgb3BlbkV2ZW50Rm9ybTogKCkgPT4gc2V0SXNFdmVudEZvcm1PcGVuKHRydWUpLFxuICAgICAgY2xvc2VFdmVudEZvcm0sXG4gICAgICBnZXRFdmVudHNGb3JEYXRlLFxuICAgICAgZ2V0RXZlbnRzRm9yRGF0ZVJhbmdlLFxuICAgICAgZXhwYW5kUmVjdXJyaW5nRXZlbnQsXG4gICAgICBhZGRSZWN1cnJpbmdFdmVudCxcbiAgICAgIGRlbGV0ZVJlY3VycmluZ0V2ZW50LFxuICAgICAgdXBkYXRlUmVjdXJyaW5nRXZlbnQsXG4gICAgICBjcmVhdGVFeGNlcHRpb25Gb3JSZWN1cnJpbmdFdmVudCxcbiAgICAgIHJlbmRlckV2ZW50LFxuICAgICAgb25FdmVudENsaWNrOiBoYW5kbGVFdmVudENsaWNrLFxuICAgICAgb25DZWxsQ2xpY2s6IGhhbmRsZURhdGVDbGljayxcbiAgICAgIGxvY2FsZSxcbiAgICAgIHRpbWV6b25lOiBjdXJyZW50VGltZXpvbmUsXG4gICAgICBkaXNhYmxlQ2VsbENsaWNrLFxuICAgICAgZGlzYWJsZUV2ZW50Q2xpY2ssXG4gICAgICBkaXNhYmxlRHJhZ0FuZERyb3AsXG4gICAgICBkYXlNYXhFdmVudHMsXG4gICAgICBzdGlja3lWaWV3SGVhZGVyLFxuICAgICAgdmlld0hlYWRlckNsYXNzTmFtZSxcbiAgICAgIGhlYWRlckNvbXBvbmVudCxcbiAgICB9KSxcbiAgICBbXG4gICAgICBjdXJyZW50RGF0ZSxcbiAgICAgIHZpZXcsXG4gICAgICBjdXJyZW50RXZlbnRzLFxuICAgICAgY3VycmVudExvY2FsZSxcbiAgICAgIGlzRXZlbnRGb3JtT3BlbixcbiAgICAgIHNlbGVjdGVkRXZlbnQsXG4gICAgICBzZWxlY3RlZERhdGUsXG4gICAgICBmaXJzdERheU9mV2VlayxcbiAgICAgIHNlbGVjdERhdGUsXG4gICAgICBoYW5kbGVWaWV3Q2hhbmdlLFxuICAgICAgbmV4dFBlcmlvZCxcbiAgICAgIHByZXZQZXJpb2QsXG4gICAgICB0b2RheSxcbiAgICAgIGFkZEV2ZW50LFxuICAgICAgdXBkYXRlRXZlbnQsXG4gICAgICBkZWxldGVFdmVudCxcbiAgICAgIGNsb3NlRXZlbnRGb3JtLFxuICAgICAgZ2V0RXZlbnRzRm9yRGF0ZSxcbiAgICAgIGdldEV2ZW50c0ZvckRhdGVSYW5nZSxcbiAgICAgIGV4cGFuZFJlY3VycmluZ0V2ZW50LFxuICAgICAgYWRkUmVjdXJyaW5nRXZlbnQsXG4gICAgICBkZWxldGVSZWN1cnJpbmdFdmVudCxcbiAgICAgIHVwZGF0ZVJlY3VycmluZ0V2ZW50LFxuICAgICAgY3JlYXRlRXhjZXB0aW9uRm9yUmVjdXJyaW5nRXZlbnQsXG4gICAgICByZW5kZXJFdmVudCxcbiAgICAgIGhhbmRsZUV2ZW50Q2xpY2ssXG4gICAgICBoYW5kbGVEYXRlQ2xpY2ssXG4gICAgICBsb2NhbGUsXG4gICAgICBjdXJyZW50VGltZXpvbmUsXG4gICAgICBkaXNhYmxlQ2VsbENsaWNrLFxuICAgICAgZGlzYWJsZUV2ZW50Q2xpY2ssXG4gICAgICBkaXNhYmxlRHJhZ0FuZERyb3AsXG4gICAgICBkYXlNYXhFdmVudHMsXG4gICAgICBzdGlja3lWaWV3SGVhZGVyLFxuICAgICAgdmlld0hlYWRlckNsYXNzTmFtZSxcbiAgICAgIGhlYWRlckNvbXBvbmVudCxcbiAgICBdXG4gIClcblxuICByZXR1cm4gKFxuICAgIDxDYWxlbmRhckNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NvbnRleHRWYWx1ZX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9DYWxlbmRhckNvbnRleHQuUHJvdmlkZXI+XG4gIClcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICI7QUFDQSw0QkFBUyw0QkFBaUI7QUFDMUIsNEJBQWdCOzs7QUNBaEI7QUFvRE8sSUFBTSxrQkFBa0IsY0FDN0IsU0FDRjtBQUVPLElBQU0scUJBQXFCLE1BQU07QUFBQSxFQUN0QyxNQUFNLFVBQVUsV0FBVyxlQUFlO0FBQUEsRUFDMUMsSUFBSSxZQUFZLFdBQVc7QUFBQSxJQUN6QixNQUFNLElBQUksTUFBTSwyREFBMkQ7QUFBQSxFQUM3RTtBQUFBLEVBQ0EsT0FBTztBQUFBO0FBR0YsSUFBTSwyQkFBMkIsTUFBTTtBQUFBLEVBQzVDLE1BQU0sVUFBVSxXQUFXLGVBQWU7QUFBQSxFQUMxQyxJQUFJLFlBQVksV0FBVztBQUFBLElBQ3pCLE1BQU0sSUFBSSxNQUFNLHVEQUF1RDtBQUFBLEVBQ3pFO0FBQUEsRUFDQSxPQUFPO0FBQUEsSUFDTCxhQUFhLFFBQVE7QUFBQSxJQUNyQixNQUFNLFFBQVE7QUFBQSxJQUNkLFFBQVEsUUFBUTtB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QUNDLE1BQUMsV0FBRDtBQUFBLFFBQ0UsU0FBUztBQUFBLFFBQ1Q7QUFBQSxRQUNBO0FBQUEsUUFDQSxPQUFPO0FBQUEsUUFDUCxVQUFVO0FBQUEsUUFDVixVQUFVO0FBQUEsT0FDWjtBQUFBO0FBQUEsR0FFRjtBQUFBO0FBNkVOLElBQU0sZUFBdUM7QUFBQSxFQUMzQyxRQUFRO0FBQUEsRUFDUixRQUFRO0FBQUEsRUFDUixTQUFTO0FBQUEsRUFDVCxXQUFXO0FBQUEsRUFDWCxVQUFVO0FBQUEsRUFDVixRQUFRO0FBQUEsRUFDUixVQUFVO0FBQ1o7QUFFQSxJQUFNLHlCQUF5QjtBQUN4QixJQUFNLGdCQUF5QztBQUFBLEVBQ3BEO0FBQUEsRUFDQSxpQkFBaUI7QUFBQSxFQUNqQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxlQUFlO0FBQUEsRUFDZixtQkFBbUI7QUFBQSxFQUNuQixzQkFBc0I7QUFBQSxFQUN0QjtBQUFBLE1BQ0k7QUFBQSxFQUNKLHVCQUNFLE1Ba0JFLGtCQWxCRjtBQUFBLElBQ0UsUUFBUSx3QkFBd0IsVUFBVSxDQUFDLENBQUM7QUFBQSxJQUM1QyxnQkFBZ0IsYUFBYTtBQUFBLElBQzdCO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0EsVUFBVTtBQUFBLElBQ1Y7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQWZGLDBCQWlCRSxNQUFDLGlCQUFELEVBQWlCO0FBQUEsR0FDakI7QUFBQTsiLAogICJkZWJ1Z0lkIjogIkUxQTk4Q0U0RTFFQTlDMTA2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9
|