import { template as _$template } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
|
import { style as _$style } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
|
import { className as _$className } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
|
import { effect as _$effect } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
|
import { insert as _$insert } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
|
import { use as _$use } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
|
import { memo as _$memo } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
|
import { createComponent as _$createComponent } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
|
const _tmpl$ = /*#__PURE__*/_$template(`<div>`);
|
// src/drag-drop-context.tsx
|
import { batch, createContext, createEffect, mergeProps, untrack, useContext } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
|
import { createStore } from "/node_modules/.vite/deps/solid-js_store.js?v=93754656";
|
|
// src/layout.ts
|
var Layout = class {
|
x;
|
y;
|
width;
|
height;
|
constructor(rect) {
|
this.x = Math.floor(rect.x);
|
this.y = Math.floor(rect.y);
|
this.width = Math.floor(rect.width);
|
this.height = Math.floor(rect.height);
|
}
|
get rect() {
|
return {
|
x: this.x,
|
y: this.y,
|
width: this.width,
|
height: this.height
|
};
|
}
|
get left() {
|
return this.x;
|
}
|
get top() {
|
return this.y;
|
}
|
get right() {
|
return this.x + this.width;
|
}
|
get bottom() {
|
return this.y + this.height;
|
}
|
get center() {
|
return {
|
x: this.x + this.width * 0.5,
|
y: this.y + this.height * 0.5
|
};
|
}
|
get corners() {
|
return {
|
topLeft: {
|
x: this.left,
|
y: this.top
|
},
|
topRight: {
|
x: this.right,
|
y: this.top
|
},
|
bottomRight: {
|
x: this.left,
|
y: this.bottom
|
},
|
bottomLeft: {
|
x: this.right,
|
y: this.bottom
|
}
|
};
|
}
|
};
|
var elementLayout = element => {
|
let layout = new Layout(element.getBoundingClientRect());
|
const {
|
transform
|
} = getComputedStyle(element);
|
if (transform) {
|
layout = stripTransformFromLayout(layout, transform);
|
}
|
return layout;
|
};
|
var stripTransformFromLayout = (layout, transform) => {
|
let translateX, translateY;
|
if (transform.startsWith("matrix3d(")) {
|
const matrix = transform.slice(9, -1).split(/, /);
|
translateX = +matrix[12];
|
translateY = +matrix[13];
|
} else if (transform.startsWith("matrix(")) {
|
const matrix = transform.slice(7, -1).split(/, /);
|
translateX = +matrix[4];
|
translateY = +matrix[5];
|
} else {
|
translateX = 0;
|
translateY = 0;
|
}
|
return new Layout({
|
...layout,
|
x: layout.x - translateX,
|
y: layout.y - translateY
|
});
|
};
|
var noopTransform = () => ({
|
x: 0,
|
y: 0
|
});
|
var transformsAreEqual = (firstTransform, secondTransform) => {
|
return firstTransform.x === secondTransform.x && firstTransform.y === secondTransform.y;
|
};
|
var transformLayout = (layout, transform) => {
|
return new Layout({
|
...layout,
|
x: layout.x + transform.x,
|
y: layout.y + transform.y
|
});
|
};
|
var distanceBetweenPoints = (firstPoint, secondPoint) => {
|
return Math.sqrt(Math.pow(firstPoint.x - secondPoint.x, 2) + Math.pow(firstPoint.y - secondPoint.y, 2));
|
};
|
var intersectionRatioOfLayouts = (firstLayout, secondLayout) => {
|
const top = Math.max(firstLayout.top, secondLayout.top);
|
const left = Math.max(firstLayout.left, secondLayout.left);
|
const right = Math.min(firstLayout.right, secondLayout.right);
|
const bottom = Math.min(firstLayout.bottom, secondLayout.bottom);
|
const width = right - left;
|
const height = bottom - top;
|
if (left < right && top < bottom) {
|
const layout1Area = firstLayout.width * firstLayout.height;
|
const layout2Area = secondLayout.width * secondLayout.height;
|
const intersectionArea = width * height;
|
return intersectionArea / (layout1Area + layout2Area - intersectionArea);
|
}
|
return 0;
|
};
|
var layoutsAreEqual = (firstLayout, secondLayout) => {
|
return firstLayout.x === secondLayout.x && firstLayout.y === secondLayout.y && firstLayout.width === secondLayout.width && firstLayout.height === secondLayout.height;
|
};
|
|
// src/collision.ts
|
var closestCenter = (draggable, droppables, context) => {
|
const point1 = draggable.transformed.center;
|
const collision = {
|
distance: Infinity,
|
droppable: null
|
};
|
for (const droppable of droppables) {
|
const distance = distanceBetweenPoints(point1, droppable.layout.center);
|
if (distance < collision.distance) {
|
collision.distance = distance;
|
collision.droppable = droppable;
|
} else if (distance === collision.distance && droppable.id === context.activeDroppableId) {
|
collision.droppable = droppable;
|
}
|
}
|
return collision.droppable;
|
};
|
var closestCorners = (draggable, droppables, context) => {
|
const draggableCorners = draggable.transformed.corners;
|
const collision = {
|
distance: Infinity,
|
droppable: null
|
};
|
for (const droppable of droppables) {
|
const droppableCorners = droppable.layout.corners;
|
const distance = distanceBetweenPoints(droppableCorners.topLeft, draggableCorners.topLeft) + distanceBetweenPoints(droppableCorners.topRight, draggableCorners.topRight) + distanceBetweenPoints(droppableCorners.bottomRight, draggableCorners.bottomRight) + distanceBetweenPoints(droppableCorners.bottomLeft, draggableCorners.bottomLeft);
|
if (distance < collision.distance) {
|
collision.distance = distance;
|
collision.droppable = droppable;
|
} else if (distance === collision.distance && droppable.id === context.activeDroppableId) {
|
collision.droppable = droppable;
|
}
|
}
|
return collision.droppable;
|
};
|
var mostIntersecting = (draggable, droppables, context) => {
|
const draggableLayout = draggable.transformed;
|
const collision = {
|
ratio: 0,
|
droppable: null
|
};
|
for (const droppable of droppables) {
|
const ratio = intersectionRatioOfLayouts(draggableLayout, droppable.layout);
|
if (ratio > collision.ratio) {
|
collision.ratio = ratio;
|
collision.droppable = droppable;
|
} else if (ratio > 0 && ratio === collision.ratio && droppable.id === context.activeDroppableId) {
|
collision.droppable = droppable;
|
}
|
}
|
return collision.droppable;
|
};
|
|
// src/drag-drop-context.tsx
|
var Context = createContext();
|
var DragDropProvider = passedProps => {
|
const props = mergeProps({
|
collisionDetector: mostIntersecting
|
}, passedProps);
|
const [state, setState] = createStore({
|
draggables: {},
|
droppables: {},
|
sensors: {},
|
active: {
|
draggableId: null,
|
get draggable() {
|
return state.active.draggableId !== null ? state.draggables[state.active.draggableId] : null;
|
},
|
droppableId: null,
|
get droppable() {
|
return state.active.droppableId !== null ? state.droppables[state.active.droppableId] : null;
|
},
|
sensorId: null,
|
get sensor() {
|
return state.active.sensorId !== null ? state.sensors[state.active.sensorId] : null;
|
},
|
overlay: null
|
}
|
});
|
const addTransformer = (type, id, transformer) => {
|
const displayType = type.substring(0, type.length - 1);
|
if (!untrack(() => state[type][id])) {
|
console.warn(`Cannot add transformer to nonexistent ${displayType} with id: ${id}`);
|
return;
|
}
|
setState(type, id, "transformers", transformer.id, transformer);
|
};
|
const removeTransformer = (type, id, transformerId) => {
|
const displayType = type.substring(0, type.length - 1);
|
if (!untrack(() => state[type][id])) {
|
console.warn(`Cannot remove transformer from nonexistent ${displayType} with id: ${id}`);
|
return;
|
}
|
if (!untrack(() => state[type][id]["transformers"][transformerId])) {
|
console.warn(`Cannot remove from ${displayType} with id ${id}, nonexistent transformer with id: ${transformerId}`);
|
return;
|
}
|
setState(type, id, "transformers", transformerId, void 0);
|
};
|
const addDraggable = ({
|
id,
|
node,
|
layout,
|
data
|
}) => {
|
const existingDraggable = state.draggables[id];
|
const draggable = {
|
id,
|
node,
|
layout,
|
data,
|
_pendingCleanup: false
|
};
|
let transformer;
|
if (!existingDraggable) {
|
Object.defineProperties(draggable, {
|
transformers: {
|
enumerable: true,
|
configurable: true,
|
writable: true,
|
value: {}
|
},
|
transform: {
|
enumerable: true,
|
configurable: true,
|
get: () => {
|
if (state.active.overlay) {
|
return noopTransform();
|
}
|
const transformers = Object.values(state.draggables[id].transformers);
|
transformers.sort((a, b) => a.order - b.order);
|
return transformers.reduce((transform, transformer2) => {
|
return transformer2.callback(transform);
|
}, noopTransform());
|
}
|
},
|
transformed: {
|
enumerable: true,
|
configurable: true,
|
get: () => {
|
return transformLayout(state.draggables[id].layout, state.draggables[id].transform);
|
}
|
}
|
});
|
} else if (state.active.draggableId === id && !state.active.overlay) {
|
const layoutDelta = {
|
x: existingDraggable.layout.x - layout.x,
|
y: existingDraggable.layout.y - layout.y
|
};
|
const transformerId = "addDraggable-existing-offset";
|
const existingTransformer = existingDraggable.transformers[transformerId];
|
const transformOffset = existingTransformer ? existingTransformer.callback(layoutDelta) : layoutDelta;
|
transformer = {
|
id: transformerId,
|
order: 100,
|
callback: transform => {
|
return {
|
x: transform.x + transformOffset.x,
|
y: transform.y + transformOffset.y
|
};
|
}
|
};
|
onDragEnd(() => removeTransformer("draggables", id, transformerId));
|
}
|
batch(() => {
|
setState("draggables", id, draggable);
|
if (transformer) {
|
addTransformer("draggables", id, transformer);
|
}
|
});
|
if (state.active.draggable) {
|
recomputeLayouts();
|
}
|
};
|
const removeDraggable = id => {
|
if (!untrack(() => state.draggables[id])) {
|
console.warn(`Cannot remove nonexistent draggable with id: ${id}`);
|
return;
|
}
|
setState("draggables", id, "_pendingCleanup", true);
|
queueMicrotask(() => cleanupDraggable(id));
|
};
|
const cleanupDraggable = id => {
|
if (state.draggables[id]?._pendingCleanup) {
|
const cleanupActive = state.active.draggableId === id;
|
batch(() => {
|
if (cleanupActive) {
|
setState("active", "draggableId", null);
|
}
|
setState("draggables", id, void 0);
|
});
|
}
|
};
|
const addDroppable = ({
|
id,
|
node,
|
layout,
|
data
|
}) => {
|
const existingDroppable = state.droppables[id];
|
const droppable = {
|
id,
|
node,
|
layout,
|
data,
|
_pendingCleanup: false
|
};
|
if (!existingDroppable) {
|
Object.defineProperties(droppable, {
|
transformers: {
|
enumerable: true,
|
configurable: true,
|
writable: true,
|
value: {}
|
},
|
transform: {
|
enumerable: true,
|
configurable: true,
|
get: () => {
|
const transformers = Object.values(state.droppables[id].transformers);
|
transformers.sort((a, b) => a.order - b.order);
|
return transformers.reduce((transform, transformer) => {
|
return transformer.callback(transform);
|
}, noopTransform());
|
}
|
},
|
transformed: {
|
enumerable: true,
|
configurable: true,
|
get: () => {
|
return transformLayout(state.droppables[id].layout, state.droppables[id].transform);
|
}
|
}
|
});
|
}
|
setState("droppables", id, droppable);
|
if (state.active.draggable) {
|
recomputeLayouts();
|
}
|
};
|
const removeDroppable = id => {
|
if (!untrack(() => state.droppables[id])) {
|
console.warn(`Cannot remove nonexistent droppable with id: ${id}`);
|
return;
|
}
|
setState("droppables", id, "_pendingCleanup", true);
|
queueMicrotask(() => cleanupDroppable(id));
|
};
|
const cleanupDroppable = id => {
|
if (state.droppables[id]?._pendingCleanup) {
|
const cleanupActive = state.active.droppableId === id;
|
batch(() => {
|
if (cleanupActive) {
|
setState("active", "droppableId", null);
|
}
|
setState("droppables", id, void 0);
|
});
|
}
|
};
|
const addSensor = ({
|
id,
|
activators
|
}) => {
|
setState("sensors", id, {
|
id,
|
activators,
|
coordinates: {
|
origin: {
|
x: 0,
|
y: 0
|
},
|
current: {
|
x: 0,
|
y: 0
|
},
|
get delta() {
|
return {
|
x: state.sensors[id].coordinates.current.x - state.sensors[id].coordinates.origin.x,
|
y: state.sensors[id].coordinates.current.y - state.sensors[id].coordinates.origin.y
|
};
|
}
|
}
|
});
|
};
|
const removeSensor = id => {
|
if (!untrack(() => state.sensors[id])) {
|
console.warn(`Cannot remove nonexistent sensor with id: ${id}`);
|
return;
|
}
|
const cleanupActive = state.active.sensorId === id;
|
batch(() => {
|
if (cleanupActive) {
|
setState("active", "sensorId", null);
|
}
|
setState("sensors", id, void 0);
|
});
|
};
|
const setOverlay = ({
|
node,
|
layout
|
}) => {
|
const existing = state.active.overlay;
|
const overlay = {
|
node,
|
layout
|
};
|
if (!existing) {
|
Object.defineProperties(overlay, {
|
id: {
|
enumerable: true,
|
configurable: true,
|
get: () => state.active.draggable?.id
|
},
|
data: {
|
enumerable: true,
|
configurable: true,
|
get: () => state.active.draggable?.data
|
},
|
transformers: {
|
enumerable: true,
|
configurable: true,
|
get: () => Object.fromEntries(Object.entries(state.active.draggable ? state.active.draggable.transformers : {}).filter(([id]) => id !== "addDraggable-existing-offset"))
|
},
|
transform: {
|
enumerable: true,
|
configurable: true,
|
get: () => {
|
const transformers = Object.values(state.active.overlay ? state.active.overlay.transformers : []);
|
transformers.sort((a, b) => a.order - b.order);
|
return transformers.reduce((transform, transformer) => {
|
return transformer.callback(transform);
|
}, noopTransform());
|
}
|
},
|
transformed: {
|
enumerable: true,
|
configurable: true,
|
get: () => {
|
return state.active.overlay ? transformLayout(state.active.overlay.layout, state.active.overlay.transform) : new Layout({
|
x: 0,
|
y: 0,
|
width: 0,
|
height: 0
|
});
|
}
|
}
|
});
|
}
|
setState("active", "overlay", overlay);
|
};
|
const clearOverlay = () => setState("active", "overlay", null);
|
const sensorStart = (id, coordinates) => {
|
batch(() => {
|
setState("sensors", id, "coordinates", {
|
origin: {
|
...coordinates
|
},
|
current: {
|
...coordinates
|
}
|
});
|
setState("active", "sensorId", id);
|
});
|
};
|
const sensorMove = coordinates => {
|
const sensorId = state.active.sensorId;
|
if (!sensorId) {
|
console.warn("Cannot move sensor when no sensor active.");
|
return;
|
}
|
setState("sensors", sensorId, "coordinates", "current", {
|
...coordinates
|
});
|
};
|
const sensorEnd = () => setState("active", "sensorId", null);
|
const draggableActivators = (draggableId, asHandlers) => {
|
const eventMap = {};
|
for (const sensor of Object.values(state.sensors)) {
|
if (sensor) {
|
for (const [type, activator] of Object.entries(sensor.activators)) {
|
eventMap[type] ??= [];
|
eventMap[type].push({
|
sensor,
|
activator
|
});
|
}
|
}
|
}
|
const listeners = {};
|
for (const key in eventMap) {
|
let handlerKey = key;
|
if (asHandlers) {
|
handlerKey = `on${key}`;
|
}
|
listeners[handlerKey] = event => {
|
for (const {
|
activator
|
} of eventMap[key]) {
|
if (state.active.sensor) {
|
break;
|
}
|
activator(event, draggableId);
|
}
|
};
|
}
|
return listeners;
|
};
|
const recomputeLayouts = () => {
|
let anyLayoutChanged = false;
|
const draggables = Object.values(state.draggables);
|
const droppables = Object.values(state.droppables);
|
const overlay = state.active.overlay;
|
batch(() => {
|
const cache = /* @__PURE__ */new WeakMap();
|
for (const draggable of draggables) {
|
if (draggable) {
|
const currentLayout = draggable.layout;
|
if (!cache.has(draggable.node)) cache.set(draggable.node, elementLayout(draggable.node));
|
const layout = cache.get(draggable.node);
|
if (!layoutsAreEqual(currentLayout, layout)) {
|
setState("draggables", draggable.id, "layout", layout);
|
anyLayoutChanged = true;
|
}
|
}
|
}
|
for (const droppable of droppables) {
|
if (droppable) {
|
const currentLayout = droppable.layout;
|
if (!cache.has(droppable.node)) cache.set(droppable.node, elementLayout(droppable.node));
|
const layout = cache.get(droppable.node);
|
if (!layoutsAreEqual(currentLayout, layout)) {
|
setState("droppables", droppable.id, "layout", layout);
|
anyLayoutChanged = true;
|
}
|
}
|
}
|
if (overlay) {
|
const currentLayout = overlay.layout;
|
const layout = elementLayout(overlay.node);
|
if (!layoutsAreEqual(currentLayout, layout)) {
|
setState("active", "overlay", "layout", layout);
|
anyLayoutChanged = true;
|
}
|
}
|
});
|
return anyLayoutChanged;
|
};
|
const detectCollisions = () => {
|
const draggable = state.active.overlay ?? state.active.draggable;
|
if (draggable) {
|
const droppable = props.collisionDetector(draggable, Object.values(state.droppables), {
|
activeDroppableId: state.active.droppableId
|
});
|
const droppableId = droppable ? droppable.id : null;
|
if (state.active.droppableId !== droppableId) {
|
setState("active", "droppableId", droppableId);
|
}
|
}
|
};
|
const dragStart = draggableId => {
|
const transformer = {
|
id: "sensorMove",
|
order: 0,
|
callback: transform => {
|
if (state.active.sensor) {
|
return {
|
x: transform.x + state.active.sensor.coordinates.delta.x,
|
y: transform.y + state.active.sensor.coordinates.delta.y
|
};
|
}
|
return transform;
|
}
|
};
|
recomputeLayouts();
|
batch(() => {
|
setState("active", "draggableId", draggableId);
|
addTransformer("draggables", draggableId, transformer);
|
});
|
detectCollisions();
|
};
|
const dragEnd = () => {
|
const draggableId = untrack(() => state.active.draggableId);
|
batch(() => {
|
if (draggableId !== null) {
|
removeTransformer("draggables", draggableId, "sensorMove");
|
}
|
setState("active", ["draggableId", "droppableId"], null);
|
});
|
recomputeLayouts();
|
};
|
const onDragStart = handler => {
|
createEffect(() => {
|
const draggable = state.active.draggable;
|
if (draggable) {
|
untrack(() => handler({
|
draggable
|
}));
|
}
|
});
|
};
|
const onDragMove = handler => {
|
createEffect(() => {
|
const draggable = state.active.draggable;
|
if (draggable) {
|
const overlay = untrack(() => state.active.overlay);
|
Object.values(overlay ? overlay.transform : draggable.transform);
|
untrack(() => handler({
|
draggable,
|
overlay
|
}));
|
}
|
});
|
};
|
const onDragOver = handler => {
|
createEffect(() => {
|
const draggable = state.active.draggable;
|
const droppable = state.active.droppable;
|
if (draggable) {
|
untrack(() => handler({
|
draggable,
|
droppable,
|
overlay: state.active.overlay
|
}));
|
}
|
});
|
};
|
const onDragEnd = handler => {
|
createEffect(({
|
previousDraggable,
|
previousDroppable,
|
previousOverlay
|
}) => {
|
const draggable = state.active.draggable;
|
const droppable = draggable ? state.active.droppable : null;
|
const overlay = draggable ? state.active.overlay : null;
|
if (!draggable && previousDraggable) {
|
untrack(() => handler({
|
draggable: previousDraggable,
|
droppable: previousDroppable,
|
overlay: previousOverlay
|
}));
|
}
|
return {
|
previousDraggable: draggable,
|
previousDroppable: droppable,
|
previousOverlay: overlay
|
};
|
}, {
|
previousDraggable: null,
|
previousDroppable: null,
|
previousOverlay: null
|
});
|
};
|
onDragMove(() => detectCollisions());
|
props.onDragStart && onDragStart(props.onDragStart);
|
props.onDragMove && onDragMove(props.onDragMove);
|
props.onDragOver && onDragOver(props.onDragOver);
|
props.onDragEnd && onDragEnd(props.onDragEnd);
|
const actions = {
|
addTransformer,
|
removeTransformer,
|
addDraggable,
|
removeDraggable,
|
addDroppable,
|
removeDroppable,
|
addSensor,
|
removeSensor,
|
setOverlay,
|
clearOverlay,
|
recomputeLayouts,
|
detectCollisions,
|
draggableActivators,
|
sensorStart,
|
sensorMove,
|
sensorEnd,
|
dragStart,
|
dragEnd,
|
onDragStart,
|
onDragMove,
|
onDragOver,
|
onDragEnd
|
};
|
const context = [state, actions];
|
return _$createComponent(Context.Provider, {
|
value: context,
|
get children() {
|
return props.children;
|
}
|
});
|
};
|
var useDragDropContext = () => {
|
return useContext(Context) || null;
|
};
|
|
// src/create-pointer-sensor.ts
|
import { onCleanup, onMount } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
|
var createPointerSensor = (id = "pointer-sensor") => {
|
const [state, {
|
addSensor,
|
removeSensor,
|
sensorStart,
|
sensorMove,
|
sensorEnd,
|
dragStart,
|
dragEnd
|
}] = useDragDropContext();
|
const activationDelay = 250;
|
const activationDistance = 10;
|
onMount(() => {
|
addSensor({
|
id,
|
activators: {
|
pointerdown: attach
|
}
|
});
|
});
|
onCleanup(() => {
|
removeSensor(id);
|
});
|
const isActiveSensor = () => state.active.sensorId === id;
|
const initialCoordinates = {
|
x: 0,
|
y: 0
|
};
|
let activationDelayTimeoutId = null;
|
let activationDraggableId = null;
|
const attach = (event, draggableId) => {
|
if (event.button !== 0) return;
|
document.addEventListener("pointermove", onPointerMove);
|
document.addEventListener("pointerup", onPointerUp);
|
activationDraggableId = draggableId;
|
initialCoordinates.x = event.clientX;
|
initialCoordinates.y = event.clientY;
|
activationDelayTimeoutId = window.setTimeout(onActivate, activationDelay);
|
};
|
const detach = () => {
|
if (activationDelayTimeoutId) {
|
clearTimeout(activationDelayTimeoutId);
|
activationDelayTimeoutId = null;
|
}
|
document.removeEventListener("pointermove", onPointerMove);
|
document.removeEventListener("pointerup", onPointerUp);
|
document.removeEventListener("selectionchange", clearSelection);
|
};
|
const onActivate = () => {
|
if (!state.active.sensor) {
|
sensorStart(id, initialCoordinates);
|
dragStart(activationDraggableId);
|
clearSelection();
|
document.addEventListener("selectionchange", clearSelection);
|
} else if (!isActiveSensor()) {
|
detach();
|
}
|
};
|
const onPointerMove = event => {
|
const coordinates = {
|
x: event.clientX,
|
y: event.clientY
|
};
|
if (!state.active.sensor) {
|
const transform = {
|
x: coordinates.x - initialCoordinates.x,
|
y: coordinates.y - initialCoordinates.y
|
};
|
if (Math.sqrt(transform.x ** 2 + transform.y ** 2) > activationDistance) {
|
onActivate();
|
}
|
}
|
if (isActiveSensor()) {
|
event.preventDefault();
|
sensorMove(coordinates);
|
}
|
};
|
const onPointerUp = event => {
|
detach();
|
if (isActiveSensor()) {
|
event.preventDefault();
|
dragEnd();
|
sensorEnd();
|
}
|
};
|
const clearSelection = () => {
|
window.getSelection()?.removeAllRanges();
|
};
|
};
|
|
// src/drag-drop-sensors.tsx
|
var DragDropSensors = props => {
|
createPointerSensor();
|
return _$memo(() => props.children);
|
};
|
|
// src/create-draggable.ts
|
import { createEffect as createEffect2, createSignal, onCleanup as onCleanup2, onMount as onMount2 } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
|
|
// src/style.ts
|
var layoutStyle = layout => {
|
return {
|
top: `${layout.y}px`,
|
left: `${layout.x}px`,
|
width: `${layout.width}px`,
|
height: `${layout.height}px`
|
};
|
};
|
var transformStyle = transform => {
|
return {
|
transform: `translate3d(${transform.x}px, ${transform.y}px, 0)`
|
};
|
};
|
var maybeTransformStyle = transform => {
|
return transformsAreEqual(transform, noopTransform()) ? {} : transformStyle(transform);
|
};
|
|
// src/create-draggable.ts
|
var createDraggable = (id, data = {}) => {
|
const [state, {
|
addDraggable,
|
removeDraggable,
|
draggableActivators
|
}] = useDragDropContext();
|
const [node, setNode] = createSignal(null);
|
onMount2(() => {
|
const resolvedNode = node();
|
if (resolvedNode) {
|
addDraggable({
|
id,
|
node: resolvedNode,
|
layout: elementLayout(resolvedNode),
|
data
|
});
|
}
|
});
|
onCleanup2(() => removeDraggable(id));
|
const isActiveDraggable = () => state.active.draggableId === id;
|
const transform = () => {
|
return state.draggables[id]?.transform || noopTransform();
|
};
|
const draggable = Object.defineProperties((element, accessor) => {
|
const config = accessor ? accessor() : {};
|
createEffect2(() => {
|
const resolvedNode = node();
|
const activators = draggableActivators(id);
|
if (resolvedNode) {
|
for (const key in activators) {
|
resolvedNode.addEventListener(key, activators[key]);
|
}
|
}
|
onCleanup2(() => {
|
if (resolvedNode) {
|
for (const key in activators) {
|
resolvedNode.removeEventListener(key, activators[key]);
|
}
|
}
|
});
|
});
|
setNode(element);
|
if (!config.skipTransform) {
|
createEffect2(() => {
|
const resolvedTransform = transform();
|
if (!transformsAreEqual(resolvedTransform, noopTransform())) {
|
const style = transformStyle(transform());
|
element.style.setProperty("transform", style.transform ?? null);
|
} else {
|
element.style.removeProperty("transform");
|
}
|
});
|
}
|
}, {
|
ref: {
|
enumerable: true,
|
value: setNode
|
},
|
isActiveDraggable: {
|
enumerable: true,
|
get: isActiveDraggable
|
},
|
dragActivators: {
|
enumerable: true,
|
get: () => {
|
return draggableActivators(id, true);
|
}
|
},
|
transform: {
|
enumerable: true,
|
get: transform
|
}
|
});
|
return draggable;
|
};
|
|
// src/create-droppable.ts
|
import { createEffect as createEffect3, createSignal as createSignal2, onCleanup as onCleanup3, onMount as onMount3 } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
|
var createDroppable = (id, data = {}) => {
|
const [state, {
|
addDroppable,
|
removeDroppable
|
}] = useDragDropContext();
|
const [node, setNode] = createSignal2(null);
|
onMount3(() => {
|
const resolvedNode = node();
|
if (resolvedNode) {
|
addDroppable({
|
id,
|
node: resolvedNode,
|
layout: elementLayout(resolvedNode),
|
data
|
});
|
}
|
});
|
onCleanup3(() => removeDroppable(id));
|
const isActiveDroppable = () => state.active.droppableId === id;
|
const transform = () => {
|
return state.droppables[id]?.transform || noopTransform();
|
};
|
const droppable = Object.defineProperties((element, accessor) => {
|
const config = accessor ? accessor() : {};
|
setNode(element);
|
if (!config.skipTransform) {
|
createEffect3(() => {
|
const resolvedTransform = transform();
|
if (!transformsAreEqual(resolvedTransform, noopTransform())) {
|
const style = transformStyle(transform());
|
element.style.setProperty("transform", style.transform ?? null);
|
} else {
|
element.style.removeProperty("transform");
|
}
|
});
|
}
|
}, {
|
ref: {
|
enumerable: true,
|
value: setNode
|
},
|
isActiveDroppable: {
|
enumerable: true,
|
get: isActiveDroppable
|
},
|
transform: {
|
enumerable: true,
|
get: transform
|
}
|
});
|
return droppable;
|
};
|
|
// src/drag-overlay.tsx
|
import { Portal } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
|
import { Show } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
|
var DragOverlay = props => {
|
const [state, {
|
onDragStart,
|
onDragEnd,
|
setOverlay,
|
clearOverlay
|
}] = useDragDropContext();
|
let node;
|
onDragStart(({
|
draggable
|
}) => {
|
setOverlay({
|
node: draggable.node,
|
layout: draggable.layout
|
});
|
queueMicrotask(() => {
|
if (node) {
|
const layout = elementLayout(node);
|
const delta = {
|
x: (draggable.layout.width - layout.width) / 2,
|
y: (draggable.layout.height - layout.height) / 2
|
};
|
layout.x += delta.x;
|
layout.y += delta.y;
|
setOverlay({
|
node,
|
layout
|
});
|
}
|
});
|
});
|
onDragEnd(() => queueMicrotask(clearOverlay));
|
const style = () => {
|
const overlay = state.active.overlay;
|
const draggable = state.active.draggable;
|
if (!overlay || !draggable) return {};
|
return {
|
position: "fixed",
|
transition: "transform 0s",
|
top: `${overlay.layout.top}px`,
|
left: `${overlay.layout.left}px`,
|
"min-width": `${draggable.layout.width}px`,
|
"min-height": `${draggable.layout.height}px`,
|
...transformStyle(overlay.transform),
|
...props.style
|
};
|
};
|
return _$createComponent(Portal, {
|
get mount() {
|
return document.body;
|
},
|
get children() {
|
return _$createComponent(Show, {
|
get when() {
|
return state.active.draggable;
|
},
|
get children() {
|
const _el$ = _tmpl$();
|
const _ref$ = node;
|
typeof _ref$ === "function" ? _$use(_ref$, _el$) : node = _el$;
|
_$insert(_el$, (() => {
|
const _c$ = _$memo(() => typeof props.children === "function");
|
return () => _c$() ? props.children(state.active.draggable) : props.children;
|
})());
|
_$effect(_p$ => {
|
const _v$ = props.class,
|
_v$2 = style();
|
_v$ !== _p$._v$ && _$className(_el$, _p$._v$ = _v$);
|
_p$._v$2 = _$style(_el$, _v$2, _p$._v$2);
|
return _p$;
|
}, {
|
_v$: undefined,
|
_v$2: undefined
|
});
|
return _el$;
|
}
|
});
|
}
|
});
|
};
|
|
// src/sortable-context.tsx
|
import { createContext as createContext2, createEffect as createEffect4, untrack as untrack2, useContext as useContext2 } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
|
import { createStore as createStore2 } from "/node_modules/.vite/deps/solid-js_store.js?v=93754656";
|
|
// src/move-array-item.ts
|
var moveArrayItem = (array, fromIndex, toIndex) => {
|
const newArray = array.slice();
|
newArray.splice(toIndex, 0, ...newArray.splice(fromIndex, 1));
|
return newArray;
|
};
|
|
// src/sortable-context.tsx
|
var Context2 = createContext2();
|
var SortableProvider = props => {
|
const [dndState] = useDragDropContext();
|
const [state, setState] = createStore2({
|
initialIds: [],
|
sortedIds: []
|
});
|
const isValidIndex = index => {
|
return index >= 0 && index < state.initialIds.length;
|
};
|
createEffect4(() => {
|
setState("initialIds", [...props.ids]);
|
setState("sortedIds", [...props.ids]);
|
});
|
createEffect4(() => {
|
if (dndState.active.draggableId && dndState.active.droppableId) {
|
untrack2(() => {
|
const fromIndex = state.sortedIds.indexOf(dndState.active.draggableId);
|
const toIndex = state.initialIds.indexOf(dndState.active.droppableId);
|
if (!isValidIndex(fromIndex) || !isValidIndex(toIndex)) {
|
setState("sortedIds", [...props.ids]);
|
} else if (fromIndex !== toIndex) {
|
const resorted = moveArrayItem(state.sortedIds, fromIndex, toIndex);
|
setState("sortedIds", resorted);
|
}
|
});
|
} else {
|
setState("sortedIds", [...props.ids]);
|
}
|
});
|
const actions = {};
|
const context = [state, actions];
|
return _$createComponent(Context2.Provider, {
|
value: context,
|
get children() {
|
return props.children;
|
}
|
});
|
};
|
var useSortableContext = () => {
|
return useContext2(Context2) || null;
|
};
|
|
// src/create-sortable.ts
|
import { createEffect as createEffect5, onCleanup as onCleanup4, onMount as onMount4 } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
|
|
// src/combine-refs.ts
|
var combineRefs = (setRefA, setRefB) => {
|
return ref => {
|
setRefA(ref);
|
setRefB(ref);
|
};
|
};
|
|
// src/create-sortable.ts
|
var createSortable = (id, data = {}) => {
|
const [dndState, {
|
addTransformer,
|
removeTransformer
|
}] = useDragDropContext();
|
const [sortableState] = useSortableContext();
|
const draggable = createDraggable(id, data);
|
const droppable = createDroppable(id, data);
|
const setNode = combineRefs(draggable.ref, droppable.ref);
|
const initialIndex = () => sortableState.initialIds.indexOf(id);
|
const currentIndex = () => sortableState.sortedIds.indexOf(id);
|
const layoutById = id2 => dndState.droppables[id2]?.layout || null;
|
const sortedTransform = () => {
|
const delta = noopTransform();
|
const resolvedInitialIndex = initialIndex();
|
const resolvedCurrentIndex = currentIndex();
|
if (resolvedCurrentIndex !== resolvedInitialIndex) {
|
const currentLayout = layoutById(id);
|
const targetLayout = layoutById(sortableState.initialIds[resolvedCurrentIndex]);
|
if (currentLayout && targetLayout) {
|
delta.x = targetLayout.x - currentLayout.x;
|
delta.y = targetLayout.y - currentLayout.y;
|
}
|
}
|
return delta;
|
};
|
const transformer = {
|
id: "sortableOffset",
|
order: 100,
|
callback: transform2 => {
|
const delta = sortedTransform();
|
return {
|
x: transform2.x + delta.x,
|
y: transform2.y + delta.y
|
};
|
}
|
};
|
onMount4(() => addTransformer("droppables", id, transformer));
|
onCleanup4(() => removeTransformer("droppables", id, transformer.id));
|
const transform = () => {
|
return (id === dndState.active.draggableId && !dndState.active.overlay ? dndState.draggables[id]?.transform : dndState.droppables[id]?.transform) || noopTransform();
|
};
|
const sortable = Object.defineProperties(element => {
|
draggable(element, () => ({
|
skipTransform: true
|
}));
|
droppable(element, () => ({
|
skipTransform: true
|
}));
|
createEffect5(() => {
|
const resolvedTransform = transform();
|
if (!transformsAreEqual(resolvedTransform, noopTransform())) {
|
const style = transformStyle(transform());
|
element.style.setProperty("transform", style.transform ?? null);
|
} else {
|
element.style.removeProperty("transform");
|
}
|
});
|
}, {
|
ref: {
|
enumerable: true,
|
value: setNode
|
},
|
transform: {
|
enumerable: true,
|
get: transform
|
},
|
isActiveDraggable: {
|
enumerable: true,
|
get: () => draggable.isActiveDraggable
|
},
|
dragActivators: {
|
enumerable: true,
|
get: () => draggable.dragActivators
|
},
|
isActiveDroppable: {
|
enumerable: true,
|
get: () => droppable.isActiveDroppable
|
}
|
});
|
return sortable;
|
};
|
|
// src/drag-drop-debugger.tsx
|
import { For, mergeProps as mergeProps2, onCleanup as onCleanup5, onMount as onMount5, Show as Show2 } from "/node_modules/.vite/deps/solid-js.js?v=93754656";
|
import { Portal as Portal2 } from "/node_modules/.vite/deps/solid-js_web.js?v=93754656";
|
var Highlighter = props => {
|
props = mergeProps2({
|
color: "red",
|
active: false
|
}, props);
|
return (() => {
|
const _el$2 = _tmpl$();
|
_$insert(_el$2, () => props.id);
|
_$effect(_$p => _$style(_el$2, {
|
position: "fixed",
|
"pointer-events": "none",
|
...layoutStyle(props.layout),
|
outline: "1px dashed",
|
"outline-width": props.active ? "4px" : "1px",
|
"outline-color": props.color,
|
display: "flex",
|
color: props.color,
|
"align-items": "flex-end",
|
"justify-content": "flex-end",
|
...props.style
|
}, _$p));
|
return _el$2;
|
})();
|
};
|
var DragDropDebugger = () => {
|
const [state, {
|
recomputeLayouts
|
}] = useDragDropContext();
|
let ticking = false;
|
const update = () => {
|
if (!ticking) {
|
window.requestAnimationFrame(function () {
|
recomputeLayouts();
|
ticking = false;
|
});
|
ticking = true;
|
}
|
};
|
onMount5(() => {
|
document.addEventListener("scroll", update);
|
});
|
onCleanup5(() => {
|
document.removeEventListener("scroll", update);
|
});
|
return _$createComponent(Portal2, {
|
get mount() {
|
return document.body;
|
},
|
get children() {
|
return [_$createComponent(For, {
|
get each() {
|
return Object.values(state.droppables);
|
},
|
children: droppable => droppable ? _$createComponent(Highlighter, {
|
get id() {
|
return droppable.id;
|
},
|
get layout() {
|
return droppable.layout;
|
},
|
get active() {
|
return droppable.id === state.active.droppableId;
|
}
|
}) : null
|
}), _$createComponent(For, {
|
get each() {
|
return Object.values(state.draggables);
|
},
|
children: draggable => draggable ? _$createComponent(Highlighter, {
|
get id() {
|
return draggable.id;
|
},
|
get layout() {
|
return draggable.layout;
|
},
|
get active() {
|
return draggable.id === state.active.draggableId;
|
},
|
color: "blue",
|
get style() {
|
return {
|
"align-items": "flex-start",
|
"justify-content": "flex-start",
|
...transformStyle(draggable.transform)
|
};
|
}
|
}) : null
|
}), _$createComponent(Show2, {
|
get when() {
|
return state.active.overlay;
|
},
|
keyed: true,
|
children: overlay => _$createComponent(Highlighter, {
|
get id() {
|
return overlay.id;
|
},
|
get layout() {
|
return overlay.layout;
|
},
|
active: true,
|
color: "orange",
|
get style() {
|
return {
|
...transformStyle(overlay.transform)
|
};
|
}
|
})
|
})];
|
}
|
});
|
};
|
export { DragDropDebugger, DragDropProvider, DragDropSensors, DragOverlay, SortableProvider, closestCenter, closestCorners, createDraggable, createDroppable, createPointerSensor, createSortable, layoutStyle, maybeTransformStyle, mostIntersecting, transformStyle, useDragDropContext, useSortableContext };
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJiYXRjaCIsImNyZWF0ZUNvbnRleHQiLCJjcmVhdGVFZmZlY3QiLCJtZXJnZVByb3BzIiwidW50cmFjayIsInVzZUNvbnRleHQiLCJjcmVhdGVTdG9yZSIsIkxheW91dCIsIngiLCJ5Iiwid2lkdGgiLCJoZWlnaHQiLCJjb25zdHJ1Y3RvciIsInJlY3QiLCJNYXRoIiwiZmxvb3IiLCJsZWZ0IiwidG9wIiwicmlnaHQiLCJib3R0b20iLCJjZW50ZXIiLCJjb3JuZXJzIiwidG9wTGVmdCIsInRvcFJpZ2h0IiwiYm90dG9tUmlnaHQiLCJib3R0b21MZWZ0IiwiZWxlbWVudExheW91dCIsImVsZW1lbnQiLCJsYXlvdXQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJ0cmFuc2Zvcm0iLCJnZXRDb21wdXRlZFN0eWxlIiwic3RyaXBUcmFuc2Zvcm1Gcm9tTGF5b3V0IiwidHJhbnNsYXRlWCIsInRyYW5zbGF0ZVkiLCJzdGFydHNXaXRoIiwibWF0cml4Iiwic2xpY2UiLCJzcGxpdCIsIm5vb3BUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm1zQXJlRXF1YWwiLCJmaXJzdFRyYW5zZm9ybSIsInNlY29uZFRyYW5zZm9ybSIsInRyYW5zZm9ybUxheW91dCIsImRpc3RhbmNlQmV0d2VlblBvaW50cyIsImZpcnN0UG9pbnQiLCJzZWNvbmRQb2ludCIsInNxcnQiLCJwb3ciLCJpbnRlcnNlY3Rpb25SYXRpb09mTGF5b3V0cyIsImZpcnN0TGF5b3V0Iiwic2Vjb25kTGF5b3V0IiwibWF4IiwibWluIiwibGF5b3V0MUFyZWEiLCJsYXlvdXQyQXJlYSIsImludGVyc2VjdGlvbkFyZWEiLCJsYXlvdXRzQXJlRXF1YWwiLCJjbG9zZXN0Q2VudGVyIiwiZHJhZ2dhYmxlIiwiZHJvcHBhYmxlcyIsImNvbnRleHQiLCJwb2ludDEiLCJ0cmFuc2Zvcm1lZCIsImNvbGxpc2lvbiIsImRpc3RhbmNlIiwiSW5maW5pdHkiLCJkcm9wcGFibGUiLCJpZCIsImFjdGl2ZURyb3BwYWJsZUlkIiwiY2xvc2VzdENvcm5lcnMiLCJkcmFnZ2FibGVDb3JuZXJzIiwiZHJvcHBhYmxlQ29ybmVycyIsIm1vc3RJbnRlcnNlY3RpbmciLCJkcmFnZ2FibGVMYXlvdXQiLCJyYXRpbyIsIkNvbnRleHQiLCJEcmFnRHJvcFByb3ZpZGVyIiwicGFzc2VkUHJvcHMiLCJwcm9wcyIsImNvbGxpc2lvbkRldGVjdG9yIiwic3RhdGUiLCJzZXRTdGF0ZSIsImRyYWdnYWJsZXMiLCJzZW5zb3JzIiwiYWN0aXZlIiwiZHJhZ2dhYmxlSWQiLCJkcm9wcGFibGVJZCIsInNlbnNvcklkIiwic2Vuc29yIiwib3ZlcmxheSIsImFkZFRyYW5zZm9ybWVyIiwidHlwZSIsInRyYW5zZm9ybWVyIiwiZGlzcGxheVR5cGUiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJjb25zb2xlIiwid2FybiIsInJlbW92ZVRyYW5zZm9ybWVyIiwidHJhbnNmb3JtZXJJZCIsImFkZERyYWdnYWJsZSIsIm5vZGUiLCJkYXRhIiwiZXhpc3RpbmdEcmFnZ2FibGUiLCJfcGVuZGluZ0NsZWFudXAiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0aWVzIiwidHJhbnNmb3JtZXJzIiwiZW51bWVyYWJsZSIsImNvbmZpZ3VyYWJsZSIsIndyaXRhYmxlIiwidmFsdWUiLCJnZXQiLCJ2YWx1ZXMiLCJzb3J0IiwiYSIsImIiLCJvcmRlciIsInJlZHVjZSIsInRyYW5zZm9ybWVyMiIsImNhbGxiYWNrIiwibGF5b3V0RGVsdGEiLCJleGlzdGluZ1RyYW5zZm9ybWVyIiwidHJhbnNmb3JtT2Zmc2V0Iiwib25EcmFnRW5kIiwicmVjb21wdXRlTGF5b3V0cyIsInJlbW92ZURyYWdnYWJsZSIsInF1ZXVlTWljcm90YXNrIiwiY2xlYW51cERyYWdnYWJsZSIsImNsZWFudXBBY3RpdmUiLCJhZGREcm9wcGFibGUiLCJleGlzdGluZ0Ryb3BwYWJsZSIsInJlbW92ZURyb3BwYWJsZSIsImNsZWFudXBEcm9wcGFibGUiLCJhZGRTZW5zb3IiLCJhY3RpdmF0b3JzIiwiY29vcmRpbmF0ZXMiLCJvcmlnaW4iLCJjdXJyZW50IiwiZGVsdGEiLCJyZW1vdmVTZW5zb3IiLCJzZXRPdmVybGF5IiwiZXhpc3RpbmciLCJmcm9tRW50cmllcyIsImVudHJpZXMiLCJmaWx0ZXIiLCJjbGVhck92ZXJsYXkiLCJzZW5zb3JTdGFydCIsInNlbnNvck1vdmUiLCJzZW5zb3JFbmQiLCJkcmFnZ2FibGVBY3RpdmF0b3JzIiwiYXNIYW5kbGVycyIsImV2ZW50TWFwIiwiYWN0aXZhdG9yIiwicHVzaCIsImxpc3RlbmVycyIsImtleSIsImhhbmRsZXJLZXkiLCJldmVudCIsImFueUxheW91dENoYW5nZWQiLCJjYWNoZSIsIldlYWtNYXAiLCJjdXJyZW50TGF5b3V0IiwiaGFzIiwic2V0IiwiZGV0ZWN0Q29sbGlzaW9ucyIsImRyYWdTdGFydCIsImRyYWdFbmQiLCJvbkRyYWdTdGFydCIsImhhbmRsZXIiLCJvbkRyYWdNb3ZlIiwib25EcmFnT3ZlciIsInByZXZpb3VzRHJhZ2dhYmxlIiwicHJldmlvdXNEcm9wcGFibGUiLCJwcmV2aW91c092ZXJsYXkiLCJhY3Rpb25zIiwiXyRjcmVhdGVDb21wb25lbnQiLCJQcm92aWRlciIsImNoaWxkcmVuIiwidXNlRHJhZ0Ryb3BDb250ZXh0Iiwib25DbGVhbnVwIiwib25Nb3VudCIsImNyZWF0ZVBvaW50ZXJTZW5zb3IiLCJhY3RpdmF0aW9uRGVsYXkiLCJhY3RpdmF0aW9uRGlzdGFuY2UiLCJwb2ludGVyZG93biIsImF0dGFjaCIsImlzQWN0aXZlU2Vuc29yIiwiaW5pdGlhbENvb3JkaW5hdGVzIiwiYWN0aXZhdGlvbkRlbGF5VGltZW91dElkIiwiYWN0aXZhdGlvbkRyYWdnYWJsZUlkIiwiYnV0dG9uIiwiZG9jdW1lbnQiLCJhZGRFdmVudExpc3RlbmVyIiwib25Qb2ludGVyTW92ZSIsIm9uUG9pbnRlclVwIiwiY2xpZW50WCIsImNsaWVudFkiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0Iiwib25BY3RpdmF0ZSIsImRldGFjaCIsImNsZWFyVGltZW91dCIsInJlbW92ZUV2ZW50TGlzdGVuZXIiLCJjbGVhclNlbGVjdGlvbiIsInByZXZlbnREZWZhdWx0IiwiZ2V0U2VsZWN0aW9uIiwicmVtb3ZlQWxsUmFuZ2VzIiwiRHJhZ0Ryb3BTZW5zb3JzIiwiXyRtZW1vIiwiY3JlYXRlRWZmZWN0MiIsImNyZWF0ZVNpZ25hbCIsIm9uQ2xlYW51cDIiLCJvbk1vdW50MiIsImxheW91dFN0eWxlIiwidHJhbnNmb3JtU3R5bGUiLCJtYXliZVRyYW5zZm9ybVN0eWxlIiwiY3JlYXRlRHJhZ2dhYmxlIiwic2V0Tm9kZSIsInJlc29sdmVkTm9kZSIsImlzQWN0aXZlRHJhZ2dhYmxlIiwiYWNjZXNzb3IiLCJjb25maWciLCJza2lwVHJhbnNmb3JtIiwicmVzb2x2ZWRUcmFuc2Zvcm0iLCJzdHlsZSIsInNldFByb3BlcnR5IiwicmVtb3ZlUHJvcGVydHkiLCJyZWYiLCJkcmFnQWN0aXZhdG9ycyIsImNyZWF0ZUVmZmVjdDMiLCJjcmVhdGVTaWduYWwyIiwib25DbGVhbnVwMyIsIm9uTW91bnQzIiwiY3JlYXRlRHJvcHBhYmxlIiwiaXNBY3RpdmVEcm9wcGFibGUiLCJQb3J0YWwiLCJTaG93IiwiRHJhZ092ZXJsYXkiLCJwb3NpdGlvbiIsInRyYW5zaXRpb24iLCJtb3VudCIsImJvZHkiLCJ3aGVuIiwiX2VsJCIsIl90bXBsJCIsIl9yZWYkIiwiXyR1c2UiLCJfJGluc2VydCIsIl9jJCIsIl8kZWZmZWN0IiwiX3AkIiwiX3YkIiwiY2xhc3MiLCJfdiQyIiwiXyRjbGFzc05hbWUiLCJfJHN0eWxlIiwidW5kZWZpbmVkIiwiY3JlYXRlQ29udGV4dDIiLCJjcmVhdGVFZmZlY3Q0IiwidW50cmFjazIiLCJ1c2VDb250ZXh0MiIsImNyZWF0ZVN0b3JlMiIsIm1vdmVBcnJheUl0ZW0iLCJhcnJheSIsImZyb21JbmRleCIsInRvSW5kZXgiLCJuZXdBcnJheSIsInNwbGljZSIsIkNvbnRleHQyIiwiU29ydGFibGVQcm92aWRlciIsImRuZFN0YXRlIiwiaW5pdGlhbElkcyIsInNvcnRlZElkcyIsImlzVmFsaWRJbmRleCIsImluZGV4IiwiaWRzIiwiaW5kZXhPZiIsInJlc29ydGVkIiwidXNlU29ydGFibGVDb250ZXh0IiwiY3JlYXRlRWZmZWN0NSIsIm9uQ2xlYW51cDQiLCJvbk1vdW50NCIsImNvbWJpbmVSZWZzIiwic2V0UmVmQSIsInNldFJlZkIiLCJjcmVhdGVTb3J0YWJsZSIsInNvcnRhYmxlU3RhdGUiLCJpbml0aWFsSW5kZXgiLCJjdXJyZW50SW5kZXgiLCJsYXlvdXRCeUlkIiwiaWQyIiwic29ydGVkVHJhbnNmb3JtIiwicmVzb2x2ZWRJbml0aWFsSW5kZXgiLCJyZXNvbHZlZEN1cnJlbnRJbmRleCIsInRhcmdldExheW91dCIsInRyYW5zZm9ybTIiLCJzb3J0YWJsZSIsIkZvciIsIm1lcmdlUHJvcHMyIiwib25DbGVhbnVwNSIsIm9uTW91bnQ1IiwiU2hvdzIiLCJQb3J0YWwyIiwiSGlnaGxpZ2h0ZXIiLCJjb2xvciIsIl9lbCQyIiwiXyRwIiwib3V0bGluZSIsImRpc3BsYXkiLCJEcmFnRHJvcERlYnVnZ2VyIiwidGlja2luZyIsInVwZGF0ZSIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImVhY2giLCJrZXllZCJdLCJzb3VyY2VzIjpbImRldi5qc3giXSwic291cmNlc0NvbnRlbnQiOlsiLy8gc3JjL2RyYWctZHJvcC1jb250ZXh0LnRzeFxuaW1wb3J0IHtcbiAgYmF0Y2gsXG4gIGNyZWF0ZUNvbnRleHQsXG4gIGNyZWF0ZUVmZmVjdCxcbiAgbWVyZ2VQcm9wcyxcbiAgdW50cmFjayxcbiAgdXNlQ29udGV4dFxufSBmcm9tIFwic29saWQtanNcIjtcbmltcG9ydCB7IGNyZWF0ZVN0b3JlIH0gZnJvbSBcInNvbGlkLWpzL3N0b3JlXCI7XG5cbi8vIHNyYy9sYXlvdXQudHNcbnZhciBMYXlvdXQgPSBjbGFzcyB7XG4gIHg7XG4gIHk7XG4gIHdpZHRoO1xuICBoZWlnaHQ7XG4gIGNvbnN0cnVjdG9yKHJlY3QpIHtcbiAgICB0aGlzLnggPSBNYXRoLmZsb29yKHJlY3QueCk7XG4gICAgdGhpcy55ID0gTWF0aC5mbG9vcihyZWN0LnkpO1xuICAgIHRoaXMud2lkdGggPSBNYXRoLmZsb29yKHJlY3Qud2lkdGgpO1xuICAgIHRoaXMuaGVpZ2h0ID0gTWF0aC5mbG9vcihyZWN0LmhlaWdodCk7XG4gIH1cbiAgZ2V0IHJlY3QoKSB7XG4gICAgcmV0dXJuIHsgeDogdGhpcy54LCB5OiB0aGlzLnksIHdpZHRoOiB0aGlzLndpZHRoLCBoZWlnaHQ6IHRoaXMuaGVpZ2h0IH07XG4gIH1cbiAgZ2V0IGxlZnQoKSB7XG4gICAgcmV0dXJuIHRoaXMueDtcbiAgfVxuICBnZXQgdG9wKCkge1xuICAgIHJldHVybiB0aGlzLnk7XG4gIH1cbiAgZ2V0IHJpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLnggKyB0aGlzLndpZHRoO1xuICB9XG4gIGdldCBib3R0b20oKSB7XG4gICAgcmV0dXJuIHRoaXMueSArIHRoaXMuaGVpZ2h0O1xuICB9XG4gIGdldCBjZW50ZXIoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IHRoaXMueCArIHRoaXMud2lkdGggKiAwLjUsXG4gICAgICB5OiB0aGlzLnkgKyB0aGlzLmhlaWdodCAqIDAuNVxuICAgIH07XG4gIH1cbiAgZ2V0IGNvcm5lcnMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRvcExlZnQ6IHsgeDogdGhpcy5sZWZ0LCB5OiB0aGlzLnRvcCB9LFxuICAgICAgdG9wUmlnaHQ6IHsgeDogdGhpcy5yaWdodCwgeTogdGhpcy50b3AgfSxcbiAgICAgIGJvdHRvbVJpZ2h0OiB7IHg6IHRoaXMubGVmdCwgeTogdGhpcy5ib3R0b20gfSxcbiAgICAgIGJvdHRvbUxlZnQ6IHsgeDogdGhpcy5yaWdodCwgeTogdGhpcy5ib3R0b20gfVxuICAgIH07XG4gIH1cbn07XG52YXIgZWxlbWVudExheW91dCA9IChlbGVtZW50KSA9PiB7XG4gIGxldCBsYXlvdXQgPSBuZXcgTGF5b3V0KGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpO1xuICBjb25zdCB7IHRyYW5zZm9ybSB9ID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbiAgaWYgKHRyYW5zZm9ybSkge1xuICAgIGxheW91dCA9IHN0cmlwVHJhbnNmb3JtRnJvbUxheW91dChsYXlvdXQsIHRyYW5zZm9ybSk7XG4gIH1cbiAgcmV0dXJuIGxheW91dDtcbn07XG52YXIgc3RyaXBUcmFuc2Zvcm1Gcm9tTGF5b3V0ID0gKGxheW91dCwgdHJhbnNmb3JtKSA9PiB7XG4gIGxldCB0cmFuc2xhdGVYLCB0cmFuc2xhdGVZO1xuICBpZiAodHJhbnNmb3JtLnN0YXJ0c1dpdGgoXCJtYXRyaXgzZChcIikpIHtcbiAgICBjb25zdCBtYXRyaXggPSB0cmFuc2Zvcm0uc2xpY2UoOSwgLTEpLnNwbGl0KC8sIC8pO1xuICAgIHRyYW5zbGF0ZVggPSArbWF0cml4WzEyXTtcbiAgICB0cmFuc2xhdGVZID0gK21hdHJpeFsxM107XG4gIH0gZWxzZSBpZiAodHJhbnNmb3JtLnN0YXJ0c1dpdGgoXCJtYXRyaXgoXCIpKSB7XG4gICAgY29uc3QgbWF0cml4ID0gdHJhbnNmb3JtLnNsaWNlKDcsIC0xKS5zcGxpdCgvLCAvKTtcbiAgICB0cmFuc2xhdGVYID0gK21hdHJpeFs0XTtcbiAgICB0cmFuc2xhdGVZID0gK21hdHJpeFs1XTtcbiAgfSBlbHNlIHtcbiAgICB0cmFuc2xhdGVYID0gMDtcbiAgICB0cmFuc2xhdGVZID0gMDtcbiAgfVxuICByZXR1cm4gbmV3IExheW91dCh7XG4gICAgLi4ubGF5b3V0LFxuICAgIHg6IGxheW91dC54IC0gdHJhbnNsYXRlWCxcbiAgICB5OiBsYXlvdXQueSAtIHRyYW5zbGF0ZVlcbiAgfSk7XG59O1xudmFyIG5vb3BUcmFuc2Zvcm0gPSAoKSA9PiAoeyB4OiAwLCB5OiAwIH0pO1xudmFyIHRyYW5zZm9ybXNBcmVFcXVhbCA9IChmaXJzdFRyYW5zZm9ybSwgc2Vjb25kVHJhbnNmb3JtKSA9PiB7XG4gIHJldHVybiBmaXJzdFRyYW5zZm9ybS54ID09PSBzZWNvbmRUcmFuc2Zvcm0ueCAmJiBmaXJzdFRyYW5zZm9ybS55ID09PSBzZWNvbmRUcmFuc2Zvcm0ueTtcbn07XG52YXIgdHJhbnNmb3JtTGF5b3V0ID0gKGxheW91dCwgdHJhbnNmb3JtKSA9PiB7XG4gIHJldHVybiBuZXcgTGF5b3V0KHtcbiAgICAuLi5sYXlvdXQsXG4gICAgeDogbGF5b3V0LnggKyB0cmFuc2Zvcm0ueCxcbiAgICB5OiBsYXlvdXQueSArIHRyYW5zZm9ybS55XG4gIH0pO1xufTtcbnZhciBkaXN0YW5jZUJldHdlZW5Qb2ludHMgPSAoZmlyc3RQb2ludCwgc2Vjb25kUG9pbnQpID0+IHtcbiAgcmV0dXJuIE1hdGguc3FydChcbiAgICBNYXRoLnBvdyhmaXJzdFBvaW50LnggLSBzZWNvbmRQb2ludC54LCAyKSArIE1hdGgucG93KGZpcnN0UG9pbnQueSAtIHNlY29uZFBvaW50LnksIDIpXG4gICk7XG59O1xudmFyIGludGVyc2VjdGlvblJhdGlvT2ZMYXlvdXRzID0gKGZpcnN0TGF5b3V0LCBzZWNvbmRMYXlvdXQpID0+IHtcbiAgY29uc3QgdG9wID0gTWF0aC5tYXgoZmlyc3RMYXlvdXQudG9wLCBzZWNvbmRMYXlvdXQudG9wKTtcbiAgY29uc3QgbGVmdCA9IE1hdGgubWF4KGZpcnN0TGF5b3V0LmxlZnQsIHNlY29uZExheW91dC5sZWZ0KTtcbiAgY29uc3QgcmlnaHQgPSBNYXRoLm1pbihmaXJzdExheW91dC5yaWdodCwgc2Vjb25kTGF5b3V0LnJpZ2h0KTtcbiAgY29uc3QgYm90dG9tID0gTWF0aC5taW4oZmlyc3RMYXlvdXQuYm90dG9tLCBzZWNvbmRMYXlvdXQuYm90dG9tKTtcbiAgY29uc3Qgd2lkdGggPSByaWdodCAtIGxlZnQ7XG4gIGNvbnN0IGhlaWdodCA9IGJvdHRvbSAtIHRvcDtcbiAgaWYgKGxlZnQgPCByaWdodCAmJiB0b3AgPCBib3R0b20pIHtcbiAgICBjb25zdCBsYXlvdXQxQXJlYSA9IGZpcnN0TGF5b3V0LndpZHRoICogZmlyc3RMYXlvdXQuaGVpZ2h0O1xuICAgIGNvbnN0IGxheW91dDJBcmVhID0gc2Vjb25kTGF5b3V0LndpZHRoICogc2Vjb25kTGF5b3V0LmhlaWdodDtcbiAgICBjb25zdCBpbnRlcnNlY3Rpb25BcmVhID0gd2lkdGggKiBoZWlnaHQ7XG4gICAgcmV0dXJuIGludGVyc2VjdGlvbkFyZWEgLyAobGF5b3V0MUFyZWEgKyBsYXlvdXQyQXJlYSAtIGludGVyc2VjdGlvbkFyZWEpO1xuICB9XG4gIHJldHVybiAwO1xufTtcbnZhciBsYXlvdXRzQXJlRXF1YWwgPSAoZmlyc3RMYXlvdXQsIHNlY29uZExheW91dCkgPT4ge1xuICByZXR1cm4gZmlyc3RMYXlvdXQueCA9PT0gc2Vjb25kTGF5b3V0LnggJiYgZmlyc3RMYXlvdXQueSA9PT0gc2Vjb25kTGF5b3V0LnkgJiYgZmlyc3RMYXlvdXQud2lkdGggPT09IHNlY29uZExheW91dC53aWR0aCAmJiBmaXJzdExheW91dC5oZWlnaHQgPT09IHNlY29uZExheW91dC5oZWlnaHQ7XG59O1xuXG4vLyBzcmMvY29sbGlzaW9uLnRzXG52YXIgY2xvc2VzdENlbnRlciA9IChkcmFnZ2FibGUsIGRyb3BwYWJsZXMsIGNvbnRleHQpID0+IHtcbiAgY29uc3QgcG9pbnQxID0gZHJhZ2dhYmxlLnRyYW5zZm9ybWVkLmNlbnRlcjtcbiAgY29uc3QgY29sbGlzaW9uID0geyBkaXN0YW5jZTogSW5maW5pdHksIGRyb3BwYWJsZTogbnVsbCB9O1xuICBmb3IgKGNvbnN0IGRyb3BwYWJsZSBvZiBkcm9wcGFibGVzKSB7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludHMocG9pbnQxLCBkcm9wcGFibGUubGF5b3V0LmNlbnRlcik7XG4gICAgaWYgKGRpc3RhbmNlIDwgY29sbGlzaW9uLmRpc3RhbmNlKSB7XG4gICAgICBjb2xsaXNpb24uZGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgIGNvbGxpc2lvbi5kcm9wcGFibGUgPSBkcm9wcGFibGU7XG4gICAgfSBlbHNlIGlmIChkaXN0YW5jZSA9PT0gY29sbGlzaW9uLmRpc3RhbmNlICYmIGRyb3BwYWJsZS5pZCA9PT0gY29udGV4dC5hY3RpdmVEcm9wcGFibGVJZCkge1xuICAgICAgY29sbGlzaW9uLmRyb3BwYWJsZSA9IGRyb3BwYWJsZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbGxpc2lvbi5kcm9wcGFibGU7XG59O1xudmFyIGNsb3Nlc3RDb3JuZXJzID0gKGRyYWdnYWJsZSwgZHJvcHBhYmxlcywgY29udGV4dCkgPT4ge1xuICBjb25zdCBkcmFnZ2FibGVDb3JuZXJzID0gZHJhZ2dhYmxlLnRyYW5zZm9ybWVkLmNvcm5lcnM7XG4gIGNvbnN0IGNvbGxpc2lvbiA9IHsgZGlzdGFuY2U6IEluZmluaXR5LCBkcm9wcGFibGU6IG51bGwgfTtcbiAgZm9yIChjb25zdCBkcm9wcGFibGUgb2YgZHJvcHBhYmxlcykge1xuICAgIGNvbnN0IGRyb3BwYWJsZUNvcm5lcnMgPSBkcm9wcGFibGUubGF5b3V0LmNvcm5lcnM7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZUJldHdlZW5Qb2ludHMoXG4gICAgICBkcm9wcGFibGVDb3JuZXJzLnRvcExlZnQsXG4gICAgICBkcmFnZ2FibGVDb3JuZXJzLnRvcExlZnRcbiAgICApICsgZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKFxuICAgICAgZHJvcHBhYmxlQ29ybmVycy50b3BSaWdodCxcbiAgICAgIGRyYWdnYWJsZUNvcm5lcnMudG9wUmlnaHRcbiAgICApICsgZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKFxuICAgICAgZHJvcHBhYmxlQ29ybmVycy5ib3R0b21SaWdodCxcbiAgICAgIGRyYWdnYWJsZUNvcm5lcnMuYm90dG9tUmlnaHRcbiAgICApICsgZGlzdGFuY2VCZXR3ZWVuUG9pbnRzKFxuICAgICAgZHJvcHBhYmxlQ29ybmVycy5ib3R0b21MZWZ0LFxuICAgICAgZHJhZ2dhYmxlQ29ybmVycy5ib3R0b21MZWZ0XG4gICAgKTtcbiAgICBpZiAoZGlzdGFuY2UgPCBjb2xsaXNpb24uZGlzdGFuY2UpIHtcbiAgICAgIGNvbGxpc2lvbi5kaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgY29sbGlzaW9uLmRyb3BwYWJsZSA9IGRyb3BwYWJsZTtcbiAgICB9IGVsc2UgaWYgKGRpc3RhbmNlID09PSBjb2xsaXNpb24uZGlzdGFuY2UgJiYgZHJvcHBhYmxlLmlkID09PSBjb250ZXh0LmFjdGl2ZURyb3BwYWJsZUlkKSB7XG4gICAgICBjb2xsaXNpb24uZHJvcHBhYmxlID0gZHJvcHBhYmxlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29sbGlzaW9uLmRyb3BwYWJsZTtcbn07XG52YXIgbW9zdEludGVyc2VjdGluZyA9IChkcmFnZ2FibGUsIGRyb3BwYWJsZXMsIGNvbnRleHQpID0+IHtcbiAgY29uc3QgZHJhZ2dhYmxlTGF5b3V0ID0gZHJhZ2dhYmxlLnRyYW5zZm9ybWVkO1xuICBjb25zdCBjb2xsaXNpb24gPSB7IHJhdGlvOiAwLCBkcm9wcGFibGU6IG51bGwgfTtcbiAgZm9yIChjb25zdCBkcm9wcGFibGUgb2YgZHJvcHBhYmxlcykge1xuICAgIGNvbnN0IHJhdGlvID0gaW50ZXJzZWN0aW9uUmF0aW9PZkxheW91dHMoZHJhZ2dhYmxlTGF5b3V0LCBkcm9wcGFibGUubGF5b3V0KTtcbiAgICBpZiAocmF0aW8gPiBjb2xsaXNpb24ucmF0aW8pIHtcbiAgICAgIGNvbGxpc2lvbi5yYXRpbyA9IHJhdGlvO1xuICAgICAgY29sbGlzaW9uLmRyb3BwYWJsZSA9IGRyb3BwYWJsZTtcbiAgICB9IGVsc2UgaWYgKHJhdGlvID4gMCAmJiByYXRpbyA9PT0gY29sbGlzaW9uLnJhdGlvICYmIGRyb3BwYWJsZS5pZCA9PT0gY29udGV4dC5hY3RpdmVEcm9wcGFibGVJZCkge1xuICAgICAgY29sbGlzaW9uLmRyb3BwYWJsZSA9IGRyb3BwYWJsZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbGxpc2lvbi5kcm9wcGFibGU7XG59O1xuXG4vLyBzcmMvZHJhZy1kcm9wLWNvbnRleHQudHN4XG52YXIgQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoKTtcbnZhciBEcmFnRHJvcFByb3ZpZGVyID0gKHBhc3NlZFByb3BzKSA9PiB7XG4gIGNvbnN0IHByb3BzID0gbWVyZ2VQcm9wcyhcbiAgICB7IGNvbGxpc2lvbkRldGVjdG9yOiBtb3N0SW50ZXJzZWN0aW5nIH0sXG4gICAgcGFzc2VkUHJvcHNcbiAgKTtcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSBjcmVhdGVTdG9yZSh7XG4gICAgZHJhZ2dhYmxlczoge30sXG4gICAgZHJvcHBhYmxlczoge30sXG4gICAgc2Vuc29yczoge30sXG4gICAgYWN0aXZlOiB7XG4gICAgICBkcmFnZ2FibGVJZDogbnVsbCxcbiAgICAgIGdldCBkcmFnZ2FibGUoKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlSWQgIT09IG51bGwgPyBzdGF0ZS5kcmFnZ2FibGVzW3N0YXRlLmFjdGl2ZS5kcmFnZ2FibGVJZF0gOiBudWxsO1xuICAgICAgfSxcbiAgICAgIGRyb3BwYWJsZUlkOiBudWxsLFxuICAgICAgZ2V0IGRyb3BwYWJsZSgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlLmFjdGl2ZS5kcm9wcGFibGVJZCAhPT0gbnVsbCA/IHN0YXRlLmRyb3BwYWJsZXNbc3RhdGUuYWN0aXZlLmRyb3BwYWJsZUlkXSA6IG51bGw7XG4gICAgICB9LFxuICAgICAgc2Vuc29ySWQ6IG51bGwsXG4gICAgICBnZXQgc2Vuc29yKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUuYWN0aXZlLnNlbnNvcklkICE9PSBudWxsID8gc3RhdGUuc2Vuc29yc1tzdGF0ZS5hY3RpdmUuc2Vuc29ySWRdIDogbnVsbDtcbiAgICAgIH0sXG4gICAgICBvdmVybGF5OiBudWxsXG4gICAgfVxuICB9KTtcbiAgY29uc3QgYWRkVHJhbnNmb3JtZXIgPSAodHlwZSwgaWQsIHRyYW5zZm9ybWVyKSA9PiB7XG4gICAgY29uc3QgZGlzcGxheVR5cGUgPSB0eXBlLnN1YnN0cmluZygwLCB0eXBlLmxlbmd0aCAtIDEpO1xuICAgIGlmICghdW50cmFjaygoKSA9PiBzdGF0ZVt0eXBlXVtpZF0pKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBDYW5ub3QgYWRkIHRyYW5zZm9ybWVyIHRvIG5vbmV4aXN0ZW50ICR7ZGlzcGxheVR5cGV9IHdpdGggaWQ6ICR7aWR9YFxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0U3RhdGUodHlwZSwgaWQsIFwidHJhbnNmb3JtZXJzXCIsIHRyYW5zZm9ybWVyLmlkLCB0cmFuc2Zvcm1lcik7XG4gIH07XG4gIGNvbnN0IHJlbW92ZVRyYW5zZm9ybWVyID0gKHR5cGUsIGlkLCB0cmFuc2Zvcm1lcklkKSA9PiB7XG4gICAgY29uc3QgZGlzcGxheVR5cGUgPSB0eXBlLnN1YnN0cmluZygwLCB0eXBlLmxlbmd0aCAtIDEpO1xuICAgIGlmICghdW50cmFjaygoKSA9PiBzdGF0ZVt0eXBlXVtpZF0pKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBDYW5ub3QgcmVtb3ZlIHRyYW5zZm9ybWVyIGZyb20gbm9uZXhpc3RlbnQgJHtkaXNwbGF5VHlwZX0gd2l0aCBpZDogJHtpZH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXVudHJhY2soKCkgPT4gc3RhdGVbdHlwZV1baWRdW1widHJhbnNmb3JtZXJzXCJdW3RyYW5zZm9ybWVySWRdKSkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgQ2Fubm90IHJlbW92ZSBmcm9tICR7ZGlzcGxheVR5cGV9IHdpdGggaWQgJHtpZH0sIG5vbmV4aXN0ZW50IHRyYW5zZm9ybWVyIHdpdGggaWQ6ICR7dHJhbnNmb3JtZXJJZH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRTdGF0ZSh0eXBlLCBpZCwgXCJ0cmFuc2Zvcm1lcnNcIiwgdHJhbnNmb3JtZXJJZCwgdm9pZCAwKTtcbiAgfTtcbiAgY29uc3QgYWRkRHJhZ2dhYmxlID0gKHtcbiAgICBpZCxcbiAgICBub2RlLFxuICAgIGxheW91dCxcbiAgICBkYXRhXG4gIH0pID0+IHtcbiAgICBjb25zdCBleGlzdGluZ0RyYWdnYWJsZSA9IHN0YXRlLmRyYWdnYWJsZXNbaWRdO1xuICAgIGNvbnN0IGRyYWdnYWJsZSA9IHtcbiAgICAgIGlkLFxuICAgICAgbm9kZSxcbiAgICAgIGxheW91dCxcbiAgICAgIGRhdGEsXG4gICAgICBfcGVuZGluZ0NsZWFudXA6IGZhbHNlXG4gICAgfTtcbiAgICBsZXQgdHJhbnNmb3JtZXI7XG4gICAgaWYgKCFleGlzdGluZ0RyYWdnYWJsZSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZHJhZ2dhYmxlLCB7XG4gICAgICAgIHRyYW5zZm9ybWVyczoge1xuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgICAgICAgIHZhbHVlOiB7fVxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChzdGF0ZS5hY3RpdmUub3ZlcmxheSkge1xuICAgICAgICAgICAgICByZXR1cm4gbm9vcFRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZXJzID0gT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgICAgICAgc3RhdGUuZHJhZ2dhYmxlc1tpZF0udHJhbnNmb3JtZXJzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdHJhbnNmb3JtZXJzLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKTtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lcnMucmVkdWNlKFxuICAgICAgICAgICAgICAodHJhbnNmb3JtLCB0cmFuc2Zvcm1lcjIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIyLmNhbGxiYWNrKHRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG5vb3BUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybWVkOiB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtTGF5b3V0KFxuICAgICAgICAgICAgICBzdGF0ZS5kcmFnZ2FibGVzW2lkXS5sYXlvdXQsXG4gICAgICAgICAgICAgIHN0YXRlLmRyYWdnYWJsZXNbaWRdLnRyYW5zZm9ybVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuYWN0aXZlLmRyYWdnYWJsZUlkID09PSBpZCAmJiAhc3RhdGUuYWN0aXZlLm92ZXJsYXkpIHtcbiAgICAgIGNvbnN0IGxheW91dERlbHRhID0ge1xuICAgICAgICB4OiBleGlzdGluZ0RyYWdnYWJsZS5sYXlvdXQueCAtIGxheW91dC54LFxuICAgICAgICB5OiBleGlzdGluZ0RyYWdnYWJsZS5sYXlvdXQueSAtIGxheW91dC55XG4gICAgICB9O1xuICAgICAgY29uc3QgdHJhbnNmb3JtZXJJZCA9IFwiYWRkRHJhZ2dhYmxlLWV4aXN0aW5nLW9mZnNldFwiO1xuICAgICAgY29uc3QgZXhpc3RpbmdUcmFuc2Zvcm1lciA9IGV4aXN0aW5nRHJhZ2dhYmxlLnRyYW5zZm9ybWVyc1t0cmFuc2Zvcm1lcklkXTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybU9mZnNldCA9IGV4aXN0aW5nVHJhbnNmb3JtZXIgPyBleGlzdGluZ1RyYW5zZm9ybWVyLmNhbGxiYWNrKGxheW91dERlbHRhKSA6IGxheW91dERlbHRhO1xuICAgICAgdHJhbnNmb3JtZXIgPSB7XG4gICAgICAgIGlkOiB0cmFuc2Zvcm1lcklkLFxuICAgICAgICBvcmRlcjogMTAwLFxuICAgICAgICBjYWxsYmFjazogKHRyYW5zZm9ybSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiB0cmFuc2Zvcm0ueCArIHRyYW5zZm9ybU9mZnNldC54LFxuICAgICAgICAgICAgeTogdHJhbnNmb3JtLnkgKyB0cmFuc2Zvcm1PZmZzZXQueVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBvbkRyYWdFbmQoKCkgPT4gcmVtb3ZlVHJhbnNmb3JtZXIoXCJkcmFnZ2FibGVzXCIsIGlkLCB0cmFuc2Zvcm1lcklkKSk7XG4gICAgfVxuICAgIGJhdGNoKCgpID0+IHtcbiAgICAgIHNldFN0YXRlKFwiZHJhZ2dhYmxlc1wiLCBpZCwgZHJhZ2dhYmxlKTtcbiAgICAgIGlmICh0cmFuc2Zvcm1lcikge1xuICAgICAgICBhZGRUcmFuc2Zvcm1lcihcImRyYWdnYWJsZXNcIiwgaWQsIHRyYW5zZm9ybWVyKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoc3RhdGUuYWN0aXZlLmRyYWdnYWJsZSkge1xuICAgICAgcmVjb21wdXRlTGF5b3V0cygpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgcmVtb3ZlRHJhZ2dhYmxlID0gKGlkKSA9PiB7XG4gICAgaWYgKCF1bnRyYWNrKCgpID0+IHN0YXRlLmRyYWdnYWJsZXNbaWRdKSkge1xuICAgICAgY29uc29sZS53YXJuKGBDYW5ub3QgcmVtb3ZlIG5vbmV4aXN0ZW50IGRyYWdnYWJsZSB3aXRoIGlkOiAke2lkfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBzZXRTdGF0ZShcImRyYWdnYWJsZXNcIiwgaWQsIFwiX3BlbmRpbmdDbGVhbnVwXCIsIHRydWUpO1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IGNsZWFudXBEcmFnZ2FibGUoaWQpKTtcbiAgfTtcbiAgY29uc3QgY2xlYW51cERyYWdnYWJsZSA9IChpZCkgPT4ge1xuICAgIGlmIChzdGF0ZS5kcmFnZ2FibGVzW2lkXT8uX3BlbmRpbmdDbGVhbnVwKSB7XG4gICAgICBjb25zdCBjbGVhbnVwQWN0aXZlID0gc3RhdGUuYWN0aXZlLmRyYWdnYWJsZUlkID09PSBpZDtcbiAgICAgIGJhdGNoKCgpID0+IHtcbiAgICAgICAgaWYgKGNsZWFudXBBY3RpdmUpIHtcbiAgICAgICAgICBzZXRTdGF0ZShcImFjdGl2ZVwiLCBcImRyYWdnYWJsZUlkXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIHNldFN0YXRlKFwiZHJhZ2dhYmxlc1wiLCBpZCwgdm9pZCAwKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgYWRkRHJvcHBhYmxlID0gKHtcbiAgICBpZCxcbiAgICBub2RlLFxuICAgIGxheW91dCxcbiAgICBkYXRhXG4gIH0pID0+IHtcbiAgICBjb25zdCBleGlzdGluZ0Ryb3BwYWJsZSA9IHN0YXRlLmRyb3BwYWJsZXNbaWRdO1xuICAgIGNvbnN0IGRyb3BwYWJsZSA9IHtcbiAgICAgIGlkLFxuICAgICAgbm9kZSxcbiAgICAgIGxheW91dCxcbiAgICAgIGRhdGEsXG4gICAgICBfcGVuZGluZ0NsZWFudXA6IGZhbHNlXG4gICAgfTtcbiAgICBpZiAoIWV4aXN0aW5nRHJvcHBhYmxlKSB7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhkcm9wcGFibGUsIHtcbiAgICAgICAgdHJhbnNmb3JtZXJzOiB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgICAgdmFsdWU6IHt9XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybToge1xuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZXJzID0gT2JqZWN0LnZhbHVlcyhcbiAgICAgICAgICAgICAgc3RhdGUuZHJvcHBhYmxlc1tpZF0udHJhbnNmb3JtZXJzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdHJhbnNmb3JtZXJzLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKTtcbiAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lcnMucmVkdWNlKFxuICAgICAgICAgICAgICAodHJhbnNmb3JtLCB0cmFuc2Zvcm1lcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1lci5jYWxsYmFjayh0cmFuc2Zvcm0pO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBub29wVHJhbnNmb3JtKClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm1lZDoge1xuICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldDogKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybUxheW91dChcbiAgICAgICAgICAgICAgc3RhdGUuZHJvcHBhYmxlc1tpZF0ubGF5b3V0LFxuICAgICAgICAgICAgICBzdGF0ZS5kcm9wcGFibGVzW2lkXS50cmFuc2Zvcm1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgc2V0U3RhdGUoXCJkcm9wcGFibGVzXCIsIGlkLCBkcm9wcGFibGUpO1xuICAgIGlmIChzdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlKSB7XG4gICAgICByZWNvbXB1dGVMYXlvdXRzKCk7XG4gICAgfVxuICB9O1xuICBjb25zdCByZW1vdmVEcm9wcGFibGUgPSAoaWQpID0+IHtcbiAgICBpZiAoIXVudHJhY2soKCkgPT4gc3RhdGUuZHJvcHBhYmxlc1tpZF0pKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbm5vdCByZW1vdmUgbm9uZXhpc3RlbnQgZHJvcHBhYmxlIHdpdGggaWQ6ICR7aWR9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHNldFN0YXRlKFwiZHJvcHBhYmxlc1wiLCBpZCwgXCJfcGVuZGluZ0NsZWFudXBcIiwgdHJ1ZSk7XG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gY2xlYW51cERyb3BwYWJsZShpZCkpO1xuICB9O1xuICBjb25zdCBjbGVhbnVwRHJvcHBhYmxlID0gKGlkKSA9PiB7XG4gICAgaWYgKHN0YXRlLmRyb3BwYWJsZXNbaWRdPy5fcGVuZGluZ0NsZWFudXApIHtcbiAgICAgIGNvbnN0IGNsZWFudXBBY3RpdmUgPSBzdGF0ZS5hY3RpdmUuZHJvcHBhYmxlSWQgPT09IGlkO1xuICAgICAgYmF0Y2goKCkgPT4ge1xuICAgICAgICBpZiAoY2xlYW51cEFjdGl2ZSkge1xuICAgICAgICAgIHNldFN0YXRlKFwiYWN0aXZlXCIsIFwiZHJvcHBhYmxlSWRcIiwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0U3RhdGUoXCJkcm9wcGFibGVzXCIsIGlkLCB2b2lkIDApO1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBhZGRTZW5zb3IgPSAoeyBpZCwgYWN0aXZhdG9ycyB9KSA9PiB7XG4gICAgc2V0U3RhdGUoXCJzZW5zb3JzXCIsIGlkLCB7XG4gICAgICBpZCxcbiAgICAgIGFjdGl2YXRvcnMsXG4gICAgICBjb29yZGluYXRlczoge1xuICAgICAgICBvcmlnaW46IHsgeDogMCwgeTogMCB9LFxuICAgICAgICBjdXJyZW50OiB7IHg6IDAsIHk6IDAgfSxcbiAgICAgICAgZ2V0IGRlbHRhKCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB4OiBzdGF0ZS5zZW5zb3JzW2lkXS5jb29yZGluYXRlcy5jdXJyZW50LnggLSBzdGF0ZS5zZW5zb3JzW2lkXS5jb29yZGluYXRlcy5vcmlnaW4ueCxcbiAgICAgICAgICAgIHk6IHN0YXRlLnNlbnNvcnNbaWRdLmNvb3JkaW5hdGVzLmN1cnJlbnQueSAtIHN0YXRlLnNlbnNvcnNbaWRdLmNvb3JkaW5hdGVzLm9yaWdpbi55XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBjb25zdCByZW1vdmVTZW5zb3IgPSAoaWQpID0+IHtcbiAgICBpZiAoIXVudHJhY2soKCkgPT4gc3RhdGUuc2Vuc29yc1tpZF0pKSB7XG4gICAgICBjb25zb2xlLndhcm4oYENhbm5vdCByZW1vdmUgbm9uZXhpc3RlbnQgc2Vuc29yIHdpdGggaWQ6ICR7aWR9YCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNsZWFudXBBY3RpdmUgPSBzdGF0ZS5hY3RpdmUuc2Vuc29ySWQgPT09IGlkO1xuICAgIGJhdGNoKCgpID0+IHtcbiAgICAgIGlmIChjbGVhbnVwQWN0aXZlKSB7XG4gICAgICAgIHNldFN0YXRlKFwiYWN0aXZlXCIsIFwic2Vuc29ySWRcIiwgbnVsbCk7XG4gICAgICB9XG4gICAgICBzZXRTdGF0ZShcInNlbnNvcnNcIiwgaWQsIHZvaWQgMCk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHNldE92ZXJsYXkgPSAoeyBub2RlLCBsYXlvdXQgfSkgPT4ge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gc3RhdGUuYWN0aXZlLm92ZXJsYXk7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHtcbiAgICAgIG5vZGUsXG4gICAgICBsYXlvdXRcbiAgICB9O1xuICAgIGlmICghZXhpc3RpbmcpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKG92ZXJsYXksIHtcbiAgICAgICAgaWQ6IHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6ICgpID0+IHN0YXRlLmFjdGl2ZS5kcmFnZ2FibGU/LmlkXG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6IHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6ICgpID0+IHN0YXRlLmFjdGl2ZS5kcmFnZ2FibGU/LmRhdGFcbiAgICAgICAgfSxcbiAgICAgICAgdHJhbnNmb3JtZXJzOiB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiAoKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhcbiAgICAgICAgICAgICAgc3RhdGUuYWN0aXZlLmRyYWdnYWJsZSA/IHN0YXRlLmFjdGl2ZS5kcmFnZ2FibGUudHJhbnNmb3JtZXJzIDoge31cbiAgICAgICAgICAgICkuZmlsdGVyKChbaWRdKSA9PiBpZCAhPT0gXCJhZGREcmFnZ2FibGUtZXhpc3Rpbmctb2Zmc2V0XCIpXG4gICAgICAgICAgKVxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVycyA9IE9iamVjdC52YWx1ZXMoXG4gICAgICAgICAgICAgIHN0YXRlLmFjdGl2ZS5vdmVybGF5ID8gc3RhdGUuYWN0aXZlLm92ZXJsYXkudHJhbnNmb3JtZXJzIDogW11cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0cmFuc2Zvcm1lcnMuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xuICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVycy5yZWR1Y2UoXG4gICAgICAgICAgICAgICh0cmFuc2Zvcm0sIHRyYW5zZm9ybWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyLmNhbGxiYWNrKHRyYW5zZm9ybSk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG5vb3BUcmFuc2Zvcm0oKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybWVkOiB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUuYWN0aXZlLm92ZXJsYXkgPyB0cmFuc2Zvcm1MYXlvdXQoXG4gICAgICAgICAgICAgIHN0YXRlLmFjdGl2ZS5vdmVybGF5LmxheW91dCxcbiAgICAgICAgICAgICAgc3RhdGUuYWN0aXZlLm92ZXJsYXkudHJhbnNmb3JtXG4gICAgICAgICAgICApIDogbmV3IExheW91dCh7IHg6IDAsIHk6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgc2V0U3RhdGUoXCJhY3RpdmVcIiwgXCJvdmVybGF5XCIsIG92ZXJsYXkpO1xuICB9O1xuICBjb25zdCBjbGVhck92ZXJsYXkgPSAoKSA9PiBzZXRTdGF0ZShcImFjdGl2ZVwiLCBcIm92ZXJsYXlcIiwgbnVsbCk7XG4gIGNvbnN0IHNlbnNvclN0YXJ0ID0gKGlkLCBjb29yZGluYXRlcykgPT4ge1xuICAgIGJhdGNoKCgpID0+IHtcbiAgICAgIHNldFN0YXRlKFwic2Vuc29yc1wiLCBpZCwgXCJjb29yZGluYXRlc1wiLCB7XG4gICAgICAgIG9yaWdpbjogeyAuLi5jb29yZGluYXRlcyB9LFxuICAgICAgICBjdXJyZW50OiB7IC4uLmNvb3JkaW5hdGVzIH1cbiAgICAgIH0pO1xuICAgICAgc2V0U3RhdGUoXCJhY3RpdmVcIiwgXCJzZW5zb3JJZFwiLCBpZCk7XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHNlbnNvck1vdmUgPSAoY29vcmRpbmF0ZXMpID0+IHtcbiAgICBjb25zdCBzZW5zb3JJZCA9IHN0YXRlLmFjdGl2ZS5zZW5zb3JJZDtcbiAgICBpZiAoIXNlbnNvcklkKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJDYW5ub3QgbW92ZSBzZW5zb3Igd2hlbiBubyBzZW5zb3IgYWN0aXZlLlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc2V0U3RhdGUoXCJzZW5zb3JzXCIsIHNlbnNvcklkLCBcImNvb3JkaW5hdGVzXCIsIFwiY3VycmVudFwiLCB7XG4gICAgICAuLi5jb29yZGluYXRlc1xuICAgIH0pO1xuICB9O1xuICBjb25zdCBzZW5zb3JFbmQgPSAoKSA9PiBzZXRTdGF0ZShcImFjdGl2ZVwiLCBcInNlbnNvcklkXCIsIG51bGwpO1xuICBjb25zdCBkcmFnZ2FibGVBY3RpdmF0b3JzID0gKGRyYWdnYWJsZUlkLCBhc0hhbmRsZXJzKSA9PiB7XG4gICAgY29uc3QgZXZlbnRNYXAgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHNlbnNvciBvZiBPYmplY3QudmFsdWVzKHN0YXRlLnNlbnNvcnMpKSB7XG4gICAgICBpZiAoc2Vuc29yKSB7XG4gICAgICAgIGZvciAoY29uc3QgW3R5cGUsIGFjdGl2YXRvcl0gb2YgT2JqZWN0LmVudHJpZXMoc2Vuc29yLmFjdGl2YXRvcnMpKSB7XG4gICAgICAgICAgZXZlbnRNYXBbdHlwZV0gPz89IFtdO1xuICAgICAgICAgIGV2ZW50TWFwW3R5cGVdLnB1c2goe1xuICAgICAgICAgICAgc2Vuc29yLFxuICAgICAgICAgICAgYWN0aXZhdG9yXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGlzdGVuZXJzID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgaW4gZXZlbnRNYXApIHtcbiAgICAgIGxldCBoYW5kbGVyS2V5ID0ga2V5O1xuICAgICAgaWYgKGFzSGFuZGxlcnMpIHtcbiAgICAgICAgaGFuZGxlcktleSA9IGBvbiR7a2V5fWA7XG4gICAgICB9XG4gICAgICBsaXN0ZW5lcnNbaGFuZGxlcktleV0gPSAoZXZlbnQpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IGFjdGl2YXRvciB9IG9mIGV2ZW50TWFwW2tleV0pIHtcbiAgICAgICAgICBpZiAoc3RhdGUuYWN0aXZlLnNlbnNvcikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGFjdGl2YXRvcihldmVudCwgZHJhZ2dhYmxlSWQpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gbGlzdGVuZXJzO1xuICB9O1xuICBjb25zdCByZWNvbXB1dGVMYXlvdXRzID0gKCkgPT4ge1xuICAgIGxldCBhbnlMYXlvdXRDaGFuZ2VkID0gZmFsc2U7XG4gICAgY29uc3QgZHJhZ2dhYmxlcyA9IE9iamVjdC52YWx1ZXMoc3RhdGUuZHJhZ2dhYmxlcyk7XG4gICAgY29uc3QgZHJvcHBhYmxlcyA9IE9iamVjdC52YWx1ZXMoc3RhdGUuZHJvcHBhYmxlcyk7XG4gICAgY29uc3Qgb3ZlcmxheSA9IHN0YXRlLmFjdGl2ZS5vdmVybGF5O1xuICAgIGJhdGNoKCgpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG4gICAgICBmb3IgKGNvbnN0IGRyYWdnYWJsZSBvZiBkcmFnZ2FibGVzKSB7XG4gICAgICAgIGlmIChkcmFnZ2FibGUpIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50TGF5b3V0ID0gZHJhZ2dhYmxlLmxheW91dDtcbiAgICAgICAgICBpZiAoIWNhY2hlLmhhcyhkcmFnZ2FibGUubm9kZSkpXG4gICAgICAgICAgICBjYWNoZS5zZXQoZHJhZ2dhYmxlLm5vZGUsIGVsZW1lbnRMYXlvdXQoZHJhZ2dhYmxlLm5vZGUpKTtcbiAgICAgICAgICBjb25zdCBsYXlvdXQgPSBjYWNoZS5nZXQoZHJhZ2dhYmxlLm5vZGUpO1xuICAgICAgICAgIGlmICghbGF5b3V0c0FyZUVxdWFsKGN1cnJlbnRMYXlvdXQsIGxheW91dCkpIHtcbiAgICAgICAgICAgIHNldFN0YXRlKFwiZHJhZ2dhYmxlc1wiLCBkcmFnZ2FibGUuaWQsIFwibGF5b3V0XCIsIGxheW91dCk7XG4gICAgICAgICAgICBhbnlMYXlvdXRDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZHJvcHBhYmxlIG9mIGRyb3BwYWJsZXMpIHtcbiAgICAgICAgaWYgKGRyb3BwYWJsZSkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRMYXlvdXQgPSBkcm9wcGFibGUubGF5b3V0O1xuICAgICAgICAgIGlmICghY2FjaGUuaGFzKGRyb3BwYWJsZS5ub2RlKSlcbiAgICAgICAgICAgIGNhY2hlLnNldChkcm9wcGFibGUubm9kZSwgZWxlbWVudExheW91dChkcm9wcGFibGUubm9kZSkpO1xuICAgICAgICAgIGNvbnN0IGxheW91dCA9IGNhY2hlLmdldChkcm9wcGFibGUubm9kZSk7XG4gICAgICAgICAgaWYgKCFsYXlvdXRzQXJlRXF1YWwoY3VycmVudExheW91dCwgbGF5b3V0KSkge1xuICAgICAgICAgICAgc2V0U3RhdGUoXCJkcm9wcGFibGVzXCIsIGRyb3BwYWJsZS5pZCwgXCJsYXlvdXRcIiwgbGF5b3V0KTtcbiAgICAgICAgICAgIGFueUxheW91dENoYW5nZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG92ZXJsYXkpIHtcbiAgICAgICAgY29uc3QgY3VycmVudExheW91dCA9IG92ZXJsYXkubGF5b3V0O1xuICAgICAgICBjb25zdCBsYXlvdXQgPSBlbGVtZW50TGF5b3V0KG92ZXJsYXkubm9kZSk7XG4gICAgICAgIGlmICghbGF5b3V0c0FyZUVxdWFsKGN1cnJlbnRMYXlvdXQsIGxheW91dCkpIHtcbiAgICAgICAgICBzZXRTdGF0ZShcImFjdGl2ZVwiLCBcIm92ZXJsYXlcIiwgXCJsYXlvdXRcIiwgbGF5b3V0KTtcbiAgICAgICAgICBhbnlMYXlvdXRDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBhbnlMYXlvdXRDaGFuZ2VkO1xuICB9O1xuICBjb25zdCBkZXRlY3RDb2xsaXNpb25zID0gKCkgPT4ge1xuICAgIGNvbnN0IGRyYWdnYWJsZSA9IHN0YXRlLmFjdGl2ZS5vdmVybGF5ID8/IHN0YXRlLmFjdGl2ZS5kcmFnZ2FibGU7XG4gICAgaWYgKGRyYWdnYWJsZSkge1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gcHJvcHMuY29sbGlzaW9uRGV0ZWN0b3IoXG4gICAgICAgIGRyYWdnYWJsZSxcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhzdGF0ZS5kcm9wcGFibGVzKSxcbiAgICAgICAge1xuICAgICAgICAgIGFjdGl2ZURyb3BwYWJsZUlkOiBzdGF0ZS5hY3RpdmUuZHJvcHBhYmxlSWRcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICAgIGNvbnN0IGRyb3BwYWJsZUlkID0gZHJvcHBhYmxlID8gZHJvcHBhYmxlLmlkIDogbnVsbDtcbiAgICAgIGlmIChzdGF0ZS5hY3RpdmUuZHJvcHBhYmxlSWQgIT09IGRyb3BwYWJsZUlkKSB7XG4gICAgICAgIHNldFN0YXRlKFwiYWN0aXZlXCIsIFwiZHJvcHBhYmxlSWRcIiwgZHJvcHBhYmxlSWQpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgZHJhZ1N0YXJ0ID0gKGRyYWdnYWJsZUlkKSA9PiB7XG4gICAgY29uc3QgdHJhbnNmb3JtZXIgPSB7XG4gICAgICBpZDogXCJzZW5zb3JNb3ZlXCIsXG4gICAgICBvcmRlcjogMCxcbiAgICAgIGNhbGxiYWNrOiAodHJhbnNmb3JtKSA9PiB7XG4gICAgICAgIGlmIChzdGF0ZS5hY3RpdmUuc2Vuc29yKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHg6IHRyYW5zZm9ybS54ICsgc3RhdGUuYWN0aXZlLnNlbnNvci5jb29yZGluYXRlcy5kZWx0YS54LFxuICAgICAgICAgICAgeTogdHJhbnNmb3JtLnkgKyBzdGF0ZS5hY3RpdmUuc2Vuc29yLmNvb3JkaW5hdGVzLmRlbHRhLnlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cmFuc2Zvcm07XG4gICAgICB9XG4gICAgfTtcbiAgICByZWNvbXB1dGVMYXlvdXRzKCk7XG4gICAgYmF0Y2goKCkgPT4ge1xuICAgICAgc2V0U3RhdGUoXCJhY3RpdmVcIiwgXCJkcmFnZ2FibGVJZFwiLCBkcmFnZ2FibGVJZCk7XG4gICAgICBhZGRUcmFuc2Zvcm1lcihcImRyYWdnYWJsZXNcIiwgZHJhZ2dhYmxlSWQsIHRyYW5zZm9ybWVyKTtcbiAgICB9KTtcbiAgICBkZXRlY3RDb2xsaXNpb25zKCk7XG4gIH07XG4gIGNvbnN0IGRyYWdFbmQgPSAoKSA9PiB7XG4gICAgY29uc3QgZHJhZ2dhYmxlSWQgPSB1bnRyYWNrKCgpID0+IHN0YXRlLmFjdGl2ZS5kcmFnZ2FibGVJZCk7XG4gICAgYmF0Y2goKCkgPT4ge1xuICAgICAgaWYgKGRyYWdnYWJsZUlkICE9PSBudWxsKSB7XG4gICAgICAgIHJlbW92ZVRyYW5zZm9ybWVyKFwiZHJhZ2dhYmxlc1wiLCBkcmFnZ2FibGVJZCwgXCJzZW5zb3JNb3ZlXCIpO1xuICAgICAgfVxuICAgICAgc2V0U3RhdGUoXCJhY3RpdmVcIiwgW1wiZHJhZ2dhYmxlSWRcIiwgXCJkcm9wcGFibGVJZFwiXSwgbnVsbCk7XG4gICAgfSk7XG4gICAgcmVjb21wdXRlTGF5b3V0cygpO1xuICB9O1xuICBjb25zdCBvbkRyYWdTdGFydCA9IChoYW5kbGVyKSA9PiB7XG4gICAgY3JlYXRlRWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IGRyYWdnYWJsZSA9IHN0YXRlLmFjdGl2ZS5kcmFnZ2FibGU7XG4gICAgICBpZiAoZHJhZ2dhYmxlKSB7XG4gICAgICAgIHVudHJhY2soKCkgPT4gaGFuZGxlcih7IGRyYWdnYWJsZSB9KSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IG9uRHJhZ01vdmUgPSAoaGFuZGxlcikgPT4ge1xuICAgIGNyZWF0ZUVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSBzdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlO1xuICAgICAgaWYgKGRyYWdnYWJsZSkge1xuICAgICAgICBjb25zdCBvdmVybGF5ID0gdW50cmFjaygoKSA9PiBzdGF0ZS5hY3RpdmUub3ZlcmxheSk7XG4gICAgICAgIE9iamVjdC52YWx1ZXMob3ZlcmxheSA/IG92ZXJsYXkudHJhbnNmb3JtIDogZHJhZ2dhYmxlLnRyYW5zZm9ybSk7XG4gICAgICAgIHVudHJhY2soKCkgPT4gaGFuZGxlcih7IGRyYWdnYWJsZSwgb3ZlcmxheSB9KSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IG9uRHJhZ092ZXIgPSAoaGFuZGxlcikgPT4ge1xuICAgIGNyZWF0ZUVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBkcmFnZ2FibGUgPSBzdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlO1xuICAgICAgY29uc3QgZHJvcHBhYmxlID0gc3RhdGUuYWN0aXZlLmRyb3BwYWJsZTtcbiAgICAgIGlmIChkcmFnZ2FibGUpIHtcbiAgICAgICAgdW50cmFjayhcbiAgICAgICAgICAoKSA9PiBoYW5kbGVyKHsgZHJhZ2dhYmxlLCBkcm9wcGFibGUsIG92ZXJsYXk6IHN0YXRlLmFjdGl2ZS5vdmVybGF5IH0pXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IG9uRHJhZ0VuZCA9IChoYW5kbGVyKSA9PiB7XG4gICAgY3JlYXRlRWZmZWN0KFxuICAgICAgKHsgcHJldmlvdXNEcmFnZ2FibGUsIHByZXZpb3VzRHJvcHBhYmxlLCBwcmV2aW91c092ZXJsYXkgfSkgPT4ge1xuICAgICAgICBjb25zdCBkcmFnZ2FibGUgPSBzdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlO1xuICAgICAgICBjb25zdCBkcm9wcGFibGUgPSBkcmFnZ2FibGUgPyBzdGF0ZS5hY3RpdmUuZHJvcHBhYmxlIDogbnVsbDtcbiAgICAgICAgY29uc3Qgb3ZlcmxheSA9IGRyYWdnYWJsZSA/IHN0YXRlLmFjdGl2ZS5vdmVybGF5IDogbnVsbDtcbiAgICAgICAgaWYgKCFkcmFnZ2FibGUgJiYgcHJldmlvdXNEcmFnZ2FibGUpIHtcbiAgICAgICAgICB1bnRyYWNrKFxuICAgICAgICAgICAgKCkgPT4gaGFuZGxlcih7XG4gICAgICAgICAgICAgIGRyYWdnYWJsZTogcHJldmlvdXNEcmFnZ2FibGUsXG4gICAgICAgICAgICAgIGRyb3BwYWJsZTogcHJldmlvdXNEcm9wcGFibGUsXG4gICAgICAgICAgICAgIG92ZXJsYXk6IHByZXZpb3VzT3ZlcmxheVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcHJldmlvdXNEcmFnZ2FibGU6IGRyYWdnYWJsZSxcbiAgICAgICAgICBwcmV2aW91c0Ryb3BwYWJsZTogZHJvcHBhYmxlLFxuICAgICAgICAgIHByZXZpb3VzT3ZlcmxheTogb3ZlcmxheVxuICAgICAgICB9O1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcHJldmlvdXNEcmFnZ2FibGU6IG51bGwsXG4gICAgICAgIHByZXZpb3VzRHJvcHBhYmxlOiBudWxsLFxuICAgICAgICBwcmV2aW91c092ZXJsYXk6IG51bGxcbiAgICAgIH1cbiAgICApO1xuICB9O1xuICBvbkRyYWdNb3ZlKCgpID0+IGRldGVjdENvbGxpc2lvbnMoKSk7XG4gIHByb3BzLm9uRHJhZ1N0YXJ0ICYmIG9uRHJhZ1N0YXJ0KHByb3BzLm9uRHJhZ1N0YXJ0KTtcbiAgcHJvcHMub25EcmFnTW92ZSAmJiBvbkRyYWdNb3ZlKHByb3BzLm9uRHJhZ01vdmUpO1xuICBwcm9wcy5vbkRyYWdPdmVyICYmIG9uRHJhZ092ZXIocHJvcHMub25EcmFnT3Zlcik7XG4gIHByb3BzLm9uRHJhZ0VuZCAmJiBvbkRyYWdFbmQocHJvcHMub25EcmFnRW5kKTtcbiAgY29uc3QgYWN0aW9ucyA9IHtcbiAgICBhZGRUcmFuc2Zvcm1lcixcbiAgICByZW1vdmVUcmFuc2Zvcm1lcixcbiAgICBhZGREcmFnZ2FibGUsXG4gICAgcmVtb3ZlRHJhZ2dhYmxlLFxuICAgIGFkZERyb3BwYWJsZSxcbiAgICByZW1vdmVEcm9wcGFibGUsXG4gICAgYWRkU2Vuc29yLFxuICAgIHJlbW92ZVNlbnNvcixcbiAgICBzZXRPdmVybGF5LFxuICAgIGNsZWFyT3ZlcmxheSxcbiAgICByZWNvbXB1dGVMYXlvdXRzLFxuICAgIGRldGVjdENvbGxpc2lvbnMsXG4gICAgZHJhZ2dhYmxlQWN0aXZhdG9ycyxcbiAgICBzZW5zb3JTdGFydCxcbiAgICBzZW5zb3JNb3ZlLFxuICAgIHNlbnNvckVuZCxcbiAgICBkcmFnU3RhcnQsXG4gICAgZHJhZ0VuZCxcbiAgICBvbkRyYWdTdGFydCxcbiAgICBvbkRyYWdNb3ZlLFxuICAgIG9uRHJhZ092ZXIsXG4gICAgb25EcmFnRW5kXG4gIH07XG4gIGNvbnN0IGNvbnRleHQgPSBbc3RhdGUsIGFjdGlvbnNdO1xuICByZXR1cm4gPENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NvbnRleHR9Pntwcm9wcy5jaGlsZHJlbn08L0NvbnRleHQuUHJvdmlkZXI+O1xufTtcbnZhciB1c2VEcmFnRHJvcENvbnRleHQgPSAoKSA9PiB7XG4gIHJldHVybiB1c2VDb250ZXh0KENvbnRleHQpIHx8IG51bGw7XG59O1xuXG4vLyBzcmMvY3JlYXRlLXBvaW50ZXItc2Vuc29yLnRzXG5pbXBvcnQgeyBvbkNsZWFudXAsIG9uTW91bnQgfSBmcm9tIFwic29saWQtanNcIjtcbnZhciBjcmVhdGVQb2ludGVyU2Vuc29yID0gKGlkID0gXCJwb2ludGVyLXNlbnNvclwiKSA9PiB7XG4gIGNvbnN0IFtcbiAgICBzdGF0ZSxcbiAgICB7XG4gICAgICBhZGRTZW5zb3IsXG4gICAgICByZW1vdmVTZW5zb3IsXG4gICAgICBzZW5zb3JTdGFydCxcbiAgICAgIHNlbnNvck1vdmUsXG4gICAgICBzZW5zb3JFbmQsXG4gICAgICBkcmFnU3RhcnQsXG4gICAgICBkcmFnRW5kXG4gICAgfVxuICBdID0gdXNlRHJhZ0Ryb3BDb250ZXh0KCk7XG4gIGNvbnN0IGFjdGl2YXRpb25EZWxheSA9IDI1MDtcbiAgY29uc3QgYWN0aXZhdGlvbkRpc3RhbmNlID0gMTA7XG4gIG9uTW91bnQoKCkgPT4ge1xuICAgIGFkZFNlbnNvcih7IGlkLCBhY3RpdmF0b3JzOiB7IHBvaW50ZXJkb3duOiBhdHRhY2ggfSB9KTtcbiAgfSk7XG4gIG9uQ2xlYW51cCgoKSA9PiB7XG4gICAgcmVtb3ZlU2Vuc29yKGlkKTtcbiAgfSk7XG4gIGNvbnN0IGlzQWN0aXZlU2Vuc29yID0gKCkgPT4gc3RhdGUuYWN0aXZlLnNlbnNvcklkID09PSBpZDtcbiAgY29uc3QgaW5pdGlhbENvb3JkaW5hdGVzID0geyB4OiAwLCB5OiAwIH07XG4gIGxldCBhY3RpdmF0aW9uRGVsYXlUaW1lb3V0SWQgPSBudWxsO1xuICBsZXQgYWN0aXZhdGlvbkRyYWdnYWJsZUlkID0gbnVsbDtcbiAgY29uc3QgYXR0YWNoID0gKGV2ZW50LCBkcmFnZ2FibGVJZCkgPT4ge1xuICAgIGlmIChldmVudC5idXR0b24gIT09IDApXG4gICAgICByZXR1cm47XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIG9uUG9pbnRlck1vdmUpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgb25Qb2ludGVyVXApO1xuICAgIGFjdGl2YXRpb25EcmFnZ2FibGVJZCA9IGRyYWdnYWJsZUlkO1xuICAgIGluaXRpYWxDb29yZGluYXRlcy54ID0gZXZlbnQuY2xpZW50WDtcbiAgICBpbml0aWFsQ29vcmRpbmF0ZXMueSA9IGV2ZW50LmNsaWVudFk7XG4gICAgYWN0aXZhdGlvbkRlbGF5VGltZW91dElkID0gd2luZG93LnNldFRpbWVvdXQob25BY3RpdmF0ZSwgYWN0aXZhdGlvbkRlbGF5KTtcbiAgfTtcbiAgY29uc3QgZGV0YWNoID0gKCkgPT4ge1xuICAgIGlmIChhY3RpdmF0aW9uRGVsYXlUaW1lb3V0SWQpIHtcbiAgICAgIGNsZWFyVGltZW91dChhY3RpdmF0aW9uRGVsYXlUaW1lb3V0SWQpO1xuICAgICAgYWN0aXZhdGlvbkRlbGF5VGltZW91dElkID0gbnVsbDtcbiAgICB9XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJtb3ZlXCIsIG9uUG9pbnRlck1vdmUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgb25Qb2ludGVyVXApO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIiwgY2xlYXJTZWxlY3Rpb24pO1xuICB9O1xuICBjb25zdCBvbkFjdGl2YXRlID0gKCkgPT4ge1xuICAgIGlmICghc3RhdGUuYWN0aXZlLnNlbnNvcikge1xuICAgICAgc2Vuc29yU3RhcnQoaWQsIGluaXRpYWxDb29yZGluYXRlcyk7XG4gICAgICBkcmFnU3RhcnQoYWN0aXZhdGlvbkRyYWdnYWJsZUlkKTtcbiAgICAgIGNsZWFyU2VsZWN0aW9uKCk7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwic2VsZWN0aW9uY2hhbmdlXCIsIGNsZWFyU2VsZWN0aW9uKTtcbiAgICB9IGVsc2UgaWYgKCFpc0FjdGl2ZVNlbnNvcigpKSB7XG4gICAgICBkZXRhY2goKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG9uUG9pbnRlck1vdmUgPSAoZXZlbnQpID0+IHtcbiAgICBjb25zdCBjb29yZGluYXRlcyA9IHsgeDogZXZlbnQuY2xpZW50WCwgeTogZXZlbnQuY2xpZW50WSB9O1xuICAgIGlmICghc3RhdGUuYWN0aXZlLnNlbnNvcikge1xuICAgICAgY29uc3QgdHJhbnNmb3JtID0ge1xuICAgICAgICB4OiBjb29yZGluYXRlcy54IC0gaW5pdGlhbENvb3JkaW5hdGVzLngsXG4gICAgICAgIHk6IGNvb3JkaW5hdGVzLnkgLSBpbml0aWFsQ29vcmRpbmF0ZXMueVxuICAgICAgfTtcbiAgICAgIGlmIChNYXRoLnNxcnQodHJhbnNmb3JtLnggKiogMiArIHRyYW5zZm9ybS55ICoqIDIpID4gYWN0aXZhdGlvbkRpc3RhbmNlKSB7XG4gICAgICAgIG9uQWN0aXZhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlzQWN0aXZlU2Vuc29yKCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzZW5zb3JNb3ZlKGNvb3JkaW5hdGVzKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IG9uUG9pbnRlclVwID0gKGV2ZW50KSA9PiB7XG4gICAgZGV0YWNoKCk7XG4gICAgaWYgKGlzQWN0aXZlU2Vuc29yKCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBkcmFnRW5kKCk7XG4gICAgICBzZW5zb3JFbmQoKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IGNsZWFyU2VsZWN0aW9uID0gKCkgPT4ge1xuICAgIHdpbmRvdy5nZXRTZWxlY3Rpb24oKT8ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gIH07XG59O1xuXG4vLyBzcmMvZHJhZy1kcm9wLXNlbnNvcnMudHN4XG52YXIgRHJhZ0Ryb3BTZW5zb3JzID0gKHByb3BzKSA9PiB7XG4gIGNyZWF0ZVBvaW50ZXJTZW5zb3IoKTtcbiAgcmV0dXJuIDw+e3Byb3BzLmNoaWxkcmVufTwvPjtcbn07XG5cbi8vIHNyYy9jcmVhdGUtZHJhZ2dhYmxlLnRzXG5pbXBvcnQge1xuICBjcmVhdGVFZmZlY3QgYXMgY3JlYXRlRWZmZWN0MixcbiAgY3JlYXRlU2lnbmFsLFxuICBvbkNsZWFudXAgYXMgb25DbGVhbnVwMixcbiAgb25Nb3VudCBhcyBvbk1vdW50MlxufSBmcm9tIFwic29saWQtanNcIjtcblxuLy8gc3JjL3N0eWxlLnRzXG52YXIgbGF5b3V0U3R5bGUgPSAobGF5b3V0KSA9PiB7XG4gIHJldHVybiB7XG4gICAgdG9wOiBgJHtsYXlvdXQueX1weGAsXG4gICAgbGVmdDogYCR7bGF5b3V0Lnh9cHhgLFxuICAgIHdpZHRoOiBgJHtsYXlvdXQud2lkdGh9cHhgLFxuICAgIGhlaWdodDogYCR7bGF5b3V0LmhlaWdodH1weGBcbiAgfTtcbn07XG52YXIgdHJhbnNmb3JtU3R5bGUgPSAodHJhbnNmb3JtKSA9PiB7XG4gIHJldHVybiB7IHRyYW5zZm9ybTogYHRyYW5zbGF0ZTNkKCR7dHJhbnNmb3JtLnh9cHgsICR7dHJhbnNmb3JtLnl9cHgsIDApYCB9O1xufTtcbnZhciBtYXliZVRyYW5zZm9ybVN0eWxlID0gKHRyYW5zZm9ybSkgPT4ge1xuICByZXR1cm4gdHJhbnNmb3Jtc0FyZUVxdWFsKHRyYW5zZm9ybSwgbm9vcFRyYW5zZm9ybSgpKSA/IHt9IDogdHJhbnNmb3JtU3R5bGUodHJhbnNmb3JtKTtcbn07XG5cbi8vIHNyYy9jcmVhdGUtZHJhZ2dhYmxlLnRzXG52YXIgY3JlYXRlRHJhZ2dhYmxlID0gKGlkLCBkYXRhID0ge30pID0+IHtcbiAgY29uc3QgW3N0YXRlLCB7IGFkZERyYWdnYWJsZSwgcmVtb3ZlRHJhZ2dhYmxlLCBkcmFnZ2FibGVBY3RpdmF0b3JzIH1dID0gdXNlRHJhZ0Ryb3BDb250ZXh0KCk7XG4gIGNvbnN0IFtub2RlLCBzZXROb2RlXSA9IGNyZWF0ZVNpZ25hbChudWxsKTtcbiAgb25Nb3VudDIoKCkgPT4ge1xuICAgIGNvbnN0IHJlc29sdmVkTm9kZSA9IG5vZGUoKTtcbiAgICBpZiAocmVzb2x2ZWROb2RlKSB7XG4gICAgICBhZGREcmFnZ2FibGUoe1xuICAgICAgICBpZCxcbiAgICAgICAgbm9kZTogcmVzb2x2ZWROb2RlLFxuICAgICAgICBsYXlvdXQ6IGVsZW1lbnRMYXlvdXQocmVzb2x2ZWROb2RlKSxcbiAgICAgICAgZGF0YVxuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgb25DbGVhbnVwMigoKSA9PiByZW1vdmVEcmFnZ2FibGUoaWQpKTtcbiAgY29uc3QgaXNBY3RpdmVEcmFnZ2FibGUgPSAoKSA9PiBzdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlSWQgPT09IGlkO1xuICBjb25zdCB0cmFuc2Zvcm0gPSAoKSA9PiB7XG4gICAgcmV0dXJuIHN0YXRlLmRyYWdnYWJsZXNbaWRdPy50cmFuc2Zvcm0gfHwgbm9vcFRyYW5zZm9ybSgpO1xuICB9O1xuICBjb25zdCBkcmFnZ2FibGUgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhcbiAgICAoZWxlbWVudCwgYWNjZXNzb3IpID0+IHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGFjY2Vzc29yID8gYWNjZXNzb3IoKSA6IHt9O1xuICAgICAgY3JlYXRlRWZmZWN0MigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkTm9kZSA9IG5vZGUoKTtcbiAgICAgICAgY29uc3QgYWN0aXZhdG9ycyA9IGRyYWdnYWJsZUFjdGl2YXRvcnMoaWQpO1xuICAgICAgICBpZiAocmVzb2x2ZWROb2RlKSB7XG4gICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYWN0aXZhdG9ycykge1xuICAgICAgICAgICAgcmVzb2x2ZWROb2RlLmFkZEV2ZW50TGlzdGVuZXIoa2V5LCBhY3RpdmF0b3JzW2tleV0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBvbkNsZWFudXAyKCgpID0+IHtcbiAgICAgICAgICBpZiAocmVzb2x2ZWROb2RlKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiBhY3RpdmF0b3JzKSB7XG4gICAgICAgICAgICAgIHJlc29sdmVkTm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGtleSwgYWN0aXZhdG9yc1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICBzZXROb2RlKGVsZW1lbnQpO1xuICAgICAgaWYgKCFjb25maWcuc2tpcFRyYW5zZm9ybSkge1xuICAgICAgICBjcmVhdGVFZmZlY3QyKCgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZFRyYW5zZm9ybSA9IHRyYW5zZm9ybSgpO1xuICAgICAgICAgIGlmICghdHJhbnNmb3Jtc0FyZUVxdWFsKHJlc29sdmVkVHJhbnNmb3JtLCBub29wVHJhbnNmb3JtKCkpKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZSA9IHRyYW5zZm9ybVN0eWxlKHRyYW5zZm9ybSgpKTtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkoXCJ0cmFuc2Zvcm1cIiwgc3R5bGUudHJhbnNmb3JtID8/IG51bGwpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KFwidHJhbnNmb3JtXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICByZWY6IHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHNldE5vZGVcbiAgICAgIH0sXG4gICAgICBpc0FjdGl2ZURyYWdnYWJsZToge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6IGlzQWN0aXZlRHJhZ2dhYmxlXG4gICAgICB9LFxuICAgICAgZHJhZ0FjdGl2YXRvcnM6IHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGRyYWdnYWJsZUFjdGl2YXRvcnMoaWQsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdHJhbnNmb3JtOiB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogdHJhbnNmb3JtXG4gICAgICB9XG4gICAgfVxuICApO1xuICByZXR1cm4gZHJhZ2dhYmxlO1xufTtcblxuLy8gc3JjL2NyZWF0ZS1kcm9wcGFibGUudHNcbmltcG9ydCB7XG4gIGNyZWF0ZUVmZmVjdCBhcyBjcmVhdGVFZmZlY3QzLFxuICBjcmVhdGVTaWduYWwgYXMgY3JlYXRlU2lnbmFsMixcbiAgb25DbGVhbnVwIGFzIG9uQ2xlYW51cDMsXG4gIG9uTW91bnQgYXMgb25Nb3VudDNcbn0gZnJvbSBcInNvbGlkLWpzXCI7XG52YXIgY3JlYXRlRHJvcHBhYmxlID0gKGlkLCBkYXRhID0ge30pID0+IHtcbiAgY29uc3QgW3N0YXRlLCB7IGFkZERyb3BwYWJsZSwgcmVtb3ZlRHJvcHBhYmxlIH1dID0gdXNlRHJhZ0Ryb3BDb250ZXh0KCk7XG4gIGNvbnN0IFtub2RlLCBzZXROb2RlXSA9IGNyZWF0ZVNpZ25hbDIobnVsbCk7XG4gIG9uTW91bnQzKCgpID0+IHtcbiAgICBjb25zdCByZXNvbHZlZE5vZGUgPSBub2RlKCk7XG4gICAgaWYgKHJlc29sdmVkTm9kZSkge1xuICAgICAgYWRkRHJvcHBhYmxlKHtcbiAgICAgICAgaWQsXG4gICAgICAgIG5vZGU6IHJlc29sdmVkTm9kZSxcbiAgICAgICAgbGF5b3V0OiBlbGVtZW50TGF5b3V0KHJlc29sdmVkTm9kZSksXG4gICAgICAgIGRhdGFcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIG9uQ2xlYW51cDMoKCkgPT4gcmVtb3ZlRHJvcHBhYmxlKGlkKSk7XG4gIGNvbnN0IGlzQWN0aXZlRHJvcHBhYmxlID0gKCkgPT4gc3RhdGUuYWN0aXZlLmRyb3BwYWJsZUlkID09PSBpZDtcbiAgY29uc3QgdHJhbnNmb3JtID0gKCkgPT4ge1xuICAgIHJldHVybiBzdGF0ZS5kcm9wcGFibGVzW2lkXT8udHJhbnNmb3JtIHx8IG5vb3BUcmFuc2Zvcm0oKTtcbiAgfTtcbiAgY29uc3QgZHJvcHBhYmxlID0gT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoXG4gICAgKGVsZW1lbnQsIGFjY2Vzc29yKSA9PiB7XG4gICAgICBjb25zdCBjb25maWcgPSBhY2Nlc3NvciA/IGFjY2Vzc29yKCkgOiB7fTtcbiAgICAgIHNldE5vZGUoZWxlbWVudCk7XG4gICAgICBpZiAoIWNvbmZpZy5za2lwVHJhbnNmb3JtKSB7XG4gICAgICAgIGNyZWF0ZUVmZmVjdDMoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkVHJhbnNmb3JtID0gdHJhbnNmb3JtKCk7XG4gICAgICAgICAgaWYgKCF0cmFuc2Zvcm1zQXJlRXF1YWwocmVzb2x2ZWRUcmFuc2Zvcm0sIG5vb3BUcmFuc2Zvcm0oKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gdHJhbnNmb3JtU3R5bGUodHJhbnNmb3JtKCkpO1xuICAgICAgICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRyYW5zZm9ybVwiLCBzdHlsZS50cmFuc2Zvcm0gPz8gbnVsbCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVsZW1lbnQuc3R5bGUucmVtb3ZlUHJvcGVydHkoXCJ0cmFuc2Zvcm1cIik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIHJlZjoge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICB2YWx1ZTogc2V0Tm9kZVxuICAgICAgfSxcbiAgICAgIGlzQWN0aXZlRHJvcHBhYmxlOiB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogaXNBY3RpdmVEcm9wcGFibGVcbiAgICAgIH0sXG4gICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiB0cmFuc2Zvcm1cbiAgICAgIH1cbiAgICB9XG4gICk7XG4gIHJldHVybiBkcm9wcGFibGU7XG59O1xuXG4vLyBzcmMvZHJhZy1vdmVybGF5LnRzeFxuaW1wb3J0IHsgUG9ydGFsIH0gZnJvbSBcInNvbGlkLWpzL3dlYlwiO1xuaW1wb3J0IHsgU2hvdyB9IGZyb20gXCJzb2xpZC1qc1wiO1xudmFyIERyYWdPdmVybGF5ID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IFtzdGF0ZSwgeyBvbkRyYWdTdGFydCwgb25EcmFnRW5kLCBzZXRPdmVybGF5LCBjbGVhck92ZXJsYXkgfV0gPSB1c2VEcmFnRHJvcENvbnRleHQoKTtcbiAgbGV0IG5vZGU7XG4gIG9uRHJhZ1N0YXJ0KCh7IGRyYWdnYWJsZSB9KSA9PiB7XG4gICAgc2V0T3ZlcmxheSh7XG4gICAgICBub2RlOiBkcmFnZ2FibGUubm9kZSxcbiAgICAgIGxheW91dDogZHJhZ2dhYmxlLmxheW91dFxuICAgIH0pO1xuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIGlmIChub2RlKSB7XG4gICAgICAgIGNvbnN0IGxheW91dCA9IGVsZW1lbnRMYXlvdXQobm9kZSk7XG4gICAgICAgIGNvbnN0IGRlbHRhID0ge1xuICAgICAgICAgIHg6IChkcmFnZ2FibGUubGF5b3V0LndpZHRoIC0gbGF5b3V0LndpZHRoKSAvIDIsXG4gICAgICAgICAgeTogKGRyYWdnYWJsZS5sYXlvdXQuaGVpZ2h0IC0gbGF5b3V0LmhlaWdodCkgLyAyXG4gICAgICAgIH07XG4gICAgICAgIGxheW91dC54ICs9IGRlbHRhLng7XG4gICAgICAgIGxheW91dC55ICs9IGRlbHRhLnk7XG4gICAgICAgIHNldE92ZXJsYXkoeyBub2RlLCBsYXlvdXQgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICBvbkRyYWdFbmQoKCkgPT4gcXVldWVNaWNyb3Rhc2soY2xlYXJPdmVybGF5KSk7XG4gIGNvbnN0IHN0eWxlID0gKCkgPT4ge1xuICAgIGNvbnN0IG92ZXJsYXkgPSBzdGF0ZS5hY3RpdmUub3ZlcmxheTtcbiAgICBjb25zdCBkcmFnZ2FibGUgPSBzdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlO1xuICAgIGlmICghb3ZlcmxheSB8fCAhZHJhZ2dhYmxlKVxuICAgICAgcmV0dXJuIHt9O1xuICAgIHJldHVybiB7XG4gICAgICBwb3NpdGlvbjogXCJmaXhlZFwiLFxuICAgICAgdHJhbnNpdGlvbjogXCJ0cmFuc2Zvcm0gMHNcIixcbiAgICAgIHRvcDogYCR7b3ZlcmxheS5sYXlvdXQudG9wfXB4YCxcbiAgICAgIGxlZnQ6IGAke292ZXJsYXkubGF5b3V0LmxlZnR9cHhgLFxuICAgICAgXCJtaW4td2lkdGhcIjogYCR7ZHJhZ2dhYmxlLmxheW91dC53aWR0aH1weGAsXG4gICAgICBcIm1pbi1oZWlnaHRcIjogYCR7ZHJhZ2dhYmxlLmxheW91dC5oZWlnaHR9cHhgLFxuICAgICAgLi4udHJhbnNmb3JtU3R5bGUob3ZlcmxheS50cmFuc2Zvcm0pLFxuICAgICAgLi4ucHJvcHMuc3R5bGVcbiAgICB9O1xuICB9O1xuICByZXR1cm4gPFBvcnRhbCBtb3VudD17ZG9jdW1lbnQuYm9keX0+PFNob3cgd2hlbj17c3RhdGUuYWN0aXZlLmRyYWdnYWJsZX0+PGRpdiByZWY9e25vZGV9IGNsYXNzPXtwcm9wcy5jbGFzc30gc3R5bGU9e3N0eWxlKCl9Pnt0eXBlb2YgcHJvcHMuY2hpbGRyZW4gPT09IFwiZnVuY3Rpb25cIiA/IHByb3BzLmNoaWxkcmVuKHN0YXRlLmFjdGl2ZS5kcmFnZ2FibGUpIDogcHJvcHMuY2hpbGRyZW59PC9kaXY+PC9TaG93PjwvUG9ydGFsPjtcbn07XG5cbi8vIHNyYy9zb3J0YWJsZS1jb250ZXh0LnRzeFxuaW1wb3J0IHtcbiAgY3JlYXRlQ29udGV4dCBhcyBjcmVhdGVDb250ZXh0MixcbiAgY3JlYXRlRWZmZWN0IGFzIGNyZWF0ZUVmZmVjdDQsXG4gIHVudHJhY2sgYXMgdW50cmFjazIsXG4gIHVzZUNvbnRleHQgYXMgdXNlQ29udGV4dDJcbn0gZnJvbSBcInNvbGlkLWpzXCI7XG5pbXBvcnQgeyBjcmVhdGVTdG9yZSBhcyBjcmVhdGVTdG9yZTIgfSBmcm9tIFwic29saWQtanMvc3RvcmVcIjtcblxuLy8gc3JjL21vdmUtYXJyYXktaXRlbS50c1xudmFyIG1vdmVBcnJheUl0ZW0gPSAoYXJyYXksIGZyb21JbmRleCwgdG9JbmRleCkgPT4ge1xuICBjb25zdCBuZXdBcnJheSA9IGFycmF5LnNsaWNlKCk7XG4gIG5ld0FycmF5LnNwbGljZSh0b0luZGV4LCAwLCAuLi5uZXdBcnJheS5zcGxpY2UoZnJvbUluZGV4LCAxKSk7XG4gIHJldHVybiBuZXdBcnJheTtcbn07XG5cbi8vIHNyYy9zb3J0YWJsZS1jb250ZXh0LnRzeFxudmFyIENvbnRleHQyID0gY3JlYXRlQ29udGV4dDIoKTtcbnZhciBTb3J0YWJsZVByb3ZpZGVyID0gKHByb3BzKSA9PiB7XG4gIGNvbnN0IFtkbmRTdGF0ZV0gPSB1c2VEcmFnRHJvcENvbnRleHQoKTtcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSBjcmVhdGVTdG9yZTIoe1xuICAgIGluaXRpYWxJZHM6IFtdLFxuICAgIHNvcnRlZElkczogW11cbiAgfSk7XG4gIGNvbnN0IGlzVmFsaWRJbmRleCA9IChpbmRleCkgPT4ge1xuICAgIHJldHVybiBpbmRleCA+PSAwICYmIGluZGV4IDwgc3RhdGUuaW5pdGlhbElkcy5sZW5ndGg7XG4gIH07XG4gIGNyZWF0ZUVmZmVjdDQoKCkgPT4ge1xuICAgIHNldFN0YXRlKFwiaW5pdGlhbElkc1wiLCBbLi4ucHJvcHMuaWRzXSk7XG4gICAgc2V0U3RhdGUoXCJzb3J0ZWRJZHNcIiwgWy4uLnByb3BzLmlkc10pO1xuICB9KTtcbiAgY3JlYXRlRWZmZWN0NCgoKSA9PiB7XG4gICAgaWYgKGRuZFN0YXRlLmFjdGl2ZS5kcmFnZ2FibGVJZCAmJiBkbmRTdGF0ZS5hY3RpdmUuZHJvcHBhYmxlSWQpIHtcbiAgICAgIHVudHJhY2syKCgpID0+IHtcbiAgICAgICAgY29uc3QgZnJvbUluZGV4ID0gc3RhdGUuc29ydGVkSWRzLmluZGV4T2YoZG5kU3RhdGUuYWN0aXZlLmRyYWdnYWJsZUlkKTtcbiAgICAgICAgY29uc3QgdG9JbmRleCA9IHN0YXRlLmluaXRpYWxJZHMuaW5kZXhPZihkbmRTdGF0ZS5hY3RpdmUuZHJvcHBhYmxlSWQpO1xuICAgICAgICBpZiAoIWlzVmFsaWRJbmRleChmcm9tSW5kZXgpIHx8ICFpc1ZhbGlkSW5kZXgodG9JbmRleCkpIHtcbiAgICAgICAgICBzZXRTdGF0ZShcInNvcnRlZElkc1wiLCBbLi4ucHJvcHMuaWRzXSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZnJvbUluZGV4ICE9PSB0b0luZGV4KSB7XG4gICAgICAgICAgY29uc3QgcmVzb3J0ZWQgPSBtb3ZlQXJyYXlJdGVtKHN0YXRlLnNvcnRlZElkcywgZnJvbUluZGV4LCB0b0luZGV4KTtcbiAgICAgICAgICBzZXRTdGF0ZShcInNvcnRlZElkc1wiLCByZXNvcnRlZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzZXRTdGF0ZShcInNvcnRlZElkc1wiLCBbLi4ucHJvcHMuaWRzXSk7XG4gICAgfVxuICB9KTtcbiAgY29uc3QgYWN0aW9ucyA9IHt9O1xuICBjb25zdCBjb250ZXh0ID0gW3N0YXRlLCBhY3Rpb25zXTtcbiAgcmV0dXJuIDxDb250ZXh0Mi5Qcm92aWRlciB2YWx1ZT17Y29udGV4dH0+e3Byb3BzLmNoaWxkcmVufTwvQ29udGV4dDIuUHJvdmlkZXI+O1xufTtcbnZhciB1c2VTb3J0YWJsZUNvbnRleHQgPSAoKSA9PiB7XG4gIHJldHVybiB1c2VDb250ZXh0MihDb250ZXh0MikgfHwgbnVsbDtcbn07XG5cbi8vIHNyYy9jcmVhdGUtc29ydGFibGUudHNcbmltcG9ydCB7IGNyZWF0ZUVmZmVjdCBhcyBjcmVhdGVFZmZlY3Q1LCBvbkNsZWFudXAgYXMgb25DbGVhbnVwNCwgb25Nb3VudCBhcyBvbk1vdW50NCB9IGZyb20gXCJzb2xpZC1qc1wiO1xuXG4vLyBzcmMvY29tYmluZS1yZWZzLnRzXG52YXIgY29tYmluZVJlZnMgPSAoc2V0UmVmQSwgc2V0UmVmQikgPT4ge1xuICByZXR1cm4gKHJlZikgPT4ge1xuICAgIHNldFJlZkEocmVmKTtcbiAgICBzZXRSZWZCKHJlZik7XG4gIH07XG59O1xuXG4vLyBzcmMvY3JlYXRlLXNvcnRhYmxlLnRzXG52YXIgY3JlYXRlU29ydGFibGUgPSAoaWQsIGRhdGEgPSB7fSkgPT4ge1xuICBjb25zdCBbZG5kU3RhdGUsIHsgYWRkVHJhbnNmb3JtZXIsIHJlbW92ZVRyYW5zZm9ybWVyIH1dID0gdXNlRHJhZ0Ryb3BDb250ZXh0KCk7XG4gIGNvbnN0IFtzb3J0YWJsZVN0YXRlXSA9IHVzZVNvcnRhYmxlQ29udGV4dCgpO1xuICBjb25zdCBkcmFnZ2FibGUgPSBjcmVhdGVEcmFnZ2FibGUoaWQsIGRhdGEpO1xuICBjb25zdCBkcm9wcGFibGUgPSBjcmVhdGVEcm9wcGFibGUoaWQsIGRhdGEpO1xuICBjb25zdCBzZXROb2RlID0gY29tYmluZVJlZnMoZHJhZ2dhYmxlLnJlZiwgZHJvcHBhYmxlLnJlZik7XG4gIGNvbnN0IGluaXRpYWxJbmRleCA9ICgpID0+IHNvcnRhYmxlU3RhdGUuaW5pdGlhbElkcy5pbmRleE9mKGlkKTtcbiAgY29uc3QgY3VycmVudEluZGV4ID0gKCkgPT4gc29ydGFibGVTdGF0ZS5zb3J0ZWRJZHMuaW5kZXhPZihpZCk7XG4gIGNvbnN0IGxheW91dEJ5SWQgPSAoaWQyKSA9PiBkbmRTdGF0ZS5kcm9wcGFibGVzW2lkMl0/LmxheW91dCB8fCBudWxsO1xuICBjb25zdCBzb3J0ZWRUcmFuc2Zvcm0gPSAoKSA9PiB7XG4gICAgY29uc3QgZGVsdGEgPSBub29wVHJhbnNmb3JtKCk7XG4gICAgY29uc3QgcmVzb2x2ZWRJbml0aWFsSW5kZXggPSBpbml0aWFsSW5kZXgoKTtcbiAgICBjb25zdCByZXNvbHZlZEN1cnJlbnRJbmRleCA9IGN1cnJlbnRJbmRleCgpO1xuICAgIGlmIChyZXNvbHZlZEN1cnJlbnRJbmRleCAhPT0gcmVzb2x2ZWRJbml0aWFsSW5kZXgpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRMYXlvdXQgPSBsYXlvdXRCeUlkKGlkKTtcbiAgICAgIGNvbnN0IHRhcmdldExheW91dCA9IGxheW91dEJ5SWQoXG4gICAgICAgIHNvcnRhYmxlU3RhdGUuaW5pdGlhbElkc1tyZXNvbHZlZEN1cnJlbnRJbmRleF1cbiAgICAgICk7XG4gICAgICBpZiAoY3VycmVudExheW91dCAmJiB0YXJnZXRMYXlvdXQpIHtcbiAgICAgICAgZGVsdGEueCA9IHRhcmdldExheW91dC54IC0gY3VycmVudExheW91dC54O1xuICAgICAgICBkZWx0YS55ID0gdGFyZ2V0TGF5b3V0LnkgLSBjdXJyZW50TGF5b3V0Lnk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWx0YTtcbiAgfTtcbiAgY29uc3QgdHJhbnNmb3JtZXIgPSB7XG4gICAgaWQ6IFwic29ydGFibGVPZmZzZXRcIixcbiAgICBvcmRlcjogMTAwLFxuICAgIGNhbGxiYWNrOiAodHJhbnNmb3JtMikgPT4ge1xuICAgICAgY29uc3QgZGVsdGEgPSBzb3J0ZWRUcmFuc2Zvcm0oKTtcbiAgICAgIHJldHVybiB7IHg6IHRyYW5zZm9ybTIueCArIGRlbHRhLngsIHk6IHRyYW5zZm9ybTIueSArIGRlbHRhLnkgfTtcbiAgICB9XG4gIH07XG4gIG9uTW91bnQ0KCgpID0+IGFkZFRyYW5zZm9ybWVyKFwiZHJvcHBhYmxlc1wiLCBpZCwgdHJhbnNmb3JtZXIpKTtcbiAgb25DbGVhbnVwNCgoKSA9PiByZW1vdmVUcmFuc2Zvcm1lcihcImRyb3BwYWJsZXNcIiwgaWQsIHRyYW5zZm9ybWVyLmlkKSk7XG4gIGNvbnN0IHRyYW5zZm9ybSA9ICgpID0+IHtcbiAgICByZXR1cm4gKGlkID09PSBkbmRTdGF0ZS5hY3RpdmUuZHJhZ2dhYmxlSWQgJiYgIWRuZFN0YXRlLmFjdGl2ZS5vdmVybGF5ID8gZG5kU3RhdGUuZHJhZ2dhYmxlc1tpZF0/LnRyYW5zZm9ybSA6IGRuZFN0YXRlLmRyb3BwYWJsZXNbaWRdPy50cmFuc2Zvcm0pIHx8IG5vb3BUcmFuc2Zvcm0oKTtcbiAgfTtcbiAgY29uc3Qgc29ydGFibGUgPSBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhcbiAgICAoZWxlbWVudCkgPT4ge1xuICAgICAgZHJhZ2dhYmxlKGVsZW1lbnQsICgpID0+ICh7IHNraXBUcmFuc2Zvcm06IHRydWUgfSkpO1xuICAgICAgZHJvcHBhYmxlKGVsZW1lbnQsICgpID0+ICh7IHNraXBUcmFuc2Zvcm06IHRydWUgfSkpO1xuICAgICAgY3JlYXRlRWZmZWN0NSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc29sdmVkVHJhbnNmb3JtID0gdHJhbnNmb3JtKCk7XG4gICAgICAgIGlmICghdHJhbnNmb3Jtc0FyZUVxdWFsKHJlc29sdmVkVHJhbnNmb3JtLCBub29wVHJhbnNmb3JtKCkpKSB7XG4gICAgICAgICAgY29uc3Qgc3R5bGUgPSB0cmFuc2Zvcm1TdHlsZSh0cmFuc2Zvcm0oKSk7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShcInRyYW5zZm9ybVwiLCBzdHlsZS50cmFuc2Zvcm0gPz8gbnVsbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZWxlbWVudC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShcInRyYW5zZm9ybVwiKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgICB7XG4gICAgICByZWY6IHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgdmFsdWU6IHNldE5vZGVcbiAgICAgIH0sXG4gICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiB0cmFuc2Zvcm1cbiAgICAgIH0sXG4gICAgICBpc0FjdGl2ZURyYWdnYWJsZToge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IGRyYWdnYWJsZS5pc0FjdGl2ZURyYWdnYWJsZVxuICAgICAgfSxcbiAgICAgIGRyYWdBY3RpdmF0b3JzOiB7XG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gZHJhZ2dhYmxlLmRyYWdBY3RpdmF0b3JzXG4gICAgICB9LFxuICAgICAgaXNBY3RpdmVEcm9wcGFibGU6IHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgZ2V0OiAoKSA9PiBkcm9wcGFibGUuaXNBY3RpdmVEcm9wcGFibGVcbiAgICAgIH1cbiAgICB9XG4gICk7XG4gIHJldHVybiBzb3J0YWJsZTtcbn07XG5cbi8vIHNyYy9kcmFnLWRyb3AtZGVidWdnZXIudHN4XG5pbXBvcnQge1xuICBGb3IsXG4gIG1lcmdlUHJvcHMgYXMgbWVyZ2VQcm9wczIsXG4gIG9uQ2xlYW51cCBhcyBvbkNsZWFudXA1LFxuICBvbk1vdW50IGFzIG9uTW91bnQ1LFxuICBTaG93IGFzIFNob3cyXG59IGZyb20gXCJzb2xpZC1qc1wiO1xuaW1wb3J0IHsgUG9ydGFsIGFzIFBvcnRhbDIgfSBmcm9tIFwic29saWQtanMvd2ViXCI7XG52YXIgSGlnaGxpZ2h0ZXIgPSAocHJvcHMpID0+IHtcbiAgcHJvcHMgPSBtZXJnZVByb3BzMih7IGNvbG9yOiBcInJlZFwiLCBhY3RpdmU6IGZhbHNlIH0sIHByb3BzKTtcbiAgcmV0dXJuIDxkaXZcbiAgICBzdHlsZT17e1xuICAgICAgcG9zaXRpb246IFwiZml4ZWRcIixcbiAgICAgIFwicG9pbnRlci1ldmVudHNcIjogXCJub25lXCIsXG4gICAgICAuLi5sYXlvdXRTdHlsZShwcm9wcy5sYXlvdXQpLFxuICAgICAgb3V0bGluZTogXCIxcHggZGFzaGVkXCIsXG4gICAgICBcIm91dGxpbmUtd2lkdGhcIjogcHJvcHMuYWN0aXZlID8gXCI0cHhcIiA6IFwiMXB4XCIsXG4gICAgICBcIm91dGxpbmUtY29sb3JcIjogcHJvcHMuY29sb3IsXG4gICAgICBkaXNwbGF5OiBcImZsZXhcIixcbiAgICAgIGNvbG9yOiBwcm9wcy5jb2xvcixcbiAgICAgIFwiYWxpZ24taXRlbXNcIjogXCJmbGV4LWVuZFwiLFxuICAgICAgXCJqdXN0aWZ5LWNvbnRlbnRcIjogXCJmbGV4LWVuZFwiLFxuICAgICAgLi4ucHJvcHMuc3R5bGVcbiAgICB9fVxuICA+e3Byb3BzLmlkfTwvZGl2Pjtcbn07XG52YXIgRHJhZ0Ryb3BEZWJ1Z2dlciA9ICgpID0+IHtcbiAgY29uc3QgW3N0YXRlLCB7IHJlY29tcHV0ZUxheW91dHMgfV0gPSB1c2VEcmFnRHJvcENvbnRleHQoKTtcbiAgbGV0IHRpY2tpbmcgPSBmYWxzZTtcbiAgY29uc3QgdXBkYXRlID0gKCkgPT4ge1xuICAgIGlmICghdGlja2luZykge1xuICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpIHtcbiAgICAgICAgcmVjb21wdXRlTGF5b3V0cygpO1xuICAgICAgICB0aWNraW5nID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICAgIHRpY2tpbmcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgb25Nb3VudDUoKCkgPT4ge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdXBkYXRlKTtcbiAgfSk7XG4gIG9uQ2xlYW51cDUoKCkgPT4ge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgdXBkYXRlKTtcbiAgfSk7XG4gIHJldHVybiA8UG9ydGFsMiBtb3VudD17ZG9jdW1lbnQuYm9keX0+XG4gICAgPEZvciBlYWNoPXtPYmplY3QudmFsdWVzKHN0YXRlLmRyb3BwYWJsZXMpfT57KGRyb3BwYWJsZSkgPT4gZHJvcHBhYmxlID8gPEhpZ2hsaWdodGVyXG4gICAgICBpZD17ZHJvcHBhYmxlLmlkfVxuICAgICAgbGF5b3V0PXtkcm9wcGFibGUubGF5b3V0fVxuICAgICAgYWN0aXZlPXtkcm9wcGFibGUuaWQgPT09IHN0YXRlLmFjdGl2ZS5kcm9wcGFibGVJZH1cbiAgICAvPiA6IG51bGx9PC9Gb3I+XG4gICAgPEZvciBlYWNoPXtPYmplY3QudmFsdWVzKHN0YXRlLmRyYWdnYWJsZXMpfT57KGRyYWdnYWJsZSkgPT4gZHJhZ2dhYmxlID8gPEhpZ2hsaWdodGVyXG4gICAgICBpZD17ZHJhZ2dhYmxlLmlkfVxuICAgICAgbGF5b3V0PXtkcmFnZ2FibGUubGF5b3V0fVxuICAgICAgYWN0aXZlPXtkcmFnZ2FibGUuaWQgPT09IHN0YXRlLmFjdGl2ZS5kcmFnZ2FibGVJZH1cbiAgICAgIGNvbG9yPVwiYmx1ZVwiXG4gICAgICBzdHlsZT17e1xuICAgICAgICBcImFsaWduLWl0ZW1zXCI6IFwiZmxleC1zdGFydFwiLFxuICAgICAgICBcImp1c3RpZnktY29udGVudFwiOiBcImZsZXgtc3RhcnRcIixcbiAgICAgICAgLi4udHJhbnNmb3JtU3R5bGUoZHJhZ2dhYmxlLnRyYW5zZm9ybSlcbiAgICAgIH19XG4gICAgLz4gOiBudWxsfTwvRm9yPlxuICAgIDxTaG93MiB3aGVuPXtzdGF0ZS5hY3RpdmUub3ZlcmxheX0ga2V5ZWQ+eyhvdmVybGF5KSA9PiA8SGlnaGxpZ2h0ZXJcbiAgICAgIGlkPXtvdmVybGF5LmlkfVxuICAgICAgbGF5b3V0PXtvdmVybGF5LmxheW91dH1cbiAgICAgIGFjdGl2ZT17dHJ1ZX1cbiAgICAgIGNvbG9yPVwib3JhbmdlXCJcbiAgICAgIHN0eWxlPXt7XG4gICAgICAgIC4uLnRyYW5zZm9ybVN0eWxlKG92ZXJsYXkudHJhbnNmb3JtKVxuICAgICAgfX1cbiAgICAvPn08L1Nob3cyPlxuICA8L1BvcnRhbDI+O1xufTtcbmV4cG9ydCB7XG4gIERyYWdEcm9wRGVidWdnZXIsXG4gIERyYWdEcm9wUHJvdmlkZXIsXG4gIERyYWdEcm9wU2Vuc29ycyxcbiAgRHJhZ092ZXJsYXksXG4gIFNvcnRhYmxlUHJvdmlkZXIsXG4gIGNsb3Nlc3RDZW50ZXIsXG4gIGNsb3Nlc3RDb3JuZXJzLFxuICBjcmVhdGVEcmFnZ2FibGUsXG4gIGNyZWF0ZURyb3BwYWJsZSxcbiAgY3JlYXRlUG9pbnRlclNlbnNvcixcbiAgY3JlYXRlU29ydGFibGUsXG4gIGxheW91dFN0eWxlLFxuICBtYXliZVRyYW5zZm9ybVN0eWxlLFxuICBtb3N0SW50ZXJzZWN0aW5nLFxuICB0cmFuc2Zvcm1TdHlsZSxcbiAgdXNlRHJhZ0Ryb3BDb250ZXh0LFxuICB1c2VTb3J0YWJsZUNvbnRleHRcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBO0FBQ0EsU0FDRUEsS0FBSyxFQUNMQyxhQUFhLEVBQ2JDLFlBQVksRUFDWkMsVUFBVSxFQUNWQyxPQUFPLEVBQ1BDLFVBQVUsUUFDTCxVQUFVO0FBQ2pCLFNBQVNDLFdBQVcsUUFBUSxnQkFBZ0I7O0FBRTVDO0FBQ0EsSUFBSUMsTUFBTSxHQUFHLE1BQU07RUFDakJDLENBQUM7RUFDREMsQ0FBQztFQUNEQyxLQUFLO0VBQ0xDLE1BQU07RUFDTkMs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
|