PageSourceSearch

https://axis-fe.up.railway.app/node_modules/.vite/deps/framer-motion.js?v=bf763330

js axis-fe.up.railway.app collected 2026-10-03 12:15:21 UTC 1,363,095 bytes, 10,617 lines download raw bytes

1import __buffer_polyfill from "/node_modules/.vite/deps/vite-plugin-node-polyfills_shims_buffer.js?v=bf763330";
2globalThis.Buffer = globalThis.Buffer || __buffer_polyfill;
3import __global_polyfill from "/node_modules/.vite/deps/vite-plugin-node-polyfills_shims_global.js?v=bf763330";
4globalThis.global = globalThis.global || __global_polyfill;
5import __process_polyfill from "/node_modules/.vite/deps/vite-plugin-node-polyfills_shims_process.js?v=bf763330";
6globalThis.process = globalThis.process || __process_polyfill;
7"use client";
8import {
9  require_jsx_runtime
10} from "/node_modules/.vite/deps/chunk-DIFCGDOZ.js?v=bf763330";
11import {
12  require_react
13} from "/node_modules/.vite/deps/chunk-OLCRR3H2.js?v=bf763330";
14import {
15  __commonJS,
16  __export,
17  __toESM,
18  require_dist,
19  require_dist2,
20  require_dist3
21} from "/node_modules/.vite/deps/chunk-CURNFZRR.js?v=bf763330";
22var require_is_prop_valid_framer_motion = __commonJS({
23  "optional-peer-dep:__vite-optional-peer-dep:@emotion/is-prop-valid:framer-motion"() {
24    var import_dist1069 = __toESM(require_dist());
25    var import_dist1070 = __toESM(require_dist2());
26    var import_dist1071 = __toESM(require_dist3());
27    throw new Error(`Could not resolve "@emotion/is-prop-valid" imported by "framer-motion". Is it installed?`);
28  }
29});
30var import_dist1066 = __toESM(require_dist(), 1);
31var import_dist1067 = __toESM(require_dist2(), 1);
32var import_dist1068 = __toESM(require_dist3(), 1);
33var import_dist31 = __toESM(require_dist(), 1);
34var import_dist32 = __toESM(require_dist2(), 1);
35var import_dist33 = __toESM(require_dist3(), 1);
36var import_jsx_runtime3 = __toESM(require_jsx_runtime(), 1);
37var import_react10 = __toESM(require_react(), 1);
38var import_dist = __toESM(require_dist(), 1);
39var import_dist2 = __toESM(require_dist2(), 1);
40var import_dist3 = __toESM(require_dist3(), 1);
41var import_react = __toESM(require_react(), 1);
42var LayoutGroupContext = (0, import_react.createContext)({});
43var import_dist4 = __toESM(require_dist(), 1);
44var import_dist5 = __toESM(require_dist2(), 1);
45var import_dist6 = __toESM(require_dist3(), 1);
46var import_react2 = __toESM(require_react(), 1);
47function useConstant(init) {
48  const ref = (0, import_react2.useRef)(null);
49  if (ref.current === null) {
50    ref.current = init();
51  }
52  return ref.current;
53}
54var import_dist16 = __toESM(require_dist(), 1);
55var import_dist17 = __toESM(require_dist2(), 1);
56var import_dist18 = __toESM(require_dist3(), 1);
57var import_jsx_runtime2 = __toESM(require_jsx_runtime(), 1);
58var React2 = __toESM(require_react(), 1);
59var import_react6 = __toESM(require_react(), 1);
60var import_dist7 = __toESM(require_dist(), 1);
61var import_dist8 = __toESM(require_dist2(), 1);
62var import_dist9 = __toESM(require_dist3(), 1);
63var import_react3 = __toESM(require_react(), 1);
64var PresenceContext = (0, import_react3.createContext)(null);
65var import_dist13 = __toESM(require_dist(), 1);
66var import_dist14 = __toESM(require_dist2(), 1);
67var import_dist15 = __toESM(require_dist3(), 1);
68var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
69var React = __toESM(require_react(), 1);
70var import_react5 = __toESM(require_react(), 1);
71var import_dist10 = __toESM(require_dist(), 1);
72var import_dist11 = __toESM(require_dist2(), 1);
73var import_dist12 = __toESM(require_dist3(), 1);
74var import_react4 = __toESM(require_react(), 1);
75var MotionConfigContext = (0, import_react4.createContext)({
76  transformPagePoint: (p) => p,
77  isStatic: false,
78  reducedMotion: "never"
79});
80var PopChildMeasure = class extends React.Component {
81  getSnapshotBeforeUpdate(prevProps) {
82    const element = this.props.childRef.current;
83    if (element && prevProps.isPresent && !this.props.isPresent) {
84      const size = this.props.sizeRef.current;
85      size.height = element.offsetHeight || 0;
86      size.width = element.offsetWidth || 0;
87      size.top = element.offsetTop;
88      size.left = element.offsetLeft;
89    }
90    return null;
91  }
92  /**
93   * Required with getSnapshotBeforeUpdate to stop React complaining.
94   */
95  componentDidUpdate() {
96  }
97  render() {
98    return this.props.children;
99  }
100};
101function PopChild({ children, isPresent: isPresent2 }) {
102  const id4 = (0, import_react5.useId)();
103  const ref = (0, import_react5.useRef)(null);
104  const size = (0, import_react5.useRef)({
105    width: 0,
106    height: 0,
107    top: 0,
108    left: 0
109  });
110  const { nonce } = (0, import_react5.useContext)(MotionConfigContext);
111  (0, import_react5.useInsertionEffect)(() => {
112    const { width, height, top, left } = size.current;
113    if (isPresent2 || !ref.current || !width || !height)
114      return;
115    ref.current.dataset.motionPopId = id4;
116    const style = document.createElement("style");
117    if (nonce)
118      style.nonce = nonce;
119    document.head.appendChild(style);
120    if (style.sheet) {
121      style.sheet.insertRule(`
122          [data-motion-pop-id="${id4}"] {
123            position: absolute !important;
124            width: ${width}px !important;
125            height: ${height}px !important;
126            top: ${top}px !important;
127            left: ${left}px !important;
128          }
129        `);
130    }
131    return () => {
132      document.head.removeChild(style);
133    };
134  }, [isPresent2]);
135  return (0, import_jsx_runtime.jsx)(PopChildMeasure, { isPresent: isPresent2, childRef: ref, sizeRef: size, children: React.cloneElement(children, { ref }) });
136}
137var PresenceChild = ({ children, initial, isPresent: isPresent2, onExitComplete, custom, presenceAffectsLayout, mode }) => {
138  const presenceChildren = useConstant(newChildrenMap);
139  const id4 = (0, import_react6.useId)();
140  const memoizedOnExitComplete = (0, import_react6.useCallback)((childId) => {
141    presenceChildren.set(childId, true);
142    for (const isComplete of presenceChildren.values()) {
143      if (!isComplete)
144        return;
145    }
146    onExitComplete && onExitComplete();
147  }, [presenceChildren, onExitComplete]);
148  const context = (0, import_react6.useMemo)(
149    () => ({
150      id: id4,
151      initial,
152      isPresent: isPresent2,
153      custom,
154      onExitComplete: memoizedOnExitComplete,
155      register: (childId) => {
156        presenceChildren.set(childId, false);
157        return () => presenceChildren.delete(childId);
158      }
159    }),
160    /**
161     * If the presence of a child affects the layout of the components around it,
162     * we want to make a new context value to ensure they get re-rendered
163     * so they can detect that layout change.
164     */
165    presenceAffectsLayout ? [Math.random(), memoizedOnExitComplete] : [isPresent2, memoizedOnExitComplete]
166  );
167  (0, import_react6.useMemo)(() => {
168    presenceChildren.forEach((_, key) => presenceChildren.set(key, false));
169  }, [isPresent2]);
170  React2.useEffect(() => {
171    !isPresent2 && !presenceChildren.size && onExitComplete && onExitComplete();
172  }, [isPresent2]);
173  if (mode === "popLayout") {
174    children = (0, import_jsx_runtime2.jsx)(PopChild, { isPresent: isPresent2, children });
175  }
176  return (0, import_jsx_runtime2.jsx)(PresenceContext.Provider, { value: context, children });
177};
178function newChildrenMap() {
179  return /* @__PURE__ */ new Map();
180}
181var import_dist19 = __toESM(require_dist(), 1);
182var import_dist20 = __toESM(require_dist2(), 1);
183var import_dist21 = __toESM(require_dist3(), 1);
184var import_react7 = __toESM(require_react(), 1);
185function usePresence(subscribe = true) {
186  const context = (0, import_react7.useContext)(PresenceContext);
187  if (context === null)
188    return [true, null];
189  const { isPresent: isPresent2, onExitComplete, register } = context;
190  const id4 = (0, import_react7.useId)();
191  (0, import_react7.useEffect)(() => {
192    if (subscribe)
193      register(id4);
194  }, [subscribe]);
195  const safeToRemove = (0, import_react7.useCallback)(() => subscribe && onExitComplete && onExitComplete(id4), [id4, onExitComplete, subscribe]);
196  return !isPresent2 && onExitComplete ? [false, safeToRemove] : [true];
197}
198function useIsPresent() {
199  return isPresent((0, import_react7.useContext)(PresenceContext));
200}
201function isPresent(context) {
202  return context === null ? true : context.isPresent;
203}
204var import_dist22 = __toESM(require_dist(), 1);
205var import_dist23 = __toESM(require_dist2(), 1);
206var import_dist24 = __toESM(require_dist3(), 1);
207var import_react8 = __toESM(require_react(), 1);
208var getChildKey = (child) => child.key || "";
209function onlyElements(children) {
210  const filtered = [];
211  import_react8.Children.forEach(children, (child) => {
212    if ((0, import_react8.isValidElement)(child))
213      filtered.push(child);
214  });
215  return filtered;
216}
217var import_dist28 = __toESM(require_dist(), 1);
218var import_dist29 = __toESM(require_dist2(), 1);
219var import_dist30 = __toESM(require_dist3(), 1);
220var import_react9 = __toESM(require_react(), 1);
221var import_dist25 = __toESM(require_dist(), 1);
222var import_dist26 = __toESM(require_dist2(), 1);
223var import_dist27 = __toESM(require_dist3(), 1);
224var isBrowser = typeof window !== "undefined";
225var useIsomorphicLayoutEffect = isBrowser ? import_react9.useLayoutEffect : import_react9.useEffect;
226var AnimatePresence = ({ children, custom, initial = true, onExitComplete, presenceAffectsLayout = true, mode = "sync", propagate = false }) => {
227  const [isParentPresent, safeToRemove] = usePresence(propagate);
228  const presentChildren = (0, import_react10.useMemo)(() => onlyElements(children), [children]);
229  const presentKeys = propagate && !isParentPresent ? [] : presentChildren.map(getChildKey);
230  const isInitialRender = (0, import_react10.useRef)(true);
231  const pendingPresentChildren = (0, import_react10.useRef)(presentChildren);
232  const exitComplete = useConstant(() => /* @__PURE__ */ new Map());
233  const [diffedChildren, setDiffedChildren] = (0, import_react10.useState)(presentChildren);
234  const [renderedChildren, setRenderedChildren] = (0, import_react10.useState)(presentChildren);
235  useIsomorphicLayoutEffect(() => {
236    isInitialRender.current = false;
237    pendingPresentChildren.current = presentChildren;
238    for (let i = 0; i < renderedChildren.length; i++) {
239      const key = getChildKey(renderedChildren[i]);
240      if (!presentKeys.includes(key)) {
241        if (exitComplete.get(key) !== true) {
242          exitComplete.set(key, false);
243        }
244      } else {
245        exitComplete.delete(key);
246      }
247    }
248  }, [renderedChildren, presentKeys.length, presentKeys.join("-")]);
249  const exitingChildren = [];
250  if (presentChildren !== diffedChildren) {
251    let nextChildren = [...presentChildren];
252    for (let i = 0; i < renderedChildren.length; i++) {
253      const child = renderedChildren[i];
254      const key = getChildKey(child);
255      if (!presentKeys.includes(key)) {
256        nextChildren.splice(i, 0, child);
257        exitingChildren.push(child);
258      }
259    }
260    if (mode === "wait" && exitingChildren.length) {
261      nextChildren = exitingChildren;
262    }
263    setRenderedChildren(onlyElements(nextChildren));
264    setDiffedChildren(presentChildren);
265    return;
266  }
267  if (mode === "wait" && renderedChildren.length > 1) {
268    console.warn(`You're attempting to animate multiple children within AnimatePresence, but its mode is set to "wait". This will lead to odd visual behaviour.`);
269  }
270  const { forceRender } = (0, import_react10.useContext)(LayoutGroupContext);
271  return (0, import_jsx_runtime3.jsx)(import_jsx_runtime3.Fragment, { children: renderedChildren.map((child) => {
272    const key = getChildKey(child);
273    const isPresent2 = propagate && !isParentPresent ? false : presentChildren === renderedChildren || presentKeys.includes(key);
274    const onExit = () => {
275      if (exitComplete.has(key)) {
276        exitComplete.set(key, true);
277      } else {
278        return;
279      }
280      let isEveryExitComplete = true;
281      exitComplete.forEach((isExitComplete) => {
282        if (!isExitComplete)
283          isEveryExitComplete = false;
284      });
285      if (isEveryExitComplete) {
286        forceRender === null || forceRender === void 0 ? void 0 : forceRender();
287        setRenderedChildren(pendingPresentChildren.current);
288        propagate && (safeToRemove === null || safeToRemove === void 0 ? void 0 : safeToRemove());
289        onExitComplete && onExitComplete();
290      }
291    };
292    return (0, import_jsx_runtime3.jsx)(PresenceChild, { isPresent: isPresent2, initial: !isInitialRender.current || initial ? void 0 : false, custom: isPresent2 ? void 0 : custom, presenceAffectsLayout, mode, onExitComplete: isPresent2 ? void 0 : onExit, children: child }, key);
293  }) });
294};
295var import_dist76 = __toESM(require_dist(), 1);
296var import_dist77 = __toESM(require_dist2(), 1);
297var import_dist78 = __toESM(require_dist3(), 1);
298var import_jsx_runtime4 = __toESM(require_jsx_runtime(), 1);
299var import_react14 = __toESM(require_react(), 1);
300var import_dist34 = __toESM(require_dist(), 1);
301var import_dist35 = __toESM(require_dist2(), 1);
302var import_dist36 = __toESM(require_dist3(), 1);
303var import_react11 = __toESM(require_react(), 1);
304var DeprecatedLayoutGroupContext = (0, import_react11.createContext)(null);
305var import_dist70 = __toESM(require_dist(), 1);
306var import_dist71 = __toESM(require_dist2(), 1);
307var import_dist72 = __toESM(require_dist3(), 1);
308var import_react13 = __toESM(require_react(), 1);
309var import_dist37 = __toESM(require_dist(), 1);
310var import_dist38 = __toESM(require_dist2(), 1);
311var import_dist39 = __toESM(require_dist3(), 1);
312var import_react12 = __toESM(require_react(), 1);
313function useIsMounted() {
314  const isMounted = (0, import_react12.useRef)(false);
315  useIsomorphicLayoutEffect(() => {
316    isMounted.current = true;
317    return () => {
318      isMounted.current = false;
319    };
320  }, []);
321  return isMounted;
322}
323var import_dist67 = __toESM(require_dist(), 1);
324var import_dist68 = __toESM(require_dist2(), 1);
325var import_dist69 = __toESM(require_dist3(), 1);
326var import_dist55 = __toESM(require_dist(), 1);
327var import_dist56 = __toESM(require_dist2(), 1);
328var import_dist57 = __toESM(require_dist3(), 1);
329var import_dist43 = __toESM(require_dist(), 1);
330var import_dist44 = __toESM(require_dist2(), 1);
331var import_dist45 = __toESM(require_dist3(), 1);
332var import_dist40 = __toESM(require_dist(), 1);
333var import_dist41 = __toESM(require_dist2(), 1);
334var import_dist42 = __toESM(require_dist3(), 1);
335var noop = (any) => any;
336var warning = noop;
337var invariant = noop;
338if (true) {
339  warning = (check, message) => {
340    if (!check && typeof console !== "undefined") {
341      console.warn(message);
342    }
343  };
344  invariant = (check, message) => {
345    if (!check) {
346      throw new Error(message);
347    }
348  };
349}
350var import_dist46 = __toESM(require_dist(), 1);
351var import_dist47 = __toESM(require_dist2(), 1);
352var import_dist48 = __toESM(require_dist3(), 1);
353function memo(callback) {
354  let result;
355  return () => {
356    if (result === void 0)
357      result = callback();
358    return result;
359  };
360}
361var import_dist49 = __toESM(require_dist(), 1);
362var import_dist50 = __toESM(require_dist2(), 1);
363var import_dist51 = __toESM(require_dist3(), 1);
364var progress = (from, to, value) => {
365  const toFromDifference = to - from;
366  return toFromDifference === 0 ? 1 : (value - from) / toFromDifference;
367};
368var import_dist52 = __toESM(require_dist(), 1);
369var import_dist53 = __toESM(require_dist2(), 1);
370var import_dist54 = __toESM(require_dist3(), 1);
371var secondsToMilliseconds = (seconds) => seconds * 1e3;
372var millisecondsToSeconds = (milliseconds) => milliseconds / 1e3;
373var import_dist64 = __toESM(require_dist(), 1);
374var import_dist65 = __toESM(require_dist2(), 1);
375var import_dist66 = __toESM(require_dist3(), 1);
376var import_dist58 = __toESM(require_dist(), 1);
377var import_dist59 = __toESM(require_dist2(), 1);
378var import_dist60 = __toESM(require_dist3(), 1);
379var MotionGlobalConfig = {
380  skipAnimations: false,
381  useManualTiming: false
382};
383var import_dist61 = __toESM(require_dist(), 1);
384var import_dist62 = __toESM(require_dist2(), 1);
385var import_dist63 = __toESM(require_dist3(), 1);
386function createRenderStep(runNextFrame) {
387  let thisFrame = /* @__PURE__ */ new Set();
388  let nextFrame = /* @__PURE__ */ new Set();
389  let isProcessing = false;
390  let flushNextFrame = false;
391  const toKeepAlive = /* @__PURE__ */ new WeakSet();
392  let latestFrameData = {
393    delta: 0,
394    timestamp: 0,
395    isProcessing: false
396  };
397  function triggerCallback(callback) {
398    if (toKeepAlive.has(callback)) {
399      step.schedule(callback);
400      runNextFrame();
401    }
402    callback(latestFrameData);
403  }
404  const step = {
405    /**
406     * Schedule a process to run on the next frame.
407     */
408    schedule: (callback, keepAlive = false, immediate = false) => {
409      const addToCurrentFrame = immediate && isProcessing;
410      const queue = addToCurrentFrame ? thisFrame : nextFrame;
411      if (keepAlive)
412        toKeepAlive.add(callback);
413      if (!queue.has(callback))
414        queue.add(callback);
415      return callback;
416    },
417    /**
418     * Cancel the provided callback from running on the next frame.
419     */
420    cancel: (callback) => {
421      nextFrame.delete(callback);
422      toKeepAlive.delete(callback);
423    },
424    /**
425     * Execute all schedule callbacks.
426     */
427    process: (frameData2) => {
428      latestFrameData = frameData2;
429      if (isProcessing) {
430        flushNextFrame = true;
431        return;
432      }
433      isProcessing = true;
434      [thisFrame, nextFrame] = [nextFrame, thisFrame];
435      thisFrame.forEach(triggerCallback);
436      thisFrame.clear();
437      isProcessing = false;
438      if (flushNextFrame) {
439        flushNextFrame = false;
440        step.process(frameData2);
441      }
442    }
443  };
444  return step;
445}
446var stepsOrder = [
447  "read",
448  // Read
449  "resolveKeyframes",
450  // Write/Read/Write/Read
451  "update",
452  // Compute
453  "preRender",
454  // Compute
455  "render",
456  // Write
457  "postRender"
458  // Compute
459];
460var maxElapsed = 40;
461function createRenderBatcher(scheduleNextBatch, allowKeepAlive) {
462  let runNextFrame = false;
463  let useDefaultElapsed = true;
464  const state2 = {
465    delta: 0,
466    timestamp: 0,
467    isProcessing: false
468  };
469  const flagRunNextFrame = () => runNextFrame = true;
470  const steps2 = stepsOrder.reduce((acc, key) => {
471    acc[key] = createRenderStep(flagRunNextFrame);
472    return acc;
473  }, {});
474  const { read, resolveKeyframes, update, preRender, render, postRender } = steps2;
475  const processBatch = () => {
476    const timestamp = MotionGlobalConfig.useManualTiming ? state2.timestamp : performance.now();
477    runNextFrame = false;
478    state2.delta = useDefaultElapsed ? 1e3 / 60 : Math.max(Math.min(timestamp - state2.timestamp, maxElapsed), 1);
479    state2.timestamp = timestamp;
480    state2.isProcessing = true;
481    read.process(state2);
482    resolveKeyframes.process(state2);
483    update.process(state2);
484    preRender.process(state2);
485    render.process(state2);
486    postRender.process(state2);
487    state2.isProcessing = false;
488    if (runNextFrame && allowKeepAlive) {
489      useDefaultElapsed = false;
490      scheduleNextBatch(processBatch);
491    }
492  };
493  const wake = () => {
494    runNextFrame = true;
495    useDefaultElapsed = true;
496    if (!state2.isProcessing) {
497      scheduleNextBatch(processBatch);
498    }
499  };
500  const schedule = stepsOrder.reduce((acc, key) => {
501    const step = steps2[key];
502    acc[key] = (process2, keepAlive = false, immediate = false) => {
503      if (!runNextFrame)
504        wake();
505      return step.schedule(process2, keepAlive, immediate);
506    };
507    return acc;
508  }, {});
509  const cancel = (process2) => {
510    for (let i = 0; i < stepsOrder.length; i++) {
511      steps2[stepsOrder[i]].cancel(process2);
512    }
513  };
514  return { schedule, cancel, state: state2, steps: steps2 };
515}
516var { schedule: frame, cancel: cancelFrame, state: frameData, steps: frameSteps } = createRenderBatcher(typeof requestAnimationFrame !== "undefined" ? requestAnimationFrame : noop, true);
517function useForceUpdate() {
518  const isMounted = useIsMounted();
519  const [forcedRenderCount, setForcedRenderCount] = (0, import_react13.useState)(0);
520  const forceRender = (0, import_react13.useCallback)(() => {
521    isMounted.current && setForcedRenderCount(forcedRenderCount + 1);
522  }, [forcedRenderCount]);
523  const deferredForceRender = (0, import_react13.useCallback)(() => frame.postRender(forceRender), [forceRender]);
524  return [deferredForceRender, forcedRenderCount];
525}
526var import_dist73 = __toESM(require_dist(), 1);
527var import_dist74 = __toESM(require_dist2(), 1);
528var import_dist75 = __toESM(require_dist3(), 1);
529var notify = (node) => !node.isLayoutDirty && node.willUpdate(false);
530function nodeGroup() {
531  const nodes = /* @__PURE__ */ new Set();
532  const subscriptions = /* @__PURE__ */ new WeakMap();
533  const dirtyAll = () => nodes.forEach(notify);
534  return {
535    add: (node) => {
536      nodes.add(node);
537      subscriptions.set(node, node.addEventListener("willUpdate", dirtyAll));
538    },
539    remove: (node) => {
540      nodes.delete(node);
541      const unsubscribe = subscriptions.get(node);
542      if (unsubscribe) {
543        unsubscribe();
544        subscriptions.delete(node);
545      }
546      dirtyAll();
547    },
548    dirty: dirtyAll
549  };
550}
551var shouldInheritGroup = (inherit) => inherit === true;
552var shouldInheritId = (inherit) => shouldInheritGroup(inherit === true) || inherit === "id";
553var LayoutGroup = ({ children, id: id4, inherit = true }) => {
554  const layoutGroupContext = (0, import_react14.useContext)(LayoutGroupContext);
555  const deprecatedLayoutGroupContext = (0, import_react14.useContext)(DeprecatedLayoutGroupContext);
556  const [forceRender, key] = useForceUpdate();
557  const context = (0, import_react14.useRef)(null);
558  const upstreamId = layoutGroupContext.id || deprecatedLayoutGroupContext;
559  if (context.current === null) {
560    if (shouldInheritId(inherit) && upstreamId) {
561      id4 = id4 ? upstreamId + "-" + id4 : upstreamId;
562    }
563    context.current = {
564      id: id4,
565      group: shouldInheritGroup(inherit) ? layoutGroupContext.group || nodeGroup() : nodeGroup()
566    };
567  }
568  const memoizedContext = (0, import_react14.useMemo)(() => ({ ...context.current, forceRender }), [key]);
569  return (0, import_jsx_runtime4.jsx)(LayoutGroupContext.Provider, { value: memoizedContext, children });
570};
571var import_dist88 = __toESM(require_dist(), 1);
572var import_dist89 = __toESM(require_dist2(), 1);
573var import_dist90 = __toESM(require_dist3(), 1);
574var import_jsx_runtime5 = __toESM(require_jsx_runtime(), 1);
575var import_react16 = __toESM(require_react(), 1);
576var import_dist79 = __toESM(require_dist(), 1);
577var import_dist80 = __toESM(require_dist2(), 1);
578var import_dist81 = __toESM(require_dist3(), 1);
579var import_react15 = __toESM(require_react(), 1);
580var LazyContext = (0, import_react15.createContext)({ strict: false });
581var import_dist85 = __toESM(require_dist(), 1);
582var import_dist86 = __toESM(require_dist2(), 1);
583var import_dist87 = __toESM(require_dist3(), 1);
584var import_dist82 = __toESM(require_dist(), 1);
585var import_dist83 = __toESM(require_dist2(), 1);
586var import_dist84 = __toESM(require_dist3(), 1);
587var featureProps = {
588  animation: [
589    "animate",
590    "variants",
591    "whileHover",
592    "whileTap",
593    "exit",
594    "whileInView",
595    "whileFocus",
596    "whileDrag"
597  ],
598  exit: ["exit"],
599  drag: ["drag", "dragControls"],
600  focus: ["whileFocus"],
601  hover: ["whileHover", "onHoverStart", "onHoverEnd"],
602  tap: ["whileTap", "onTap", "onTapStart", "onTapCancel"],
603  pan: ["onPan", "onPanStart", "onPanSessionStart", "onPanEnd"],
604  inView: ["whileInView", "onViewportEnter", "onViewportLeave"],
605  layout: ["layout", "layoutId"]
606};
607var featureDefinitions = {};
608for (const key in featureProps) {
609  featureDefinitions[key] = {
610    isEnabled: (props) => featureProps[key].some((name) => !!props[name])
611  };
612}
613function loadFeatures(features) {
614  for (const key in features) {
615    featureDefinitions[key] = {
616      ...featureDefinitions[key],
617      ...features[key]
618    };
619  }
620}
621function LazyMotion({ children, features, strict = false }) {
622  const [, setIsLoaded] = (0, import_react16.useState)(!isLazyBundle(features));
623  const loadedRenderer = (0, import_react16.useRef)(void 0);
624  if (!isLazyBundle(features)) {
625    const { renderer, ...loadedFeatures } = features;
626    loadedRenderer.current = renderer;
627    loadFeatures(loadedFeatures);
628  }
629  (0, import_react16.useEffect)(() => {
630    if (isLazyBundle(features)) {
631      features().then(({ renderer, ...loadedFeatures }) => {
632        loadFeatures(loadedFeatures);
633        loadedRenderer.current = renderer;
634        setIsLoaded(true);
635      });
636    }
637  }, []);
638  return (0, import_jsx_runtime5.jsx)(LazyContext.Provider, { value: { renderer: loadedRenderer.current, strict }, children });
639}
640function isLazyBundle(features) {
641  return typeof features === "function";
642}
643var import_dist97 = __toESM(require_dist(), 1);
644var import_dist98 = __toESM(require_dist2(), 1);
645var import_dist99 = __toESM(require_dist3(), 1);
646var import_jsx_runtime6 = __toESM(require_jsx_runtime(), 1);
647var import_react17 = __toESM(require_react(), 1);
648var import_dist94 = __toESM(require_dist(), 1);
649var import_dist95 = __toESM(require_dist2(), 1);
650var import_dist96 = __toESM(require_dist3(), 1);
651var import_dist91 = __toESM(require_dist(), 1);
652var import_dist92 = __toESM(require_dist2(), 1);
653var import_dist93 = __toESM(require_dist3(), 1);
654var validMotionProps = /* @__PURE__ */ new Set([
655  "animate",
656  "exit",
657  "variants",
658  "initial",
659  "style",
660  "values",
661  "variants",
662  "transition",
663  "transformTemplate",
664  "custom",
665  "inherit",
666  "onBeforeLayoutMeasure",
667  "onAnimationStart",
668  "onAnimationComplete",
669  "onUpdate",
670  "onDragStart",
671  "onDrag",
672  "onDragEnd",
673  "onMeasureDragConstraints",
674  "onDirectionLock",
675  "onDragTransitionEnd",
676  "_dragX",
677  "_dragY",
678  "onHoverStart",
679  "onHoverEnd",
680  "onViewportEnter",
681  "onViewportLeave",
682  "globalTapTarget",
683  "ignoreStrict",
684  "viewport"
685]);
686function isValidMotionProp(key) {
687  return key.startsWith("while") || key.startsWith("drag") && key !== "draggable" || key.startsWith("layout") || key.startsWith("onTap") || key.startsWith("onPan") || key.startsWith("onLayout") || validMotionProps.has(key);
688}
689var shouldForward = (key) => !isValidMotionProp(key);
690function loadExternalIsValidProp(isValidProp) {
691  if (!isValidProp)
692    return;
693  shouldForward = (key) => key.startsWith("on") ? !isValidMotionProp(key) : isValidProp(key);
694}
695try {
696  loadExternalIsValidProp(require_is_prop_valid_framer_motion().default);
697} catch (_a) {
698}
699function filterProps(props, isDom, forwardMotionProps) {
700  const filteredProps = {};
701  for (const key in props) {
702    if (key === "values" && typeof props.values === "object")
703      continue;
704    if (shouldForward(key) || forwardMotionProps === true && isValidMotionProp(key) || !isDom && !isValidMotionProp(key) || // If trying to use native HTML drag events, forward drag listeners
705    props["draggable"] && key.startsWith("onDrag")) {
706      filteredProps[key] = props[key];
707    }
708  }
709  return filteredProps;
710}
711function MotionConfig({ children, isValidProp, ...config }) {
712  isValidProp && loadExternalIsValidProp(isValidProp);
713  config = { ...(0, import_react17.useContext)(MotionConfigContext), ...config };
714  config.isStatic = useConstant(() => config.isStatic);
715  const context = (0, import_react17.useMemo)(() => config, [
716    JSON.stringify(config.transition),
717    config.transformPagePoint,
718    config.reducedMotion
719  ]);
720  return (0, import_jsx_runtime6.jsx)(MotionConfigContext.Provider, { value: context, children });
721}
722var import_dist274 = __toESM(require_dist(), 1);
723var import_dist275 = __toESM(require_dist2(), 1);
724var import_dist276 = __toESM(require_dist3(), 1);
725var import_dist103 = __toESM(require_dist(), 1);
726var import_dist104 = __toESM(require_dist2(), 1);
727var import_dist105 = __toESM(require_dist3(), 1);
728var import_dist100 = __toESM(require_dist(), 1);
729var import_dist101 = __toESM(require_dist2(), 1);
730var import_dist102 = __toESM(require_dist3(), 1);
731var warned = /* @__PURE__ */ new Set();
732function warnOnce(condition, message, element) {
733  if (condition || warned.has(message))
734    return;
735  console.warn(message);
736  if (element)
737    console.warn(element);
738  warned.add(message);
739}
740function createDOMMotionComponentProxy(componentFactory) {
741  if (typeof Proxy === "undefined") {
742    return componentFactory;
743  }
744  const componentCache = /* @__PURE__ */ new Map();
745  const deprecatedFactoryFunction = (...args) => {
746    if (true) {
747      warnOnce(false, "motion() is deprecated. Use motion.create() instead.");
748    }
749    return componentFactory(...args);
750  };
751  return new Proxy(deprecatedFactoryFunction, {
752    /**
753     * Called when `motion` is referenced with a prop: `motion.div`, `motion.input` etc.
754     * The prop name is passed through as `key` and we can use that to generate a `motion`
755     * DOM component with that name.
756     */
757    get: (_target, key) => {
758      if (key === "create")
759        return componentFactory;
760      if (!componentCache.has(key)) {
761        componentCache.set(key, componentFactory(key));
762      }
763      return componentCache.get(key);
764    }
765  });
766}
767var import_dist271 = __toESM(require_dist(), 1);
768var import_dist272 = __toESM(require_dist2(), 1);
769var import_dist273 = __toESM(require_dist3(), 1);
770var import_dist268 = __toESM(require_dist(), 1);
771var import_dist269 = __toESM(require_dist2(), 1);
772var import_dist270 = __toESM(require_dist3(), 1);
773var import_dist151 = __toESM(require_dist(), 1);
774var import_dist152 = __toESM(require_dist2(), 1);
775var import_dist153 = __toESM(require_dist3(), 1);
776var import_jsx_runtime7 = __toESM(require_jsx_runtime(), 1);
777var import_react23 = __toESM(require_react(), 1);
778var import_dist106 = __toESM(require_dist(), 1);
779var import_dist107 = __toESM(require_dist2(), 1);
780var import_dist108 = __toESM(require_dist3(), 1);
781var import_react18 = __toESM(require_react(), 1);
782var MotionContext = (0, import_react18.createContext)({});
783var import_dist124 = __toESM(require_dist(), 1);
784var import_dist125 = __toESM(require_dist2(), 1);
785var import_dist126 = __toESM(require_dist3(), 1);
786var import_react19 = __toESM(require_react(), 1);
787var import_dist121 = __toESM(require_dist(), 1);
788var import_dist122 = __toESM(require_dist2(), 1);
789var import_dist123 = __toESM(require_dist3(), 1);
790var import_dist109 = __toESM(require_dist(), 1);
791var import_dist110 = __toESM(require_dist2(), 1);
792var import_dist111 = __toESM(require_dist3(), 1);
793function isVariantLabel(v) {
794  return typeof v === "string" || Array.isArray(v);
795}
796var import_dist118 = __toESM(require_dist(), 1);
797var import_dist119 = __toESM(require_dist2(), 1);
798var import_dist120 = __toESM(require_dist3(), 1);
799var import_dist112 = __toESM(require_dist(), 1);
800var import_dist113 = __toESM(require_dist2(), 1);
801var import_dist114 = __toESM(require_dist3(), 1);
802function isAnimationControls(v) {
803  return v !== null && typeof v === "object" && typeof v.start === "function";
804}
805var import_dist115 = __toESM(require_dist(), 1);
806var import_dist116 = __toESM(require_dist2(), 1);
807var import_dist117 = __toESM(require_dist3(), 1);
808var variantPriorityOrder = [
809  "animate",
810  "whileInView",
811  "whileFocus",
812  "whileHover",
813  "whileTap",
814  "whileDrag",
815  "exit"
816];
817var variantProps = ["initial", ...variantPriorityOrder];
818function isControllingVariants(props) {
819  return isAnimationControls(props.animate) || variantProps.some((name) => isVariantLabel(props[name]));
820}
821function isVariantNode(props) {
822  return Boolean(isControllingVariants(props) || props.variants);
823}
824function getCurrentTreeVariants(props, context) {
825  if (isControllingVariants(props)) {
826    const { initial, animate: animate2 } = props;
827    return {
828      initial: initial === false || isVariantLabel(initial) ? initial : void 0,
829      animate: isVariantLabel(animate2) ? animate2 : void 0
830    };
831  }
832  return props.inherit !== false ? context : {};
833}
834function useCreateMotionContext(props) {
835  const { initial, animate: animate2 } = getCurrentTreeVariants(props, (0, import_react19.useContext)(MotionContext));
836  return (0, import_react19.useMemo)(() => ({ initial, animate: animate2 }), [variantLabelsAsDependency(initial), variantLabelsAsDependency(animate2)]);
837}
838function variantLabelsAsDependency(prop) {
839  return Array.isArray(prop) ? prop.join(" ") : prop;
840}
841var import_dist127 = __toESM(require_dist(), 1);
842var import_dist128 = __toESM(require_dist2(), 1);
843var import_dist129 = __toESM(require_dist3(), 1);
844var motionComponentSymbol = Symbol.for("motionComponentSymbol");
845var import_dist133 = __toESM(require_dist(), 1);
846var import_dist134 = __toESM(require_dist2(), 1);
847var import_dist135 = __toESM(require_dist3(), 1);
848var import_react20 = __toESM(require_react(), 1);
849var import_dist130 = __toESM(require_dist(), 1);
850var import_dist131 = __toESM(require_dist2(), 1);
851var import_dist132 = __toESM(require_dist3(), 1);
852function isRefObject(ref) {
853  return ref && typeof ref === "object" && Object.prototype.hasOwnProperty.call(ref, "current");
854}
855function useMotionRef(visualState, visualElement, externalRef) {
856  return (0, import_react20.useCallback)(
857    (instance) => {
858      if (instance) {
859        visualState.onMount && visualState.onMount(instance);
860      }
861      if (visualElement) {
862        if (instance) {
863          visualElement.mount(instance);
864        } else {
865          visualElement.unmount();
866        }
867      }
868      if (externalRef) {
869        if (typeof externalRef === "function") {
870          externalRef(instance);
871        } else if (isRefObject(externalRef)) {
872          externalRef.current = instance;
873        }
874      }
875    },
876    /**
877     * Only pass a new ref callback to React if we've received a visual element
878     * factory. Otherwise we'll be mounting/remounting every time externalRef
879     * or other dependencies change.
880     */
881    [visualElement]
882  );
883}
884var import_dist148 = __toESM(require_dist(), 1);
885var import_dist149 = __toESM(require_dist2(), 1);
886var import_dist150 = __toESM(require_dist3(), 1);
887var import_react22 = __toESM(require_react(), 1);
888var import_dist139 = __toESM(require_dist(), 1);
889var import_dist140 = __toESM(require_dist2(), 1);
890var import_dist141 = __toESM(require_dist3(), 1);
891var import_dist136 = __toESM(require_dist(), 1);
892var import_dist137 = __toESM(require_dist2(), 1);
893var import_dist138 = __toESM(require_dist3(), 1);
894var camelToDash = (str) => str.replace(/([a-z])([A-Z])/gu, "$1-$2").toLowerCase();
895var optimizedAppearDataId = "framerAppearId";
896var optimizedAppearDataAttribute = "data-" + camelToDash(optimizedAppearDataId);
897var import_dist142 = __toESM(require_dist(), 1);
898var import_dist143 = __toESM(require_dist2(), 1);
899var import_dist144 = __toESM(require_dist3(), 1);
900var { schedule: microtask, cancel: cancelMicrotask } = createRenderBatcher(queueMicrotask, false);
901var import_dist145 = __toESM(require_dist(), 1);
902var import_dist146 = __toESM(require_dist2(), 1);
903var import_dist147 = __toESM(require_dist3(), 1);
904var import_react21 = __toESM(require_react(), 1);
905var SwitchLayoutGroupContext = (0, import_react21.createContext)({});
906function useVisualElement(Component3, visualState, props, createVisualElement, ProjectionNodeConstructor) {
907  var _a, _b;
908  const { visualElement: parent } = (0, import_react22.useContext)(MotionContext);
909  const lazyContext = (0, import_react22.useContext)(LazyContext);
910  const presenceContext = (0, import_react22.useContext)(PresenceContext);
911  const reducedMotionConfig = (0, import_react22.useContext)(MotionConfigContext).reducedMotion;
912  const visualElementRef = (0, import_react22.useRef)(null);
913  createVisualElement = createVisualElement || lazyContext.renderer;
914  if (!visualElementRef.current && createVisualElement) {
915    visualElementRef.current = createVisualElement(Component3, {
916      visualState,
917      parent,
918      props,
919      presenceContext,
920      blockInitialAnimation: presenceContext ? presenceContext.initial === false : false,
921      reducedMotionConfig
922    });
923  }
924  const visualElement = visualElementRef.current;
925  const initialLayoutGroupConfig = (0, import_react22.useContext)(SwitchLayoutGroupContext);
926  if (visualElement && !visualElement.projection && ProjectionNodeConstructor && (visualElement.type === "html" || visualElement.type === "svg")) {
927    createProjectionNode(visualElementRef.current, props, ProjectionNodeConstructor, initialLayoutGroupConfig);
928  }
929  const isMounted = (0, import_react22.useRef)(false);
930  (0, import_react22.useInsertionEffect)(() => {
931    if (visualElement && isMounted.current) {
932      visualElement.update(props, presenceContext);
933    }
934  });
935  const optimisedAppearId = props[optimizedAppearDataAttribute];
936  const wantsHandoff = (0, import_react22.useRef)(Boolean(optimisedAppearId) && !((_a = window.MotionHandoffIsComplete) === null || _a === void 0 ? void 0 : _a.call(window, optimisedAppearId)) && ((_b = window.MotionHasOptimisedAnimation) === null || _b === void 0 ? void 0 : _b.call(window, optimisedAppearId)));
937  useIsomorphicLayoutEffect(() => {
938    if (!visualElement)
939      return;
940    isMounted.current = true;
941    window.MotionIsMounted = true;
942    visualElement.updateFeatures();
943    microtask.render(visualElement.render);
944    if (wantsHandoff.current && visualElement.animationState) {
945      visualElement.animationState.animateChanges();
946    }
947  });
948  (0, import_react22.useEffect)(() => {
949    if (!visualElement)
950      return;
951    if (!wantsHandoff.current && visualElement.animationState) {
952      visualElement.animationState.animateChanges();
953    }
954    if (wantsHandoff.current) {
955      queueMicrotask(() => {
956        var _a2;
957        (_a2 = window.MotionHandoffMarkAsComplete) === null || _a2 === void 0 ? void 0 : _a2.call(window, optimisedAppearId);
958      });
959      wantsHandoff.current = false;
960    }
961  });
962  return visualElement;
963}
964function createProjectionNode(visualElement, props, ProjectionNodeConstructor, initialPromotionConfig) {
965  const { layoutId, layout: layout2, drag: drag2, dragConstraints, layoutScroll, layoutRoot } = props;
966  visualElement.projection = new ProjectionNodeConstructor(visualElement.latestValues, props["data-framer-portal-id"] ? void 0 : getClosestProjectingNode(visualElement.parent));
967  visualElement.projection.setOptions({
968    layoutId,
969    layout: layout2,
970    alwaysMeasureLayout: Boolean(drag2) || dragConstraints && isRefObject(dragConstraints),
971    visualElement,
972    /**
973     * TODO: Update options in an effect. This could be tricky as it'll be too late
974     * to update by the time layout animations run.
975     * We also need to fix this safeToRemove by linking it up to the one returned by usePresence,
976     * ensuring it gets called if there's no potential layout animations.
977     *
978     */
979    animationType: typeof layout2 === "string" ? layout2 : "both",
980    initialPromotionConfig,
981    layoutScroll,
982    layoutRoot
983  });
984}
985function getClosestProjectingNode(visualElement) {
986  if (!visualElement)
987    return void 0;
988  return visualElement.options.allowProjection !== false ? visualElement.projection : getClosestProjectingNode(visualElement.parent);
989}
990function createRendererMotionComponent({ preloadedFeatures, createVisualElement, useRender, useVisualState: useVisualState2, Component: Component3 }) {
991  var _a, _b;
992  preloadedFeatures && loadFeatures(preloadedFeatures);
993  function MotionComponent(props, externalRef) {
994    let MeasureLayout2;
995    const configAndProps = {
996      ...(0, import_react23.useContext)(MotionConfigContext),
997      ...props,
998      layoutId: useLayoutId(props)
999    };
1000    const { isStatic } = configAndProps;
1001    const context = useCreateMotionContext(props);
1002    const visualState = useVisualState2(props, isStatic);
1003    if (!isStatic && isBrowser) {
1004      useStrictMode(configAndProps, preloadedFeatures);
1005      const layoutProjection = getProjectionFunctionality(configAndProps);
1006      MeasureLayout2 = layoutProjection.MeasureLayout;
1007      context.visualElement = useVisualElement(Component3, visualState, configAndProps, createVisualElement, layoutProjection.ProjectionNode);
1008    }
1009    return (0, import_jsx_runtime7.jsxs)(MotionContext.Provider, { value: context, children: [MeasureLayout2 && context.visualElement ? (0, import_jsx_runtime7.jsx)(MeasureLayout2, { visualElement: context.visualElement, ...configAndProps }) : null, useRender(Component3, props, useMotionRef(visualState, context.visualElement, externalRef), visualState, isStatic, context.visualElement)] });
1010  }
1011  MotionComponent.displayName = `motion.${typeof Component3 === "string" ? Component3 : `
1011create(${(_b = (_a = Component3.displayName) !== null && _a !== void 0 ? _a : Component3.name) !== null && _b !== void 0 ? _b : ""})`}`;
1012  const ForwardRefMotionComponent = (0, import_react23.forwardRef)(MotionComponent);
1013  ForwardRefMotionComponent[motionComponentSymbol] = Component3;
1014  return ForwardRefMotionComponent;
1015}
1016function useLayoutId({ layoutId }) {
1017  const layoutGroupId = (0, import_react23.useContext)(LayoutGroupContext).id;
1018  return layoutGroupId && layoutId !== void 0 ? layoutGroupId + "-" + layoutId : layoutId;
1019}
1020function useStrictMode(configAndProps, preloadedFeatures) {
1021  const isStrict = (0, import_react23.useContext)(LazyContext).strict;
1022  if (preloadedFeatures && isStrict) {
1023    const strictMessage = "You have rendered a `motion` component within a `LazyMotion` component. This will break tree shaking. Import and render a `m` component instead.";
1024    configAndProps.ignoreStrict ? warning(false, strictMessage) : invariant(false, strictMessage);
1025  }
1026}
1027function getProjectionFunctionality(props) {
1028  const { drag: drag2, layout: layout2 } = featureDefinitions;
1029  if (!drag2 && !layout2)
1030    return {};
1031  const combined = { ...drag2, ...layout2 };
1032  return {
1033    MeasureLayout: (drag2 === null || drag2 === void 0 ? void 0 : drag2.isEnabled(props)) || (layout2 === null || layout2 === void 0 ? void 0 : layout2.isEnabled(props)) ? combined.MeasureLayout : void 0,
1034    ProjectionNode: combined.ProjectionNode
1035  };
1036}
1037var import_dist157 = __toESM(require_dist(), 1);
1038var import_dist158 = __toESM(require_dist2(), 1);
1039var import_dist159 = __toESM(require_dist3(), 1);
1040var import_dist154 = __toESM(require_dist(), 1);
1041var import_dist155 = __toESM(require_dist2(), 1);
1042var import_dist156 = __toESM(require_dist3(), 1);
1043var lowercaseSVGElements = [
1044  "animate",
1045  "circle",
1046  "defs",
1047  "desc",
1048  "ellipse",
1049  "g",
1050  "image",
1051  "line",
1052  "filter",
1053  "marker",
1054  "mask",
1055  "metadata",
1056  "path",
1057  "pattern",
1058  "polygon",
1059  "polyline",
1060  "rect",
1061  "stop",
1062  "switch",
1063  "symbol",
1064  "svg",
1065  "text",
1066  "tspan",
1067  "use",
1068  "view"
1069];
1070function isSVGComponent(Component3) {
1071  if (
1072    /**
1073     * If it's not a string, it's a custom React component. Currently we only support
1074     * HTML custom React components.
1075     */
1076    typeof Component3 !== "string" || /**
1077    * If it contains a dash, the element is a custom HTML webcomponent.
1078    */
1079    Component3.includes("-")
1080  ) {
1081    return false;
1082  } else if (
1083    /**
1084     * If it's in our list of lowercase SVG tags, it's an SVG component
1085     */
1086    lowercaseSVGElements.indexOf(Component3) > -1 || /**
1087    * If it contains a capital letter, it's an SVG component
1088    */
1089    /[A-Z]/u.test(Component3)
1090  ) {
1091    return true;
1092  }
1093  return false;
1094}
1095var import_dist253 = __toESM(require_dist(), 1);
1096var import_dist254 = __toESM(require_dist2(), 1);
1097var import_dist255 = __toESM(require_dist3(), 1);
1098var import_dist175 = __toESM(require_dist(), 1);
1099var import_dist176 = __toESM(require_dist2(), 1);
1100var import_dist177 = __toESM(require_dist3(), 1);
1101var import_react24 = __toESM(require_react(), 1);
1102var import_dist160 = __toESM(require_dist(), 1);
1103var import_dist161 = __toESM(require_dist2(), 1);
1104var import_dist162 = __toESM(require_dist3(), 1);
1105function getValueState(visualElement) {
1106  const state2 = [{}, {}];
1107  visualElement === null || visualElement === void 0 ? void 0 : visualElement.values.forEach((value, key) => {
1108    state2[0][key] = value.get();
1109    state2[1][key] = value.getVelocity();
1110  });
1111  return state2;
1112}
1113function resolveVariantFromProps(props, definition, custom, visualElement) {
1114  if (typeof definition === "function") {
1115    const [current, velocity] = getValueState(visualElement);
1116    definition = definition(custom !== void 0 ? custom : props.custom, current, velocity);
1117  }
1118  if (typeof definition === "string") {
1119    definition = props.variants && props.variants[definition];
1120  }
1121  if (typeof definition === "function") {
1122    const [current, velocity] = getValueState(visualElement);
1123    definition = definition(custom !== void 0 ? custom : props.custom, current, velocity);
1124  }
1125  return definition;
1126}
1127var import_dist172 = __toESM(require_dist(), 1);
1128var import_dist173 = __toESM(require_dist2(), 1);
1129var import_dist174 = __toESM(require_dist3(), 1);
1130var import_dist166 = __toESM(require_dist(), 1);
1131var import_dist167 = __toESM(require_dist2(), 1);
1132var import_dist168 = __toESM(require_dist3(), 1);
1133var import_dist163 = __toESM(require_dist(), 1);
1134var import_dist164 = __toESM(require_dist2(), 1);
1135var import_dist165 = __toESM(require_dist3(), 1);
1136var isKeyframesTarget = (v) => {
1137  return Array.isArray(v);
1138};
1139var isCustomValue = (v) => {
1140  return Boolean(v && typeof v === "object" && v.mix && v.toValue);
1141};
1142var resolveFinalValueInKeyframes = (v) => {
1143  return isKeyframesTarget(v) ? v[v.length - 1] || 0 : v;
1144};
1145var import_dist169 = __toESM(require_dist(), 1);
1146var import_dist170 = __toESM(require_dist2(), 1);
1147var import_dist171 = __toESM(require_dist3(), 1);
1148var isMotionValue = (value) => Boolean(value && value.getVelocity);
1149function resolveMotionValue(value) {
1150  const unwrappedValue = isMotionValue(value) ? value.get() : value;
1151  return isCustomValue(unwrappedValue) ? unwrappedValue.toValue() : unwrappedValue;
1152}
1153function makeState({ scrapeMotionValuesFromProps: scrapeMotionValuesFromProps3, 
1153createRenderState, onUpdate }, props, context, presenceContext) {
1154  const state2 = {
1155    latestValues: makeLatestValues(props, context, presenceContext, scrapeMotionValuesFromProps3),
1156    renderState: createRenderState()
1157  };
1158  if (onUpdate) {
1159    state2.onMount = (instance) => onUpdate({ props, current: instance, ...state2 });
1160    state2.onUpdate = (visualElement) => onUpdate(visualElement);
1161  }
1162  return state2;
1163}
1164var makeUseVisualState = (config) => (props, isStatic) => {
1165  const context = (0, import_react24.useContext)(MotionContext);
1166  const presenceContext = (0, import_react24.useContext)(PresenceContext);
1167  const make = () => makeState(config, props, context, presenceContext);
1168  return isStatic ? make() : useConstant(make);
1169};
1170function makeLatestValues(props, context, presenceContext, scrapeMotionValues) {
1171  const values = {};
1172  const motionValues = scrapeMotionValues(props, {});
1173  for (const key in motionValues) {
1174    values[key] = resolveMotionValue(motionValues[key]);
1175  }
1176  let { initial, animate: animate2 } = props;
1177  const isControllingVariants$1 = isControllingVariants(props);
1178  const isVariantNode$1 = isVariantNode(props);
1179  if (context && isVariantNode$1 && !isControllingVariants$1 && props.inherit !== false) {
1180    if (initial === void 0)
1181      initial = context.initial;
1182    if (animate2 === void 0)
1183      animate2 = context.animate;
1184  }
1185  let isInitialAnimationBlocked = presenceContext ? presenceContext.initial === false : false;
1186  isInitialAnimationBlocked = isInitialAnimationBlocked || initial === false;
1187  const variantToSet = isInitialAnimationBlocked ? animate2 : initial;
1188  if (variantToSet && typeof variantToSet !== "boolean" && !isAnimationControls(variantToSet)) {
1189    const list = Array.isArray(variantToSet) ? variantToSet : [variantToSet];
1190    for (let i = 0; i < list.length; i++) {
1191      const resolved = resolveVariantFromProps(props, list[i]);
1192      if (resolved) {
1193        const { transitionEnd, transition, ...target } = resolved;
1194        for (const key in target) {
1195          let valueTarget = target[key];
1196          if (Array.isArray(valueTarget)) {
1197            const index = isInitialAnimationBlocked ? valueTarget.length - 1 : 0;
1198            valueTarget = valueTarget[index];
1199          }
1200          if (valueTarget !== null) {
1201            values[key] = valueTarget;
1202          }
1203        }
1204        for (const key in transitionEnd) {
1205          values[key] = transitionEnd[key];
1206        }
1207      }
1208    }
1209  }
1210  return values;
1211}
1212var import_dist178 = __toESM(require_dist(), 1);
1213var import_dist179 = __toESM(require_dist2(), 1);
1214var import_dist180 = __toESM(require_dist3(), 1);
1215var transformPropOrder = [
1216  "transformPerspective",
1217  "x",
1218  "y",
1219  "z",
1220  "translateX",
1221  "translateY",
1222  "translateZ",
1223  "scale",
1224  "scaleX",
1225  "scaleY",
1226  "rotate",
1227  "rotateX",
1228  "rotateY",
1229  "rotateZ",
1230  "skew",
1231  "skewX",
1232  "skewY"
1233];
1234var transformProps = new Set(transformPropOrder);
1235var import_dist220 = __toESM(require_dist(), 1);
1236var import_dist221 = __toESM(require_dist2(), 1);
1237var import_dist222 = __toESM(require_dist3(), 1);
1238var import_dist211 = __toESM(require_dist(), 1);
1239var import_dist212 = __toESM(require_dist2(), 1);
1240var import_dist213 = __toESM(require_dist3(), 1);
1241var import_dist181 = __toESM(require_dist(), 1);
1242var import_dist182 = __toESM(require_dist2(), 1);
1243var import_dist183 = __toESM(require_dist3(), 1);
1244var checkStringStartsWith = (token) => (key) => typeof key === "string" && key.startsWith(token);
1245var isCSSVariableName = checkStringStartsWith("--");
1246var startsAsVariableToken = checkStringStartsWith("var(--");
1247var isCSSVariableToken = (value) => {
1248  const startsWithToken = startsAsVariableToken(value);
1249  if (!startsWithToken)
1250    return false;
1251  return singleCssVariableRegex.test(value.split("/*")[0].trim());
1252};
1253var singleCssVariableRegex = /var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu;
1254var import_dist184 = __toESM(require_dist(), 1);
1255var import_dist185 = __toESM(require_dist2(), 1);
1256var import_dist186 = __toESM(require_dist3(), 1);
1257var getValueAsType = (value, type) => {
1258  return type && typeof value === "number" ? type.transform(value) : value;
1259};
1260var import_dist205 = __toESM(require_dist(), 1);
1261var import_dist206 = __toESM(require_dist2(), 1);
1262var import_dist207 = __toESM(require_dist3(), 1);
1263var import_dist190 = __toESM(require_dist(), 1);
1264var import_dist191 = __toESM(require_dist2(), 1);
1265var import_dist192 = __toESM(require_dist3(), 1);
1266var import_dist187 = __toESM(require_dist(), 1);
1267var import_dist188 = __toESM(require_dist2(), 1);
1268var import_dist189 = __toESM(require_dist3(), 1);
1269var clamp = (min, max, v) => {
1270  if (v > max)
1271    return max;
1272  if (v < min)
1273    return min;
1274  return v;
1275};
1276var number = {
1277  test: (v) => typeof v === "number",
1278  parse: parseFloat,
1279  transform: (v) => v
1280};
1281var alpha = {
1282  ...number,
1283  transform: (v) => clamp(0, 1, v)
1284};
1285var scale = {
1286  ...number,
1287  default: 1
1288};
1289var import_dist193 = __toESM(require_dist(), 1);
1290var import_dist194 = __toESM(require_dist2(), 1);
1291var import_dist195 = __toESM(require_dist3(), 1);
1292var createUnitType = (unit) => ({
1293  test: (v) => typeof v === "string" && v.endsWith(unit) && v.split(" ").length === 1,
1294  parse: parseFloat,
1295  transform: (v) => `${v}${unit}`
1296});
1297var degrees = createUnitType("deg");
1298var percent = createUnitType("%");
1299var px = createUnitType("px");
1300var vh = createUnitType("vh");
1301var vw = createUnitType("vw");
1302var progressPercentage = {
1303  ...percent,
1304  parse: (v) => percent.parse(v) / 100,
1305  transform: (v) => percent.transform(v * 100)
1306};
1307var import_dist196 = __toESM(require_dist(), 1);
1308var import_dist197 = __toESM(require_dist2(), 1);
1309var import_dist198 = __toESM(require_dist3(), 1);
1310var browserNumberValueTypes = {
1311  // Border props
1312  borderWidth: px,
1313  borderTopWidth: px,
1314  borderRightWidth: px,
1315  borderBottomWidth: px,
1316  borderLeftWidth: px,
1317  borderRadius: px,
1318  radius: px,
1319  borderTopLeftRadius: px,
1320  borderTopRightRadius: px,
1321  borderBottomRightRadius: px,
1322  borderBottomLeftRadius: px,
1323  // Positioning props
1324  width: px,
1325  maxWidth: px,
1326  height: px,
1327  maxHeight: px,
1328  top: px,
1329  right: px,
1330  bottom: px,
1331  left: px,
1332  // Spacing props
1333  padding: px,
1334  paddingTop: px,
1335  paddingRight: px,
1336  paddingBottom: px,
1337  paddingLeft: px,
1338  margin: px,
1339  marginTop: px,
1340  marginRight: px,
1341  marginBottom: px,
1342  marginLeft: px,
1343  // Misc
1344  backgroundPositionX: px,
1345  backgroundPositionY: px
1346};
1347var import_dist199 = __toESM(require_dist(), 1);
1348var import_dist200 = __toESM(require_dist2(), 1);
1349var import_dist201 = __toESM(require_dist3(), 1);
1350var transformValueTypes = {
1351  rotate: degrees,
1352  rotateX: degrees,
1353  rotateY: degrees,
1354  rotateZ: degrees,
1355  scale,
1356  scaleX: scale,
1357  scaleY: scale,
1358  scaleZ: scale,
1359  skew: degrees,
1360  skewX: degrees,
1361  skewY: degrees,
1362  distance: px,
1363  translateX: px,
1364  translateY: px,
1365  translateZ: px,
1366  x: px,
1367  y: px,
1368  z: px,
1369  perspective: px,
1370  transformPerspective: px,
1371  opacity: alpha,
1372  originX: progressPercentage,
1373  originY: progressPercentage,
1374  originZ: px
1375};
1376var import_dist202 = __toESM(require_dist(), 1);
1377var import_dist203 = __toESM(require_dist2(), 1);
1378var import_dist204 = __toESM(require_dist3(), 1);
1379var int = {
1380  ...number,
1381  transform: Math.round
1382};
1383var numberValueTypes = {
1384  ...browserNumberValueTypes,
1385  ...transformValueTypes,
1386  zIndex: int,
1387  size: px,
1388  // SVG
1389  fillOpacity: alpha,
1390  strokeOpacity: alpha,
1391  numOctaves: int
1392};
1393var import_dist208 = __toESM(require_dist(), 1);
1394var import_dist209 = __toESM(require_dist2(), 1);
1395var import_dist210 = __toESM(require_dist3(), 1);
1396var translateAlias = {
1397  x: "translateX",
1398  y: "translateY",
1399  z: "translateZ",
1400  transformPerspective: "perspective"
1401};
1402var numTransforms = transformPropOrder.length;
1403function buildTransform(latestValues, transform2, transformTemplate) {
1404  let transformString = "";
1405  let transformIsDefault = true;
1406  for (let i = 0; i < numTransforms; i++) {
1407    const key = transformPropOrder[i];
1408    const value = latestValues[key];
1409    if (value === void 0)
1410      continue;
1411    let valueIsDefault = true;
1412    if (typeof value === "number") {
1413      valueIsDefault = value === (key.startsWith("scale") ? 1 : 0);
1414    } else {
1415      valueIsDefault = parseFloat(value) === 0;
1416    }
1417    if (!valueIsDefault || transformTemplate) {
1418      const valueAsType = getValueAsType(value, numberValueTypes[key]);
1419      if (!valueIsDefault) {
1420        transformIsDefault = false;
1421        const transformName = translateAlias[key] || key;
1422        transformString += `${transformName}(${valueAsType}) `;
1423      }
1424      if (transformTemplate) {
1425        transform2[key] = valueAsType;
1426      }
1427    }
1428  }
1429  transformString = transformString.trim();
1430  if (transformTemplate) {
1431    transformString = transformTemplate(transform2, transformIsDefault ? "" : transformString);
1432  } else if (transformIsDefault) {
1433    transformString = "none";
1434  }
1435  return transformString;
1436}
1437function buildHTMLStyles(state2, latestValues, transformTemplate) {
1438  const { style, vars, transformOrigin } = state2;
1439  let hasTransform2 = false;
1440  let hasTransformOrigin = false;
1441  for (const key in latestValues) {
1442    const value = latestValues[key];
1443    if (transformProps.has(key)) {
1444      hasTransform2 = true;
1445      continue;
1446    } else if (isCSSVariableName(key)) {
1447      vars[key] = value;
1448      continue;
1449    } else {
1450      const valueAsType = getValueAsType(value, numberValueTypes[key]);
1451      if (key.startsWith("origin")) {
1452        hasTransformOrigin = true;
1453        transformOrigin[key] = valueAsType;
1454      } else {
1455        style[key] = valueAsType;
1456      }
1457    }
1458  }
1459  if (!latestValues.transform) {
1460    if (hasTransform2 || transformTemplate) {
1461      style.transform = buildTransform(latestValues, state2.transform, transformTemplate);
1462    } else if (style.transform) {
1463      style.transform = "none";
1464    }
1465  }
1466  if (hasTransformOrigin) {
1467    const { originX = "50%", originY = "50%", originZ = 0 } = transformOrigin;
1468    style.transformOrigin = `${originX} ${originY} ${originZ}`;
1469  }
1470}
1471var import_dist214 = __toESM(require_dist(), 1);
1472var import_dist215 = __toESM(require_dist2(), 1);
1473var import_dist216 = __toESM(require_dist3(), 1);
1474var dashKeys = {
1475  offset: "stroke-dashoffset",
1476  array: "stroke-dasharray"
1477};
1478var camelKeys = {
1479  offset: "strokeDashoffset",
1480  array: "strokeDasharray"
1481};
1482function buildSVGPath(attrs, length, spacing = 1, offset = 0, useDashCase = true) {
1483  attrs.pathLength = 1;
1484  const keys2 = useDashCase ? dashKeys : camelKeys;
1485  attrs[keys2.offset] = px.transform(-offset);
1486  const pathLength = px.transform(length);
1487  const pathSpacing = px.transform(spacing);
1488  attrs[keys2.array] = `${pathLength} ${pathSpacing}`;
1489}
1490var import_dist217 = __toESM(require_dist(), 1);
1491var import_dist218 = __toESM(require_dist2(), 1);
1492var import_dist219 = __toESM(require_dist3(), 1);
1493function calcOrigin(origin, offset, size) {
1494  return typeof origin === "string" ? origin : px.transform(offset + size * origin);
1495}
1496function calcSVGTransformOrigin(dimensions, originX, originY) {
1497  const pxOriginX = calcOrigin(originX, dimensions.x, dimensions.width);
1498  const pxOriginY = calcOrigin(originY, dimensions.y, dimensions.height);
1499  return `${pxOriginX} ${pxOriginY}`;
1500}
1501function buildSVGAttrs(state2, {
1502  attrX,
1503  attrY,
1504  attrScale,
1505  originX,
1506  originY,
1507  pathLength,
1508  pathSpacing = 1,
1509  pathOffset = 0,
1510  // This is object creation, which we try to avoid per-frame.
1511  ...latest
1512}, isSVGTag2, transformTemplate) {
1513  buildHTMLStyles(state2, latest, transformTemplate);
1514  if (isSVGTag2) {
1515    if (state2.style.viewBox) {
1516      state2.attrs.viewBox = state2.style.viewBox;
1517    }
1518    return;
1519  }
1520  state2.attrs = state2.style;
1521  state2.style = {};
1522  const { attrs, style, dimensions } = state2;
1523  if (attrs.transform) {
1524    if (dimensions)
1525      style.transform = attrs.transform;
1526    delete attrs.transform;
1527  }
1528  if (dimensions && (originX !== void 0 || originY !== void 0 || style.transform)) {
1529    style.transformOrigin = calcSVGTransformOrigin(dimensions, originX !== void 0 ? originX : 0.5, originY !== void 0 ? originY : 0.5);
1530  }
1531  if (attrX !== void 0)
1532    attrs.x = attrX;
1533  if (attrY !== void 0)
1534    attrs.y = attrY;
1535  if (attrScale !== void 0)
1536    attrs.scale = attrScale;
1537  if (pathLength !== void 0) {
1538    buildSVGPath(attrs, pathLength, pathSpacing, pathOffset, false);
1539  }
1540}
1541var import_dist226 = __toESM(require_dist(), 1);
1542var import_dist227 = __toESM(require_dist2(), 1);
1543var import_dist228 = __toESM(require_dist3(), 1);
1544var import_dist223 = __toESM(require_dist(), 1);
1545var import_dist224 = __toESM(require_dist2(), 1);
1546var import_dist225 = __toESM(require_dist3(), 1);
1547var createHtmlRenderState = () => ({
1548  style: {},
1549  transform: {},
1550  transformOrigin: {},
1551  vars: {}
1552});
1553var createSvgRenderState = () => ({
1554  ...createHtmlRenderState(),
1555  attrs: {}
1556});
1557var import_dist229 = __toESM(require_dist(), 1);
1558var import_dist230 = __toESM(require_dist2(), 1);
1559var import_dist231 = __toESM(require_dist3(), 1);
1560var isSVGTag = (tag) => typeof tag === "string" && tag.toLowerCase() === "svg";
1561var import_dist238 = __toESM(require_dist(), 1);
1562var import_dist239 = __toESM(require_dist2(), 1);
1563var import_dist240 = __toESM(require_dist3(), 1);
1564var import_dist232 = __toESM(require_dist(), 1);
1565var import_dist233 = __toESM(require_dist2(), 1);
1566var import_dist234 = __toESM(require_dist3(), 1);
1567function renderHTML(element, { style, vars }, styleProp, projection) {
1568  Object.assign(element.style, style, projection && projection.getProjectionStyles(styleProp));
1569  for (const key in vars) {
1570    element.style.setProperty(key, vars[key]);
1571  }
1572}
1573var import_dist235 = __toESM(require_dist(), 1);
1574var import_dist236 = __toESM(require_dist2(), 1);
1575var import_dist237 = __toESM(require_dist3(), 1);
1576var camelCaseAttributes = /* @__PURE__ */ new Set([
1577  "baseFrequency",
1578  "diffuseConstant",
1579  "kernelMatrix",
1580  "kernelUnitLength",
1581  "keySplines",
1582  "keyTimes",
1583  "limitingConeAngle",
1584  "markerHeight",
1585  "markerWidth",
1586  "numOctaves",
1587  "targetX",
1588  "targetY",
1589  "surfaceScale",
1590  "specularConstant",
1591  "specularExponent",
1592  "stdDeviation",
1593  "tableValues",
1594  "viewBox",
1595  "gradientTransform",
1596  "pathLength",
1597  "startOffset",
1598  "textLength",
1599  "lengthAdjust"
1600]);
1601function renderSVG(element, renderState, _styleProp, projection) {
1602  renderHTML(element, renderState, void 0, projection);
1603  for (const key in renderState.attrs) {
1604    element.setAttribute(!camelCaseAttributes.has(key) ? camelToDash(key) : key, renderState.attrs[key]);
1605  }
1606}
1607var import_dist250 = __toESM(require_dist(), 1);
1608var import_dist251 = __toESM(require_dist2(), 1);
1609var import_dist252 = __toESM(require_dist3(), 1);
1610var import_dist247 = __toESM(require_dist(), 1);
1611var import_dist248 = __toESM(require_dist2(), 1);
1612var import_dist249 = __toESM(require_dist3(), 1);
1613var import_dist244 = __toESM(require_dist(), 1);
1614var import_dist245 = __toESM(require_dist2(), 1);
1615var import_dist246 = __toESM(require_dist3(), 1);
1616var import_dist241 = __toESM(require_dist(), 1);
1617var import_dist242 = __toESM(require_dist2(), 1);
1618var import_dist243 = __toESM(require_dist3(), 1);
1619var scaleCorrectors = {};
1620function addScaleCorrector(correctors) {
1621  Object.assign(scaleCorrectors, correctors);
1622}
1623function isForcedMotionValue(key, { layout: layout2, layoutId }) {
1624  return transformProps.has(key) || key.startsWith("origin") || (layout2 || layoutId !== void 0) && (!!scaleCorrectors[key] || key === "opacity");
1625}
1626function scrapeMotionValuesFromProps(props, prevProps, visualElement) {
1627  var _a;
1628  const { style } = props;
1629  const newValues = {};
1630  for (const key in style) {
1631    if (isMotionValue(style[key]) || prevProps.style && isMotionValue(prevProps.style[key]) || isForcedMotionValue(key, props) || ((_a = visualElement === null || visualElement === void 0 ? void 0 : visualElement.getValue(key)) === null || _a === void 0 ? void 0 : _a.liveStyle) !== void 0) {
1632      newValues[key] = style[key];
1633    }
1634  }
1635  return newValues;
1636}
1637function scrapeMotionValuesFromProps2(props, prevProps, visualElement) {
1638  const newValues = scrapeMotionValuesFromProps(props, prevProps, visualElement);
1639  for (const key in props) {
1640    if (isMotionValue(props[key]) || isMotionValue(prevProps[key])) {
1641      const targetKey = transformPropOrder.indexOf(key) !== -1 ? "attr" + key.charAt(0).toUpperCase() + key.substring(1) : key;
1642      newValues[targetKey] = props[key];
1643    }
1644  }
1645  return newValues;
1646}
1647function updateSVGDimensions(instance, renderState) {
1648  try {
1649    renderState.dimensions = typeof instance.getBBox === "function" ? instance.getBBox() : instance.getBoundingClientRect();
1650  } catch (e) {
1651    renderState.dimensions = {
1652      x: 0,
1653      y: 0,
1654      width: 0,
1655      height: 0
1656    };
1657  }
1658}
1659var layoutProps = ["x", "y", "width", "height", "cx", "cy", "r"];
1660var svgMotionConfig = {
1661  useVisualState: makeUseVisualState({
1662    scrapeMotionValuesFromProps: scrapeMotionValuesFromProps2,
1663    createRenderState: createSvgRenderState,
1664    onUpdate: ({ props, prevProps, current, renderState, latestValues }) => {
1665      if (!current)
1666        return;
1667      let hasTransform2 = !!props.drag;
1668      if (!hasTransform2) {
1669        for (const key in latestValues) {
1670          if (transformProps.has(key)) {
1671            hasTransform2 = true;
1672            break;
1673          }
1674        }
1675      }
1676      if (!hasTransform2)
1677        return;
1678      let needsMeasure = !prevProps;
1679      if (prevProps) {
1680        for (let i = 0; i < layoutProps.length; i++) {
1681          const key = layoutProps[i];
1682          if (props[key] !== prevProps[key]) {
1683            needsMeasure = true;
1684          }
1685        }
1686      }
1687      if (!needsMeasure)
1688        return;
1689      frame.read(() => {
1690        updateSVGDimensions(current, renderState);
1691        frame.render(() => {
1692          buildSVGAttrs(renderState, latestValues, isSVGTag(current.tagName), props.transformTemplate);
1693          renderSVG(current, renderState);
1694        });
1695      });
1696    }
1697  })
1698};
1699var import_dist256 = __toESM(require_dist(), 1);
1700var import_dist257 = __toESM(require_dist2(), 1);
1701var import_dist258 = __toESM(require_dist3(), 1);
1702var htmlMotionConfig = {
1703  useVisualState: makeUseVisualState({
1704    scrapeMotionValuesFromProps,
1705    createRenderState: createHtmlRenderState
1706  })
1707};
1708var import_dist265 = __toESM(require_dist(), 1);
1709var import_dist266 = __toESM(require_dist2(), 1);
1710var import_dist267 = __toESM(require_dist3(), 1);
1711var import_react27 = __toESM(require_react(), 1);
1712var import_dist259 = __toESM(require_dist(), 1);
1713var import_dist260 = __toESM(require_dist2(), 1);
1714var import_dist261 = __toESM(require_dist3(), 1);
1715var import_react25 = __toESM(require_react(), 1);
1716function copyRawValuesOnly(target, source, props) {
1717  for (const key in source) {
1718    if (!isMotionValue(source[key]) && !isForcedMotionValue(key, props)) {
1719      target[key] = source[key];
1720    }
1721  }
1722}
1723function useInitialMotionValues({ transformTemplate }, visualState) {
1724  return (0, import_react25.useMemo)(() => {
1725    const state2 = createHtmlRenderState();
1726    buildHTMLStyles(state2, visualState, transformTemplate);
1727    return Object.assign({}, state2.vars, state2.style);
1728  }, [visualState]);
1729}
1730function useStyle(props, visualState) {
1731  const styleProp = props.style || {};
1732  const style = {};
1733  copyRawValuesOnly(style, styleProp, props);
1734  Object.assign(style, useInitialMotionValues(props, visualState));
1735  return style;
1736}
1737function useHTMLProps(props, visualState) {
1738  const htmlProps = {};
1739  const style = useStyle(props, visualState);
1740  if (props.drag && props.dragListener !== false) {
1741    htmlProps.draggable = false;
1742    style.userSelect = style.WebkitUserSelect = style.WebkitTouchCallout = "none";
1743    style.touchAction = props.drag === true ? "none" : `pan-${props.drag === "x" ? "y" : "x"}`;
1744  }
1745  if (props.tabIndex === void 0 && (props.onTap || props.onTapStart || props.whileTap)) {
1746    htmlProps.tabIndex = 0;
1747  }
1748  htmlProps.style = style;
1749  return htmlProps;
1750}
1751var import_dist262 = __toESM(require_dist(), 1);
1752var import_dist263 = __toESM(require_dist2(), 1);
1753var import_dist264 = __toESM(require_dist3(), 1);
1754var import_react26 = __toESM(require_react(), 1);
1755function useSVGProps(props, visualState, _isStatic, Component3) {
1756  const visualProps = (0, import_react26.useMemo)(() => {
1757    const state2 = createSvgRenderState();
1758    buildSVGAttrs(state2, visualState, isSVGTag(Component3), props.transformTemplate);
1759    return {
1760      ...state2.attrs,
1761      style: { ...state2.style }
1762    };
1763  }, [visualState]);
1764  if (props.style) {
1765    const rawStyles = {};
1766    copyRawValuesOnly(rawStyles, props.style, props);
1767    visualProps.style = { ...rawStyles, ...visualProps.style };
1768  }
1769  return visualProps;
1770}
1771function createUseRender(forwardMotionProps = false) {
1772  const useRender = (Component3, props, ref, { latestValues }, isStatic) => {
1773    const useVisualProps = isSVGComponent(Component3) ? useSVGProps : useHTMLProps;
1774    const visualProps = useVisualProps(props, latestValues, isStatic, Component3);
1775    const filteredProps = filterProps(props, typeof Component3 === "string", forwardMotionProps);
1776    const elementProps = Component3 !== import_react27.Fragment ? { ...filteredProps, ...visualProps, ref } : {};
1777    const { children } = props;
1778    const renderedChildren = (0, import_react27.useMemo)(() => isMotionValue(children) ? children.get() : children, [children]);
1779    return (0, import_react27.createElement)(Component3, {
1780      ...elementProps,
1781      children: renderedChildren
1782    });
1783  };
1784  return useRender;
1785}
1786function createMotionComponentFactory(preloadedFeatures, createVisualElement) {
1787  return function createMotionComponent2(Component3, { forwardMotionProps } = { forwardMotionProps: false }) {
1788    const baseConfig = isSVGComponent(Component3) ? svgMotionConfig : htmlMotionConfig;
1789    const config = {
1790      ...baseConfig,
1791      preloadedFeatures,
1792      useRender: createUseRender(forwardMotionProps),
1793      createVisualElement,
1794      Component: Component3
1795    };
1796    return createRendererMotionComponent(config);
1797  };
1798}
1799var createMinimalMotionComponent = createMotionComponentFactory();
1800var m = createDOMMotionComponentProxy(createMinimalMotionComponent);
1801var import_dist808 = __toESM(require_dist(), 1);
1802var import_dist809 = __toESM(require_dist2(), 1);
1803var import_dist810 = __toESM(require_dist3(), 1);
1804var import_dist805 = __toESM(require_dist(), 1);
1805var import_dist806 = __toESM(require_dist2(), 1);
1806var import_dist807 = __toESM(require_dist3(), 1);
1807var import_dist643 = __toESM(require_dist(), 1);
1808var import_dist644 = __toESM(require_dist2(), 1);
1809var import_dist645 = __toESM(require_dist3(), 1);
1810var import_dist637 = __toESM(require_dist(), 1);
1811var import_dist638 = __toESM(require_dist2(), 1);
1812var import_dist639 = __toESM(require_dist3(), 1);
1813var import_dist631 = __toESM(require_dist(), 1);
1814var import_dist632 = __toESM(require_dist2(), 1);
1815var import_dist633 = __toESM(require_dist3(), 1);
1816var import_dist277 = __toESM(require_dist(), 1);
1817var import_dist278 = __toESM(require_dist2(), 1);
1818var import_dist279 = __toESM(require_dist3(), 1);
1819function shallowCompare(next, prev) {
1820  if (!Array.isArray(prev))
1821    return false;
1822  const prevLength = prev.length;
1823  if (prevLength !== next.length)
1824    return false;
1825  for (let i = 0; i < prevLength; i++) {
1826    if (prev[i] !== next[i])
1827      return false;
1828  }
1829  return true;
1830}
1831var import_dist280 = __toESM(require_dist(), 1);
1832var import_dist281 = __toESM(require_dist2(), 1);
1833var import_dist282 = __toESM(require_dist3(), 1);
1834function resolveVariant(visualElement, definition, custom) {
1835  const props = visualElement.getProps();
1836  return resolveVariantFromProps(props, definition, custom !== void 0 ? custom : props.custom, visualElement);
1837}
1838var import_dist625 = __toESM(require_dist(), 1);
1839var import_dist626 = __toESM(require_dist2(), 1);
1840var import_dist627 = __toESM(require_dist3(), 1);
1841var import_dist619 = __toESM(require_dist(), 1);
1842var import_dist620 = __toESM(require_dist2(), 1);
1843var import_dist621 = __toESM(require_dist3(), 1);
1844var import_dist388 = __toESM(require_dist(), 1);
1845var import_dist389 = __toESM(require_dist2(), 1);
1846var import_dist390 = __toESM(require_dist3(), 1);
1847var import_dist289 = __toESM(require_dist(), 1);
1848var import_dist290 = __toESM(require_dist2(), 1);
1849var import_dist291 = __toESM(require_dist3(), 1);
1850var import_dist286 = __toESM(require_dist(), 1);
1851var import_dist287 = __toESM(require_dist2(), 1);
1852var import_dist288 = __toESM(require_dist3(), 1);
1853var import_dist283 = __toESM(require_dist(), 1);
1854var import_dist284 = __toESM(require_dist2(), 1);
1855var import_dist285 = __toESM(require_dist3(), 1);
1856var supportsScrollTimeline = memo(() => window.ScrollTimeline !== void 0);
1857var BaseGroupPlaybackControls = class {
1858  constructor(animations2) {
1859    this.stop = () => this.runAll("stop");
1860    this.animations = animations2.filter(Boolean);
1861  }
1862  get finished() {
1863    return Promise.all(this.animations.map((animation) => "finished" in animation ? animation.finished : animation));
1864  }
1865  /**
1866   * TODO: Filter out cancelled or stopped animations before returning
1867   */
1868  getAll(propName) {
1869    return this.animations[0][propName];
1870  }
1871  setAll(propName, newValue) {
1872    for (let i = 0; i < this.animations.length; i++) {
1873      this.animations[i][propName] = newValue;
1874    }
1875  }
1876  attachTimeline(timeline, fallback) {
1877    const subscriptions = this.animations.map((animation) => {
1878      if (supportsScrollTimeline() && animation.attachTimeline) {
1879        return animation.attachTimeline(timeline);
1880      } else if (typeof fallback === "function") {
1881        return fallback(animation);
1882      }
1883    });
1884    return () => {
1885      subscriptions.forEach((cancel, i) => {
1886        cancel && cancel();
1887        this.animations[i].stop();
1888      });
1889    };
1890  }
1891  get time() {
1892    return this.getAll("time");
1893  }
1894  set time(time2) {
1895    this.setAll("time", time2);
1896  }
1897  get speed() {
1898    return this.getAll("speed");
1899  }
1900  set speed(speed) {
1901    this.setAll("speed", speed);
1902  }
1903  get startTime() {
1904    return this.getAll("startTime");
1905  }
1906  get duration() {
1907    let max = 0;
1908    for (let i = 0; i < this.animations.length; i++) {
1909      max = Math.max(max, this.animations[i].duration);
1910    }
1911    return max;
1912  }
1913  runAll(methodName) {
1914    this.animations.forEach((controls) => controls[methodName]());
1915  }
1916  flatten() {
1917    this.runAll("flatten");
1918  }
1919  play() {
1920    this.runAll("play");
1921  }
1922  pause() {
1923    this.runAll("pause");
1924  }
1925  cancel() {
1926    this.runAll("cancel");
1927  }
1928  complete() {
1929    this.runAll("complete");
1930  }
1931};
1932var GroupPlaybackControls = class extends BaseGroupPlaybackControls {
1933  then(onResolve, onReject) {
1934    return Promise.all(this.animations).then(onResolve).catch(onReject);
1935  }
1936};
1937var import_dist292 = __toESM(require_dist(), 1);
1938var import_dist293 = __toESM(require_dist2(), 1);
1939var import_dist294 = __toESM(require_dist3(), 1);
1940function getValueTransition(transition, key) {
1941  return transition ? transition[key] || transition["default"] || transition : void 0;
1942}
1943var import_dist295 = __toESM(require_dist(), 1);
1944var import_dist296 = __toESM(require_dist2(), 1);
1945var import_dist297 = __toESM(require_dist3(), 1);
1946var maxGeneratorDuration = 2e4;
1947function calcGeneratorDuration(generator) {
1948  let duration = 0;
1949  const timeStep = 50;
1950  let state2 = generator.next(duration);
1951  while (!state2.done && duration < maxGeneratorDuration) {
1952    duration += timeStep;
1953    state2 = generator.next(duration);
1954  }
1955  return duration >= maxGeneratorDuration ? Infinity : duration;
1956}
1957var import_dist298 = __toESM(require_dist(), 1);
1958var import_dist299 = __toESM(require_dist2(), 1);
1959var import_dist300 = __toESM(require_dist3(), 1);
1960function createGeneratorEasing(options, scale2 = 100, createGenerator) {
1961  const generator = createGenerator({ ...options, keyframes: [0, scale2] });
1962  const duration = Math.min(calcGeneratorDuration(generator), maxGeneratorDuration);
1963  return {
1964    type: "keyframes",
1965    ease: (progress2) => {
1966      return generator.next(duration * progress2).value / scale2;
1967    },
1968    duration: millisecondsToSeconds(duration)
1969  };
1970}
1971var import_dist301 = __toESM(require_dist(), 1);
1972var import_dist302 = __toESM(require_dist2(), 1);
1973var import_dist303 = __toESM(require_dist3(), 1);
1974function isGenerator(type) {
1975  return typeof type === "function";
1976}
1977var import_dist307 = __toESM(require_dist(), 1);
1978var import_dist308 = __toESM(require_dist2(), 1);
1979var import_dist309 = __toESM(require_dist3(), 1);
1980var import_dist304 = __toESM(require_dist(), 1);
1981var import_dist305 = __toESM(require_dist2(), 1);
1982var import_dist306 = __toESM(require_dist3(), 1);
1983function attachTimeline(animation, timeline) {
1984  animation.timeline = timeline;
1985  animation.onfinish = null;
1986}
1987var NativeAnimationControls = class {
1988  constructor(animation) {
1989    this.animation = animation;
1990  }
1991  get duration() {
1992    var _a, _b, _c;
1993    const durationInMs = ((_b = (_a = this.animation) === null || _a === void 0 ? void 0 : _a.effect) === null || _b === void 0 ? void 0 : _b.getComputedTiming().duration) || ((_c = this.options) === null || _c === void 0 ? void 0 : _c.duration) || 300;
1994    return millisecondsToSeconds(Number(durationInMs));
1995  }
1996  get time() {
1997    var _a;
1998    if (this.animation) {
1999      return millisecondsToSeconds(((_a = this.animation) === null || _a === void 0 ? void 0 : _a.currentTime) || 0);
2000    }
2001    return 0;
2002  }
2003  set time(newTime) {
2004    if (this.animation) {
2005      this.animation.currentTime = secondsToMilliseconds(newTime);
2006    }
2007  }
2008  get speed() {
2009    return this.animation ? this.animation.playbackRate : 1;
2010  }
2011  set speed(newSpeed) {
2012    if (this.animation) {
2013      this.animation.playbackRate = newSpeed;
2014    }
2015  }
2016  get state() {
2017    return this.animation ? this.animation.playState : "finished";
2018  }
2019  get startTime() {
2020    return this.animation ? this.animation.startTime : null;
2021  }
2022  get finished() {
2023    return this.animation ? this.animation.finished : Promise.resolve();
2024  }
2025  play() {
2026    this.animation && this.animation.play();
2027  }
2028  pause() {
2029    this.animation && this.animation.pause();
2030  }
2031  stop() {
2032    if (!this.animation || this.state === "idle" || this.state === "finished") {
2033      return;
2034    }
2035    if (this.animation.commitStyles) {
2036      this.animation.commitStyles();
2037    }
2038    this.cancel();
2039  }
2040  flatten() {
2041    var _a;
2042    if (!this.animation)
2043      return;
2044    (_a = this.animation.effect) === null || _a === void 0 ? void 0 : _a.updateTiming({ easing: "linear" });
2045  }
2046  attachTimeline(timeline) {
2047    if (this.animation)
2048      attachTimeline(this.animation, timeline);
2049    return noop;
2050  }
2051  complete() {
2052    this.animation && this.animation.finish();
2053  }
2054  cancel() {
2055    try {
2056      this.animation && this.animation.cancel();
2057    } catch (e) {
2058    }
2059  }
2060};
2061var import_dist325 = __toESM(require_dist(), 1);
2062var import_dist326 = __toESM(require_dist2(), 1);
2063var import_dist327 = __toESM(require_dist3(), 1);
2064var import_dist310 = __toESM(require_dist(), 1);
2065var import_dist311 = __toESM(require_dist2(), 1);
2066var import_dist312 = __toESM(require_dist3(), 1);
2067var isBezierDefinition = (easing) =>
2067 Array.isArray(easing) && typeof easing[0] === "number";
2068var import_dist319 = __toESM(require_dist(), 1);
2069var import_dist320 = __toESM(require_dist2(), 1);
2070var import_dist321 = __toESM(require_dist3(), 1);
2071var import_dist316 = __toESM(require_dist(), 1);
2072var import_dist317 = __toESM(require_dist2(), 1);
2073var import_dist318 = __toESM(require_dist3(), 1);
2074var import_dist313 = __toESM(require_dist(), 1);
2075var import_dist314 = __toESM(require_dist2(), 1);
2076var import_dist315 = __toESM(require_dist3(), 1);
2077var supportsFlags = {
2078  linearEasing: void 0
2079};
2080function memoSupports(callback, supportsFlag) {
2081  const memoized = memo(callback);
2082  return () => {
2083    var _a;
2084    return (_a = supportsFlags[supportsFlag]) !== null && _a !== void 0 ? _a : memoized();
2085  };
2086}
2087var supportsLinearEasing = memoSupports(() => {
2088  try {
2089    document.createElement("div").animate({ opacity: 0 }, { easing: "linear(0, 1)" });
2090  } catch (e) {
2091    return false;
2092  }
2093  return true;
2094}, "linearEasing");
2095var import_dist322 = __toESM(require_dist(), 1);
2096var import_dist323 = __toESM(require_dist2(), 1);
2097var import_dist324 = __toESM(require_dist3(), 1);
2098var generateLinearEasing = (easing, duration, resolution = 10) => {
2099  let points = "";
2100  const numPoints = Math.max(Math.round(duration / resolution), 2);
2101  for (let i = 0; i < numPoints; i++) {
2102    points += easing(progress(0, numPoints - 1, i)) + ", ";
2103  }
2104  return `linear(${points.substring(0, points.length - 2)})`;
2105};
2106function isWaapiSupportedEasing(easing) {
2107  return Boolean(typeof easing === "function" && supportsLinearEasing() || !easing || typeof easing === "string" && (easing in supportedWaapiEasing || supportsLinearEasing()) || isBezierDefinition(easing) || Array.isArray(easing) && easing.every(isWaapiSupportedEasing));
2108}
2109var cubicBezierAsString = ([a, b, c, d]) => `cubic-bezier(${a}, ${b}, ${c}, ${d})`;
2110var supportedWaapiEasing = {
2111  linear: "linear",
2112  ease: "ease",
2113  easeIn: "ease-in",
2114  easeOut: "ease-out",
2115  easeInOut: "ease-in-out",
2116  circIn: cubicBezierAsString([0, 0.65, 0.55, 1]),
2117  circOut: cubicBezierAsString([0.55, 0, 1, 0.45]),
2118  backIn: cubicBezierAsString([0.31, 0.01, 0.66, -0.59]),
2119  backOut: cubicBezierAsString([0.33, 1.53, 0.69, 0.99])
2120};
2121function mapEasingToNativeEasing(easing, duration) {
2122  if (!easing) {
2123    return void 0;
2124  } else if (typeof easing === "function" && supportsLinearEasing()) {
2125    return generateLinearEasing(easing, duration);
2126  } else if (isBezierDefinition(easing)) {
2127    return cubicBezierAsString(easing);
2128  } else if (Array.isArray(easing)) {
2129    return easing.map((segmentEasing) => mapEasingToNativeEasing(segmentEasing, duration) || supportedWaapiEasing.easeOut);
2130  } else {
2131    return supportedWaapiEasing[easing];
2132  }
2133}
2134var import_dist337 = __toESM(require_dist(), 1);
2135var import_dist338 = __toESM(require_dist2(), 1);
2136var import_dist339 = __toESM(require_dist3(), 1);
2137var import_dist328 = __toESM(require_dist(), 1);
2138var import_dist329 = __toESM(require_dist2(), 1);
2139var import_dist330 = __toESM(require_dist3(), 1);
2140var isDragging = {
2141  x: false,
2142  y: false
2143};
2144function isDragActive() {
2145  return isDragging.x || isDragging.y;
2146}
2147var import_dist334 = __toESM(require_dist(), 1);
2148var import_dist335 = __toESM(require_dist2(), 1);
2149var import_dist336 = __toESM(require_dist3(), 1);
2150var import_dist331 = __toESM(require_dist(), 1);
2151var import_dist332 = __toESM(require_dist2(), 1);
2152var import_dist333 = __toESM(require_dist3(), 1);
2153function resolveElements(elementOrSelector, scope, selectorCache) {
2154  var _a;
2155  if (elementOrSelector instanceof Element) {
2156    return [elementOrSelector];
2157  } else if (typeof elementOrSelector === "string") {
2158    let root = document;
2159    if (scope) {
2160      root = scope.current;
2161    }
2162    const elements = (_a = selectorCache === null || selectorCache === void 0 ? void 0 : selectorCache[elementOrSelector]) !== null && _a !== void 0 ? _a : root.querySelectorAll(elementOrSelector);
2163    return elements ? Array.from(elements) : [];
2164  }
2165  return Array.from(elementOrSelector);
2166}
2167function setupGesture(elementOrSelector, options) {
2168  const elements = resolveElements(elementOrSelector);
2169  const gestureAbortController = new AbortController();
2170  const eventOptions = {
2171    passive: true,
2172    ...options,
2173    signal: gestureAbortController.signal
2174  };
2175  const cancel = () => gestureAbortController.abort();
2176  return [elements, eventOptions, cancel];
2177}
2178function filterEvents(callback) {
2179  return (event) => {
2180    if (event.pointerType === "touch" || isDragActive())
2181      return;
2182    callback(event);
2183  };
2184}
2185function hover(elementOrSelector, onHoverStart, options = {}) {
2186  const [elements, eventOptions, cancel] = setupGesture(elementOrSelector, options);
2187  const onPointerEnter = filterEvents((enterEvent) => {
2188    const { target } = enterEvent;
2189    const onHoverEnd = onHoverStart(enterEvent);
2190    if (typeof onHoverEnd !== "function" || !target)
2191      return;
2192    const onPointerLeave = filterEvents((leaveEvent) => {
2193      onHoverEnd(leaveEvent);
2194      target.removeEventListener("pointerleave", onPointerLeave);
2195    });
2196    target.addEventListener("pointerleave", onPointerLeave, eventOptions);
2197  });
2198  elements.forEach((element) => {
2199    element.addEventListener("pointerenter", onPointerEnter, eventOptions);
2200  });
2201  return cancel;
2202}
2203var import_dist355 = __toESM(require_dist(), 1);
2204var import_dist356 = __toESM(require_dist2(), 1);
2205var import_dist357 = __toESM(require_dist3(), 1);
2206var import_dist340 = __toESM(require_dist(), 1);
2207var import_dist341 = __toESM(require_dist2(), 1);
2208var import_dist342 = __toESM(require_dist3(), 1);
2209var isNodeOrChild = (parent, child) => {
2210  if (!child) {
2211    return false;
2212  } else if (parent === child) {
2213    return true;
2214  } else {
2215    return isNodeOrChild(parent, child.parentElement);
2216  }
2217};
2218var import_dist343 = __toESM(require_dist(), 1);
2219var import_dist344 = __toESM(require_dist2(), 1);
2220var import_dist345 = __toESM(require_dist3(), 1);
2221var isPrimaryPointer = (event) => {
2222  if (event.pointerType === "mouse") {
2223    return typeof event.button !== "number" || event.button <= 0;
2224  } else {
2225    return event.isPrimary !== false;
2226  }
2227};
2228var import_dist346 = __toESM(require_dist(), 1);
2229var import_dist347 = __toESM(require_dist2(), 1);
2230var import_dist348 = __toESM(require_dist3(), 1);
2231var focusableElements = /* @__PURE__ */ new Set([
2232  "BUTTON",
2233  "INPUT",
2234  "SELECT",
2235  "TEXTAREA",
2236  "A"
2237]);
2238function isElementKeyboardAccessible(element) {
2239  return focusableElements.has(element.tagName) || element.tabIndex !== -1;
2240}
2241var import_dist352 = __toESM(require_dist(), 1);
2242var import_dist353 = __toESM(require_dist2(), 1);
2243var import_dist354 = __toESM(require_dist3(), 1);
2244var import_dist349 = __toESM(require_dist(), 1);
2245var import_dist350 = __toESM(require_dist2(), 1);
2246var import_dist351 = __toESM(require_dist3(), 1);
2247var isPressing = /* @__PURE__ */ new WeakSet();
2248function filterEvents2(callback) {
2249  return (event) => {
2250    if (event.key !== "Enter")
2251      return;
2252    callback(event);
2253  };
2254}
2255function firePointerEvent(target, type) {
2256  target.dispatchEvent(new PointerEvent("pointer" + type, { isPrimary: true, bubbles: true }));
2257}
2258var enableKeyboardPress = (focusEvent, eventOptions) => {
2259  const element = focusEvent.currentTarget;
2260  if (!element)
2261    return;
2262  const handleKeydown = filterEvents2(() => {
2263    if (isPressing.has(element))
2264      return;
2265    firePointerEvent(element, "down");
2266    const handleKeyup = filterEvents2(() => {
2267      firePointerEvent(element, "up");
2268    });
2269    const handleBlur = () => firePointerEvent(element, "cancel");
2270    element.addEventListener("keyup", handleKeyup, eventOptions);
2271    element.addEventListener("blur", handleBlur, eventOptions);
2272  });
2273  element.addEventListener("keydown", handleKeydown, eventOptions);
2274  element.addEventListener("blur", () => element.removeEventListener("keydown", handleKeydown), eventOptions);
2275};
2276function isValidPressEvent(event) {
2277  return isPrimaryPointer(event) && !isDragActive();
2278}
2279function press(elementOrSelector, onPressStart, options = {}) {
2280  const [elements, eventOptions, cancelEvents] = setupGesture(elementOrSelector, options);
2281  const startPress = (startEvent) => {
2282    const element = startEvent.currentTarget;
2283    if (!isValidPressEvent(startEvent) || isPressing.has(element))
2284      return;
2285    isPressing.add(element);
2286    const onPressEnd = onPressStart(startEvent);
2287    const onPointerEnd = (endEvent, success) => {
2288      window.removeEventListener("pointerup", onPointerUp);
2289      window.removeEventListener("pointercancel", onPointerCancel);
2290      if (!isValidPressEvent(endEvent) || !isPressing.has(element)) {
2291        return;
2292      }
2293      isPressing.delete(element);
2294      if (typeof onPressEnd === "function") {
2295        onPressEnd(endEvent, { success });
2296      }
2297    };
2298    const onPointerUp = (upEvent) => {
2299      onPointerEnd(upEvent, options.useGlobalTarget || isNodeOrChild(element, upEvent.target));
2300    };
2301    const onPointerCancel = (cancelEvent) => {
2302      onPointerEnd(cancelEvent, false);
2303    };
2304    window.addEventListener("pointerup", onPointerUp, eventOptions);
2305    window.addEventListener("pointercancel", onPointerCancel, eventOptions);
2306  };
2307  elements.forEach((element) => {
2308    if (!isElementKeyboardAccessible(element) && element.getAttribute("tabindex") === null) {
2309      element.tabIndex = 0;
2310    }
2311    const target = options.useGlobalTarget ? window : element;
2312    target.addEventListener("pointerdown", startPress, eventOptions);
2313    element.addEventListener("focus", (event) => enableKeyboardPress(event, eventOptions), eventOptions);
2314  });
2315  return cancelEvents;
2316}
2317var import_dist382 = __toESM(require_dist(), 1);
2318var import_dist383 = __toESM(require_dist2(), 1);
2319var import_dist384 = __toESM(require_dist3(), 1);
2320var import_dist379 = __toESM(require_dist(), 1);
2321var import_dist380 = __toESM(require_dist2(), 1);
2322var import_dist381 = __toESM(require_dist3(), 1);
2323var import_dist361 = __toESM(require_dist(), 1);
2324var import_dist362 = __toESM(require_dist2(), 1);
2325var import_dist363 = __toESM(require_dist3(), 1);
2326var import_dist358 = __toESM(require_dist(), 1);
2327var import_dist359 = __toESM(require_dist2(), 1);
2328var import_dist360 = __toESM(require_dist3(), 1);
2329var import_dist364 = __toESM(require_dist(), 1);
2330var import_dist365 = __toESM(require_dist2(), 1);
2331var import_dist366 = __toESM(require_dist3(), 1);
2332var import_dist367 = __toESM(require_dist(), 1);
2333var import_dist368 = __toESM(require_dist2(), 1);
2334var import_dist369 = __toESM(require_dist3(), 1);
2335var import_dist370 = __toESM(require_dist(), 1);
2336var import_dist371 = __toESM(require_dist2(), 1);
2337var import_dist372 = __toESM(require_dist3(), 1);
2338var import_dist373 = __toESM(require_dist(), 1);
2339var import_dist374 = __toESM(require_dist2(), 1);
2340var import_dist375 = __toESM(require_dist3(), 1);
2341var import_dist376 = __toESM(require_dist(), 1);
2342var import_dist377 = __toESM(require_dist2(), 1);
2343var import_dist378 = __toESM(require_dist3(), 1);
2344var import_dist385 = __toESM(require_dist(), 1);
2345var import_dist386 = __toESM(require_dist2(), 1);
2346var import_dist387 = __toESM(require_dist3(), 1);
2347function setDragLock(axis) {
2348  if (axis === "x" || axis === "y") {
2349    if (isDragging[axis]) {
2350      return null;
2351    } else {
2352      isDragging[axis] = true;
2353      return () => {
2354        isDragging[axis] = false;
vendor: 24,316 bytes, lines 2355-3110
2355      };
2356    }
2357  } else {
2358    if (isDragging.x || isDragging.y) {
2359      return null;
2360    } else {
2361      isDragging.x = isDragging.y = true;
2362      return () => {
2363        isDragging.x = isDragging.y = false;
2364      };
2365    }
2366  }
2367}
2368var import_dist391 = __toESM(require_dist(), 1);
2369var import_dist392 = __toESM(require_dist2(), 1);
2370var import_dist393 = __toESM(require_dist3(), 1);
2371var positionalKeys = /* @__PURE__ */ new Set([
2372  "width",
2373  "height",
2374  "top",
2375  "left",
2376  "right",
2377  "bottom",
2378  ...transformPropOrder
2379]);
2380var import_dist409 = __toESM(require_dist(), 1);
2381var import_dist410 = __toESM(require_dist2(), 1);
2382var import_dist411 = __toESM(require_dist3(), 1);
2383var import_dist406 = __toESM(require_dist(), 1);
2384var import_dist407 = __toESM(require_dist2(), 1);
2385var import_dist408 = __toESM(require_dist3(), 1);
2386var import_dist394 = __toESM(require_dist(), 1);
2387var import_dist395 = __toESM(require_dist2(), 1);
2388var import_dist396 = __toESM(require_dist3(), 1);
2389var now;
2390function clearTime() {
2391  now = void 0;
2392}
2393var time = {
2394  now: () => {
2395    if (now === void 0) {
2396      time.set(frameData.isProcessing || MotionGlobalConfig.useManualTiming ? frameData.timestamp : performance.now());
2397    }
2398    return now;
2399  },
2400  set: (newTime) => {
2401    now = newTime;
2402    queueMicrotask(clearTime);
2403  }
2404};
2405var import_dist400 = __toESM(require_dist(), 1);
2406var import_dist401 = __toESM(require_dist2(), 1);
2407var import_dist402 = __toESM(require_dist3(), 1);
2408var import_dist397 = __toESM(require_dist(), 1);
2409var import_dist398 = __toESM(require_dist2(), 1);
2410var import_dist399 = __toESM(require_dist3(), 1);
2411function addUniqueItem(arr, item) {
2412  if (arr.indexOf(item) === -1)
2413    arr.push(item);
2414}
2415function removeItem(arr, item) {
2416  const index = arr.indexOf(item);
2417  if (index > -1)
2418    arr.splice(index, 1);
2419}
2420function moveItem([...arr], fromIndex, toIndex) {
2421  const startIndex = fromIndex < 0 ? arr.length + fromIndex : fromIndex;
2422  if (startIndex >= 0 && startIndex < arr.length) {
2423    const endIndex = toIndex < 0 ? arr.length + toIndex : toIndex;
2424    const [item] = arr.splice(fromIndex, 1);
2425    arr.splice(endIndex, 0, item);
2426  }
2427  return arr;
2428}
2429var SubscriptionManager = class {
2430  constructor() {
2431    this.subscriptions = [];
2432  }
2433  add(handler) {
2434    addUniqueItem(this.subscriptions, handler);
2435    return () => removeItem(this.subscriptions, handler);
2436  }
2437  notify(a, b, c) {
2438    const numSubscriptions = this.subscriptions.length;
2439    if (!numSubscriptions)
2440      return;
2441    if (numSubscriptions === 1) {
2442      this.subscriptions[0](a, b, c);
2443    } else {
2444      for (let i = 0; i < numSubscriptions; i++) {
2445        const handler = this.subscriptions[i];
2446        handler && handler(a, b, c);
2447      }
2448    }
2449  }
2450  getSize() {
2451    return this.subscriptions.length;
2452  }
2453  clear() {
2454    this.subscriptions.length = 0;
2455  }
2456};
2457var import_dist403 = __toESM(require_dist(), 1);
2458var import_dist404 = __toESM(require_dist2(), 1);
2459var import_dist405 = __toESM(require_dist3(), 1);
2460function velocityPerSecond(velocity, frameDuration) {
2461  return frameDuration ? velocity * (1e3 / frameDuration) : 0;
2462}
2463var MAX_VELOCITY_DELTA = 30;
2464var isFloat = (value) => {
2465  return !isNaN(parseFloat(value));
2466};
2467var collectMotionValues = {
2468  current: void 0
2469};
2470var MotionValue = class {
2471  /**
2472   * @param init - The initiating value
2473   * @param config - Optional configuration options
2474   *
2475   * -  `transformer`: A function to transform incoming values with.
2476   *
2477   * @internal
2478   */
2479  constructor(init, options = {}) {
2480    this.version = "11.18.2";
2481    this.canTrackVelocity = null;
2482    this.events = {};
2483    this.updateAndNotify = (v, render = true) => {
2484      const currentTime = time.now();
2485      if (this.updatedAt !== currentTime) {
2486        this.setPrevFrameValue();
2487      }
2488      this.prev = this.current;
2489      this.setCurrent(v);
2490      if (this.current !== this.prev && this.events.change) {
2491        this.events.change.notify(this.current);
2492      }
2493      if (render && this.events.renderRequest) {
2494        this.events.renderRequest.notify(this.current);
2495      }
2496    };
2497    this.hasAnimated = false;
2498    this.setCurrent(init);
2499    this.owner = options.owner;
2500  }
2501  setCurrent(current) {
2502    this.current = current;
2503    this.updatedAt = time.now();
2504    if (this.canTrackVelocity === null && current !== void 0) {
2505      this.canTrackVelocity = isFloat(this.current);
2506    }
2507  }
2508  setPrevFrameValue(prevFrameValue = this.current) {
2509    this.prevFrameValue = prevFrameValue;
2510    this.prevUpdatedAt = this.updatedAt;
2511  }
2512  /**
2513   * Adds a function that will be notified when the `MotionValue` is updated.
2514   *
2515   * It returns a function that, when called, will cancel the subscription.
2516   *
2517   * When calling `onChange` inside a React component, it should be wrapped with the
2518   * `useEffect` hook. As it returns an unsubscribe function, this should be returned
2519   * from the `useEffect` function to ensure you don't add duplicate subscribers..
2520   *
2521   * ```jsx
2522   * export const MyComponent = () => {
2523   *   const x = useMotionValue(0)
2524   *   const y = useMotionValue(0)
2525   *   const opacity = useMotionValue(1)
2526   *
2527   *   useEffect(() => {
2528   *     function updateOpacity() {
2529   *       const maxXY = Math.max(x.get(), y.get())
2530   *       const newOpacity = transform(maxXY, [0, 100], [1, 0])
2531   *       opacity.set(newOpacity)
2532   *     }
2533   *
2534   *     const unsubscribeX = x.on("change", updateOpacity)
2535   *     const unsubscribeY = y.on("change", updateOpacity)
2536   *
2537   *     return () => {
2538   *       unsubscribeX()
2539   *       unsubscribeY()
2540   *     }
2541   *   }, [])
2542   *
2543   *   return <motion.div style={{ x }} />
2544   * }
2545   * ```
2546   *
2547   * @param subscriber - A function that receives the latest value.
2548   * @returns A function that, when called, will cancel this subscription.
2549   *
2550   * @deprecated
2551   */
2552  onChange(subscription) {
2553    if (true) {
2554      warnOnce(false, `value.onChange(callback) is deprecated. Switch to value.on("change", callback).`);
2555    }
2556    return this.on("change", subscription);
2557  }
2558  on(eventName, callback) {
2559    if (!this.events[eventName]) {
2560      this.events[eventName] = new SubscriptionManager();
2561    }
2562    const unsubscribe = this.events[eventName].add(callback);
2563    if (eventName === "change") {
2564      return () => {
2565        unsubscribe();
2566        frame.read(() => {
2567          if (!this.events.change.getSize()) {
2568            this.stop();
2569          }
2570        });
2571      };
2572    }
2573    return unsubscribe;
2574  }
2575  clearListeners() {
2576    for (const eventManagers in this.events) {
2577      this.events[eventManagers].clear();
2578    }
2579  }
2580  /**
2581   * Attaches a passive effect to the `MotionValue`.
2582   *
2583   * @internal
2584   */
2585  attach(passiveEffect, stopPassiveEffect) {
2586    this.passiveEffect = passiveEffect;
2587    this.stopPassiveEffect = stopPassiveEffect;
2588  }
2589  /**
2590   * Sets the state of the `MotionValue`.
2591   *
2592   * @remarks
2593   *
2594   * ```jsx
2595   * const x = useMotionValue(0)
2596   * x.set(10)
2597   * ```
2598   *
2599   * @param latest - Latest value to set.
2600   * @param render - Whether to notify render subscribers. Defaults to `true`
2601   *
2602   * @public
2603   */
2604  set(v, render = true) {
2605    if (!render || !this.passiveEffect) {
2606      this.updateAndNotify(v, render);
2607    } else {
2608      this.passiveEffect(v, this.updateAndNotify);
2609    }
2610  }
2611  setWithVelocity(prev, current, delta) {
2612    this.set(current);
2613    this.prev = void 0;
2614    this.prevFrameValue = prev;
2615    this.prevUpdatedAt = this.updatedAt - delta;
2616  }
2617  /**
2618   * Set the state of the `MotionValue`, stopping any active animations,
2619   * effects, and resets velocity to `0`.
2620   */
2621  jump(v, endAnimation = true) {
2622    this.updateAndNotify(v);
2623    this.prev = v;
2624    this.prevUpdatedAt = this.prevFrameValue = void 0;
2625    endAnimation && this.stop();
2626    if (this.stopPassiveEffect)
2627      this.stopPassiveEffect();
2628  }
2629  /**
2630   * Returns the latest state of `MotionValue`
2631   *
2632   * @returns - The latest state of `MotionValue`
2633   *
2634   * @public
2635   */
2636  get() {
2637    if (collectMotionValues.current) {
2638      collectMotionValues.current.push(this);
2639    }
2640    return this.current;
2641  }
2642  /**
2643   * @public
2644   */
2645  getPrevious() {
2646    return this.prev;
2647  }
2648  /**
2649   * Returns the latest velocity of `MotionValue`
2650   *
2651   * @returns - The latest velocity of `MotionValue`. Returns `0` if the state is non-numerical.
2652   *
2653   * @public
2654   */
2655  getVelocity() {
2656    const currentTime = time.now();
2657    if (!this.canTrackVelocity || this.prevFrameValue === void 0 || currentTime - this.updatedAt > MAX_VELOCITY_DELTA) {
2658      return 0;
2659    }
2660    const delta = Math.min(this.updatedAt - this.prevUpdatedAt, MAX_VELOCITY_DELTA);
2661    return velocityPerSecond(parseFloat(this.current) - parseFloat(this.prevFrameValue), delta);
2662  }
2663  /**
2664   * Registers a new animation to control this `MotionValue`. Only one
2665   * animation can drive a `MotionValue` at one time.
2666   *
2667   * ```jsx
2668   * value.start()
2669   * ```
2670   *
2671   * @param animation - A function that starts the provided animation
2672   *
2673   * @internal
2674   */
2675  start(startAnimation) {
2676    this.stop();
2677    return new Promise((resolve) => {
2678      this.hasAnimated = true;
2679      this.animation = startAnimation(resolve);
2680      if (this.events.animationStart) {
2681        this.events.animationStart.notify();
2682      }
2683    }).then(() => {
2684      if (this.events.animationComplete) {
2685        this.events.animationComplete.notify();
2686      }
2687      this.clearAnimation();
2688    });
2689  }
2690  /**
2691   * Stop the currently active animation.
2692   *
2693   * @public
2694   */
2695  stop() {
2696    if (this.animation) {
2697      this.animation.stop();
2698      if (this.events.animationCancel) {
2699        this.events.animationCancel.notify();
2700      }
2701    }
2702    this.clearAnimation();
2703  }
2704  /**
2705   * Returns `true` if this value is currently animating.
2706   *
2707   * @public
2708   */
2709  isAnimating() {
2710    return !!this.animation;
2711  }
2712  clearAnimation() {
2713    delete this.animation;
2714  }
2715  /**
2716   * Destroy and clean up subscribers to this `MotionValue`.
2717   *
2718   * The `MotionValue` hooks like `useMotionValue` and `useTransform` automatically
2719   * handle the lifecycle of the returned `MotionValue`, so this method is only necessary if you've manually
2720   * created a `MotionValue` via the `motionValue` function.
2721   *
2722   * @public
2723   */
2724  destroy() {
2725    this.clearListeners();
2726    this.stop();
2727    if (this.stopPassiveEffect) {
2728      this.stopPassiveEffect();
2729    }
2730  }
2731};
2732function motionValue(init, options) {
2733  return new MotionValue(init, options);
2734}
2735function setMotionValue(visualElement, key, value) {
2736  if (visualElement.hasValue(key)) {
2737    visualElement.getValue(key).set(value);
2738  } else {
2739    visualElement.addValue(key, motionValue(value));
2740  }
2741}
2742function setTarget(visualElement, definition) {
2743  const resolved = resolveVariant(visualElement, definition);
2744  let { transitionEnd = {}, transition = {}, ...target } = resolved || {};
2745  target = { ...target, ...transitionEnd };
2746  for (const key in target) {
2747    const value = resolveFinalValueInKeyframes(target[key]);
2748    setMotionValue(visualElement, key, value);
2749  }
2750}
2751var import_dist415 = __toESM(require_dist(), 1);
2752var import_dist416 = __toESM(require_dist2(), 1);
2753var import_dist417 = __toESM(require_dist3(), 1);
2754var import_dist412 = __toESM(require_dist(), 1);
2755var import_dist413 = __toESM(require_dist2(), 1);
2756var import_dist414 = __toESM(require_dist3(), 1);
2757function isWillChangeMotionValue(value) {
2758  return Boolean(isMotionValue(value) && value.add);
2759}
2760function addValueToWillChange(visualElement, key) {
2761  const willChange = visualElement.getValue("willChange");
2762  if (isWillChangeMotionValue(willChange)) {
2763    return willChange.add(key);
2764  }
2765}
2766var import_dist418 = __toESM(require_dist(), 1);
2767var import_dist419 = __toESM(require_dist2(), 1);
2768var import_dist420 = __toESM(require_dist3(), 1);
2769function getOptimisedAppearId(visualElement) {
2770  return visualElement.props[optimizedAppearDataAttribute];
2771}
2772var import_dist616 = __toESM(require_dist(), 1);
2773var import_dist617 = __toESM(require_dist2(), 1);
2774var import_dist618 = __toESM(require_dist3(), 1);
2775var import_dist421 = __toESM(require_dist(), 1);
2776var import_dist422 = __toESM(require_dist2(), 1);
2777var import_dist423 = __toESM(require_dist3(), 1);
2778var instantAnimationState = {
2779  current: false
2780};
2781var import_dist607 = __toESM(require_dist(), 1);
2782var import_dist608 = __toESM(require_dist2(), 1);
2783var import_dist609 = __toESM(require_dist3(), 1);
2784var import_dist436 = __toESM(require_dist(), 1);
2785var import_dist437 = __toESM(require_dist2(), 1);
2786var import_dist438 = __toESM(require_dist3(), 1);
2787var import_dist433 = __toESM(require_dist(), 1);
2788var import_dist434 = __toESM(require_dist2(), 1);
2789var import_dist435 = __toESM(require_dist3(), 1);
2790var import_dist424 = __toESM(require_dist(), 1);
2791var import_dist425 = __toESM(require_dist2(), 1);
2792var import_dist426 = __toESM(require_dist3(), 1);
2793var calcBezier = (t, a1, a2) => (((1 - 3 * a2 + 3 * a1) * t + (3 * a2 - 6 * a1)) * t + 3 * a1) * t;
2794var subdivisionPrecision = 1e-7;
2795var subdivisionMaxIterations = 12;
2796function binarySubdivide(x, lowerBound, upperBound, mX1, mX2) {
2797  let currentX;
2798  let currentT;
2799  let i = 0;
2800  do {
2801    currentT = lowerBound + (upperBound - lowerBound) / 2;
2802    currentX = calcBezier(currentT, mX1, mX2) - x;
2803    if (currentX > 0) {
2804      upperBound = currentT;
2805    } else {
2806      lowerBound = currentT;
2807    }
2808  } while (Math.abs(currentX) > subdivisionPrecision && ++i < subdivisionMaxIterations);
2809  return currentT;
2810}
2811function cubicBezier(mX1, mY1, mX2, mY2) {
2812  if (mX1 === mY1 && mX2 === mY2)
2813    return noop;
2814  const getTForX = (aX) => binarySubdivide(aX, 0, 1, mX1, mX2);
2815  return (t) => t === 0 || t === 1 ? t : calcBezier(getTForX(t), mY1, mY2);
2816}
2817var import_dist427 = __toESM(require_dist(), 1);
2818var import_dist428 = __toESM(require_dist2(), 1);
2819var import_dist429 = __toESM(require_dist3(), 1);
2820var mirrorEasing = (easing) => (p) => p <= 0.5 ? easing(2 * p) / 2 : (2 - easing(2 * (1 - p))) / 2;
2821var import_dist430 = __toESM(require_dist(), 1);
2822var import_dist431 = __toESM(require_dist2(), 1);
2823var import_dist432 = __toESM(require_dist3(), 1);
2824var reverseEasing = (easing) => (p) => 1 - easing(1 - p);
2825var backOut = cubicBezier(0.33, 1.53, 0.69, 0.99);
2826var backIn = reverseEasing(backOut);
2827var backInOut = mirrorEasing(backIn);
2828var anticipate = (p) => (p *= 2) < 1 ? 0.5 * backIn(p) : 0.5 * (2 - Math.pow(2, -10 * (p - 1)));
2829var import_dist439 = __toESM(require_dist(), 1);
2830var import_dist440 = __toESM(require_dist2(), 1);
2831var import_dist441 = __toESM(require_dist3(), 1);
2832var circIn = (p) => 1 - Math.sin(Math.acos(p));
2833var circOut = reverseEasing(circIn);
2834var circInOut = mirrorEasing(circIn);
2835var import_dist514 = __toESM(require_dist(), 1);
2836var import_dist515 = __toESM(require_dist2(), 1);
2837var import_dist516 = __toESM(require_dist3(), 1);
2838var import_dist445 = __toESM(require_dist(), 1);
2839var import_dist446 = __toESM(require_dist2(), 1);
2840var import_dist447 = __toESM(require_dist3(), 1);
2841var import_dist442 = __toESM(require_dist(), 1);
2842var import_dist443 = __toESM(require_dist2(), 1);
2843var import_dist444 = __toESM(require_dist3(), 1);
2844var isZeroValueString = (v) => /^0[^.\s]+$/u.test(v);
2845function isNone(value) {
2846  if (typeof value === "number") {
2847    return value === 0;
2848  } else if (value !== null) {
2849    return value === "none" || value === "0" || isZeroValueString(value);
2850  } else {
2851    return true;
2852  }
2853}
2854var import_dist490 = __toESM(require_dist(), 1);
2855var import_dist491 = __toESM(require_dist2(), 1);
2856var import_dist492 = __toESM(require_dist3(), 1);
2857var import_dist478 = __toESM(require_dist(), 1);
2858var import_dist479 = __toESM(require_dist2(), 1);
2859var import_dist480 = __toESM(require_dist3(), 1);
2860var import_dist472 = __toESM(require_dist(), 1);
2861var import_dist473 = __toESM(require_dist2(), 1);
2862var import_dist474 = __toESM(require_dist3(), 1);
2863var import_dist466 = __toESM(require_dist(), 1);
2864var import_dist467 = __toESM(require_dist2(), 1);
2865var import_dist468 = __toESM(require_dist3(), 1);
2866var import_dist463 = __toESM(require_dist(), 1);
2867var import_dist464 = __toESM(require_dist2(), 1);
2868var import_dist465 = __toESM(require_dist3(), 1);
2869var import_dist448 = __toESM(require_dist(), 1);
2870var import_dist449 = __toESM(require_dist2(), 1);
2871var import_dist450 = __toESM(require_dist3(), 1);
2872var sanitize = (v) => Math.round(v * 1e5) / 1e5;
2873var import_dist460 = __toESM(require_dist(), 1);
2874var import_dist461 = __toESM(require_dist2(), 1);
2875var import_dist462 = __toESM(require_dist3(), 1);
2876var import_dist451 = __toESM(require_dist(), 1);
2877var import_dist452 = __toESM(require_dist2(), 1);
2878var import_dist453 = __toESM(require_dist3(), 1);
2879var floatRegex = /-?(?:\d+(?:\.\d+)?|\.\d+)/gu;
2880var import_dist454 = __toESM(require_dist(), 1);
2881var import_dist455 = __toESM(require_dist2(), 1);
2882var import_dist456 = __toESM(require_dist3(), 1);
2883function isNullish(v) {
2884  return v == null;
2885}
2886var import_dist457 = __toESM(require_dist(), 1);
2887var import_dist458 = __toESM(require_dist2(), 1);
2888var import_dist459 = __toESM(require_dist3(), 1);
2889var singleColorRegex = /^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu;
2890var isColorString = (type, testProp) => (v) => {
2891  return Boolean(typeof v === "string" && singleColorRegex.test(v) && v.startsWith(type) || testProp && !isNullish(v) && Object.prototype.hasOwnProperty.call(v, testProp));
2892};
2893var splitColor = (aName, bName, cName) => (v) => {
2894  if (typeof v !== "string")
2895    return v;
2896  const [a, b, c, alpha2] = v.match(floatRegex);
2897  return {
2898    [aName]: parseFloat(a),
2899    [bName]: parseFloat(b),
2900    [cName]: parseFloat(c),
2901    alpha: alpha2 !== void 0 ? parseFloat(alpha2) : 1
2902  };
2903};
2904var clampRgbUnit = (v) => clamp(0, 255, v);
2905var rgbUnit = {
2906  ...number,
2907  transform: (v) => Math.round(clampRgbUnit(v))
2908};
2909var rgba = {
2910  test: isColorString("rgb", "red"),
2911  parse: splitColor("red", "green", "blue"),
2912  transform: ({ red, green, blue, alpha: alpha$1 = 1 }) => "rgba(" + rgbUnit.transform(red) + ", " + rgbUnit.transform(green) + ", " + rgbUnit.transform(blue) + ", " + sanitize(alpha.transform(alpha$1)) + ")"
2913};
2914function parseHex(v) {
2915  let r = "";
2916  let g = "";
2917  let b = "";
2918  let a = "";
2919  if (v.length > 5) {
2920    r = v.substring(1, 3);
2921    g = v.substring(3, 5);
2922    b = v.substring(5, 7);
2923    a = v.substring(7, 9);
2924  } else {
2925    r = v.substring(1, 2);
2926    g = v.substring(2, 3);
2927    b = v.substring(3, 4);
2928    a = v.substring(4, 5);
2929    r += r;
2930    g += g;
2931    b += b;
2932    a += a;
2933  }
2934  return {
2935    red: parseInt(r, 16),
2936    green: parseInt(g, 16),
2937    blue: parseInt(b, 16),
2938    alpha: a ? parseInt(a, 16) / 255 : 1
2939  };
2940}
2941var hex = {
2942  test: isColorString("#"),
2943  parse: parseHex,
2944  transform: rgba.transform
2945};
2946var import_dist469 = __toESM(require_dist(), 1);
2947var import_dist470 = __toESM(require_dist2(), 1);
2948var import_dist471 = __toESM(require_dist3(), 1);
2949var hsla = {
2950  test: isColorString("hsl", "hue"),
2951  parse: splitColor("hue", "saturation", "lightness"),
2952  transform: ({ hue, saturation, lightness, alpha: alpha$1 = 1 }) => {
2953    return "hsla(" + Math.round(hue) + ", " + percent.transform(sanitize(saturation)) + ", " + percent.transform(sanitize(lightness)) + ", " + sanitize(alpha.transform(alpha$1)) + ")";
2954  }
2955};
2956var color = {
2957  test: (v) => rgba.test(v) || hex.test(v) || hsla.test(v),
2958  parse: (v) => {
2959    if (rgba.test(v)) {
2960      return rgba.parse(v);
2961    } else if (hsla.test(v)) {
2962      return hsla.parse(v);
2963    } else {
2964      return hex.parse(v);
2965    }
2966  },
2967  transform: (v) => {
2968    return typeof v === "string" ? v : v.hasOwnProperty("red") ? rgba.transform(v) : hsla.transform(v);
2969  }
2970};
2971var import_dist475 = __toESM(require_dist(), 1);
2972var import_dist476 = __toESM(require_dist2(), 1);
2973var import_dist477 = __toESM(require_dist3(), 1);
2974var colorRegex = /(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu;
2975function test(v) {
2976  var _a, _b;
2977  return isNaN(v) && typeof v === "string" && (((_a = v.match(floatRegex)) === null || _a === void 0 ? void 0 : _a.length) || 0) + (((_b = v.match(colorRegex)) === null || _b === void 0 ? void 0 : _b.length) || 0) > 0;
2978}
2979var NUMBER_TOKEN = "number";
2980var COLOR_TOKEN = "color";
2981var VAR_TOKEN = "var";
2982var VAR_FUNCTION_TOKEN = "var(";
2983var SPLIT_TOKEN = "${}";
2984var complexRegex = /var\s*\(\s*--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)|#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\)|-?(?:\d+(?:\.\d+)?|\.\d+)/giu;
2985function analyseComplexValue(value) {
2986  const originalValue = value.toString();
2987  const values = [];
2988  const indexes = {
2989    color: [],
2990    number: [],
2991    var: []
2992  };
2993  const types = [];
2994  let i = 0;
2995  const tokenised = originalValue.replace(complexRegex, (parsedValue) => {
2996    if (color.test(parsedValue)) {
2997      indexes.color.push(i);
2998      types.push(COLOR_TOKEN);
2999      values.push(color.parse(parsedValue));
3000    } else if (parsedValue.startsWith(VAR_FUNCTION_TOKEN)) {
3001      indexes.var.push(i);
3002      types.push(VAR_TOKEN);
3003      values.push(parsedValue);
3004    } else {
3005      indexes.number.push(i);
3006      types.push(NUMBER_TOKEN);
3007      values.push(parseFloat(parsedValue));
3008    }
3009    ++i;
3010    return SPLIT_TOKEN;
3011  });
3012  const split = tokenised.split(SPLIT_TOKEN);
3013  return { values, split, indexes, types };
3014}
3015function parseComplexValue(v) {
3016  return analyseComplexValue(v).values;
3017}
3018function createTransformer(source) {
3019  const { split, types } = analyseComplexValue(source);
3020  const numSections = split.length;
3021  return (v) => {
3022    let output = "";
3023    for (let i = 0; i < numSections; i++) {
3024      output += split[i];
3025      if (v[i] !== void 0) {
3026        const type = types[i];
3027        if (type === NUMBER_TOKEN) {
3028          output += sanitize(v[i]);
3029        } else if (type === COLOR_TOKEN) {
3030          output += color.transform(v[i]);
3031        } else {
3032          output += v[i];
3033        }
3034      }
3035    }
3036    return output;
3037  };
3038}
3039var convertNumbersToZero = (v) => typeof v === "number" ? 0 : v;
3040function getAnimatableNone(v) {
3041  const parsed = parseComplexValue(v);
3042  const transformer = createTransformer(v);
3043  return transformer(parsed.map(convertNumbersToZero));
3044}
3045var complex = {
3046  test,
3047  parse: parseComplexValue,
3048  createTransformer,
3049  getAnimatableNone
3050};
3051var import_dist487 = __toESM(require_dist(), 1);
3052var import_dist488 = __toESM(require_dist2(), 1);
3053var import_dist489 = __toESM(require_dist3(), 1);
3054var import_dist481 = __toESM(require_dist(), 1);
3055var import_dist482 = __toESM(require_dist2(), 1);
3056var import_dist483 = __toESM(require_dist3(), 1);
3057var maxDefaults = /* @__PURE__ */ new Set(["brightness", "contrast", "saturate", "opacity"]);
3058function applyDefaultFilter(v) {
3059  const [name, value] = v.slice(0, -1).split("(");
3060  if (name === "drop-shadow")
3061    return v;
3062  const [number2] = value.match(floatRegex) || [];
3063  if (!number2)
3064    return v;
3065  const unit = value.replace(number2, "");
3066  let defaultValue = maxDefaults.has(name) ? 1 : 0;
3067  if (number2 !== value)
3068    defaultValue *= 100;
3069  return name + "(" + defaultValue + unit + ")";
3070}
3071var functionRegex = /\b([a-z-]*)\(.*?\)/gu;
3072var filter = {
3073  ...complex,
3074  getAnimatableNone: (v) => {
3075    const functions = v.match(functionRegex);
3076    return functions ? functions.map(applyDefaultFilter).join(" ") : v;
3077  }
3078};
3079var import_dist484 = __toESM(require_dist(), 1);
3080var import_dist485 = __toESM(require_dist2(), 1);
3081var import_dist486 = __toESM(require_dist3(), 1);
3082var defaultValueTypes = {
3083  ...numberValueTypes,
3084  // Color props
3085  color,
3086  backgroundColor: color,
3087  outlineColor: color,
3088  fill: color,
3089  stroke: color,
3090  // Border props
3091  borderColor: color,
3092  borderTopColor: color,
3093  borderRightColor: color,
3094  borderBottomColor: color,
3095  borderLeftColor: color,
3096  filter,
3097  WebkitFilter: filter
3098};
3099var getDefaultValueType = (key) => defaultValueTypes[key];
3100function getAnimatableNone2(key, value) {
3101  let defaultValueType = getDefaultValueType(key);
3102  if (defaultValueType !== filter)
3103    defaultValueType = complex;
3104  return defaultValueType.getAnimatableNone ? defaultValueType.getAnimatableNone(value) : void 0;
3105}
3106var invalidTemplates = /* @__PURE__ */ new Set(["auto", "none", "0"]);
3107function makeNoneKeyframesAnimatable(unresolvedKeyframes, noneKeyframeIndexes, name) {
3108  let i = 0;
3109  let animatableTemplate = void 0;
3110  while (i < unresolvedKeyframes.length && !animatableTemplate) {
3111    const keyframe = unresolvedKeyframes[i];
3112    if (typeof keyframe === "string" && !invalidTemplates.has(keyframe) && analyseComplexValue(keyframe).values.length) {
3113      animatableTemplate = unresolvedKeyframes[i];
3114    }
3115    i++;
3116  }
3117  if (animatableTemplate && name) {
3118    for (const noneIndex of noneKeyframeIndexes) {
3119      unresolvedKeyframes[noneIndex] = getAnimatableNone2(name, animatableTemplate);
3120    }
3121  }
3122}
3123var import_dist496 = __toESM(require_dist(), 1);
3124var import_dist497 = __toESM(require_dist2(), 1);
3125var import_dist498 = __toESM(require_dist3(), 1);
3126var import_dist493 = __toESM(require_dist(), 1);
3127var import_dist494 = __toESM(require_dist2(), 1);
3128var import_dist495 = __toESM(require_dist3(), 1);
3129var isNumOrPxType = (v) => v === number || v === px;
3130var getPosFromMatrix = (matrix, pos) => parseFloat(matrix.split(", ")[pos]);
3131var getTranslateFromMatrix = (pos2, pos3) => (_bbox, { transform: transform2 }) => {
3132  if (transform2 === "none" || !transform2)
3133    return 0;
3134  const matrix3d = transform2.match(/^matrix3d\((.+)\)$/u);
3135  if (matrix3d) {
3136    return getPosFromMatrix(matrix3d[1], pos3);
3137  } else {
3138    const matrix = transform2.match(/^matrix\((.+)\)$/u);
3139    if (matrix) {
3140      return getPosFromMatrix(matrix[1], pos2);
3141    } else {
3142      return 0;
3143    }
3144  }
3145};
3146var transformKeys = /* @__PURE__ */ new Set(["x", "y", "z"]);
3147var nonTranslationalTransformKeys = transformPropOrder.filter((key) => !transformKeys.has(key));
3148function removeNonTranslationalTransform(visualElement) {
3149  const removedTransforms = [];
3150  nonTranslationalTransformKeys.forEach((key) => {
3151    const value = visualElement.getValue(key);
3152    if (value !== void 0) {
3153      removedTransforms.push([key, value.get()]);
3154      value.set(key.startsWith("scale") ? 1 : 0);
3155    }
3156  });
3157  return removedTransforms;
3158}
3159var positionalValues = {
3160  // Dimensions
3161  width: ({ x }, { paddingLeft = "0", paddingRight = "0" }) => x.max - x.min - parseFloat(paddingLeft) - parseFloat(paddingRight),
3162  height: ({ y }, { paddingTop = "0", paddingBottom = "0" }) => y.max - y.min - parseFloat(paddingTop) - parseFloat(paddingBottom),
3163  top: (_bbox, { top }) => parseFloat(top),
3164  left: (_bbox, { left }) => parseFloat(left),
3165  bottom: ({ y }, { top }) => parseFloat(top) + (y.max - y.min),
3166  right: ({ x }, { left }) => parseFloat(left) + (x.max - x.min),
3167  // Transform
3168  x: getTranslateFromMatrix(4, 13),
3169  y: getTranslateFromMatrix(5, 14)
3170};
3171positionalValues.translateX = positionalValues.x;
3172positionalValues.translateY = positionalValues.y;
3173var toResolve = /* @__PURE__ */ new Set();
3174var isScheduled = false;
3175var anyNeedsMeasurement = false;
3176function measureAllKeyframes() {
3177  if (anyNeedsMeasurement) {
3178    const resolversToMeasure = Array.from(toResolve).filter((resolver) => resolver.needsMeasurement);
3179    const elementsToMeasure = new Set(resolversToMeasure.map((resolver) => resolver.element));
3180    const transformsToRestore = /* @__PURE__ */ new Map();
3181    elementsToMeasure.forEach((element) => {
3182      const removedTransforms = removeNonTranslationalTransform(element);
3183      if (!removedTransforms.length)
3184        return;
3185      transformsToRestore.set(element, removedTransforms);
3186      element.render();
3187    });
3188    resolversToMeasure.forEach((resolver) => resolver.measureInitialState());
3189    elementsToMeasure.forEach((element) => {
3190      element.render();
3191      const restore = transformsToRestore.get(element);
3192      if (restore) {
3193        restore.forEach(([key, value]) => {
3194          var _a;
3195          (_a = element.getValue(key)) === null || _a === void 0 ? void 0 : _a.set(value);
3196        });
3197      }
3198    });
3199    resolversToMeasure.forEach((resolver) => resolver.measureEndState());
3200    resolversToMeasure.forEach((resolver) => {
3201      if (resolver.suspendedScrollY !== void 0) {
3202        window.scrollTo(0, resolver.suspendedScrollY);
3203      }
3204    });
3205  }
3206  anyNeedsMeasurement = false;
3207  isScheduled = false;
3208  toResolve.forEach((resolver) => resolver.complete());
3209  toResolve.clear();
3210}
3211function readAllKeyframes() {
3212  toResolve.forEach((resolver) => {
3213    resolver.readKeyframes();
3214    if (resolver.needsMeasurement) {
3215      anyNeedsMeasurement = true;
3216    }
3217  });
3218}
3219function flushKeyframeResolvers() {
3220  readAllKeyframes();
3221  measureAllKeyframes();
3222}
3223var KeyframeResolver = class {
3224  constructor(unresolvedKeyframes, onComplete, name, motionValue2, element, isAsync = false) {
3225    this.isComplete = false;
3226    this.isAsync = false;
3227    this.needsMeasurement = false;
3228    this.isScheduled = false;
3229    this.unresolvedKeyframes = [...unresolvedKeyframes];
3230    this.onComplete = onComplete;
3231    this.name = name;
3232    this.motionValue = motionValue2;
3233    this.element = element;
3234    this.isAsync = isAsync;
3235  }
3236  scheduleResolve() {
3237    this.isScheduled = true;
3238    if (this.isAsync) {
3239      toResolve.add(this);
3240      if (!isScheduled) {
3241        isScheduled = true;
3242        frame.read(readAllKeyframes);
3243        frame.resolveKeyframes(measureAllKeyframes);
3244      }
3245    } else {
3246      this.readKeyframes();
3247      this.complete();
3248    }
3249  }
3250  readKeyframes() {
3251    const { unresolvedKeyframes, name, element, motionValue: motionValue2 } = this;
3252    for (let i = 0; i < unresolvedKeyframes.length; i++) {
3253      if (unresolvedKeyframes[i] === null) {
3254        if (i === 0) {
3255          const currentValue = motionValue2 === null || motionValue2 === void 0 ? void 0 : motionValue2.get();
3256          const finalKeyframe = unresolvedKeyframes[unresolvedKeyframes.length - 1];
3257          if (currentValue !== void 0) {
3258            unresolvedKeyframes[0] = currentValue;
3259          } else if (element && name) {
3260            const valueAsRead = element.readValue(name, finalKeyframe);
3261            if (valueAsRead !== void 0 && valueAsRead !== null) {
3262              unresolvedKeyframes[0] = valueAsRead;
3263            }
3264          }
3265          if (unresolvedKeyframes[0] === void 0) {
3266            unresolvedKeyframes[0] = finalKeyframe;
3267          }
3268          if (motionValue2 && currentValue === void 0) {
3269            motionValue2.set(unresolvedKeyframes[0]);
3270          }
3271        } else {
3272          unresolvedKeyframes[i] = unresolvedKeyframes[i - 1];
3273        }
3274      }
3275    }
3276  }
3277  setFinalKeyframe() {
3278  }
3279  measureInitialState() {
3280  }
3281  renderEndStyles() {
3282  }
3283  measureEndState() {
3284  }
3285  complete() {
3286    this.isComplete = true;
3287    this.onComplete(this.unresolvedKeyframes, this.finalKeyframe);
3288    toResolve.delete(this);
3289  }
3290  cancel() {
3291    if (!this.isComplete) {
3292      this.isScheduled = false;
3293      toResolve.delete(this);
3294    }
3295  }
3296  resume() {
3297    if (!this.isComplete)
3298      this.scheduleResolve();
3299  }
3300};
3301var import_dist502 = __toESM(require_dist(), 1);
3302var import_dist503 = __toESM(require_dist2(), 1);
3303var import_dist504 = __toESM(require_dist3(), 1);
3304var import_dist499 = __toESM(require_dist(), 1);
3305var import_dist500 = __toESM(require_dist2(), 1);
3306var import_dist501 = __toESM(require_dist3(), 1);
3307var isNumericalString = (v) => /^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(v);
3308var splitCSSVariableRegex = (
3309  // eslint-disable-next-line redos-detector/no-unsafe-regex -- false positive, as it can match a lot of words
3310  /^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u
3311);
3312function parseCSSVariable(current) {
3313  const match = splitCSSVariableRegex.exec(current);
3314  if (!match)
3315    return [,];
3316  const [, token1, token2, fallback] = match;
3317  return [`--${token1 !== null && token1 !== void 0 ? token1 : token2}`, fallback];
3318}
3319var maxDepth = 4;
3320function getVariableValue(current, element, depth = 1) {
3321  invariant(depth <= maxDepth, `Max CSS variable fallback depth detected in property "${current}". This may indicate a circular fallback dependency.`);
3322  const [token, fallback] = parseCSSVariable(current);
3323  if (!token)
3324    return;
3325  const resolved = window.getComputedStyle(element).getPropertyValue(token);
3326  if (resolved) {
3327    const trimmed = resolved.trim();
3328    return isNumericalString(trimmed) ? parseFloat(trimmed) : trimmed;
3329  }
3330  return isCSSVariableToken(fallback) ? getVariableValue(fallback, element, depth + 1) : fallback;
3331}
3332var import_dist511 = __toESM(require_dist(), 1);
3333var import_dist512 = __toESM(require_dist2(), 1);
3334var import_dist513 = __toESM(require_dist3(), 1);
3335var import_dist505 = __toESM(require_dist(), 1);
3336var import_dist506 = __toESM(require_dist2(), 1);
3337var import_dist507 = __toESM(require_dist3(), 1);
3338var testValueType = (v) => (type) => type.test(v);
3339var import_dist508 = __toESM(require_dist(), 1);
3340var import_dist509 = __toESM(require_dist2(), 1);
3341var import_dist510 = __toESM(require_dist3(), 1);
3342var auto = {
3343  test: (v) => v === "auto",
3344  parse: (v) => v
3345};
3346var dimensionValueTypes = [number, px, percent, degrees, vw, vh, auto];
3347var findDimensionValueType = (v) => dimensionValueTypes.find(testValueType(v));
3348var DOMKeyframesResolver = class extends KeyframeResolver {
3349  constructor(unresolvedKeyframes, onComplete, name, motionValue2, element) {
3350    super(unresolvedKeyframes, onComplete, name, motionValue2, element, true);
3351  }
3352  readKeyframes() {
3353    const { unresolvedKeyframes, element, name } = this;
3354    if (!element || !element.current)
3355      return;
3356    super.readKeyframes();
3357    for (let i = 0; i < unresolvedKeyframes.length; i++) {
3358      let keyframe = unresolvedKeyframes[i];
3359      if (typeof keyframe === "string") {
3360        keyframe = keyframe.trim();
3361        if (isCSSVariableToken(keyframe)) {
3362          const resolved = getVariableValue(keyframe, element.current);
3363          if (resolved !== void 0) {
3364            unresolvedKeyframes[i] = resolved;
3365          }
3366          if (i === unresolvedKeyframes.length - 1) {
3367            this.finalKeyframe = keyframe;
3368          }
3369        }
3370      }
3371    }
3372    this.resolveNoneKeyframes();
3373    if (!positionalKeys.has(name) || unresolvedKeyframes.length !== 2) {
3374      return;
3375    }
3376    const [origin, target] = unresolvedKeyframes;
3377    const originType = findDimensionValueType(origin);
3378    const targetType = findDimensionValueType(target);
3379    if (originType === targetType)
3380      return;
3381    if (isNumOrPxType(originType) && isNumOrPxType(targetType)) {
3382      for (let i = 0; i < unresolvedKeyframes.length; i++) {
3383        const value = unresolvedKeyframes[i];
3384        if (typeof value === "string") {
3385          unresolvedKeyframes[i] = parseFloat(value);
3386        }
3387      }
3388    } else {
3389      this.needsMeasurement = true;
3390    }
3391  }
3392  resolveNoneKeyframes() {
3393    const { unresolvedKeyframes, name } = this;
3394    const noneKeyframeIndexes = [];
3395    for (let i = 0; i < unresolvedKeyframes.length; i++) {
3396      if (isNone(unresolvedKeyframes[i])) {
3397        noneKeyframeIndexes.push(i);
3398      }
3399    }
3400    if (noneKeyframeIndexes.length) {
3401      makeNoneKeyframesAnimatable(unresolvedKeyframes, noneKeyframeIndexes, name);
3402    }
3403  }
3404  measureInitialState() {
3405    const { element, unresolvedKeyframes, name } = this;
3406    if (!element || !element.current)
3407      return;
3408    if (name === "height") {
3409      this.suspendedScrollY = window.pageYOffset;
3410    }
3411    this.measuredOrigin = positionalValues[name](element.measureViewportBox(), window.getComputedStyle(element.current));
3412    unresolvedKeyframes[0] = this.measuredOrigin;
3413    const measureKeyframe = unresolvedKeyframes[unresolvedKeyframes.length - 1];
3414    if (measureKeyframe !== void 0) {
3415      element.getValue(name, measureKeyframe).jump(measureKeyframe, false);
3416    }
3417  }
3418  measureEndState() {
3419    var _a;
3420    const { element, name, unresolvedKeyframes } = this;
3421    if (!element || !element.current)
3422      return;
3423    const value = element.getValue(name);
3424    value && value.jump(this.measuredOrigin, false);
3425    const finalKeyframeIndex = unresolvedKeyframes.length - 1;
3426    const finalKeyframe = unresolvedKeyframes[finalKeyframeIndex];
3427    unresolvedKeyframes[finalKeyframeIndex] = positionalValues[name](element.measureViewportBox(), window.getComputedStyle(element.current));
3428    if (finalKeyframe !== null && this.finalKeyframe === void 0) {
3429      this.finalKeyframe = finalKeyframe;
3430    }
3431    if ((_a = this.removedTransforms) === null || _a === void 0 ? void 0 : _a.length) {
3432      this.removedTransforms.forEach(([unsetTransformName, unsetTransformValue]) => {
3433        element.getValue(unsetTransformName).set(unsetTransformValue);
3434      });
3435    }
3436    this.resolveNoneKeyframes();
3437  }
3438};
3439var import_dist526 = __toESM(require_dist(), 1);
3440var import_dist527 = __toESM(require_dist2(), 1);
3441var import_dist528 = __toESM(require_dist3(), 1);
3442var import_dist520 = __toESM(require_dist(), 1);
3443var import_dist521 = __toESM(require_dist2(), 1);
3444var import_dist522 = __toESM(require_dist3(), 1);
3445var import_dist517 = __toESM(require_dist(), 1);
3446var import_dist518 = __toESM(require_dist2(), 1);
3447var import_dist519 = __toESM(require_dist3(), 1);
3448var isAnimatable = (value, name) => {
3449  if (name === "zIndex")
3450    return false;
3451  if (typeof value === "number" || Array.isArray(value))
3452    return true;
3453  if (typeof value === "string" && // It's animatable if we have a string
3454  (complex.test(value) || value === "0") && // And it contains numbers and/or colors
3455  !value.startsWith("url(")) {
3456    return true;
3457  }
3458  return false;
3459};
3460function hasKeyframesChanged(keyframes2) {
3461  const current = keyframes2[0];
3462  if (keyframes2.length === 1)
3463    return true;
3464  for (let i = 0; i < keyframes2.length; i++) {
3465    if (keyframes2[i] !== current)
3466      return true;
3467  }
3468}
3469function canAnimate(keyframes2, name, type, velocity) {
3470  const originKeyframe = keyframes2[0];
3471  if (originKeyframe === null)
3472    return false;
3473  if (name === "display" || name === "visibility")
3474    return true;
3475  const targetKeyframe = keyframes2[keyframes2.length - 1];
3476  const isOriginAnimatable = isAnimatable(originKeyframe, name);
3477  const isTargetAnimatable = isAnimatable(targetKeyframe, name);
3478  warning(isOriginAnimatable === isTargetAnimatable, `You are trying to animate ${name} from "${originKeyframe}" to "${targetKeyframe}". ${originKeyframe} is not an animatable value - to enable this animation set ${originKeyframe} to a value animatable to ${targetKeyframe} via the \`style\` property.`);
3479  if (!isOriginAnimatable || !isTargetAnimatable) {
3480    return false;
3481  }
3482  return hasKeyframesChanged(keyframes2) || (type === "spring" || isGenerator(type)) && velocity;
3483}
3484var import_dist523 = __toESM(require_dist(), 1);
3485var import_dist524 = __toESM(require_dist2(), 1);
3486var import_dist525 = __toESM(require_dist3(), 1);
3487var isNotNull = (value) => value !== null;
3488function getFinalKeyframe(keyframes2, { repeat, repeatType = "loop" }, finalKeyframe) {
3489  const resolvedKeyframes = keyframes2.filter(isNotNull);
3490  const index = repeat && repeatType !== "loop" && repeat % 2 === 1 ? 0 : resolvedKeyframes.length - 1;
3491  return !index || finalKeyframe === void 0 ? resolvedKeyframes[index] : finalKeyframe;
3492}
3493var MAX_RESOLVE_DELAY = 40;
3494var BaseAnimation = class {
3495  constructor({ autoplay = true, delay: delay2 = 0, type = "keyframes", repeat = 0, repeatDelay = 0, repeatType = "loop", ...options }) {
3496    this.isStopped = false;
3497    this.hasAttemptedResolve = false;
3498    this.createdAt = time.now();
3499    this.options = {
3500      autoplay,
3501      delay: delay2,
3502      type,
3503      repeat,
3504      repeatDelay,
3505      repeatType,
3506      ...options
3507    };
3508    this.updateFinishedPromise();
3509  }
3510  /**
3511   * This method uses the createdAt and resolvedAt to calculate the
3512   * animation startTime. *Ideally*, we would use the createdAt time as t=0
3513   * as the following frame would then be the first frame of the animation in
3514   * progress, which would feel snappier.
3515   *
3516   * However, if there's a delay (main thread work) between the creation of
3517   * the animation and the first commited frame, we prefer to use resolvedAt
3518   * to avoid a sudden jump into the animation.
3519   */
3520  calcStartTime() {
3521    if (!this.resolvedAt)
3522      return this.createdAt;
3523    return this.resolvedAt - this.createdAt > MAX_RESOLVE_DELAY ? this.resolvedAt : this.createdAt;
3524  }
3525  /**
3526   * A getter for resolved data. If keyframes are not yet resolved, accessing
3527   * this.resolved will synchronously flush all pending keyframe resolvers.
3528   * This is a deoptimisation, but at its worst still batches read/writes.
3529   */
3530  get resolved() {
3531    if (!this._resolved && !this.hasAttemptedResolve) {
3532      flushKeyframeResolvers();
3533    }
3534    return this._resolved;
3535  }
3536  /**
3537   * A method to be called when the keyframes resolver completes. This method
3538   * will check if its possible to run the animation and, if not, skip it.
3539   * Otherwise, it will call initPlayback on the implementing class.
3540   */
3541  onKeyframesResolved(keyframes2, finalKeyframe) {
3542    this.resolvedAt = time.now();
3543    this.hasAttemptedResolve = true;
3544    const { name, type, velocity, delay: delay2, onComplete, onUpdate, isGenerator: isGenerator2 } = this.options;
vendor: 21,430 bytes, lines 3545-4132
3545    if (!isGenerator2 && !canAnimate(keyframes2, name, type, velocity)) {
3546      if (instantAnimationState.current || !delay2) {
3547        onUpdate && onUpdate(getFinalKeyframe(keyframes2, this.options, finalKeyframe));
3548        onComplete && onComplete();
3549        this.resolveFinishedPromise();
3550        return;
3551      } else {
3552        this.options.duration = 0;
3553      }
3554    }
3555    const resolvedAnimation = this.initPlayback(keyframes2, finalKeyframe);
3556    if (resolvedAnimation === false)
3557      return;
3558    this._resolved = {
3559      keyframes: keyframes2,
3560      finalKeyframe,
3561      ...resolvedAnimation
3562    };
3563    this.onPostResolved();
3564  }
3565  onPostResolved() {
3566  }
3567  /**
3568   * Allows the returned animation to be awaited or promise-chained. Currently
3569   * resolves when the animation finishes at all but in a future update could/should
3570   * reject if its cancels.
3571   */
3572  then(resolve, reject) {
3573    return this.currentFinishedPromise.then(resolve, reject);
3574  }
3575  flatten() {
3576    this.options.type = "keyframes";
3577    this.options.ease = "linear";
3578  }
3579  updateFinishedPromise() {
3580    this.currentFinishedPromise = new Promise((resolve) => {
3581      this.resolveFinishedPromise = resolve;
3582    });
3583  }
3584};
3585var import_dist595 = __toESM(require_dist(), 1);
3586var import_dist596 = __toESM(require_dist2(), 1);
3587var import_dist597 = __toESM(require_dist3(), 1);
3588var import_dist550 = __toESM(require_dist(), 1);
3589var import_dist551 = __toESM(require_dist2(), 1);
3590var import_dist552 = __toESM(require_dist3(), 1);
3591var import_dist547 = __toESM(require_dist(), 1);
3592var import_dist548 = __toESM(require_dist2(), 1);
3593var import_dist549 = __toESM(require_dist3(), 1);
3594var import_dist529 = __toESM(require_dist(), 1);
3595var import_dist530 = __toESM(require_dist2(), 1);
3596var import_dist531 = __toESM(require_dist3(), 1);
3597var mixNumber = (from, to, progress2) => {
3598  return from + (to - from) * progress2;
3599};
3600var import_dist538 = __toESM(require_dist(), 1);
3601var import_dist539 = __toESM(require_dist2(), 1);
3602var import_dist540 = __toESM(require_dist3(), 1);
3603var import_dist532 = __toESM(require_dist(), 1);
3604var import_dist533 = __toESM(require_dist2(), 1);
3605var import_dist534 = __toESM(require_dist3(), 1);
3606function hueToRgb(p, q, t) {
3607  if (t < 0)
3608    t += 1;
3609  if (t > 1)
3610    t -= 1;
3611  if (t < 1 / 6)
3612    return p + (q - p) * 6 * t;
3613  if (t < 1 / 2)
3614    return q;
3615  if (t < 2 / 3)
3616    return p + (q - p) * (2 / 3 - t) * 6;
3617  return p;
3618}
3619function hslaToRgba({ hue, saturation, lightness, alpha: alpha2 }) {
3620  hue /= 360;
3621  saturation /= 100;
3622  lightness /= 100;
3623  let red = 0;
3624  let green = 0;
3625  let blue = 0;
3626  if (!saturation) {
3627    red = green = blue = lightness;
3628  } else {
3629    const q = lightness < 0.5 ? lightness * (1 + saturation) : lightness + saturation - lightness * saturation;
3630    const p = 2 * lightness - q;
3631    red = hueToRgb(p, q, hue + 1 / 3);
3632    green = hueToRgb(p, q, hue);
3633    blue = hueToRgb(p, q, hue - 1 / 3);
3634  }
3635  return {
3636    red: Math.round(red * 255),
3637    green: Math.round(green * 255),
3638    blue: Math.round(blue * 255),
3639    alpha: alpha2
3640  };
3641}
3642var import_dist535 = __toESM(require_dist(), 1);
3643var import_dist536 = __toESM(require_dist2(), 1);
3644var import_dist537 = __toESM(require_dist3(), 1);
3645function mixImmediate(a, b) {
3646  return (p) => p > 0 ? b : a;
3647}
3648var mixLinearColor = (from, to, v) => {
3649  const fromExpo = from * from;
3650  const expo = v * (to * to - fromExpo) + fromExpo;
3651  return expo < 0 ? 0 : Math.sqrt(expo);
3652};
3653var colorTypes = [hex, rgba, hsla];
3654var getColorType = (v) => colorTypes.find((type) => type.test(v));
3655function asRGBA(color2) {
3656  const type = getColorType(color2);
3657  warning(Boolean(type), `'${color2}' is not an animatable color. Use the equivalent color code instead.`);
3658  if (!Boolean(type))
3659    return false;
3660  let model = type.parse(color2);
3661  if (type === hsla) {
3662    model = hslaToRgba(model);
3663  }
3664  return model;
3665}
3666var mixColor = (from, to) => {
3667  const fromRGBA = asRGBA(from);
3668  const toRGBA = asRGBA(to);
3669  if (!fromRGBA || !toRGBA) {
3670    return mixImmediate(from, to);
3671  }
3672  const blended = { ...fromRGBA };
3673  return (v) => {
3674    blended.red = mixLinearColor(fromRGBA.red, toRGBA.red, v);
3675    blended.green = mixLinearColor(fromRGBA.green, toRGBA.green, v);
3676    blended.blue = mixLinearColor(fromRGBA.blue, toRGBA.blue, v);
3677    blended.alpha = mixNumber(fromRGBA.alpha, toRGBA.alpha, v);
3678    return rgba.transform(blended);
3679  };
3680};
3681var import_dist541 = __toESM(require_dist(), 1);
3682var import_dist542 = __toESM(require_dist2(), 1);
3683var import_dist543 = __toESM(require_dist3(), 1);
3684var combineFunctions = (a, b) => (v) => b(a(v));
3685var pipe = (...transformers) => transformers.reduce(combineFunctions);
3686var import_dist544 = __toESM(require_dist(), 1);
3687var import_dist545 = __toESM(require_dist2(), 1);
3688var import_dist546 = __toESM(require_dist3(), 1);
3689var invisibleValues = /* @__PURE__ */ new Set(["none", "hidden"]);
3690function mixVisibility(origin, target) {
3691  if (invisibleValues.has(origin)) {
3692    return (p) => p <= 0 ? origin : target;
3693  } else {
3694    return (p) => p >= 1 ? target : origin;
3695  }
3696}
3697function mixNumber2(a, b) {
3698  return (p) => mixNumber(a, b, p);
3699}
3700function getMixer(a) {
3701  if (typeof a === "number") {
3702    return mixNumber2;
3703  } else if (typeof a === "string") {
3704    return isCSSVariableToken(a) ? mixImmediate : color.test(a) ? mixColor : mixComplex;
3705  } else if (Array.isArray(a)) {
3706    return mixArray;
3707  } else if (typeof a === "object") {
3708    return color.test(a) ? mixColor : mixObject;
3709  }
3710  return mixImmediate;
3711}
3712function mixArray(a, b) {
3713  const output = [...a];
3714  const numValues = output.length;
3715  const blendValue = a.map((v, i) => getMixer(v)(v, b[i]));
3716  return (p) => {
3717    for (let i = 0; i < numValues; i++) {
3718      output[i] = blendValue[i](p);
3719    }
3720    return output;
3721  };
3722}
3723function mixObject(a, b) {
3724  const output = { ...a, ...b };
3725  const blendValue = {};
3726  for (const key in output) {
3727    if (a[key] !== void 0 && b[key] !== void 0) {
3728      blendValue[key] = getMixer(a[key])(a[key], b[key]);
3729    }
3730  }
3731  return (v) => {
3732    for (const key in blendValue) {
3733      output[key] = blendValue[key](v);
3734    }
3735    return output;
3736  };
3737}
3738function matchOrder(origin, target) {
3739  var _a;
3740  const orderedOrigin = [];
3741  const pointers = { color: 0, var: 0, number: 0 };
3742  for (let i = 0; i < target.values.length; i++) {
3743    const type = target.types[i];
3744    const originIndex = origin.indexes[type][pointers[type]];
3745    const originValue = (_a = origin.values[originIndex]) !== null && _a !== void 0 ? _a : 0;
3746    orderedOrigin[i] = originValue;
3747    pointers[type]++;
3748  }
3749  return orderedOrigin;
3750}
3751var mixComplex = (origin, target) => {
3752  const template = complex.createTransformer(target);
3753  const originStats = analyseComplexValue(origin);
3754  const targetStats = analyseComplexValue(target);
3755  const canInterpolate = originStats.indexes.var.length === targetStats.indexes.var.length && originStats.indexes.color.length === targetStats.indexes.color.length && originStats.indexes.number.length >= targetStats.indexes.number.length;
3756  if (canInterpolate) {
3757    if (invisibleValues.has(origin) && !targetStats.values.length || invisibleValues.has(target) && !originStats.values.length) {
3758      return mixVisibility(origin, target);
3759    }
3760    return pipe(mixArray(matchOrder(originStats, targetStats), targetStats.values), template);
3761  } else {
3762    warning(true, `Complex values '${origin}' and '${target}' too different to mix. Ensure all colors are of the same type, and that each contains the same quantity of number and color values. Falling back to instant transition.`);
3763    return mixImmediate(origin, target);
3764  }
3765};
3766function mix(from, to, p) {
3767  if (typeof from === "number" && typeof to === "number" && typeof p === "number") {
3768    return mixNumber(from, to, p);
3769  }
3770  const mixer = getMixer(from);
3771  return mixer(from, to);
3772}
3773var import_dist565 = __toESM(require_dist(), 1);
3774var import_dist566 = __toESM(require_dist2(), 1);
3775var import_dist567 = __toESM(require_dist3(), 1);
3776var import_dist562 = __toESM(require_dist(), 1);
3777var import_dist563 = __toESM(require_dist2(), 1);
3778var import_dist564 = __toESM(require_dist3(), 1);
3779var import_dist553 = __toESM(require_dist(), 1);
3780var import_dist554 = __toESM(require_dist2(), 1);
3781var import_dist555 = __toESM(require_dist3(), 1);
3782var velocitySampleDuration = 5;
3783function calcGeneratorVelocity(resolveValue, t, current) {
3784  const prevT = Math.max(t - velocitySampleDuration, 0);
3785  return velocityPerSecond(current - resolveValue(prevT), t - prevT);
3786}
3787var import_dist556 = __toESM(require_dist(), 1);
3788var import_dist557 = __toESM(require_dist2(), 1);
3789var import_dist558 = __toESM(require_dist3(), 1);
3790var springDefaults = {
3791  // Default spring physics
3792  stiffness: 100,
3793  damping: 10,
3794  mass: 1,
3795  velocity: 0,
3796  // Default duration/bounce-based options
3797  duration: 800,
3798  // in ms
3799  bounce: 0.3,
3800  visualDuration: 0.3,
3801  // in seconds
3802  // Rest thresholds
3803  restSpeed: {
3804    granular: 0.01,
3805    default: 2
3806  },
3807  restDelta: {
3808    granular: 5e-3,
3809    default: 0.5
3810  },
3811  // Limits
3812  minDuration: 0.01,
3813  // in seconds
3814  maxDuration: 10,
3815  // in seconds
3816  minDamping: 0.05,
3817  maxDamping: 1
3818};
3819var import_dist559 = __toESM(require_dist(), 1);
3820var import_dist560 = __toESM(require_dist2(), 1);
3821var import_dist561 = __toESM(require_dist3(), 1);
3822var safeMin = 1e-3;
3823function findSpring({ duration = springDefaults.duration, bounce = springDefaults.bounce, velocity = springDefaults.velocity, mass = springDefaults.mass }) {
3824  let envelope;
3825  let derivative;
3826  warning(duration <= secondsToMilliseconds(springDefaults.maxDuration), "Spring duration must be 10 seconds or less");
3827  let dampingRatio = 1 - bounce;
3828  dampingRatio = clamp(springDefaults.minDamping, springDefaults.maxDamping, dampingRatio);
3829  duration = clamp(springDefaults.minDuration, springDefaults.maxDuration, millisecondsToSeconds(duration));
3830  if (dampingRatio < 1) {
3831    envelope = (undampedFreq2) => {
3832      const exponentialDecay = undampedFreq2 * dampingRatio;
3833      const delta = exponentialDecay * duration;
3834      const a = exponentialDecay - velocity;
3835      const b = calcAngularFreq(undampedFreq2, dampingRatio);
3836      const c = Math.exp(-delta);
3837      return safeMin - a / b * c;
3838    };
3839    derivative = (undampedFreq2) => {
3840      const exponentialDecay = undampedFreq2 * dampingRatio;
3841      const delta = exponentialDecay * duration;
3842      const d = delta * velocity + velocity;
3843      const e = Math.pow(dampingRatio, 2) * Math.pow(undampedFreq2, 2) * duration;
3844      const f = Math.exp(-delta);
3845      const g = calcAngularFreq(Math.pow(undampedFreq2, 2), dampingRatio);
3846      const factor = -envelope(undampedFreq2) + safeMin > 0 ? -1 : 1;
3847      return factor * ((d - e) * f) / g;
3848    };
3849  } else {
3850    envelope = (undampedFreq2) => {
3851      const a = Math.exp(-undampedFreq2 * duration);
3852      const b = (undampedFreq2 - velocity) * duration + 1;
3853      return -safeMin + a * b;
3854    };
3855    derivative = (undampedFreq2) => {
3856      const a = Math.exp(-undampedFreq2 * duration);
3857      const b = (velocity - undampedFreq2) * (duration * duration);
3858      return a * b;
3859    };
3860  }
3861  const initialGuess = 5 / duration;
3862  const undampedFreq = approximateRoot(envelope, derivative, initialGuess);
3863  duration = secondsToMilliseconds(duration);
3864  if (isNaN(undampedFreq)) {
3865    return {
3866      stiffness: springDefaults.stiffness,
3867      damping: springDefaults.damping,
3868      duration
3869    };
3870  } else {
3871    const stiffness = Math.pow(undampedFreq, 2) * mass;
3872    return {
3873      stiffness,
3874      damping: dampingRatio * 2 * Math.sqrt(mass * stiffness),
3875      duration
3876    };
3877  }
3878}
3879var rootIterations = 12;
3880function approximateRoot(envelope, derivative, initialGuess) {
3881  let result = initialGuess;
3882  for (let i = 1; i < rootIterations; i++) {
3883    result = result - envelope(result) / derivative(result);
3884  }
3885  return result;
3886}
3887function calcAngularFreq(undampedFreq, dampingRatio) {
3888  return undampedFreq * Math.sqrt(1 - dampingRatio * dampingRatio);
3889}
3890var durationKeys = ["duration", "bounce"];
3891var physicsKeys = ["stiffness", "damping", "mass"];
3892function isSpringType(options, keys2) {
3893  return keys2.some((key) => options[key] !== void 0);
3894}
3895function getSpringOptions(options) {
3896  let springOptions = {
3897    velocity: springDefaults.velocity,
3898    stiffness: springDefaults.stiffness,
3899    damping: springDefaults.damping,
3900    mass: springDefaults.mass,
3901    isResolvedFromDuration: false,
3902    ...options
3903  };
3904  if (!isSpringType(options, physicsKeys) && isSpringType(options, durationKeys)) {
3905    if (options.visualDuration) {
3906      const visualDuration = options.visualDuration;
3907      const root = 2 * Math.PI / (visualDuration * 1.2);
3908      const stiffness = root * root;
3909      const damping = 2 * clamp(0.05, 1, 1 - (options.bounce || 0)) * Math.sqrt(stiffness);
3910      springOptions = {
3911        ...springOptions,
3912        mass: springDefaults.mass,
3913        stiffness,
3914        damping
3915      };
3916    } else {
3917      const derived = findSpring(options);
3918      springOptions = {
3919        ...springOptions,
3920        ...derived,
3921        mass: springDefaults.mass
3922      };
3923      springOptions.isResolvedFromDuration = true;
3924    }
3925  }
3926  return springOptions;
3927}
3928function spring(optionsOrVisualDuration = springDefaults.visualDuration, bounce = springDefaults.bounce) {
3929  const options = typeof optionsOrVisualDuration !== "object" ? {
3930    visualDuration: optionsOrVisualDuration,
3931    keyframes: [0, 1],
3932    bounce
3933  } : optionsOrVisualDuration;
3934  let { restSpeed, restDelta } = options;
3935  const origin = options.keyframes[0];
3936  const target = options.keyframes[options.keyframes.length - 1];
3937  const state2 = { done: false, value: origin };
3938  const { stiffness, damping, mass, duration, velocity, isResolvedFromDuration } = getSpringOptions({
3939    ...options,
3940    velocity: -millisecondsToSeconds(options.velocity || 0)
3941  });
3942  const initialVelocity = velocity || 0;
3943  const dampingRatio = damping / (2 * Math.sqrt(stiffness * mass));
3944  const initialDelta = target - origin;
3945  const undampedAngularFreq = millisecondsToSeconds(Math.sqrt(stiffness / mass));
3946  const isGranularScale = Math.abs(initialDelta) < 5;
3947  restSpeed || (restSpeed = isGranularScale ? springDefaults.restSpeed.granular : springDefaults.restSpeed.default);
3948  restDelta || (restDelta = isGranularScale ? springDefaults.restDelta.granular : springDefaults.restDelta.default);
3949  let resolveSpring;
3950  if (dampingRatio < 1) {
3951    const angularFreq = calcAngularFreq(undampedAngularFreq, dampingRatio);
3952    resolveSpring = (t) => {
3953      const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t);
3954      return target - envelope * ((initialVelocity + dampingRatio * undampedAngularFreq * initialDelta) / angularFreq * Math.sin(angularFreq * t) + initialDelta * Math.cos(angularFreq * t));
3955    };
3956  } else if (dampingRatio === 1) {
3957    resolveSpring = (t) => target - Math.exp(-undampedAngularFreq * t) * (initialDelta + (initialVelocity + undampedAngularFreq * initialDelta) * t);
3958  } else {
3959    const dampedAngularFreq = undampedAngularFreq * Math.sqrt(dampingRatio * dampingRatio - 1);
3960    resolveSpring = (t) => {
3961      const envelope = Math.exp(-dampingRatio * undampedAngularFreq * t);
3962      const freqForT = Math.min(dampedAngularFreq * t, 300);
3963      return target - envelope * ((initialVelocity + dampingRatio * undampedAngularFreq * initialDelta) * Math.sinh(freqForT) + dampedAngularFreq * initialDelta * Math.cosh(freqForT)) / dampedAngularFreq;
3964    };
3965  }
3966  const generator = {
3967    calculatedDuration: isResolvedFromDuration ? duration || null : null,
3968    next: (t) => {
3969      const current = resolveSpring(t);
3970      if (!isResolvedFromDuration) {
3971        let currentVelocity = 0;
3972        if (dampingRatio < 1) {
3973          currentVelocity = t === 0 ? secondsToMilliseconds(initialVelocity) : calcGeneratorVelocity(resolveSpring, t, current);
3974        }
3975        const isBelowVelocityThreshold = Math.abs(currentVelocity) <= restSpeed;
3976        const isBelowDisplacementThreshold = Math.abs(target - current) <= restDelta;
3977        state2.done = isBelowVelocityThreshold && isBelowDisplacementThreshold;
3978      } else {
3979        state2.done = t >= duration;
3980      }
3981      state2.value = state2.done ? target : current;
3982      return state2;
3983    },
3984    toString: () => {
3985      const calculatedDuration = Math.min(calcGeneratorDuration(generator), maxGeneratorDuration);
3986      const easing = generateLinearEasing((progress2) => generator.next(calculatedDuration * progress2).value, calculatedDuration, 30);
3987      return calculatedDuration + "ms " + easing;
3988    }
3989  };
3990  return generator;
3991}
3992function inertia({ keyframes: keyframes2, velocity = 0, power = 0.8, timeConstant = 325, bounceDamping = 10, bounceStiffness = 500, modifyTarget, min, max, restDelta = 0.5, restSpeed }) {
3993  const origin = keyframes2[0];
3994  const state2 = {
3995    done: false,
3996    value: origin
3997  };
3998  const isOutOfBounds = (v) => min !== void 0 && v < min || max !== void 0 && v > max;
3999  const nearestBoundary = (v) => {
4000    if (min === void 0)
4001      return max;
4002    if (max === void 0)
4003      return min;
4004    return Math.abs(min - v) < Math.abs(max - v) ? min : max;
4005  };
4006  let amplitude = power * velocity;
4007  const ideal = origin + amplitude;
4008  const target = modifyTarget === void 0 ? ideal : modifyTarget(ideal);
4009  if (target !== ideal)
4010    amplitude = target - origin;
4011  const calcDelta = (t) => -amplitude * Math.exp(-t / timeConstant);
4012  const calcLatest = (t) => target + calcDelta(t);
4013  const applyFriction = (t) => {
4014    const delta = calcDelta(t);
4015    const latest = calcLatest(t);
4016    state2.done = Math.abs(delta) <= restDelta;
4017    state2.value = state2.done ? target : latest;
4018  };
4019  let timeReachedBoundary;
4020  let spring$1;
4021  const checkCatchBoundary = (t) => {
4022    if (!isOutOfBounds(state2.value))
4023      return;
4024    timeReachedBoundary = t;
4025    spring$1 = spring({
4026      keyframes: [state2.value, nearestBoundary(state2.value)],
4027      velocity: calcGeneratorVelocity(calcLatest, t, state2.value),
4028      // TODO: This should be passing * 1000
4029      damping: bounceDamping,
4030      stiffness: bounceStiffness,
4031      restDelta,
4032      restSpeed
4033    });
4034  };
4035  checkCatchBoundary(0);
4036  return {
4037    calculatedDuration: null,
4038    next: (t) => {
4039      let hasUpdatedFrame = false;
4040      if (!spring$1 && timeReachedBoundary === void 0) {
4041        hasUpdatedFrame = true;
4042        applyFriction(t);
4043        checkCatchBoundary(t);
4044      }
4045      if (timeReachedBoundary !== void 0 && t >= timeReachedBoundary) {
4046        return spring$1.next(t - timeReachedBoundary);
4047      } else {
4048        !hasUpdatedFrame && applyFriction(t);
4049        return state2;
4050      }
4051    }
4052  };
4053}
4054var import_dist589 = __toESM(require_dist(), 1);
4055var import_dist590 = __toESM(require_dist2(), 1);
4056var import_dist591 = __toESM(require_dist3(), 1);
4057var import_dist568 = __toESM(require_dist(), 1);
4058var import_dist569 = __toESM(require_dist2(), 1);
4059var import_dist570 = __toESM(require_dist3(), 1);
4060var easeIn = cubicBezier(0.42, 0, 1, 1);
4061var easeOut = cubicBezier(0, 0, 0.58, 1);
4062var easeInOut = cubicBezier(0.42, 0, 0.58, 1);
4063var import_dist571 = __toESM(require_dist(), 1);
4064var import_dist572 = __toESM(require_dist2(), 1);
4065var import_dist573 = __toESM(require_dist3(), 1);
4066var isEasingArray = (ease2) => {
4067  return Array.isArray(ease2) && typeof ease2[0] !== "number";
4068};
4069var import_dist574 = __toESM(require_dist(), 1);
4070var import_dist575 = __toESM(require_dist2(), 1);
4071var import_dist576 = __toESM(require_dist3(), 1);
4072var easingLookup = {
4073  linear: noop,
4074  easeIn,
4075  easeInOut,
4076  easeOut,
4077  circIn,
4078  circInOut,
4079  circOut,
4080  backIn,
4081  backInOut,
4082  backOut,
4083  anticipate
4084};
4085var easingDefinitionToFunction = (definition) => {
4086  if (isBezierDefinition(definition)) {
4087    invariant(definition.length === 4, `Cubic bezier arrays must contain four numerical values.`);
4088    const [x1, y1, x2, y2] = definition;
4089    return cubicBezier(x1, y1, x2, y2);
4090  } else if (typeof definition === "string") {
4091    invariant(easingLookup[definition] !== void 0, `Invalid easing type '${definition}'`);
4092    return easingLookup[definition];
4093  }
4094  return definition;
4095};
4096var import_dist577 = __toESM(require_dist(), 1);
4097var import_dist578 = __toESM(require_dist2(), 1);
4098var import_dist579 = __toESM(require_dist3(), 1);
4099function createMixers(output, ease2, customMixer) {
4100  const mixers = [];
4101  const mixerFactory = customMixer || mix;
4102  const numMixers = output.length - 1;
4103  for (let i = 0; i < numMixers; i++) {
4104    let mixer = mixerFactory(output[i], output[i + 1]);
4105    if (ease2) {
4106      const easingFunction = Array.isArray(ease2) ? ease2[i] || noop : ease2;
4107      mixer = pipe(easingFunction, mixer);
4108    }
4109    mixers.push(mixer);
4110  }
4111  return mixers;
4112}
4113function interpolate(input, output, { clamp: isClamp = true, ease: ease2, mixer } = {}) {
4114  const inputLength = input.length;
4115  invariant(inputLength === output.length, "Both input and output ranges must be the same length");
4116  if (inputLength === 1)
4117    return () => output[0];
4118  if (inputLength === 2 && output[0] === output[1])
4119    return () => output[1];
4120  const isZeroDeltaRange = input[0] === input[1];
4121  if (input[0] > input[inputLength - 1]) {
4122    input = [...input].reverse();
4123    output = [...output].reverse();
4124  }
4125  const mixers = createMixers(output, ease2, mixer);
4126  const numMixers = mixers.length;
4127  const interpolator = (v) => {
4128    if (isZeroDeltaRange && v < input[0])
4129      return output[0];
4130    let i = 0;
4131    if (numMixers > 1) {
4132      for (; i < input.length - 2; i++) {
4133        if (v < input[i + 1])
4134          break;
4135      }
4136    }
4137    const progressInRange = progress(input[i], input[i + 1], v);
4138    return mixers[i](progressInRange);
4139  };
4140  return isClamp ? (v) => interpolator(clamp(input[0], input[inputLength - 1], v)) : interpolator;
4141}
4142var import_dist583 = __toESM(require_dist(), 1);
4143var import_dist584 = __toESM(require_dist2(), 1);
4144var import_dist585 = __toESM(require_dist3(), 1);
4145var import_dist580 = __toESM(require_dist(), 1);
4146var import_dist581 = __toESM(require_dist2(), 1);
4147var import_dist582 = __toESM(require_dist3(), 1);
4148function fillOffset(offset, remaining) {
4149  const min = offset[offset.length - 1];
4150  for (let i = 1; i <= remaining; i++) {
4151    const offsetProgress = progress(0, remaining, i);
4152    offset.push(mixNumber(min, 1, offsetProgress));
4153  }
4154}
4155function defaultOffset(arr) {
4156  const offset = [0];
4157  fillOffset(offset, arr.length - 1);
4158  return offset;
4159}
4160var import_dist586 = __toESM(require_dist(), 1);
4161var import_dist587 = __toESM(require_dist2(), 1);
4162var import_dist588 = __toESM(require_dist3(), 1);
4163function convertOffsetToTimes(offset, duration) {
4164  return offset.map((o) => o * duration);
4165}
4166function defaultEasing(values, easing) {
4167  return values.map(() => easing || easeInOut).splice(0, values.length - 1);
4168}
4169function keyframes({ duration = 300, keyframes: keyframeValues, times, ease: ease2 = "easeInOut" }) {
4170  const easingFunctions = isEasingArray(ease2) ? ease2.map(easingDefinitionToFunction) : easingDefinitionToFunction(ease2);
4171  const state2 = {
4172    done: false,
4173    value: keyframeValues[0]
4174  };
4175  const absoluteTimes = convertOffsetToTimes(
4176    // Only use the provided offsets if they're the correct length
4177    // TODO Maybe we should warn here if there's a length mismatch
4178    times && times.length === keyframeValues.length ? times : defaultOffset(keyframeValues),
4179    duration
4180  );
4181  const mapTimeToKeyframe = interpolate(absoluteTimes, keyframeValues, {
4182    ease: Array.isArray(easingFunctions) ? easingFunctions : defaultEasing(keyframeValues, easingFunctions)
4183  });
4184  return {
4185    calculatedDuration: duration,
4186    next: (t) => {
4187      state2.value = mapTimeToKeyframe(t);
4188      state2.done = t >= duration;
4189      return state2;
4190    }
4191  };
4192}
4193var import_dist592 = __toESM(require_dist(), 1);
4194var import_dist593 = __toESM(require_dist2(), 1);
4195var import_dist594 = __toESM(require_dist3(), 1);
4196var frameloopDriver = (update) => {
4197  const passTimestamp = ({ timestamp }) => update(timestamp);
4198  return {
4199    start: () => frame.update(passTimestamp, true),
4200    stop: () => cancelFrame(passTimestamp),
4201    /**
4202     * If we're processing this frame we can use the
4203     * framelocked timestamp to keep things in sync.
4204     */
4205    now: () => frameData.isProcessing ? frameData.timestamp : time.now()
4206  };
4207};
4208var generators = {
4209  decay: inertia,
4210  inertia,
4211  tween: keyframes,
4212  keyframes,
4213  spring
4214};
4215var percentToProgress = (percent2) => percent2 / 100;
4216var MainThreadAnimation = class extends BaseAnimation {
4217  constructor(options) {
4218    super(options);
4219    this.holdTime = null;
4220    this.cancelTime = null;
4221    this.currentTime = 0;
4222    this.playbackSpeed = 1;
4223    this.pendingPlayState = "running";
4224    this.startTime = null;
4225    this.state = "idle";
4226    this.stop = () => {
4227      this.resolver.cancel();
4228      this.isStopped = true;
4229      if (this.state === "idle")
4230        return;
4231      this.teardown();
4232      const { onStop } = this.options;
4233      onStop && onStop();
4234    };
4235    const { name, motionValue: motionValue2, element, keyframes: keyframes2 } = this.options;
4236    const KeyframeResolver$1 = (element === null || element === void 0 ? void 0 : element.KeyframeResolver) || KeyframeResolver;
4237    const onResolved = (resolvedKeyframes, finalKeyframe) => this.onKeyframesResolved(resolvedKeyframes, finalKeyframe);
4238    this.resolver = new KeyframeResolver$1(keyframes2, onResolved, name, motionValue2, element);
4239    this.resolver.scheduleResolve();
4240  }
4241  flatten() {
4242    super.flatten();
4243    if (this._resolved) {
4244      Object.assign(this._resolved, this.initPlayback(this._resolved.keyframes));
4245    }
4246  }
4247  initPlayback(keyframes$1) {
4248    const { type = "keyframes", repeat = 0, repeatDelay = 0, repeatType, velocity = 0 } = this.options;
4249    const generatorFactory = isGenerator(type) ? type : generators[type] || keyframes;
4250    let mapPercentToKeyframes;
4251    let mirroredGenerator;
4252    if (generatorFactory !== keyframes && typeof keyframes$1[0] !== "number") {
4253      if (true) {
4254        invariant(keyframes$1.length === 2, `Only two keyframes currently supported with spring and inertia animations. Trying to animate ${keyframes$1}`);
4255      }
4256      mapPercentToKeyframes = pipe(percentToProgress, mix(keyframes$1[0], keyframes$1[1]));
4257      keyframes$1 = [0, 100];
4258    }
4259    const generator = generatorFactory({ ...this.options, keyframes: keyframes$1 });
4260    if (repeatType === "mirror") {
4261      mirroredGenerator = generatorFactory({
4262        ...this.options,
4263        keyframes: [...keyframes$1].reverse(),
4264        velocity: -velocity
4265      });
4266    }
4267    if (generator.calculatedDuration === null) {
4268      generator.calculatedDuration = calcGeneratorDuration(generator);
4269    }
4270    const { calculatedDuration } = generator;
4271    const resolvedDuration = calculatedDuration + repeatDelay;
4272    const totalDuration = resolvedDuration * (repeat + 1) - repeatDelay;
4273    return {
4274      generator,
4275      mirroredGenerator,
4276      mapPercentToKeyframes,
4277      calculatedDuration,
4278      resolvedDuration,
4279      totalDuration
4280    };
4281  }
4282  onPostResolved() {
4283    const { autoplay = true } = this.options;
4284    this.play();
4285    if (this.pendingPlayState === "paused" || !autoplay) {
4286      this.pause();
4287    } else {
4288      this.state = this.pendingPlayState;
4289    }
4290  }
4291  tick(timestamp, sample = false) {
4292    const { resolved } = this;
4293    if (!resolved) {
4294      const { keyframes: keyframes3 } = this.options;
4295      return { done: true, value: keyframes3[keyframes3.length - 1] };
4296    }
4297    const { finalKeyframe, generator, mirroredGenerator, mapPercentToKeyframes, keyframes: keyframes2, calculatedDuration, totalDuration, resolvedDuration } = resolved;
4298    if (this.startTime === null)
4299      return generator.next(0);
4300    const { delay: delay2, repeat, repeatType, repeatDelay, onUpdate } = this.options;
4301    if (this.speed > 0) {
4302      this.startTime = Math.min(this.startTime, timestamp);
4303    } else if (this.speed < 0) {
4304      this.startTime = Math.min(timestamp - totalDuration / this.speed, this.startTime);
4305    }
4306    if (sample) {
4307      this.currentTime = timestamp;
4308    } else if (this.holdTime !== null) {
4309      this.currentTime = this.holdTime;
4310    } else {
4311      this.currentTime = Math.round(timestamp - this.startTime) * this.speed;
4312    }
4313    const timeWithoutDelay = this.currentTime - delay2 * (this.speed >= 0 ? 1 : -1);
4314    const isInDelayPhase = this.speed >= 0 ? timeWithoutDelay < 0 : timeWithoutDelay > totalDuration;
4315    this.currentTime = Math.max(timeWithoutDelay, 0);
4316    if (this.state === "finished" && this.holdTime === null) {
4317      this.currentTime = totalDuration;
4318    }
4319    let elapsed = this.currentTime;
4320    let frameGenerator = generator;
4321    if (repeat) {
4322      const progress2 = Math.min(this.currentTime, totalDuration) / resolvedDuration;
4323      let currentIteration = Math.floor(progress2);
4324      let iterationProgress = progress2 % 1;
4325      if (!iterationProgress && progress2 >= 1) {
4326        iterationProgress = 1;
4327      }
4328      iterationProgress === 1 && currentIteration--;
4329      currentIteration = Math.min(currentIteration, repeat + 1);
4330      const isOddIteration = Boolean(currentIteration % 2);
4331      if (isOddIteration) {
4332        if (repeatType === "reverse") {
4333          iterationProgress = 1 - iterationProgress;
4334          if (repeatDelay) {
4335            iterationProgress -= repeatDelay / resolvedDuration;
4336          }
4337        } else if (repeatType === "mirror") {
4338          frameGenerator = mirroredGenerator;
4339        }
4340      }
4341      elapsed = clamp(0, 1, iterationProgress) * resolvedDuration;
4342    }
4343    const state2 = isInDelayPhase ? { done: false, value: keyframes2[0] } : frameGenerator.next(elapsed);
4344    if (mapPercentToKeyframes) {
4345      state2.value = mapPercentToKeyframes(state2.value);
4346    }
4347    let { done } = state2;
4348    if (!isInDelayPhase && calculatedDuration !== null) {
4349      done = this.speed >= 0 ? this.currentTime >= totalDuration : this.currentTime <= 0;
4350    }
4351    const isAnimationFinished = this.holdTime === null && (this.state === "finished" || this.state === "running" && done);
4352    if (isAnimationFinished && finalKeyframe !== void 0) {
4353      state2.value = getFinalKeyframe(keyframes2, this.options, finalKeyframe);
4354    }
4355    if (onUpdate) {
4356      onUpdate(state2.value);
4357    }
4358    if (isAnimationFinished) {
4359      this.finish();
4360    }
4361    return state2;
4362  }
4363  get duration() {
4364    const { resolved } = this;
4365    return resolved ? millisecondsToSeconds(resolved.calculatedDuration) : 0;
4366  }
4367  get time() {
4368    return millisecondsToSeconds(this.currentTime);
4369  }
4370  set time(newTime) {
4371    newTime = secondsToMilliseconds(newTime);
4372    this.currentTime = newTime;
4373    if (this.holdTime !== null || this.speed === 0) {
4374      this.holdTime = newTime;
4375    } else if (this.driver) {
4376      this.startTime = this.driver.now() - newTime / this.speed;
4377    }
4378  }
4379  get speed() {
4380    return this.playbackSpeed;
4381  }
4382  set speed(newSpeed) {
4383    const hasChanged = this.playbackSpeed !== newSpeed;
4384    this.playbackSpeed = newSpeed;
4385    if (hasChanged) {
4386      this.time = millisecondsToSeconds(this.currentTime);
4387    }
4388  }
4389  play() {
4390    if (!this.resolver.isScheduled) {
4391      this.resolver.resume();
4392    }
4393    if (!this._resolved) {
4394      this.pendingPlayState = "running";
4395      return;
4396    }
4397    if (this.isStopped)
4398      return;
4399    const { driver = frameloopDriver, onPlay, startTime } = this.options;
4400    if (!this.driver) {
4401      this.driver = driver((timestamp) => this.tick(timestamp));
4402    }
4403    onPlay && onPlay();
4404    const now2 = this.driver.now();
4405    if (this.holdTime !== null) {
4406      this.startTime = now2 - this.holdTime;
4407    } else if (!this.startTime) {
4408      this.startTime = startTime !== null && startTime !== void 0 ? startTime : this.calcStartTime();
4409    } else if (this.state === "finished") {
4410      this.startTime = now2;
4411    }
4412    if (this.state === "finished") {
4413      this.updateFinishedPromise();
4414    }
4415    this.cancelTime = this.startTime;
4416    this.holdTime = null;
4417    this.state = "running";
4418    this.driver.start();
4419  }
4420  pause() {
4421    var _a;
4422    if (!this._resolved) {
4423      this.pendingPlayState = "paused";
4424      return;
4425    }
4426    this.state = "paused";
4427    this.holdTime = (_a = this.currentTime) !== null && _a !== void 0 ? _a : 0;
4428  }
4429  complete() {
4430    if (this.state !== "running") {
4431      this.play();
4432    }
4433    this.pendingPlayState = this.state = "finished";
4434    this.holdTime = null;
4435  }
4436  finish() {
4437    this.teardown();
4438    this.state = "finished";
4439    const { onComplete } = this.options;
4440    onComplete && onComplete();
4441  }
4442  cancel() {
4443    if (this.cancelTime !== null) {
4444      this.tick(this.cancelTime);
4445    }
4446    this.teardown();
4447    this.updateFinishedPromise();
4448  }
4449  teardown() {
4450    this.state = "idle";
4451    this.stopDriver();
4452    this.resolveFinishedPromise();
4453    this.updateFinishedPromise();
4454    this.startTime = this.cancelTime = null;
4455    this.resolver.cancel();
4456  }
4457  stopDriver() {
4458    if (!this.driver)
4459      return;
4460    this.driver.stop();
4461    this.driver = void 0;
4462  }
4463  sample(time2) {
4464    this.startTime = 0;
4465    return this.tick(time2, true);
4466  }
4467};
4468function animateValue(options) {
4469  return new MainThreadAnimation(options);
4470}
4471var import_dist598 = __toESM(require_dist(), 1);
4472var import_dist599 = __toESM(require_dist2(), 1);
4473var import_dist600 = __toESM(require_dist3(), 1);
4474var acceleratedValues = /* @__PURE__ */ new Set([
4475  "opacity",
4476  "clipPath",
4477  "filter",
4478  "transform"
4479  // TODO: Can be accelerated but currently disabled until https://issues.chromium.org/issues/41491098 is resolved
4480  // or until we implement support for linear() easing.
4481  // "background-color"
4482]);
4483var import_dist601 = __toESM(require_dist(), 1);
4484var import_dist602 = __toESM(require_dist2(), 1);
4485var import_dist603 = __toESM(require_dist3(), 1);
4486function startWaapiAnimation(element, valueName, keyframes2, { delay: delay2 = 0, duration = 300, repeat = 0, repeatType = "loop", ease: ease2 = "easeInOut", times } = {}) {
4487  const keyframeOptions = { [valueName]: keyframes2 };
4488  if (times)
4489    keyframeOptions.offset = times;
4490  const easing = mapEasingToNativeEasing(ease2, duration);
4491  if (Array.isArray(easing))
4492    keyframeOptions.easing = easing;
4493  return element.animate(keyframeOptions, {
4494    delay: delay2,
4495    duration,
4496    easing: !Array.isArray(easing) ? easing : "linear",
4497    fill: "both",
4498    iterations: repeat + 1,
4499    direction: repeatType === "reverse" ? "alternate" : "normal"
4500  });
4501}
4502var import_dist604 = __toESM(require_dist(), 1);
4503var import_dist605 = __toESM(require_dist2(), 1);
4504var import_dist606 = __toESM(require_dist3(), 1);
4505var supportsWaapi = memo(() => Object.hasOwnProperty.call(Element.prototype, "animate"));
4506var sampleDelta = 10;
4507var maxDuration = 2e4;
4508function requiresPregeneratedKeyframes(options) {
4509  return isGenerator(options.type) || options.type === "spring" || !isWaapiSupportedEasing(options.ease);
4510}
4511function pregenerateKeyframes(keyframes2, options) {
4512  const sampleAnimation = new MainThreadAnimation({
4513    ...options,
4514    keyframes: keyframes2,
4515    repeat: 0,
4516    delay: 0,
4517    isGenerator: true
4518  });
4519  let state2 = { done: false, value: keyframes2[0] };
4520  const pregeneratedKeyframes = [];
4521  let t = 0;
4522  while (!state2.done && t < maxDuration) {
4523    state2 = sampleAnimation.sample(t);
4524    pregeneratedKeyframes.push(state2.value);
4525    t += sampleDelta;
4526  }
4527  return {
4528    times: void 0,
4529    keyframes: pregeneratedKeyframes,
4530    duration: t - sampleDelta,
4531    ease: "linear"
4532  };
4533}
4534var unsupportedEasingFunctions = {
4535  anticipate,
4536  backInOut,
4537  circInOut
4538};
4539function isUnsupportedEase(key) {
4540  return key in unsupportedEasingFunctions;
4541}
4542var AcceleratedAnimation = class extends BaseAnimation {
4543  constructor(options) {
4544    super(options);
4545    const { name, motionValue: motionValue2, element, keyframes: keyframes2 } = this.options;
4546    this.resolver = new DOMKeyframesResolver(keyframes2, (resolvedKeyframes, finalKeyframe) => this.onKeyframesResolved(resolvedKeyframes, finalKeyframe), name, motionValue2, element);
4547    this.resolver.scheduleResolve();
4548  }
4549  initPlayback(keyframes2, finalKeyframe) {
4550    let { duration = 300, times, ease: ease2, type, motionValue: motionValue2, name, startTime } = this.options;
4551    if (!motionValue2.owner || !motionValue2.owner.current) {
4552      return false;
4553    }
4554    if (typeof ease2 === "string" && supportsLinearEasing() && isUnsupportedEase(ease2)) {
4555      ease2 = unsupportedEasingFunctions[ease2];
4556    }
4557    if (requiresPregeneratedKeyframes(this.options)) {
4558      const { onComplete, onUpdate, motionValue: motionValue3, element, ...options } = this.options;
4559      const pregeneratedAnimation = pregenerateKeyframes(keyframes2, options);
4560      keyframes2 = pregeneratedAnimation.keyframes;
4561      if (keyframes2.length === 1) {
4562        keyframes2[1] = keyframes2[0];
4563      }
4564      duration = pregeneratedAnimation.duration;
4565      times = pregeneratedAnimation.times;
4566      ease2 = pregeneratedAnimation.ease;
4567      type = "keyframes";
4568    }
4569    const animation = startWaapiAnimation(motionValue2.owner.current, name, keyframes2, { ...this.options, duration, times, ease: ease2 });
4570    animation.startTime = startTime !== null && startTime !== void 0 ? startTime : this.calcStartTime();
4571    if (this.pendingTimeline) {
4572      attachTimeline(animation, this.pendingTimeline);
4573      this.pendingTimeline = void 0;
4574    } else {
4575      animation.onfinish = () => {
4576        const { onComplete } = this.options;
4577        motionValue2.set(getFinalKeyframe(keyframes2, this.options, finalKeyframe));
4578        onComplete && onComplete();
4579        this.cancel();
4580        this.resolveFinishedPromise();
4581      };
4582    }
4583    return {
4584      animation,
4585      duration,
4586      times,
4587      type,
4588      ease: ease2,
4589      keyframes: keyframes2
4590    };
4591  }
4592  get duration() {
4593    const { resolved } = this;
4594    if (!resolved)
4595      return 0;
4596    const { duration } = resolved;
4597    return millisecondsToSeconds(duration);
4598  }
4599  get time() {
4600    const { resolved } = this;
4601    if (!resolved)
4602      return 0;
4603    const { animation } = resolved;
4604    return millisecondsToSeconds(animation.currentTime || 0);
4605  }
4606  set time(newTime) {
4607    const { resolved } = this;
4608    if (!resolved)
4609      return;
4610    const { animation } = resolved;
4611    animation.currentTime = secondsToMilliseconds(newTime);
4612  }
4613  get speed() {
4614    const { resolved } = this;
4615    if (!resolved)
4616      return 1;
4617    const { animation } = resolved;
4618    return animation.playbackRate;
4619  }
4620  set speed(newSpeed) {
4621    const { resolved } = this;
4622    if (!resolved)
4623      return;
4624    const { animation } = resolved;
4625    animation.playbackRate = newSpeed;
4626  }
4627  get state() {
4628    const { resolved } = this;
4629    if (!resolved)
4630      return "idle";
4631    const { animation } = resolved;
4632    return animation.playState;
4633  }
4634  get startTime() {
4635    const { resolved } = this;
4636    if (!resolved)
4637      return null;
4638    const { animation } = resolved;
4639    return animation.startTime;
4640  }
4641  /**
4642   * Replace the default DocumentTimeline with another AnimationTimeline.
4643   * Currently used for scroll animations.
4644   */
4645  attachTimeline(timeline) {
4646    if (!this._resolved) {
4647      this.pendingTimeline = timeline;
4648    } else {
4649      const { resolved } = this;
4650      if (!resolved)
4651        return noop;
4652      const { animation } = resolved;
4653      attachTimeline(animation, timeline);
4654    }
4655    return noop;
4656  }
4657  play() {
4658    if (this.isStopped)
4659      return;
4660    const { resolved } = this;
4661    if (!resolved)
4662      return;
4663    const { animation } = resolved;
4664    if (animation.playState === "finished") {
4665      this.updateFinishedPromise();
4666    }
4667    animation.play();
4668  }
4669  pause() {
4670    const { resolved } = this;
4671    if (!resolved)
4672      return;
4673    const { animation } = resolved;
4674    animation.pause();
4675  }
4676  stop() {
4677    this.resolver.cancel();
4678    this.isStopped = true;
4679    if (this.state === "idle")
4680      return;
4681    this.resolveFinishedPromise();
4682    this.updateFinishedPromise();
4683    const { resolved } = this;
4684    if (!resolved)
4685      return;
4686    const { animation, keyframes: keyframes2, duration, type, ease: ease2, times } = resolved;
4687    if (animation.playState === "idle" || animation.playState === "finished") {
4688      return;
4689    }
4690    if (this.time) {
4691      const { motionValue: motionValue2, onUpdate, onComplete, element, ...options } = this.options;
4692      const sampleAnimation = new MainThreadAnimation({
4693        ...options,
4694        keyframes: keyframes2,
4695        duration,
4696        type,
4697        ease: ease2,
4698        times,
4699        isGenerator: true
4700      });
4701      const sampleTime = secondsToMilliseconds(this.time);
4702      motionValue2.setWithVelocity(sampleAnimation.sample(sampleTime - sampleDelta).value, sampleAnimation.sample(sampleTime).value, sampleDelta);
4703    }
4704    const { onStop } = this.options;
4705    onStop && onStop();
4706    this.cancel();
4707  }
4708  complete() {
4709    const { resolved } = this;
4710    if (!resolved)
4711      return;
4712    resolved.animation.finish();
4713  }
4714  cancel() {
4715    const { resolved } = this;
4716    if (!resolved)
4717      return;
4718    resolved.animation.cancel();
4719  }
4720  static supports(options) {
4721    const { motionValue: motionValue2, name, repeatDelay, repeatType, damping, type } = options;
4722    if (!motionValue2 || !motionValue2.owner || !(motionValue2.owner.current instanceof HTMLElement)) {
4723      return false;
4724    }
4725    const { onUpdate, transformTemplate } = motionValue2.owner.getProps();
4726    return supportsWaapi() && name && acceleratedValues.has(name) && /**
4727    * If we're outputting values to onUpdate then we can't use WAAPI as there's
4728    * no way to read the value from WAAPI every frame.
4729    */
4730    !onUpdate && !transformTemplate && !repeatDelay && repeatType !== "mirror" && damping !== 0 && type !== "inertia";
4731  }
4732};
4733var import_dist610 = __toESM(require_dist(), 1);
4734var import_dist611 = __toESM(require_dist2(), 1);
4735var import_dist612 = __toESM(require_dist3(), 1);
4736var underDampedSpring = {
4737  type: "spring",
4738  stiffness: 500,
4739  damping: 25,
4740  restSpeed: 10
4741};
4742var criticallyDampedSpring = (target) => ({
4743  type: "spring",
4744  stiffness: 550,
4745  damping: target === 0 ? 2 * Math.sqrt(550) : 30,
4746  restSpeed: 10
4747});
4748var keyframesTransition = {
4749  type: "keyframes",
4750  duration: 0.8
4751};
4752var ease = {
4753  type: "keyframes",
4754  ease: [0.25, 0.1, 0.35, 1],
4755  duration: 0.3
4756};
4757var getDefaultTransition = (valueKey, { keyframes: keyframes2 }) => {
4758  if (keyframes2.length > 2) {
4759    return keyframesTransition;
4760  } else if (transformProps.has(valueKey)) {
4761    return valueKey.startsWith("scale") ? criticallyDampedSpring(keyframes2[1]) : underDampedSpring;
4762  }
4763  return ease;
4764};
4765var import_dist613 = __toESM(require_dist(), 1);
4766var import_dist614 = __toESM(require_dist2(), 1);
4767var import_dist615 = __toESM(require_dist3(), 1);
4768function isTransitionDefined({ when, delay: _delay, delayChildren, staggerChildren, staggerDirection, repeat, repeatType, repeatDelay, from, elapsed, ...transition }) {
4769  return !!Object.keys(transition).length;
4770}
4771var animateMotionValue = (name, value, target, transition = {}, element, isHandoff) => (onComplete) => {
4772  const valueTransition = getValueTransition(transition, name) || {};
4773  const delay2 = valueTransition.delay || transition.delay || 0;
4774  let { elapsed = 0 } = transition;
4775  elapsed = elapsed - secondsToMilliseconds(delay2);
4776  let options = {
4777    keyframes: Array.isArray(target) ? target : [null, target],
4778    ease: "easeOut",
4779    velocity: value.getVelocity(),
4780    ...valueTransition,
4781    delay: -elapsed,
4782    onUpdate: (v) => {
4783      value.set(v);
4784      valueTransition.onUpdate && valueTransition.onUpdate(v);
4785    },
4786    onComplete: () => {
4787      onComplete();
4788      valueTransition.onComplete && valueTransition.onComplete();
4789    },
4790    name,
4791    motionValue: value,
4792    element: isHandoff ? void 0 : element
4793  };
4794  if (!isTransitionDefined(valueTransition)) {
4795    options = {
4796      ...options,
4797      ...getDefaultTransition(name, options)
4798    };
4799  }
4800  if (options.duration) {
4801    options.duration = secondsToMilliseconds(options.duration);
4802  }
4803  if (options.repeatDelay) {
4804    options.repeatDelay = secondsToMilliseconds(options.repeatDelay);
4805  }
4806  if (options.from !== void 0) {
4807    options.keyframes[0] = options.from;
4808  }
4809  let shouldSkip = false;
4810  if (options.type === false || options.duration === 0 && !options.repeatDelay) {
4811    options.duration = 0;
4812    if (options.delay === 0) {
4813      shouldSkip = true;
4814    }
4815  }
4816  if (instantAnimationState.current || MotionGlobalConfig.skipAnimations) {
4817    shouldSkip = true;
4818    options.duration = 0;
4819    options.delay = 0;
4820  }
4821  if (shouldSkip && !isHandoff && value.get() !== void 0) {
4822    const finalKeyframe = getFinalKeyframe(options.keyframes, valueTransition);
4823    if (finalKeyframe !== void 0) {
4824      frame.update(() => {
4825        options.onUpdate(finalKeyframe);
4826        options.onComplete();
4827      });
4828      return new GroupPlaybackControls([]);
4829    }
4830  }
4831  if (!isHandoff && AcceleratedAnimation.supports(options)) {
4832    return new AcceleratedAnimation(options);
4833  } else {
4834    return new MainThreadAnimation(options);
4835  }
4836};
4837function shouldBlockAnimation({ protectedKeys, needsAnimating }, key) {
4838  const shouldBlock = protectedKeys.hasOwnProperty(key) && needsAnimating[key] !== true;
4839  needsAnimating[key] = false;
4840  return shouldBlock;
4841}
4842function animateTarget(visualElement, targetAndTransition, { delay: delay2 = 0, transitionOverride, type } = {}) {
4843  var _a;
4844  let { transition = visualElement.getDefaultTransition(), transitionEnd, ...target } = targetAndTransition;
4845  if (transitionOverride)
4846    transition = transitionOverride;
4847  const animations2 = [];
4848  const animationTypeState = type && visualElement.animationState && visualElement.animationState.getState()[type];
4849  for (const key in target) {
4850    const value = visualElement.getValue(key, (_a = visualElement.latestValues[key]) !== null && _a !== void 0 ? _a : null);
4851    const valueTarget = target[key];
4852    if (valueTarget === void 0 || animationTypeState && shouldBlockAnimation(animationTypeState, key)) {
4853      continue;
4854    }
4855    const valueTransition = {
4856      delay: delay2,
4857      ...getValueTransition(transition || {}, key)
4858    };
4859    let isHandoff = false;
4860    if (window.MotionHandoffAnimation) {
4861      const appearId = getOptimisedAppearId(visualElement);
4862      if (appearId) {
4863        const startTime = window.MotionHandoffAnimation(appearId, key, frame);
4864        if (startTime !== null) {
4865          valueTransition.startTime = startTime;
4866          isHandoff = true;
4867        }
4868      }
4869    }
4870    addValueToWillChange(visualElement, key);
4871    value.start(animateMotionValue(key, value, valueTarget, visualElement.shouldReduceMotion && positionalKeys.has(key) ? { type: false } : valueTransition, visualElement, isHandoff));
4872    const animation = value.animation;
4873    if (animation) {
4874      animations2.push(animation);
4875    }
4876  }
4877  if (transitionEnd) {
4878    Promise.all(animations2).then(() => {
4879      frame.update(() => {
4880        transitionEnd && setTarget(visualElement, transitionEnd);
4881      });
4882    });
4883  }
4884  return animations2;
4885}
4886var import_dist622 = __toESM(require_dist(), 1);
4887var import_dist623 = __toESM(require_dist2(), 1);
4888var import_dist624 = __toESM(require_dist3(), 1);
4889function animateVariant(visualElement, variant, options = {}) {
4890  var _a;
4891  const resolved = resolveVariant(visualElement, variant, options.type === "exit" ? (_a = visualElement.presenceContext) === null || _a === void 0 ? void 0 : _a.custom : void 0);
4892  let { transition = visualElement.getDefaultTransition() || {} } = resolved || {};
4893  if (options.transitionOverride) {
4894    transition = options.transitionOverride;
4895  }
4896  const getAnimation = resolved ? () => Promise.all(animateTarget(visualElement, resolved, options)) : () => Promise.resolve();
4897  const getChildAnimations = visualElement.variantChildren && visualElement.variantChildren.size ? (forwardDelay = 0) => {
4898    const { delayChildren = 0, staggerChildren, staggerDirection } = transition;
4899    return animateChildren(visualElement, variant, delayChildren + forwardDelay, staggerChildren, staggerDirection, options);
4900  } : () => Promise.resolve();
4901  const { when } = transition;
4902  if (when) {
4903    const [first, last] = when === "beforeChildren" ? [getAnimation, getChildAnimations] : [getChildAnimations, getAnimation];
4904    return first().then(() => last());
4905  } else {
4906    return Promise.all([getAnimation(), getChildAnimations(options.delay)]);
4907  }
4908}
4909function animateChildren(visualElement, variant, delayChildren = 0, staggerChildren = 0, staggerDirection = 1, options) {
4910  const animations2 = [];
4911  const maxStaggerDuration = (visualElement.variantChildren.size - 1) * staggerChildren;
4912  const generateStaggerDuration = staggerDirection === 1 ? (i = 0) => i * staggerChildren : (i = 0) => maxStaggerDuration - i * staggerChildren;
4913  Array.from(visualElement.variantChildren).sort(sortByTreeOrder).forEach((child, i) => {
4914    child.notify("AnimationStart", variant);
4915    animations2.push(animateVariant(child, variant, {
4916      ...options,
4917      delay: delayChildren + generateStaggerDuration(i)
4918    }).then(() => child.notify("AnimationComplete", variant)));
4919  });
4920  return Promise.all(animations2);
4921}
4922function sortByTreeOrder(a, b) {
4923  return a.sortNodePosition(b);
4924}
4925function animateVisualElement(visualElement, definition, options = {}) {
4926  visualElement.notify("AnimationStart", definition);
4927  let animation;
4928  if (Array.isArray(definition)) {
4929    const animations2 = definition.map((variant) => animateVariant(visualElement, variant, options));
4930    animation = Promise.all(animations2);
4931  } else if (typeof definition === "string") {
4932    animation = animateVariant(visualElement, definition, options);
4933  } else {
4934    const resolvedDefinition = typeof definition === "function" ? resolveVariant(visualElement, definition, options.custom) : definition;
4935    animation = Promise.all(animateTarget(visualElement, resolvedDefinition, options));
4936  }
4937  return animation.then(() => {
4938    visualElement.notify("AnimationComplete", definition);
4939  });
4940}
4941var import_dist628 = __toESM(require_dist(), 1);
4942var import_dist629 = __toESM(require_dist2(), 1);
4943var import_dist630 = __toESM(require_dist3(), 1);
4944var numVariantProps = variantProps.length;
4945function getVariantContext(visualElement) {
4946  if (!visualElement)
4947    return void 0;
4948  if (!visualElement.isControllingVariants) {
4949    const context2 = visualElement.parent ? getVariantContext(visualElement.parent) || {} : {};
4950    if (visualElement.props.initial !== void 0) {
4951      context2.initial = visualElement.props.initial;
4952    }
4953    return context2;
4954  }
4955  const context = {};
4956  for (let i = 0; i < numVariantProps; i++) {
4957    const name = variantProps[i];
4958    const prop = visualElement.props[name];
4959    if (isVariantLabel(prop) || prop === false) {
4960      context[name] = prop;
4961    }
4962  }
4963  return context;
4964}
4965var reversePriorityOrder = [...variantPriorityOrder].reverse();
4966var numAnimationTypes = variantPriorityOrder.length;
4967function animateList(visualElement) {
4968  return (animations2) => Promise.all(animations2.map(({ animation, options }) => animateVisualElement(visualElement, animation, options)));
4969}
4970function createAnimationState(visualElement) {
4971  let animate2 = animateList(visualElement);
4972  let state2 = createState();
4973  let isInitialRender = true;
4974  const buildResolvedTypeValues = (type) => (acc, definition) => {
4975    var _a;
4976    const resolved = resolveVariant(visualElement, definition, type === "exit" ? (_a = visualElement.presenceContext) === null || _a === void 0 ? void 0 : _a.custom : void 0);
4977    if (resolved) {
4978      const { transition, transitionEnd, ...target } = resolved;
4979      acc = { ...acc, ...target, ...transitionEnd };
4980    }
4981    return acc;
4982  };
4983  function setAnimateFunction(makeAnimator) {
4984    animate2 = makeAnimator(visualElement);
4985  }
4986  function animateChanges(changedActiveType) {
4987    const { props } = visualElement;
4988    const context = getVariantContext(visualElement.parent) || {};
4989    const animations2 = [];
4990    const removedKeys = /* @__PURE__ */ new Set();
4991    let encounteredKeys = {};
4992    let removedVariantIndex = Infinity;
4993    for (let i = 0; i < numAnimationTypes; i++) {
4994      const type = reversePriorityOrder[i];
4995      const typeState = state2[type];
4996      const prop = props[type] !== void 0 ? props[type] : context[type];
4997      const propIsVariant = isVariantLabel(prop);
4998      const activeDelta = type === changedActiveType ? typeState.isActive : null;
4999      if (activeDelta === false)
5000        removedVariantIndex = i;
5001      let isInherited = prop === context[type] && prop !== props[type] && propIsVariant;
5002      if (isInherited && isInitialRender && visualElement.manuallyAnimateOnMount) {
5003        isInherited = false;
5004      }
5005      typeState.protectedKeys = { ...encounteredKeys };
5006      if (
5007        // If it isn't active and hasn't *just* been set as inactive
5008        !typeState.isActive && activeDelta === null || // If we didn't and don't have any defined prop for this animation type
5009        !prop && !typeState.prevProp || // Or if the prop doesn't define an animation
5010        isAnimationControls(prop) || typeof prop === "boolean"
5011      ) {
5012        continue;
5013      }
5014      const variantDidChange = checkVariantsDidChange(typeState.prevProp, prop);
5015      let shouldAnimateType = variantDidChange || // If we're making this variant active, we want to always make it active
5016      type === changedActiveType && typeState.isActive && !isInherited && propIsVariant || // If we removed a higher-priority variant (i is in reverse order)
5017      i > removedVariantIndex && propIsVariant;
5018      let handledRemovedValues = false;
5019      const definitionList = Array.isArray(prop) ? prop : [prop];
5020      let resolvedValues = definitionList.reduce(buildResolvedTypeValues(type), {});
5021      if (activeDelta === false)
5022        resolvedValues = {};
5023      const { prevResolvedValues = {} } = typeState;
5024      const allKeys = {
5025        ...prevResolvedValues,
5026        ...resolvedValues
5027      };
5028      const markToAnimate = (key) => {
5029        shouldAnimateType = true;
5030        if (removedKeys.has(key)) {
5031          handledRemovedValues = true;
5032          removedKeys.delete(key);
5033        }
5034        typeState.needsAnimating[key] = true;
5035        const motionValue2 = visualElement.getValue(key);
5036        if (motionValue2)
5037          motionValue2.liveStyle = false;
5038      };
5039      for (const key in allKeys) {
5040        const next = resolvedValues[key];
5041        const prev = prevResolvedValues[key];
5042        if (encounteredKeys.hasOwnProperty(key))
5043          continue;
5044        let valueHasChanged = false;
5045        if (isKeyframesTarget(next) && isKeyframesTarget(prev)) {
5046          valueHasChanged = !shallowCompare(next, prev);
5047        } else {
5048          valueHasChanged = next !== prev;
5049        }
5050        if (valueHasChanged) {
5051          if (next !== void 0 && next !== null) {
5052            markToAnimate(key);
5053          } else {
5054            removedKeys.add(key);
5055          }
5056        } else if (next !== void 0 && removedKeys.has(key)) {
5057          markToAnimate(key);
5058        } else {
5059          typeState.protectedKeys[key] = true;
5060        }
5061      }
5062      typeState.prevProp = prop;
5063      typeState.prevResolvedValues = resolvedValues;
5064      if (typeState.isActive) {
5065        encounteredKeys = { ...encounteredKeys, ...resolvedValues };
5066      }
5067      if (isInitialRender && visualElement.blockInitialAnimation) {
5068        shouldAnimateType = false;
5069      }
5070      const willAnimateViaParent = isInherited && variantDidChange;
5071      const needsAnimating = !willAnimateViaParent || handledRemovedValues;
5072      if (shouldAnimateType && needsAnimating) {
5073        animations2.push(...definitionList.map((animation) => ({
5074          animation,
5075          options: { type }
5076        })));
5077      }
5078    }
5079    if (removedKeys.size) {
5080      const fallbackAnimation = {};
5081      removedKeys.forEach((key) => {
5082        const fallbackTarget = visualElement.getBaseTarget(key);
5083        const motionValue2 = visualElement.getValue(key);
5084        if (motionValue2)
5085          motionValue2.liveStyle = true;
5086        fallbackAnimation[key] = fallbackTarget !== null && fallbackTarget !== void 0 ? fallbackTarget : null;
5087      });
5088      animations2.push({ animation: fallbackAnimation });
5089    }
5090    let shouldAnimate = Boolean(animations2.length);
5091    if (isInitialRender && (props.initial === false || props.initial === props.animate) && !visualElement.manuallyAnimateOnMount) {
5092      shouldAnimate = false;
5093    }
5094    isInitialRender = false;
5095    return shouldAnimate ? animate2(animations2) : Promise.resolve();
5096  }
5097  function setActive(type, isActive) {
5098    var _a;
5099    if (state2[type].isActive === isActive)
5100      return Promise.resolve();
5101    (_a = visualElement.variantChildren) === null || _a === void 0 ? void 0 : _a.forEach((child) => {
5102      var _a2;
5103      return (_a2 = child.animationState) === null || _a2 === void 0 ? void 0 : _a2.setActive(type, isActive);
5104    });
5105    state2[type].isActive = isActive;
5106    const animations2 = animateChanges(type);
5107    for (const key in state2) {
5108      state2[key].protectedKeys = {};
5109    }
5110    return animations2;
5111  }
5112  return {
5113    animateChanges,
5114    setActive,
5115    setAnimateFunction,
5116    getState: () => state2,
5117    reset: () => {
5118      state2 = createState();
5119      isInitialRender = true;
5120    }
5121  };
5122}
5123function checkVariantsDidChange(prev, next) {
5124  if (typeof next === "string") {
5125    return next !== prev;
5126  } else if (Array.isArray(next)) {
5127    return !shallowCompare(next, prev);
5128  }
5129  return false;
5130}
5131function createTypeState(isActive = false) {
5132  return {
5133    isActive,
5134    protectedKeys: {},
5135    needsAnimating: {},
5136    prevResolvedValues: {}
5137  };
5138}
5139function createState() {
5140  return {
5141    animate: createTypeState(true),
5142    whileInView: createTypeState(),
5143    whileHover: createTypeState(),
5144    whileTap: createTypeState(),
5145    whileDrag: createTypeState(),
5146    whileFocus: createTypeState(),
5147    exit: createTypeState()
5148  };
5149}
5150var import_dist634 = __toESM(require_dist(), 1);
5151var import_dist635 = __toESM(require_dist2(), 1);
5152var import_dist636 = __toESM(require_dist3(), 1);
5153var Feature = class {
5154  constructor(node) {
5155    this.isMounted = false;
5156    this.node = node;
5157  }
5158  update() {
5159  }
5160};
5161var AnimationFeature = class extends Feature {
5162  /**
5163   * We dynamically generate the AnimationState manager as it contains a reference
5164   * to the underlying animation library. We only want to load that if we load this,
5165   * so people can optionally code split it out using the `m` component.
5166   */
5167  constructor(node) {
5168    super(node);
5169    node.animationState || (node.animationState = createAnimationState(node));
5170  }
5171  updateAnimationControlsSubscription() {
5172    const { animate: animate2 } = this.node.getProps();
5173    if (isAnimationControls(animate2)) {
5174      this.unmountControls = animate2.subscribe(this.node);
5175    }
5176  }
5177  /**
5178   * Subscribe any provided AnimationControls to the component's VisualElement
5179   */
5180  mount() {
5181    this.updateAnimationControlsSubscription();
5182  }
5183  update() {
5184    const { animate: animate2 } = this.node.getProps();
5185    const { animate: prevAnimate } = this.node.prevProps || {};
5186    if (animate2 !== prevAnimate) {
5187      this.updateAnimationControlsSubscription();
5188    }
5189  }
5190  unmount() {
5191    var _a;
5192    this.node.animationState.reset();
5193    (_a = this.unmountControls) === null || _a === void 0 ? void 0 : _a.call(this);
5194  }
5195};
5196var import_dist640 = __toESM(require_dist(), 1);
5197var import_dist641 = __toESM(require_dist2(), 1);
5198var import_dist642 = __toESM(require_dist3(), 1);
5199var id = 0;
5200var ExitAnimationFeature = class extends Feature {
5201  constructor() {
5202    super(...arguments);
5203    this.id = id++;
5204  }
5205  update() {
5206    if (!this.node.presenceContext)
5207      return;
5208    const { isPresent: isPresent2, onExitComplete } = this.node.presenceContext;
5209    const { isPresent: prevIsPresent } = this.node.prevPresenceContext || {};
5210    if (!this.node.animationState || isPresent2 === prevIsPresent) {
5211      return;
5212    }
5213    const exitAnimation = this.node.animationState.setActive("exit", !isPresent2);
5214    if (onExitComplete && !isPresent2) {
5215      exitAnimation.then(() => onExitComplete(this.id));
5216    }
5217  }
5218  mount() {
5219    const { register } = this.node.presenceContext || {};
5220    if (register) {
5221      this.unmount = register(this.id);
5222    }
5223  }
5224  unmount() {
5225  }
5226};
5227var animations = {
5228  animation: {
5229    Feature: AnimationFeature
5230  },
5231  exit: {
5232    Feature: ExitAnimationFeature
5233  }
5234};
5235var import_dist751 = __toESM(require_dist(), 1);
5236var import_dist752 = __toESM(require_dist2(), 1);
5237var import_dist753 = __toESM(require_dist3(), 1);
5238var import_dist691 = __toESM(require_dist(), 1);
5239var import_dist692 = __toESM(require_dist2(), 1);
5240var import_dist693 = __toESM(require_dist3(), 1);
5241var import_dist688 = __toESM(require_dist(), 1);
5242var import_dist689 = __toESM(require_dist2(), 1);
5243var import_dist690 = __toESM(require_dist3(), 1);
5244var import_dist658 = __toESM(require_dist(), 1);
5245var import_dist659 = __toESM(require_dist2(), 1);
5246var import_dist660 = __toESM(require_dist3(), 1);
5247var import_dist652 = __toESM(require_dist(), 1);
5248var import_dist653 = __toESM(require_dist2(), 1);
5249var import_dist654 = __toESM(require_dist3(), 1);
5250var import_dist646 = __toESM(require_dist(), 1);
5251var import_dist647 = __toESM(require_dist2(), 1);
5252var import_dist648 = __toESM(require_dist3(), 1);
5253function addDomEvent(target, eventName, handler, options = { passive: true }) {
5254  target.addEventListener(eventName, handler, options);
5255  return () => target.removeEventListener(eventName, handler);
5256}
5257var import_dist649 = __toESM(require_dist(), 1);
5258var import_dist650 = __toESM(require_dist2(), 1);
5259var import_dist651 = __toESM(require_dist3(), 1);
5260function extractEventInfo(event) {
5261  return {
5262    point: {
5263      x: event.pageX,
5264      y: event.pageY
5265    }
5266  };
5267}
5268var addPointerInfo = (handler) => {
5269  return (event) => isPrimaryPointer(event) && handler(event, extractEventInfo(event));
5270};
5271function addPointerEvent(target, eventName, handler, options) {
5272  return addDomEvent(target, eventName, addPointerInfo(handler), options);
5273}
5274var import_dist655 = __toESM(require_dist(), 1);
5275var import_dist656 = __toESM(require_dist2(), 1);
5276var import_dist657 = __toESM(require_dist3(), 1);
5277var distance = (a, b) => Math.abs(a - b);
5278function distance2D(a, b) {
5279  const xDelta = distance(a.x, b.x);
5280  const yDelta = distance(a.y, b.y);
5281  return Math.sqrt(xDelta ** 2 + yDelta ** 2);
5282}
5283var PanSession = class {
5284  constructor(event, handlers, { transformPagePoint, contextWindow, dragSnapToOrigin = false } = {}) {
5285    this.startEvent = null;
5286    this.lastMoveEvent = null;
5287    this.lastMoveEventInfo = null;
5288    this.handlers = {};
5289    this.contextWindow = window;
5290    this.updatePoint = () => {
5291      if (!(this.lastMoveEvent && this.lastMoveEventInfo))
5292        return;
5293      const info2 = getPanInfo(this.lastMoveEventInfo, this.history);
5294      const isPanStarted = this.startEvent !== null;
5295      const isDistancePastThreshold = distance2D(info2.offset, { x: 0, y: 0 }) >= 3;
5296      if (!isPanStarted && !isDistancePastThreshold)
5297        return;
5298      const { point: point3 } = info2;
5299      const { timestamp: timestamp2 } = frameData;
5300      this.history.push({ ...point3, timestamp: timestamp2 });
5301      const { onStart, onMove } = this.handlers;
5302      if (!isPanStarted) {
5303        onStart && onStart(this.lastMoveEvent, info2);
5304        this.startEvent = this.lastMoveEvent;
5305      }
5306      onMove && onMove(this.lastMoveEvent, info2);
5307    };
5308    this.handlePointerMove = (event2, info2) => {
5309      this.lastMoveEvent = event2;
5310      this.lastMoveEventInfo = transformPoint(info2, this.transformPagePoint);
5311      frame.update(this.updatePoint, true);
5312    };
5313    this.handlePointerUp = (event2, info2) => {
5314      this.end();
5315      const { onEnd, onSessionEnd, resumeAnimation } = this.handlers;
5316      if (this.dragSnapToOrigin)
5317        resumeAnimation && resumeAnimation();
5318      if (!(this.lastMoveEvent && this.lastMoveEventInfo))
5319        return;
5320      const panInfo = getPanInfo(event2.type === "pointercancel" ? this.lastMoveEventInfo : transformPoint(info2, this.transformPagePoint), this.history);
5321      if (this.startEvent && onEnd) {
5322        onEnd(event2, panInfo);
5323      }
5324      onSessionEnd && onSessionEnd(event2, panInfo);
5325    };
5326    if (!isPrimaryPointer(event))
5327      return;
5328    this.dragSnapToOrigin = dragSnapToOrigin;
5329    this.handlers = handlers;
5330    this.transformPagePoint = transformPagePoint;
5331    this.contextWindow = contextWindow || window;
5332    const info = extractEventInfo(event);
5333    const initialInfo = transformPoint(info, this.transformPagePoint);
5334    const { point: point2 } = initialInfo;
5335    const { timestamp } = frameData;
5336    this.history = [{ ...point2, timestamp }];
5337    const { onSessionStart } = handlers;
5338    onSessionStart && onSessionStart(event, getPanInfo(initialInfo, this.history));
5339    this.removeListeners = pipe(addPointerEvent(this.contextWindow, "pointermove", this.handlePointerMove), addPointerEvent(this.contextWindow, "pointerup", this.handlePointerUp), addPointerEvent(this.contextWindow, "pointercancel", this.handlePointerUp));
5340  }
5341  updateHandlers(handlers) {
5342    this.handlers = handlers;
5343  }
5344  end() {
5345    this.removeListeners && this.removeListeners();
5346    cancelFrame(this.updatePoint);
5347  }
5348};
5349function transformPoint(info, transformPagePoint) {
5350  return transformPagePoint ? { point: transformPagePoint(info.point) } : info;
5351}
5352function subtractPoint(a, b) {
5353  return { x: a.x - b.x, y: a.y - b.y };
5354}
5355function getPanInfo({ point: point2 }, history) {
5356  return {
5357    point: point2,
5358    delta: subtractPoint(point2, lastDevicePoint(history)),
5359    offset: subtractPoint(point2, startDevicePoint(history)),
5360    velocity: getVelocity(history, 0.1)
5361  };
5362}
5363function startDevicePoint(history) {
5364  return history[0];
5365}
5366function lastDevicePoint(history) {
5367  return history[history.length - 1];
5368}
5369function getVelocity(history, timeDelta) {
5370  if (history.length < 2) {
5371    return { x: 0, y: 0 };
5372  }
5373  let i = history.length - 1;
5374  let timestampedPoint = null;
5375  const lastPoint = lastDevicePoint(history);
5376  while (i >= 0) {
5377    timestampedPoint = history[i];
5378    if (lastPoint.timestamp - timestampedPoint.timestamp > secondsToMilliseconds(timeDelta)) {
5379      break;
5380    }
5381    i--;
5382  }
5383  if (!timestampedPoint) {
5384    return { x: 0, y: 0 };
5385  }
5386  const time2 = millisecondsToSeconds(lastPoint.timestamp - timestampedPoint.timestamp);
5387  if (time2 === 0) {
5388    return { x: 0, y: 0 };
5389  }
5390  const currentVelocity = {
5391    x: (lastPoint.x - timestampedPoint.x) / time2,
5392    y: (lastPoint.y - timestampedPoint.y) / time2
5393  };
5394  if (currentVelocity.x === Infinity) {
5395    currentVelocity.x = 0;
5396  }
5397  if (currentVelocity.y === Infinity) {
5398    currentVelocity.y = 0;
5399  }
5400  return currentVelocity;
5401}
5402var import_dist664 = __toESM(require_dist(), 1);
5403var import_dist665 = __toESM(require_dist2(), 1);
5404var import_dist666 = __toESM(require_dist3(), 1);
5405var import_dist661 = __toESM(require_dist(), 1);
5406var import_dist662 = __toESM(require_dist2(), 1);
5407var import_dist663 = __toESM(require_dist3(), 1);
5408var SCALE_PRECISION = 1e-4;
5409var SCALE_MIN = 1 - SCALE_PRECISION;
5410var SCALE_MAX = 1 + SCALE_PRECISION;
5411var TRANSLATE_PRECISION = 0.01;
5412var TRANSLATE_MIN = 0 - TRANSLATE_PRECISION;
5413var TRANSLATE_MAX = 0 + TRANSLATE_PRECISION;
5414function calcLength(axis) {
5415  return axis.max - axis.min;
5416}
5417function isNear(value, target, maxDistance) {
5418  return Math.abs(value - target) <= maxDistance;
5419}
5420function calcAxisDelta(delta, source, target, origin = 0.5) {
5421  delta.origin = origin;
5422  delta.originPoint = mixNumber(source.min, source.max, delta.origin);
5423  delta.scale = calcLength(target) / calcLength(source);
5424  delta.translate = mixNumber(target.min, target.max, delta.origin) - delta.originPoint;
5425  if (delta.scale >= SCALE_MIN && delta.scale <= SCALE_MAX || isNaN(delta.scale)) {
5426    delta.scale = 1;
5427  }
5428  if (delta.translate >= TRANSLATE_MIN && delta.translate <= TRANSLATE_MAX || isNaN(delta.translate)) {
5429    delta.translate = 0;
5430  }
5431}
5432function calcBoxDelta(delta, source, target, origin) {
5433  calcAxisDelta(delta.x, source.x, target.x, origin ? origin.originX : void 0);
5434  calcAxisDelta(delta.y, source.y, target.y, origin ? origin.originY : void 0);
5435}
5436function calcRelativeAxis(target, relative, parent) {
5437  target.min = parent.min + relative.min;
5438  target.max = target.min + calcLength(relative);
5439}
5440function calcRelativeBox(target, relative, parent) {
5441  calcRelativeAxis(target.x, relative.x, parent.x);
5442  calcRelativeAxis(target.y, relative.y, parent.y);
5443}
5444function calcRelativeAxisPosition(target, layout2, parent) {
5445  target.min = layout2.min - parent.min;
5446  target.max = target.min + calcLength(layout2);
5447}
5448function calcRelativePosition(target, layout2, parent) {
5449  calcRelativeAxisPosition(target.x, layout2.x, parent.x);
5450  calcRelativeAxisPosition(target.y, layout2.y, parent.y);
5451}
5452function applyConstraints(point2, { min, max }, elastic) {
5453  if (min !== void 0 && point2 < min) {
5454    point2 = elastic ? mixNumber(min, point2, elastic.min) : Math.max(point2, min);
5455  } else if (max !== void 0 && point2 > max) {
5456    point2 = elastic ? mixNumber(max, point2, elastic.max) : Math.min(point2, max);
5457  }
5458  return point2;
5459}
5460function calcRelativeAxisConstraints(axis, min, max) {
5461  return {
5462    min: min !== void 0 ? axis.min + min : void 0,
5463    max: max !== void 0 ? axis.max + max - (axis.max - axis.min) : void 0
5464  };
5465}
5466function calcRelativeConstraints(layoutBox, { top, left, bottom, right }) {
5467  return {
5468    x: calcRelativeAxisConstraints(layoutBox.x, left, right),
5469    y: calcRelativeAxisConstraints(layoutBox.y, top, bottom)
5470  };
5471}
5472function calcViewportAxisConstraints(layoutAxis, constraintsAxis) {
5473  let min = constraintsAxis.min - layoutAxis.min;
5474  let max = constraintsAxis.max - layoutAxis.max;
5475  if (constraintsAxis.max - constraintsAxis.min < layoutAxis.max - layoutAxis.min) {
5476    [min, max] = [max, min];
5477  }
5478  return { min, max };
5479}
5480function calcViewportConstraints(layoutBox, constraintsBox) {
5481  return {
5482    x: calcViewportAxisConstraints(layoutBox.x, constraintsBox.x),
5483    y: calcViewportAxisConstraints(layoutBox.y, constraintsBox.y)
5484  };
5485}
5486function calcOrigin2(source, target) {
5487  let origin = 0.5;
5488  const sourceLength = calcLength(source);
5489  const targetLength = calcLength(target);
5490  if (targetLength > sourceLength) {
5491    origin = progress(target.min, target.max - sourceLength, source.min);
5492  } else if (sourceLength > targetLength) {
5493    origin = progress(source.min, source.max - targetLength, target.min);
5494  }
5495  return clamp(0, 1, origin);
5496}
5497function rebaseAxisConstraints(layout2, constraints) {
5498  const relativeConstraints = {};
5499  if (constraints.min !== void 0) {
5500    relativeConstraints.min = constraints.min - layout2.min;
5501  }
5502  if (constraints.max !== void 0) {
5503    relativeConstraints.max = constraints.max - layout2.min;
5504  }
5505  return relativeConstraints;
5506}
5507var defaultElastic = 0.35;
5508function resolveDragElastic(dragElastic = defaultElastic) {
5509  if (dragElastic === false) {
5510    dragElastic = 0;
5511  } else if (dragElastic === true) {
5512    dragElastic = defaultElastic;
5513  }
5514  return {
5515    x: resolveAxisElastic(dragElastic, "left", "right"),
5516    y: resolveAxisElastic(dragElastic, "top", "bottom")
5517  };
5518}
5519function resolveAxisElastic(dragElastic, minLabel, maxLabel) {
5520  return {
5521    min: resolvePointElastic(dragElastic, minLabel),
5522    max: resolvePointElastic(dragElastic, maxLabel)
5523  };
5524}
5525function resolvePointElastic(dragElastic, label) {
5526  return typeof dragElastic === "number" ? dragElastic : dragElastic[label] || 0;
5527}
5528var import_dist667 = __toESM(require_dist(), 1);
5529var import_dist668 = __toESM(require_dist2(), 1);
5530var import_dist669 = __toESM(require_dist3(), 1);
5531var createAxisDelta = () => ({
5532  translate: 0,
5533  scale: 1,
5534  origin: 0,
5535  originPoint: 0
5536});
5537var createDelta = () => ({
5538  x: createAxisDelta(),
5539  y: createAxisDelta()
5540});
5541var createAxis = () => ({ min: 0, max: 0 });
5542var createBox = () => ({
5543  x: createAxis(),
5544  y: createAxis()
5545});
5546var import_dist670 = __toESM(require_dist(), 1);
5547var import_dist671 = __toESM(require_dist2(), 1);
5548var import_dist672 = __toESM(require_dist3(), 1);
5549function eachAxis(callback) {
5550  return [callback("x"), callback("y")];
5551}
5552var import_dist682 = __toESM(require_dist(), 1);
5553var import_dist683 = __toESM(require_dist2(), 1);
5554var import_dist684 = __toESM(require_dist3(), 1);
5555var import_dist673 = __toESM(require_dist(), 1);
5556var import_dist674 = __toESM(require_dist2(), 1);
5557var import_dist675 = __toESM(require_dist3(), 1);
5558function convertBoundingBoxToBox({ top, left, right, bottom }) {
5559  return {
5560    x: { min: left, max: right },
5561    y: { min: top, max: bottom }
5562  };
5563}
5564function convertBoxToBoundingBox({ x, y }) {
5565  return { top: y.min, right: x.max, bottom: y.max, left: x.min };
5566}
5567function transformBoxPoints(point2, transformPoint2) {
5568  if (!transformPoint2)
5569    return point2;
5570  const topLeft = transformPoint2({ x: point2.left, y: point2.top });
5571  const bottomRight = transformPoint2({ x: point2.right, y: point2.bottom });
5572  return {
5573    top: topLeft.y,
5574    left: topLeft.x,
5575    bottom: bottomRight.y,
5576    right: bottomRight.x
5577  };
5578}
5579var import_dist679 = __toESM(require_dist(), 1);
5580var import_dist680 = __toESM(require_dist2(), 1);
5581var import_dist681 = __toESM(require_dist3(), 1);
5582var import_dist676 = __toESM(require_dist(), 1);
5583var import_dist677 = __toESM(require_dist2(), 1);
5584var import_dist678 = __toESM(require_dist3(), 1);
5585function isIdentityScale(scale2) {
5586  return scale2 === void 0 || scale2 === 1;
5587}
5588function hasScale({ scale: scale2, scaleX, scaleY }) {
5589  return !isIdentityScale(scale2) || !isIdentityScale(scaleX) || !isIdentityScale(scaleY);
5590}
5591function hasTransform(values) {
5592  return hasScale(values) || has2DTranslate(values) || values.z || values.rotate || values.rotateX || values.rotateY || values.skewX || values.skewY;
5593}
5594function has2DTranslate(values) {
5595  return is2DTranslate(values.x) || is2DTranslate(values.y);
5596}
5597function is2DTranslate(value) {
5598  return value && value !== "0%";
5599}
5600function scalePoint(point2, scale2, originPoint) {
5601  const distanceFromOrigin = point2 - originPoint;
5602  const scaled = scale2 * distanceFromOrigin;
5603  return originPoint + scaled;
5604}
5605function applyPointDelta(point2, translate, scale2, originPoint, boxScale) {
5606  if (boxScale !== void 0) {
5607    point2 = scalePoint(point2, boxScale, originPoint);
5608  }
5609  return scalePoint(point2, scale2, originPoint) + translate;
5610}
5611function applyAxisDelta(axis, translate = 0, scale2 = 1, originPoint, boxScale) {
5612  axis.min = applyPointDelta(axis.min, translate, scale2, originPoint, boxScale);
5613  axis.max = applyPointDelta(axis.max, translate, scale2, originPoint, boxScale);
5614}
5615function applyBoxDelta(box, { x, y }) {
5616  applyAxisDelta(box.x, x.translate, x.scale, x.originPoint);
5617  applyAxisDelta(box.y, y.translate, y.scale, y.originPoint);
5618}
5619var TREE_SCALE_SNAP_MIN = 0.999999999999;
5620var TREE_SCALE_SNAP_MAX = 1.0000000000001;
5621function applyTreeDeltas(box, treeScale, treePath, isSharedTransition = false) {
5622  const treeLength = treePath.length;
5623  if (!treeLength)
5624    return;
5625  treeScale.x = treeScale.y = 1;
5626  let node;
5627  let delta;
5628  for (let i = 0; i < treeLength; i++) {
5629    node = treePath[i];
5630    delta = node.projectionDelta;
5631    const { visualElement } = node.options;
5632    if (visualElement && visualElement.props.style && visualElement.props.style.display === "contents") {
5633      continue;
5634    }
5635    if (isSharedTransition && node.options.layoutScroll && node.scroll && node !== no
5635de.root) {
5636      transformBox(box, {
5637        x: -node.scroll.offset.x,
5638        y: -node.scroll.offset.y
5639      });
5640    }
5641    if (delta) {
5642      treeScale.x *= delta.x.scale;
5643      treeScale.y *= delta.y.scale;
5644      applyBoxDelta(box, delta);
5645    }
5646    if (isSharedTransition && hasTransform(node.latestValues)) {
5647      transformBox(box, node.latestValues);
5648    }
5649  }
5650  if (treeScale.x < TREE_SCALE_SNAP_MAX && treeScale.x > TREE_SCALE_SNAP_MIN) {
5651    treeScale.x = 1;
5652  }
5653  if (treeScale.y < TREE_SCALE_SNAP_MAX && treeScale.y > TREE_SCALE_SNAP_MIN) {
5654    treeScale.y = 1;
5655  }
5656}
5657function translateAxis(axis, distance2) {
5658  axis.min = axis.min + distance2;
5659  axis.max = axis.max + distance2;
5660}
5661function transformAxis(axis, axisTranslate, axisScale, boxScale, axisOrigin = 0.5) {
5662  const originPoint = mixNumber(axis.min, axis.max, axisOrigin);
5663  applyAxisDelta(axis, axisTranslate, axisScale, originPoint, boxScale);
5664}
5665function transformBox(box, transform2) {
5666  transformAxis(box.x, transform2.x, transform2.scaleX, transform2.scale, transform2.originX);
5667  transformAxis(box.y, transform2.y, transform2.scaleY, transform2.scale, transform2.originY);
5668}
5669function measureViewportBox(instance, transformPoint2) {
5670  return convertBoundingBoxToBox(transformBoxPoints(instance.getBoundingClientRect(), transformPoint2));
5671}
5672function measurePageBox(element, rootProjectionNode2, transformPagePoint) {
5673  const viewportBox = measureViewportBox(element, transformPagePoint);
5674  const { scroll: scroll2 } = rootProjectionNode2;
5675  if (scroll2) {
5676    translateAxis(viewportBox.x, scroll2.offset.x);
5677    translateAxis(viewportBox.y, scroll2.offset.y);
5678  }
5679  return viewportBox;
5680}
5681var import_dist685 = __toESM(require_dist(), 1);
5682var import_dist686 = __toESM(require_dist2(), 1);
5683var import_dist687 = __toESM(require_dist3(), 1);
5684var getContextWindow = ({ current }) => {
5685  return current ? current.ownerDocument.defaultView : null;
5686};
5687var elementDragControls = /* @__PURE__ */ new WeakMap();
5688var VisualElementDragControls = class {
5689  constructor(visualElement) {
5690    this.openDragLock = null;
5691    this.isDragging = false;
5692    this.currentDirection = null;
5693    this.originPoint = { x: 0, y: 0 };
5694    this.constraints = false;
5695    this.hasMutatedConstraints = false;
5696    this.elastic = createBox();
5697    this.visualElement = visualElement;
5698  }
5699  start(originEvent, { snapToCursor = false } = {}) {
5700    const { presenceContext } = this.visualElement;
5701    if (presenceContext && presenceContext.isPresent === false)
5702      return;
5703    const onSessionStart = (event) => {
5704      const { dragSnapToOrigin: dragSnapToOrigin2 } = this.getProps();
5705      dragSnapToOrigin2 ? this.pauseAnimation() : this.stopAnimation();
5706      if (snapToCursor) {
5707        this.snapToCursor(extractEventInfo(event).point);
5708      }
5709    };
5710    const onStart = (event, info) => {
5711      const { drag: drag2, dragPropagation, onDragStart } = this.getProps();
5712      if (drag2 && !dragPropagation) {
5713        if (this.openDragLock)
5714          this.openDragLock();
5715        this.openDragLock = setDragLock(drag2);
5716        if (!this.openDragLock)
5717          return;
5718      }
5719      this.isDragging = true;
5720      this.currentDirection = null;
5721      this.resolveConstraints();
5722      if (this.visualElement.projection) {
5723        this.visualElement.projection.isAnimationBlocked = true;
5724        this.visualElement.projection.target = void 0;
5725      }
5726      eachAxis((axis) => {
5727        let current = this.getAxisMotionValue(axis).get() || 0;
5728        if (percent.test(current)) {
5729          const { projection } = this.visualElement;
5730          if (projection && projection.layout) {
5731            const measuredAxis = projection.layout.layoutBox[axis];
5732            if (measuredAxis) {
5733              const length = calcLength(measuredAxis);
5734              current = length * (parseFloat(current) / 100);
5735            }
5736          }
5737        }
5738        this.originPoint[axis] = current;
5739      });
5740      if (onDragStart) {
5741        frame.postRender(() => onDragStart(event, info));
5742      }
5743      addValueToWillChange(this.visualElement, "transform");
5744      const { animationState } = this.visualElement;
5745      animationState && animationState.setActive("whileDrag", true);
5746    };
5747    const onMove = (event, info) => {
5748      const { dragPropagation, dragDirectionLock, onDirectionLock, onDrag } = this.getProps();
5749      if (!dragPropagation && !this.openDragLock)
5750        return;
5751      const { offset } = info;
5752      if (dragDirectionLock && this.currentDirection === null) {
5753        this.currentDirection = getCurrentDirection(offset);
5754        if (this.currentDirection !== null) {
5755          onDirectionLock && onDirectionLock(this.currentDirection);
5756        }
5757        return;
5758      }
5759      this.updateAxis("x", info.point, offset);
5760      this.updateAxis("y", info.point, offset);
5761      this.visualElement.render();
5762      onDrag && onDrag(event, info);
5763    };
5764    const onSessionEnd = (event, info) => this.stop(event, info);
5765    const resumeAnimation = () => eachAxis((axis) => {
5766      var _a;
5767      return this.getAnimationState(axis) === "paused" && ((_a = this.getAxisMotionValue(axis).animation) === null || _a === void 0 ? void 0 : _a.play());
5768    });
5769    const { dragSnapToOrigin } = this.getProps();
5770    this.panSession = new PanSession(originEvent, {
5771      onSessionStart,
5772      onStart,
5773      onMove,
5774      onSessionEnd,
5775      resumeAnimation
5776    }, {
vendor: 13,261 bytes, lines 5777-6127
5777      transformPagePoint: this.visualElement.getTransformPagePoint(),
5778      dragSnapToOrigin,
5779      contextWindow: getContextWindow(this.visualElement)
5780    });
5781  }
5782  stop(event, info) {
5783    const isDragging2 = this.isDragging;
5784    this.cancel();
5785    if (!isDragging2)
5786      return;
5787    const { velocity } = info;
5788    this.startAnimation(velocity);
5789    const { onDragEnd } = this.getProps();
5790    if (onDragEnd) {
5791      frame.postRender(() => onDragEnd(event, info));
5792    }
5793  }
5794  cancel() {
5795    this.isDragging = false;
5796    const { projection, animationState } = this.visualElement;
5797    if (projection) {
5798      projection.isAnimationBlocked = false;
5799    }
5800    this.panSession && this.panSession.end();
5801    this.panSession = void 0;
5802    const { dragPropagation } = this.getProps();
5803    if (!dragPropagation && this.openDragLock) {
5804      this.openDragLock();
5805      this.openDragLock = null;
5806    }
5807    animationState && animationState.setActive("whileDrag", false);
5808  }
5809  updateAxis(axis, _point, offset) {
5810    const { drag: drag2 } = this.getProps();
5811    if (!offset || !shouldDrag(axis, drag2, this.currentDirection))
5812      return;
5813    const axisValue = this.getAxisMotionValue(axis);
5814    let next = this.originPoint[axis] + offset[axis];
5815    if (this.constraints && this.constraints[axis]) {
5816      next = applyConstraints(next, this.constraints[axis], this.elastic[axis]);
5817    }
5818    axisValue.set(next);
5819  }
5820  resolveConstraints() {
5821    var _a;
5822    const { dragConstraints, dragElastic } = this.getProps();
5823    const layout2 = this.visualElement.projection && !this.visualElement.projection.layout ? this.visualElement.projection.measure(false) : (_a = this.visualElement.projection) === null || _a === void 0 ? void 0 : _a.layout;
5824    const prevConstraints = this.constraints;
5825    if (dragConstraints && isRefObject(dragConstraints)) {
5826      if (!this.constraints) {
5827        this.constraints = this.resolveRefConstraints();
5828      }
5829    } else {
5830      if (dragConstraints && layout2) {
5831        this.constraints = calcRelativeConstraints(layout2.layoutBox, dragConstraints);
5832      } else {
5833        this.constraints = false;
5834      }
5835    }
5836    this.elastic = resolveDragElastic(dragElastic);
5837    if (prevConstraints !== this.constraints && layout2 && this.constraints && !this.hasMutatedConstraints) {
5838      eachAxis((axis) => {
5839        if (this.constraints !== false && this.getAxisMotionValue(axis)) {
5840          this.constraints[axis] = rebaseAxisConstraints(layout2.layoutBox[axis], this.constraints[axis]);
5841        }
5842      });
5843    }
5844  }
5845  resolveRefConstraints() {
5846    const { dragConstraints: constraints, onMeasureDragConstraints } = this.getProps();
5847    if (!constraints || !isRefObject(constraints))
5848      return false;
5849    const constraintsElement = constraints.current;
5850    invariant(constraintsElement !== null, "If `dragConstraints` is set as a React ref, that ref must be passed to another component's `ref` prop.");
5851    const { projection } = this.visualElement;
5852    if (!projection || !projection.layout)
5853      return false;
5854    const constraintsBox = measurePageBox(constraintsElement, projection.root, this.visualElement.getTransformPagePoint());
5855    let measuredConstraints = calcViewportConstraints(projection.layout.layoutBox, constraintsBox);
5856    if (onMeasureDragConstraints) {
5857      const userConstraints = onMeasureDragConstraints(convertBoxToBoundingBox(measuredConstraints));
5858      this.hasMutatedConstraints = !!userConstraints;
5859      if (userConstraints) {
5860        measuredConstraints = convertBoundingBoxToBox(userConstraints);
5861      }
5862    }
5863    return measuredConstraints;
5864  }
5865  startAnimation(velocity) {
5866    const { drag: drag2, dragMomentum, dragElastic, dragTransition, dragSnapToOrigin, onDragTransitionEnd } = this.getProps();
5867    const constraints = this.constraints || {};
5868    const momentumAnimations = eachAxis((axis) => {
5869      if (!shouldDrag(axis, drag2, this.currentDirection)) {
5870        return;
5871      }
5872      let transition = constraints && constraints[axis] || {};
5873      if (dragSnapToOrigin)
5874        transition = { min: 0, max: 0 };
5875      const bounceStiffness = dragElastic ? 200 : 1e6;
5876      const bounceDamping = dragElastic ? 40 : 1e7;
5877      const inertia2 = {
5878        type: "inertia",
5879        velocity: dragMomentum ? velocity[axis] : 0,
5880        bounceStiffness,
5881        bounceDamping,
5882        timeConstant: 750,
5883        restDelta: 1,
5884        restSpeed: 10,
5885        ...dragTransition,
5886        ...transition
5887      };
5888      return this.startAxisValueAnimation(axis, inertia2);
5889    });
5890    return Promise.all(momentumAnimations).then(onDragTransitionEnd);
5891  }
5892  startAxisValueAnimation(axis, transition) {
5893    const axisValue = this.getAxisMotionValue(axis);
5894    addValueToWillChange(this.visualElement, axis);
5895    return axisValue.start(animateMotionValue(axis, axisValue, 0, transition, this.visualElement, false));
5896  }
5897  stopAnimation() {
5898    eachAxis((axis) => this.getAxisMotionValue(axis).stop());
5899  }
5900  pauseAnimation() {
5901    eachAxis((axis) => {
5902      var _a;
5903      return (_a = this.getAxisMotionValue(axis).animation) === null || _a === void 0 ? void 0 : _a.pause();
5904    });
5905  }
5906  getAnimationState(axis) {
5907    var _a;
5908    return (_a = this.getAxisMotionValue(axis).animation) === null || _a === void 0 ? void 0 : _a.state;
5909  }
5910  /**
5911   * Drag works differently depending on which props are provided.
5912   *
5913   * - If _dragX and _dragY are provided, we output the gesture delta directly to those motion values.
5914   * - Otherwise, we apply the delta to the x/y motion values.
5915   */
5916  getAxisMotionValue(axis) {
5917    const dragKey = `_drag${axis.toUpperCase()}`;
5918    const props = this.visualElement.getProps();
5919    const externalMotionValue = props[dragKey];
5920    return externalMotionValue ? externalMotionValue : this.visualElement.getValue(axis, (props.initial ? props.initial[axis] : void 0) || 0);
5921  }
5922  snapToCursor(point2) {
5923    eachAxis((axis) => {
5924      const { drag: drag2 } = this.getProps();
5925      if (!shouldDrag(axis, drag2, this.currentDirection))
5926        return;
5927      const { projection } = this.visualElement;
5928      const axisValue = this.getAxisMotionValue(axis);
5929      if (projection && projection.layout) {
5930        const { min, max } = projection.layout.layoutBox[axis];
5931        axisValue.set(point2[axis] - mixNumber(min, max, 0.5));
5932      }
5933    });
5934  }
5935  /**
5936   * When the viewport resizes we want to check if the measured constraints
5937   * have changed and, if so, reposition the element within those new constraints
5938   * relative to where it was before the resize.
5939   */
5940  scalePositionWithinConstraints() {
5941    if (!this.visualElement.current)
5942      return;
5943    const { drag: drag2, dragConstraints } = this.getProps();
5944    const { projection } = this.visualElement;
5945    if (!isRefObject(dragConstraints) || !projection || !this.constraints)
5946      return;
5947    this.stopAnimation();
5948    const boxProgress = { x: 0, y: 0 };
5949    eachAxis((axis) => {
5950      const axisValue = this.getAxisMotionValue(axis);
5951      if (axisValue && this.constraints !== false) {
5952        const latest = axisValue.get();
5953        boxProgress[axis] = calcOrigin2({ min: latest, max: latest }, this.constraints[axis]);
5954      }
5955    });
5956    const { transformTemplate } = this.visualElement.getProps();
5957    this.visualElement.current.style.transform = transformTemplate ? transformTemplate({}, "") : "none";
5958    projection.root && projection.root.updateScroll();
5959    projection.updateLayout();
5960    this.resolveConstraints();
5961    eachAxis((axis) => {
5962      if (!shouldDrag(axis, drag2, null))
5963        return;
5964      const axisValue = this.getAxisMotionValue(axis);
5965      const { min, max } = this.constraints[axis];
5966      axisValue.set(mixNumber(min, max, boxProgress[axis]));
5967    });
5968  }
5969  addListeners() {
5970    if (!this.visualElement.current)
5971      return;
5972    elementDragControls.set(this.visualElement, this);
5973    const element = this.visualElement.current;
5974    const stopPointerListener = addPointerEvent(element, "pointerdown", (event) => {
5975      const { drag: drag2, dragListener = true } = this.getProps();
5976      drag2 && dragListener && this.start(event);
5977    });
5978    const measureDragConstraints = () => {
5979      const { dragConstraints } = this.getProps();
5980      if (isRefObject(dragConstraints) && dragConstraints.current) {
5981        this.constraints = this.resolveRefConstraints();
5982      }
5983    };
5984    const { projection } = this.visualElement;
5985    const stopMeasureLayoutListener = projection.addEventListener("measure", measureDragConstraints);
5986    if (projection && !projection.layout) {
5987      projection.root && projection.root.updateScroll();
5988      projection.updateLayout();
5989    }
5990    frame.read(measureDragConstraints);
5991    const stopResizeListener = addDomEvent(window, "resize", () => this.scalePositionWithinConstraints());
5992    const stopLayoutUpdateListener = projection.addEventListener("didUpdate", ({ delta, hasLayoutChanged }) => {
5993      if (this.isDragging && hasLayoutChanged) {
5994        eachAxis((axis) => {
5995          const motionValue2 = this.getAxisMotionValue(axis);
5996          if (!motionValue2)
5997            return;
5998          this.originPoint[axis] += delta[axis].translate;
5999          motionValue2.set(motionValue2.get() + delta[axis].translate);
6000        });
6001        this.visualElement.render();
6002      }
6003    });
6004    return () => {
6005      stopResizeListener();
6006      stopPointerListener();
6007      stopMeasureLayoutListener();
6008      stopLayoutUpdateListener && stopLayoutUpdateListener();
6009    };
6010  }
6011  getProps() {
6012    const props = this.visualElement.getProps();
6013    const { drag: drag2 = false, dragDirectionLock = false, dragPropagation = false, dragConstraints = false, dragElastic = defaultElastic, dragMomentum = true } = props;
6014    return {
6015      ...props,
6016      drag: drag2,
6017      dragDirectionLock,
6018      dragPropagation,
6019      dragConstraints,
6020      dragElastic,
6021      dragMomentum
6022    };
6023  }
6024};
6025function shouldDrag(direction, drag2, currentDirection) {
6026  return (drag2 === true || drag2 === direction) && (currentDirection === null || currentDirection === direction);
6027}
6028function getCurrentDirection(offset, lockThreshold = 10) {
6029  let direction = null;
6030  if (Math.abs(offset.y) > lockThreshold) {
6031    direction = "y";
6032  } else if (Math.abs(offset.x) > lockThreshold) {
6033    direction = "x";
6034  }
6035  return direction;
6036}
6037var DragGesture = class extends Feature {
6038  constructor(node) {
6039    super(node);
6040    this.removeGroupControls = noop;
6041    this.removeListeners = noop;
6042    this.controls = new VisualElementDragControls(node);
6043  }
6044  mount() {
6045    const { dragControls } = this.node.getProps();
6046    if (dragControls) {
6047      this.removeGroupControls = dragControls.subscribe(this.controls);
6048    }
6049    this.removeListeners = this.controls.addListeners() || noop;
6050  }
6051  unmount() {
6052    this.removeGroupControls();
6053    this.removeListeners();
6054  }
6055};
6056var import_dist694 = __toESM(require_dist(), 1);
6057var import_dist695 = __toESM(require_dist2(), 1);
6058var import_dist696 = __toESM(require_dist3(), 1);
6059var asyncHandler = (handler) => (event, info) => {
6060  if (handler) {
6061    frame.postRender(() => handler(event, info));
6062  }
6063};
6064var PanGesture = class extends Feature {
6065  constructor() {
6066    super(...arguments);
6067    this.removePointerDownListener = noop;
6068  }
6069  onPointerDown(pointerDownEvent) {
6070    this.session = new PanSession(pointerDownEvent, this.createPanHandlers(), {
6071      transformPagePoint: this.node.getTransformPagePoint(),
6072      contextWindow: getContextWindow(this.node)
6073    });
6074  }
6075  createPanHandlers() {
6076    const { onPanSessionStart, onPanStart, onPan, onPanEnd } = this.node.getProps();
6077    return {
6078      onSessionStart: asyncHandler(onPanSessionStart),
6079      onStart: asyncHandler(onPanStart),
6080      onMove: onPan,
6081      onEnd: (event, info) => {
6082        delete this.session;
6083        if (onPanEnd) {
6084          frame.postRender(() => onPanEnd(event, info));
6085        }
6086      }
6087    };
6088  }
6089  mount() {
6090    this.removePointerDownListener = addPointerEvent(this.node.current, "pointerdown", (event) => this.onPointerDown(event));
6091  }
6092  update() {
6093    this.session && this.session.updateHandlers(this.createPanHandlers());
6094  }
6095  unmount() {
6096    this.removePointerDownListener();
6097    this.session && this.session.end();
6098  }
6099};
6100var import_dist706 = __toESM(require_dist(), 1);
6101var import_dist707 = __toESM(require_dist2(), 1);
6102var import_dist708 = __toESM(require_dist3(), 1);
6103var import_jsx_runtime8 = __toESM(require_jsx_runtime(), 1);
6104var import_react28 = __toESM(require_react(), 1);
6105var import_dist697 = __toESM(require_dist(), 1);
6106var import_dist698 = __toESM(require_dist2(), 1);
6107var import_dist699 = __toESM(require_dist3(), 1);
6108var globalProjectionState = {
6109  /**
6110   * Global flag as to whether the tree has animated since the last time
6111   * we resized the window
6112   */
6113  hasAnimatedSinceResize: true,
6114  /**
6115   * We set this to true once, on the first update. Any nodes added to the tree beyond that
6116   * update will be given a `data-projection-id` attribute.
6117   */
6118  hasEverUpdated: false
6119};
6120var import_dist700 = __toESM(require_dist(), 1);
6121var import_dist701 = __toESM(require_dist2(), 1);
6122var import_dist702 = __toESM(require_dist3(), 1);
6123function pixelsToPercent(pixels, axis) {
6124  if (axis.max === axis.min)
6125    return 0;
6126  return pixels / (axis.max - axis.min) * 100;
6127}
6128var correctBorderRadius = {
6129  correct: (latest, node) => {
6130    if (!node.target)
6131      return latest;
6132    if (typeof latest === "string") {
6133      if (px.test(latest)) {
6134        latest = parseFloat(latest);
6135      } else {
6136        return latest;
6137      }
6138    }
6139    const x = pixelsToPercent(latest, node.target.x);
6140    const y = pixelsToPercent(latest, node.target.y);
6141    return `${x}% ${y}%`;
6142  }
6143};
6144var import_dist703 = __toESM(require_dist(), 1);
6145var import_dist704 = __toESM(require_dist2(), 1);
6146var import_dist705 = __toESM(require_dist3(), 1);
6147var correctBoxShadow = {
6148  correct: (latest, { treeScale, projectionDelta }) => {
6149    const original = latest;
6150    const shadow = complex.parse(latest);
6151    if (shadow.length > 5)
6152      return original;
6153    const template = complex.createTransformer(latest);
6154    const offset = typeof shadow[0] !== "number" ? 1 : 0;
6155    const xScale = projectionDelta.x.scale * treeScale.x;
6156    const yScale = projectionDelta.y.scale * treeScale.y;
6157    shadow[0 + offset] /= xScale;
6158    shadow[1 + offset] /= yScale;
6159    const averageScale = mixNumber(xScale, yScale, 0.5);
6160    if (typeof shadow[2 + offset] === "number")
6161      shadow[2 + offset] /= averageScale;
6162    if (typeof shadow[3 + offset] === "number")
6163      shadow[3 + offset] /= averageScale;
6164    return template(shadow);
6165  }
6166};
6167var MeasureLayoutWithContext = class extends import_react28.Component {
6168  /**
6169   * This only mounts projection nodes for components that
6170   * need measuring, we might want to do it for all components
6171   * in order to incorporate transforms
6172   */
6173  componentDidMount() {
6174    const { visualElement, layoutGroup, switchLayoutGroup, layoutId } = this.props;
6175    const { projection } = visualElement;
6176    addScaleCorrector(defaultScaleCorrectors);
6177    if (projection) {
6178      if (layoutGroup.group)
6179        layoutGroup.group.add(projection);
6180      if (switchLayoutGroup && switchLayoutGroup.register && layoutId) {
6181        switchLayoutGroup.register(projection);
6182      }
6183      projection.root.didUpdate();
6184      projection.addEventListener("animationComplete", () => {
6185        this.safeToRemove();
6186      });
6187      projection.setOptions({
6188        ...projection.options,
6189        onExitComplete: () => this.safeToRemove()
6190      });
6191    }
6192    globalProjectionState.hasEverUpdated = true;
6193  }
6194  getSnapshotBeforeUpdate(prevProps) {
6195    const { layoutDependency, visualElement, drag: drag2, isPresent: isPresent2 } = this.props;
6196    const projection = visualElement.projection;
6197    if (!projection)
6198      return null;
6199    projection.isPresent = isPresent2;
6200    if (drag2 || prevProps.layoutDependency !== layoutDependency || layoutDependency === void 0) {
6201      projection.willUpdate();
6202    } else {
6203      this.safeToRemove();
6204    }
6205    if (prevProps.isPresent !== isPresent2) {
6206      if (isPresent2) {
6207        projection.promote();
6208      } else if (!projection.relegate()) {
6209        frame.postRender(() => {
6210          const stack = projection.getStack();
6211          if (!stack || !stack.members.length) {
6212            this.safeToRemove();
6213          }
6214        });
6215      }
6216    }
6217    return null;
6218  }
6219  componentDidUpdate() {
6220    const { projection } = this.props.visualElement;
6221    if (projection) {
6222      projection.root.didUpdate();
6223      microtask.postRender(() => {
6224        if (!projection.currentAnimation && projection.isLead()) {
6225          this.safeToRemove();
6226        }
6227      });
6228    }
6229  }
6230  componentWillUnmount() {
6231    const { visualElement, layoutGroup, switchLayoutGroup: promoteContext } = this.props;
6232    const { projection } = visualElement;
6233    if (projection) {
6234      projection.scheduleCheckAfterUnmount();
6235      if (layoutGroup && layoutGroup.group)
6236        layoutGroup.group.remove(projection);
6237      if (promoteContext && promoteContext.deregister)
6238        promoteContext.deregister(projection);
6239    }
6240  }
6241  safeToRemove() {
6242    const { safeToRemove } = this.props;
6243    safeToRemove && safeToRemove();
6244  }
6245  render() {
6246    return null;
6247  }
6248};
6249function MeasureLayout(props) {
6250  const [isPresent2, safeToRemove] = usePresence();
6251  const layoutGroup = (0, import_react28.useContext)(LayoutGroupContext);
6252  return (0, import_jsx_runtime8.jsx)(MeasureLayoutWithContext, { ...props, layoutGroup, switchLayoutGroup: (0, import_react28.useContext)(SwitchLayoutGroupContext), isPresent: isPresent2, safeToRemove });
6253}
6254var defaultScaleCorrectors = {
6255  borderRadius: {
6256    ...correctBorderRadius,
6257    applyTo: [
6258      "borderTopLeftRadius",
6259      "borderTopRightRadius",
6260      "borderBottomLeftRadius",
6261      "borderBottomRightRadius"
6262    ]
6263  },
6264  borderTopLeftRadius: correctBorderRadius,
6265  borderTopRightRadius: correctBorderRadius,
6266  borderBottomLeftRadius: correctBorderRadius,
6267  borderBottomRightRadius: correctBorderRadius,
6268  boxShadow: correctBoxShadow
6269};
6270var import_dist748 = __toESM(require_dist(), 1);
6271var import_dist749 = __toESM(require_dist2(), 1);
6272var import_dist750 = __toESM(require_dist3(), 1);
6273var import_dist742 = __toESM(require_dist(), 1);
6274var import_dist743 = __toESM(require_dist2(), 1);
6275var import_dist744 = __toESM(require_dist3(), 1);
6276var import_dist709 = __toESM(require_dist(), 1);
6277var import_dist710 = __toESM(require_dist2(), 1);
6278var import_dist711 = __toESM(require_dist3(), 1);
6279function animateSingleValue(value, keyframes2, options) {
6280  const motionValue$1 = isMotionValue(value) ? value : motionValue(value);
6281  motionValue$1.start(animateMotionValue("", motionValue$1, keyframes2, options));
6282  return motionValue$1.animation;
6283}
6284var import_dist712 = __toESM(require_dist(), 1);
6285var import_dist713 = __toESM(require_dist2(), 1);
6286var import_dist714 = __toESM(require_dist3(), 1);
6287function isSVGElement(element) {
6288  return element instanceof SVGElement && element.tagName !== "svg";
6289}
6290var import_dist718 = __toESM(require_dist(), 1);
6291var import_dist719 = __toESM(require_dist2(), 1);
6292var import_dist720 = __toESM(require_dist3(), 1);
6293var import_dist715 = __toESM(require_dist(), 1);
6294var import_dist716 = __toESM(require_dist2(), 1);
6295var import_dist717 = __toESM(require_dist3(), 1);
6296var compareByDepth = (a, b) => a.depth - b.depth;
6297var FlatTree = class {
6298  constructor() {
6299    this.children = [];
6300    this.isDirty = false;
6301  }
6302  add(child) {
6303    addUniqueItem(this.children, child);
6304    this.isDirty = true;
6305  }
6306  remove(child) {
6307    removeItem(this.children, child);
6308    this.isDirty = true;
6309  }
6310  forEach(callback) {
6311    this.isDirty && this.children.sort(compareByDepth);
6312    this.isDirty = false;
6313    this.children.forEach(callback);
6314  }
6315};
6316var import_dist721 = __toESM(require_dist(), 1);
6317var import_dist722 = __toESM(require_dist2(), 1);
6318var import_dist723 = __toESM(require_dist3(), 1);
6319function delay(callback, timeout) {
6320  const start = time.now();
6321  const checkElapsed = ({ timestamp }) => {
6322    const elapsed = timestamp - start;
6323    if (elapsed >= timeout) {
6324      cancelFrame(checkElapsed);
6325      callback(elapsed - timeout);
6326    }
6327  };
6328  frame.read(checkElapsed, true);
6329  return () => cancelFrame(checkElapsed);
6330}
6331var import_dist724 = __toESM(require_dist(), 1);
6332var import_dist725 = __toESM(require_dist2(), 1);
6333var import_dist726 = __toESM(require_dist3(), 1);
6334var borders = ["TopLeft", "TopRight", "BottomLeft", "BottomRight"];
6335var numBorders = borders.length;
6336var asNumber = (value) => typeof value === "string" ? parseFloat(value) : value;
6337var isPx = (value) => typeof value === "number" || px.test(value);
6338function mixValues(target, follow, lead, progress2, shouldCrossfadeOpacity, isOnlyMember) {
6339  if (shouldCrossfadeOpacity) {
6340    target.opacity = mixNumber(
6341      0,
6342      // TODO Reinstate this if only child
6343      lead.opacity !== void 0 ? lead.opacity : 1,
6344      easeCrossfadeIn(progress2)
6345    );
6346    target.opacityExit = mixNumber(follow.opacity !== void 0 ? follow.opacity : 1, 0, easeCrossfadeOut(progress2));
6347  } else if (isOnlyMember) {
6348    target.opacity = mixNumber(follow.opacity !== void 0 ? follow.opacity : 1, lead.opacity !== void 0 ? lead.opacity : 1, progress2);
6349  }
6350  for (let i = 0; i < numBorders; i++) {
6351    const borderLabel = `border${borders[i]}Radius`;
6352    let followRadius = getRadius(follow, borderLabel);
6353    let leadRadius = getRadius(lead, borderLabel);
6354    if (followRadius === void 0 && leadRadius === void 0)
6355      continue;
6356    followRadius || (followRadius = 0);
6357    leadRadius || (leadRadius = 0);
6358    const canMix = followRadius === 0 || leadRadius === 0 || isPx(followRadius) === isPx(leadRadius);
6359    if (canMix) {
6360      target[borderLabel] = Math.max(mixNumber(asNumber(followRadius), asNumber(leadRadius), progress2), 0);
6361      if (percent.test(leadRadius) || percent.test(followRadius)) {
6362        target[borderLabel] += "%";
6363      }
6364    } else {
6365      target[borderLabel] = leadRadius;
6366    }
6367  }
6368  if (follow.rotate || lead.rotate) {
6369    target.rotate = mixNumber(follow.rotate || 0, lead.rotate || 0, progress2);
6370  }
6371}
6372function getRadius(values, radiusName) {
6373  return values[radiusName] !== void 0 ? values[radiusName] : values.borderRadius;
6374}
6375var easeCrossfadeIn = compress(0, 0.5, circOut);
6376var easeCrossfadeOut = compress(0.5, 0.95, noop);
6377function compress(min, max, easing) {
6378  return (p) => {
6379    if (p < min)
6380      return 0;
6381    if (p > max)
6382      return 1;
6383    return easing(progress(min, max, p));
6384  };
6385}
6386var import_dist727 = __toESM(require_dist(), 1);
6387var import_dist728 = __toESM(require_dist2(), 1);
6388var import_dist729 = __toESM(require_dist3(), 1);
6389function copyAxisInto(axis, originAxis) {
6390  axis.min = originAxis.min;
6391  axis.max = originAxis.max;
6392}
6393function copyBoxInto(box, originBox) {
6394  copyAxisInto(box.x, originBox.x);
6395  copyAxisInto(box.y, originBox.y);
6396}
6397function copyAxisDeltaInto(delta, originDelta) {
6398  delta.translate = originDelta.translate;
6399  delta.scale = originDelta.scale;
6400  delta.originPoint = originDelta.originPoint;
6401  delta.origin = originDelta.origin;
6402}
6403var import_dist730 = __toESM(require_dist(), 1);
6404var import_dist731 = __toESM(require_dist2(), 1);
6405var import_dist732 = __toESM(require_dist3(), 1);
6406function removePointDelta(point2, translate, scale2, originPoint, boxScale) {
6407  point2 -= translate;
6408  point2 = scalePoint(point2, 1 / scale2, originPoint);
6409  if (boxScale !== void 0) {
6410    point2 = scalePoint(point2, 1 / boxScale, originPoint);
6411  }
6412  return point2;
6413}
6414function removeAxisDelta(axis, translate = 0, scale2 = 1, origin = 0.5, boxScale, originAxis = axis, sourceAxis = axis) {
6415  if (percent.test(translate)) {
6416    translate = parseFloat(translate);
6417    const relativeProgress = mixNumber(sourceAxis.min, sourceAxis.max, translate / 100);
6418    translate = relativeProgress - sourceAxis.min;
6419  }
6420  if (typeof translate !== "number")
6421    return;
6422  let originPoint = mixNumber(originAxis.min, originAxis.max, origin);
6423  if (axis === originAxis)
6424    originPoint -= translate;
6425  axis.min = removePointDelta(axis.min, translate, scale2, originPoint, boxScale);
6426  axis.max = removePointDelta(axis.max, translate, scale2, originPoint, boxScale);
6427}
6428function removeAxisTransforms(axis, transforms, [key, scaleKey, originKey], origin, sourceAxis) {
6429  removeAxisDelta(axis, transforms[key], transforms[scaleKey], transforms[originKey], transforms.scale, origin, sourceAxis);
6430}
6431var xKeys = ["x", "scaleX", "originX"];
6432var yKeys = ["y", "scaleY", "originY"];
6433function removeBoxTransforms(box, transforms, originBox, sourceBox) {
6434  removeAxisTransforms(box.x, transforms, xKeys, originBox ? originBox.x : void 0, sourceBox ? sourceBox.x : void 0);
6435  removeAxisTransforms(box.y, transforms, yKeys, originBox ? originBox.y : void 0, sourceBox ? sourceBox.y : void 0);
6436}
6437var import_dist733 = __toESM(require_dist(), 1);
6438var import_dist734 = __toESM(require_dist2(), 1);
6439var import_dist735 = __toESM(require_dist3(), 1);
6440function isAxisDeltaZero(delta) {
6441  return delta.translate === 0 && delta.scale === 1;
6442}
6443function isDeltaZero(delta) {
6444  return isAxisDeltaZero(delta.x) && isAxisDeltaZero(delta.y);
6445}
6446function axisEquals(a, b) {
6447  return a.min === b.min && a.max === b.max;
6448}
6449function boxEquals(a, b) {
6450  return axisEquals(a.x, b.x) && axisEquals(a.y, b.y);
6451}
6452function axisEqualsRounded(a, b) {
6453  return Math.round(a.min) === Math.round(b.min) && Math.round(a.max) === Math.round(b.max);
6454}
6455function boxEqualsRounded(a, b) {
6456  return axisEqualsRounded(a.x, b.x) && axisEqualsRounded(a.y, b.y);
6457}
6458function aspectRatio(box) {
6459  return calcLength(box.x) / calcLength(box.y);
6460}
6461function axisDeltaEquals(a, b) {
6462  return a.translate === b.translate && a.scale === b.scale && a.originPoint === b.originPoint;
6463}
6464var import_dist736 = __toESM(require_dist(), 1);
6465var import_dist737 = __toESM(require_dist2(), 1);
6466var import_dist738 = __toESM(require_dist3(), 1);
6467var NodeStack = class {
6468  constructor() {
6469    this.members = [];
6470  }
6471  add(node) {
6472    addUniqueItem(this.members, node);
6473    node.scheduleRender();
6474  }
6475  remove(node) {
6476    removeItem(this.members, node);
6477    if (node === this.prevLead) {
6478      this.prevLead = void 0;
6479    }
6480    if (node === this.lead) {
6481      const prevLead = this.members[this.members.length - 1];
6482      if (prevLead) {
6483        this.promote(prevLead);
6484      }
6485    }
6486  }
6487  relegate(node) {
6488    const indexOfNode = this.members.findIndex((member) => node === member);
6489    if (indexOfNode === 0)
6490      return false;
6491    let prevLead;
6492    for (let i = indexOfNode; i >= 0; i--) {
6493      const member = this.members[i];
6494      if (member.isPresent !== false) {
6495        prevLead = member;
6496        break;
6497      }
6498    }
6499    if (prevLead) {
6500      this.promote(prevLead);
6501      return true;
6502    } else {
6503      return false;
6504    }
6505  }
6506  promote(node, preserveFollowOpacity) {
6507    const prevLead = this.lead;
6508    if (node === prevLead)
6509      return;
6510    this.prevLead = prevLead;
6511    this.lead = node;
6512    node.show();
6513    if (prevLead) {
6514      prevLead.instance && prevLead.scheduleRender();
6515      node.scheduleRender();
6516      node.resumeFrom = prevLead;
6517      if (preserveFollowOpacity) {
6518        node.resumeFrom.preserveOpacity = true;
6519      }
6520      if (prevLead.snapshot) {
6521        node.snapshot = prevLead.snapshot;
6522        node.snapshot.latestValues = prevLead.animationValues || prevLead.latestValues;
6523      }
6524      if (node.root && node.root.isUpdating) {
6525        node.isLayoutDirty = true;
6526      }
6527      const { crossfade } = node.options;
6528      if (crossfade === false) {
6529        prevLead.hide();
6530      }
6531    }
6532  }
6533  exitAnimationComplete() {
6534    this.members.forEach((node) => {
6535      const { options, resumingFrom } = node;
6536      options.onExitComplete && options.onExitComplete();
6537      if (resumingFrom) {
6538        resumingFrom.options.onExitComplete && resumingFrom.options.onExitComplete();
6539      }
6540    });
6541  }
6542  scheduleRender() {
6543    this.members.forEach((node) => {
6544      node.instance && node.scheduleRender(false);
6545    });
6546  }
6547  /**
6548   * Clear any leads that have been removed this render to prevent them from being
6549   * used in future animations and to prevent memory leaks
6550   */
6551  removeLeadSnapshot() {
6552    if (this.lead && this.lead.snapshot) {
6553      this.lead.snapshot = void 0;
6554    }
6555  }
6556};
6557var import_dist739 = __toESM(require_dist(), 1);
6558var import_dist740 = __toESM(require_dist2(), 1);
6559var import_dist741 = __toESM(require_dist3(), 1);
6560function buildProjectionTransform(delta, treeScale, latestTransform) {
6561  let transform2 = "";
6562  const xTranslate = delta.x.translate / treeScale.x;
6563  const yTranslate = delta.y.translate / treeScale.y;
6564  const zTranslate = (latestTransform === null || latestTransform === void 0 ? void 0 : latestTransform.z) || 0;
6565  if (xTranslate || yTranslate || zTranslate) {
6566    transform2 = `translate3d(${xTranslate}px, ${yTranslate}px, ${zTranslate}px) `;
6567  }
6568  if (treeScale.x !== 1 || treeScale.y !== 1) {
6569    transform2 += `scale(${1 / treeScale.x}, ${1 / treeScale.y}) `;
6570  }
6571  if (latestTransform) {
6572    const { transformPerspective, rotate, rotateX, rotateY, skewX, skewY } = latestTransform;
6573    if (transformPerspective)
6574      transform2 = `perspective(${transformPerspective}px) ${transform2}`;
6575    if (rotate)
6576      transform2 += `rotate(${rotate}deg) `;
6577    if (rotateX)
6578      transform2 += `rotateX(${rotateX}deg) `;
6579    if (rotateY)
6580      transform2 += `rotateY(${rotateY}deg) `;
6581    if (skewX)
6582      transform2 += `skewX(${skewX}deg) `;
6583    if (skewY)
6584      transform2 += `skewY(${skewY}deg) `;
6585  }
6586  const elementScaleX = delta.x.scale * treeScale.x;
6587  const elementScaleY = delta.y.scale * treeScale.y;
6588  if (elementScaleX !== 1 || elementScaleY !== 1) {
6589    transform2 += `scale(${elementScaleX}, ${elementScaleY})`;
6590  }
6591  return transform2 || "none";
6592}
6593var metrics = {
6594  type: "projectionFrame",
6595  totalNodes: 0,
6596  resolvedTargetDeltas: 0,
6597  recalculatedProjection: 0
6598};
6599var isDebug = typeof window !== "undefined" && window.MotionDebug !== void 0;
6600var transformAxes = ["", "X", "Y", "Z"];
6601var hiddenVisibility = { visibility: "hidden" };
6602var animationTarget = 1e3;
6603var id2 = 0;
6604function resetDistortingTransform(key, visualElement, values, sharedAnimationValues) {
6605  const { latestValues } = visualElement;
6606  if (latestValues[key]) {
6607    values[key] = latestValues[key];
6608    visualElement.setStaticValue(key, 0);
6609    if (sharedAnimationValues) {
6610      sharedAnimationValues[key] = 0;
6611    }
6612  }
6613}
6614function cancelTreeOptimisedTransformAnimations(projectionNode) {
6615  projectionNode.hasCheckedOptimisedAppear = true;
6616  if (projectionNode.root === projectionNode)
6617    return;
6618  const { visualElement } = projectionNode.options;
6619  if (!visualElement)
6620    return;
6621  const appearId = getOptimisedAppearId(visualElement);
6622  if (window.MotionHasOptimisedAnimation(appearId, "transform")) {
6623    const { layout: layout2, layoutId } = projectionNode.options;
6624    window.MotionCancelOptimisedAnimation(appearId, "transform", frame, !(layout2 || layoutId));
6625  }
6626  const { parent } = projectionNode;
6627  if (parent && !parent.hasCheckedOptimisedAppear) {
6628    cancelTreeOptimisedTransformAnimations(parent);
6629  }
6630}
6631function createProjectionNode2({ attachResizeListener, defaultParent, measureScroll, checkIsScrollRoot, resetTransform }) {
6632  return class ProjectionNode {
6633    constructor(latestValues = {}, parent = defaultParent === null || defaultParent === void 0 ? void 0 : defaultParent()) {
6634      this.id = id2++;
6635      this.animationId = 0;
6636      this.children = /* @__PURE__ */ new Set();
6637      this.options = {};
6638      this.isTreeAnimating = false;
6639      this.isAnimationBlocked = false;
6640      this.isLayoutDirty = false;
6641      this.isProjectionDirty = false;
6642      this.isSharedProjectionDirty = false;
6643      this.isTransformDirty = false;
6644      this.updateManuallyBlocked = false;
6645      this.updateBlockedByResize = false;
6646      this.isUpdating = false;
6647      this.isSVG = false;
6648      this.needsReset = false;
6649      this.shouldResetTransform = false;
6650      this.hasCheckedOptimisedAppear = false;
6651      this.treeScale = { x: 1, y: 1 };
6652      this.eventHandlers = /* @__PURE__ */ new Map();
6653      this.hasTreeAnimated = false;
6654      this.updateScheduled = false;
6655      this.scheduleUpdate = () => this.update();
6656      this.projectionUpdateScheduled = false;
6657      this.checkUpdateFailed = () => {
6658        if (this.isUpdating) {
6659          this.isUpdating = false;
6660          this.clearAllSnapshots();
6661        }
6662      };
6663      this.updateProjection = () => {
6664        this.projectionUpdateScheduled = false;
6665        if (isDebug) {
6666          metrics.totalNodes = metrics.resolvedTargetDeltas = metrics.recalculatedProjection = 0;
6667        }
6668        this.nodes.forEach(propagateDirtyNodes);
6669        this.nodes.forEach(resolveTargetDelta);
6670        this.nodes.forEach(calcProjection);
6671        this.nodes.forEach(cleanDirtyNodes);
6672        if (isDebug) {
6673          window.MotionDebug.record(metrics);
6674        }
6675      };
6676      this.resolvedRelativeTargetAt = 0;
6677      this.hasProjected = false;
6678      this.isVisible = true;
6679      this.animationProgress = 0;
6680      this.sharedNodes = /* @__PURE__ */ new Map();
6681      this.latestValues = latestValues;
6682      this.root = parent ? parent.root || parent : this;
6683      this.path = parent ? [...parent.path, parent] : [];
6684      this.parent = parent;
6685      this.depth = parent ? parent.depth + 1 : 0;
6686      for (let i = 0; i < this.path.length; i++) {
6687        this.path[i].shouldResetTransform = true;
6688      }
6689      if (this.root === this)
6690        this.nodes = new FlatTree();
6691    }
6692    addEventListener(name, handler) {
6693      if (!this.eventHandlers.has(name)) {
6694        this.eventHandlers.set(name, new SubscriptionManager());
6695      }
6696      return this.eventHandlers.get(name).add(handler);
6697    }
6698    notifyListeners(name, ...args) {
6699      const subscriptionManager = this.eventHandlers.get(name);
6700      subscriptionManager && subscriptionManager.notify(...args);
6701    }
6702    hasListeners(name) {
6703      return this.eventHandlers.has(name);
6704    }
6705    /**
6706     * Lifecycles
6707     */
6708    mount(instance, isLayoutDirty = this.root.hasTreeAnimated) {
6709      if (this.instance)
6710        return;
6711      this.isSVG = isSVGElement(instance);
6712      this.instance = instance;
6713      const { layoutId, layout: layout2, visualElement } = this.options;
6714      if (visualElement && !visualElement.current) {
6715        visualElement.mount(instance);
6716      }
6717      this.root.nodes.add(this);
6718      this.parent && this.parent.children.add(this);
6719      if (isLayoutDirty && (layout2 || layoutId)) {
6720        this.isLayoutDirty = true;
6721      }
6722      if (attachResizeListener) {
6723        let cancelDelay;
6724        const resizeUnblockUpdate = () => this.root.updateBlockedByResize = false;
6725        attachResizeListener(instance, () => {
6726          this.root.updateBlockedByResize = true;
6727          cancelDelay && cancelDelay();
6728          cancelDelay = delay(resizeUnblockUpdate, 250);
6729          if (globalProjectionState.hasAnimatedSinceResize) {
6730            globalProjectionState.hasAnimatedSinceResize = false;
6731            this.nodes.forEach(finishAnimation);
6732          }
6733        });
6734      }
6735      if (layoutId) {
6736        this.root.registerSharedNode(layoutId, this);
6737      }
6738      if (this.options.animate !== false && visualElement && (layoutId || layout2)) {
6739        this.addEventListener("didUpdate", ({ delta, hasLayoutChanged, hasRelativeTargetChanged, layout: newLayout }) => {
6740          if (this.isTreeAnimationBlocked()) {
6741            this.target = void 0;
6742            this.relativeTarget = void 0;
6743            return;
6744          }
6745          const layoutTransition = this.options.transition || visualElement.getDefaultTransition() || defaultLayoutTransition;
6746          const { onLayoutAnimationStart, onLayoutAnimationComplete } = visualElement.getProps();
6747          const targetChanged = !this.targetLayout || !boxEqualsRounded(this.targetLayout, newLayout) || hasRelativeTargetChanged;
6748          const hasOnlyRelativeTargetChanged = !hasLayoutChanged && hasRelativeTargetChanged;
6749          if (this.options.layoutRoot || this.resumeFrom && this.resumeFrom.instance || hasOnlyRelativeTargetChanged || hasLayoutChanged && (targetChanged || !this.currentAnimation)) {
6750            if (this.resumeFrom) {
6751              this.resumingFrom = this.resumeFrom;
6752              this.resumingFrom.resumingFrom = void 0;
6753            }
6754            this.setAnimationOrigin(delta, hasOnlyRelativeTargetChanged);
6755            const animationOptions = {
6756              ...getValueTransition(layoutTransition, "layout"),
6757              onPlay: onLayoutAnimationStart,
6758              onComplete: onLayoutAnimationComplete
6759            };
6760            if (visualElement.shouldReduceMotion || this.options.layoutRoot) {
6761              animationOptions.delay = 0;
6762              animationOptions.type = false;
vendor: 4,956 bytes, lines 6763-6915
6763            }
6764            this.startAnimation(animationOptions);
6765          } else {
6766            if (!hasLayoutChanged) {
6767              finishAnimation(this);
6768            }
6769            if (this.isLead() && this.options.onExitComplete) {
6770              this.options.onExitComplete();
6771            }
6772          }
6773          this.targetLayout = newLayout;
6774        });
6775      }
6776    }
6777    unmount() {
6778      this.options.layoutId && this.willUpdate();
6779      this.root.nodes.remove(this);
6780      const stack = this.getStack();
6781      stack && stack.remove(this);
6782      this.parent && this.parent.children.delete(this);
6783      this.instance = void 0;
6784      cancelFrame(this.updateProjection);
6785    }
6786    // only on the root
6787    blockUpdate() {
6788      this.updateManuallyBlocked = true;
6789    }
6790    unblockUpdate() {
6791      this.updateManuallyBlocked = false;
6792    }
6793    isUpdateBlocked() {
6794      return this.updateManuallyBlocked || this.updateBlockedByResize;
6795    }
6796    isTreeAnimationBlocked() {
6797      return this.isAnimationBlocked || this.parent && this.parent.isTreeAnimationBlocked() || false;
6798    }
6799    // Note: currently only running on root node
6800    startUpdate() {
6801      if (this.isUpdateBlocked())
6802        return;
6803      this.isUpdating = true;
6804      this.nodes && this.nodes.forEach(resetSkewAndRotation);
6805      this.animationId++;
6806    }
6807    getTransformTemplate() {
6808      const { visualElement } = this.options;
6809      return visualElement && visualElement.getProps().transformTemplate;
6810    }
6811    willUpdate(shouldNotifyListeners = true) {
6812      this.root.hasTreeAnimated = true;
6813      if (this.root.isUpdateBlocked()) {
6814        this.options.onExitComplete && this.options.onExitComplete();
6815        return;
6816      }
6817      if (window.MotionCancelOptimisedAnimation && !this.hasCheckedOptimisedAppear) {
6818        cancelTreeOptimisedTransformAnimations(this);
6819      }
6820      !this.root.isUpdating && this.root.startUpdate();
6821      if (this.isLayoutDirty)
6822        return;
6823      this.isLayoutDirty = true;
6824      for (let i = 0; i < this.path.length; i++) {
6825        const node = this.path[i];
6826        node.shouldResetTransform = true;
6827        node.updateScroll("snapshot");
6828        if (node.options.layoutRoot) {
6829          node.willUpdate(false);
6830        }
6831      }
6832      const { layoutId, layout: layout2 } = this.options;
6833      if (layoutId === void 0 && !layout2)
6834        return;
6835      const transformTemplate = this.getTransformTemplate();
6836      this.prevTransformTemplateValue = transformTemplate ? transformTemplate(this.latestValues, "") : void 0;
6837      this.updateSnapshot();
6838      shouldNotifyListeners && this.notifyListeners("willUpdate");
6839    }
6840    update() {
6841      this.updateScheduled = false;
6842      const updateWasBlocked = this.isUpdateBlocked();
6843      if (updateWasBlocked) {
6844        this.unblockUpdate();
6845        this.clearAllSnapshots();
6846        this.nodes.forEach(clearMeasurements);
6847        return;
6848      }
6849      if (!this.isUpdating) {
6850        this.nodes.forEach(clearIsLayoutDirty);
6851      }
6852      this.isUpdating = false;
6853      this.nodes.forEach(resetTransformStyle);
6854      this.nodes.forEach(updateLayout);
6855      this.nodes.forEach(notifyLayoutUpdate);
6856      this.clearAllSnapshots();
6857      const now2 = time.now();
6858      frameData.delta = clamp(0, 1e3 / 60, now2 - frameData.timestamp);
6859      frameData.timestamp = now2;
6860      frameData.isProcessing = true;
6861      frameSteps.update.process(frameData);
6862      frameSteps.preRender.process(frameData);
6863      frameSteps.render.process(frameData);
6864      frameData.isProcessing = false;
6865    }
6866    didUpdate() {
6867      if (!this.updateScheduled) {
6868        this.updateScheduled = true;
6869        microtask.read(this.scheduleUpdate);
6870      }
6871    }
6872    clearAllSnapshots() {
6873      this.nodes.forEach(clearSnapshot);
6874      this.sharedNodes.forEach(removeLeadSnapshots);
6875    }
6876    scheduleUpdateProjection() {
6877      if (!this.projectionUpdateScheduled) {
6878        this.projectionUpdateScheduled = true;
6879        frame.preRender(this.updateProjection, false, true);
6880      }
6881    }
6882    scheduleCheckAfterUnmount() {
6883      frame.postRender(() => {
6884        if (this.isLayoutDirty) {
6885          this.root.didUpdate();
6886        } else {
6887          this.root.checkUpdateFailed();
6888        }
6889      });
6890    }
6891    /**
6892     * Update measurements
6893     */
6894    updateSnapshot() {
6895      if (this.snapshot || !this.instance)
6896        return;
6897      this.snapshot = this.measure();
6898    }
6899    updateLayout() {
6900      if (!this.instance)
6901        return;
6902      this.updateScroll();
6903      if (!(this.options.alwaysMeasureLayout && this.isLead()) && !this.isLayoutDirty) {
6904        return;
6905      }
6906      if (this.resumeFrom && !this.resumeFrom.instance) {
6907        for (let i = 0; i < this.path.length; i++) {
6908          const node = this.path[i];
6909          node.updateScroll();
6910        }
6911      }
6912      const prevLayout = this.layout;
6913      this.layout = this.measure(false);
6914      this.layoutCorrected = createBox();
6915      this.isLayoutDirty = false;
6916      this.projectionDelta = void 0;
6917      this.notifyListeners("measure", this.layout.layoutBox);
6918      const { visualElement } = this.options;
6919      visualElement && visualElement.notify("LayoutMeasure", this.layout.layoutBox, prevLayout ? prevLayout.layoutBox : void 0);
6920    }
6921    updateScroll(phase = "measure") {
6922      let needsMeasurement = Boolean(this.options.layoutScroll && this.instance);
6923      if (this.scroll && this.scroll.animationId === this.root.animationId && this.scroll.phase === phase) {
6924        needsMeasurement = false;
6925      }
6926      if (needsMeasurement) {
6927        const isRoot = checkIsScrollRoot(this.instance);
6928        this.scroll = {
6929          animationId: this.root.animationId,
6930          phase,
6931          isRoot,
6932          offset: measureScroll(this.instance),
6933          wasRoot: this.scroll ? this.scroll.isRoot : isRoot
6934        };
6935      }
6936    }
6937    resetTransform() {
6938      if (!resetTransform)
6939        return;
6940      const isResetRequested = this.isLayoutDirty || this.shouldResetTransform || this.options.alwaysMeasureLayout;
6941      const hasProjection = this.projectionDelta && !isDeltaZero(this.projectionDelta);
6942      const transformTemplate = this.getTransformTemplate();
6943      const transformTemplateValue = transformTemplate ? transformTemplate(this.latestValues, "") : void 0;
6944      const transformTemplateHasChanged = transformTemplateValue !== this.prevTransformTemplateValue;
6945      if (isResetRequested && (hasProjection || hasTransform(this.latestValues) || transformTemplateHasChanged)) {
6946        resetTransform(this.instance, transformTemplateValue);
6947        this.shouldResetTransform = false;
6948        this.scheduleRender();
6949      }
6950    }
6951    measure(removeTransform = true) {
6952      const pageBox = this.measurePageBox();
6953      let layoutBox = this.removeElementScroll(pageBox);
6954      if (removeTransform) {
6955        layoutBox = this.removeTransform(layoutBox);
6956      }
6957      roundBox(layoutBox);
6958      return {
6959        animationId: this.root.animationId,
6960        measuredBox: pageBox,
6961        layoutBox,
6962        latestValues: {},
6963        source: this.id
6964      };
6965    }
6966    measurePageBox() {
6967      var _a;
6968      const { visualElement } = this.options;
6969      if (!visualElement)
6970        return createBox();
6971      const box = visualElement.measureViewportBox();
6972      const wasInScrollRoot = ((_a = this.scroll) === null || _a === void 0 ? void 0 : _a.wasRoot) || this.path.some(checkNodeWasScrollRoot);
6973      if (!wasInScrollRoot) {
6974        const { scroll: scroll2 } = this.root;
6975        if (scroll2) {
6976          translateAxis(box.x, scroll2.offset.x);
6977          translateAxis(box.y, scroll2.offset.y);
6978        }
6979      }
6980      return box;
6981    }
6982    removeElementScroll(box) {
6983      var _a;
6984      const boxWithoutScroll = createBox();
6985      copyBoxInto(boxWithoutScroll, box);
6986      if ((_a = this.scroll) === null || _a === void 0 ? void 0 : _a.wasRoot) {
6987        return boxWithoutScroll;
6988      }
6989      for (let i = 0; i < this.path.length; i++) {
6990        const node = this.path[i];
6991        const { scroll: scroll2, options } = node;
6992        if (node !== this.root && scroll2 && options.layoutScroll) {
6993          if (scroll2.wasRoot) {
6994            copyBoxInto(boxWithoutScroll, box);
6995          }
6996          translateAxis(boxWithoutScroll.x, scroll2.offset.x);
6997          translateAxis(boxWithoutScroll.y, scroll2.offset.y);
6998        }
6999      }
7000      return boxWithoutScroll;
7001    }
7002    applyTransform(box, transformOnly = false) {
7003      const withTransforms = createBox();
7004      copyBoxInto(withTransforms, box);
7005      for (let i = 0; i < this.path.length; i++) {
7006        const node = this.path[i];
7007        if (!transformOnly && node.options.layoutScroll && node.scroll && node !== node.root) {
7008          transformBox(withTransforms, {
7009            x: -node.scroll.offset.x,
7010            y: -node.scroll.offset.y
7011          });
7012        }
7013        if (!hasTransform(node.latestValues))
7014          continue;
7015        transformBox(withTransforms, node.latestValues);
7016      }
7017      if (hasTransform(this.latestValues)) {
7018        transformBox(withTransforms, this.latestValues);
7019      }
7020      return withTransforms;
7021    }
7022    removeTransform(box) {
7023      const boxWithoutTransform = createBox();
7024      copyBoxInto(boxWithoutTransform, box);
7025      for (let i = 0; i < this.path.length; i++) {
7026        const node = this.path[i];
7027        if (!node.instance)
7028          continue;
7029        if (!hasTransform(node.latestValues))
7030          continue;
7031        hasScale(node.latestValues) && node.updateSnapshot();
7032        const sourceBox = createBox();
7033        const nodeBox = node.measurePageBox();
7034        copyBoxInto(sourceBox, nodeBox);
7035        removeBoxTransforms(boxWithoutTransform, node.latestValues, node.snapshot ? node.snapshot.layoutBox : void 0, sourceBox);
7036      }
7037      if (hasTransform(this.latestValues)) {
7038        removeBoxTransforms(boxWithoutTransform, this.latestValues);
7039      }
7040      return boxWithoutTransform;
7041    }
7042    setTargetDelta(delta) {
7043      this.targetDelta = delta;
7044      this.root.scheduleUpdateProjection();
7045      this.isProjectionDirty = true;
7046    }
7047    setOptions(options) {
7048      this.options = {
7049        ...this.options,
7050        ...options,
7051        crossfade: options.crossfade !== void 0 ? options.crossfade : true
7052      };
7053    }
7054    clearMeasurements() {
7055      this.scroll = void 0;
7056      this.layout = void 0;
7057      this.snapshot = void 0;
7058      this.prevTransformTemplateValue = void 0;
7059      this.targetDelta = void 0;
7060      this.target = void 0;
7061      this.isLayoutDirty = false;
7062    }
7063    forceRelativeParentToResolveTarget() {
7064      if (!this.relativeParent)
7065        return;
7066      if (this.relativeParent.resolvedRelativeTargetAt !== frameData.timestamp) {
7067        this.relativeParent.resolveTargetDelta(true);
7068      }
7069    }
7070    resolveTargetDelta(forceRecalculation = false) {
7071      var _a;
7072      const lead = this.getLead();
7073      this.isProjectionDirty || (this.isProjectionDirty = lead.isProjectionDirty);
7074      this.isTransformDirty || (this.isTransformDirty = lead.isTransformDirty);
7075      this.isSharedProjectionDirty || (this.isSharedProjectionDirty = lead.isSharedProjectionDirty);
7076      const isShared = Boolean(this.resumingFrom) || this !== lead;
7077      const canSkip = !(forceRecalculation || isShared && this.isSharedProjectionDirty || this.isProjectionDirty || ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.isProjectionDirty) || this.attemptToResolveRelativeTarget || this.root.updateBlockedByResize);
7078      if (canSkip)
7079        return;
7080      const { layout: layout2, layoutId } = this.options;
7081      if (!this.layout || !(layout2 || layoutId))
7082        return;
7083      this.resolvedRelativeTargetAt = frameData.timestamp;
7084      if (!this.targetDelta && !this.relativeTarget) {
7085        const relativeParent = this.getClosestProjectingParent();
7086        if (relativeParent && relativeParent.layout && this.animationProgress !== 1) {
7087          this.relativeParent = relativeParent;
7088          this.forceRelativeParentToResolveTarget();
7089          this.relativeTarget = createBox();
7090          this.relativeTargetOrigin = createBox();
7091          calcRelativePosition(this.relativeTargetOrigin, this.layout.layoutBox, relativeParent.layout.layoutBox);
7092          copyBoxInto(this.relativeTarget, this.relativeTargetOrigin);
7093        } else {
7094          this.relativeParent = this.relativeTarget = void 0;
7095        }
7096      }
7097      if (!this.relativeTarget && !this.targetDelta)
7098        return;
7099      if (!this.target) {
7100        this.target = createBox();
7101        this.targetWithTransforms = createBox();
7102      }
7103      if (this.relativeTarget && this.relativeTargetOrigin && this.relativeParent && this.relativeParent.target) {
7104        this.forceRelativeParentToResolveTarget();
7105        calcRelativeBox(this.target, this.relativeTarget, this.relativeParent.target);
7106      } else if (this.targetDelta) {
7107        if (Boolean(this.resumingFrom)) {
7108          this.target = this.applyTransform(this.layout.layoutBox);
7109        } else {
7110          copyBoxInto(this.target, this.layout.layoutBox);
7111        }
7112        applyBoxDelta(this.target, this.targetDelta);
7113      } else {
7114        copyBoxInto(this.target, this.layout.layoutBox);
7115      }
7116      if (this.attemptToResolveRelativeTarget) {
7117        this.attemptToResolveRelativeTarget = false;
vendor: 5,044 bytes, lines 7118-7236
7118        const relativeParent = this.getClosestProjectingParent();
7119        if (relativeParent && Boolean(relativeParent.resumingFrom) === Boolean(this.resumingFrom) && !relativeParent.options.layoutScroll && relativeParent.target && this.animationProgress !== 1) {
7120          this.relativeParent = relativeParent;
7121          this.forceRelativeParentToResolveTarget();
7122          this.relativeTarget = createBox();
7123          this.relativeTargetOrigin = createBox();
7124          calcRelativePosition(this.relativeTargetOrigin, this.target, relativeParent.target);
7125          copyBoxInto(this.relativeTarget, this.relativeTargetOrigin);
7126        } else {
7127          this.relativeParent = this.relativeTarget = void 0;
7128        }
7129      }
7130      if (isDebug) {
7131        metrics.resolvedTargetDeltas++;
7132      }
7133    }
7134    getClosestProjectingParent() {
7135      if (!this.parent || hasScale(this.parent.latestValues) || has2DTranslate(this.parent.latestValues)) {
7136        return void 0;
7137      }
7138      if (this.parent.isProjecting()) {
7139        return this.parent;
7140      } else {
7141        return this.parent.getClosestProjectingParent();
7142      }
7143    }
7144    isProjecting() {
7145      return Boolean((this.relativeTarget || this.targetDelta || this.options.layoutRoot) && this.layout);
7146    }
7147    calcProjection() {
7148      var _a;
7149      const lead = this.getLead();
7150      const isShared = Boolean(this.resumingFrom) || this !== lead;
7151      let canSkip = true;
7152      if (this.isProjectionDirty || ((_a = this.parent) === null || _a === void 0 ? void 0 : _a.isProjectionDirty)) {
7153        canSkip = false;
7154      }
7155      if (isShared && (this.isSharedProjectionDirty || this.isTransformDirty)) {
7156        canSkip = false;
7157      }
7158      if (this.resolvedRelativeTargetAt === frameData.timestamp) {
7159        canSkip = false;
7160      }
7161      if (canSkip)
7162        return;
7163      const { layout: layout2, layoutId } = this.options;
7164      this.isTreeAnimating = Boolean(this.parent && this.parent.isTreeAnimating || this.currentAnimation || this.pendingAnimation);
7165      if (!this.isTreeAnimating) {
7166        this.targetDelta = this.relativeTarget = void 0;
7167      }
7168      if (!this.layout || !(layout2 || layoutId))
7169        return;
7170      copyBoxInto(this.layoutCorrected, this.layout.layoutBox);
7171      const prevTreeScaleX = this.treeScale.x;
7172      const prevTreeScaleY = this.treeScale.y;
7173      applyTreeDeltas(this.layoutCorrected, this.treeScale, this.path, isShared);
7174      if (lead.layout && !lead.target && (this.treeScale.x !== 1 || this.treeScale.y !== 1)) {
7175        lead.target = lead.layout.layoutBox;
7176        lead.targetWithTransforms = createBox();
7177      }
7178      const { target } = lead;
7179      if (!target) {
7180        if (this.prevProjectionDelta) {
7181          this.createProjectionDeltas();
7182          this.scheduleRender();
7183        }
7184        return;
7185      }
7186      if (!this.projectionDelta || !this.prevProjectionDelta) {
7187        this.createProjectionDeltas();
7188      } else {
7189        copyAxisDeltaInto(this.prevProjectionDelta.x, this.projectionDelta.x);
7190        copyAxisDeltaInto(this.prevProjectionDelta.y, this.projectionDelta.y);
7191      }
7192      calcBoxDelta(this.projectionDelta, this.layoutCorrected, target, this.latestValues);
7193      if (this.treeScale.x !== prevTreeScaleX || this.treeScale.y !== prevTreeScaleY || !axisDeltaEquals(this.projectionDelta.x, this.prevProjectionDelta.x) || !axisDeltaEquals(this.projectionDelta.y, this.prevProjectionDelta.y)) {
7194        this.hasProjected = true;
7195        this.scheduleRender();
7196        this.notifyListeners("projectionUpdate", target);
7197      }
7198      if (isDebug) {
7199        metrics.recalculatedProjection++;
7200      }
7201    }
7202    hide() {
7203      this.isVisible = false;
7204    }
7205    show() {
7206      this.isVisible = true;
7207    }
7208    scheduleRender(notifyAll2 = true) {
7209      var _a;
7210      (_a = this.options.visualElement) === null || _a === void 0 ? void 0 : _a.scheduleRender();
7211      if (notifyAll2) {
7212        const stack = this.getStack();
7213        stack && stack.scheduleRender();
7214      }
7215      if (this.resumingFrom && !this.resumingFrom.instance) {
7216        this.resumingFrom = void 0;
7217      }
7218    }
7219    createProjectionDeltas() {
7220      this.prevProjectionDelta = createDelta();
7221      this.projectionDelta = createDelta();
7222      this.projectionDeltaWithTransform = createDelta();
7223    }
7224    setAnimationOrigin(delta, hasOnlyRelativeTargetChanged = false) {
7225      const snapshot = this.snapshot;
7226      const snapshotLatestValues = snapshot ? snapshot.latestValues : {};
7227      const mixedValues = { ...this.latestValues };
7228      const targetDelta = createDelta();
7229      if (!this.relativeParent || !this.relativeParent.options.layoutRoot) {
7230        this.relativeTarget = this.relativeTargetOrigin = void 0;
7231      }
7232      this.attemptToResolveRelativeTarget = !hasOnlyRelativeTargetChanged;
7233      const relativeLayout = createBox();
7234      const snapshotSource = snapshot ? snapshot.source : void 0;
7235      const layoutSource = this.layout ? this.layout.source : void 0;
7236      const isSharedLayoutAnimation = snapshotSource !== layoutSource;
7237      const stack = this.getStack();
7238      const isOnlyMember = !stack || stack.members.length <= 1;
7239      const shouldCrossfadeOpacity = Boolean(isSharedLayoutAnimation && !isOnlyMember && this.options.crossfade === true && !this.path.some(hasOpacityCrossfade));
7240      this.animationProgress = 0;
7241      let prevRelativeTarget;
7242      this.mixTargetDelta = (latest) => {
7243        const progress2 = latest / 1e3;
7244        mixAxisDelta(targetDelta.x, delta.x, progress2);
7245        mixAxisDelta(targetDelta.y, delta.y, progress2);
7246        this.setTargetDelta(targetDelta);
7247        if (this.relativeTarget && this.relativeTargetOrigin && this.layout && this.relativeParent && this.relativeParent.layout) {
7248          calcRelativePosition(relativeLayout, this.layout.layoutBox, this.relativeParent.layout.layoutBox);
7249          mixBox(this.relativeTarget, this.relativeTargetOrigin, relativeLayout, progress2);
7250          if (prevRelativeTarget && boxEquals(this.relativeTarget, prevRelativeTarget)) {
7251            this.isProjectionDirty = false;
7252          }
7253          if (!prevRelativeTarget)
7254            prevRelativeTarget = createBox();
7255          copyBoxInto(prevRelativeTarget, this.relativeTarget);
7256        }
7257        if (isSharedLayoutAnimation) {
7258          this.animationValues = mixedValues;
7259          mixValues(mixedValues, snapshotLatestValues, this.latestValues, progress2, shouldCrossfadeOpacity, isOnlyMember);
7260        }
7261        this.root.scheduleUpdateProjection();
7262        this.scheduleRender();
7263        this.animationProgress = progress2;
7264      };
7265      this.mixTargetDelta(this.options.layoutRoot ? 1e3 : 0);
7266    }
7267    startAnimation(options) {
7268      this.notifyListeners("animationStart");
7269      this.currentAnimation && this.currentAnimation.stop();
7270      if (this.resumingFrom && this.resumingFrom.currentAnimation) {
7271        this.resumingFrom.currentAnimation.stop();
7272      }
7273      if (this.pendingAnimation) {
7274        cancelFrame(this.pendingAnimation);
7275        this.pendingAnimation = void 0;
7276      }
7277      this.pendingAnimation = frame.update(() => {
7278        globalProjectionState.hasAnimatedSinceResize = true;
7279        this.currentAnimation = animateSingleValue(0, animationTarget, {
7280          ...options,
7281          onUpdate: (latest) => {
7282            this.mixTargetDelta(latest);
7283            options.onUpdate && options.onUpdate(latest);
7284          },
7285          onComplete: () => {
7286            options.onComplete && options.onComplete();
7287            this.completeAnimation();
7288          }
7289        });
7290        if (this.resumingFrom) {
7291          this.resumingFrom.currentAnimation = this.currentAnimation;
7292        }
7293        this.pendingAnimation = void 0;
7294      });
7295    }
7296    completeAnimation() {
7297      if (this.resumingFrom) {
7298        this.resumingFrom.currentAnimation = void 0;
7299        this.resumingFrom.preserveOpacity = void 0;
7300      }
7301      const stack = this.getStack();
7302      stack && stack.exitAnimationComplete();
7303      this.resumingFrom = this.currentAnimation = this.animationValues = void 0;
7304      this.notifyListeners("animationComplete");
7305    }
7306    finishAnimation() {
7307      if (this.currentAnimation) {
7308        this.mixTargetDelta && this.mixTargetDelta(animationTarget);
7309        this.currentAnimation.stop();
7310      }
7311      this.completeAnimation();
7312    }
7313    applyTransformsToTarget() {
7314      const lead = this.getLead();
7315      let { targetWithTransforms, target, layout: layout2, latestValues } = lead;
7316      if (!targetWithTransforms || !target || !layout2)
7317        return;
7318      if (this !== lead && this.layout && layout2 && shouldAnimatePositionOnly(this.options.animationType, this.layout.layoutBox, layout2.layoutBox)) {
7319        target = this.target || createBox();
7320        const xLength = calcLength(this.layout.layoutBox.x);
7321        target.x.min = lead.target.x.min;
7322        target.x.max = target.x.min + xLength;
7323        const yLength = calcLength(this.layout.layoutBox.y);
7324        target.y.min = lead.target.y.min;
7325        target.y.max = target.y.min + yLength;
7326      }
7327      copyBoxInto(targetWithTransforms, target);
7328      transformBox(targetWithTransforms, latestValues);
7329      calcBoxDelta(this.projectionDeltaWithTransform, this.layoutCorrected, targetWithTransforms, latestValues);
7330    }
7331    registerSharedNode(layoutId, node) {
7332      if (!this.sharedNodes.has(layoutId)) {
7333        this.sharedNodes.set(layoutId, new NodeStack());
7334      }
7335      const stack = this.sharedNodes.get(layoutId);
7336      stack.add(node);
7337      const config = node.options.initialPromotionConfig;
7338      node.promote({
7339        transition: config ? config.transition : void 0,
7340        preserveFollowOpacity: config && config.shouldPreserveFollowOpacity ? config.shouldPreserveFollowOpacity(node) : void 0
7341      });
7342    }
7343    isLead() {
7344      const stack = this.getStack();
7345      return stack ? stack.lead === this : true;
7346    }
7347    getLead() {
7348      var _a;
7349      const { layoutId } = this.options;
7350      return layoutId ? ((_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.lead) || this : this;
7351    }
7352    getPrevLead() {
7353      var _a;
7354      const { layoutId } = this.options;
7355      return layoutId ? (_a = this.getStack()) === null || _a === void 0 ? void 0 : _a.prevLead : void 0;
7356    }
7357    getStack() {
7358      const { layoutId } = this.options;
7359      if (layoutId)
7360        return this.root.sharedNodes.get(layoutId);
7361    }
7362    promote({ needsReset, transition, preserveFollowOpacity } = {}) {
7363      const stack = this.getStack();
7364      if (stack)
7365        stack.promote(this, preserveFollowOpacity);
7366      if (needsReset) {
7367        this.projectionDelta = void 0;
7368        this.needsReset = true;
7369      }
7370      if (transition)
7371        this.setOptions({ transition });
7372    }
7373    relegate() {
7374      const stack = this.getStack();
7375      if (stack) {
7376        return stack.relegate(this);
7377      } else {
7378        return false;
7379      }
7380    }
7381    resetSkewAndRotation() {
7382      const { visualElement } = this.options;
7383      if (!visualElement)
7384        return;
7385      let hasDistortingTransform = false;
7386      const { latestValues } = visualElement;
7387      if (latestValues.z || latestValues.rotate || latestValues.rotateX || latestValues.rotateY || latestValues.rotateZ || latestValues.skewX || latestValues.skewY) {
7388        hasDistortingTransform = true;
7389      }
7390      if (!hasDistortingTransform)
7391        return;
7392      const resetValues = {};
7393      if (latestValues.z) {
7394        resetDistortingTransform("z", visualElement, resetValues, this.animationValues);
7395      }
7396      for (let i = 0; i < transformAxes.length; i++) {
7397        resetDistortingTransform(`rotate${transformAxes[i]}`, visualElement, resetValues, this.animationValues);
7398        resetDistortingTransform(`skew${transformAxes[i]}`, visualElement, resetValues, this.animationValues);
7399      }
7400      visualElement.render();
7401      for (const key in resetValues) {
7402        visualElement.setStaticValue(key, resetValues[key]);
7403        if (this.animationValues) {
7404          this.animationValues[key] = resetValues[key];
7405        }
7406      }
7407      visualElement.scheduleRender();
7408    }
7409    getProjectionStyles(styleProp) {
7410      var _a, _b;
7411      if (!this.instance || this.isSVG)
7412        return void 0;
7413      if (!this.isVisible) {
7414        return hiddenVisibility;
7415      }
7416      const styles = {
7417        visibility: ""
7418      };
7419      const transformTemplate = this.getTransformTemplate();
7420      if (this.needsReset) {
7421        this.needsReset = false;
7422        styles.opacity = "";
7423        styles.pointerEvents = resolveMotionValue(styleProp === null || styleProp === void 0 ? void 0 : styleProp.pointerEvents) || "";
7424        styles.transform = transformTemplate ? transformTemplate(this.latestValues, "") : "none";
7425        return styles;
7426      }
7427      const lead = this.getLead();
7428      if (!this.projectionDelta || !this.layout || !lead.target) {
7429        const emptyStyles = {};
7430        if (this.options.layoutId) {
7431          emptyStyles.opacity = this.latestValues.opacity !== void 0 ? this.latestValues.opacity : 1;
7432          emptyStyles.pointerEvents = resolveMotionValue(styleProp === null || styleProp === void 0 ? void 0 : styleProp.pointerEvents) || "";
7433        }
7434        if (this.hasProjected && !hasTransform(this.latestValues)) {
7435          emptyStyles.transform = transformTemplate ? transformTemplate({}, "") : "none";
7436          this.hasProjected = false;
7437        }
7438        return emptyStyles;
7439      }
7440      const valuesToRender = lead.animationValues || lead.latestValues;
7441      this.applyTransformsToTarget();
7442      styles.transform = buildProjectionTransform(this.projectionDeltaWithTransform, this.treeScale, valuesToRender);
7443      if (transformTemplate) {
7444        styles.transform = transformTemplate(valuesToRender, styles.transform);
7445      }
7446      const { x, y } = this.projectionDelta;
7447      styles.transformOrigin = `${x.origin * 100}% ${y.origin * 100}% 0`;
7448      if (lead.animationValues) {
7449        styles.opacity = lead === this ? (_b = (_a = valuesToRender.opacity) !== null && _a !== void 0 ? _a : this.latestValues.opacity) !== null && _b !== void 0 ? _b : 1 : this.preserveOpacity ? this.latestValues.opacity : valuesToRender.opacityExit;
7450      } else {
7451        styles.opacity = lead === this ? valuesToRender.opacity !== void 0 ? valuesToRender.opacity : "" : valuesToRender.opacityExit !== void 0 ? valuesToRender.opacityExit : 0;
7452      }
7453      for (const key in scaleCorrectors) {
7454        if (valuesToRender[key] === void 0)
7455          continue;
7456        const { correct, applyTo } = scaleCorrectors[key];
7457        const corrected = styles.transform === "none" ? valuesToRender[key] : correct(valuesToRender[key], lead);
7458        if (applyTo) {
7459          const num = applyTo.length;
7460          for (let i = 0; i < num; i++) {
7461            styles[applyTo[i]] = corrected;
7462          }
7463        } else {
7464          styles[key] = corrected;
7465        }
7466      }
7467      if (this.options.layoutId) {
7468        styles.pointerEvents = lead === this ? resolveMotionValue(styleProp === null || styleProp === void 0 ? void 0 : styleProp.pointerEvents) || "" : "none";
7469      }
7470      return styles;
7471    }
7472    clearSnapshot() {
7473      this.resumeFrom = this.snapshot = void 0;
7474    }
7475    // Only run on root
7476    resetTree() {
7477      this.root.nodes.forEach((node) => {
7478        var _a;
7479        return (_a = node.currentAnimation) === null || _a === void 0 ? void 0 : _a.stop();
7480      });
7481      this.root.nodes.forEach(clearMeasurements);
7482      this.root.sharedNodes.clear();
7483    }
7484  };
7485}
7486function updateLayout(node) {
7487  node.updateLayout();
7488}
7489function notifyLayoutUpdate(node) {
7490  var _a;
7491  const snapshot = ((_a = node.resumeFrom) === null || _a === void 0 ? void 0 : _a.snapshot) || node.snapshot;
7492  if (node.isLead() && node.layout && snapshot && node.hasListeners("didUpdate")) {
7493    const { layoutBox: layout2, measuredBox: measuredLayout } = node.layout;
7494    const { animationType } = node.options;
7495    const isShared = snapshot.source !== node.layout.source;
7496    if (animationType === "size") {
7497      eachAxis((axis) => {
7498        const axisSnapshot = isShared ? snapshot.measuredBox[axis] : snapshot.layoutBox[axis];
7499        const length = calcLength(axisSnapshot);
7500        axisSnapshot.min = layout2[axis].min;
7501        axisSnapshot.max = axisSnapshot.min + length;
7502      });
7503    } else if (shouldAnimatePositionOnly(animationType, snapshot.layoutBox, layout2)) {
7504      eachAxis((axis) => {
7505        const axisSnapshot = isShared ? snapshot.measuredBox[axis] : snapshot.layoutBox[axis];
7506        const length = calcLength(layout2[axis]);
7507        axisSnapshot.max = axisSnapshot.min + length;
7508        if (node.relativeTarget && !node.currentAnimation) {
7509          node.isProjectionDirty = true;
7510          node.relativeTarget[axis].max = node.relativeTarget[axis].min + length;
7511        }
7512      });
7513    }
7514    const layoutDelta = createDelta();
7515    calcBoxDelta(layoutDelta, layout2, snapshot.layoutBox);
7516    const visualDelta = createDelta();
7517    if (isShared) {
7518      calcBoxDelta(visualDelta, node.applyTransform(measuredLayout, true), snapshot.measuredBox);
7519    } else {
7520      calcBoxDelta(visualDelta, layout2, snapshot.layoutBox);
7521    }
7522    const hasLayoutChanged = !isDeltaZero(layoutDelta);
7523    let hasRelativeTargetChanged = false;
7524    if (!node.resumeFrom) {
7525      const relativeParent = node.getClosestProjectingParent();
7526      if (relativeParent && !relativeParent.resumeFrom) {
7527        const { snapshot: parentSnapshot, layout: parentLayout } = relativeParent;
7528        if (parentSnapshot && parentLayout) {
7529          const relativeSnapshot = createBox();
7530          calcRelativePosition(relativeSnapshot, snapshot.layoutBox, parentSnapshot.layoutBox);
7531          const relativeLayout = createBox();
7532          calcRelativePosition(relativeLayout, layout2, parentLayout.layoutBox);
7533          if (!boxEqualsRounded(relativeSnapshot, relativeLayout)) {
7534            hasRelativeTargetChanged = true;
7535          }
7536          if (relativeParent.options.layoutRoot) {
7537            node.relativeTarget = relativeLayout;
7538            node.relativeTargetOrigin = relativeSnapshot;
7539            node.relativeParent = relativeParent;
7540          }
7541        }
7542      }
7543    }
7544    node.notifyListeners("didUpdate", {
7545      layout: layout2,
7546      snapshot,
7547      delta: visualDelta,
7548      layoutDelta,
7549      hasLayoutChanged,
7550      hasRelativeTargetChanged
7551    });
7552  } else if (node.isLead()) {
7553    const { onExitComplete } = node.options;
7554    onExitComplete && onExitComplete();
7555  }
7556  node.options.transition = void 0;
7557}
7558function propagateDirtyNodes(node) {
7559  if (isDebug) {
7560    metrics.totalNodes++;
7561  }
7562  if (!node.parent)
7563    return;
7564  if (!node.isProjecting()) {
7565    node.isProjectionDirty = node.parent.isProjectionDirty;
7566  }
7567  node.isSharedProjectionDirty || (node.isSharedProjectionDirty = Boolean(node.isProjectionDirty || node.parent.isProjectionDirty || node.parent.isSharedProjectionDirty));
7568  node.isTransformDirty || (node.isTransformDirty = node.parent.isTransformDirty);
7569}
7570function cleanDirtyNodes(node) {
7571  node.isProjectionDirty = node.isSharedProjectionDirty = node.isTransformDirty = false;
7572}
7573function clearSnapshot(node) {
7574  node.clearSnapshot();
7575}
7576function clearMeasurements(node) {
7577  node.clearMeasurements();
7578}
7579function clearIsLayoutDirty(node) {
7580  node.isLayoutDirty = false;
7581}
7582function resetTransformStyle(node) {
7583  const { visualElement } = node.options;
7584  if (visualElement && visualElement.getProps().onBeforeLayoutMeasure) {
7585    visualElement.notify("BeforeLayoutMeasure");
7586  }
7587  node.resetTransform();
7588}
7589function finishAnimation(node) {
7590  node.finishAnimation();
7591  node.targetDelta = node.relativeTarget = node.target = void 0;
7592  node.isProjectionDirty = true;
7593}
7594function resolveTargetDelta(node) {
7595  node.resolveTargetDelta();
7596}
7597function calcProjection(node) {
7598  node.calcProjection();
7599}
7600function resetSkewAndRotation(node) {
7601  node.resetSkewAndRotation();
7602}
7603function removeLeadSnapshots(stack) {
7604  stack.removeLeadSnapshot();
7605}
7606function mixAxisDelta(output, delta, p) {
7607  output.translate = mixNumber(delta.translate, 0, p);
7608  output.scale = mixNumber(delta.scale, 1, p);
7609  output.origin = delta.origin;
7610  output.originPoint = delta.originPoint;
7611}
7612function mixAxis(output, from, to, p) {
7613  output.min = mixNumber(from.min, to.min, p);
7614  output.max = mixNumber(from.max, to.max, p);
7615}
7616function mixBox(output, from, to, p) {
7617  mixAxis(output.x, from.x, to.x, p);
7618  mixAxis(output.y, from.y, to.y, p);
7619}
7620function hasOpacityCrossfade(node) {
7621  return node.animationValues && node.animationValues.opacityExit !== void 0;
7622}
7623var defaultLayoutTransition = {
7624  duration: 0.45,
7625  ease: [0.4, 0, 0.1, 1]
7626};
7627var userAgentContains = (string) => typeof navigator !== "undefined" && navigator.userAgent && navigator.userAgent.toLowerCase().includes(string);
7628var roundPoint = userAgentContains("applewebkit/") && !userAgentContains("chrome/") ? Math.round : noop;
7629function roundAxis(axis) {
7630  axis.min = roundPoint(axis.min);
7631  axis.max = roundPoint(axis.max);
7632}
7633function roundBox(box) {
7634  roundAxis(box.x);
7635  roundAxis(box.y);
7636}
7637function shouldAnimatePositionOnly(animationType, snapshot, layout2) {
7638  return animationType === "position" || animationType === "preserve-aspect" && !isNear(aspectRatio(snapshot), aspectRatio(layout2), 0.2);
7639}
7640function checkNodeWasScrollRoot(node) {
7641  var _a;
7642  return node !== node.root && ((_a = node.scroll) === null || _a === void 0 ? void 0 : _a.wasRoot);
7643}
7644var import_dist745 = __toESM(require_dist(), 1);
7645var import_dist746 = __toESM(require_dist2(), 1);
7646var import_dist747 = __toESM(require_dist3(), 1);
7647var DocumentProjectionNode = createProjectionNode2({
7648  attachResizeListener: (ref, notify2) => addDomEvent(ref, "resize", notify2),
7649  measureScroll: () => ({
7650    x: document.documentElement.scrollLeft || document.body.scrollLeft,
7651    y: document.documentElement.scrollTop || document.body.scrollTop
7652  }),
7653  checkIsScrollRoot: () => true
7654});
7655var rootProjectionNode = {
7656  current: void 0
7657};
7658var HTMLProjectionNode = createProjectionNode2({
7659  measureScroll: (instance) => ({
7660    x: instance.scrollLeft,
7661    y: instance.scrollTop
7662  }),
7663  defaultParent: () => {
7664    if (!rootProjectionNode.current) {
7665      const documentNode = new DocumentProjectionNode({});
7666      documentNode.mount(window);
7667      documentNode.setOptions({ layoutScroll: true });
7668      rootProjectionNode.current = documentNode;
7669    }
7670    return rootProjectionNode.current;
7671  },
7672  resetTransform: (instance, value) => {
7673    instance.style.transform = value !== void 0 ? value : "none";
7674  },
7675  checkIsScrollRoot: (instance) => Boolean(window.getComputedStyle(instance).position === "fixed")
7676});
7677var drag = {
7678  pan: {
7679    Feature: PanGesture
7680  },
7681  drag: {
7682    Feature: DragGesture,
7683    ProjectionNode: HTMLProjectionNode,
7684    MeasureLayout
7685  }
7686};
7687var import_dist769 = __toESM(require_dist(), 1);
7688var import_dist770 = __toESM(require_dist2(), 1);
7689var import_dist771 = __toESM(require_dist3(), 1);
7690var import_dist754 = __toESM(require_dist(), 1);
7691var import_dist755 = __toESM(require_dist2(), 1);
7692var import_dist756 = __toESM(require_dist3(), 1);
7693function handleHoverEvent(node, event, lifecycle) {
7694  const { props } = node;
7695  if (node.animationState && props.whileHover) {
7696    node.animationState.setActive("whileHover", lifecycle === "Start");
7697  }
7698  const eventName = "onHover" + lifecycle;
7699  const callback = props[eventName];
7700  if (callback) {
7701    frame.postRender(() => callback(event, extractEventInfo(event)));
7702  }
7703}
7704var HoverGesture = class extends Feature {
7705  mount() {
7706    const { current } = this.node;
7707    if (!current)
7708      return;
7709    this.unmount = hover(current, (startEvent) => {
7710      handleHoverEvent(this.node, startEvent, "Start");
7711      return (endEvent) => handleHoverEvent(this.node, endEvent, "End");
7712    });
7713  }
7714  unmount() {
7715  }
7716};
7717var import_dist757 = __toESM(require_dist(), 1);
7718var import_dist758 = __toESM(require_dist2(), 1);
7719var import_dist759 = __toESM(require_dist3(), 1);
7720var FocusGesture = class extends Feature {
7721  constructor() {
7722    super(...arguments);
7723    this.isActive = false;
7724  }
7725  onFocus() {
7726    let isFocusVisible = false;
7727    try {
7728      isFocusVisible = this.node.current.matches(":focus-visible");
7729    } catch (e) {
7730      isFocusVisible = true;
7731    }
7732    if (!isFocusVisible || !this.node.animationState)
7733      return;
7734    this.node.animationState.setActive("whileFocus", true);
7735    this.isActive = true;
7736  }
7737  onBlur() {
7738    if (!this.isActive || !this.node.animationState)
7739      return;
7740    this.node.animationState.setActive("whileFocus", false);
7741    this.isActive = false;
7742  }
7743  mount() {
7744    this.unmount = pipe(addDomEvent(this.node.current, "focus", () => this.onFocus()), addDomEvent(this.node.current, "blur", () => this.onBlur()));
7745  }
7746  unmount() {
7747  }
7748};
7749var import_dist760 = __toESM(require_dist(), 1);
7750var import_dist761 = __toESM(require_dist2(), 1);
7751var import_dist762 = __toESM(require_dist3(), 1);
7752function handlePressEvent(node, event, lifecycle) {
7753  const { props } = node;
7754  if (node.animationState && props.whileTap) {
7755    node.animationState.setActive("whileTap", lifecycle === "Start");
7756  }
7757  const eventName = "onTap" + (lifecycle === "End" ? "" : lifecycle);
7758  const callback = props[eventName];
7759  if (callback) {
7760    frame.postRender(() => callback(event, extractEventInfo(event)));
7761  }
7762}
7763var PressGesture = class extends Feature {
7764  mount() {
7765    const { current } = this.node;
7766    if (!current)
7767      return;
7768    this.unmount = press(current, (startEvent) => {
7769      handlePressEvent(this.node, startEvent, "Start");
7770      return (endEvent, { success }) => handlePressEvent(this.node, endEvent, success ? "End" : "Cancel");
7771    }, { useGlobalTarget: this.node.props.globalTapTarget });
7772  }
7773  unmount() {
7774  }
7775};
7776var import_dist766 = __toESM(require_dist(), 1);
7777var import_dist767 = __toESM(require_dist2(), 1);
7778var import_dist768 = __toESM(require_dist3(), 1);
7779var import_dist763 = __toESM(require_dist(), 1);
7780var import_dist764 = __toESM(require_dist2(), 1);
7781var import_dist765 = __toESM(require_dist3(), 1);
7782var observerCallbacks = /* @__PURE__ */ new WeakMap();
7783var observers = /* @__PURE__ */ new WeakMap();
7784var fireObserverCallback = (entry) => {
7785  const callback = observerCallbacks.get(entry.target);
7786  callback && callback(entry);
7787};
7788var fireAllObserverCallbacks = (entries) => {
7789  entries.forEach(fireObserverCallback);
7790};
7791function initIntersectionObserver({ root, ...options }) {
7792  const lookupRoot = root || document;
7793  if (!observers.has(lookupRoot)) {
7794    observers.set(lookupRoot, {});
7795  }
7796  const rootObservers = observers.get(lookupRoot);
7797  const key = JSON.stringify(options);
7798  if (!rootObservers[key]) {
7799    rootObservers[key] = new IntersectionObserver(fireAllObserverCallbacks, { root, ...options });
7800  }
7801  return rootObservers[key];
7802}
7803function observeIntersection(element, options, callback) {
7804  const rootInteresectionObserver = initIntersectionObserver(options);
7805  observerCallbacks.set(element, callback);
7806  rootInteresectionObserver.observe(element);
7807  return () => {
7808    observerCallbacks.delete(element);
7809    rootInteresectionObserver.unobserve(element);
7810  };
7811}
7812var thresholdNames = {
7813  some: 0,
7814  all: 1
7815};
7816var InViewFeature = class extends Feature {
7817  constructor() {
7818    super(...arguments);
7819    this.hasEnteredView = false;
7820    this.isInView = false;
7821  }
7822  startObserver() {
7823    this.unmount();
7824    const { viewport = {} } = this.node.getProps();
7825    const { root, margin: rootMargin, amount = "some", once } = viewport;
7826    const options = {
7827      root: root ? root.current : void 0,
7828      rootMargin,
7829      threshold: typeof amount === "number" ? amount : thresholdNames[amount]
7830    };
7831    const onIntersectionUpdate = (entry) => {
7832      const { isIntersecting } = entry;
7833      if (this.isInView === isIntersecting)
7834        return;
7835      this.isInView = isIntersecting;
7836      if (once && !isIntersecting && this.hasEnteredView) {
7837        return;
7838      } else if (isIntersecting) {
7839        this.hasEnteredView = true;
7840      }
7841      if (this.node.animationState) {
7842        this.node.animationState.setActive("whileInView", isIntersecting);
7843      }
7844      const { onViewportEnter, onViewportLeave } = this.node.getProps();
7845      const callback = isIntersecting ? onViewportEnter : onViewportLeave;
7846      callback && callback(entry);
7847    };
7848    return observeIntersection(this.node.current, options, onIntersectionUpdate);
7849  }
7850  mount() {
7851    this.startObserver();
7852  }
7853  update() {
7854    if (typeof IntersectionObserver === "undefined")
7855      return;
7856    const { props, prevProps } = this.node;
7857    const hasOptionsChanged = ["amount", "margin", "root"].some(hasViewportOptionChanged(props, prevProps));
7858    if (hasOptionsChanged) {
7859      this.startObserver();
7860    }
7861  }
7862  unmount() {
7863  }
7864};
7865function hasViewportOptionChanged({ viewport = {} }, { viewport: prevViewport = {} } = {}) {
7866  return (name) => viewport[name] !== prevViewport[name];
7867}
7868var gestureAnimations = {
7869  inView: {
7870    Feature: InViewFeature
7871  },
7872  tap: {
7873    Feature: PressGesture
7874  },
7875  focus: {
7876    Feature: FocusGesture
7877  },
7878  hover: {
7879    Feature: HoverGesture
7880  }
7881};
7882var import_dist772 = __toESM(require_dist(), 1);
7883var import_dist773 = __toESM(require_dist2(), 1);
7884var import_dist774 = __toESM(require_dist3(), 1);
7885var layout = {
7886  layout: {
7887    ProjectionNode: HTMLProjectionNode,
7888    MeasureLayout
7889  }
7890};
7891var import_dist802 = __toESM(require_dist(), 1);
7892var import_dist803 = __toESM(require_dist2(), 1);
7893var import_dist804 = __toESM(require_dist3(), 1);
7894var import_react29 = __toESM(require_react(), 1);
7895var import_dist796 = __toESM(require_dist(), 1);
7896var import_dist797 = __toESM(require_dist2(), 1);
7897var import_dist798 = __toESM(require_dist3(), 1);
7898var import_dist793 = __toESM(require_dist(), 1);
7899var import_dist794 = __toESM(require_dist2(), 1);
7900var import_dist795 = __toESM(require_dist3(), 1);
7901var import_dist790 = __toESM(require_dist(), 1);
7902var import_dist791 = __toESM(require_dist2(), 1);
7903var import_dist792 = __toESM(require_dist3(), 1);
7904var import_dist778 = __toESM(require_dist(), 1);
7905var import_dist779 = __toESM(require_dist2(), 1);
7906var import_dist780 = __toESM(require_dist3(), 1);
7907var import_dist775 = __toESM(require_dist(), 1);
7908var import_dist776 = __toESM(require_dist2(), 1);
7909var import_dist777 = __toESM(require_dist3(), 1);
7910var prefersReducedMotion = { current: null };
7911var hasReducedMotionListener = { current: false };
7912function initPrefersReducedMotion() {
7913  hasReducedMotionListener.current = true;
7914  if (!isBrowser)
7915    return;
7916  if (window.matchMedia) {
7917    const motionMediaQuery = window.matchMedia("(prefers-reduced-motion)");
7918    const setReducedMotionPreferences = () => prefersReducedMotion.current = motionMediaQuery.matches;
7919    motionMediaQuery.addListener(setReducedMotionPreferences);
7920    setReducedMotionPreferences();
7921  } else {
7922    prefersReducedMotion.current = false;
vendor: 4,974 bytes, lines 7923-8051
7923  }
7924}
7925var import_dist781 = __toESM(require_dist(), 1);
7926var import_dist782 = __toESM(require_dist2(), 1);
7927var import_dist783 = __toESM(require_dist3(), 1);
7928var valueTypes = [...dimensionValueTypes, color, complex];
7929var findValueType = (v) => valueTypes.find(testValueType(v));
7930var import_dist784 = __toESM(require_dist(), 1);
7931var import_dist785 = __toESM(require_dist2(), 1);
7932var import_dist786 = __toESM(require_dist3(), 1);
7933var visualElementStore = /* @__PURE__ */ new WeakMap();
7934var import_dist787 = __toESM(require_dist(), 1);
7935var import_dist788 = __toESM(require_dist2(), 1);
7936var import_dist789 = __toESM(require_dist3(), 1);
7937function updateMotionValuesFromProps(element, next, prev) {
7938  for (const key in next) {
7939    const nextValue = next[key];
7940    const prevValue = prev[key];
7941    if (isMotionValue(nextValue)) {
7942      element.addValue(key, nextValue);
7943      if (true) {
7944        warnOnce(nextValue.version === "11.18.2", `Attempting to mix Motion versions ${nextValue.version} with 11.18.2 may not work as expected.`);
7945      }
7946    } else if (isMotionValue(prevValue)) {
7947      element.addValue(key, motionValue(nextValue, { owner: element }));
7948    } else if (prevValue !== nextValue) {
7949      if (element.hasValue(key)) {
7950        const existingValue = element.getValue(key);
7951        if (existingValue.liveStyle === true) {
7952          existingValue.jump(nextValue);
7953        } else if (!existingValue.hasAnimated) {
7954          existingValue.set(nextValue);
7955        }
7956      } else {
7957        const latestValue = element.getStaticValue(key);
7958        element.addValue(key, motionValue(latestValue !== void 0 ? latestValue : nextValue, { owner: element }));
7959      }
7960    }
7961  }
7962  for (const key in prev) {
7963    if (next[key] === void 0)
7964      element.removeValue(key);
7965  }
7966  return next;
7967}
7968var propEventHandlers = [
7969  "AnimationStart",
7970  "AnimationComplete",
7971  "Update",
7972  "BeforeLayoutMeasure",
7973  "LayoutMeasure",
7974  "LayoutAnimationStart",
7975  "LayoutAnimationComplete"
7976];
7977var VisualElement = class {
7978  /**
7979   * This method takes React props and returns found MotionValues. For example, HTML
7980   * MotionValues will be found within the style prop, whereas for Three.js within attribute arrays.
7981   *
7982   * This isn't an abstract method as it needs calling in the constructor, but it is
7983   * intended to be one.
7984   */
7985  scrapeMotionValuesFromProps(_props, _prevProps, _visualElement) {
7986    return {};
7987  }
7988  constructor({ parent, props, presenceContext, reducedMotionConfig, blockInitialAnimation, visualState }, options = {}) {
7989    this.current = null;
7990    this.children = /* @__PURE__ */ new Set();
7991    this.isVariantNode = false;
7992    this.isControllingVariants = false;
7993    this.shouldReduceMotion = null;
7994    this.values = /* @__PURE__ */ new Map();
7995    this.KeyframeResolver = KeyframeResolver;
7996    this.features = {};
7997    this.valueSubscriptions = /* @__PURE__ */ new Map();
7998    this.prevMotionValues = {};
7999    this.events = {};
8000    this.propEventSubscriptions = {};
8001    this.notifyUpdate = () => this.notify("Update", this.latestValues);
8002    this.render = () => {
8003      if (!this.current)
8004        return;
8005      this.triggerBuild();
8006      this.renderInstance(this.current, this.renderState, this.props.style, this.projection);
8007    };
8008    this.renderScheduledAt = 0;
8009    this.scheduleRender = () => {
8010      const now2 = time.now();
8011      if (this.renderScheduledAt < now2) {
8012        this.renderScheduledAt = now2;
8013        frame.render(this.render, false, true);
8014      }
8015    };
8016    const { latestValues, renderState, onUpdate } = visualState;
8017    this.onUpdate = onUpdate;
8018    this.latestValues = latestValues;
8019    this.baseTarget = { ...latestValues };
8020    this.initialValues = props.initial ? { ...latestValues } : {};
8021    this.renderState = renderState;
8022    this.parent = parent;
8023    this.props = props;
8024    this.presenceContext = presenceContext;
8025    this.depth = parent ? parent.depth + 1 : 0;
8026    this.reducedMotionConfig = reducedMotionConfig;
8027    this.options = options;
8028    this.blockInitialAnimation = Boolean(blockInitialAnimation);
8029    this.isControllingVariants = isControllingVariants(props);
8030    this.isVariantNode = isVariantNode(props);
8031    if (this.isVariantNode) {
8032      this.variantChildren = /* @__PURE__ */ new Set();
8033    }
8034    this.manuallyAnimateOnMount = Boolean(parent && parent.current);
8035    const { willChange, ...initialMotionValues } = this.scrapeMotionValuesFromProps(props, {}, this);
8036    for (const key in initialMotionValues) {
8037      const value = initialMotionValues[key];
8038      if (latestValues[key] !== void 0 && isMotionValue(value)) {
8039        value.set(latestValues[key], false);
8040      }
8041    }
8042  }
8043  mount(instance) {
8044    this.current = instance;
8045    visualElementStore.set(instance, this);
8046    if (this.projection && !this.projection.instance) {
8047      this.projection.mount(instance);
8048    }
8049    if (this.parent && this.isVariantNode && !this.isControllingVariants) {
8050      this.removeFromVariantTree = this.parent.addVariantChild(this);
8051    }
vendor: 5,725 bytes, lines 8052-8219
8052    this.values.forEach((value, key) => this.bindToMotionValue(key, value));
8053    if (!hasReducedMotionListener.current) {
8054      initPrefersReducedMotion();
8055    }
8056    this.shouldReduceMotion = this.reducedMotionConfig === "never" ? false : this.reducedMotionConfig === "always" ? true : prefersReducedMotion.current;
8057    if (true) {
8058      warnOnce(this.shouldReduceMotion !== true, "You have Reduced Motion enabled on your device. Animations may not appear as expected.");
8059    }
8060    if (this.parent)
8061      this.parent.children.add(this);
8062    this.update(this.props, this.presenceContext);
8063  }
8064  unmount() {
8065    visualElementStore.delete(this.current);
8066    this.projection && this.projection.unmount();
8067    cancelFrame(this.notifyUpdate);
8068    cancelFrame(this.render);
8069    this.valueSubscriptions.forEach((remove) => remove());
8070    this.valueSubscriptions.clear();
8071    this.removeFromVariantTree && this.removeFromVariantTree();
8072    this.parent && this.parent.children.delete(this);
8073    for (const key in this.events) {
8074      this.events[key].clear();
8075    }
8076    for (const key in this.features) {
8077      const feature = this.features[key];
8078      if (feature) {
8079        feature.unmount();
8080        feature.isMounted = false;
8081      }
8082    }
8083    this.current = null;
8084  }
8085  bindToMotionValue(key, value) {
8086    if (this.valueSubscriptions.has(key)) {
8087      this.valueSubscriptions.get(key)();
8088    }
8089    const valueIsTransform = transformProps.has(key);
8090    const removeOnChange = value.on("change", (latestValue) => {
8091      this.latestValues[key] = latestValue;
8092      this.props.onUpdate && frame.preRender(this.notifyUpdate);
8093      if (valueIsTransform && this.projection) {
8094        this.projection.isTransformDirty = true;
8095      }
8096    });
8097    const removeOnRenderRequest = value.on("renderRequest", this.scheduleRender);
8098    let removeSyncCheck;
8099    if (window.MotionCheckAppearSync) {
8100      removeSyncCheck = window.MotionCheckAppearSync(this, key, value);
8101    }
8102    this.valueSubscriptions.set(key, () => {
8103      removeOnChange();
8104      removeOnRenderRequest();
8105      if (removeSyncCheck)
8106        removeSyncCheck();
8107      if (value.owner)
8108        value.stop();
8109    });
8110  }
8111  sortNodePosition(other) {
8112    if (!this.current || !this.sortInstanceNodePosition || this.type !== other.type) {
8113      return 0;
8114    }
8115    return this.sortInstanceNodePosition(this.current, other.current);
8116  }
8117  updateFeatures() {
8118    let key = "animation";
8119    for (key in featureDefinitions) {
8120      const featureDefinition = featureDefinitions[key];
8121      if (!featureDefinition)
8122        continue;
8123      const { isEnabled, Feature: FeatureConstructor } = featureDefinition;
8124      if (!this.features[key] && FeatureConstructor && isEnabled(this.props)) {
8125        this.features[key] = new FeatureConstructor(this);
8126      }
8127      if (this.features[key]) {
8128        const feature = this.features[key];
8129        if (feature.isMounted) {
8130          feature.update();
8131        } else {
8132          feature.mount();
8133          feature.isMounted = true;
8134        }
8135      }
8136    }
8137  }
8138  triggerBuild() {
8139    this.build(this.renderState, this.latestValues, this.props);
8140  }
8141  /**
8142   * Measure the current viewport box with or without transforms.
8143   * Only measures axis-aligned boxes, rotate and skew must be manually
8144   * removed with a re-render to work.
8145   */
8146  measureViewportBox() {
8147    return this.current ? this.measureInstanceViewportBox(this.current, this.props) : createBox();
8148  }
8149  getStaticValue(key) {
8150    return this.latestValues[key];
8151  }
8152  setStaticValue(key, value) {
8153    this.latestValues[key] = value;
8154  }
8155  /**
8156   * Update the provided props. Ensure any newly-added motion values are
8157   * added to our map, old ones removed, and listeners updated.
8158   */
8159  update(props, presenceContext) {
8160    if (props.transformTemplate || this.props.transformTemplate) {
8161      this.scheduleRender();
8162    }
8163    this.prevProps = this.props;
8164    this.props = props;
8165    this.prevPresenceContext = this.presenceContext;
8166    this.presenceContext = presenceContext;
8167    for (let i = 0; i < propEventHandlers.length; i++) {
8168      const key = propEventHandlers[i];
8169      if (this.propEventSubscriptions[key]) {
8170        this.propEventSubscriptions[key]();
8171        delete this.propEventSubscriptions[key];
8172      }
8173      const listenerName = "on" + key;
8174      const listener = props[listenerName];
8175      if (listener) {
8176        this.propEventSubscriptions[key] = this.on(key, listener);
8177      }
8178    }
8179    this.prevMotionValues = updateMotionValuesFromProps(this, this.scrapeMotionValuesFromProps(props, this.prevProps, this), this.prevMotionValues);
8180    if (this.handleChildMotionValue) {
8181      this.handleChildMotionValue();
8182    }
8183    this.onUpdate && this.onUpdate(this);
8184  }
8185  getProps() {
8186    return this.props;
8187  }
8188  /**
8189   * Returns the variant definition with a given name.
8190   */
8191  getVariant(name) {
8192    return this.props.variants ? this.props.variants[name] : void 0;
8193  }
8194  /**
8195   * Returns the defined default transition on this component.
8196   */
8197  getDefaultTransition() {
8198    return this.props.transition;
8199  }
8200  getTransformPagePoint() {
8201    return this.props.transformPagePoint;
8202  }
8203  getClosestVariantNode() {
8204    return this.isVariantNode ? this : this.parent ? this.parent.getClosestVariantNode() : void 0;
8205  }
8206  /**
8207   * Add a child visual element to our set of children.
8208   */
8209  addVariantChild(child) {
8210    const closestVariantNode = this.getClosestVariantNode();
8211    if (closestVariantNode) {
8212      closestVariantNode.variantChildren && closestVariantNode.variantChildren.add(child);
8213      return () => closestVariantNode.variantChildren.delete(child);
8214    }
8215  }
8216  /**
8217   * Add a motion value and bind it to this visual element.
8218   */
8219  addValue(key, value) {
vendor: 5,644 bytes, lines 8220-8384
8220    const existingValue = this.values.get(key);
8221    if (value !== existingValue) {
8222      if (existingValue)
8223        this.removeValue(key);
8224      this.bindToMotionValue(key, value);
8225      this.values.set(key, value);
8226      this.latestValues[key] = value.get();
8227    }
8228  }
8229  /**
8230   * Remove a motion value and unbind any active subscriptions.
8231   */
8232  removeValue(key) {
8233    this.values.delete(key);
8234    const unsubscribe = this.valueSubscriptions.get(key);
8235    if (unsubscribe) {
8236      unsubscribe();
8237      this.valueSubscriptions.delete(key);
8238    }
8239    delete this.latestValues[key];
8240    this.removeValueFromRenderState(key, this.renderState);
8241  }
8242  /**
8243   * Check whether we have a motion value for this key
8244   */
8245  hasValue(key) {
8246    return this.values.has(key);
8247  }
8248  getValue(key, defaultValue) {
8249    if (this.props.values && this.props.values[key]) {
8250      return this.props.values[key];
8251    }
8252    let value = this.values.get(key);
8253    if (value === void 0 && defaultValue !== void 0) {
8254      value = motionValue(defaultValue === null ? void 0 : defaultValue, { owner: this });
8255      this.addValue(key, value);
8256    }
8257    return value;
8258  }
8259  /**
8260   * If we're trying to animate to a previously unencountered value,
8261   * we need to check for it in our state and as a last resort read it
8262   * directly from the instance (which might have performance implications).
8263   */
8264  readValue(key, target) {
8265    var _a;
8266    let value = this.latestValues[key] !== void 0 || !this.current ? this.latestValues[key] : (_a = this.getBaseTargetFromProps(this.props, key)) !== null && _a !== void 0 ? _a : this.readValueFromInstance(this.current, key, this.options);
8267    if (value !== void 0 && value !== null) {
8268      if (typeof value === "string" && (isNumericalString(value) || isZeroValueString(value))) {
8269        value = parseFloat(value);
8270      } else if (!findValueType(value) && complex.test(target)) {
8271        value = getAnimatableNone2(key, target);
8272      }
8273      this.setBaseTarget(key, isMotionValue(value) ? value.get() : value);
8274    }
8275    return isMotionValue(value) ? value.get() : value;
8276  }
8277  /**
8278   * Set the base target to later animate back to. This is currently
8279   * only hydrated on creation and when we first read a value.
8280   */
8281  setBaseTarget(key, value) {
8282    this.baseTarget[key] = value;
8283  }
8284  /**
8285   * Find the base target for a value thats been removed from all animation
8286   * props.
8287   */
8288  getBaseTarget(key) {
8289    var _a;
8290    const { initial } = this.props;
8291    let valueFromInitial;
8292    if (typeof initial === "string" || typeof initial === "object") {
8293      const variant = resolveVariantFromProps(this.props, initial, (_a = this.presenceContext) === null || _a === void 0 ? void 0 : _a.custom);
8294      if (variant) {
8295        valueFromInitial = variant[key];
8296      }
8297    }
8298    if (initial && valueFromInitial !== void 0) {
8299      return valueFromInitial;
8300    }
8301    const target = this.getBaseTargetFromProps(this.props, key);
8302    if (target !== void 0 && !isMotionValue(target))
8303      return target;
8304    return this.initialValues[key] !== void 0 && valueFromInitial === void 0 ? void 0 : this.baseTarget[key];
8305  }
8306  on(eventName, callback) {
8307    if (!this.events[eventName]) {
8308      this.events[eventName] = new SubscriptionManager();
8309    }
8310    return this.events[eventName].add(callback);
8311  }
8312  notify(eventName, ...args) {
8313    if (this.events[eventName]) {
8314      this.events[eventName].notify(...args);
8315    }
8316  }
8317};
8318var DOMVisualElement = class extends VisualElement {
8319  constructor() {
8320    super(...arguments);
8321    this.KeyframeResolver = DOMKeyframesResolver;
8322  }
8323  sortInstanceNodePosition(a, b) {
8324    return a.compareDocumentPosition(b) & 2 ? 1 : -1;
8325  }
8326  getBaseTargetFromProps(props, key) {
8327    return props.style ? props.style[key] : void 0;
8328  }
8329  removeValueFromRenderState(key, { vars, style }) {
8330    delete vars[key];
8331    delete style[key];
8332  }
8333  handleChildMotionValue() {
8334    if (this.childSubscription) {
8335      this.childSubscription();
8336      delete this.childSubscription;
8337    }
8338    const { children } = this.props;
8339    if (isMotionValue(children)) {
8340      this.childSubscription = children.on("change", (latest) => {
8341        if (this.current) {
8342          this.current.textContent = `${latest}`;
8343        }
8344      });
8345    }
8346  }
8347};
8348function getComputedStyle2(element) {
8349  return window.getComputedStyle(element);
8350}
8351var HTMLVisualElement = class extends DOMVisualElement {
8352  constructor() {
8353    super(...arguments);
8354    this.type = "html";
8355    this.renderInstance = renderHTML;
8356  }
8357  readValueFromInstance(instance, key) {
8358    if (transformProps.has(key)) {
8359      const defaultType = getDefaultValueType(key);
8360      return defaultType ? defaultType.default || 0 : 0;
8361    } else {
8362      const computedStyle = getComputedStyle2(instance);
8363      const value = (isCSSVariableName(key) ? computedStyle.getPropertyValue(key) : computedStyle[key]) || 0;
8364      return typeof value === "string" ? value.trim() : value;
8365    }
8366  }
8367  measureInstanceViewportBox(instance, { transformPagePoint }) {
8368    return measureViewportBox(instance, transformPagePoint);
8369  }
8370  build(renderState, latestValues, props) {
8371    buildHTMLStyles(renderState, latestValues, props.transformTemplate);
8372  }
8373  scrapeMotionValuesFromProps(props, prevProps, visualElement) {
8374    return scrapeMotionValuesFromProps(props, prevProps, visualElement);
8375  }
8376};
8377var import_dist799 = __toESM(require_dist(), 1);
8378var import_dist800 = __toESM(require_dist2(), 1);
8379var import_dist801 = __toESM(require_dist3(), 1);
8380var SVGVisualElement = class extends DOMVisualElement {
8381  constructor() {
8382    super(...arguments);
8383    this.type = "svg";
8384    this.isSVGTag = false;
8385    this.measureInstanceViewportBox = createBox;
8386  }
8387  getBaseTargetFromProps(props, key) {
8388    return props[key];
8389  }
8390  readValueFromInstance(instance, key) {
8391    if (transformProps.has(key)) {
8392      const defaultType = getDefaultValueType(key);
8393      return defaultType ? defaultType.default || 0 : 0;
8394    }
8395    key = !camelCaseAttributes.has(key) ? camelToDash(key) : key;
8396    return instance.getAttribute(key);
8397  }
8398  scrapeMotionValuesFromProps(props, prevProps, visualElement) {
8399    return scrapeMotionValuesFromProps2(props, prevProps, visualElement);
8400  }
8401  build(renderState, latestValues, props) {
8402    buildSVGAttrs(renderState, latestValues, this.isSVGTag, props.transformTemplate);
8403  }
8404  renderInstance(instance, renderState, styleProp, projection) {
8405    renderSVG(instance, renderState, styleProp, projection);
8406  }
8407  mount(instance) {
8408    this.isSVGTag = isSVGTag(instance.tagName);
8409    super.mount(instance);
8410  }
8411};
8412var createDomVisualElement = (Component3, options) => {
8413  return isSVGComponent(Component3) ? new SVGVisualElement(options) : new HTMLVisualElement(options, {
8414    allowProjection: Component3 !== import_react29.Fragment
8415  });
8416};
8417var createMotionComponent = createMotionComponentFactory({
8418  ...animations,
8419  ...gestureAnimations,
8420  ...drag,
8421  ...layout
8422}, createDomVisualElement);
8423var motion = createDOMMotionComponentProxy(createMotionComponent);
8424var import_dist811 = __toESM(require_dist(), 1);
8425var import_dist812 = __toESM(require_dist2(), 1);
8426var import_dist813 = __toESM(require_dist3(), 1);
8427var domAnimation = {
8428  renderer: createDomVisualElement,
8429  ...animations,
8430  ...gestureAnimations
8431};
8432var import_dist814 = __toESM(require_dist(), 1);
8433var import_dist815 = __toESM(require_dist2(), 1);
8434var import_dist816 = __toESM(require_dist3(), 1);
8435var domMax = {
8436  ...domAnimation,
8437  ...drag,
8438  ...layout
8439};
8440var import_dist817 = __toESM(require_dist(), 1);
8441var import_dist818 = __toESM(require_dist2(), 1);
8442var import_dist819 = __toESM(require_dist3(), 1);
8443var domMin = {
8444  renderer: createDomVisualElement,
8445  ...animations
8446};
8447var import_dist820 = __toESM(require_dist(), 1);
8448var import_dist821 = __toESM(require_dist2(), 1);
8449var import_dist822 = __toESM(require_dist3(), 1);
8450var import_react30 = __toESM(require_react(), 1);
8451function useMotionValueEvent(value, event, callback) {
8452  (0, import_react30.useInsertionEffect)(() => value.on(event, callback), [value, event, callback]);
8453}
8454var import_dist865 = __toESM(require_dist(), 1);
8455var import_dist866 = __toESM(require_dist2(), 1);
8456var import_dist867 = __toESM(require_dist3(), 1);
8457var import_dist862 = __toESM(require_dist(), 1);
8458var import_dist863 = __toESM(require_dist2(), 1);
8459var import_dist864 = __toESM(require_dist3(), 1);
8460var import_react31 = __toESM(require_react(), 1);
8461var import_dist859 = __toESM(require_dist(), 1);
8462var import_dist860 = __toESM(require_dist2(), 1);
8463var import_dist861 = __toESM(require_dist3(), 1);
8464var import_dist823 = __toESM(require_dist(), 1);
8465var import_dist824 = __toESM(require_dist2(), 1);
8466var import_dist825 = __toESM(require_dist3(), 1);
8467function observeTimeline(update, timeline) {
8468  let prevProgress;
8469  const onFrame = () => {
8470    const { currentTime } = timeline;
8471    const percentage = currentTime === null ? 0 : currentTime.value;
8472    const progress2 = percentage / 100;
8473    if (prevProgress !== progress2) {
8474      update(progress2);
8475    }
8476    prevProgress = progress2;
8477  };
8478  frame.update(onFrame, true);
8479  return () => cancelFrame(onFrame);
8480}
8481var import_dist856 = __toESM(require_dist(), 1);
8482var import_dist857 = __toESM(require_dist2(), 1);
8483var import_dist858 = __toESM(require_dist3(), 1);
8484var import_dist832 = __toESM(require_dist(), 1);
8485var import_dist833 = __toESM(require_dist2(), 1);
8486var import_dist834 = __toESM(require_dist3(), 1);
8487var import_dist826 = __toESM(require_dist(), 1);
8488var import_dist827 = __toESM(require_dist2(), 1);
8489var import_dist828 = __toESM(require_dist3(), 1);
8490var resizeHandlers = /* @__PURE__ */ new WeakMap();
8491var observer;
8492function getElementSize(target, borderBoxSize) {
8493  if (borderBoxSize) {
8494    const { inlineSize, blockSize } = borderBoxSize[0];
8495    return { width: inlineSize, height: blockSize };
8496  } else if (target instanceof SVGElement && "getBBox" in target) {
8497    return target.getBBox();
8498  } else {
8499    return {
8500      width: target.offsetWidth,
8501      height: target.offsetHeight
8502    };
8503  }
8504}
8505function notifyTarget({ target, contentRect, borderBoxSize }) {
8506  var _a;
8507  (_a = resizeHandlers.get(target)) === null || _a === void 0 ? void 0 : _a.forEach((handler) => {
8508    handler({
8509      target,
8510      contentSize: contentRect,
8511      get size() {
8512        return getElementSize(target, borderBoxSize);
8513      }
8514    });
8515  });
8516}
8517function notifyAll(entries) {
8518  entries.forEach(notifyTarget);
8519}
8520function createResizeObserver() {
8521  if (typeof ResizeObserver === "undefined")
8522    return;
8523  observer = new ResizeObserver(notifyAll);
8524}
8525function resizeElement(target, handler) {
8526  if (!observer)
8527    createResizeObserver();
8528  const elements = resolveElements(target);
8529  elements.forEach((element) => {
8530    let elementHandlers = resizeHandlers.get(element);
8531    if (!elementHandlers) {
8532      elementHandlers = /* @__PURE__ */ new Set();
8533      resizeHandlers.set(element, elementHandlers);
8534    }
8535    elementHandlers.add(handler);
8536    observer === null || observer === void 0 ? void 0 : observer.observe(element);
8537  });
8538  return () => {
8539    elements.forEach((element) => {
8540      const elementHandlers = resizeHandlers.get(element);
8541      elementHandlers === null || elementHandlers === void 0 ? void 0 : elementHandlers.delete(handler);
8542      if (!(elementHandlers === null || elementHandlers === void 0 ? void 0 : elementHandlers.size)) {
8543        observer === null || observer === void 0 ? void 0 : observer.unobserve(element);
8544      }
8545    });
8546  };
8547}
8548var import_dist829 = __toESM(require_dist(), 1);
8549var import_dist830 = __toESM(require_dist2(), 1);
8550var import_dist831 = __toESM(require_dist3(), 1);
8551var windowCallbacks = /* @__PURE__ */ new Set();
8552var windowResizeHandler;
8553function createWindowResizeHandler() {
8554  windowResizeHandler = () => {
8555    const size = {
8556      width: window.innerWidth,
8557      height: window.innerHeight
8558    };
8559    const info = {
8560      target: window,
8561      size,
8562      contentSize: size
8563    };
8564    windowCallbacks.forEach((callback) => callback(info));
8565  };
8566  window.addEventListener("resize", windowResizeHandler);
8567}
8568function resizeWindow(callback) {
8569  windowCallbacks.add(callback);
8570  if (!windowResizeHandler)
8571    createWindowResizeHandler();
8572  return () => {
8573    windowCallbacks.delete(callback);
8574    if (!windowCallbacks.size && windowResizeHandler) {
8575      windowResizeHandler = void 0;
8576    }
8577  };
8578}
8579function resize(a, b) {
8580  return typeof a === "function" ? resizeWindow(a) : resizeElement(a, b);
8581}
8582var import_dist835 = __toESM(require_dist(), 1);
8583var import_dist836 = __toESM(require_dist2(), 1);
8584var import_dist837 = __toESM(require_dist3(), 1);
8585var maxElapsed2 = 50;
8586var createAxisInfo = () => ({
8587  current: 0,
8588  offset: [],
8589  progress: 0,
8590  scrollLength: 0,
8591  targetOffset: 0,
8592  targetLength: 0,
8593  containerLength: 0,
8594  velocity: 0
8595});
8596var createScrollInfo = () => ({
8597  time: 0,
8598  x: createAxisInfo(),
8599  y: createAxisInfo()
8600});
8601var keys = {
8602  x: {
8603    length: "Width",
8604    position: "Left"
8605  },
8606  y: {
8607    length: "Height",
8608    position: "Top"
8609  }
8610};
8611function updateAxisInfo(element, axisName, info, time2) {
8612  const axis = info[axisName];
8613  const { length, position } = keys[axisName];
8614  const prev = axis.current;
8615  const prevTime = info.time;
8616  axis.current = element[`scroll${position}`];
8617  axis.scrollLength = element[`scroll${length}`] - element[`client${length}`];
8618  axis.offset.length = 0;
8619  axis.offset[0] = 0;
8620  axis.offset[1] = axis.scrollLength;
8621  axis.progress = progress(0, axis.scrollLength, axis.current);
8622  const elapsed = time2 - prevTime;
8623  axis.velocity = elapsed > maxElapsed2 ? 0 : velocityPerSecond(axis.current - prev, elapsed);
8624}
8625function updateScrollInfo(element, info, time2) {
8626  updateAxisInfo(element, "x", info, time2);
8627  updateAxisInfo(element, "y", info, time2);
8628  info.time = time2;
8629}
8630var import_dist853 = __toESM(require_dist(), 1);
8631var import_dist854 = __toESM(require_dist2(), 1);
8632var import_dist855 = __toESM(require_dist3(), 1);
8633var import_dist850 = __toESM(require_dist(), 1);
8634var import_dist851 = __toESM(require_dist2(), 1);
8635var import_dist852 = __toESM(require_dist3(), 1);
8636var import_dist838 = __toESM(require_dist(), 1);
8637var import_dist839 = __toESM(require_dist2(), 1);
8638var import_dist840 = __toESM(require_dist3(), 1);
8639function calcInset(element, container) {
8640  const inset = { x: 0, y: 0 };
8641  let current = element;
8642  while (current && current !== container) {
8643    if (current instanceof HTMLElement) {
8644      inset.x += current.offsetLeft;
8645      inset.y += current.offsetTop;
8646      current = current.offsetParent;
8647    } else if (current.tagName === "svg") {
8648      const svgBoundingBox = current.getBoundingClientRect();
8649      current = current.parentElement;
8650      const parentBoundingBox = current.getBoundingClientRect();
8651      inset.x += svgBoundingBox.left - parentBoundingBox.left;
8652      inset.y += svgBoundingBox.top - parentBoundingBox.top;
8653    } else if (current instanceof SVGGraphicsElement) {
8654      const { x, y } = current.getBBox();
8655      inset.x += x;
8656      inset.y += y;
8657      let svg = null;
8658      let parent = current.parentNode;
8659      while (!svg) {
8660        if (parent.tagName === "svg") {
8661          svg = parent;
8662        }
8663        parent = current.parentNode;
8664      }
8665      current = svg;
8666    } else {
8667      break;
8668    }
8669  }
8670  return inset;
8671}
8672var import_dist844 = __toESM(require_dist(), 1);
8673var import_dist845 = __toESM(require_dist2(), 1);
8674var import_dist846 = __toESM(require_dist3(), 1);
8675var import_dist841 = __toESM(require_dist(), 1);
8676var import_dist842 = __toESM(require_dist2(), 1);
8677var import_dist843 = __toESM(require_dist3(), 1);
8678var namedEdges = {
8679  start: 0,
8680  center: 0.5,
8681  end: 1
8682};
8683function resolveEdge(edge, length, inset = 0) {
8684  let delta = 0;
8685  if (edge in namedEdges) {
8686    edge = namedEdges[edge];
8687  }
8688  if (typeof edge === "string") {
8689    const asNumber2 = parseFloat(edge);
8690    if (edge.endsWith("px")) {
8691      delta = asNumber2;
8692    } else if (edge.endsWith("%")) {
8693      edge = asNumber2 / 100;
8694    } else if (edge.endsWith("vw")) {
8695      delta = asNumber2 / 100 * document.documentElement.clientWidth;
8696    } else if (edge.endsWith("vh")) {
8697      delta = asNumber2 / 100 * document.documentElement.clientHeight;
8698    } else {
8699      edge = asNumber2;
8700    }
8701  }
8702  if (typeof edge === "number") {
8703    delta = length * edge;
8704  }
8705  return inset + delta;
8706}
8707var defaultOffset2 = [0, 0];
8708function resolveOffset(offset, containerLength, targetLength, targetInset) {
8709  let offsetDefinition = Array.isArray(offset) ? offset : defaultOffset2;
8710  let targetPoint = 0;
8711  let containerPoint = 0;
8712  if (typeof offset === "number") {
8713    offsetDefinition = [offset, offset];
8714  } else if (typeof offset === "string") {
8715    offset = offset.trim();
8716    if (offset.includes(" ")) {
8717      offsetDefinition = offset.split(" ");
8718    } else {
8719      offsetDefinition = [offset, namedEdges[offset] ? offset : `0`];
8720    }
8721  }
8722  targetPoint = resolveEdge(offsetDefinition[0], targetLength, targetInset);
8723  containerPoint = resolveEdge(offsetDefinition[1], containerLength);
8724  return targetPoint - containerPoint;
8725}
8726var import_dist847 = __toESM(require_dist(), 1);
8727var import_dist848 = __toESM(require_dist2(), 1);
8728var import_dist849 = __toESM(require_dist3(), 1);
8729var ScrollOffset = {
8730  Enter: [
8731    [0, 1],
8732    [1, 1]
8733  ],
8734  Exit: [
8735    [0, 0],
8736    [1, 0]
8737  ],
8738  Any: [
8739    [1, 0],
8740    [0, 1]
8741  ],
8742  All: [
8743    [0, 0],
8744    [1, 1]
8745  ]
8746};
8747var point = { x: 0, y: 0 };
8748function getTargetSize(target) {
8749  return "getBBox" in target && target.tagName !== "svg" ? target.getBBox() : { width: target.clientWidth, height: target.clientHeight };
8750}
8751function resolveOffsets(container, info, options) {
8752  const { offset: offsetDefinition = ScrollOffset.All } = options;
8753  const { target = container, axis = "y" } = options;
8754  const lengthLabel = axis === "y" ? "height" : "width";
8755  const inset = target !== container ? calcInset(target, container) : point;
8756  const targetSize = target === container ? { width: container.scrollWidth, height: container.scrollHeight } : getTargetSize(target);
8757  const containerSize = {
8758    width: container.clientWidth,
8759    height: container.clientHeight
8760  };
8761  info[axis].offset.length = 0;
8762  let hasChanged = !info[axis].interpolate;
8763  const numOffsets = offsetDefinition.length;
8764  for (let i = 0; i < numOffsets; i++) {
8765    const offset = resolveOffset(offsetDefinition[i], containerSize[lengthLabel], targetSize[lengthLabel], inset[axis]);
8766    if (!hasChanged && offset !== info[axis].interpolatorOffsets[i]) {
8767      hasChanged = true;
8768    }
8769    info[axis].offset[i] = offset;
8770  }
8771  if (hasChanged) {
8772    info[axis].interpolate = interpolate(info[axis].offset, defaultOffset(offsetDefinition), { clamp: false });
8773    info[axis].interpolatorOffsets = [...info[axis].offset];
8774  }
8775  info[axis].progress = clamp(0, 1, info[axis].interpolate(info[axis].current));
8776}
8777function measure(container, target = container, info) {
8778  info.x.targetOffset = 0;
8779  info.y.targetOffset = 0;
8780  if (target !== container) {
8781    let node = target;
8782    while (node && node !== container) {
8783      info.x.targetOffset += node.offsetLeft;
8784      info.y.targetOffset += node.offsetTop;
8785      node = node.offsetParent;
8786    }
8787  }
8788  info.x.targetLength = target === container ? target.scrollWidth : target.clientWidth;
8789  info.y.targetLength = target === container ? target.scrollHeight : target.clientHeight;
8790  info.x.containerLength = container.clientWidth;
8791  info.y.containerLength = container.clientHeight;
8792  if (true) {
8793    if (container && target && target !== container) {
8794      warnOnce(getComputedStyle(container).position !== "static", "Please ensure that the container has a non-static position, like 'relative', 'fixed', or 'absolute' to ensure scroll offset is calculated correctly.");
8795    }
8796  }
8797}
8798function createOnScrollHandler(element, onScroll, info, options = {}) {
8799  return {
8800    measure: () => measure(element, options.target, info),
8801    update: (time2) => {
8802      updateScrollInfo(element, info, time2);
8803      if (options.offset || options.target) {
8804        resolveOffsets(element, info, options);
8805      }
8806    },
8807    notify: () => onScroll(info)
8808  };
8809}
8810var scrollListeners = /* @__PURE__ */ new WeakMap();
8811var resizeListeners = /* @__PURE__ */ new WeakMap();
8812var onScrollHandlers = /* @__PURE__ */ new WeakMap();
8813var getEventTarget = (element) => element === document.documentElement ? window : element;
8814function scrollInfo(onScroll, { container = document.documentElement, ...options } = {}) {
8815  let containerHandlers = onScrollHandlers.get(container);
8816  if (!containerHandlers) {
8817    containerHandlers = /* @__PURE__ */ new Set();
8818    onScrollHandlers.set(container, containerHandlers);
8819  }
8820  const info = createScrollInfo();
8821  const containerHandler = createOnScrollHandler(container, onScroll, info, options);
8822  containerHandlers.add(containerHandler);
8823  if (!scrollListeners.has(container)) {
8824    const measureAll = () => {
8825      for (const handler of containerHandlers)
8826        handler.measure();
8827    };
8828    const updateAll = () => {
8829      for (const handler of containerHandlers) {
8830        handler.update(frameData.timestamp);
8831      }
8832    };
8833    const notifyAll2 = () => {
8834      for (const handler of containerHandlers)
8835        handler.notify();
8836    };
8837    const listener2 = () => {
8838      frame.read(measureAll, false, true);
8839      frame.read(updateAll, false, true);
8840      frame.update(notifyAll2, false, true);
8841    };
8842    scrollListeners.set(container, listener2);
8843    const target = getEventTarget(container);
8844    window.addEventListener("resize", listener2, { passive: true });
8845    if (container !== document.documentElement) {
8846      resizeListeners.set(container, resize(container, listener2));
8847    }
8848    target.addEventListener("scroll", listener2, { passive: true });
8849  }
8850  const listener = scrollListeners.get(container);
8851  frame.read(listener, false, true);
8852  return () => {
8853    var _a;
8854    cancelFrame(listener);
8855    const currentHandlers = onScrollHandlers.get(container);
8856    if (!currentHandlers)
8857      return;
8858    currentHandlers.delete(containerHandler);
8859    if (currentHandlers.size)
8860      return;
8861    const scrollListener = scrollListeners.get(container);
8862    scrollListeners.delete(container);
8863    if (scrollListener) {
8864      getEventTarget(container).removeEventListener("scroll", scrollListener);
8865      (_a = resizeListeners.get(container)) === null || _a === void 0 ? void 0 : _a();
8866      window.removeEventListener("resize", scrollListener);
8867    }
8868  };
8869}
8870function scrollTimelineFallback({ source, container, axis = "y" }) {
8871  if (source)
8872    container = source;
8873  const currentTime = { value: 0 };
8874  const cancel = scrollInfo((info) => {
8875    currentTime.value = info[axis].progress * 100;
8876  }, { container, axis });
8877  return { currentTime, cancel };
8878}
8879var timelineCache = /* @__PURE__ */ new Map();
8880function getTimeline({ source, container = document.documentElement, axis = "y" } = {}) {
8881  if (source)
8882    container = source;
8883  if (!timelineCache.has(container)) {
8884    timelineCache.set(container, {});
8885  }
8886  const elementCache = timelineCache.get(container);
8887  if (!elementCache[axis]) {
8888    elementCache[axis] = supportsScrollTimeline() ? new ScrollTimeline({ source: container, axis }) : scrollTimelineFallback({ source: container, axis });
8889  }
8890  return elementCache[axis];
8891}
8892function isOnScrollWithInfo(onScroll) {
8893  return onScroll.length === 2;
8894}
8895function needsElementTracking(options) {
8896  return options && (options.target || options.offset);
8897}
8898function scrollFunction(onScroll, options) {
8899  if (isOnScrollWithInfo(onScroll) || needsElementTracking(options)) {
8900    return scrollInfo((info) => {
8901      onScroll(info[options.axis].progress, info);
8902    }, options);
8903  } else {
8904    return observeTimeline(onScroll, getTimeline(options));
8905  }
8906}
8907function scrollAnimation(animation, options) {
8908  animation.flatten();
8909  if (needsElementTracking(options)) {
8910    animation.pause();
8911    return scrollInfo((info) => {
8912      animation.time = animation.duration * info[options.axis].progress;
8913    }, options);
8914  } else {
8915    const timeline = getTimeline(options);
8916    if (animation.attachTimeline) {
8917      return animation.attachTimeline(timeline, (valueAnimation) => {
8918        valueAnimation.pause();
8919        return observeTimeline((progress2) => {
8920          valueAnimation.time = valueAnimation.duration * progress2;
8921        }, timeline);
8922      });
8923    } else {
8924      return noop;
8925    }
8926  }
8927}
8928function scroll(onScroll, { axis = "y", ...options } = {}) {
8929  const optionsWithDefaults = { axis, ...options };
8930  return typeof onScroll === "function" ? scrollFunction(onScroll, optionsWithDefaults) : scrollAnimation(onScroll, optionsWithDefaults);
8931}
8932function refWarning(name, ref) {
8933  warning(Boolean(!ref || ref.current), `You have defined a ${name} options but the provided ref is not yet hydrated, probably because it's defined higher up the tree. Try calling useScroll() in the same component as the ref, or setting its \`layoutEffect: false\` option.`);
8934}
8935var createScrollMotionValues = () => ({
8936  scrollX: motionValue(0),
8937  scrollY: motionValue(0),
8938  scrollXProgress: motionValue(0),
8939  scrollYProgress: motionValue(0)
8940});
8941function useScroll({ container, target, layoutEffect = true, ...options } = {}) {
8942  const values = useConstant(createScrollMotionValues);
8943  const useLifecycleEffect = layoutEffect ? useIsomorphicLayoutEffect : import_react31.useEffect;
8944  useLifecycleEffect(() => {
8945    refWarning("target", target);
8946    refWarning("container", container);
8947    return scroll((_progress, { x, y }) => {
8948      values.scrollX.set(x.current);
8949      values.scrollXProgress.set(x.progress);
8950      values.scrollY.set(y.current);
8951      values.scrollYProgress.set(y.progress);
8952    }, {
8953      ...options,
8954      container: (container === null || container === void 0 ? void 0 : container.current) || void 0,
8955      target: (target === null || target === void 0 ? void 0 : target.current) || void 0
8956    });
8957  }, [container, target, JSON.stringify(options.offset)]);
8958  return values;
8959}
8960function useElementScroll(ref) {
8961  if (true) {
8962    warnOnce(false, "useElementScroll is deprecated. Convert to useScroll({ container: ref }).");
8963  }
8964  return useScroll({ container: ref });
8965}
8966var import_dist868 = __toESM(require_dist(), 1);
8967var import_dist869 = __toESM(require_dist2(), 1);
8968var import_dist870 = __toESM(require_dist3(), 1);
8969function useViewportScroll() {
8970  if (true) {
8971    warnOnce(false, "useViewportScroll is deprecated. Convert to useScroll().");
8972  }
8973  return useScroll();
8974}
8975var import_dist877 = __toESM(require_dist(), 1);
8976var import_dist878 = __toESM(require_dist2(), 1);
8977var import_dist879 = __toESM(require_dist3(), 1);
8978var import_dist874 = __toESM(require_dist(), 1);
8979var import_dist875 = __toESM(require_dist2(), 1);
8980var import_dist876 = __toESM(require_dist3(), 1);
8981var import_dist871 = __toESM(require_dist(), 1);
8982var import_dist872 = __toESM(require_dist2(), 1);
8983var import_dist873 = __toESM(require_dist3(), 1);
8984var import_react32 = __toESM(require_react(), 1);
8985function useMotionValue(initial) {
8986  const value = useConstant(() => motionValue(initial));
8987  const { isStatic } = (0, import_react32.useContext)(MotionConfigContext);
8988  if (isStatic) {
8989    const [, setLatest] = (0, import_react32.useState)(initial);
8990    (0, import_react32.useEffect)(() => value.on("change", setLatest), []);
8991  }
8992  return value;
8993}
8994function useCombineMotionValues(values, combineValues) {
8995  const value = useMotionValue(combineValues());
8996  const updateValue = () => value.set(combineValues());
8997  updateValue();
8998  useIsomorphicLayoutEffect(() => {
8999    const scheduleUpdate = () => frame.preRender(updateValue, false, true);
9000    const subscriptions = values.map((v) => v.on("change", scheduleUpdate));
9001    return () => {
9002      subscriptions.forEach((unsubscribe) => unsubscribe());
9003      cancelFrame(updateValue);
9004    };
9005  });
9006  return value;
9007}
9008function useMotionTemplate(fragments, ...values) {
9009  const numFragments = fragments.length;
9010  function buildValue() {
9011    let output = ``;
9012    for (let i = 0; i < numFragments; i++) {
9013      output += fragments[i];
9014      const value = values[i];
9015      if (value) {
9016        output += isMotionValue(value) ? value.get() : value;
9017      }
9018    }
9019    return output;
9020  }
9021  return useCombineMotionValues(values.filter(isMotionValue), buildValue);
9022}
9023var import_dist880 = __toESM(require_dist(), 1);
9024var import_dist881 = __toESM(require_dist2(), 1);
9025var import_dist882 = __toESM(require_dist3(), 1);
9026var import_react33 = __toESM(require_react(), 1);
9027function toNumber(v) {
9028  if (typeof v === "number")
9029    return v;
9030  return parseFloat(v);
9031}
9032function useSpring(source, config = {}) {
9033  const { isStatic } = (0, import_react33.useContext)(MotionConfigContext);
9034  const activeSpringAnimation = (0, import_react33.useRef)(null);
9035  const value = useMotionValue(isMotionValue(source) ? toNumber(source.get()) : source);
9036  const latestValue = (0, import_react33.useRef)(value.get());
9037  const latestSetter = (0, import_react33.useRef)(() => {
9038  });
9039  const startAnimation = () => {
9040    const animation = activeSpringAnimation.current;
9041    if (animation && animation.time === 0) {
9042      animation.sample(frameData.delta);
9043    }
9044    stopAnimation2();
9045    activeSpringAnimation.current = animateValue({
9046      keyframes: [value.get(), latestValue.current],
9047      velocity: value.getVelocity(),
9048      type: "spring",
9049      restDelta: 1e-3,
9050      restSpeed: 0.01,
9051      ...config,
9052      onUpdate: latestSetter.current
9053    });
9054  };
9055  const stopAnimation2 = () => {
9056    if (activeSpringAnimation.current) {
9057      activeSpringAnimation.current.stop();
9058    }
9059  };
9060  (0, import_react33.useInsertionEffect)(() => {
9061    return value.attach((v, set) => {
9062      if (isStatic)
9063        return set(v);
9064      latestValue.current = v;
9065      latestSetter.current = set;
9066      frame.update(startAnimation);
9067      return value.get();
9068    }, stopAnimation2);
9069  }, [JSON.stringify(config)]);
9070  useIsomorphicLayoutEffect(() => {
9071    if (isMotionValue(source)) {
9072      return source.on("change", (v) => value.set(toNumber(v)));
9073    }
9074  }, [value]);
9075  return value;
9076}
9077var import_dist886 = __toESM(require_dist(), 1);
9078var import_dist887 = __toESM(require_dist2(), 1);
9079var import_dist888 = __toESM(require_dist3(), 1);
9080var import_dist883 = __toESM(require_dist(), 1);
9081var import_dist884 = __toESM(require_dist2(), 1);
9082var import_dist885 = __toESM(require_dist3(), 1);
9083var import_react34 = __toESM(require_react(), 1);
9084function useAnimationFrame(callback) {
9085  const initialTimestamp = (0, import_react34.useRef)(0);
9086  const { isStatic } = (0, import_react34.useContext)(MotionConfigContext);
9087  (0, import_react34.useEffect)(() => {
9088    if (isStatic)
9089      return;
9090    const provideTimeSinceStart = ({ timestamp, delta }) => {
9091      if (!initialTimestamp.current)
9092        initialTimestamp.current = timestamp;
9093      callback(timestamp - initialTimestamp.current, delta);
9094    };
9095    frame.update(provideTimeSinceStart, true);
9096    return () => cancelFrame(provideTimeSinceStart);
9097  }, [callback]);
9098}
9099function useTime() {
9100  const time2 = useMotionValue(0);
9101  useAnimationFrame((t) => time2.set(t));
9102  return time2;
9103}
9104var import_dist895 = __toESM(require_dist(), 1);
9105var import_dist896 = __toESM(require_dist2(), 1);
9106var import_dist897 = __toESM(require_dist3(), 1);
9107var import_dist889 = __toESM(require_dist(), 1);
9108var import_dist890 = __toESM(require_dist2(), 1);
9109var import_dist891 = __toESM(require_dist3(), 1);
9110var isCustomValueType = (v) => {
9111  return v && typeof v === "object" && v.mix;
9112};
9113var getMixer2 = (v) => isCustomValueType(v) ? v.mix : void 0;
9114function transform(...args) {
9115  const useImmediate = !Array.isArray(args[0]);
9116  const argOffset = useImmediate ? 0 : -1;
9117  const inputValue = args[0 + argOffset];
9118  const inputRange = args[1 + argOffset];
9119  const outputRange = args[2 + argOffset];
9120  const options = args[3 + argOffset];
9121  const interpolator = interpolate(inputRange, outputRange, {
9122    mixer: getMixer2(outputRange[0]),
9123    ...options
9124  });
9125  return useImmediate ? interpolator(inputValue) : interpolator;
9126}
9127var import_dist892 = __toESM(require_dist(), 1);
9128var import_dist893 = __toESM(require_dist2(), 1);
9129var import_dist894 = __toESM(require_dist3(), 1);
9130function useComputed(compute) {
9131  collectMotionValues.current = [];
9132  compute();
9133  const value = useCombineMotionValues(collectMotionValues.current, compute);
9134  collectMotionValues.current = void 0;
9135  return value;
9136}
9137function useTransform(input, inputRangeOrTransformer, outputRange, options) {
9138  if (typeof input === "function") {
9139    return useComputed(input);
9140  }
9141  const transformer = typeof inputRangeOrTransformer === "function" ? inputRangeOrTransformer : transform(inputRangeOrTransformer, outputRange, options);
9142  return Array.isArray(input) ? useListTransform(input, transformer) : useListTransform([input], ([latest]) => transformer(latest));
9143}
9144function useListTransform(values, transformer) {
9145  const latest = useConstant(() => []);
9146  return useCombineMotionValues(values, () => {
9147    latest.length = 0;
9148    const numValues = values.length;
9149    for (let i = 0; i < numValues; i++) {
9150      latest[i] = values[i].get();
9151    }
9152    return transformer(latest);
9153  });
9154}
9155var import_dist898 = __toESM(require_dist(), 1);
9156var import_dist899 = __toESM(require_dist2(), 1);
9157var import_dist900 = __toESM(require_dist3(), 1);
9158function useVelocity(value) {
9159  const velocity = useMotionValue(value.getVelocity());
9160  const updateVelocity = () => {
9161    const latest = value.getVelocity();
9162    velocity.set(latest);
9163    if (latest)
9164      frame.update(updateVelocity);
9165  };
9166  useMotionValueEvent(value, "change", () => {
9167    frame.update(updateVelocity, false, true);
9168  });
9169  return velocity;
9170}
9171var import_dist907 = __toESM(require_dist(), 1);
9172var import_dist908 = __toESM(require_dist2(), 1);
9173var import_dist909 = __toESM(require_dist3(), 1);
9174var import_dist904 = __toESM(require_dist(), 1);
9175var import_dist905 = __toESM(require_dist2(), 1);
9176var import_dist906 = __toESM(require_dist3(), 1);
9177var import_dist901 = __toESM(require_dist(), 1);
9178var import_dist902 = __toESM(require_dist2(), 1);
9179var import_dist903 = __toESM(require_dist3(), 1);
9180function getWillChangeName(name) {
9181  if (transformProps.has(name)) {
9182    return "transform";
9183  } else if (acceleratedValues.has(name)) {
9184    return camelToDash(name);
9185  }
9186}
9187var WillChangeMotionValue = class extends MotionValue {
9188  constructor() {
9189    super(...arguments);
9190    this.values = [];
9191  }
9192  add(name) {
9193    const styleName = getWillChangeName(name);
9194    if (styleName) {
9195      addUniqueItem(this.values, styleName);
9196      this.update();
9197    }
9198  }
9199  update() {
9200    this.set(this.values.length ? this.values.join(", ") : "auto");
9201  }
9202};
9203function useWillChange() {
9204  return useConstant(() => new WillChangeMotionValue("auto"));
9205}
9206var import_dist910 = __toESM(require_dist(), 1);
9207var import_dist911 = __toESM(require_dist2(), 1);
9208var import_dist912 = __toESM(require_dist3(), 1);
9209var import_react35 = __toESM(require_react(), 1);
9210function useReducedMotion() {
9211  !hasReducedMotionListener.current && initPrefersReducedMotion();
9212  const [shouldReduceMotion] = (0, import_react35.useState)(prefersReducedMotion.current);
9213  if (true) {
9214    warnOnce(shouldReduceMotion !== true, "You have Reduced Motion enabled on your device. Animations may not appear as expected.");
9215  }
9216  return shouldReduceMotion;
9217}
9218var import_dist913 = __toESM(require_dist(), 1);
9219var import_dist914 = __toESM(require_dist2(), 1);
9220var import_dist915 = __toESM(require_dist3(), 1);
9221var import_react36 = __toESM(require_react(), 1);
9222function useReducedMotionConfig() {
9223  const reducedMotionPreference = useReducedMotion();
9224  const { reducedMotion } = (0, import_react36.useContext)(MotionConfigContext);
9225  if (reducedMotion === "never") {
9226    return false;
9227  } else if (reducedMotion === "always") {
9228    return true;
9229  } else {
9230    return reducedMotionPreference;
9231  }
9232}
9233var import_dist916 = __toESM(require_dist(), 1);
9234var import_dist917 = __toESM(require_dist2(), 1);
9235var import_dist918 = __toESM(require_dist3(), 1);
9236function stopAnimation(visualElement) {
9237  visualElement.values.forEach((value) => value.stop());
9238}
9239function setVariants(visualElement, variantLabels) {
9240  const reversedLabels = [...variantLabels].reverse();
9241  reversedLabels.forEach((key) => {
9242    const variant = visualElement.getVariant(key);
9243    variant && setTarget(visualElement, variant);
9244    if (visualElement.variantChildren) {
9245      visualElement.variantChildren.forEach((child) => {
9246        setVariants(child, variantLabels);
9247      });
9248    }
9249  });
9250}
9251function setValues(visualElement, definition) {
9252  if (Array.isArray(definition)) {
9253    return setVariants(visualElement, definition);
9254  } else if (typeof definition === "string") {
9255    return setVariants(visualElement, [definition]);
9256  } else {
9257    setTarget(visualElement, definition);
9258  }
9259}
9260function animationControls() {
9261  let hasMounted = false;
9262  const subscribers = /* @__PURE__ */ new Set();
9263  const controls = {
9264    subscribe(visualElement) {
9265      subscribers.add(visualElement);
9266      return () => void subscribers.delete(visualElement);
9267    },
9268    start(definition, transitionOverride) {
9269      invariant(hasMounted, "controls.start() should only be called after a component has mounted. Consider calling within a useEffect hook.");
9270      const animations2 = [];
9271      subscribers.forEach((visualElement) => {
9272        animations2.push(animateVisualElement(visualElement, definition, {
9273          transitionOverride
9274        }));
9275      });
9276      return Promise.all(animations2);
9277    },
9278    set(definition) {
9279      invariant(hasMounted, "controls.set() should only be called after a component has mounted. Consider calling within a useEffect hook.");
9280      return subscribers.forEach((visualElement) => {
9281        setValues(visualElement, definition);
9282      });
9283    },
9284    stop() {
9285      subscribers.forEach((visualElement) => {
9286        stopAnimation(visualElement);
9287      });
9288    },
9289    mount() {
9290      hasMounted = true;
9291      return () => {
9292        hasMounted = false;
9293        controls.stop();
9294      };
9295    }
9296  };
9297  return controls;
9298}
9299var import_dist967 = __toESM(require_dist(), 1);
9300var import_dist968 = __toESM(require_dist2(), 1);
9301var import_dist969 = __toESM(require_dist3(), 1);
9302var import_dist919 = __toESM(require_dist(), 1);
9303var import_dist920 = __toESM(require_dist2(), 1);
9304var import_dist921 = __toESM(require_dist3(), 1);
9305var import_react37 = __toESM(require_react(), 1);
9306function useUnmountEffect(callback) {
9307  return (0, import_react37.useEffect)(() => () => callback(), []);
9308}
9309var import_dist964 = __toESM(require_dist(), 1);
9310var import_dist965 = __toESM(require_dist2(), 1);
9311var import_dist966 = __toESM(require_dist3(), 1);
9312var import_dist961 = __toESM(require_dist(), 1);
9313var import_dist962 = __toESM(require_dist2(), 1);
9314var import_dist963 = __toESM(require_dist3(), 1);
9315var import_dist949 = __toESM(require_dist(), 1);
9316var import_dist950 = __toESM(require_dist2(), 1);
9317var import_dist951 = __toESM(require_dist3(), 1);
9318var import_dist925 = __toESM(require_dist(), 1);
9319var import_dist926 = __toESM(require_dist2(), 1);
9320var import_dist927 = __toESM(require_dist3(), 1);
9321var import_dist922 = __toESM(require_dist(), 1);
9322var import_dist923 = __toESM(require_dist2(), 1);
9323var import_dist924 = __toESM(require_dist3(), 1);
9324var wrap = (min, max, v) => {
9325  const rangeSize = max - min;
9326  return ((v - min) % rangeSize + rangeSize) % rangeSize + min;
9327};
9328function getEasingForSegment(easing, i) {
9329  return isEasingArray(easing) ? easing[wrap(0, easing.length, i)] : easing;
9330}
9331var import_dist931 = __toESM(require_dist(), 1);
9332var import_dist932 = __toESM(require_dist2(), 1);
9333var import_dist933 = __toESM(require_dist3(), 1);
9334var import_dist928 = __toESM(require_dist(), 1);
9335var import_dist929 = __toESM(require_dist2(), 1);
9336var import_dist930 = __toESM(require_dist3(), 1);
9337function isDOMKeyframes(keyframes2) {
9338  return typeof keyframes2 === "object" && !Array.isArray(keyframes2);
9339}
9340function resolveSubjects(subject, keyframes2, scope, selectorCache) {
9341  if (typeof subject === "string" && isDOMKeyframes(keyframes2)) {
9342    return resolveElements(subject, scope, selectorCache);
9343  } else if (subject instanceof NodeList) {
vendor: 15,198 bytes, lines 9344-9745
9344    return Array.from(subject);
9345  } else if (Array.isArray(subject)) {
9346    return subject;
9347  } else {
9348    return [subject];
9349  }
9350}
9351var import_dist934 = __toESM(require_dist(), 1);
9352var import_dist935 = __toESM(require_dist2(), 1);
9353var import_dist936 = __toESM(require_dist3(), 1);
9354function calculateRepeatDuration(duration, repeat, _repeatDelay) {
9355  return duration * (repeat + 1);
9356}
9357var import_dist937 = __toESM(require_dist(), 1);
9358var import_dist938 = __toESM(require_dist2(), 1);
9359var import_dist939 = __toESM(require_dist3(), 1);
9360function calcNextTime(current, next, prev, labels) {
9361  var _a;
9362  if (typeof next === "number") {
9363    return next;
9364  } else if (next.startsWith("-") || next.startsWith("+")) {
9365    return Math.max(0, current + parseFloat(next));
9366  } else if (next === "<") {
9367    return prev;
9368  } else {
9369    return (_a = labels.get(next)) !== null && _a !== void 0 ? _a : current;
9370  }
9371}
9372var import_dist940 = __toESM(require_dist(), 1);
9373var import_dist941 = __toESM(require_dist2(), 1);
9374var import_dist942 = __toESM(require_dist3(), 1);
9375function eraseKeyframes(sequence, startTime, endTime) {
9376  for (let i = 0; i < sequence.length; i++) {
9377    const keyframe = sequence[i];
9378    if (keyframe.at > startTime && keyframe.at < endTime) {
9379      removeItem(sequence, keyframe);
9380      i--;
9381    }
9382  }
9383}
9384function addKeyframes(sequence, keyframes2, easing, offset, startTime, endTime) {
9385  eraseKeyframes(sequence, startTime, endTime);
9386  for (let i = 0; i < keyframes2.length; i++) {
9387    sequence.push({
9388      value: keyframes2[i],
9389      at: mixNumber(startTime, endTime, offset[i]),
9390      easing: getEasingForSegment(easing, i)
9391    });
9392  }
9393}
9394var import_dist943 = __toESM(require_dist(), 1);
9395var import_dist944 = __toESM(require_dist2(), 1);
9396var import_dist945 = __toESM(require_dist3(), 1);
9397function normalizeTimes(times, repeat) {
9398  for (let i = 0; i < times.length; i++) {
9399    times[i] = times[i] / (repeat + 1);
9400  }
9401}
9402var import_dist946 = __toESM(require_dist(), 1);
9403var import_dist947 = __toESM(require_dist2(), 1);
9404var import_dist948 = __toESM(require_dist3(), 1);
9405function compareByTime(a, b) {
9406  if (a.at === b.at) {
9407    if (a.value === null)
9408      return 1;
9409    if (b.value === null)
9410      return -1;
9411    return 0;
9412  } else {
9413    return a.at - b.at;
9414  }
9415}
9416var defaultSegmentEasing = "easeInOut";
9417var MAX_REPEAT = 20;
9418function createAnimationsFromSequence(sequence, { defaultTransition = {}, ...sequenceTransition } = {}, scope, generators2) {
9419  const defaultDuration = defaultTransition.duration || 0.3;
9420  const animationDefinitions = /* @__PURE__ */ new Map();
9421  const sequences = /* @__PURE__ */ new Map();
9422  const elementCache = {};
9423  const timeLabels = /* @__PURE__ */ new Map();
9424  let prevTime = 0;
9425  let currentTime = 0;
9426  let totalDuration = 0;
9427  for (let i = 0; i < sequence.length; i++) {
9428    const segment = sequence[i];
9429    if (typeof segment === "string") {
9430      timeLabels.set(segment, currentTime);
9431      continue;
9432    } else if (!Array.isArray(segment)) {
9433      timeLabels.set(segment.name, calcNextTime(currentTime, segment.at, prevTime, timeLabels));
9434      continue;
9435    }
9436    let [subject, keyframes2, transition = {}] = segment;
9437    if (transition.at !== void 0) {
9438      currentTime = calcNextTime(currentTime, transition.at, prevTime, timeLabels);
9439    }
9440    let maxDuration2 = 0;
9441    const resolveValueSequence = (valueKeyframes, valueTransition, valueSequence, elementIndex = 0, numSubjects = 0) => {
9442      const valueKeyframesAsList = keyframesAsList(valueKeyframes);
9443      const { delay: delay2 = 0, times = defaultOffset(valueKeyframesAsList), type = "keyframes", repeat, repeatType, repeatDelay = 0, ...remainingTransition } = valueTransition;
9444      let { ease: ease2 = defaultTransition.ease || "easeOut", duration } = valueTransition;
9445      const calculatedDelay = typeof delay2 === "function" ? delay2(elementIndex, numSubjects) : delay2;
9446      const numKeyframes = valueKeyframesAsList.length;
9447      const createGenerator = isGenerator(type) ? type : generators2 === null || generators2 === void 0 ? void 0 : generators2[type];
9448      if (numKeyframes <= 2 && createGenerator) {
9449        let absoluteDelta = 100;
9450        if (numKeyframes === 2 && isNumberKeyframesArray(valueKeyframesAsList)) {
9451          const delta = valueKeyframesAsList[1] - valueKeyframesAsList[0];
9452          absoluteDelta = Math.abs(delta);
9453        }
9454        const springTransition = { ...remainingTransition };
9455        if (duration !== void 0) {
9456          springTransition.duration = secondsToMilliseconds(duration);
9457        }
9458        const springEasing = createGeneratorEasing(springTransition, absoluteDelta, createGenerator);
9459        ease2 = springEasing.ease;
9460        duration = springEasing.duration;
9461      }
9462      duration !== null && duration !== void 0 ? duration : duration = defaultDuration;
9463      const startTime = currentTime + calculatedDelay;
9464      if (times.length === 1 && times[0] === 0) {
9465        times[1] = 1;
9466      }
9467      const remainder = times.length - valueKeyframesAsList.length;
9468      remainder > 0 && fillOffset(times, remainder);
9469      valueKeyframesAsList.length === 1 && valueKeyframesAsList.unshift(null);
9470      if (repeat) {
9471        invariant(repeat < MAX_REPEAT, "Repeat count too high, must be less than 20");
9472        duration = calculateRepeatDuration(duration, repeat);
9473        const originalKeyframes = [...valueKeyframesAsList];
9474        const originalTimes = [...times];
9475        ease2 = Array.isArray(ease2) ? [...ease2] : [ease2];
9476        const originalEase = [...ease2];
9477        for (let repeatIndex = 0; repeatIndex < repeat; repeatIndex++) {
9478          valueKeyframesAsList.push(...originalKeyframes);
9479          for (let keyframeIndex = 0; keyframeIndex < originalKeyframes.length; keyframeIndex++) {
9480            times.push(originalTimes[keyframeIndex] + (repeatIndex + 1));
9481            ease2.push(keyframeIndex === 0 ? "linear" : getEasingForSegment(originalEase, keyframeIndex - 1));
9482          }
9483        }
9484        normalizeTimes(times, repeat);
9485      }
9486      const targetTime = startTime + duration;
9487      addKeyframes(valueSequence, valueKeyframesAsList, ease2, times, startTime, targetTime);
9488      maxDuration2 = Math.max(calculatedDelay + duration, maxDuration2);
9489      totalDuration = Math.max(targetTime, totalDuration);
9490    };
9491    if (isMotionValue(subject)) {
9492      const subjectSequence = getSubjectSequence(subject, sequences);
9493      resolveValueSequence(keyframes2, transition, getValueSequence("default", subjectSequence));
9494    } else {
9495      const subjects = resolveSubjects(subject, keyframes2, scope, elementCache);
9496      const numSubjects = subjects.length;
9497      for (let subjectIndex = 0; subjectIndex < numSubjects; subjectIndex++) {
9498        keyframes2 = keyframes2;
9499        transition = transition;
9500        const thisSubject = subjects[subjectIndex];
9501        const subjectSequence = getSubjectSequence(thisSubject, sequences);
9502        for (const key in keyframes2) {
9503          resolveValueSequence(keyframes2[key], getValueTransition2(transition, key), getValueSequence(key, subjectSequence), subjectIndex, numSubjects);
9504        }
9505      }
9506    }
9507    prevTime = currentTime;
9508    currentTime += maxDuration2;
9509  }
9510  sequences.forEach((valueSequences, element) => {
9511    for (const key in valueSequences) {
9512      const valueSequence = valueSequences[key];
9513      valueSequence.sort(compareByTime);
9514      const keyframes2 = [];
9515      const valueOffset = [];
9516      const valueEasing = [];
9517      for (let i = 0; i < valueSequence.length; i++) {
9518        const { at, value, easing } = valueSequence[i];
9519        keyframes2.push(value);
9520        valueOffset.push(progress(0, totalDuration, at));
9521        valueEasing.push(easing || "easeOut");
9522      }
9523      if (valueOffset[0] !== 0) {
9524        valueOffset.unshift(0);
9525        keyframes2.unshift(keyframes2[0]);
9526        valueEasing.unshift(defaultSegmentEasing);
9527      }
9528      if (valueOffset[valueOffset.length - 1] !== 1) {
9529        valueOffset.push(1);
9530        keyframes2.push(null);
9531      }
9532      if (!animationDefinitions.has(element)) {
9533        animationDefinitions.set(element, {
9534          keyframes: {},
9535          transition: {}
9536        });
9537      }
9538      const definition = animationDefinitions.get(element);
9539      definition.keyframes[key] = keyframes2;
9540      definition.transition[key] = {
9541        ...defaultTransition,
9542        duration: totalDuration,
9543        ease: valueEasing,
9544        times: valueOffset,
9545        ...sequenceTransition
9546      };
9547    }
9548  });
9549  return animationDefinitions;
9550}
9551function getSubjectSequence(subject, sequences) {
9552  !sequences.has(subject) && sequences.set(subject, {});
9553  return sequences.get(subject);
9554}
9555function getValueSequence(name, sequences) {
9556  if (!sequences[name])
9557    sequences[name] = [];
9558  return sequences[name];
9559}
9560function keyframesAsList(keyframes2) {
9561  return Array.isArray(keyframes2) ? keyframes2 : [keyframes2];
9562}
9563function getValueTransition2(transition, key) {
9564  return transition && transition[key] ? {
9565    ...transition,
9566    ...transition[key]
9567  } : { ...transition };
9568}
9569var isNumber = (keyframe) => typeof keyframe === "number";
9570var isNumberKeyframesArray = (keyframes2) => keyframes2.every(isNumber);
9571var import_dist958 = __toESM(require_dist(), 1);
9572var import_dist959 = __toESM(require_dist2(), 1);
9573var import_dist960 = __toESM(require_dist3(), 1);
9574var import_dist955 = __toESM(require_dist(), 1);
9575var import_dist956 = __toESM(require_dist2(), 1);
9576var import_dist957 = __toESM(require_dist3(), 1);
9577var import_dist952 = __toESM(require_dist(), 1);
9578var import_dist953 = __toESM(require_dist2(), 1);
9579var import_dist954 = __toESM(require_dist3(), 1);
9580function isObjectKey(key, object) {
9581  return key in object;
9582}
9583var ObjectVisualElement = class extends VisualElement {
9584  constructor() {
9585    super(...arguments);
9586    this.type = "object";
9587  }
9588  readValueFromInstance(instance, key) {
9589    if (isObjectKey(key, instance)) {
9590      const value = instance[key];
9591      if (typeof value === "string" || typeof value === "number") {
9592        return value;
9593      }
9594    }
9595    return void 0;
9596  }
9597  getBaseTargetFromProps() {
9598    return void 0;
9599  }
9600  removeValueFromRenderState(key, renderState) {
9601    delete renderState.output[key];
9602  }
9603  measureInstanceViewportBox() {
9604    return createBox();
9605  }
9606  build(renderState, latestValues) {
9607    Object.assign(renderState.output, latestValues);
9608  }
9609  renderInstance(instance, { output }) {
9610    Object.assign(instance, output);
9611  }
9612  sortInstanceNodePosition() {
9613    return 0;
9614  }
9615};
9616function createDOMVisualElement(element) {
9617  const options = {
9618    presenceContext: null,
9619    props: {},
9620    visualState: {
9621      renderState: {
9622        transform: {},
9623        transformOrigin: {},
9624        style: {},
9625        vars: {},
9626        attrs: {}
9627      },
9628      latestValues: {}
9629    }
9630  };
9631  const node = isSVGElement(element) ? new SVGVisualElement(options) : new HTMLVisualElement(options);
9632  node.mount(element);
9633  visualElementStore.set(element, node);
9634}
9635function createObjectVisualElement(subject) {
9636  const options = {
9637    presenceContext: null,
9638    props: {},
9639    visualState: {
9640      renderState: {
9641        output: {}
9642      },
9643      latestValues: {}
9644    }
9645  };
9646  const node = new ObjectVisualElement(options);
9647  node.mount(subject);
9648  visualElementStore.set(subject, node);
9649}
9650function isSingleValue(subject, keyframes2) {
9651  return isMotionValue(subject) || typeof subject === "number" || typeof subject === "string" && !isDOMKeyframes(keyframes2);
9652}
9653function animateSubject(subject, keyframes2, options, scope) {
9654  const animations2 = [];
9655  if (isSingleValue(subject, keyframes2)) {
9656    animations2.push(animateSingleValue(subject, isDOMKeyframes(keyframes2) ? keyframes2.default || keyframes2 : keyframes2, options ? options.default || options : options));
9657  } else {
9658    const subjects = resolveSubjects(subject, keyframes2, scope);
9659    const numSubjects = subjects.length;
9660    invariant(Boolean(numSubjects), "No valid elements provided.");
9661    for (let i = 0; i < numSubjects; i++) {
9662      const thisSubject = subjects[i];
9663      const createVisualElement = thisSubject instanceof Element ? createDOMVisualElement : createObjectVisualElement;
9664      if (!visualElementStore.has(thisSubject)) {
9665        createVisualElement(thisSubject);
9666      }
9667      const visualElement = visualElementStore.get(thisSubject);
9668      const transition = { ...options };
9669      if ("delay" in transition && typeof transition.delay === "function") {
9670        transition.delay = transition.delay(i, numSubjects);
9671      }
9672      animations2.push(...animateTarget(visualElement, { ...keyframes2, transition }, {}));
9673    }
9674  }
9675  return animations2;
9676}
9677function animateSequence(sequence, options, scope) {
9678  const animations2 = [];
9679  const animationDefinitions = createAnimationsFromSequence(sequence, options, scope, { spring });
9680  animationDefinitions.forEach(({ keyframes: keyframes2, transition }, subject) => {
9681    animations2.push(...animateSubject(subject, keyframes2, transition));
9682  });
9683  return animations2;
9684}
9685function isSequence(value) {
9686  return Array.isArray(value) && value.some(Array.isArray);
9687}
9688function createScopedAnimate(scope) {
9689  function scopedAnimate(subjectOrSequence, optionsOrKeyframes, options) {
9690    let animations2 = [];
9691    if (isSequence(subjectOrSequence)) {
9692      animations2 = animateSequence(subjectOrSequence, optionsOrKeyframes, scope);
9693    } else {
9694      animations2 = animateSubject(subjectOrSequence, optionsOrKeyframes, options, scope);
9695    }
9696    const animation = new GroupPlaybackControls(animations2);
9697    if (scope) {
9698      scope.animations.push(animation);
9699    }
9700    return animation;
9701  }
9702  return scopedAnimate;
9703}
9704var animate = createScopedAnimate();
9705function useAnimate() {
9706  const scope = useConstant(() => ({
9707    current: null,
9708    // Will be hydrated by React
9709    animations: []
9710  }));
9711  const animate2 = useConstant(() => createScopedAnimate(scope));
9712  useUnmountEffect(() => {
9713    scope.animations.forEach((animation) => animation.stop());
9714  });
9715  return [scope, animate2];
9716}
9717var import_dist985 = __toESM(require_dist(), 1);
9718var import_dist986 = __toESM(require_dist2(), 1);
9719var import_dist987 = __toESM(require_dist3(), 1);
9720var import_dist982 = __toESM(require_dist(), 1);
9721var import_dist983 = __toESM(require_dist2(), 1);
9722var import_dist984 = __toESM(require_dist3(), 1);
9723var import_dist979 = __toESM(require_dist(), 1);
9724var import_dist980 = __toESM(require_dist2(), 1);
9725var import_dist981 = __toESM(require_dist3(), 1);
9726var import_dist976 = __toESM(require_dist(), 1);
9727var import_dist977 = __toESM(require_dist2(), 1);
9728var import_dist978 = __toESM(require_dist3(), 1);
9729var import_dist970 = __toESM(require_dist(), 1);
9730var import_dist971 = __toESM(require_dist2(), 1);
9731var import_dist972 = __toESM(require_dist3(), 1);
9732function setCSSVar(element, name, value) {
9733  element.style.setProperty(`--${name}`, value);
9734}
9735function setStyle(element, name, value) {
9736  element.style[name] = value;
9737}
9738var import_dist973 = __toESM(require_dist(), 1);
9739var import_dist974 = __toESM(require_dist2(), 1);
9740var import_dist975 = __toESM(require_dist3(), 1);
9741var supportsPartialKeyframes = memo(() => {
9742  try {
9743    document.createElement("div").animate({ opacity: [1] });
9744  } catch (e) {
9745    return false;
9746  }
9747  return true;
9748});
9749var state = /* @__PURE__ */ new WeakMap();
9750function hydrateKeyframes(valueName, keyframes2, read) {
9751  for (let i = 0; i < keyframes2.length; i++) {
9752    if (keyframes2[i] === null) {
9753      keyframes2[i] = i === 0 ? read() : keyframes2[i - 1];
9754    }
9755    if (typeof keyframes2[i] === "number" && browserNumberValueTypes[valueName]) {
9756      keyframes2[i] = browserNumberValueTypes[valueName].transform(keyframes2[i]);
9757    }
9758  }
9759  if (!supportsPartialKeyframes() && keyframes2.length < 2) {
9760    keyframes2.unshift(read());
9761  }
9762}
9763var defaultEasing2 = "easeOut";
9764function getElementAnimationState(element) {
9765  const animationState = state.get(element) || /* @__PURE__ */ new Map();
9766  state.set(element, animationState);
9767  return state.get(element);
9768}
9769var NativeAnimation = class extends NativeAnimationControls {
9770  constructor(element, valueName, valueKeyframes, options) {
9771    const isCSSVar = valueName.startsWith("--");
9772    invariant(typeof options.type !== "string", `animateMini doesn't support "type" as a string. Did you mean to import { spring } from "framer-motion"?`);
9773    const existingAnimation = getElementAnimationState(element).get(valueName);
9774    existingAnimation && existingAnimation.stop();
9775    const readInitialKeyframe = () => {
9776      return valueName.startsWith("--") ? element.style.getPropertyValue(valueName) : window.getComputedStyle(element)[valueName];
9777    };
9778    if (!Array.isArray(valueKeyframes)) {
9779      valueKeyframes = [valueKeyframes];
9780    }
9781    hydrateKeyframes(valueName, valueKeyframes, readInitialKeyframe);
9782    if (isGenerator(options.type)) {
9783      const generatorOptions = createGeneratorEasing(options, 100, options.type);
9784      options.ease = supportsLinearEasing() ? generatorOptions.ease : defaultEasing2;
9785      options.duration = secondsToMilliseconds(generatorOptions.duration);
9786      options.type = "keyframes";
9787    } else {
9788      options.ease = options.ease || defaultEasing2;
9789    }
9790    const onFinish = () => {
9791      this.setValue(element, valueName, getFinalKeyframe(valueKeyframes, options));
9792      this.cancel();
9793      this.resolveFinishedPromise();
9794    };
9795    const init = () => {
9796      this.setValue = isCSSVar ? setCSSVar : setStyle;
9797      this.options = options;
9798      this.updateFinishedPromise();
9799      this.removeAnimation = () => {
9800        const elementState = state.get(element);
9801        elementState && elementState.delete(valueName);
9802      };
9803    };
9804    if (!supportsWaapi()) {
9805      super();
9806      init();
9807      onFinish();
9808    } else {
9809      super(startWaapiAnimation(element, valueName, valueKeyframes, options));
9810      init();
9811      if (options.autoplay === false) {
9812        this.animation.pause();
9813      }
9814      this.animation.onfinish = onFinish;
9815      getElementAnimationState(element).set(valueName, this);
9816    }
9817  }
9818  /**
9819   * Allows the returned animation to be awaited or promise-chained. Currently
9820   * resolves when the animation finishes at all but in a future update could/should
9821   * reject if its cancels.
9822   */
9823  then(resolve, reject) {
9824    return this.currentFinishedPromise.then(resolve, reject);
9825  }
9826  updateFinishedPromise() {
9827    this.currentFinishedPromise = new Promise((resolve) => {
9828      this.resolveFinishedPromise = resolve;
9829    });
9830  }
9831  play() {
9832    if (this.state === "finished") {
9833      this.updateFinishedPromise();
9834    }
9835    super.play();
9836  }
9837  cancel() {
9838    this.removeAnimation();
9839    super.cancel();
9840  }
9841};
9842function animateElements(elementOrSelector, keyframes2, options, scope) {
9843  const elements = resolveElements(elementOrSelector, scope);
9844  const numElements = elements.length;
9845  invariant(Boolean(numElements), "No valid element provided.");
9846  const animations2 = [];
9847  for (let i = 0; i < numElements; i++) {
9848    const element = elements[i];
9849    const elementTransition = { ...options };
9850    if (typeof elementTransition.delay === "function") {
9851      elementTransition.delay = elementTransition.delay(i, numElements);
9852    }
9853    for (const valueName in keyframes2) {
9854      const valueKeyframes = keyframes2[valueName];
9855      const valueOptions = {
9856        ...getValueTransition(elementTransition, valueName)
9857      };
9858      valueOptions.duration = valueOptions.duration ? secondsToMilliseconds(valueOptions.duration) : valueOptions.duration;
9859      valueOptions.delay = secondsToMilliseconds(valueOptions.delay || 0);
9860      animations2.push(new NativeAnimation(element, valueName, valueKeyframes, valueOptions));
9861    }
9862  }
9863  return animations2;
9864}
9865var createScopedWaapiAnimate = (scope) => {
9866  function scopedAnimate(elementOrSelector, keyframes2, options) {
9867    return new GroupPlaybackControls(animateElements(elementOrSelector, keyframes2, options, scope));
9868  }
9869  return scopedAnimate;
9870};
9871var animateMini = createScopedWaapiAnimate();
9872function useAnimateMini() {
9873  const scope = useConstant(() => ({
9874    current: null,
9875    // Will be hydrated by React
9876    animations: []
9877  }));
9878  const animate2 = useConstant(() => createScopedWaapiAnimate(scope));
9879  useUnmountEffect(() => {
9880    scope.animations.forEach((animation) => animation.stop());
9881  });
9882  return [scope, animate2];
9883}
9884var import_dist988 = __toESM(require_dist(), 1);
9885var import_dist989 = __toESM(require_dist2(), 1);
9886var import_dist990 = __toESM(require_dist3(), 1);
9887function useAnimationControls() {
9888  const controls = useConstant(animationControls);
9889  useIsomorphicLayoutEffect(controls.mount, []);
9890  return controls;
9891}
9892var useAnimation = useAnimationControls;
9893var import_dist991 = __toESM(require_dist(), 1);
9894var import_dist992 = __toESM(require_dist2(), 1);
9895var import_dist993 = __toESM(require_dist3(), 1);
9896var import_react38 = __toESM(require_react(), 1);
9897function useDomEvent(ref, eventName, handler, options) {
9898  (0, import_react38.useEffect)(() => {
9899    const element = ref.current;
9900    if (handler && element) {
9901      return addDomEvent(element, eventName, handler, options);
9902    }
9903  }, [ref, eventName, handler, options]);
9904}
9905var import_dist994 = __toESM(require_dist(), 1);
9906var import_dist995 = __toESM(require_dist2(), 1);
9907var import_dist996 = __toESM(require_dist3(), 1);
9908var DragControls = class {
9909  constructor() {
9910    this.componentControls = /* @__PURE__ */ new Set();
9911  }
9912  /**
9913   * Subscribe a component's internal `VisualElementDragControls` to the user-facing API.
9914   *
9915   * @internal
9916   */
9917  subscribe(controls) {
9918    this.componentControls.add(controls);
9919    return () => this.componentControls.delete(controls);
9920  }
9921  /**
9922   * Start a drag gesture on every `motion` component that has this set of drag controls
9923   * passed into it via the `dragControls` prop.
9924   *
9925   * ```jsx
9926   * dragControls.start(e, {
9927   *   snapToCursor: true
9928   * })
9929   * ```
9930   *
9931   * @param event - PointerEvent
9932   * @param options - Options
9933   *
9934   * @public
9935   */
9936  start(event, options) {
9937    this.componentControls.forEach((controls) => {
9938      controls.start(event.nativeEvent || event, options);
9939    });
9940  }
9941};
9942var createDragControls = () => new DragControls();
9943function useDragControls() {
9944  return useConstant(createDragControls);
9945}
9946var import_dist997 = __toESM(require_dist(), 1);
9947var import_dist998 = __toESM(require_dist2(), 1);
9948var import_dist999 = __toESM(require_dist3(), 1);
9949function isMotionComponent(component) {
9950  return component !== null && typeof component === "object" && motionComponentSymbol in component;
9951}
9952var import_dist1000 = __toESM(require_dist(), 1);
9953var import_dist1001 = __toESM(require_dist2(), 1);
9954var import_dist1002 = __toESM(require_dist3(), 1);
9955function unwrapMotionComponent(component) {
9956  if (isMotionComponent(component)) {
9957    return component[motionComponentSymbol];
9958  }
9959  return void 0;
9960}
9961var import_dist1003 = __toESM(require_dist(), 1);
9962var import_dist1004 = __toESM(require_dist2(), 1);
9963var import_dist1005 = __toESM(require_dist3(), 1);
9964function useInstantLayoutTransition() {
9965  return startTransition;
9966}
9967function startTransition(callback) {
9968  if (!rootProjectionNode.current)
9969    return;
9970  rootProjectionNode.current.isUpdating = false;
9971  rootProjectionNode.current.blockUpdate();
9972  callback && callback();
9973}
9974var import_dist1006 = __toESM(require_dist(), 1);
9975var import_dist1007 = __toESM(require_dist2(), 1);
9976var import_dist1008 = __toESM(require_dist3(), 1);
9977var import_react39 = __toESM(require_react(), 1);
9978function useResetProjection() {
9979  const reset = (0, import_react39.useCallback)(() => {
9980    const root = rootProjectionNode.current;
9981    if (!root)
9982      return;
9983    root.resetTree();
9984  }, []);
9985  return reset;
9986}
9987var import_dist1009 = __toESM(require_dist(), 1);
9988var import_dist1010 = __toESM(require_dist2(), 1);
9989var import_dist1011 = __toESM(require_dist3(), 1);
9990var import_react40 = __toESM(require_react(), 1);
9991function useCycle(...items) {
9992  const index = (0, import_react40.useRef)(0);
9993  const [item, setItem] = (0, import_react40.useState)(items[index.current]);
9994  const runCycle = (0, import_react40.useCallback)(
9995    (next) => {
9996      index.current = typeof next !== "number" ? wrap(0, items.length, index.current + 1) : next;
9997      setItem(items[index.current]);
9998    },
9999    // The array will change on each call, but by putting items.length at
10000    // the front of this array, we guarantee the dependency comparison will match up
10001    // eslint-disable-next-line react-hooks/exhaustive-deps
10002    [items.length, ...items]
10003  );
10004  return [item, runCycle];
10005}
10006var import_dist1015 = __toESM(require_dist(), 1);
10007var import_dist1016 = __toESM(require_dist2(), 1);
10008var import_dist1017 = __toESM(require_dist3(), 1);
10009var import_react41 = __toESM(require_react(), 1);
10010var import_dist1012 = __toESM(require_dist(), 1);
10011var import_dist1013 = __toESM(require_dist2(), 1);
10012var import_dist1014 = __toESM(require_dist3(), 1);
10013var thresholds = {
10014  some: 0,
10015  all: 1
10016};
10017function inView(elementOrSelector, onStart, { root, margin: rootMargin, amount = "some" } = {}) {
10018  const elements = resolveElements(elementOrSelector);
10019  const activeIntersections = /* @__PURE__ */ new WeakMap();
10020  const onIntersectionChange = (entries) => {
10021    entries.forEach((entry) => {
10022      const onEnd = activeIntersections.get(entry.target);
10023      if (entry.isIntersecting === Boolean(onEnd))
10024        return;
10025      if (entry.isIntersecting) {
10026        const newOnEnd = onStart(entry);
10027        if (typeof newOnEnd === "function") {
10028          activeIntersections.set(entry.target, newOnEnd);
10029        } else {
10030          observer2.unobserve(entry.target);
10031        }
10032      } else if (typeof onEnd === "function") {
10033        onEnd(entry);
10034        activeIntersections.delete(entry.target);
10035      }
10036    });
10037  };
10038  const observer2 = new IntersectionObserver(onIntersectionChange, {
10039    root,
10040    rootMargin,
10041    threshold: typeof amount === "number" ? amount : thresholds[amount]
10042  });
10043  elements.forEach((element) => observer2.observe(element));
10044  return () => observer2.disconnect();
10045}
10046function useInView(ref, { root, margin, amount, once = false } = {}) {
10047  const [isInView, setInView] = (0, import_react41.useState)(false);
10048  (0, import_react41.useEffect)(() => {
10049    if (!ref.current || once && isInView)
10050      return;
10051    const onEnter = () => {
10052      setInView(true);
10053      return once ? void 0 : () => setInView(false);
10054    };
10055    const options = {
10056      root: root && root.current || void 0,
10057      margin,
10058      amount
10059    };
10060    return inView(ref.current, onEnter, options);
10061  }, [root, ref, margin, once, amount]);
10062  return isInView;
10063}
10064var import_dist1018 = __toESM(require_dist(), 1);
10065var import_dist1019 = __toESM(require_dist2(), 1);
10066var import_dist1020 = __toESM(require_dist3(), 1);
10067var import_react42 = __toESM(require_react(), 1);
10068function useInstantTransition() {
10069  const [forceUpdate, forcedRenderCount] = useForceUpdate();
10070  const startInstantLayoutTransition = useInstantLayoutTransition();
10071  const unlockOnFrameRef = (0, import_react42.useRef)(-1);
10072  (0, import_react42.useEffect)(() => {
10073    frame.postRender(() => frame.postRender(() => {
10074      if (forcedRenderCount !== unlockOnFrameRef.current)
10075        return;
10076      instantAnimationState.current = false;
10077    }));
10078  }, [forcedRenderCount]);
10079  return (callback) => {
10080    startInstantLayoutTransition(() => {
10081      instantAnimationState.current = true;
10082      forceUpdate();
10083      callback();
10084      unlockOnFrameRef.current = forcedRenderCount + 1;
10085    });
10086  };
10087}
10088function disableInstantTransitions() {
10089  instantAnimationState.current = false;
10090}
10091var import_dist1030 = __toESM(require_dist(), 1);
10092var import_dist1031 = __toESM(require_dist2(), 1);
10093var import_dist1032 = __toESM(require_dist3(), 1);
10094var import_dist1021 = __toESM(require_dist(), 1);
10095var import_dist1022 = __toESM(require_dist2(), 1);
10096var import_dist1023 = __toESM(require_dist3(), 1);
10097var appearStoreId = (elementId, valueName) => {
10098  const key = transformProps.has(valueName) ? "transform" : valueName;
10099  return `${elementId}: ${key}`;
10100};
10101var import_dist1027 = __toESM(require_dist(), 1);
10102var import_dist1028 = __toESM(require_dist2(), 1);
10103var import_dist1029 = __toESM(require_dist3(), 1);
10104var import_dist1024 = __toESM(require_dist(), 1);
10105var import_dist1025 = __toESM(require_dist2(), 1);
10106var import_dist1026 = __toESM(require_dist3(), 1);
10107var appearAnimationStore = /* @__PURE__ */ new Map();
10108var appearComplete = /* @__PURE__ */ new Map();
10109function handoffOptimizedAppearAnimation(elementId, valueName, frame2) {
10110  var _a;
10111  const storeId = appearStoreId(elementId, valueName);
10112  const optimisedAnimation = appearAnimationStore.get(storeId);
10113  if (!optimisedAnimation) {
10114    return null;
10115  }
10116  const { animation, startTime } = optimisedAnimation;
10117  function cancelAnimation() {
10118    var _a2;
10119    (_a2 = window.MotionCancelOptimisedAnimation) === null || _a2 === void 0 ? void 0 : _a2.call(window, elementId, valueName, frame2);
10120  }
10121  animation.onfinish = cancelAnimation;
10122  if (startTime === null || ((_a = window.MotionHandoffIsComplete) === null || _a === void 0 ? void 0 : _a.call(window, elementId))) {
10123    cancelAnimation();
10124    return null;
10125  } else {
10126    return startTime;
10127  }
10128}
10129var startFrameTime;
10130var readyAnimation;
10131var suspendedAnimations = /* @__PURE__ */ new Set();
10132function resumeSuspendedAnimations() {
10133  suspendedAnimations.forEach((data) => {
10134    data.animation.play();
10135    data.animation.startTime = data.startTime;
10136  });
10137  suspendedAnimations.clear();
10138}
10139function startOptimizedAppearAnimation(element, name, keyframes2, options, onReady) {
10140  if (window.MotionIsMounted) {
10141    return;
10142  }
10143  const id4 = element.dataset[optimizedAppearDataId];
10144  if (!id4)
10145    return;
10146  window.MotionHandoffAnimation = handoffOptimizedAppearAnimation;
10147  const storeId = appearStoreId(id4, name);
10148  if (!readyAnimation) {
10149    readyAnimation = startWaapiAnimation(
10150      element,
10151      name,
10152      [keyframes2[0], keyframes2[0]],
10153      /**
10154       * 10 secs is basically just a super-safe duration to give Chrome
10155       * long enough to get the animation ready.
10156       */
10157      { duration: 1e4, ease: "linear" }
10158    );
10159    appearAnimationStore.set(storeId, {
10160      animation: readyAnimation,
10161      startTime: null
10162    });
10163    window.MotionHandoffAnimation = handoffOptimizedAppearAnimation;
10164    window.MotionHasOptimisedAnimation = (elementId, valueName) => {
10165      if (!elementId)
10166        return false;
10167      if (!valueName) {
10168        return appearComplete.has(elementId);
10169      }
10170      const animationId = appearStoreId(elementId, valueName);
10171      return Boolean(appearAnimationStore.get(animationId));
10172    };
10173    window.MotionHandoffMarkAsComplete = (elementId) => {
10174      if (appearComplete.has(elementId)) {
10175        appearComplete.set(elementId, true);
10176      }
10177    };
10178    window.MotionHandoffIsComplete = (elementId) => {
10179      return appearComplete.get(elementId) === true;
10180    };
10181    window.MotionCancelOptimisedAnimation = (elementId, valueName, frame2, canResume) => {
10182      const animationId = appearStoreId(elementId, valueName);
10183      const data = appearAnimationStore.get(animationId);
10184      if (!data)
10185        return;
10186      if (frame2 && canResume === void 0) {
10187        frame2.postRender(() => {
10188          frame2.postRender(() => {
10189            data.animation.cancel();
10190          });
10191        });
10192      } else {
10193        data.animation.cancel();
10194      }
10195      if (frame2 && canResume) {
10196        suspendedAnimations.add(data);
10197        frame2.render(resumeSuspendedAnimations);
10198      } else {
10199        appearAnimationStore.delete(animationId);
10200        if (!appearAnimationStore.size) {
10201          window.MotionCancelOptimisedAnimation = void 0;
10202        }
10203      }
10204    };
10205    window.MotionCheckAppearSync = (visualElement, valueName, value) => {
10206      var _a, _b;
10207      const appearId = getOptimisedAppearId(visualElement);
10208      if (!appearId)
10209        return;
10210      const valueIsOptimised = (_a = window.MotionHasOptimisedAnimation) === null || _a === void 0 ? void 0 : _a.call(window, appearId, valueName);
10211      const externalAnimationValue = (_b = visualElement.props.values) === null || _b === void 0 ? void 0 : _b[valueName];
10212      if (!valueIsOptimised || !externalAnimationValue)
10213        return;
10214      const removeSyncCheck = value.on("change", (latestValue) => {
10215        var _a2;
10216        if (externalAnimationValue.get() !== latestValue) {
10217          (_a2 = window.MotionCancelOptimisedAnimation) === null || _a2 === void 0 ? void 0 : _a2.call(window, appearId, valueName);
10218          removeSyncCheck();
10219        }
10220      });
10221      return removeSyncCheck;
10222    };
10223  }
10224  const startAnimation = () => {
10225    readyAnimation.cancel();
10226    const appearAnimation = startWaapiAnimation(element, name, keyframes2, options);
10227    if (startFrameTime === void 0) {
10228      startFrameTime = performance.now();
10229    }
10230    appearAnimation.startTime = startFrameTime;
10231    appearAnimationStore.set(storeId, {
10232      animation: appearAnimation,
10233      startTime: startFrameTime
10234    });
10235    if (onReady)
10236      onReady(appearAnimation);
10237  };
10238  appearComplete.set(id4, false);
10239  if (readyAnimation.ready) {
10240    readyAnimation.ready.then(startAnimation).catch(noop);
10241  } else {
10242    startAnimation();
10243  }
10244}
10245var import_dist1033 = __toESM(require_dist(), 1);
10246var import_dist1034 = __toESM(require_dist2(), 1);
10247var import_dist1035 = __toESM(require_dist3(), 1);
10248var import_react43 = __toESM(require_react(), 1);
10249var createObject = () => ({});
10250var StateVisualElement = class extends VisualElement {
10251  constructor() {
10252    super(...arguments);
10253    this.measureInstanceViewportBox = createBox;
10254  }
10255  build() {
10256  }
10257  resetTransform() {
10258  }
10259  restoreTransform() {
10260  }
10261  removeValueFromRenderState() {
10262  }
10263  renderInstance() {
10264  }
10265  scrapeMotionValuesFromProps() {
10266    return createObject();
10267  }
10268  getBaseTargetFromProps() {
10269    return void 0;
10270  }
10271  readValueFromInstance(_state, key, options) {
10272    return options.initialState[key] || 0;
10273  }
10274  sortInstanceNodePosition() {
10275    return 0;
10276  }
10277};
10278var useVisualState = makeUseVisualState({
10279  scrapeMotionValuesFromProps: createObject,
10280  createRenderState: createObject
10281});
10282function useAnimatedState(initialState) {
10283  const [animationState, setAnimationState] = (0, import_react43.useState)(initialState);
10284  const visualState = useVisualState({}, false);
10285  const element = useConstant(() => {
10286    return new StateVisualElement({
10287      props: {
10288        onUpdate: (v) => {
10289          setAnimationState({ ...v });
10290        }
10291      },
10292      visualState,
10293      presenceContext: null
10294    }, { initialState });
10295  });
10296  (0, import_react43.useLayoutEffect)(() => {
10297    element.mount({});
10298    return () => element.unmount();
10299  }, [element]);
10300  const startAnimation = useConstant(() => (animationDefinition) => {
10301    return animateVisualElement(element, animationDefinition);
10302  });
10303  return [animationState, startAnimation];
10304}
10305var import_dist1036 = __toESM(require_dist(), 1);
10306var import_dist1037 = __toESM(require_dist2(), 1);
10307var import_dist1038 = __toESM(require_dist3(), 1);
10308var import_jsx_runtime9 = __toESM(require_jsx_runtime(), 1);
10309var React3 = __toESM(require_react(), 1);
10310var id3 = 0;
10311var AnimateSharedLayout = ({ children }) => {
10312  React3.useEffect(() => {
10313    invariant(false, "AnimateSharedLayout is deprecated: https://www.framer.com/docs/guide-upgrade/##shared-layout-animations");
10314  }, []);
10315  return (0, import_jsx_runtime9.jsx)(LayoutGroup, { id: useConstant(() => `asl-${id3++}`), children });
10316};
10317var import_dist1039 = __toESM(require_dist(), 1);
10318var import_dist1040 = __toESM(require_dist2(), 1);
10319var import_dist1041 = __toESM(require_dist3(), 1);
10320var import_react44 = __toESM(require_react(), 1);
10321var maxScale = 1e5;
10322var invertScale = (scale2) => scale2 > 1e-3 ? 1 / scale2 : maxScale;
10323var hasWarned = false;
10324function useInvertedScale(scale2) {
10325  let parentScaleX = useMotionValue(1);
10326  let parentScaleY = useMotionValue(1);
10327  const { visualElement } = (0, import_react44.useContext)(MotionContext);
10328  invariant(!!(scale2 || visualElement), "If no scale values are provided, useInvertedScale must be used within a child of another motion component.");
10329  warning(hasWarned, "useInvertedScale is deprecated and will be removed in 3.0. Use the layout prop instead.");
10330  hasWarned = true;
10331  if (scale2) {
10332    parentScaleX = scale2.scaleX || parentScaleX;
10333    parentScaleY = scale2.scaleY || parentScaleY;
10334  } else if (visualElement) {
10335    parentScaleX = visualElement.getValue("scaleX", 1);
10336    parentScaleY = visualElement.getValue("scaleY", 1);
10337  }
10338  const scaleX = useTransform(parentScaleX, invertScale);
10339  const scaleY = useTransform(parentScaleY, invertScale);
10340  return { scaleX, scaleY };
10341}
10342var namespace_exports = {};
10343__export(namespace_exports, {
10344  Group: () => ReorderGroup,
10345  Item: () => ReorderItem
10346});
10347var import_dist1054 = __toESM(require_dist(), 1);
10348var import_dist1055 = __toESM(require_dist2(), 1);
10349var import_dist1056 = __toESM(require_dist3(), 1);
10350var import_dist1048 = __toESM(require_dist(), 1);
10351var import_dist1049 = __toESM(require_dist2(), 1);
10352var import_dist1050 = __toESM(require_dist3(), 1);
10353var import_jsx_runtime10 = __toESM(require_jsx_runtime(), 1);
10354var import_react46 = __toESM(require_react(), 1);
10355var import_dist1042 = __toESM(require_dist(), 1);
10356var import_dist1043 = __toESM(require_dist2(), 1);
10357var import_dist1044 = __toESM(require_dist3(), 1);
10358var import_react45 = __toESM(require_react(), 1);
10359var ReorderContext = (0, import_react45.createContext)(null);
10360var import_dist1045 = __toESM(require_dist(), 1);
10361var import_dist1046 = __toESM(require_dist2(), 1);
10362var import_dist1047 = __toESM(require_dist3(), 1);
10363function checkReorder(order, value, offset, velocity) {
10364  if (!velocity)
10365    return order;
10366  const index = order.findIndex((item2) => item2.value === value);
10367  if (index === -1)
10368    return order;
10369  const nextOffset = velocity > 0 ? 1 : -1;
10370  const nextItem = order[index + nextOffset];
10371  if (!nextItem)
10372    return order;
10373  const item = order[index];
10374  const nextLayout = nextItem.layout;
10375  const nextItemCenter = mixNumber(nextLayout.min, nextLayout.max, 0.5);
10376  if (nextOffset === 1 && item.layout.max + offset > nextItemCenter || nextOffset === -1 && item.layout.min + offset < nextItemCenter) {
10377    return moveItem(order, index, index + nextOffset);
10378  }
10379  return order;
10380}
10381function ReorderGroupComponent({ children, as = "ul", axis = "y", onReorder, values, ...props }, externalRef) {
10382  const Component3 = useConstant(() => motion[as]);
10383  const order = [];
10384  const isReordering = (0, import_react46.useRef)(false);
10385  invariant(Boolean(values), "Reorder.Group must be provided a values prop");
10386  const context = {
10387    axis,
10388    registerItem: (value, layout2) => {
10389      const idx = order.findIndex((entry) => value === entry.value);
10390      if (idx !== -1) {
10391        order[idx].layout = layout2[axis];
10392      } else {
10393        order.push({ value, layout: layout2[axis] });
10394      }
10395      order.sort(compareMin);
10396    },
10397    updateOrder: (item, offset, velocity) => {
10398      if (isReordering.current)
10399        return;
10400      const newOrder = checkReorder(order, item, offset, velocity);
10401      if (order !== newOrder) {
10402        isReordering.current = true;
10403        onReorder(newOrder.map(getValue).filter((value) => values.indexOf(value) !== -1));
10404      }
10405    }
10406  };
10407  (0, import_react46.useEffect)(() => {
10408    isReordering.current = false;
10409  });
10410  return (0, import_jsx_runtime10.jsx)(Component3, { ...props, ref: externalRef, ignoreStrict: true, children: (0, import_jsx_runtime10.jsx)(ReorderContext.Provider, { value: context, children }) });
10411}
10412var ReorderGroup = (0, import_react46.forwardRef)(ReorderGroupComponent);
10413function getValue(item) {
10414  return item.value;
10415}
10416function compareMin(a, b) {
10417  return a.layout.min - b.layout.min;
10418}
10419var import_dist1051 = __toESM(require_dist(), 1);
10420var import_dist1052 = __toESM(require_dist2(), 1);
10421var import_dist1053 = __toESM(require_dist3(), 1);
10422var import_jsx_runtime11 = __toESM(require_jsx_runtime(), 1);
10423var import_react47 = __toESM(require_react(), 1);
10424function useDefaultMotionValue(value, defaultValue = 0) {
10425  return isMotionValue(value) ? value : useMotionValue(defaultValue);
10426}
10427function ReorderItemComponent({ children, style = {}, value, as = "li", onDrag, layout: layout2 = true, ...props }, externalRef) {
10428  const Component3 = useConstant(() => motion[as]);
10429  const context = (0, import_react47.useContext)(ReorderContext);
10430  const point2 = {
10431    x: useDefaultMotionValue(style.x),
10432    y: useDefaultMotionValue(style.y)
10433  };
10434  const zIndex = useTransform([point2.x, point2.y], ([latestX, latestY]) => latestX || latestY ? 1 : "unset");
10435  invariant(Boolean(context), "Reorder.Item must be a child of Reorder.Group");
10436  const { axis, registerItem, updateOrder } = context;
10437  return (0, import_jsx_runtime11.jsx)(Component3, { drag: axis, ...props, dragSnapToOrigin: true, style: { ...style, x: point2.x, y: point2.y, zIndex }, layout: layout2, onDrag: (event, gesturePoint) => {
10438    const { velocity } = gesturePoint;
10439    velocity[axis] && updateOrder(value, point2[axis].get(), velocity[axis]);
10440    onDrag && onDrag(event, gesturePoint);
10441  }, onLayoutMeasure: (measured) => registerItem(value, measured), ref: externalRef, ignoreStrict: true, children });
10442}
10443var ReorderItem = (0, import_react47.forwardRef)(ReorderItemComponent);
10444var import_dist1057 = __toESM(require_dist(), 1);
10445var import_dist1058 = __toESM(require_dist2(), 1);
10446var import_dist1059 = __toESM(require_dist3(), 1);
10447function getOriginIndex(from, total) {
10448  if (from === "first") {
10449    return 0;
10450  } else {
10451    const lastIndex = total - 1;
10452    return from === "last" ? lastIndex : lastIndex / 2;
10453  }
10454}
10455function stagger(duration = 0.1, { startDelay = 0, from = 0, ease: ease2 } = {}) {
10456  return (i, total) => {
10457    const fromIndex = typeof from === "number" ? from : getOriginIndex(from, total);
10458    const distance2 = Math.abs(fromIndex - i);
10459    let delay2 = duration * distance2;
10460    if (ease2) {
10461      const maxDelay = total * duration;
10462      const easingFunction = easingDefinitionToFunction(ease2);
10463      delay2 = easingFunction(delay2 / maxDelay) * maxDelay;
10464    }
10465    return startDelay + delay2;
10466  };
10467}
10468var import_dist1060 = __toESM(require_dist(), 1);
10469var import_dist1061 = __toESM(require_dist2(), 1);
10470var import_dist1062 = __toESM(require_dist3(), 1);
10471var sync = frame;
10472var cancelSync = stepsOrder.reduce((acc, key) => {
10473  acc[key] = (process2) => cancelFrame(process2);
10474  return acc;
10475}, {});
10476var import_dist1063 = __toESM(require_dist(), 1);
10477var import_dist1064 = __toESM(require_dist2(), 1);
10478var import_dist1065 = __toESM(require_dist3(), 1);
10479function steps(numSteps, direction = "end") {
10480  return (progress2) => {
10481    progress2 = direction === "end" ? Math.min(progress2, 0.999) : Math.max(progress2, 1e-3);
10482    const expanded = progress2 * numSteps;
10483    const rounded = direction === "end" ? Math.floor(expanded) : Math.ceil(expanded);
10484    return clamp(0, 1, rounded / numSteps);
10485  };
10486}
10487export {
10488  AcceleratedAnimation,
10489  AnimatePresence,
10490  AnimateSharedLayout,
10491  DeprecatedLayoutGroupContext,
10492  DragControls,
10493  FlatTree,
10494  LayoutGroup,
10495  LayoutGroupContext,
10496  LazyMotion,
10497  MotionConfig,
10498  MotionConfigContext,
10499  MotionContext,
10500  MotionGlobalConfig,
10501  MotionValue,
10502  PresenceContext,
10503  namespace_exports as Reorder,
10504  SwitchLayoutGroupContext,
10505  VisualElement,
10506  addPointerEvent,
10507  addPointerInfo,
10508  addScaleCorrector,
10509  animate,
10510  animateMini,
10511  animateValue,
10512  animateVisualElement,
10513  animationControls,
10514  animations,
10515  anticipate,
10516  backIn,
10517  backInOut,
10518  backOut,
10519  buildTransform,
10520  calcLength,
10521  cancelFrame,
10522  cancelSync,
10523  circIn,
10524  circInOut,
10525  circOut,
10526  clamp,
10527  color,
10528  complex,
10529  createBox,
10530  createRendererMotionComponent,
10531  createScopedAnimate,
10532  cubicBezier,
10533  delay,
10534  disableInstantTransitions,
10535  distance,
10536  distance2D,
10537  domAnimation,
10538  domMax,
10539  domMin,
10540  easeIn,
10541  easeInOut,
10542  easeOut,
10543  filterProps,
10544  findSpring,
10545  frame,
10546  frameData,
10547  frameSteps,
10548  inView,
10549  inertia,
10550  interpolate,
10551  invariant,
10552  isBrowser,
10553  isDragActive,
10554  isMotionComponent,
10555  isMotionValue,
10556  isValidMotionProp,
10557  keyframes,
10558  m,
10559  makeUseVisualState,
10560  mirrorEasing,
10561  mix,
10562  motion,
10563  motionValue,
10564  noop,
10565  optimizedAppearDataAttribute,
10566  pipe,
10567  progress,
10568  px,
10569  resolveMotionValue,
10570  reverseEasing,
10571  scroll,
10572  scrollInfo,
10573  spring,
10574  stagger,
10575  startOptimizedAppearAnimation,
10576  steps,
10577  sync,
10578  time,
10579  transform,
10580  unwrapMotionComponent,
10581  useAnimate,
10582  useAnimateMini,
10583  useAnimation,
10584  useAnimationControls,
10585  useAnimationFrame,
10586  useCycle,
10587  useAnimatedState as useDeprecatedAnimatedState,
10588  useInvertedScale as useDeprecatedInvertedScale,
10589  useDomEvent,
10590  useDragControls,
10591  useElementScroll,
10592  useForceUpdate,
10593  useInView,
10594  useInstantLayoutTransition,
10595  useInstantTransition,
10596  useIsPresent,
10597  useIsomorphicLayoutEffect,
10598  useMotionTemplate,
10599  useMotionValue,
10600  useMotionValueEvent,
10601  usePresence,
10602  useReducedMotion,
10603  useReducedMotionConfig,
10604  useResetProjection,
10605  useScroll,
10606  useSpring,
10607  useTime,
10608  useTransform,
10609  useUnmountEffect,
10610  useVelocity,
10611  useViewportScroll,
10612  useWillChange,
10613  visualElementStore,
10614  wrap
10615};
10616
10617//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZyYW1lci1tb3Rpb24uanM/dj1iZjc2MzMzMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX19idWZmZXJfcG9seWZpbGwgZnJvbSAndml0ZS1wbHVnaW4tbm9kZS1wb2x5ZmlsbHMvc2hpbXMvYnVmZmVyJ1xuZ2xvYmFsVGhpcy5CdWZmZXIgPSBnbG9iYWxUaGlzLkJ1ZmZlciB8fCBfX2J1ZmZlcl9wb2x5ZmlsbFxuaW1wb3J0IF9fZ2xvYmFsX3BvbHlmaWxsIGZyb20gJ3ZpdGUtcGx1Z2luLW5vZGUtcG9seWZpbGxzL3NoaW1zL2dsb2JhbCdcbmdsb2JhbFRoaXMuZ2xvYmFsID0gZ2xvYmFsVGhpcy5nbG9iYWwgfHwgX19nbG9iYWxfcG9seWZpbGxcbmltcG9ydCBfX3Byb2Nlc3NfcG9seWZpbGwgZnJvbSAndml0ZS1wbHVnaW4tbm9kZS1wb2x5ZmlsbHMvc2hpbXMvcHJvY2Vzcydcbmdsb2JhbFRoaXMucHJvY2VzcyA9IGdsb2JhbFRoaXMucHJvY2VzcyB8fCBfX3Byb2Nlc3NfcG9seWZpbGxcblxuXCJ1c2UgY2xpZW50XCI7XG5pbXBvcnQge1xuICByZXF1aXJlX2pzeF9ydW50aW1lXG59IGZyb20gXCIuL2NodW5rLURJRkNHRE9aLmpzXCI7XG5pbXBvcnQge1xuICByZXF1aXJlX3JlYWN0XG59IGZyb20gXCIuL2NodW5rLU9MQ1JSM0gyLmpzXCI7XG5pbXBvcnQge1xuICBfX2NvbW1vbkpTLFxuICBfX2V4cG9ydCxcbiAgX190b0VTTSxcbiAgcmVxdWlyZV9kaXN0LFxuICByZXF1aXJlX2Rpc3QyLFxuICByZXF1aXJlX2Rpc3QzXG59IGZyb20gXCIuL2NodW5rLUNVUk5GWlJSLmpzXCI7XG5cbi8vIG9wdGlvbmFsLXBlZXItZGVwOl9fdml0ZS1vcHRpb25hbC1wZWVyLWRlcDpAZW1vdGlvbi9pcy1wcm9wLXZhbGlkOmZyYW1lci1tb3Rpb25cbnZhciByZXF1aXJlX2lzX3Byb3BfdmFsaWRfZnJhbWVyX21vdGlvbiA9IF9fY29tbW9uSlMoe1xuICBcIm9wdGlvbmFsLXBlZXItZGVwOl9fdml0ZS1vcHRpb25hbC1wZWVyLWRlcDpAZW1vdGlvbi9pcy1wcm9wLXZhbGlkOmZyYW1lci1tb3Rpb25cIigpIHtcbiAgICB2YXIgaW1wb3J0X2Rpc3QxMDY5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSk7XG4gICAgdmFyIGltcG9ydF9kaXN0MTA3MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpKTtcbiAgICB2YXIgaW1wb3J0X2Rpc3QxMDcxID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCkpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IHJlc29sdmUgXCJAZW1vdGlvbi9pcy1wcm9wLXZhbGlkXCIgaW1wb3J0ZWQgYnkgXCJmcmFtZXItbW90aW9uXCIuIElzIGl0IGluc3RhbGxlZD9gKTtcbiAgfVxufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2luZGV4Lm1qc1xudmFyIGltcG9ydF9kaXN0MTA2NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTA2NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwNjggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2NvbXBvbmVudHMvQW5pbWF0ZVByZXNlbmNlL2luZGV4Lm1qc1xudmFyIGltcG9ydF9kaXN0MzEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDMyID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW1wb3J0X2pzeF9ydW50aW1lMyA9IF9fdG9FU00ocmVxdWlyZV9qc3hfcnVudGltZSgpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3QxMCA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvY29udGV4dC9MYXlvdXRHcm91cENvbnRleHQubWpzXG52YXIgaW1wb3J0X2Rpc3QgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGltcG9ydF9yZWFjdCA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcbnZhciBMYXlvdXRHcm91cENvbnRleHQgPSAoMCwgaW1wb3J0X3JlYWN0LmNyZWF0ZUNvbnRleHQpKHt9KTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvdXNlLWNvbnN0YW50Lm1qc1xudmFyIGltcG9ydF9kaXN0NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW1wb3J0X3JlYWN0MiA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcbmZ1bmN0aW9uIHVzZUNvbnN0YW50KGluaXQpIHtcbiAgY29uc3QgcmVmID0gKDAsIGltcG9ydF9yZWFjdDIudXNlUmVmKShudWxsKTtcbiAgaWYgKHJlZi5jdXJyZW50ID09PSBudWxsKSB7XG4gICAgcmVmLmN1cnJlbnQgPSBpbml0KCk7XG4gIH1cbiAgcmV0dXJuIHJlZi5jdXJyZW50O1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9jb21wb25lbnRzL0FuaW1hdGVQcmVzZW5jZS9QcmVzZW5jZUNoaWxkLm1qc1xudmFyIGltcG9ydF9kaXN0MTYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0MTggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW1wb3J0X2pzeF9ydW50aW1lMiA9IF9fdG9FU00ocmVxdWlyZV9qc3hfcnVudGltZSgpLCAxKTtcbnZhciBSZWFjdDIgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSwgMSk7XG52YXIgaW1wb3J0X3JlYWN0NiA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvY29udGV4dC9QcmVzZW5jZUNvbnRleHQubWpzXG52YXIgaW1wb3J0X2Rpc3Q3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3QzID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksIDEpO1xudmFyIFByZXNlbmNlQ29udGV4dCA9ICgwLCBpbXBvcnRfcmVhY3QzLmNyZWF0ZUNvbnRleHQpKG51bGwpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9jb21wb25lbnRzL0FuaW1hdGVQcmVzZW5jZS9Qb3BDaGlsZC5tanNcbnZhciBpbXBvcnRfZGlzdDEzID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxNCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGltcG9ydF9qc3hfcnVudGltZSA9IF9fdG9FU00ocmVxdWlyZV9qc3hfcnVudGltZSgpLCAxKTtcbnZhciBSZWFjdCA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3Q1ID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9jb250ZXh0L01vdGlvbkNvbmZpZ0NvbnRleHQubWpzXG52YXIgaW1wb3J0X2Rpc3QxMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3Q0ID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksIDEpO1xudmFyIE1vdGlvbkNvbmZpZ0NvbnRleHQgPSAoMCwgaW1wb3J0X3JlYWN0NC5jcmVhdGVDb250ZXh0KSh7XG4gIHRyYW5zZm9ybVBhZ2VQb2ludDogKHApID0+IHAsXG4gIGlzU3RhdGljOiBmYWxzZSxcbiAgcmVkdWNlZE1vdGlvbjogXCJuZXZlclwiXG59KTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvY29tcG9uZW50cy9BbmltYXRlUHJlc2VuY2UvUG9wQ2hpbGQubWpzXG52YXIgUG9wQ2hpbGRNZWFzdXJlID0gY2xhc3MgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5wcm9wcy5jaGlsZFJlZi5jdXJyZW50O1xuICAgIGlmIChlbGVtZW50ICYmIHByZXZQcm9wcy5pc1ByZXNlbnQgJiYgIXRoaXMucHJvcHMuaXNQcmVzZW50KSB7XG4gICAgICBjb25zdCBzaXplID0gdGhpcy5wcm9wcy5zaXplUmVmLmN1cnJlbnQ7XG4gICAgICBzaXplLmhlaWdodCA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDA7XG4gICAgICBzaXplLndpZHRoID0gZWxlbWVudC5vZmZzZXRXaWR0aCB8fCAwO1xuICAgICAgc2l6ZS50b3AgPSBlbGVtZW50Lm9mZnNldFRvcDtcbiAgICAgIHNpemUubGVmdCA9IGVsZW1lbnQub2Zmc2V0TGVmdDtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgLyoqXG4gICAqIFJlcXVpcmVkIHdpdGggZ2V0U25hcHNob3RCZWZvcmVVcGRhdGUgdG8gc3RvcCBSZWFjdCBjb21wbGFpbmluZy5cbiAgICovXG4gIGNvbXBvbmVudERpZFVwZGF0ZSgpIHtcbiAgfVxuICByZW5kZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMuY2hpbGRyZW47XG4gIH1cbn07XG5mdW5jdGlvbiBQb3BDaGlsZCh7IGNoaWxkcmVuLCBpc1ByZXNlbnQ6IGlzUHJlc2VudDIgfSkge1xuICBjb25zdCBpZDQgPSAoMCwgaW1wb3J0X3JlYWN0NS51c2VJZCkoKTtcbiAgY29uc3QgcmVmID0gKDAsIGltcG9ydF9yZWFjdDUudXNlUmVmKShudWxsKTtcbiAgY29uc3Qgc2l6ZSA9ICgwLCBpb
10617XBvcnRfcmVhY3Q1LnVzZVJlZikoe1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMCxcbiAgICB0b3A6IDAsXG4gICAgbGVmdDogMFxuICB9KTtcbiAgY29uc3QgeyBub25jZSB9ID0gKDAsIGltcG9ydF9yZWFjdDUudXNlQ29udGV4dCkoTW90aW9uQ29uZmlnQ29udGV4dCk7XG4gICgwLCBpbXBvcnRfcmVhY3Q1LnVzZUluc2VydGlvbkVmZmVjdCkoKCkgPT4ge1xuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCwgdG9wLCBsZWZ0IH0gPSBzaXplLmN1cnJlbnQ7XG4gICAgaWYgKGlzUHJlc2VudDIgfHwgIXJlZi5jdXJyZW50IHx8ICF3aWR0aCB8fCAhaGVpZ2h0KVxuICAgICAgcmV0dXJuO1xuICAgIHJlZi5jdXJyZW50LmRhdGFzZXQubW90aW9uUG9wSWQgPSBpZDQ7XG4gICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gICAgaWYgKG5vbmNlKVxuICAgICAgc3R5bGUubm9uY2UgPSBub25jZTtcbiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlKTtcbiAgICBpZiAoc3R5bGUuc2hlZXQpIHtcbiAgICAgIHN0eWxlLnNoZWV0Lmluc2VydFJ1bGUoYFxuICAgICAgICAgIFtkYXRhLW1vdGlvbi1wb3AtaWQ9XCIke2lkNH1cIl0ge1xuICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgICAgICAgICB3aWR0aDogJHt3aWR0aH1weCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgaGVpZ2h0OiAke2hlaWdodH1weCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgdG9wOiAke3RvcH1weCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgbGVmdDogJHtsZWZ0fXB4ICFpbXBvcnRhbnQ7XG4gICAgICAgICAgfVxuICAgICAgICBgKTtcbiAgICB9XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LmhlYWQucmVtb3ZlQ2hpbGQoc3R5bGUpO1xuICAgIH07XG4gIH0sIFtpc1ByZXNlbnQyXSk7XG4gIHJldHVybiAoMCwgaW1wb3J0X2pzeF9ydW50aW1lLmpzeCkoUG9wQ2hpbGRNZWFzdXJlLCB7IGlzUHJlc2VudDogaXNQcmVzZW50MiwgY2hpbGRSZWY6IHJlZiwgc2l6ZVJlZjogc2l6ZSwgY2hpbGRyZW46IFJlYWN0LmNsb25lRWxlbWVudChjaGlsZHJlbiwgeyByZWYgfSkgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2NvbXBvbmVudHMvQW5pbWF0ZVByZXNlbmNlL1ByZXNlbmNlQ2hpbGQubWpzXG52YXIgUHJlc2VuY2VDaGlsZCA9ICh7IGNoaWxkcmVuLCBpbml0aWFsLCBpc1ByZXNlbnQ6IGlzUHJlc2VudDIsIG9uRXhpdENvbXBsZXRlLCBjdXN0b20sIHByZXNlbmNlQWZmZWN0c0xheW91dCwgbW9kZSB9KSA9PiB7XG4gIGNvbnN0IHByZXNlbmNlQ2hpbGRyZW4gPSB1c2VDb25zdGFudChuZXdDaGlsZHJlbk1hcCk7XG4gIGNvbnN0IGlkNCA9ICgwLCBpb
10617XBvcnRfcmVhY3Q2LnVzZUlkKSgpO1xuICBjb25zdCBtZW1vaXplZE9uRXhpdENvbXBsZXRlID0gKDAsIGltcG9ydF9yZWFjdDYudXNlQ2FsbGJhY2spKChjaGlsZElkKSA9PiB7XG4gICAgcHJlc2VuY2VDaGlsZHJlbi5zZXQoY2hpbGRJZCwgdHJ1ZSk7XG4gICAgZm9yIChjb25zdCBpc0NvbXBsZXRlIG9mIHByZXNlbmNlQ2hpbGRyZW4udmFsdWVzKCkpIHtcbiAgICAgIGlmICghaXNDb21wbGV0ZSlcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBvbkV4aXRDb21wbGV0ZSAmJiBvbkV4aXRDb21wbGV0ZSgpO1xuICB9LCBbcHJlc2VuY2VDaGlsZHJlbiwgb25FeGl0Q29tcGxldGVdKTtcbiAgY29uc3QgY29udGV4dCA9ICgwLCBpbXBvcnRfcmVhY3Q2LnVzZU1lbW8pKFxuICAgICgpID0+ICh7XG4gICAgICBpZDogaWQ0LFxuICAgICAgaW5pdGlhbCxcbiAgICAgIGlzUHJlc2VudDogaXNQcmVzZW50MixcbiAgICAgIGN1c3RvbSxcbiAgICAgIG9uRXhpdENvbXBsZXRlOiBtZW1vaXplZE9uRXhpdENvbXBsZXRlLFxuICAgICAgcmVnaXN0ZXI6IChjaGlsZElkKSA9PiB7XG4gICAgICAgIHByZXNlbmNlQ2hpbGRyZW4uc2V0KGNoaWxkSWQsIGZhbHNlKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHByZXNlbmNlQ2hpbGRyZW4uZGVsZXRlKGNoaWxkSWQpO1xuICAgICAgfVxuICAgIH0pLFxuICAgIC8qKlxuICAgICAqIElmIHRoZSBwcmVzZW5jZSBvZiBhIGNoaWxkIGFmZmVjdHMgdGhlIGxheW91dCBvZiB0aGUgY29tcG9uZW50cyBhcm91bmQgaXQsXG4gICAgICogd2Ugd2FudCB0byBtYWtlIGEgbmV3IGNvbnRleHQgdmFsdWUgdG8gZW5zdXJlIHRoZXkgZ2V0IHJlLXJlbmRlcmVkXG4gICAgICogc28gdGhleSBjYW4gZGV0ZWN0IHRoYXQgbGF5b3V0IGNoYW5nZS5cbiAgICAgKi9cbiAgICBwcmVzZW5jZUFmZmVjdHNMYXlvdXQgPyBbTWF0aC5yYW5kb20oKSwgbWVtb2l6ZWRPbkV4aXRDb21wbGV0ZV0gOiBbaXNQcmVzZW50MiwgbWVtb2l6ZWRPbkV4aXRDb21wbGV0ZV1cbiAgKTtcbiAgKDAsIGltcG9ydF9yZWFjdDYudXNlTWVtbykoKCkgPT4ge1xuICAgIHByZXNlbmNlQ2hpbGRyZW4uZm9yRWFjaCgoXywga2V5KSA9PiBwcmVzZW5jZUNoaWxkcmVuLnNldChrZXksIGZhbHNlKSk7XG4gIH0sIFtpc1ByZXNlbnQyXSk7XG4gIFJlYWN0Mi51c2VFZmZlY3QoKCkgPT4ge1xuICAgICFpc1ByZXNlbnQyICYmICFwcmVzZW5jZUNoaWxkcmVuLnNpemUgJiYgb25FeGl0Q29tcGxldGUgJiYgb25FeGl0Q29tcGxldGUoKTtcbiAgfSwgW2lzUHJlc2VudDJdKTtcbiAgaWYgKG1vZGUgPT09IFwicG9wTGF5b3V0XCIpIHtcbiAgICBjaGlsZHJlbiA9ICgwLCBpbXBvcnRfanN4X3J1bnRpbWUyLmpzeCkoUG9wQ2hpbGQsIHsgaXNQcmVzZW50OiBpc1ByZXNlbnQyLCBjaGlsZHJlbiB9KTtcbiAgfVxuICByZXR1cm4gKDAsIGltcG9ydF9qc3hfcnVudGltZTIuanN4KShQcmVzZW5jZUNvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGNvbnRleHQsIGNoaWxkcmVuIH0pO1xufTtcbmZ1bmN0aW9uIG5ld0NoaWxkcmVuTWFwKCkge1xuICByZXR1cm4gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvY29tcG9uZW50cy9BbmltYXRlUHJlc2VuY2UvdXNlLXByZXNlbmNlLm1qc1xudmFyIGltcG9ydF9kaXN0MTkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDIwID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW1wb3J0X3JlYWN0NyA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcbmZ1bmN0aW9uIHVzZVByZXNlbmNlKHN1YnNjcmliZSA9IHRydWUpIHtcbiAgY29uc3QgY29udGV4dCA9ICgwLCBpb
10617XBvcnRfcmVhY3Q3LnVzZUNvbnRleHQpKFByZXNlbmNlQ29udGV4dCk7XG4gIGlmIChjb250ZXh0ID09PSBudWxsKVxuICAgIHJldHVybiBbdHJ1ZSwgbnVsbF07XG4gIGNvbnN0IHsgaXNQcmVzZW50OiBpc1ByZXNlbnQyLCBvbkV4aXRDb21wbGV0ZSwgcmVnaXN0ZXIgfSA9IGNvbnRleHQ7XG4gIGNvbnN0IGlkNCA9ICgwLCBpbXBvcnRfcmVhY3Q3LnVzZUlkKSgpO1xuICAoMCwgaW1wb3J0X3JlYWN0Ny51c2VFZmZlY3QpKCgpID0+IHtcbiAgICBpZiAoc3Vic2NyaWJlKVxuICAgICAgcmVnaXN0ZXIoaWQ0KTtcbiAgfSwgW3N1YnNjcmliZV0pO1xuICBjb25zdCBzYWZlVG9SZW1vdmUgPSAoMCwgaW1wb3J0X3JlYWN0Ny51c2VDYWxsYmFjaykoKCkgPT4gc3Vic2NyaWJlICYmIG9uRXhpdENvbXBsZXRlICYmIG9uRXhpdENvbXBsZXRlKGlkNCksIFtpZDQsIG9uRXhpdENvbXBsZXRlLCBzdWJzY3JpYmVdKTtcbiAgcmV0dXJuICFpc1ByZXNlbnQyICYmIG9uRXhpdENvbXBsZXRlID8gW2ZhbHNlLCBzYWZlVG9SZW1vdmVdIDogW3RydWVdO1xufVxuZnVuY3Rpb24gdXNlSXNQcmVzZW50KCkge1xuICByZXR1cm4gaXNQcmVzZW50KCgwLCBpbXBvcnRfcmVhY3Q3LnVzZUNvbnRleHQpKFByZXNlbmNlQ29udGV4dCkpO1xufVxuZnVuY3Rpb24gaXNQcmVzZW50KGNvbnRleHQpIHtcbiAgcmV0dXJuIGNvbnRleHQgPT09IG51bGwgPyB0cnVlIDogY29udGV4dC5pc1ByZXNlbnQ7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2NvbXBvbmVudHMvQW5pbWF0ZVByZXNlbmNlL3V0aWxzLm1qc1xudmFyIGltcG9ydF9kaXN0MjIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDIzID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW1wb3J0X3JlYWN0OCA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcbnZhciBnZXRDaGlsZEtleSA9IChjaGlsZCkgPT4gY2hpbGQua2V5IHx8IFwiXCI7XG5mdW5jdGlvbiBvbmx5RWxlbWVudHMoY2hpbGRyZW4pIHtcbiAgY29uc3QgZmlsdGVyZWQgPSBbXTtcbiAgaW1wb3J0X3JlYWN0OC5DaGlsZHJlbi5mb3JFYWNoKGNoaWxkcmVuLCAoY2hpbGQpID0+IHtcbiAgICBpZiAoKDAsIGltcG9ydF9yZWFjdDguaXNWYWxpZEVsZW1lbnQpKGNoaWxkKSlcbiAgICAgIGZpbHRlcmVkLnB1c2goY2hpbGQpO1xuICB9KTtcbiAgcmV0dXJuIGZpbHRlcmVkO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy91c2UtaXNvbW9ycGhpYy1lZmZlY3QubWpzXG52YXIgaW1wb3J0X2Rpc3QyOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3Q5ID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy9pcy1icm93c2VyLm1qc1xudmFyIGltcG9ydF9kaXN0MjUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDI2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIjtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvdXNlLWlzb21vcnBoaWMtZWZmZWN0Lm1qc1xudmFyIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QgPSBpc0Jyb3dzZXIgPyBpbXBvcnRfcmVhY3Q5LnVzZUxheW91dEVmZmVjdCA6IGltcG9ydF9yZWFjdDkudXNlRWZmZWN0O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9jb21wb25lbnRzL0FuaW1hdGVQcmVzZW5jZS9pbmRleC5tanNcbnZhciBBbmltYXRlUHJlc2VuY2UgPSAoeyBjaGlsZHJlbiwgY3VzdG9tLCBpbml0aWFsID0gdHJ1ZSwgb25FeGl0Q29tcGxldGUsIHByZXNlbmNlQWZmZWN0c0xheW91dCA9IHRydWUsIG1vZGUgPSBcInN5bmNcIiwgcHJvcGFnYXRlID0gZmFsc2UgfSkgPT4ge1xuICBjb25zdCBbaXNQYXJlbnRQcmVzZW50LCBzYWZlVG9SZW1vdmVdID0gdXNlUHJlc2VuY2UocHJvcGFnYXRlKTtcbiAgY29uc3QgcHJlc2VudENoaWxkcmVuID0gKDAsIGltcG9ydF9yZWFjdDEwLnVzZU1lbW8pKCgpID0+IG9ubHlFbGVtZW50cyhjaGlsZHJlbiksIFtjaGlsZHJlbl0pO1xuICBjb25zdCBwcmVzZW50S2V5cyA9IHByb3BhZ2F0ZSAmJiAhaXNQYXJlbnRQcmVzZW50ID8gW10gOiBwcmVzZW50Q2hpbGRyZW4ubWFwKGdldENoaWxkS2V5KTtcbiAgY29uc3QgaXNJbml0aWFsUmVuZGVyID0gKDAsIGltcG9ydF9yZWFjdDEwLnVzZVJlZikodHJ1ZSk7XG4gIGNvbnN0IHBlbmRpbmdQcmVzZW50Q2hpbGRyZW4gPSAoMCwgaW1wb3J0X3JlYWN0MTAudXNlUmVmKShwcmVzZW50Q2hpbGRyZW4pO1xuICBjb25zdCBleGl0Q29tcGxldGUgPSB1c2VDb25zdGFudCgoKSA9PiAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpKTtcbiAgY29uc3QgW2RpZmZlZENoaWxkcmVuLCBzZXREaWZmZWRDaGlsZHJlbl0gPSAoMCwgaW1wb3J0X3JlYWN0MTAudXNlU3RhdGUpKHByZXNlbnRDaGlsZHJlbik7XG4gIGNvbnN0IFtyZW5kZXJlZENoaWxkcmVuLCBzZXRSZW5kZXJlZENoaWxkcmVuXSA9ICgwLCBpb
10617XBvcnRfcmVhY3QxMC51c2VTdGF0ZSkocHJlc2VudENoaWxkcmVuKTtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgaXNJbml0aWFsUmVuZGVyLmN1cnJlbnQgPSBmYWxzZTtcbiAgICBwZW5kaW5nUHJlc2VudENoaWxkcmVuLmN1cnJlbnQgPSBwcmVzZW50Q2hpbGRyZW47XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZW5kZXJlZENoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBrZXkgPSBnZXRDaGlsZEtleShyZW5kZXJlZENoaWxkcmVuW2ldKTtcbiAgICAgIGlmICghcHJlc2VudEtleXMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICBpZiAoZXhpdENvbXBsZXRlLmdldChrZXkpICE9PSB0cnVlKSB7XG4gICAgICAgICAgZXhpdENvbXBsZXRlLnNldChrZXksIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhpdENvbXBsZXRlLmRlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgIH1cbiAgfSwgW3JlbmRlcmVkQ2hpbGRyZW4sIHByZXNlbnRLZXlzLmxlbmd0aCwgcHJlc2VudEtleXMuam9pbihcIi1cIildKTtcbiAgY29uc3QgZXhpdGluZ0NoaWxkcmVuID0gW107XG4gIGlmIChwcmVzZW50Q2hpbGRyZW4gIT09IGRpZmZlZENoaWxkcmVuKSB7XG4gICAgbGV0IG5leHRDaGlsZHJlbiA9IFsuLi5wcmVzZW50Q2hpbGRyZW5dO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVuZGVyZWRDaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgY2hpbGQgPSByZW5kZXJlZENoaWxkcmVuW2ldO1xuICAgICAgY29uc3Qga2V5ID0gZ2V0Q2hpbGRLZXkoY2hpbGQpO1xuICAgICAgaWYgKCFwcmVzZW50S2V5cy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgIG5leHRDaGlsZHJlbi5zcGxpY2UoaSwgMCwgY2hpbGQpO1xuICAgICAgICBleGl0aW5nQ2hpbGRyZW4ucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtb2RlID09PSBcIndhaXRcIiAmJiBleGl0aW5nQ2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICBuZXh0Q2hpbGRyZW4gPSBleGl0aW5nQ2hpbGRyZW47XG4gICAgfVxuICAgIHNldFJlbmRlcmVkQ2hpbGRyZW4ob25seUVsZW1lbnRzKG5leHRDaGlsZHJlbikpO1xuICAgIHNldERpZmZlZENoaWxkcmVuKHByZXNlbnRDaGlsZHJlbik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgbW9kZSA9PT0gXCJ3YWl0XCIgJiYgcmVuZGVyZWRDaGlsZHJlbi5sZW5ndGggPiAxKSB7XG4gICAgY29uc29sZS53YXJuKGBZb3UncmUgYXR0ZW1wdGluZyB0byBhbmltYXRlIG11bHRpcGxlIGNoaWxkcmVuIHdpdGhpbiBBbmltYXRlUHJlc2VuY2UsIGJ1dCBpdHMgbW9kZSBpcyBzZXQgdG8gXCJ3YWl0XCIuIFRoaXMgd2lsbCBsZWFkIHRvIG9kZCB2aXN1YWwgYmVoYXZpb3VyLmApO1xuICB9XG4gIGNvbnN0IHsgZm9yY2VSZW5kZXIgfSA9ICgwLCBpbXBvcnRfcmVhY3QxMC51c2VDb250ZXh0KShMYXlvdXRHcm91cENvbnRleHQpO1xuICByZXR1cm4gKDAsIGltcG9ydF9qc3hfcnVudGltZTMuanN4KShpbXBvcnRfanN4X3J1bnRpbWUzLkZyYWdtZW50LCB7IGNoaWxkcmVuOiByZW5kZXJlZENoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICBjb25zdCBrZXkgPSBnZXRDaGlsZEtleShjaGlsZCk7XG4gICAgY29uc3QgaXNQcmVzZW50MiA9IHByb3BhZ2F0ZSAmJiAhaXNQYXJlbnRQcmVzZW50ID8gZmFsc2UgOiBwcmVzZW50Q2hpbGRyZW4gPT09IHJlbmRlcmVkQ2hpbGRyZW4gfHwgcHJlc2VudEtleXMuaW5jbHVkZXMoa2V5KTtcbiAgICBjb25zdCBvbkV4aXQgPSAoKSA9PiB7XG4gICAgICBpZiAoZXhpdENvbXBsZXRlLmhhcyhrZXkpKSB7XG4gICAgICAgIGV4aXRDb21wbGV0ZS5zZXQoa2V5LCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGxldCBpc0V2ZXJ5RXhpdENvbXBsZXRlID0gdHJ1ZTtcbiAgICAgIGV4aXRDb21wbGV0ZS5mb3JFYWNoKChpc0V4aXRDb21wbGV0ZSkgPT4ge1xuICAgICAgICBpZiAoIWlzRXhpdENvbXBsZXRlKVxuICAgICAgICAgIGlzRXZlcnlFeGl0Q29tcGxldGUgPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGlzRXZlcnlFeGl0Q29tcGxldGUpIHtcbiAgICAgICAgZm9yY2VSZW5kZXIgPT09IG51bGwgfHwgZm9yY2VSZW5kZXIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGZvcmNlUmVuZGVyKCk7XG4gICAgICAgIHNldFJlbmRlcmVkQ2hpbGRyZW4ocGVuZGluZ1ByZXNlbnRDaGlsZHJlbi5jdXJyZW50KTtcbiAgICAgICAgcHJvcGFnYXRlICYmIChzYWZlVG9SZW1vdmUgPT09IG51bGwgfHwgc2FmZVRvUmVtb3ZlID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzYWZlVG9SZW1vdmUoKSk7XG4gICAgICAgIG9uRXhpdENvbXBsZXRlICYmIG9uRXhpdENvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gKDAsIGltcG9ydF9qc3hfcnVudGltZTMuanN4KShQcmVzZW5jZUNoaWxkLCB7IGlzUHJlc2VudDogaXNQcmVzZW50MiwgaW5pdGlhbDogIWlzSW5pdGlhbFJlbmRlci5jdXJyZW50IHx8IGluaXRpYWwgPyB2b2lkIDAgOiBmYWxzZSwgY3VzdG9tOiBpc1ByZXNlbnQyID8gdm9pZCAwIDogY3VzdG9tLCBwcmVzZW5jZUFmZmVjdHNMYXlvdXQsIG1vZGUsIG9uRXhpdENvbXBsZXRlOiBpc1ByZXNlbnQyID8gdm9pZCAwIDogb25FeGl0LCBjaGlsZHJlbjogY2hpbGQgfSwga2V5KTtcbiAgfSkgfSk7XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9jb21wb25lbnRzL0xheW91dEdyb3VwL2luZGV4Lm1qc1xudmFyIGltcG9ydF9kaXN0NzYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDc3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NzggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW1wb3J0X2pzeF9ydW50aW1lNCA9IF9fdG9FU00ocmVxdWlyZV9qc3hfcnVudGltZSgpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3QxNCA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvY29udGV4dC9EZXByZWNhdGVkTGF5b3V0R3JvdXBDb250ZXh0Lm1qc1xudmFyIGltcG9ydF9kaXN0MzQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0MzYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW1wb3J0X3JlYWN0MTEgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSwgMSk7XG52YXIgRGVwcmVjYXRlZExheW91dEdyb3VwQ29udGV4dCA9ICgwLCBpbXBvcnRfcmVhY3QxMS5jcmVhdGVDb250ZXh0KShudWxsKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvdXNlLWZvcmNlLXVwZGF0ZS5tanNcbnZhciBpbXBvcnRfZGlzdDcwID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcyID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGltcG9ydF9yZWFjdDEzID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy91c2UtaXMtbW91bnRlZC5tanNcbnZhciBpbXBvcnRfZGlzdDM3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGltcG9ydF9yZWFjdDEyID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksIDEpO1xuZnVuY3Rpb24gdXNlSXNNb3VudGVkKCkge1xuICBjb25zdCBpc01vdW50ZWQgPSAoMCwgaW1wb3J0X3JlYWN0MTIudXNlUmVmKShmYWxzZSk7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoKCkgPT4ge1xuICAgIGlzTW91bnRlZC5jdXJyZW50ID0gdHJ1ZTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgaXNNb3VudGVkLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiBpc01vdW50ZWQ7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2ZyYW1lbG9vcC9mcmFtZS5tanNcbnZhciBpbXBvcnRfZGlzdDY3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q2OCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vbW90aW9uLXV0aWxzQDExLjE4LjEvbm9kZV9tb2R1bGVzL21vdGlvbi11dGlscy9kaXN0L2VzL2luZGV4Lm1qc1xudmFyIGltcG9ydF9kaXN0NTUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDU2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tdXRpbHNAMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLXV0aWxzL2Rpc3QvZXMvZXJyb3JzLm1qc1xudmFyIGltcG9ydF9kaXN0NDMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDQ0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tdXRpbHNAMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLXV0aWxzL2Rpc3QvZXMvbm9vcC5tanNcbnZhciBpbXBvcnRfZGlzdDQwID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDQyID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIG5vb3AgPSAoYW55KSA9PiBhbnk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tdXRpbHNAMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLXV0aWxzL2Rpc3QvZXMvZXJyb3JzLm1qc1xudmFyIHdhcm5pbmcgPSBub29wO1xudmFyIGludmFyaWFudCA9IG5vb3A7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gIHdhcm5pbmcgPSAoY2hlY2ssIG1lc3NhZ2UpID0+IHtcbiAgICBpZiAoIWNoZWNrICYmIHR5cGVvZiBjb25zb2xlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBjb25zb2xlLndhcm4obWVzc2FnZSk7XG4gICAgfVxuICB9O1xuICBpbnZhcmlhbnQgPSAoY2hlY2ssIG1lc3NhZ2UpID0+IHtcbiAgICBpZiAoIWNoZWNrKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vbW90aW9uLXV0aWxzQDExLjE4LjEvbm9kZV9tb2R1bGVzL21vdGlvbi11dGlscy9kaXN0L2VzL21lbW8ubWpzXG52YXIgaW1wb3J0X2Rpc3Q0NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0OCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIG1lbW8oY2FsbGJhY2spIHtcbiAgbGV0IHJlc3VsdDtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApXG4gICAgICByZXN1bHQgPSBjYWxsYmFjaygpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tdXRpbHNAMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLXV0aWxzL2Rpc3QvZXMvcHJvZ3Jlc3MubWpzXG52YXIgaW1wb3J0X2Rpc3Q0OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBwcm9ncmVzcyA9IChmcm9tLCB0bywgdmFsdWUpID0+IHtcbiAgY29uc3QgdG9Gcm9tRGlmZmVyZW5jZSA9IHRvIC0gZnJvbTtcbiAgcmV0dXJuIHRvRnJvbURpZmZlcmVuY2UgPT09IDAgPyAxIDogKHZhbHVlIC0gZnJvbSkgLyB0b0Zyb21EaWZmZXJlbmNlO1xufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi11dGlsc0AxMS4xOC4xL25vZGVfbW9kdWxlcy9tb3Rpb24tdXRpbHMvZGlzdC9lcy90aW1lLWNvbnZlcnNpb24ubWpzXG52YXIgaW1wb3J0X2Rpc3Q1MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBzZWNvbmRzVG9NaWxsaXNlY29uZHMgPSAoc2Vjb25kcykgPT4gc2Vjb25kcyAqIDFlMztcbnZhciBtaWxsaXNlY29uZHNUb1NlY29uZHMgPSAobWlsbGlzZWNvbmRzKSA9PiBtaWxsaXNlY29uZHMgLyAxZTM7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2ZyYW1lbG9vcC9iYXRjaGVyLm1qc1xudmFyIGltcG9ydF9kaXN0NjQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0NjYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3V0aWxzL0dsb2JhbENvbmZpZy5tanNcbnZhciBpbXBvcnRfZGlzdDU4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDYwID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIE1vdGlvbkdsb2JhbENvbmZpZyA9IHtcbiAgc2tpcEFuaW1hdGlvbnM6IGZhbHNlLFxuICB1c2VNYW51YWxUaW1pbmc6IGZhbHNlXG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9mcmFtZWxvb3AvcmVuZGVyLXN0ZXAubWpzXG52YXIgaW1wb3J0X2Rpc3Q2MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q2MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIGNyZWF0ZVJlbmRlclN0ZXAocnVuTmV4dEZyYW1lKSB7XG4gIGxldCB0aGlzRnJhbWUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBsZXQgbmV4dEZyYW1lID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgbGV0IGlzUHJvY2Vzc2luZyA9IGZhbHNlO1xuICBsZXQgZmx1c2hOZXh0RnJhbWUgPSBmYWxzZTtcbiAgY29uc3QgdG9LZWVwQWxpdmUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtTZXQoKTtcbiAgbGV0IGxhdGVzdEZyYW1lRGF0YSA9IHtcbiAgICBkZWx0YTogMCxcbiAgICB0aW1lc3RhbXA6IDAsXG4gICAgaXNQcm9jZXNzaW5nOiBmYWxzZVxuICB9O1xuICBmdW5jdGlvbiB0cmlnZ2VyQ2FsbGJhY2soY2FsbGJhY2spIHtcbiAgICBpZiAodG9LZWVwQWxpdmUuaGFzKGNhbGxiYWNrKSkge1xuICAgICAgc3RlcC5zY2hlZHVsZShjYWxsYmFjayk7XG4gICAgICBydW5OZXh0RnJhbWUoKTtcbiAgICB9XG4gICAgY2FsbGJhY2sobGF0ZXN0RnJhbWVEYXRhKTtcbiAgfVxuICBjb25zdCBzdGVwID0ge1xuICAgIC8qKlxuICAgICAqIFNjaGVkdWxlIGEgcHJvY2VzcyB0byBydW4gb24gdGhlIG5leHQgZnJhbWUuXG4gICAgICovXG4gICAgc2NoZWR1bGU6IChjYWxsYmFjaywga2VlcEFsaXZlID0gZmFsc2UsIGltbWVkaWF0ZSA9IGZhbHNlKSA9PiB7XG4gICAgICBjb25zdCBhZGRUb0N1cnJlbnRGcmFtZSA9IGltbWVkaWF0ZSAmJiBpc1Byb2Nlc3Npbmc7XG4gICAgICBjb25zdCBxdWV1ZSA9IGFkZFRvQ3VycmVudEZyYW1lID8gdGhpc0ZyYW1lIDogbmV4dEZyYW1lO1xuICAgICAgaWYgKGtlZXBBbGl2ZSlcbiAgICAgICAgdG9LZWVwQWxpdmUuYWRkKGNhbGxiYWNrKTtcbiAgICAgIGlmICghcXVldWUuaGFzKGNhbGxiYWNrKSlcbiAgICAgICAgcXVldWUuYWRkKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybiBjYWxsYmFjaztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENhbmNlbCB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgZnJvbSBydW5uaW5nIG9uIHRoZSBuZXh0IGZyYW1lLlxuICAgICAqL1xuICAgIGNhbmNlbDogKGNhbGxiYWNrKSA9PiB7XG4gICAgICBuZXh0RnJhbWUuZGVsZXRlKGNhbGxiYWNrKTtcbiAgICAgIHRvS2VlcEFsaXZlLmRlbGV0ZShjYWxsYmFjayk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBFeGVjdXRlIGFsbCBzY2hlZHVsZSBjYWxsYmFja3MuXG4gICAgICovXG4gICAgcHJvY2VzczogKGZyYW1lRGF0YTIpID0+IHtcbiAgICAgIGxhdGVzdEZyYW1lRGF0YSA9IGZyYW1lRGF0YTI7XG4gICAgICBpZiAoaXNQcm9jZXNzaW5nKSB7XG4gICAgICAgIGZsdXNoTmV4dEZyYW1lID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaXNQcm9jZXNzaW5nID0gdHJ1ZTtcbiAgICAgIFt0aGlzRnJhbWUsIG5leHRGcmFtZV0gPSBbbmV4dEZyYW1lLCB0aGlzRnJhbWVdO1xuICAgICAgdGhpc0ZyYW1lLmZvckVhY2godHJpZ2dlckNhbGxiYWNrKTtcbiAgICAgIHRoaXNGcmFtZS5jbGVhcigpO1xuICAgICAgaXNQcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICBpZiAoZmx1c2hOZXh0RnJhbWUpIHtcbiAgICAgICAgZmx1c2hOZXh0RnJhbWUgPSBmYWxzZTtcbiAgICAgICAgc3RlcC5wcm9jZXNzKGZyYW1lRGF0YTIpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHN0ZXA7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2ZyYW1lbG9vcC9iYXRjaGVyLm1qc1xudmFyIHN0ZXBzT3JkZXIgPSBbXG4gIFwicmVhZFwiLFxuICAvLyBSZWFkXG4gIFwicmVzb2x2ZUtleWZyYW1lc1wiLFxuICAvLyBXcml0ZS9SZWFkL1dyaXRlL1JlYWRcbiAgXCJ1cGRhdGVcIixcbiAgLy8gQ29tcHV0ZVxuICBcInByZVJlbmRlclwiLFxuICAvLyBDb21wdXRlXG4gIFwicmVuZGVyXCIsXG4gIC8vIFdyaXRlXG4gIFwicG9zdFJlbmRlclwiXG4gIC8vIENvbXB1dGVcbl07XG52YXIgbWF4RWxhcHNlZCA9IDQwO1xuZnVuY3Rpb24gY3JlYXRlUmVuZGVyQmF0Y2hlcihzY2hlZHVsZU5leHRCYXRjaCwgYWxsb3dLZWVw
10617QWxpdmUpIHtcbiAgbGV0IHJ1bk5leHRGcmFtZSA9IGZhbHNlO1xuICBsZXQgdXNlRGVmYXVsdEVsYXBzZWQgPSB0cnVlO1xuICBjb25zdCBzdGF0ZTIgPSB7XG4gICAgZGVsdGE6IDAsXG4gICAgdGltZXN0YW1wOiAwLFxuICAgIGlzUHJvY2Vzc2luZzogZmFsc2VcbiAgfTtcbiAgY29uc3QgZmxhZ1J1bk5leHRGcmFtZSA9ICgpID0+IHJ1bk5leHRGcmFtZSA9IHRydWU7XG4gIGNvbnN0IHN0ZXBzMiA9IHN0ZXBzT3JkZXIucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgIGFjY1trZXldID0gY3JlYXRlUmVuZGVyU3RlcChmbGFnUnVuTmV4dEZyYW1lKTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIGNvbnN0IHsgcmVhZCwgcmVzb2x2ZUtleWZyYW1lcywgdXBkYXRlLCBwcmVSZW5kZXIsIHJlbmRlciwgcG9zdFJlbmRlciB9ID0gc3RlcHMyO1xuICBjb25zdCBwcm9jZXNzQmF0Y2ggPSAoKSA9PiB7XG4gICAgY29uc3QgdGltZXN0YW1wID0gTW90aW9uR2xvYmFsQ29uZmlnLnVzZU1hbnVhbFRpbWluZyA/IHN0YXRlMi50aW1lc3RhbXAgOiBwZXJmb3JtYW5jZS5ub3coKTtcbiAgICBydW5OZXh0RnJhbWUgPSBmYWxzZTtcbiAgICBzdGF0ZTIuZGVsdGEgPSB1c2VEZWZhdWx0RWxhcHNlZCA/IDFlMyAvIDYwIDogTWF0aC5tYXgoTWF0aC5taW4odGltZXN0YW1wIC0gc3RhdGUyLnRpbWVzdGFtcCwgbWF4RWxhcHNlZCksIDEpO1xuICAgIHN0YXRlMi50aW1lc3RhbXAgPSB0aW1lc3RhbXA7XG4gICAgc3RhdGUyLmlzUHJvY2Vzc2luZyA9IHRydWU7XG4gICAgcmVhZC5wcm9jZXNzKHN0YXRlMik7XG4gICAgcmVzb2x2ZUtleWZyYW1lcy5wcm9jZXNzKHN0YXRlMik7XG4gICAgdXBkYXRlLnByb2Nlc3Moc3RhdGUyKTtcbiAgICBwcmVSZW5kZXIucHJvY2VzcyhzdGF0ZTIpO1xuICAgIHJlbmRlci5wcm9jZXNzKHN0YXRlMik7XG4gICAgcG9zdFJlbmRlci5wcm9jZXNzKHN0YXRlMik7XG4gICAgc3RhdGUyLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgIGlmIChydW5OZXh0RnJhbWUgJiYgYWxsb3dLZWVw
10617QWxpdmUpIHtcbiAgICAgIHVzZURlZmF1bHRFbGFwc2VkID0gZmFsc2U7XG4gICAgICBzY2hlZHVsZU5leHRCYXRjaChwcm9jZXNzQmF0Y2gpO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgd2FrZSA9ICgpID0+IHtcbiAgICBydW5OZXh0RnJhbWUgPSB0cnVlO1xuICAgIHVzZURlZmF1bHRFbGFwc2VkID0gdHJ1ZTtcbiAgICBpZiAoIXN0YXRlMi5pc1Byb2Nlc3NpbmcpIHtcbiAgICAgIHNjaGVkdWxlTmV4dEJhdGNoKHByb2Nlc3NCYXRjaCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBzY2hlZHVsZSA9IHN0ZXBzT3JkZXIucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgIGNvbnN0IHN0ZXAgPSBzdGVwczJba2V5XTtcbiAgICBhY2Nba2V5XSA9IChwcm9jZXNzMiwga2VlcEFsaXZlID0gZmFsc2UsIGltbWVkaWF0ZSA9IGZhbHNlKSA9PiB7XG4gICAgICBpZiAoIXJ1bk5leHRGcmFtZSlcbiAgICAgICAgd2FrZSgpO1xuICAgICAgcmV0dXJuIHN0ZXAuc2NoZWR1bGUocHJvY2VzczIsIGtlZXBBbGl2ZSwgaW1tZWRpYXRlKTtcbiAgICB9O1xuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgY29uc3QgY2FuY2VsID0gKHByb2Nlc3MyKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGVwc09yZGVyLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzdGVwczJbc3RlcHNPcmRlcltpXV0uY2FuY2VsKHByb2Nlc3MyKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB7IHNjaGVkdWxlLCBjYW5jZWwsIHN0YXRlOiBzdGF0ZTIsIHN0ZXBzOiBzdGVwczIgfTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvZnJhbWVsb29wL2ZyYW1lLm1qc1xudmFyIHsgc2NoZWR1bGU6IGZyYW1lLCBjYW5jZWw6IGNhbmNlbEZyYW1lLCBzdGF0ZTogZnJhbWVEYXRhLCBzdGVwczogZnJhbWVTdGVwcyB9ID0gY3JlYXRlUmVuZGVyQmF0Y2hlcih0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSBcInVuZGVmaW5lZFwiID8gcmVxdWVzdEFuaW1hdGlvbkZyYW1lIDogbm9vcCwgdHJ1ZSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3V0aWxzL3VzZS1mb3JjZS11cGRhdGUubWpzXG5mdW5jdGlvbiB1c2VGb3JjZVVwZGF0ZSgpIHtcbiAgY29uc3QgaXNNb3VudGVkID0gdXNlSXNNb3VudGVkKCk7XG4gIGNvbnN0IFtmb3JjZWRSZW5kZXJDb3VudCwgc2V0Rm9yY2VkUmVuZGVyQ291bnRdID0gKDAsIGltcG9ydF9yZWFjdDEzLnVzZVN0YXRlKSgwKTtcbiAgY29uc3QgZm9yY2VSZW5kZXIgPSAoMCwgaW1wb3J0X3JlYWN0MTMudXNlQ2FsbGJhY2spKCgpID0+IHtcbiAgICBpc01vdW50ZWQuY3VycmVudCAmJiBzZXRGb3JjZWRSZW5kZXJDb3VudChmb3JjZWRSZW5kZXJDb3VudCArIDEpO1xuICB9LCBbZm9yY2VkUmVuZGVyQ291bnRdKTtcbiAgY29uc3QgZGVmZXJyZWRGb3JjZVJlbmRlciA9ICgwLCBpb
10617XBvcnRfcmVhY3QxMy51c2VDYWxsYmFjaykoKCkgPT4gZnJhbWUucG9zdFJlbmRlcihmb3JjZVJlbmRlciksIFtmb3JjZVJlbmRlcl0pO1xuICByZXR1cm4gW2RlZmVycmVkRm9yY2VSZW5kZXIsIGZvcmNlZFJlbmRlckNvdW50XTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcHJvamVjdGlvbi9ub2RlL2dyb3VwLm1qc1xudmFyIGltcG9ydF9kaXN0NzMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDc0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NzUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgbm90aWZ5ID0gKG5vZGUpID0+ICFub2RlLmlzTGF5b3V0RGlydHkgJiYgbm9kZS53aWxsVXBkYXRlKGZhbHNlKTtcbmZ1bmN0aW9uIG5vZGVHcm91cCgpIHtcbiAgY29uc3Qgbm9kZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBjb25zdCBzdWJzY3JpcHRpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IGRpcnR5QWxsID0gKCkgPT4gbm9kZXMuZm9yRWFjaChub3RpZnkpO1xuICByZXR1cm4ge1xuICAgIGFkZDogKG5vZGUpID0+IHtcbiAgICAgIG5vZGVzLmFkZChub2RlKTtcbiAgICAgIHN1YnNjcmlwdGlvbnMuc2V0KG5vZGUsIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcIndpbGxVcGRhdGVcIiwgZGlydHlBbGwpKTtcbiAgICB9LFxuICAgIHJlbW92ZTogKG5vZGUpID0+IHtcbiAgICAgIG5vZGVzLmRlbGV0ZShub2RlKTtcbiAgICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gc3Vic2NyaXB0aW9ucy5nZXQobm9kZSk7XG4gICAgICBpZiAodW5zdWJzY3JpYmUpIHtcbiAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgc3Vic2NyaXB0aW9ucy5kZWxldGUobm9kZSk7XG4gICAgICB9XG4gICAgICBkaXJ0eUFsbCgpO1xuICAgIH0sXG4gICAgZGlydHk6IGRpcnR5QWxsXG4gIH07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2NvbXBvbmVudHMvTGF5b3V0R3JvdXAvaW5kZXgubWpzXG52YXIgc2hvdWxkSW5oZXJpdEdyb3VwID0gKGluaGVyaXQpID0+IGluaGVyaXQgPT09IHRydWU7XG52YXIgc2hvdWxkSW5oZXJpdElkID0gKGluaGVyaXQpID0+IHNob3VsZEluaGVyaXRHcm91cChpbmhlcml0ID09PSB0cnVlKSB8fCBpbmhlcml0ID09PSBcImlkXCI7XG52YXIgTGF5b3V0R3JvdXAgPSAoeyBjaGlsZHJlbiwgaWQ6IGlkNCwgaW5oZXJpdCA9IHRydWUgfSkgPT4ge1xuICBjb25zdCBsYXlvdXRHcm91cENvbnRleHQgPSAoMCwgaW1wb3J0X3JlYWN0MTQudXNlQ29udGV4dCkoTGF5b3V0R3JvdXBDb250ZXh0KTtcbiAgY29uc3QgZGVwcmVjYXRlZExheW91dEdyb3VwQ29udGV4dCA9ICgwLCBpb
10617XBvcnRfcmVhY3QxNC51c2VDb250ZXh0KShEZXByZWNhdGVkTGF5b3V0R3JvdXBDb250ZXh0KTtcbiAgY29uc3QgW2ZvcmNlUmVuZGVyLCBrZXldID0gdXNlRm9yY2VVcGRhdGUoKTtcbiAgY29uc3QgY29udGV4dCA9ICgwLCBpbXBvcnRfcmVhY3QxNC51c2VSZWYpKG51bGwpO1xuICBjb25zdCB1cHN0cmVhbUlkID0gbGF5b3V0R3JvdXBDb250ZXh0LmlkIHx8IGRlcHJlY2F0ZWRMYXlvdXRHcm91cENvbnRleHQ7XG4gIGlmIChjb250ZXh0LmN1cnJlbnQgPT09IG51bGwpIHtcbiAgICBpZiAoc2hvdWxkSW5oZXJpdElkKGluaGVyaXQpICYmIHVwc3RyZWFtSWQpIHtcbiAgICAgIGlkNCA9IGlkNCA/IHVwc3RyZWFtSWQgKyBcIi1cIiArIGlkNCA6IHVwc3RyZWFtSWQ7XG4gICAgfVxuICAgIGNvbnRleHQuY3VycmVudCA9IHtcbiAgICAgIGlkOiBpZDQsXG4gICAgICBncm91cDogc2hvdWxkSW5oZXJpdEdyb3VwKGluaGVyaXQpID8gbGF5b3V0R3JvdXBDb250ZXh0Lmdyb3VwIHx8IG5vZGVHcm91cCgpIDogbm9kZUdyb3VwKClcbiAgICB9O1xuICB9XG4gIGNvbnN0IG1lbW9pemVkQ29udGV4dCA9ICgwLCBpbXBvcnRfcmVhY3QxNC51c2VNZW1vKSgoKSA9PiAoeyAuLi5jb250ZXh0LmN1cnJlbnQsIGZvcmNlUmVuZGVyIH0pLCBba2V5XSk7XG4gIHJldHVybiAoMCwgaW1wb3J0X2pzeF9ydW50aW1lNC5qc3gpKExheW91dEdyb3VwQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogbWVtb2l6ZWRDb250ZXh0LCBjaGlsZHJlbiB9KTtcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2NvbXBvbmVudHMvTGF6eU1vdGlvbi9pbmRleC5tanNcbnZhciBpbXBvcnRfZGlzdDg4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDkwID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGltcG9ydF9qc3hfcnVudGltZTUgPSBfX3RvRVNNKHJlcXVpcmVfanN4X3J1bnRpbWUoKSwgMSk7XG52YXIgaW1wb3J0X3JlYWN0MTYgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2NvbnRleHQvTGF6eUNvbnRleHQubWpzXG52YXIgaW1wb3J0X2Rpc3Q3OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3QxNSA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcbnZhciBMYXp5Q29udGV4dCA9ICgwLCBpb
10617XBvcnRfcmVhY3QxNS5jcmVhdGVDb250ZXh0KSh7IHN0cmljdDogZmFsc2UgfSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL21vdGlvbi9mZWF0dXJlcy9sb2FkLWZlYXR1cmVzLm1qc1xudmFyIGltcG9ydF9kaXN0ODUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDg2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL21vdGlvbi9mZWF0dXJlcy9kZWZpbml0aW9ucy5tanNcbnZhciBpbXBvcnRfZGlzdDgyID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDg0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGZlYXR1cmVQcm9wcyA9IHtcbiAgYW5pbWF0aW9uOiBbXG4gICAgXCJhbmltYXRlXCIsXG4gICAgXCJ2YXJpYW50c1wiLFxuICAgIFwid2hpbGVIb3ZlclwiLFxuICAgIFwid2hpbGVUYXBcIixcbiAgICBcImV4aXRcIixcbiAgICBcIndoaWxlSW5WaWV3XCIsXG4gICAgXCJ3aGlsZUZvY3VzXCIsXG4gICAgXCJ3aGlsZURyYWdcIlxuICBdLFxuICBleGl0OiBbXCJleGl0XCJdLFxuICBkcmFnOiBbXCJkcmFnXCIsIFwiZHJhZ0NvbnRyb2xzXCJdLFxuICBmb2N1czogW1wid2hpbGVGb2N1c1wiXSxcbiAgaG92ZXI6IFtcIndoaWxlSG92ZXJcIiwgXCJvbkhvdmVyU3RhcnRcIiwgXCJvbkhvdmVyRW5kXCJdLFxuICB0YXA6IFtcIndoaWxlVGFwXCIsIFwib25UYXBcIiwgXCJvblRhcFN0YXJ0XCIsIFwib25UYXBDYW5jZWxcIl0sXG4gIHBhbjogW1wib25QYW5cIiwgXCJvblBhblN0YXJ0XCIsIFwib25QYW5TZXNzaW9uU3RhcnRcIiwgXCJvblBhbkVuZFwiXSxcbiAgaW5WaWV3OiBbXCJ3aGlsZUluVmlld1wiLCBcIm9uVmlld3BvcnRFbnRlclwiLCBcIm9uVmlld3BvcnRMZWF2ZVwiXSxcbiAgbGF5b3V0OiBbXCJsYXlvdXRcIiwgXCJsYXlvdXRJZFwiXVxufTtcbnZhciBmZWF0dXJlRGVmaW5pdGlvbnMgPSB7fTtcbmZvciAoY29uc3Qga2V5IGluIGZlYXR1cmVQcm9wcykge1xuICBmZWF0dXJlRGVmaW5pdGlvbnNba2V5XSA9IHtcbiAgICBpc0VuYWJsZWQ6IChwcm9wcykgPT4gZmVhdHVyZVByb3BzW2tleV0uc29tZSgobmFtZSkgPT4gISFwcm9wc1tuYW1lXSlcbiAgfTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvbW90aW9uL2ZlYXR1cmVzL2xvYWQtZmVhdHVyZXMubWpzXG5mdW5jdGlvbiBsb2FkRmVhdHVyZXMoZmVhdHVyZXMpIHtcbiAgZm9yIChjb25zdCBrZXkgaW4gZmVhdHVyZXMpIHtcbiAgICBmZWF0dXJlRGVmaW5pdGlvbnNba2V5XSA9IHtcbiAgICAgIC4uLmZlYXR1cmVEZWZpbml0aW9uc1trZXldLFxuICAgICAgLi4uZmVhdHVyZXNba2V5XVxuICAgIH07XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvY29tcG9uZW50cy9MYXp5TW90aW9uL2luZGV4Lm1qc1xuZnVuY3Rpb24gTGF6eU1vdGlvbih7IGNoaWxkcmVuLCBmZWF0dXJlcywgc3RyaWN0ID0gZmFsc2UgfSkge1xuICBjb25zdCBbLCBzZXRJc0xvYWRlZF0gPSAoMCwgaW1wb3J0X3JlYWN0MTYudXNlU3RhdGUpKCFpc0xhenlCdW5kbGUoZmVhdHVyZXMpKTtcbiAgY29uc3QgbG9hZGVkUmVuZGVyZXIgPSAoMCwgaW1wb3J0X3JlYWN0MTYudXNlUmVmKSh2b2lkIDApO1xuICBpZiAoIWlzTGF6eUJ1bmRsZShmZWF0dXJlcykpIHtcbiAgICBjb25zdCB7IHJlbmRlcmVyLCAuLi5sb2FkZWRGZWF0dXJlcyB9ID0gZmVhdHVyZXM7XG4gICAgbG9hZGVkUmVuZGVyZXIuY3VycmVudCA9IHJlbmRlcmVyO1xuICAgIGxvYWRGZWF0dXJlcyhsb2FkZWRGZWF0dXJlcyk7XG4gIH1cbiAgKDAsIGltcG9ydF9yZWFjdDE2LnVzZUVmZmVjdCkoKCkgPT4ge1xuICAgIGlmIChpc0xhenlCdW5kbGUoZmVhdHVyZXMpKSB7XG4gICAgICBmZWF0dXJlcygpLnRoZW4oKHsgcmVuZGVyZXIsIC4uLmxvYWRlZEZlYXR1cmVzIH0pID0+IHtcbiAgICAgICAgbG9hZEZlYXR1cmVzKGxvYWRlZEZlYXR1cmVzKTtcbiAgICAgICAgbG9hZGVkUmVuZGVyZXIuY3VycmVudCA9IHJlbmRlcmVyO1xuICAgICAgICBzZXRJc0xvYWRlZCh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgW10pO1xuICByZXR1cm4gKDAsIGltcG9ydF9qc3hfcnVudGltZTUuanN4KShMYXp5Q29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogeyByZW5kZXJlcjogbG9hZGVkUmVuZGVyZXIuY3VycmVudCwgc3RyaWN0IH0sIGNoaWxkcmVuIH0pO1xufVxuZnVuY3Rpb24gaXNMYXp5QnVuZGxlKGZlYXR1cmVzKSB7XG4gIHJldHVybiB0eXBlb2YgZmVhdHVyZXMgPT09IFwiZnVuY3Rpb25cIjtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvY29tcG9uZW50cy9Nb3Rpb25Db25maWcvaW5kZXgubWpzXG52YXIgaW1wb3J0X2Rpc3Q5NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfanN4X3J1bnRpbWU2ID0gX190b0VTTShyZXF1aXJlX2pzeF9ydW50aW1lKCksIDEpO1xudmFyIGltcG9ydF9yZWFjdDE3ID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksI
10617DEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3V0aWxzL2ZpbHRlci1wcm9wcy5tanNcbnZhciBpbXBvcnRfZGlzdDk0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDk2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9tb3Rpb24vdXRpbHMvdmFsaWQtcHJvcC5tanNcbnZhciBpbXBvcnRfZGlzdDkxID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDkzID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIHZhbGlkTW90aW9uUHJvcHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbXG4gIFwiYW5pbWF0ZVwiLFxuICBcImV4aXRcIixcbiAgXCJ2YXJpYW50c1wiLFxuICBcImluaXRpYWxcIixcbiAgXCJzdHlsZVwiLFxuICBcInZhbHVlc1wiLFxuICBcInZhcmlhbnRzXCIsXG4gIFwidHJhbnNpdGlvblwiLFxuICBcInRyYW5zZm9ybVRlbXBsYXRlXCIsXG4gIFwiY3VzdG9tXCIsXG4gIFwiaW5oZXJpdFwiLFxuICBcIm9uQmVmb3JlTGF5b3V0TWVhc3VyZVwiLFxuICBcIm9uQW5pbWF0aW9uU3RhcnRcIixcbiAgXCJvbkFuaW1hdGlvbkNvbXBsZXRlXCIsXG4gIFwib25VcGRhdGVcIixcbiAgXCJvbkRyYWdTdGFydFwiLFxuICBcIm9uRHJhZ1wiLFxuICBcIm9uRHJhZ0VuZFwiLFxuICBcIm9uTWVhc3VyZURyYWdDb25zdHJhaW50c1wiLFxuICBcIm9uRGlyZWN0aW9uTG9ja1wiLFxuICBcIm9uRHJhZ1RyYW5zaXRpb25FbmRcIixcbiAgXCJfZHJhZ1hcIixcbiAgXCJfZHJhZ1lcIixcbiAgXCJvbkhvdmVyU3RhcnRcIixcbiAgXCJvbkhvdmVyRW5kXCIsXG4gIFwib25WaWV3cG9ydEVudGVyXCIsXG4gIFwib25WaWV3cG9ydExlYXZlXCIsXG4gIFwiZ2xvYmFsVGFwVGFyZ2V0XCIsXG4gIFwiaWdub3JlU3RyaWN0XCIsXG4gIFwidmlld3BvcnRcIlxuXSk7XG5mdW5jdGlvbiBpc1ZhbGlkTW90aW9uUHJvcChrZXkpIHtcbiAgcmV0dXJuIGtleS5zdGFydHNXaXRoKFwid2hpbGVcIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJkcmFnXCIpICYmIGtleSAhPT0gXCJkcmFnZ2FibGVcIiB8fCBrZXkuc3RhcnRzV2l0aChcImxheW91dFwiKSB8fCBrZXkuc3RhcnRzV2l0aChcIm9uVGFwXCIpIHx8IGtleS5zdGFydHNXaXRoKFwib25QYW5cIikgfHwga2V5LnN0YXJ0c1dpdGgoXCJvbkxheW91dFwiKSB8fCB2YWxpZE1vdGlvblByb3BzLmhhcyhrZXkpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3V0aWxzL2ZpbHRlci1wcm9wcy5tanNcbnZhciBzaG91bGRGb3J3YXJkID0gKGtleSkgPT4gIWlzVmFsaWRNb3Rpb25Qcm9wKGtleSk7XG5mdW5jdGlvbiBsb2FkRXh0ZXJuYWxJc1ZhbGlkUHJvcChpc1ZhbGlkUHJvcCkge1xuICBpZiAoIWlzVmFsaWRQcm9wKVxuICAgIHJldHVybjtcbiAgc2hvdWxkRm9yd2FyZCA9IChrZXkpID0+IGtleS5zdGFydHNXaXRoKFwib25cIikgPyAhaXNWYWxpZE1vdGlvblByb3Aoa2V5KSA6IGlzVmFsaWRQcm9wKGtleSk7XG59XG50cnkge1xuICBsb2FkRXh0ZXJuYWxJc1ZhbGlkUHJvcChyZXF1aXJlX2lzX3Byb3BfdmFsaWRfZnJhbWVyX21vdGlvbigpLmRlZmF1bHQpO1xufSBjYXRjaCAoX2EpIHtcbn1cbmZ1bmN0aW9uIGZpbHRlclByb3BzKHByb3BzLCBpc0RvbSwgZm9yd2FyZE1vdGlvblByb3BzKSB7XG4gIGNvbnN0IGZpbHRlcmVkUHJvcHMgPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICBpZiAoa2V5ID09PSBcInZhbHVlc1wiICYmIHR5cGVvZiBwcm9wcy52YWx1ZXMgPT09IFwib2JqZWN0XCIpXG4gICAgICBjb250aW51ZTtcbiAgICBpZiAoc2hvdWxkRm9yd2FyZChrZXkpIHx8IGZvcndhcmRNb3Rpb25Qcm9wcyA9PT0gdHJ1ZSAmJiBpc1ZhbGlkTW90aW9uUHJvcChrZXkpIHx8ICFpc0RvbSAmJiAhaXNWYWxpZE1vdGlvblByb3Aoa2V5KSB8fCAvLyBJZiB0cnlpbmcgdG8gdXNlIG5hdGl2ZSBIVE1MIGRyYWcgZXZlbnRzLCBmb3J3YXJkIGRyYWcgbGlzdGVuZXJzXG4gICAgcHJvcHNbXCJkcmFnZ2FibGVcIl0gJiYga2V5LnN0YXJ0c1dpdGgoXCJvbkRyYWdcIikpIHtcbiAgICAgIGZpbHRlcmVkUHJvcHNba2V5XSA9IHByb3BzW2tleV07XG4gICAgfVxuICB9XG4gIHJldHVybiBmaWx0ZXJlZFByb3BzO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9jb21wb25lbnRzL01vdGlvbkNvbmZpZy9pbmRleC5tanNcbmZ1bmN0aW9uIE1vdGlvbkNvbmZpZyh7IGNoaWxkcmVuLCBpc1ZhbGlkUHJvcCwgLi4uY29uZmlnIH0pIHtcbiAgaXNWYWxpZFByb3AgJiYgbG9hZEV4dGVybmFsSXNWYWxpZFByb3AoaXNWYWxpZFByb3ApO1xuICBjb25maWcgPSB7IC4uLigwLCBpbXBvcnRfcmVhY3QxNy51c2VDb250ZXh0KShNb3Rpb25Db25maWdDb250ZXh0KSwgLi4uY29uZmlnIH07XG4gIGNvbmZpZy5pc1N0YXRpYyA9IHVzZUNvbnN0YW50KCgpID0+IGNvbmZpZy5pc1N0YXRpYyk7XG4gIGNvbnN0IGNvbnRleHQgPSAoMCwgaW1wb3J0X3JlYWN0MTcudXNlTWVtbykoKCkgPT4gY29uZmlnLCBb
10617XG4gICAgSlNPTi5zdHJpbmdpZnkoY29uZmlnLnRyYW5zaXRpb24pLFxuICAgIGNvbmZpZy50cmFuc2Zvcm1QYWdlUG9pbnQsXG4gICAgY29uZmlnLnJlZHVjZWRNb3Rpb25cbiAgXSk7XG4gIHJldHVybiAoMCwgaW1wb3J0X2pzeF9ydW50aW1lNi5qc3gpKE1vdGlvbkNvbmZpZ0NvbnRleHQuUHJvdmlkZXIsIHsgdmFsdWU6IGNvbnRleHQsIGNoaWxkcmVuIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvY29tcG9uZW50cy9tL3Byb3h5Lm1qc1xudmFyIGltcG9ydF9kaXN0Mjc0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyNzUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyNzYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9jb21wb25lbnRzL2NyZWF0ZS1wcm94eS5tanNcbnZhciBpbXBvcnRfZGlzdDEwMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTA0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTA1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy93YXJuLW9uY2UubWpzXG52YXIgaW1wb3J0X2Rpc3QxMDAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwMSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwMiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciB3YXJuZWQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuZnVuY3Rpb24gd2Fybk9uY2UoY29uZGl0aW9uLCBtZXNzYWdlLCBlbGVtZW50KSB7XG4gIGlmIChjb25kaXRpb24gfHwgd2FybmVkLmhhcyhtZXNzYWdlKSlcbiAgICByZXR1cm47XG4gIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgaWYgKGVsZW1lbnQpXG4gICAgY29uc29sZS53YXJuKGVsZW1lbnQpO1xuICB3YXJuZWQuYWRkKG1lc3NhZ2UpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvY29tcG9uZW50cy9jcmVhdGUtcHJveHkubWpzXG5mdW5jdGlvbiBjcmVhdGVET01Nb3Rpb25Db21wb25lbnRQcm94eShjb21wb25lbnRGYWN0b3J5KSB7XG4gIGlmICh0eXBlb2YgUHJveHkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICByZXR1cm4gY29tcG9uZW50RmFjdG9yeTtcbiAgfVxuICBjb25zdCBjb21wb25lbnRDYWNoZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGNvbnN0IGRlcHJlY2F0ZWRGYWN0b3J5RnVuY3Rpb24gPSAoLi4uYXJncykgPT4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIHdhcm5PbmNlKGZhbHNlLCBcIm1vdGlvbigpIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb3Rpb24uY3JlYXRlKCkgaW5zdGVhZC5cIik7XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnRGYWN0b3J5KC4uLmFyZ3MpO1xuICB9O1xuICByZXR1cm4gbmV3IFByb3h5KGRlcHJlY2F0ZWRGYWN0b3J5RnVuY3Rpb24sIHtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiBgbW90aW9uYCBpcyByZWZlcmVuY2VkIHdpdGggYSBwcm9wOiBgbW90aW9uLmRpdmAsIGBtb3Rpb24uaW5wdXRgIGV0Yy5cbiAgICAgKiBUaGUgcHJvcCBuYW1lIGlzIHBhc3NlZCB0aHJvdWdoIGFzIGBrZXlgIGFuZCB3ZSBjYW4gdXNlIHRoYXQgdG8gZ2VuZXJhdGUgYSBgbW90aW9uYFxuICAgICAqIERPTSBjb21wb25lbnQgd2l0aCB0aGF0IG5hbWUuXG4gICAgICovXG4gICAgZ2V0OiAoX3RhcmdldCwga2V5KSA9PiB7XG4gICAgICBpZiAoa2V5ID09PSBcImNyZWF0ZVwiKVxuICAgICAgICByZXR1cm4gY29tcG9uZW50RmFjdG9yeTtcbiAgICAgIGlmICghY29tcG9uZW50Q2FjaGUuaGFzKGtleSkpIHtcbiAgICAgICAgY29tcG9uZW50Q2FjaGUuc2V0KGtleSwgY29tcG9uZW50RmFjdG9yeShrZXkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21wb25lbnRDYWNoZS5nZXQoa2V5KTtcbiAgICB9XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvY29tcG9uZW50cy9tL2NyZWF0ZS5tanNcbnZhciBpbXBvcnRfZGlzdDI3MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjcyID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjczID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvY29tcG9uZW50cy9jcmVhdGUtZmFjdG9yeS5tanNcbnZhciBpbXBvcnRfZGlzdDI2OCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjY5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjcwID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9tb3Rpb24vaW5kZXgubWpzXG52YXIgaW1wb3J0X2Rpc3QxNTEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE1MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE1MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfanN4X3J1bnRpbWU3ID0gX190b0VTTShyZXF1aXJlX2pzeF9ydW50aW1lKCksIDEpO1xudmFyIGltcG9ydF9yZWFjdDIzID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksI
10617DEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9jb250ZXh0L01vdGlvbkNvbnRleHQvaW5kZXgubWpzXG52YXIgaW1wb3J0X2Rpc3QxMDYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwNyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3QxOCA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcbnZhciBNb3Rpb25Db250ZXh0ID0gKDAsIGltcG9ydF9yZWFjdDE4LmNyZWF0ZUNvbnRleHQpKHt9KTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvY29udGV4dC9Nb3Rpb25Db250ZXh0L2NyZWF0ZS5tanNcbnZhciBpbXBvcnRfZGlzdDEyNCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTI1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTI2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGltcG9ydF9yZWFjdDE5ID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9jb250ZXh0L01vdGlvbkNvbnRleHQvdXRpbHMubWpzXG52YXIgaW1wb3J0X2Rpc3QxMjEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEyMiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEyMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL3V0aWxzL2lzLXZhcmlhbnQtbGFiZWwubWpzXG52YXIgaW1wb3J0X2Rpc3QxMDkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDExMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDExMSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIGlzVmFyaWFudExhYmVsKHYpIHtcbiAgcmV0dXJuIHR5cGVvZiB2ID09PSBcInN0cmluZ1wiIHx8IEFycmF5LmlzQXJyYXkodik7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci91dGlscy9pcy1jb250cm9sbGluZy12YXJpYW50cy5tanNcbnZhciBpbXBvcnRfZGlzdDExOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTE5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTIwID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vdXRpbHMvaXMtYW5pbWF0aW9uLWNvbnRyb2xzLm1qc1xudmFyIGltcG9ydF9kaXN0MTEyID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMTMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMTQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBpc0FuaW1hdGlvbkNvbnRyb2xzKHYpIHtcbiAgcmV0dXJuIHYgIT09IG51bGwgJiYgdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHYuc3RhcnQgPT09IFwiZnVuY3Rpb25cIjtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL3V0aWxzL3ZhcmlhbnQtcHJvcHMubWpzXG52YXIgaW1wb3J0X2Rpc3QxMTUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDExNiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDExNyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciB2YXJpYW50UHJpb3JpdHlPcmRlciA9IFtcbiAgXCJhbmltYXRlXCIsXG4gIFwid2hpbGVJblZpZXdcIixcbiAgXCJ3aGlsZUZvY3VzXCIsXG4gIFwid2hpbGVIb3ZlclwiLFxuICBcIndoaWxlVGFwXCIsXG4gIFwid2hpbGVEcmFnXCIsXG4gIFwiZXhpdFwiXG5dO1xudmFyIHZhcmlhbnRQcm9wcyA9IFtcImluaXRpYWxcIiwgLi4udmFyaWFudFByaW9yaXR5T3JkZXJdO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvdXRpbHMvaXMtY29udHJvbGxpbmctdmFyaWFudHMubWpzXG5mdW5jdGlvbiBpc0NvbnRyb2xsaW5nVmFyaWFudHMocHJvcHMpIHtcbiAgcmV0dXJuIGlzQW5pbWF0aW9uQ29udHJvbHMocHJvcHMuYW5pbWF0ZSkgfHwgdmFyaWFudFByb3BzLnNvbWUoKG5hbWUpID0+IGlzVmFyaWFudExhYmVsKHByb3BzW25hbWVdKSk7XG59XG5mdW5jdGlvbiBpc1ZhcmlhbnROb2RlKHByb3BzKSB7XG4gIHJldHVybi
10617BCb29sZWFuKGlzQ29udHJvbGxpbmdWYXJpYW50cyhwcm9wcykgfHwgcHJvcHMudmFyaWFudHMpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9jb250ZXh0L01vdGlvbkNvbnRleHQvdXRpbHMubWpzXG5mdW5jdGlvbiBnZXRDdXJyZW50VHJlZVZhcmlhbnRzKHByb3BzLCBjb250ZXh0KSB7XG4gIGlmIChpc0NvbnRyb2xsaW5nVmFyaWFudHMocHJvcHMpKSB7XG4gICAgY29uc3QgeyBpbml0aWFsLCBhbmltYXRlOiBhbmltYXRlMiB9ID0gcHJvcHM7XG4gICAgcmV0dXJuIHtcbiAgICAgIGluaXRpYWw6IGluaXRpYWwgPT09IGZhbHNlIHx8IGlzVmFyaWFudExhYmVsKGluaXRpYWwpID8gaW5pdGlhbCA6IHZvaWQgMCxcbiAgICAgIGFuaW1hdGU6IGlzVmFyaWFudExhYmVsKGFuaW1hdGUyKSA/IGFuaW1hdGUyIDogdm9pZCAwXG4gICAgfTtcbiAgfVxuICByZXR1cm4gcHJvcHMuaW5oZXJpdCAhPT0gZmFsc2UgPyBjb250ZXh0IDoge307XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2NvbnRleHQvTW90aW9uQ29udGV4dC9jcmVhdGUubWpzXG5mdW5jdGlvbiB1c2VDcmVhdGVNb3Rpb25Db250ZXh0KHByb3BzKSB7XG4gIGNvbnN0IHsgaW5pdGlhbCwgYW5pbWF0ZTogYW5pbWF0ZTIgfSA9IGdldEN1cnJlbnRUcmVlVmFyaWFudHMocHJvcHMsICgwLCBpbXBvcnRfcmVhY3QxOS51c2VDb250ZXh0KShNb3Rpb25Db250ZXh0KSk7XG4gIHJldHVybiAoMCwgaW1wb3J0X3JlYWN0MTkudXNlTWVtbykoKCkgPT4gKHsgaW5pdGlhbCwgYW5pbWF0ZTogYW5pbWF0ZTIgfSksIFt2YXJpYW50TGFiZWxzQXNEZXBlbmRlbmN5KGluaXRpYWwpLCB2YXJpYW50TGFiZWxzQXNEZXBlbmRlbmN5KGFuaW1hdGUyKV0pO1xufVxuZnVuY3Rpb24gdmFyaWFudExhYmVsc0FzRGVwZW5kZW5jeShwcm9wKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHByb3ApID8gcHJvcC5qb2luKFwiIFwiKSA6IHByb3A7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL21vdGlvbi91dGlscy9zeW1ib2wubWpzXG52YXIgaW1wb3J0X2Rpc3QxMjcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEyOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEyOSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBtb3Rpb25Db21wb25lbnRTeW1ib2wgPSBTeW1ib2wuZm9yKFwibW90aW9uQ29tcG9uZW50U3ltYm9sXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9tb3Rpb24vdXRpbHMvdXNlLW1vdGlvbi1yZWYubWpzXG52YXIgaW1wb3J0X2Rpc3QxMzMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEzNCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEzNSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3QyMCA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvaXMtcmVmLW9iamVjdC5tanNcbnZhciBpbXBvcnRfZGlzdDEzMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTMxID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTMyID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gaXNSZWZPYmplY3QocmVmKSB7XG4gIHJldHVybiByZWYgJiYgdHlwZW9mIHJlZiA9PT0gXCJvYmplY3RcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocmVmLCBcImN1cnJlbnRcIik7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL21vdGlvbi91dGlscy91c2UtbW90aW9uLXJlZi5tanNcbmZ1bmN0aW9uIHVzZU1vdGlvblJlZih2aXN1YWxTdGF0ZSwgdmlzdWFsRWxlbWVudCwgZXh0ZXJuYWxSZWYpIHtcbiAgcmV0dXJuICgwLCBpbXBvcnRfcmVhY3QyMC51c2VDYWxsYmFjaykoXG4gICAgKGluc3RhbmNlKSA9PiB7XG4gICAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgICAgdmlzdWFsU3RhdGUub25Nb3VudCAmJiB2aXN1YWxTdGF0ZS5vbk1vdW50KGluc3RhbmNlKTtcbiAgICAgIH1cbiAgICAgIGlmICh2aXN1YWxFbGVtZW50KSB7XG4gICAgICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgICAgIHZpc3VhbEVsZW1lbnQubW91bnQoaW5zdGFuY2UpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZpc3VhbEVsZW1lbnQudW5tb3VudCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXh0ZXJuYWxSZWYpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBleHRlcm5hbFJlZiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgZXh0ZXJuYWxSZWYoaW5zdGFuY2UpO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUmVmT2JqZWN0KGV4dGVybmFsUmVmKSkge1xuICAgICAgICAgIGV4dGVybmFsUmVmLmN1cnJlbnQgPSBpbnN0YW5jZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogT25seSBwYXNzIGEgbmV3IHJlZiBjYWxsYmFjayB0byBSZWFjdCBpZiB3ZSd2ZSByZWNlaXZlZCBhIHZpc3VhbCBlbGVtZW50XG4gICAgICogZmFjdG9yeS4gT3RoZXJ3aXNlI
10617HdlJ2xsIGJlIG1vdW50aW5nL3JlbW91bnRpbmcgZXZlcnkgdGltZSBleHRlcm5hbFJlZlxuICAgICAqIG9yIG90aGVyIGRlcGVuZGVuY2llcyBjaGFuZ2UuXG4gICAgICovXG4gICAgW3Zpc3VhbEVsZW1lbnRdXG4gICk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL21vdGlvbi91dGlscy91c2UtdmlzdWFsLWVsZW1lbnQubWpzXG52YXIgaW1wb3J0X2Rpc3QxNDggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE0OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE1MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3QyMiA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL29wdGltaXplZC1hcHBlYXIvZGF0YS1pZC5tanNcbnZhciBpbXBvcnRfZGlzdDEzOSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTQwID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTQxID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3V0aWxzL2NhbWVsLXRvLWRhc2gubWpzXG52YXIgaW1wb3J0X2Rpc3QxMzYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEzNyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEzOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBjYW1lbFRvRGFzaCA9IChzdHIpID0+IHN0ci5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9ndSwgXCIkMS0kMlwiKS50b0xvd2VyQ2FzZSgpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vb3B0aW1pemVkLWFwcGVhci9kYXRhLWlkLm1qc1xudmFyIG9wdGltaXplZEFwcGVhckRhdGFJZCA9IFwiZnJhbWVyQXBwZWFySWRcIjtcbnZhciBvcHRpbWl6ZWRBcHBlYXJEYXRhQXR0cmlidXRlID0gXCJkYXRhLVwiICsgY2FtZWxUb0Rhc2gob3B0aW1pemVkQXBwZWFyRGF0YUlkKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvZnJhbWVsb29wL21pY3JvdGFzay5tanNcbnZhciBpbXBvcnRfZGlzdDE0MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTQzID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTQ0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIHsgc2NoZWR1bGU6IG1pY3JvdGFzaywgY2FuY2VsOiBjYW5jZWxNaWNyb3Rhc2sgfSA9IGNyZWF0ZVJlbmRlckJhdGNoZXIocXVldWVNaWNyb3Rhc2ssIGZhbHNlKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvY29udGV4dC9Td2l0Y2hMYXlvdXRHcm91cENvbnRleHQubWpzXG52YXIgaW1wb3J0X2Rpc3QxNDUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE0NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE0NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3QyMSA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcbnZhciBTd2l0Y2hMYXlvdXRHcm91cENvbnRleHQgPSAoMCwgaW1wb3J0X3JlYWN0MjEuY3JlYXRlQ29udGV4dCkoe30pO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9tb3Rpb24vdXRpbHMvdXNlLXZpc3VhbC1lbGVtZW50Lm1qc1xuZnVuY3Rpb24gdXNlVmlzdWFsRWxlbWVudChDb21wb25lbnQzLCB2aXN1YWxTdGF0ZSwgcHJvcHMsIGNyZWF0ZVZpc3VhbEVsZW1lbnQsIFByb2plY3Rpb25Ob2RlQ29uc3RydWN0b3IpIHtcbiAgdmFyIF9hLCBfYjtcbiAgY29uc3QgeyB2aXN1YWxFbGVtZW50OiBwYXJlbnQgfSA9ICgwLCBpbXBvcnRfcmVhY3QyMi51c2VDb250ZXh0KShNb3Rpb25Db250ZXh0KTtcbiAgY29uc3QgbGF6eUNvbnRleHQgPSAoMCwgaW1wb3J0X3JlYWN0MjIudXNlQ29udGV4dCkoTGF6eUNvbnRleHQpO1xuICBjb25zdCBwcmVzZW5jZUNvbnRleHQgPSAoMCwgaW1wb3J0X3JlYWN0MjIudXNlQ29udGV4dCkoUHJlc2VuY2VDb250ZXh0KTtcbiAgY29uc3QgcmVkdWNlZE1vdGlvbkNvbmZpZyA9ICgwLCBpb
10617XBvcnRfcmVhY3QyMi51c2VDb250ZXh0KShNb3Rpb25Db25maWdDb250ZXh0KS5yZWR1Y2VkTW90aW9uO1xuICBjb25zdCB2aXN1YWxFbGVtZW50UmVmID0gKDAsIGltcG9ydF9yZWFjdDIyLnVzZVJlZikobnVsbCk7XG4gIGNyZWF0ZVZpc3VhbEVsZW1lbnQgPSBjcmVhdGVWaXN1YWxFbGVtZW50IHx8IGxhenlDb250ZXh0LnJlbmRlcmVyO1xuICBpZiAoIXZpc3VhbEVsZW1lbnRSZWYuY3VycmVudCAmJiBjcmVhdGVWaXN1YWxFbGVtZW50KSB7XG4gICAgdmlzdWFsRWxlbWVudFJlZi5jdXJyZW50ID0gY3JlYXRlVmlzdWFsRWxlbWVudChDb21wb25lbnQzLCB7XG4gICAgICB2aXN1YWxTdGF0ZSxcbiAgICAgIHBhcmVudCxcbiAgICAgIHByb3BzLFxuICAgICAgcHJlc2VuY2VDb250ZXh0LFxuICAgICAgYmxvY2tJbml0aWFsQW5pbWF0aW9uOiBwcmVzZW5jZUNvbnRleHQgPyBwcmVzZW5jZUNvbnRleHQuaW5pdGlhbCA9PT0gZmFsc2UgOiBmYWxzZSxcbiAgICAgIHJlZHVjZWRNb3Rpb25Db25maWdcbiAgICB9KTtcbiAgfVxuICBjb25zdCB2aXN1YWxFbGVtZW50ID0gdmlzdWFsRWxlbWVudFJlZi5jdXJyZW50O1xuICBjb25zdCBpbml0aWFsTGF5b3V0R3JvdXBDb25maWcgPSAoMCwgaW1wb3J0X3JlYWN0MjIudXNlQ29udGV4dCkoU3dpdGNoTGF5b3V0R3JvdXBDb250ZXh0KTtcbiAgaWYgKHZpc3VhbEVsZW1lbnQgJiYgIXZpc3VhbEVsZW1lbnQucHJvamVjdGlvbiAmJiBQcm9qZWN0aW9uTm9kZUNvbnN0cnVjdG9yICYmICh2aXN1YWxFbGVtZW50LnR5cGUgPT09IFwiaHRtbFwiIHx8IHZpc3VhbEVsZW1lbnQudHlwZSA9PT0gXCJzdmdcIikpIHtcbiAgICBjcmVhdGVQcm9qZWN0aW9uTm9kZSh2aXN1YWxFbGVtZW50UmVmLmN1cnJlbnQsIHByb3BzLCBQcm9qZWN0aW9uTm9kZUNvbnN0cnVjdG9yLCBpbml0aWFsTGF5b3V0R3JvdXBDb25maWcpO1xuICB9XG4gIGNvbnN0IGlzTW91bnRlZCA9ICgwLCBpb
10617XBvcnRfcmVhY3QyMi51c2VSZWYpKGZhbHNlKTtcbiAgKDAsIGltcG9ydF9yZWFjdDIyLnVzZUluc2VydGlvbkVmZmVjdCkoKCkgPT4ge1xuICAgIGlmICh2aXN1YWxFbGVtZW50ICYmIGlzTW91bnRlZC5jdXJyZW50KSB7XG4gICAgICB2aXN1YWxFbGVtZW50LnVwZGF0ZShwcm9wcywgcHJlc2VuY2VDb250ZXh0KTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBvcHRpbWlzZWRBcHBlYXJJZCA9IHByb3BzW29wdGltaXplZEFwcGVhckRhdGFBdHRyaWJ1dGVdO1xuICBjb25zdCB3YW50c0hhbmRvZmYgPSAoMCwgaW1wb3J0X3JlYWN0MjIudXNlUmVmKShCb29sZWFuKG9wdGltaXNlZEFwcGVhcklkKSAmJiAhKChfYSA9IHdpbmRvdy5Nb3Rpb25IYW5kb2ZmSXNDb21wbGV0ZSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwod2luZG93LCBvcHRpbWlzZWRBcHBlYXJJZCkpICYmICgoX2IgPSB3aW5kb3cuTW90aW9uSGFzT3B0aW1pc2VkQW5pbWF0aW9uKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IuY2FsbCh3aW5kb3csIG9wdGltaXNlZEFwcGVhcklkKSkpO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoIXZpc3VhbEVsZW1lbnQpXG4gICAgICByZXR1cm47XG4gICAgaXNNb3VudGVkLmN1cnJlbnQgPSB0cnVlO1xuICAgIHdpbmRvdy5Nb3Rpb25Jc01vdW50ZWQgPSB0cnVlO1xuICAgIHZpc3VhbEVsZW1lbnQudXBkYXRlRmVhdHVyZXMoKTtcbiAgICBtaWNyb3Rhc2sucmVuZGVyKHZpc3VhbEVsZW1lbnQucmVuZGVyKTtcbiAgICBpZiAod2FudHNIYW5kb2ZmLmN1cnJlbnQgJiYgdmlzdWFsRWxlbWVudC5hbmltYXRpb25TdGF0ZSkge1xuICAgICAgdmlzdWFsRWxlbWVudC5hbmltYXRpb25TdGF0ZS5hbmltYXRlQ2hhbmdlcygpO1xuICAgIH1cbiAgfSk7XG4gICgwLCBpbXBvcnRfcmVhY3QyMi51c2VFZmZlY3QpKCgpID0+IHtcbiAgICBpZiAoIXZpc3VhbEVsZW1lbnQpXG4gICAgICByZXR1cm47XG4gICAgaWYgKCF3YW50c0hhbmRvZmYuY3VycmVudCAmJiB2aXN1YWxFbGVtZW50LmFuaW1hdGlvblN0YXRlKSB7XG4gICAgICB2aXN1YWxFbGVtZW50LmFuaW1hdGlvblN0YXRlLmFuaW1hdGVDaGFuZ2VzKCk7XG4gICAgfVxuICAgIGlmICh3YW50c0hhbmRvZmYuY3VycmVudCkge1xuICAgICAgcXVldWVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgICB2Y
10617XIgX2EyO1xuICAgICAgICAoX2EyID0gd2luZG93Lk1vdGlvbkhhbmRvZmZNYXJrQXNDb21wbGV0ZSkgPT09IG51bGwgfHwgX2EyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTIuY2FsbCh3aW5kb3csIG9wdGltaXNlZEFwcGVhcklkKTtcbiAgICAgIH0pO1xuICAgICAgd2FudHNIYW5kb2ZmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdmlzdWFsRWxlbWVudDtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVByb2plY3Rpb25Ob2RlKHZpc3VhbEVsZW1lbnQsIHByb3BzLCBQcm9qZWN0aW9uTm9kZUNvbnN0cnVjdG9yLCBpbml0aWFsUHJvbW90aW9uQ29uZmlnKSB7XG4gIGNvbnN0IHsgbGF5b3V0SWQsIGxheW91dDogbGF5b3V0MiwgZHJhZzogZHJhZzIsIGRyYWdDb25zdHJhaW50cywgbGF5b3V0U2Nyb2xsLCBsYXlvdXRSb290IH0gPSBwcm9wcztcbiAgdmlzdWFsRWxlbWVudC5wcm9qZWN0aW9uID0gbmV3IFByb2plY3Rpb25Ob2RlQ29uc3RydWN0b3IodmlzdWFsRWxlbWVudC5sYXRlc3RWYWx1ZXMsIHByb3BzW1wiZGF0YS1mcmFtZXItcG9ydGFsLWlkXCJdID8gdm9pZCAwIDogZ2V0Q2xvc2VzdFByb2plY3RpbmdOb2RlKHZpc3VhbEVsZW1lbnQucGFyZW50KSk7XG4gIHZpc3VhbEVsZW1lbnQucHJvamVjdGlvbi5zZXRPcHRpb25zKHtcbiAgICBsYXlvdXRJZCxcbiAgICBsYXlvdXQ6IGxheW91dDIsXG4gICAgYWx3YXlzTWVhc3VyZUxheW91dDogQm9vbGVhbihkcmFnMikgfHwgZHJhZ0NvbnN0cmFpbnRzICYmIGlzUmVmT2JqZWN0KGRyYWdDb25zdHJhaW50cyksXG4gICAgdmlzdWFsRWxlbWVudCxcbiAgICAvKipcbiAgICAgKiBUT0RPOiBVcGRhdGUgb3B0aW9ucyBpbiBhbiBlZmZlY3QuIFRoaXMgY291bGQgYmUgdHJpY2t5IGFzIGl0J2xsIGJlIHRvbyBsYXRlXG4gICAgICogdG8gdXBkYXRlIGJ5IHRoZSB0aW1lIGxheW91dCBhbmltYXRpb25zIHJ1bi5cbiAgICAgKiBXZSBhbHNvIG5lZWQgdG8gZml4IHRoaXMgc2FmZVRvUmVtb3ZlIGJ5IGxpbmtpbmcgaXQgdXAgdG8gdGhlIG9uZSByZXR1cm5lZCBieSB1c2VQcmVzZW5jZSxcbiAgICAgKiBlbnN1cmluZyBpdCBnZXRzIGNhbGxlZCBpZiB0aGVyZSdzIG5vIHBvdGVudGlhbCBsYXlvdXQgYW5pbWF0aW9ucy5cbiAgICAgKlxuICAgICAqL1xuICAgIGFuaW1hdGlvblR5cGU6IHR5cGVvZiBsYXlvdXQyID09PSBcInN0cmluZ1wiID8gbGF5b3V0MiA6IFwiYm90aFwiLFxuICAgIGluaXRpYWxQcm9tb3Rpb25Db25maWcsXG4gICAgbGF5b3V0U2Nyb2xsLFxuICAgIGxheW91dFJvb3RcbiAgfSk7XG59XG5mdW5jdGlvbiBnZXRDbG9zZXN0UHJvamVjdGluZ05vZGUodmlzdWFsRWxlbWVudCkge1xuICBpZiAoIXZpc3VhbEVsZW1lbnQpXG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgcmV0dXJuIHZpc3VhbEVsZW1lbnQub3B0aW9ucy5hbGxvd1Byb2plY3Rpb24gIT09IGZhbHNlID8gdmlzdWFsRWxlbWVudC5wcm9qZWN0aW9uIDogZ2V0Q2xvc2VzdFByb2plY3RpbmdOb2RlKHZpc3VhbEVsZW1lbnQucGFyZW50KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvbW90aW9uL2luZGV4Lm1qc1xuZnVuY3Rpb24gY3JlYXRlUmVuZGVyZXJNb3Rpb25Db21wb25lbnQoeyBwcmVsb2FkZWRGZWF0dXJlcywgY3JlYXRlVmlzdWFsRWxlbWVudCwgdXNlUmVuZGVyLCB1c2VWaXN1YWxTdGF0ZTogdXNlVmlzdWFsU3RhdGUyLCBDb21wb25lbnQ6IENvbXBvbmVudDMgfSkge1xuICB2YXIgX2EsIF9iO1xuICBwcmVsb2FkZWRGZWF0dXJlcyAmJiBsb2FkRmVhdHVyZXMocHJlbG9hZGVkRmVhdHVyZXMpO1xuICBmdW5jdGlvbiBNb3Rpb25Db21wb25lbnQocHJvcHMsIGV4dGVybmFsUmVmKSB7XG4gICAgbGV0IE1lYXN1cmVMYXlvdXQyO1xuICAgIGNvbnN0IGNvbmZpZ0FuZFByb3BzID0ge1xuICAgICAgLi4uKDAsIGltcG9ydF9yZWFjdDIzLnVzZUNvbnRleHQpKE1vdGlvbkNvbmZpZ0NvbnRleHQpLFxuICAgICAgLi4ucHJvcHMsXG4gICAgICBsYXlvdXRJZDogdXNlTGF5b3V0SWQocHJvcHMpXG4gICAgfTtcbiAgICBjb25zdCB7IGlzU3RhdGljIH0gPSBjb25maWdBbmRQcm9wcztcbiAgICBjb25zdCBjb250ZXh0ID0gdXNlQ3JlYXRlTW90aW9uQ29udGV4dChwcm9wcyk7XG4gICAgY29uc3QgdmlzdWFsU3RhdGUgPSB1c2VWaXN1YWxTdGF0ZTIocHJvcHMsIGlzU3RhdGljKTtcbiAgICBpZiAoIWlzU3RhdGljICYmIGlzQnJvd3Nlcikge1xuICAgICAgdXNlU3RyaWN0TW9kZShjb25maWdBbmRQcm9wcywgcHJlbG9hZGVkRmVhdHVyZXMpO1xuICAgICAgY29uc3QgbGF5b3V0UHJvamVjdGlvbiA9IGdldFByb2plY3Rpb25GdW5jdGlvbmFsaXR5KGNvbmZpZ0FuZFByb3BzKTtcbiAgICAgIE1lYXN1cmVMYXlvdXQyID0gbGF5b3V0UHJvamVjdGlvbi5NZWFzdXJlTGF5b3V0O1xuICAgICAgY29udGV4dC52aXN1YWxFbGVtZW50ID0gdXNlVmlzdWFsRWxlbWVudChDb21wb25lbnQzLCB2aXN1YWxTdGF0ZSwgY29uZmlnQW5kUHJvcHMsIGNyZWF0ZVZpc3VhbEVsZW1lbnQsIGxheW91dFByb2plY3Rpb24uUHJvamVjdGlvbk5vZGUpO1xuICAgIH1cbiAgICByZXR1cm4gKDAsIGltcG9ydF9qc3hfcnVudGltZTcuanN4cykoTW90aW9uQ29udGV4dC5Qcm92aWRlciwgeyB2YWx1ZTogY29udGV4dCwgY2hpbGRyZW46IFtNZWFzdXJlTGF5b3V0MiAmJiBjb250ZXh0LnZpc3VhbEVsZW1lbnQgPyAoMCwgaW1wb3J0X2pzeF9ydW50aW1lNy5qc3gpKE1lYXN1cmVMYXlvdXQyLCB7IHZpc3VhbEVsZW1lbnQ6IGNvbnRleHQudmlzdWFsRWxlbWVudCwgLi4uY29uZmlnQW5kUHJvcHMgfSkgOiBudWxsLCB1c2VSZW5kZXIoQ29tcG9uZW50MywgcHJvcHMsIHVzZU1vdGlvblJlZih2aXN1YWxTdGF0ZSwgY29udGV4dC52aXN1YWxFbGVtZW50LCBleHRlcm5hbFJlZiksIHZpc3VhbFN0YXRlLCBpc1N0YXRpYywgY29udGV4dC52aXN1YWxFbGVtZW50KV0gfSk7XG4gIH1cbiAgTW90aW9uQ29tcG9uZW50LmRpc3BsYXlOYW1lID0gYG1vdGlvbi4ke3R5cGVvZiBDb21wb25lbnQzID09PSBcInN0cmluZ1wiID8gQ29tcG9uZW50MyA6IGBjcmVhdGUoJHsoX2IgPSAoX2EgPSBDb21wb25lbnQzLmRpc3BsYXlOYW1lKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBDb21wb25lbnQzLm5hbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IFwiXCJ9KWB9YDtcbiAgY29uc3QgRm9yd2FyZFJlZk1vdGlvbkNvbXBvbmVudCA9ICgwLCBpb
10617XBvcnRfcmVhY3QyMy5mb3J3YXJkUmVmKShNb3Rpb25Db21wb25lbnQpO1xuICBGb3J3YXJkUmVmTW90aW9uQ29tcG9uZW50W21vdGlvbkNvbXBvbmVudFN5bWJvbF0gPSBDb21wb25lbnQzO1xuICByZXR1cm4gRm9yd2FyZFJlZk1vdGlvbkNvbXBvbmVudDtcbn1cbmZ1bmN0aW9uIHVzZUxheW91dElkKHsgbGF5b3V0SWQgfSkge1xuICBjb25zdCBsYXlvdXRHcm91cElkID0gKDAsIGltcG9ydF9yZWFjdDIzLnVzZUNvbnRleHQpKExheW91dEdyb3VwQ29udGV4dCkuaWQ7XG4gIHJldHVybiBsYXlvdXRHcm91cElkICYmIGxheW91dElkICE9PSB2b2lkIDAgPyBsYXlvdXRHcm91cElkICsgXCItXCIgKyBsYXlvdXRJZCA6IGxheW91dElkO1xufVxuZnVuY3Rpb24gdXNlU3RyaWN0TW9kZShjb25maWdBbmRQcm9wcywgcHJlbG9hZGVkRmVhdHVyZXMpIHtcbiAgY29uc3QgaXNTdHJpY3QgPSAoMCwgaW1wb3J0X3JlYWN0MjMudXNlQ29udGV4dCkoTGF6eUNvbnRleHQpLnN0cmljdDtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIiAmJiBwcmVsb2FkZWRGZWF0dXJlcyAmJiBpc1N0cmljdCkge1xuICAgIGNvbnN0IHN0cmljdE1lc3NhZ2UgPSBcIllvdSBoYXZlIHJlbmRlcmVkIGEgYG1vdGlvbmAgY29tcG9uZW50IHdpdGhpbiBhIGBMYXp5TW90aW9uYCBjb21wb25lbnQuIFRoaXMgd2lsbCBicmVhayB0cmVlIHNoYWtpbmcuIEltcG9ydCBhbmQgcmVuZGVyIGEgYG1gIGNvbXBvbmVudCBpbnN0ZWFkLlwiO1xuICAgIGNvbmZpZ0FuZFByb3BzLmlnbm9yZVN0cmljdCA/IHdhcm5pbmcoZmFsc2UsIHN0cmljdE1lc3NhZ2UpIDogaW52YXJpYW50KGZhbHNlLCBzdHJpY3RNZXNzYWdlKTtcbiAgfVxufVxuZnVuY3Rpb24gZ2V0UHJvamVjdGlvbkZ1bmN0aW9uYWxpdHkocHJvcHMpIHtcbiAgY29uc3QgeyBkcmFnOiBkcmFnMiwgbGF5b3V0OiBsYXlvdXQyIH0gPSBmZWF0dXJlRGVmaW5pdGlvbnM7XG4gIGlmICghZHJhZzIgJiYgIWxheW91dDIpXG4gICAgcmV0dXJuIHt9O1xuICBjb25zdCBjb21iaW5lZCA9IHsgLi4uZHJhZzIsIC4uLmxheW91dDIgfTtcbiAgcmV0dXJuIHtcbiAgICBNZWFzdXJlTGF5b3V0OiAoZHJhZzIgPT09IG51bGwgfHwgZHJhZzIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGRyYWcyLmlzRW5hYmxlZChwcm9wcykpIHx8IChsYXlvdXQyID09PSBudWxsIHx8IGxheW91dDIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxheW91dDIuaXNFbmFibGVkKHByb3BzKSkgPyBjb21iaW5lZC5NZWFzdXJlTGF5b3V0IDogdm9pZCAwLFxuICAgIFByb2plY3Rpb25Ob2RlOiBjb21iaW5lZC5Qcm9qZWN0aW9uTm9kZVxuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3V0aWxzL2lzLXN2Zy1jb21wb25lbnQubWpzXG52YXIgaW1wb3J0X2Rpc3QxNTcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE1OCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE1OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL3N2Zy9sb3dlcmNhc2UtZWxlbWVudHMubWpzXG52YXIgaW1wb3J0X2Rpc3QxNTQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE1NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE1NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBsb3dlcmNhc2VTVkdFbGVtZW50cyA9IFtcbiAgXCJhbmltYXRlXCIsXG4gIFwiY2lyY2xlXCIsXG4gIFwiZGVmc1wiLFxuICBcImRlc2NcIixcbiAgXCJlbGxpcHNlXCIsXG4gIFwiZ1wiLFxuICBcImltYWdlXCIsXG4gIFwibGluZVwiLFxuICBcImZpbHRlclwiLFxuICBcIm1hcmtlclwiLFxuICBcIm1hc2tcIixcbiAgXCJtZXRhZGF0YVwiLFxuICBcInBhdGhcIixcbiAgXCJwYXR0ZXJuXCIsXG4gIFwicG9seWdvblwiLFxuICBcInBvbHlsaW5lXCIsXG4gIFwicmVjdFwiLFxuICBcInN0b3BcIixcbiAgXCJzd2l0Y2hcIixcbiAgXCJzeW1ib2xcIixcbiAgXCJzdmdcIixcbiAgXCJ0ZXh0XCIsXG4gIFwidHNwYW5cIixcbiAgXCJ1c2VcIixcbiAgXCJ2aWV3XCJcbl07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9kb20vdXRpbHMvaXMtc3ZnLWNvbXBvbmVudC5tanNcbmZ1bmN0aW9uIGlzU1ZHQ29tcG9uZW50KENvbXBvbmVudDMpIHtcbiAgaWYgKFxuICAgIC8qKlxuICAgICAqIElmIGl0J3Mgbm90IGEgc3RyaW5nLCBpdCdzIGEgY3VzdG9tIFJlYWN0IGNvbXBvbmVudC4gQ3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydFxuICAgICAqIEhUTUwgY3VzdG9tIFJlYWN0IGNvbXBvbmVudHMuXG4gICAgICovXG4gICAgdHlwZW9mIENvbXBvbmVudDMgIT09IFwic3RyaW5nXCIgfHwgLyoqXG4gICAgICogSWYgaXQgY29udGFpbnMgYSBkYXNoLCB0aGUgZWxlbWVudCBpcyBhIGN1c3RvbSBIVE1MIHdlYmNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBDb21wb25lbnQzLmluY2x1ZGVzKFwiLVwiKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAoXG4gICAgLyoqXG4gICAgICogSWYgaXQncyBpbiBvdXIgbGlzdCBvZiBsb3dlcmNhc2UgU1ZHIHRhZ3MsIGl0J3MgYW4gU1ZHIGNvbXBvbmVudFxuICAgICAqL1xuICAgIGxvd2VyY2FzZVNWR0VsZW1lbnRzLmluZGV4T2YoQ29tcG9uZW50MykgPiAtMSB8fCAvKipcbiAgICAgKiBJZiBpdCBjb250YWlucyBhIGNhcGl0YWwgbGV0dGVyLCBpdCdzIGFuIFNWRyBjb21wb25lbnRcbiAgICAgKi9cbiAgICAvW0EtWl0vdS50ZXN0KENvbXBvbmVudDMpXG4gICkge1xuICAgIHJldHVybi
10617B0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL3N2Zy9jb25maWctbW90aW9uLm1qc1xudmFyIGltcG9ydF9kaXN0MjUzID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyNTQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyNTUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL21vdGlvbi91dGlscy91c2UtdmlzdWFsLXN0YXRlLm1qc1xudmFyIGltcG9ydF9kaXN0MTc1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxNzYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxNzcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW1wb3J0X3JlYWN0MjQgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci91dGlscy9yZXNvbHZlLXZhcmlhbnRzLm1qc1xudmFyIGltcG9ydF9kaXN0MTYwID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxNjEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxNjIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBnZXRWYWx1ZVN0YXRlKHZpc3VhbEVsZW1lbnQpIHtcbiAgY29uc3Qgc3RhdGUyID0gW3t9LCB7fV07XG4gIHZpc3VhbEVsZW1lbnQgPT09IG51bGwgfHwgdmlzdWFsRWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdmlzdWFsRWxlbWVudC52YWx1ZXMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIHN0YXRlMlswXVtrZXldID0gdmFsdWUuZ2V0KCk7XG4gICAgc3RhdGUyWzFdW2tleV0gPSB2YWx1ZS5nZXRWZWxvY2l0eSgpO1xuICB9KTtcbiAgcmV0dXJuIHN0YXRlMjtcbn1cbmZ1bmN0aW9uIHJlc29sdmVWYXJpYW50RnJvbVByb3BzKHByb3BzLCBkZWZpbml0aW9uLCBjdXN0b20sIHZpc3VhbEVsZW1lbnQpIHtcbiAgaWYgKHR5cGVvZiBkZWZpbml0aW9uID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjb25zdCBbY3VycmVudCwgdmVsb2NpdHldID0gZ2V0VmFsdWVTdGF0ZSh2aXN1YWxFbGVtZW50KTtcbiAgICBkZWZpbml0aW9uID0gZGVmaW5pdGlvbihjdXN0b20gIT09IHZvaWQgMCA/IGN1c3RvbSA6IHByb3BzLmN1c3RvbSwgY3VycmVudCwgdmVsb2NpdHkpO1xuICB9XG4gIGlmICh0eXBlb2YgZGVmaW5pdGlvbiA9PT0gXCJzdHJpbmdcIikge1xuICAgIGRlZmluaXRpb24gPSBwcm9wcy52YXJpYW50cyAmJiBwcm9wcy52YXJpYW50c1tkZWZpbml0aW9uXTtcbiAgfVxuICBpZiAodHlwZW9mIGRlZmluaXRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0IFtjdXJyZW50LCB2ZWxvY2l0eV0gPSBnZXRWYWx1ZVN0YXRlKHZpc3VhbEVsZW1lbnQpO1xuICAgIGRlZmluaXRpb24gPSBkZWZpbml0aW9uKGN1c3RvbSAhPT0gdm9pZCAwID8gY3VzdG9tIDogcHJvcHMuY3VzdG9tLCBjdXJyZW50LCB2ZWxvY2l0eSk7XG4gIH1cbiAgcmV0dXJuIGRlZmluaXRpb247XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3ZhbHVlL3V0aWxzL3Jlc29sdmUtbW90aW9uLXZhbHVlLm1qc1xudmFyIGltcG9ydF9kaXN0MTcyID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxNzMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxNzQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3V0aWxzL3Jlc29sdmUtdmFsdWUubWpzXG52YXIgaW1wb3J0X2Rpc3QxNjYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE2NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE2OCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL3V0aWxzL2lzLWtleWZyYW1lcy10YXJnZXQubWpzXG52YXIgaW1wb3J0X2Rpc3QxNjMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE2NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE2NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpc0tleWZyYW1lc1RhcmdldCA9ICh2KSA9PiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHYpO1xufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvcmVzb2x2ZS12YWx1ZS5tanNcbnZhciBpc0N1c3RvbVZhbHVlID0gKHYpID0+IHtcbiAgcmV0dXJuIEJvb2xlYW4odiAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2Lm1peCAmJiB2LnRvVmFsdWUpO1xufTtcbnZhciByZXNvbHZlRmluYWxWYWx1ZUluS2V5ZnJhbWVzID0gKHYpID0+IHtcbiAgcmV0dXJuIGlzS2V5ZnJhbWVzVGFyZ2V0KHYpID8gdlt2Lmxlbmd0aCAtIDFdIHx8IDAgOiB2O1xufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdXRpbHMvaXMtbW90aW9uLXZhbHVlLm1qc1xudmFyIGltcG9ydF9kaXN0MTY5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxNzAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxNzEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaXNNb3Rpb25WYWx1ZSA9ICh2YWx1ZSkgPT4gQm9vbGVhbih2YWx1ZSAmJiB2YWx1ZS
106175nZXRWZWxvY2l0eSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3ZhbHVlL3V0aWxzL3Jlc29sdmUtbW90aW9uLXZhbHVlLm1qc1xuZnVuY3Rpb24gcmVzb2x2ZU1vdGlvblZhbHVlKHZhbHVlKSB7XG4gIGNvbnN0IHVud3JhcHBlZFZhbHVlID0gaXNNb3Rpb25WYWx1ZSh2YWx1ZSkgPyB2YWx1ZS5nZXQoKSA6IHZhbHVlO1xuICByZXR1cm4gaXNDdXN0b21WYWx1ZSh1bndyYXBwZWRWYWx1ZSkgPyB1bndyYXBwZWRWYWx1ZS50b1ZhbHVlKCkgOiB1bndyYXBwZWRWYWx1ZTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvbW90aW9uL3V0aWxzL3VzZS12aXN1YWwtc3RhdGUubWpzXG5mdW5jdGlvbiBtYWtlU3RhdGUoeyBzY3JhcGVNb3Rpb25WYWx1ZXNGcm9tUHJvcHM6IHNjcmFwZU1vdGlvblZhbHVlc0Zyb21Qcm9wczMsIGNyZWF0ZVJlbmRlclN0YXRlLCBvblVwZGF0ZSB9LCBwcm9wcywgY29udGV4dCwgcHJlc2VuY2VDb250ZXh0KSB7XG4gIGNvbnN0IHN0YXRlMiA9IHtcbiAgICBsYXRlc3RWYWx1ZXM6IG1ha2VMYXRlc3RWYWx1ZXMocHJvcHMsIGNvbnRleHQsIHByZXNlbmNlQ29udGV4dCwgc2NyYXBlTW90aW9uVmFsdWVzRnJvbVByb3BzMyksXG4gICAgcmVuZGVyU3RhdGU6IGNyZWF0ZVJlbmRlclN0YXRlKClcbiAgfTtcbiAgaWYgKG9uVXBkYXRlKSB7XG4gICAgc3RhdGUyLm9uTW91bnQgPSAoaW5zdGFuY2UpID0+IG9uVXBkYXRlKHsgcHJvcHMsIGN1cnJlbnQ6IGluc3RhbmNlLCAuLi5zdGF0ZTIgfSk7XG4gICAgc3RhdGUyLm9uVXBkYXRlID0gKHZpc3VhbEVsZW1lbnQpID0+IG9uVXBkYXRlKHZpc3VhbEVsZW1lbnQpO1xuICB9XG4gIHJldHVybiBzdGF0ZTI7XG59XG52YXIgbWFrZVVzZVZpc3VhbFN0YXRlID0gKGNvbmZpZykgPT4gKHByb3BzLCBpc1N0YXRpYykgPT4ge1xuICBjb25zdCBjb250ZXh0ID0gKDAsIGltcG9ydF9yZWFjdDI0LnVzZUNvbnRleHQpKE1vdGlvbkNvbnRleHQpO1xuICBjb25zdCBwcmVzZW5jZUNvbnRleHQgPSAoMCwgaW1wb3J0X3JlYWN0MjQudXNlQ29udGV4dCkoUHJlc2VuY2VDb250ZXh0KTtcbiAgY29uc3QgbWFrZSA9ICgpID0+IG1ha2VTdGF0ZShjb25maWcsIHByb3BzLCBjb250ZXh0LCBwcmVzZW5jZUNvbnRleHQpO1xuICByZXR1cm4gaXNTdGF0aWMgPyBtYWtlKCkgOiB1c2VDb25zdGFudChtYWtlKTtcbn07XG5mdW5jdGlvbiBtYWtlTGF0ZXN0VmFsdWVzKHByb3BzLCBjb250ZXh0LCBwcmVzZW5jZUNvbnRleHQsIHNjcmFwZU1vdGlvblZhbHVlcykge1xuICBjb25zdCB2YWx1ZXMgPSB7fTtcbiAgY29uc3QgbW90aW9uVmFsdWVzID0gc2NyYXBlTW90aW9uVmFsdWVzKHByb3BzLCB7fSk7XG4gIGZvciAoY29uc3Qga2V5IGluIG1vdGlvblZhbHVlcykge1xuICAgIHZhbHVlc1trZXldID0gcmVzb2x2ZU1vdGlvblZhbHVlKG1vdGlvblZhbHVlc1trZXldKTtcbiAgfVxuICBsZXQgeyBpbml0aWFsLCBhbmltYXRlOiBhbmltYXRlMiB9ID0gcHJvcHM7XG4gIGNvbnN0IGlzQ29udHJvbGxpbmdWYXJpYW50cyQxID0gaXNDb250cm9sbGluZ1ZhcmlhbnRzKHByb3BzKTtcbiAgY29uc3QgaXNWYXJpYW50Tm9kZSQxID0gaXNWYXJpYW50Tm9kZShwcm9wcyk7XG4gIGlmIChjb250ZXh0ICYmIGlzVmFyaWFudE5vZGUkMSAmJiAhaXNDb250cm9sbGluZ1ZhcmlhbnRzJDEgJiYgcHJvcHMuaW5oZXJpdCAhPT0gZmFsc2UpIHtcbiAgICBpZiAoaW5pdGlhbCA9PT0gdm9pZCAwKVxuICAgICAgaW5pdGlhbCA9IGNvbnRleHQuaW5pdGlhbDtcbiAgICBpZiAoYW5pbWF0ZTIgPT09IHZvaWQgMClcbiAgICAgIGFuaW1hdGUyID0gY29udGV4dC5hbmltYXRlO1xuICB9XG4gIGxldCBpc0luaXRpYWxBbmltYXRpb25CbG9ja2VkID0gcHJlc2VuY2VDb250ZXh0ID8gcHJlc2VuY2VDb250ZXh0LmluaXRpYWwgPT09IGZhbHNlIDogZmFsc2U7XG4gIGlzSW5pdGlhbEFuaW1hdGlvbkJsb2NrZWQgPSBpc0luaXRpYWxBbmltYXRpb25CbG9ja2VkIHx8IGluaXRpYWwgPT09IGZhbHNlO1xuICBjb25zdCB2YXJpYW50VG9TZXQgPSBpc0luaXRpYWxBbmltYXRpb25CbG9ja2VkID8gYW5pbWF0ZTIgOiBpbml0aWFsO1xuICBpZiAodmFyaWFudFRvU2V0ICYmIHR5cGVvZiB2YXJpYW50VG9TZXQgIT09IFwiYm9vbGVhblwiICYmICFpc0FuaW1hdGlvbkNvbnRyb2xzKHZhcmlhbnRUb1NldCkpIHtcbiAgICBjb25zdCBsaXN0ID0gQXJyYXkuaXNBcnJheSh2YXJpYW50VG9TZXQpID8gdmFyaWFudFRvU2V0IDogW3ZhcmlhbnRUb1NldF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVWYXJpYW50RnJvbVByb3BzKHByb3BzLCBsaXN0W2ldKTtcbiAgICAgIGlmIChyZXNvbHZlZCkge1xuICAgICAgICBjb25zdCB7IHRyYW5zaXRpb25FbmQsIHRyYW5zaXRpb24sIC4uLnRhcmdldCB9ID0gcmVzb2x2ZWQ7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHRhcmdldCkge1xuICAgICAgICAgIGxldCB2YWx1ZVRhcmdldCA9IHRhcmdldFtrZXldO1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlVGFyZ2V0KSkge1xuICAgICAgICAgICAgY29uc3QgaW5kZXggPSBpc0luaXRpYWxBbmltYXRpb25CbG9ja2VkID8gdmFsdWVUYXJnZXQubGVuZ3RoIC0gMSA6IDA7XG4gICAgICAgICAgICB2YWx1ZVRhcmdldCA9IHZhbHVlVGFyZ2V0W2luZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHZhbHVlVGFyZ2V0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWx1ZXNba2V5XSA9IHZhbHVlVGFyZ2V0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0cmFuc2l0aW9uRW5kKSB7XG4gICAgICAgICAgdmFsdWVzW2tleV0gPSB0cmFuc2l0aW9uRW5kW2tleV07XG4gICAgICAgI
10617H1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHZhbHVlcztcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2h0bWwvdXRpbHMva2V5cy10cmFuc2Zvcm0ubWpzXG52YXIgaW1wb3J0X2Rpc3QxNzggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE3OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDE4MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciB0cmFuc2Zvcm1Qcm9wT3JkZXIgPSBbXG4gIFwidHJhbnNmb3JtUGVyc3BlY3RpdmVcIixcbiAgXCJ4XCIsXG4gIFwieVwiLFxuICBcInpcIixcbiAgXCJ0cmFuc2xhdGVYXCIsXG4gIFwidHJhbnNsYXRlWVwiLFxuICBcInRyYW5zbGF0ZVpcIixcbiAgXCJzY2FsZVwiLFxuICBcInNjYWxlWFwiLFxuICBcInNjYWxlWVwiLFxuICBcInJvdGF0ZVwiLFxuICBcInJvdGF0ZVhcIixcbiAgXCJyb3RhdGVZXCIsXG4gIFwicm90YXRlWlwiLFxuICBcInNrZXdcIixcbiAgXCJza2V3WFwiLFxuICBcInNrZXdZXCJcbl07XG52YXIgdHJhbnNmb3JtUHJvcHMgPSBuZXcgU2V0KHRyYW5zZm9ybVByb3BPcmRlcik7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9zdmcvdXRpbHMvYnVpbGQtYXR0cnMubWpzXG52YXIgaW1wb3J0X2Rpc3QyMjAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDIyMSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDIyMiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2h0bWwvdXRpbHMvYnVpbGQtc3R5bGVzLm1qc1xudmFyIGltcG9ydF9kaXN0MjExID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyMTIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyMTMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9kb20vdXRpbHMvaXMtY3NzLXZhcmlhYmxlLm1qc1xudmFyIGltcG9ydF9kaXN0MTgxID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxODIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxODMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgY2hlY2tTdHJpbmdTdGFydHNXaXRoID0gKHRva2VuKSA9PiAoa2V5KSA9PiB0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiICYmIGtleS5zdGFydHNXaXRoKHRva2VuKTtcbnZhciBpc0NTU1ZhcmlhYmxlTmFtZSA9IGNoZWNrU3RyaW5nU3RhcnRzV2l0aChcIi0tXCIpO1xudmFyIHN0YXJ0c0FzVmFyaWFibGVUb2tlbiA9IGNoZWNrU3RyaW5nU3RhcnRzV2l0aChcInZhcigtLVwiKTtcbnZhciBpc0NTU1ZhcmlhYmxlVG9rZW4gPSAodmFsdWUpID0+IHtcbiAgY29uc3Qgc3RhcnRzV2l0aFRva2VuID0gc3RhcnRzQXNWYXJpYWJsZVRva2VuKHZhbHVlKTtcbiAgaWYgKCFzdGFydHNXaXRoVG9rZW4pXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gc2luZ2xlQ3NzVmFyaWFibGVSZWdleC50ZXN0KHZhbHVlLnNwbGl0KFwiLypcIilbMF0udHJpbSgpKTtcbn07XG52YXIgc2luZ2xlQ3NzVmFyaWFibGVSZWdleCA9IC92YXJcXCgtLSg/OltcXHctXStcXHMqfFtcXHctXStcXHMqLCg/OlxccypbXikoXFxzXXxcXHMqXFwoKD86W14pKF18XFwoW14pKF0qXFwpKSpcXCkpK1xccyopXFwpJC9pdTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2RvbS92YWx1ZS10eXBlcy9nZXQtYXMtdHlwZS5tanNcbnZhciBpbXBvcnRfZGlzdDE4NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTg1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTg2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGdldFZhbHVlQXNUeXBlID0gKHZhbHVlLCB0eXBlKSA9PiB7XG4gIHJldHVybiB0eXBlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIiA/IHR5cGUudHJhbnNmb3JtKHZhbHVlKSA6IHZhbHVlO1xufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2RvbS92YWx1ZS10eXBlcy9udW1iZXIubWpzXG52YXIgaW1wb3J0X2Rpc3QyMDUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDIwNiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDIwNyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdHlwZXMvbnVtYmVycy9pbmRleC5tanNcbnZhciBpbXBvcnRfZGlzdDE
106175MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTkxID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTkyID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy9jbGFtcC5tanNcbnZhciBpbXBvcnRfZGlzdDE4NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTg4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTg5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGNsYW1wID0gKG1pbiwgbWF4LCB2KSA9PiB7XG4gIGlmICh2ID4gbWF4KVxuICAgIHJldHVybiBtYXg7XG4gIGlmICh2IDwgbWluKVxuICAgIHJldHVybiBtaW47XG4gIHJldHVybiB2O1xufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdHlwZXMvbnVtYmVycy9pbmRleC5tanNcbnZhciBudW1iZXIgPSB7XG4gIHRlc3Q6ICh2KSA9PiB0eXBlb2YgdiA9PT0gXCJudW1iZXJcIixcbiAgcGFyc2U6IHBhcnNlRmxvYXQsXG4gIHRyYW5zZm9ybTogKHYpID0+IHZcbn07XG52YXIgYWxwaGEgPSB7XG4gIC4uLm51bWJlcixcbiAgdHJhbnNmb3JtOiAodikgPT4gY2xhbXAoMCwgMSwgdilcbn07XG52YXIgc2NhbGUgPSB7XG4gIC4uLm51bWJlcixcbiAgZGVmYXVsdDogMVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdHlwZXMvbnVtYmVycy91bml0cy5tanNcbnZhciBpbXBvcnRfZGlzdDE5MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTk0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTk1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGNyZWF0ZVVuaXRUeXBlID0gKHVuaXQpID0+ICh7XG4gIHRlc3Q6ICh2KSA9PiB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiAmJiB2LmVuZHNXaXRoKHVuaXQpICYmIHYuc3BsaXQoXCIgXCIpLmxlbmd0aCA9PT0gMSxcbiAgcGFyc2U6IHBhcnNlRmxvYXQsXG4gIHRyYW5zZm9ybTogKHYpID0+IGAke3Z9JHt1bml0fWBcbn0pO1xudmFyIGRlZ3JlZXMgPSBjcmVhdGVVbml0VHlwZShcImRlZ1wiKTtcbnZhciBwZXJjZW50ID0gY3JlYXRlVW5pdFR5cGUoXCIlXCIpO1xudmFyIHB4ID0gY3JlYXRlVW5pdFR5cGUoXCJweFwiKTtcbnZhciB2aCA9IGNyZWF0ZVVuaXRUeXBlKFwidmhcIik7XG52YXIgdncgPSBjcmVhdGVVbml0VHlwZShcInZ3XCIpO1xudmFyIHByb2dyZXNzUGVyY2VudGFnZSA9IHtcbiAgLi4ucGVyY2VudCxcbiAgcGFyc2U6ICh2KSA9PiBwZXJjZW50LnBhcnNlKHYpIC8gMTAwLFxuICB0cmFuc2Zvcm06ICh2KSA9PiBwZXJjZW50LnRyYW5zZm9ybSh2ICogMTAwKVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2RvbS92YWx1ZS10eXBlcy9udW1iZXItYnJvd3Nlci5tanNcbnZhciBpbXBvcnRfZGlzdDE5NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTk3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTk4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGJyb3dzZXJOdW1iZXJWYWx1ZVR5cGVzID0ge1xuICAvLyBCb3JkZXIgcHJvcHNcbiAgYm9yZGVyV2lkdGg6IHB4LFxuICBib3JkZXJUb3BXaWR0aDogcHgsXG4gIGJvcmRlclJpZ2h0V2lkdGg6IHB4LFxuICBib3JkZXJCb3R0b21XaWR0aDogcHgsXG4gIGJvcmRlckxlZnRXaWR0aDogcHgsXG4gIGJvcmRlclJhZGl1czogcHgsXG4gIHJhZGl1czogcHgsXG4gIGJvcmRlclRvcExlZnRSYWRpdXM6IHB4LFxuICBib3JkZXJUb3BSaWdodFJhZGl1czogcHgsXG4gIGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzOiBweCxcbiAgYm9yZGVyQm90dG9tTGVmdFJhZGl1czogcHgsXG4gIC8vIFBvc2l0aW9uaW5nIHByb3BzXG4gIHdpZHRoOiBweCxcbiAgbWF4V2lkdGg6IHB4LFxuICBoZWlnaHQ6IHB4LFxuICBtYXhIZWlnaHQ6IHB4LFxuICB0b3A6IHB4LFxuICByaWdodDogcHgsXG4gIGJvdHRvbTogcHgsXG4gIGxlZnQ6IHB4LFxuICAvLyBTcGFjaW5nIHByb3BzXG4gIHBhZGRpbmc6IHB4LFxuICBwYWRkaW5nVG9wOiBweCxcbiAgcGFkZGluZ1JpZ2h0OiBweCxcbiAgcGFkZGluZ0JvdHRvbTogcHgsXG4gIHBhZGRpbmdMZWZ0OiBweCxcbiAgbWFyZ2luOiBweCxcbiAgbWFyZ2luVG9wOiBweCxcbiAgbWFyZ2luUmlnaHQ6IHB4LFxuICBtYXJnaW5Cb3R0b206IHB4LFxuICBtYXJnaW5MZWZ0OiBweCxcbiAgLy8gTWlzY1xuICBiYWNrZ3JvdW5kUG9zaXRpb25YOiBweCxcbiAgYmFja2dyb3VuZFBvc2l0aW9uWTogcHhcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9kb20vdmFsdWUtdHlwZXMvdHJhbnNmb3JtLm1qc1xudmFyIGltcG9ydF9kaXN0MTk5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyMDAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyMDEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgdHJhbnNmb3JtVmFsdWVUeXBlcyA9IHtcbiAgcm90YXRlOiBkZWdyZWVzLFxuICByb3RhdGVYOiBkZWdyZWVzLFxuICByb3RhdGVZOiBkZWdyZWVzLFxuICByb3RhdGVaOiBkZWdyZWVzLFxuICBzY2FsZSxcbiAgc2NhbGVYOiBzY2FsZSxcbiAgc2NhbGVZOiBzY2FsZSxcbiAgc2NhbGVaOiBzY2FsZSxcbiAgc2tldzogZGVncmVlcyxcbiAgc2tld1g6IGRlZ3JlZXMsXG4gIHNrZXdZOiBkZWdyZWVzLFxuICBkaXN0YW5jZTogcHgsXG4gIHRyYW5zbGF0ZVg6IHB4LFxuICB0cmFuc2xhdGVZOiBweCxcbiAgdHJhbnNsYXRlWjogcHgsXG4gIHg6IHB4LFxuICB5OiBweCxcbiAgejogcHgsXG4gIHBlcnNwZWN0aXZlOiBweCxcbiAgdHJhbnNmb3JtUGVyc3BlY3RpdmU6IHB4LFxuICBvcGFjaXR5OiBhbHBoYSxcbiAgb3JpZ2luWDogcHJvZ3Jlc3NQZXJjZW50YWdlLFxuICBvcmlnaW5ZOiBwcm9ncmVzc1BlcmNlbnRhZ2UsXG4gIG9yaWdpblo6IHB4XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3ZhbHVlLXR5cGVzL3R5cGUtaW50Lm1qc1xudmFyIGltcG9ydF9kaXN0MjAyID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyMDMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyMDQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW50ID0ge1xuICAuLi5udW1iZXIsXG4gIHRyYW5zZm9ybTogTWF0aC5yb3VuZFxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2RvbS92YWx1ZS10eXBlcy9udW1iZXIubWpzXG52YXIgbnVtYmVyVmFsdWVUeXBlcyA9IHtcbiAgLi4uYnJvd3Nlck51bWJlclZhbHVlVHlwZXMsXG4gIC4uLnRyYW5zZm9ybVZhbHVlVHlwZXMsXG4gIHpJbmRleDogaW50LFxuICBzaXplOiBweCxcbiAgLy8gU1ZHXG4gIGZpbGxPcGFjaXR5OiBhbHBoYSxcbiAgc3Ryb2tlT3BhY2l0eTogYWxwaGEsXG4gIG51bU9jdGF2ZXM6IGludFxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2h0bWwvdXRpbHMvYnVpbGQtdHJhbnNmb3JtLm1qc1xudmFyIGltcG9ydF9kaXN0MjA4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyMDkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyMTAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgdHJhbnNsYXRlQWxpYXMgPSB7XG4gIHg6IFwidHJhbnNsYXRlWFwiLFxuICB5OiBcInRyYW5zbGF0ZVlcIixcbiAgejogXCJ0cmFuc2xhdGVaXCIsXG4gIHRyYW5zZm9ybVBlcnNwZWN0aXZlOiBcInBlcnNwZWN0aXZlXCJcbn07XG52YXIgbnVtVHJhbnNmb3JtcyA9IHRyYW5zZm9ybVByb3BPcmRlci5sZW5ndGg7XG5mdW5jdGlvbiBidWlsZFRyYW5zZm9ybShsYXRlc3RWYWx1ZXMsIHRyYW5zZm9ybTIsIHRyYW5zZm9ybVRlbXBsYXRlKSB7XG4gIGxldCB0cmFuc2Zvcm1TdHJpbmcgPSBcIlwiO
106171xuICBsZXQgdHJhbnNmb3JtSXNEZWZhdWx0ID0gdHJ1ZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1UcmFuc2Zvcm1zOyBpKyspIHtcbiAgICBjb25zdCBrZXkgPSB0cmFuc2Zvcm1Qcm9wT3JkZXJbaV07XG4gICAgY29uc3QgdmFsdWUgPSBsYXRlc3RWYWx1ZXNba2V5XTtcbiAgICBpZiAodmFsdWUgPT09IHZvaWQgMClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGxldCB2YWx1ZUlzRGVmYXVsdCA9IHRydWU7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgdmFsdWVJc0RlZmF1bHQgPSB2YWx1ZSA9PT0gKGtleS5zdGFydHNXaXRoKFwic2NhbGVcIikgPyAxIDogMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlSXNEZWZhdWx0ID0gcGFyc2VGbG9hdCh2YWx1ZSkgPT09IDA7XG4gICAgfVxuICAgIGlmICghdmFsdWVJc0RlZmF1bHQgfHwgdHJhbnNmb3JtVGVtcGxhdGUpIHtcbiAgICAgIGNvbnN0IHZhbHVlQXNUeXBlID0gZ2V0VmFsdWVBc1R5cGUodmFsdWUsIG51bWJlclZhbHVlVHlwZXNba2V5XSk7XG4gICAgICBpZiAoIXZhbHVlSXNEZWZhdWx0KSB7XG4gICAgICAgIHRyYW5zZm9ybUlzRGVmYXVsdCA9IGZhbHNlO1xuICAgICAgICBjb25zdCB0cmFuc2Zvcm1OYW1lID0gdHJhbnNsYXRlQWxpYXNba2V5XSB8fCBrZXk7XG4gICAgICAgIHRyYW5zZm9ybVN0cmluZyArPSBgJHt0cmFuc2Zvcm1OYW1lfSgke3ZhbHVlQXNUeXBlfSkgYDtcbiAgICAgIH1cbiAgICAgIGlmICh0cmFuc2Zvcm1UZW1wbGF0ZSkge1xuICAgICAgICB0cmFuc2Zvcm0yW2tleV0gPSB2YWx1ZUFzVHlwZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgdHJhbnNmb3JtU3RyaW5nID0gdHJhbnNmb3JtU3RyaW5nLnRyaW0oKTtcbiAgaWYgKHRyYW5zZm9ybVRlbXBsYXRlKSB7XG4gICAgdHJhbnNmb3JtU3RyaW5nID0gdHJhbnNmb3JtVGVtcGxhdGUodHJhbnNmb3JtMiwgdHJhbnNmb3JtSXNEZWZhdWx0ID8gXCJcIiA6IHRyYW5zZm9ybVN0cmluZyk7XG4gIH0gZWxzZSBpZiAodHJhbnNmb3JtSXNEZWZhdWx0KSB7XG4gICAgdHJhbnNmb3JtU3RyaW5nID0gXCJub25lXCI7XG4gIH1cbiAgcmV0dXJuIHRyYW5zZm9ybVN0cmluZztcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2h0bWwvdXRpbHMvYnVpbGQtc3R5bGVzLm1qc1xuZnVuY3Rpb24gYnVpbGRIVE1MU3R5bGVzKHN0YXRlMiwgbGF0ZXN0VmFsdWVzLCB0cmFuc2Zvcm1UZW1wbGF0ZSkge1xuICBjb25zdCB7IHN0eWxlLCB2YXJzLCB0cmFuc2Zvcm1PcmlnaW4gfSA9IHN0YXRlMjtcbiAgbGV0IGhhc1RyYW5zZm9ybTIgPSBmYWxzZTtcbiAgbGV0IGhhc1RyYW5zZm9ybU9yaWdpbiA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGtleSBpbiBsYXRlc3RWYWx1ZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGxhdGVzdFZhbHVlc1trZXldO1xuICAgIGlmICh0cmFuc2Zvcm1Qcm9wcy5oYXMoa2V5KSkge1xuICAgICAgaGFzVHJhbnNmb3JtMiA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKGlzQ1NTVmFyaWFibGVOYW1lKGtleSkpIHtcbiAgICAgIHZhcnNba2V5XSA9IHZhbHVlO1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHZhbHVlQXNUeXBlID0gZ2V0VmFsdWVBc1R5cGUodmFsdWUsIG51bWJlclZhbHVlVHlwZXNba2V5XSk7XG4gICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoXCJvcmlnaW5cIikpIHtcbiAgICAgICAgaGFzVHJhbnNmb3JtT3JpZ2luID0gdHJ1ZTtcbiAgICAgICAgdHJhbnNmb3JtT3JpZ2luW2tleV0gPSB2YWx1ZUFzVHlwZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlW2tleV0gPSB2YWx1ZUFzVHlwZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKCFsYXRlc3RWYWx1ZXMudHJhbnNmb3JtKSB7XG4gICAgaWYgKGhhc1RyYW5zZm9ybTIgfHwgdHJhbnNmb3JtVGVtcGxhdGUpIHtcbiAgICAgIHN0eWxlLnRyYW5zZm9ybSA9IGJ1aWxkVHJhbnNmb3JtKGxhdGVzdFZhbHVlcywgc3RhdGUyLnRyYW5zZm9ybSwgdHJhbnNmb3JtVGVtcGxhdGUpO1xuICAgIH0gZWxzZSBpZiAoc3R5bGUudHJhbnNmb3JtKSB7XG4gICAgICBzdHlsZS50cmFuc2Zvcm0gPSBcIm5vbmVcIjtcbiAgICB9XG4gIH1cbiAgaWYgKGhhc1RyYW5zZm9ybU9yaWdpbikge1xuICAgIGNvbnN0IHsgb3JpZ2luWCA9IFwiNTAlXCIsIG9yaWdpblkgPSBcIjUwJVwiLCBvcmlnaW5aID0gMCB9ID0gdHJhbnNmb3JtT3JpZ2luO1xuICAgIHN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IGAke29yaWdpblh9ICR7b3JpZ2luWX0gJHtvcmlnaW5afWA7XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL3N2Zy91dGlscy9wYXRoLm1qc1xudmFyIGltcG9ydF9kaXN0MjE0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyMTUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyMTYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgZGFzaEtleXMgPSB7XG4gIG9mZnNldDogXCJzdHJva2UtZGFzaG9mZnNldFwiLFxuICBhcnJheTogXCJzdHJva2UtZGFzaGFycmF5XCJcbn07XG52YXIgY2FtZWxLZXlzID0ge1xuICBvZmZzZXQ6IFwic3Ryb2tlRGFzaG9mZnNldFwiLFxuICBhcnJheTogXCJzdHJva2VEYXNoYXJyYXlcIlxufTtcbmZ1bmN0aW9uIGJ1aWxkU1ZHUGF0aChhdHRycywgbGVuZ3RoLCBzcGFjaW5nID0gMSwgb2Zmc2V0ID0gMCwgdXNlRGFzaENhc2UgPSB0cnVlKSB7XG4gIGF0dHJzLnBhdGhMZW5ndGggPSAxO1xuICBjb25zdCBrZXlzMiA9IHVzZURhc2hDYXNlID8gZGFzaEtleXMgOiBjYW1lbEtleXM7XG4gIGF0dHJzW2tleXMyLm9mZnNldF0gPSBweC50cmFuc2Zvcm0oLW9mZnNldCk7XG4gIGNvbnN0IHBhdGhMZW5ndGggPSBweC50cmFuc2Zvcm0obGVuZ3RoKTtcbiAgY29uc3QgcGF0aFNwYWNpbmcgPSBweC50cmFuc2Zvcm0oc3BhY2luZyk7XG4gIGF0dHJzW2tleXMyLmFycmF5XSA9IGAke3BhdGhMZW5ndGh9ICR7cGF0aFNwYWNpbmd9YDtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL3N2Zy91dGlscy90cmFuc2Zvcm0tb3JpZ2luLm1qc1xudmFyIGltcG9ydF9kaXN0MjE3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyMTggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyMTkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBjYWxjT3JpZ2luKG9yaWdpbiwgb2Zmc2V0LCBzaXplKSB7XG4gIHJldHVybi
10617B0eXBlb2Ygb3JpZ2luID09PSBcInN0cmluZ1wiID8gb3JpZ2luIDogcHgudHJhbnNmb3JtKG9mZnNldCArIHNpemUgKiBvcmlnaW4pO1xufVxuZnVuY3Rpb24gY2FsY1NWR1RyYW5zZm9ybU9yaWdpbihkaW1lbnNpb25zLCBvcmlnaW5YLCBvcmlnaW5ZKSB7XG4gIGNvbnN0IHB4T3JpZ2luWCA9IGNhbGNPcmlnaW4ob3JpZ2luWCwgZGltZW5zaW9ucy54LCBkaW1lbnNpb25zLndpZHRoKTtcbiAgY29uc3QgcHhPcmlnaW5ZID0gY2FsY09yaWdpbihvcmlnaW5ZLCBkaW1lbnNpb25zLnksIGRpbWVuc2lvbnMuaGVpZ2h0KTtcbiAgcmV0dXJuIGAke3B4T3JpZ2luWH0gJHtweE9yaWdpbll9YDtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL3N2Zy91dGlscy9idWlsZC1hdHRycy5tanNcbmZ1bmN0aW9uIGJ1aWxkU1ZHQXR0cnMoc3RhdGUyLCB7XG4gIGF0dHJYLFxuICBhdHRyWSxcbiAgYXR0clNjYWxlLFxuICBvcmlnaW5YLFxuICBvcmlnaW5ZLFxuICBwYXRoTGVuZ3RoLFxuICBwYXRoU3BhY2luZyA9IDEsXG4gIHBhdGhPZmZzZXQgPSAwLFxuICAvLyBUaGlzIGlzIG9iamVjdCBjcmVhdGlvbiwgd2hpY2ggd2UgdHJ5IHRvIGF2b2lkIHBlci1mcmFtZS5cbiAgLi4ubGF0ZXN0XG59LCBpc1NWR1RhZzIsIHRyYW5zZm9ybVRlbXBsYXRlKSB7XG4gIGJ1aWxkSFRNTFN0eWxlcyhzdGF0ZTIsIGxhdGVzdCwgdHJhbnNmb3JtVGVtcGxhdGUpO1xuICBpZiAoaXNTVkdUYWcyKSB7XG4gICAgaWYgKHN0YXRlMi5zdHlsZS52aWV3Qm94KSB7XG4gICAgICBzdGF0ZTIuYXR0cnMudmlld0JveCA9IHN0YXRlMi5zdHlsZS52aWV3Qm94O1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgc3RhdGUyLmF0dHJzID0gc3RhdGUyLnN0eWxlO1xuICBzdGF0ZTIuc3R5bGUgPSB7fTtcbiAgY29uc3QgeyBhdHRycywgc3R5bGUsIGRpbWVuc2lvbnMgfSA9IHN0YXRlMjtcbiAgaWYgKGF0dHJzLnRyYW5zZm9ybSkge1xuICAgIGlmIChkaW1lbnNpb25zKVxuICAgICAgc3R5bGUudHJhbnNmb3JtID0gYXR0cnMudHJhbnNmb3JtO1xuICAgIGRlbGV0ZSBhdHRycy50cmFuc2Zvcm07XG4gIH1cbiAgaWYgKGRpbWVuc2lvbnMgJiYgKG9yaWdpblggIT09IHZvaWQgMCB8fCBvcmlnaW5ZICE9PSB2b2lkIDAgfHwgc3R5bGUudHJhbnNmb3JtKSkge1xuICAgIHN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IGNhbGNTVkdUcmFuc2Zvcm1PcmlnaW4oZGltZW5zaW9ucywgb3JpZ2luWCAhPT0gdm9pZCAwID8gb3JpZ2luWCA6IDAuNSwgb3JpZ2luWSAhPT0gdm9pZCAwID8gb3JpZ2luWSA6IDAuNSk7XG4gIH1cbiAgaWYgKGF0dHJYICE9PSB2b2lkIDApXG4gICAgYXR0cnMueCA9IGF0dHJYO1xuICBpZiAoYXR0clkgIT09IHZvaWQgMClcbiAgICBhdHRycy55ID0gYXR0clk7XG4gIGlmIChhdHRyU2NhbGUgIT09IHZvaWQgMClcbiAgICBhdHRycy5zY2FsZSA9IGF0dHJTY2FsZTtcbiAgaWYgKHBhdGhMZW5ndGggIT09IHZvaWQgMCkge1xuICAgIGJ1aWxkU1ZHUGF0aChhdHRycywgcGF0aExlbmd0aCwgcGF0aFNwYWNpbmcsIHBhdGhPZmZzZXQsIGZhbHNlKTtcbiAgfVxufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvc3ZnL3V0aWxzL2NyZWF0ZS1yZW5kZXItc3RhdGUubWpzXG52YXIgaW1wb3J0X2Rpc3QyMjYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDIyNyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDIyOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2h0bWwvdXRpbHMvY3JlYXRlLXJlbmRlci1zdGF0ZS5tanNcbnZhciBpbXBvcnRfZGlzdDIyMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjI0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjI1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGNyZWF0ZUh0bWxSZW5kZXJTdGF0ZSA9ICgpID0+ICh7XG4gIHN0eWxlOiB7fSxcbiAgdHJhbnNmb3JtOiB7fSxcbiAgdHJhbnNmb3JtT3JpZ2luOiB7fSxcbiAgdmFyczoge31cbn0pO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvc3ZnL3V0aWxzL2NyZWF0ZS1yZW5kZXItc3RhdGUubWpzXG52YXIgY3JlYXRlU3ZnUmVuZGVyU3RhdGUgPSAoKSA9PiAoe1xuICAuLi5jcmVhdGVIdG1sUmVuZGVyU3RhdGUoKSxcbiAgYXR0cnM6IHt9XG59KTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL3N2Zy91dGlscy9pcy1zdmctdGFnLm1qc1xudmFyIGltcG9ydF9kaXN0MjI5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyMzAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyMzEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaXNTVkdUYWcgPSAodGFnKSA9PiB0eXBlb2YgdGFnID09PSBcInN0cmluZ1wiICYmIHRhZy50b0xvd2VyQ2FzZSgpID09PSBcInN2Z1wiO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvc3ZnL3V0aWxzL3JlbmRlci5tanNcbnZhciBpbXBvcnRfZGlzdDIzOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjM5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0MjQwID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvaHRtbC91dGlscy9yZW5kZXIubWpzXG52YXIgaW1wb3J0X2Rpc3QyMzIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDIzMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDIzNCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIHJlbmRlckhUTUwoZWxlbWVudCwgeyBzdHlsZSwgdmFycyB9LCBzdHlsZVByb3AsIHByb2plY3Rpb24pIHtcbiAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSwgcHJvamVjdGlvbiAmJiBwcm9qZWN0aW9uLmdldFByb2plY3Rpb25TdHlsZXMoc3R5bGVQcm9wKSk7XG4gIGZvciAoY29uc3Qga2V5IGluIHZhcnMpIHtcbiAgICBlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KGtleSwgdmFyc1trZXldKTtcbiAgfVxufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvc3ZnL3V0aWxzL2NhbWVsLWNhc2UtYXR0cnMubWpzXG52YXIgaW1wb3J0X2Rpc3QyMzUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDIzNiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDIzNyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBjYW1lbENhc2VBdHRyaWJ1dGVzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1xuICBcImJhc2VGcmVxdWVuY3lcIixcbiAgXCJkaWZmdXNlQ29uc3RhbnRcIixcbiAgXCJrZXJuZWxNYXRyaXhcIixcbiAgXCJrZXJuZWxVbml0TGVuZ3RoXCIsXG4gIFwia2V5U3BsaW5lc1wiLFxuICBcImtleVRpbWVzXCIsXG4gIFwibGltaXRpbmdDb25lQW5nbGVcIixcbiAgXCJtYXJrZXJIZWlnaHRcIixcbiAgXCJtYXJrZXJXaWR0aFwiLFxuICBcIm51bU9jdGF2ZXNcIixcbiAgXCJ0YXJnZXRYXCIsXG4gIFwidGFyZ2V0WVwiLFxuICBcInN1cmZhY2VTY2FsZVwiLFxuICBcInNwZWN1bGFyQ29uc3RhbnRcIixcbiAgXCJzcGVjdWxhckV4cG9uZW50XCIsXG4gIFwic3RkRGV2aWF0aW9uXCIsXG4gIFwidGFibGVWYWx1ZXNcIixcbiAgXCJ2aWV3Qm94XCIsXG4gIFwiZ3JhZGllbnRUcmFuc2Zvcm1cIixcbiAgXCJwYXRoTGVuZ3RoXCIsXG4gIFwic3RhcnRPZmZzZXRcIixcbiAgXCJ0ZXh0TGVuZ3RoXCIsXG4gIFwibGVuZ3RoQWRqdXN0XCJcbl0pO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvc3ZnL3V0aWxzL3JlbmRlci5tanNcbmZ1bmN0aW9uIHJlbmRlclNWRyhlbGVtZW50LCByZW5kZXJTdGF0ZSwgX3N0eWxlUHJvcCwgcHJvamVjdGlvbikge1xuICByZW5kZXJIVE1MKGVsZW1lbnQsIHJlbmRlclN0YXRlLCB2b2lkIDAsIHByb2plY3Rpb24pO1xuICBmb3IgKGNvbnN0IGtleSBpbiByZW5kZXJTdGF0ZS5hdHRycykge1xuICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCFjYW1lbENhc2VBdHRyaWJ1dGVzLmhhcyhrZXkpID8gY2FtZWxUb0Rhc2goa2V5KSA6IGtleSwgcmVuZGVyU3RhdGUuYXR0cnNba2V5XSk7XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL3N2Zy91dGlscy9zY3JhcGUtbW90aW9uLXZhbHVlcy5tanNcbnZhciBpbXBvcnRfZGlzdDI1MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjUxID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjUyID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvaHRtbC91dGlscy9zY3JhcGUtbW90aW9uLXZhbHVlcy5tanNcbnZhciBpbXBvcnRfZGlzdDI0NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjQ4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjQ5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9tb3Rpb24vdXRpbHMvaXMtZm9yY2VkLW1vdGlvbi12YWx1ZS5tanNcbnZhciBpbXBvcnRfZGlzdDI0NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjQ1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjQ2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9wcm9qZWN0aW9uL3N0eWxlcy9zY2FsZS1jb3JyZWN0aW9uLm1qc1xudmFyIGltcG9ydF9kaXN0MjQxID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyNDIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyNDMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgc2NhbGVDb3JyZWN0b3JzID0ge307XG5mdW5jdGlvbiBhZGRTY2FsZUNvcnJlY3Rvcihjb3JyZWN0b3JzKSB7XG4gIE9iamVjdC5hc3NpZ24oc2NhbGVDb3JyZWN0b3JzLCBjb3JyZWN0b3JzKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvbW90aW9uL3V0aWxzL2lzLWZvcmNlZC1tb3Rpb24tdmFsdWUubWpzXG5mdW5jdGlvbiBpc0ZvcmNlZE1vdGlvblZhbHVlKGtleSwgeyBsYXlvdXQ6IGxheW91dDIsIGxheW91dElkIH0pIHtcbiAgcmV0dXJuIHRyYW5zZm9ybVByb3BzLmhhcyhrZXkpIHx8IGtleS5zdGFydHNXaXRoKFwib3JpZ2luXCIpIHx8IChsYXlvdXQyIHx8IGxheW91dElkICE9PSB2b2lkIDApICYmICghIXNjYWxlQ29ycmVjdG9yc1trZXldIHx8IGtleSA9PT0gXCJvcGFjaXR5XCIpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvaHRtbC91dGlscy9zY3JhcGUtbW90aW9uLXZhbHVlcy5tanNcbmZ1bmN0aW9uIHNjcmFwZU1vdGlvblZhbHVlc0Zyb21Qcm9wcyhwcm9wcywgcHJldlByb3BzLCB2aXN1YWxFbGVtZW50KSB7XG4gIHZhciBfYTtcbiAgY29uc3QgeyBzdHlsZSB9ID0gcHJvcHM7XG4gIGNvbnN0IG5ld1ZhbHVlcyA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBpbiBzdHlsZSkge1xuICAgIGlmIChpc01vdGlvblZhbHVlKHN0eWxlW2tleV0pIHx8IHByZXZQcm9wcy5zdHlsZSAmJiBpc01vdGlvblZhbHVlKHByZXZQcm9wcy5zdHlsZVtrZXldKSB8fCBpc0ZvcmNlZE1vdGlvblZhbHVlKGtleSwgcHJvcHMpIHx8ICgoX2EgPSB2aXN1YWxFbGVtZW50ID09PSBudWxsIHx8IHZpc3VhbEVsZW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHZpc3VhbEVsZW1lbnQuZ2V0VmFsdWUoa2V5KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxpdmVTdHlsZSkgIT09IHZvaWQgMCkge1xuICAgICAgbmV3VmFsdWVzW2tleV0gPSBzdHlsZVtrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3VmFsdWVzO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvc3ZnL3V0aWxzL3NjcmFwZS1tb3Rpb24tdmFsdWVzLm1qc1xuZnVuY3Rpb24gc2NyYXBlTW90aW9uVmFsdWVzRnJvbVByb3BzMihwcm9wcywgcHJldlByb3BzLCB2aXN1YWxFbGVtZW50KSB7XG4gIGNvbnN0IG5ld1ZhbHVlcyA9IHNjcmFwZU1vdGlvblZhbHVlc0Zyb21Qcm9wcyhwcm9wcywgcHJldlByb3BzLCB2aXN1YWxFbGVtZW50KTtcbiAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICBpZiAoaXNNb3Rpb25WYWx1ZShwcm9wc1trZXldKSB8fCBpc01vdGlvblZhbHVlKHByZXZQcm9wc1trZXldKSkge1xuICAgICAgY29uc3QgdGFyZ2V0S2V5ID0gdHJhbnNmb3JtUHJvcE9yZGVyLmluZGV4T2Yoa2V5KSAhPT0gLTEgPyBcImF0dHJcIiArIGtleS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHJpbmcoMSkgOiBrZXk7XG4gICAgICBuZXdWYWx1ZXNbdGFyZ2V0S2V5XSA9IHByb3BzW2tleV07XG4gICAgfVxuICB9XG4gI
10617HJldHVybiBuZXdWYWx1ZXM7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9zdmcvY29uZmlnLW1vdGlvbi5tanNcbmZ1bmN0aW9uIHVwZGF0ZVNWR0RpbWVuc2lvbnMoaW5zdGFuY2UsIHJlbmRlclN0YXRlKSB7XG4gIHRyeSB7XG4gICAgcmVuZGVyU3RhdGUuZGltZW5zaW9ucyA9IHR5cGVvZiBpbnN0YW5jZS5nZXRCQm94ID09PSBcImZ1bmN0aW9uXCIgPyBpbnN0YW5jZS5nZXRCQm94KCkgOiBpbnN0YW5jZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJlbmRlclN0YXRlLmRpbWVuc2lvbnMgPSB7XG4gICAgICB4OiAwLFxuICAgICAgeTogMCxcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgfVxufVxudmFyIGxheW91dFByb3BzID0gW1wieFwiLCBcInlcIiwgXCJ3aWR0aFwiLCBcImhlaWdodFwiLCBcImN4XCIsIFwiY3lcIiwgXCJyXCJdO1xudmFyIHN2Z01vdGlvbkNvbmZpZyA9IHtcbiAgdXNlVmlzdWFsU3RhdGU6IG1ha2VVc2VWaXN1YWxTdGF0ZSh7XG4gICAgc2NyYXBlTW90aW9uVmFsdWVzRnJvbVByb3BzOiBzY3JhcGVNb3Rpb25WYWx1ZXNGcm9tUHJvcHMyLFxuICAgIGNyZWF0ZVJlbmRlclN0YXRlOiBjcmVhdGVTdmdSZW5kZXJTdGF0ZSxcbiAgICBvblVwZGF0ZTogKHsgcHJvcHMsIHByZXZQcm9wcywgY3VycmVudCwgcmVuZGVyU3RhdGUsIGxhdGVzdFZhbHVlcyB9KSA9PiB7XG4gICAgICBpZiAoIWN1cnJlbnQpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGxldCBoYXNUcmFuc2Zvcm0yID0gISFwcm9wcy5kcmFnO1xuICAgICAgaWYgKCFoYXNUcmFuc2Zvcm0yKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGxhdGVzdFZhbHVlcykge1xuICAgICAgICAgIGlmICh0cmFuc2Zvcm1Qcm9wcy5oYXMoa2V5KSkge1xuICAgICAgICAgICAgaGFzVHJhbnNmb3JtMiA9IHRydWU7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaGFzVHJhbnNmb3JtMilcbiAgICAgICAgcmV0dXJuO1xuICAgICAgbGV0IG5lZWRzTWVhc3VyZSA9ICFwcmV2UHJvcHM7XG4gICAgICBpZiAocHJldlByb3BzKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGF5b3V0UHJvcHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBrZXkgPSBsYXlvdXRQcm9wc1tpXTtcbiAgICAgICAgICBpZiAocHJvcHNba2V5XSAhPT0gcHJldlByb3BzW2tleV0pIHtcbiAgICAgICAgICAgIG5lZWRzTWVhc3VyZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIW5lZWRzTWVhc3VyZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgZnJhbWUucmVhZCgoKSA9PiB7XG4gICAgICAgIHVwZGF0ZVNWR0RpbWVuc2lvbnMoY3VycmVudCwgcmVuZGVyU3RhdGUpO1xuICAgICAgICBmcmFtZS5yZW5kZXIoKCkgPT4ge1xuICAgICAgICAgIGJ1aWxkU1ZHQXR0cnMocmVuZGVyU3RhdGUsIGxhdGVzdFZhbHVlcywgaXNTVkdUYWcoY3VycmVudC50YWdOYW1lKSwgcHJvcHMudHJhbnNmb3JtVGVtcGxhdGUpO1xuICAgICAgICAgIHJlbmRlclNWRyhjdXJyZW50LCByZW5kZXJTdGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9KVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2h0bWwvY29uZmlnLW1vdGlvbi5tanNcbnZhciBpbXBvcnRfZGlzdDI1NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjU3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MjU4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGh0bWxNb3Rpb25Db25maWcgPSB7XG4gIHVzZVZpc3VhbFN0YXRlOiBtYWtlVXNlVmlzdWFsU3RhdGUoe1xuICAgIHNjcmFwZU1vdGlvblZhbHVlc0Zyb21Qcm9wcyxcbiAgICBjcmVhdGVSZW5kZXJTdGF0ZTogY3JlYXRlSHRtbFJlbmRlclN0YXRlXG4gIH0pXG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3VzZS1yZW5kZXIubWpzXG52YXIgaW1wb3J0X2Rpc3QyNjUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDI2NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDI2NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3QyNyA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2h0bWwvdXNlLXByb3BzLm1qc1xudmFyIGltcG9ydF9kaXN0MjU5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyNjAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyNjEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW1wb3J0X3JlYWN0MjUgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSwgMSk7XG5mdW5jdGlvbiBjb3B5UmF3VmFsdWVzT25seSh0YXJnZXQsIHNvdXJjZSwgcHJvcHMpIHtcbiAgZm9yIChjb25zdCBrZXkgaW4gc291cmNlKSB7XG4gICAgaWYgKCFpc01vdGlvblZhbHVlKHNvdXJjZVtrZXldKSAmJiAhaXNGb3JjZWRNb3Rpb25WYWx1ZShrZXksIHByb3BzKSkge1xuICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICB9XG4gI
10617H1cbn1cbmZ1bmN0aW9uIHVzZUluaXRpYWxNb3Rpb25WYWx1ZXMoeyB0cmFuc2Zvcm1UZW1wbGF0ZSB9LCB2aXN1YWxTdGF0ZSkge1xuICByZXR1cm4gKDAsIGltcG9ydF9yZWFjdDI1LnVzZU1lbW8pKCgpID0+IHtcbiAgICBjb25zdCBzdGF0ZTIgPSBjcmVhdGVIdG1sUmVuZGVyU3RhdGUoKTtcbiAgICBidWlsZEhUTUxTdHlsZXMoc3RhdGUyLCB2aXN1YWxTdGF0ZSwgdHJhbnNmb3JtVGVtcGxhdGUpO1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZTIudmFycywgc3RhdGUyLnN0eWxlKTtcbiAgfSwgW3Zpc3VhbFN0YXRlXSk7XG59XG5mdW5jdGlvbiB1c2VTdHlsZShwcm9wcywgdmlzdWFsU3RhdGUpIHtcbiAgY29uc3Qgc3R5bGVQcm9wID0gcHJvcHMuc3R5bGUgfHwge307XG4gIGNvbnN0IHN0eWxlID0ge307XG4gIGNvcHlSYXdWYWx1ZXNPbmx5KHN0eWxlLCBzdHlsZVByb3AsIHByb3BzKTtcbiAgT2JqZWN0LmFzc2lnbihzdHlsZSwgdXNlSW5pdGlhbE1vdGlvblZhbHVlcyhwcm9wcywgdmlzdWFsU3RhdGUpKTtcbiAgcmV0dXJuIHN0eWxlO1xufVxuZnVuY3Rpb24gdXNlSFRNTFByb3BzKHByb3BzLCB2aXN1YWxTdGF0ZSkge1xuICBjb25zdCBodG1sUHJvcHMgPSB7fTtcbiAgY29uc3Qgc3R5bGUgPSB1c2VTdHlsZShwcm9wcywgdmlzdWFsU3RhdGUpO1xuICBpZiAocHJvcHMuZHJhZyAmJiBwcm9wcy5kcmFnTGlzdGVuZXIgIT09IGZhbHNlKSB7XG4gICAgaHRtbFByb3BzLmRyYWdnYWJsZSA9IGZhbHNlO1xuICAgIHN0eWxlLnVzZXJTZWxlY3QgPSBzdHlsZS5XZWJraXRVc2VyU2VsZWN0ID0gc3R5bGUuV2Via2l0VG91Y2hDYWxsb3V0ID0gXCJub25lXCI7XG4gICAgc3R5bGUudG91Y2hBY3Rpb24gPSBwcm9wcy5kcmFnID09PSB0cnVlID8gXCJub25lXCIgOiBgcGFuLSR7cHJvcHMuZHJhZyA9PT0gXCJ4XCIgPyBcInlcIiA6IFwieFwifWA7XG4gIH1cbiAgaWYgKHByb3BzLnRhYkluZGV4ID09PSB2b2lkIDAgJiYgKHByb3BzLm9uVGFwIHx8IHByb3BzLm9uVGFwU3RhcnQgfHwgcHJvcHMud2hpbGVUYXApKSB7XG4gICAgaHRtbFByb3BzLnRhYkluZGV4ID0gMDtcbiAgfVxuICBodG1sUHJvcHMuc3R5bGUgPSBzdHlsZTtcbiAgcmV0dXJuIGh0bWxQcm9wcztcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL3N2Zy91c2UtcHJvcHMubWpzXG52YXIgaW1wb3J0X2Rpc3QyNjIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDI2MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDI2NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3QyNiA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcbmZ1bmN0aW9uIHVzZVNWR1Byb3BzKHByb3BzLCB2aXN1YWxTdGF0ZSwgX2lzU3RhdGljLCBDb21wb25lbnQzKSB7XG4gIGNvbnN0IHZpc3VhbFByb3BzID0gKDAsIGltcG9ydF9yZWFjdDI2LnVzZU1lbW8pKCgpID0+IHtcbiAgICBjb25zdCBzdGF0ZTIgPSBjcmVhdGVTdmdSZW5kZXJTdGF0ZSgpO1xuICAgIGJ1aWxkU1ZHQXR0cnMoc3RhdGUyLCB2aXN1YWxTdGF0ZSwgaXNTVkdUYWcoQ29tcG9uZW50MyksIHByb3BzLnRyYW5zZm9ybVRlbXBsYXRlKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUyLmF0dHJzLFxuICAgICAgc3R5bGU6IHsgLi4uc3RhdGUyLnN0eWxlIH1cbiAgICB9O1xuICB9LCBbdmlzdWFsU3RhdGVdKTtcbiAgaWYgKHByb3BzLnN0eWxlKSB7XG4gICAgY29uc3QgcmF3U3R5bGVzID0ge307XG4gICAgY29weVJhd1ZhbHVlc09ubHkocmF3U3R5bGVzLCBwcm9wcy5zdHlsZSwgcHJvcHMpO1xuICAgIHZpc3VhbFByb3BzLnN0eWxlID0geyAuLi5yYXdTdHlsZXMsIC4uLnZpc3VhbFByb3BzLnN0eWxlIH07XG4gIH1cbiAgcmV0dXJuIHZpc3VhbFByb3BzO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3VzZS1yZW5kZXIubWpzXG5mdW5jdGlvbiBjcmVhdGVVc2VSZW5kZXIoZm9yd2FyZE1vdGlvblByb3BzID0gZmFsc2UpIHtcbiAgY29uc3QgdXNlUmVuZGVyID0gKENvbXBvbmVudDMsIHByb3BzLCByZWYsIHsgbGF0ZXN0VmFsdWVzIH0sIGlzU3RhdGljKSA9PiB7XG4gICAgY29uc3QgdXNlVmlzdWFsUHJvcHMgPSBpc1NWR0NvbXBvbmVudChDb21wb25lbnQzKSA/IHVzZVNWR1Byb3BzIDogdXNlSFRNTFByb3BzO1xuICAgIGNvbnN0IHZpc3VhbFByb3BzID0gdXNlVmlzdWFsUHJvcHMocHJvcHMsIGxhdGVzdFZhbHVlcywgaXNTdGF0aWMsIENvbXBvbmVudDMpO1xuICAgIGNvbnN0IGZpbHRlcmVkUHJvcHMgPSBmaWx0ZXJQcm9wcyhwcm9wcywgdHlwZW9mIENvbXBvbmVudDMgPT09IFwic3RyaW5nXCIsIGZvcndhcmRNb3Rpb25Qcm9wcyk7XG4gICAgY29uc3QgZWxlbWVudFByb3BzID0gQ29tcG9uZW50MyAhPT0gaW1wb3J0X3JlYWN0MjcuRnJhZ21lbnQgPyB7IC4uLmZpbHRlcmVkUHJvcHMsIC4uLnZpc3VhbFByb3BzLCByZWYgfSA6IHt9O1xuICAgIGNvbnN0IHsgY2hpbGRyZW4gfSA9IHByb3BzO1xuICAgIGNvbnN0IHJlbmRlcmVkQ2hpbGRyZW4gPSAoMCwgaW1wb3J0X3JlYWN0MjcudXNlTWVtbykoKCkgPT4gaXNNb3Rpb25WYWx1ZShjaGlsZHJlbikgPyBjaGlsZHJlbi5nZXQoKSA6IGNoaWxkcmVuLCBbY2hpbGRyZW5dKTtcbiAgICByZXR1cm4gKDAsIGltcG9ydF9yZWFjdDI3LmNyZWF0ZUVsZW1lbnQpKENvbXBvbmVudDMsIHtcbiAgICAgIC4uLmVsZW1lbnRQcm9wcyxcbiAgICAgIGNoaWxkcmVuOiByZW5kZXJlZENoaWxkcmVuXG4gICAgfSk7XG4gIH07XG4gIHJldHVybiB1c2VSZW5kZXI7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9jb21wb25lbnRzL2NyZWF0ZS1mYWN0b3J5Lm1qc1xuZnVuY3Rpb24gY3JlYXRlTW90aW9uQ29tcG9uZW50RmFjdG9yeShwcmVsb2FkZWRGZWF0dXJlcywgY3JlYXRlVmlzdWFsRWxlbWVudCkge1xuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlTW90aW9uQ29tcG9uZW50MihDb21wb25lbnQzLCB7IGZvcndhcmRNb3Rpb25Qcm9wcyB9ID0geyBmb3J3YXJkTW90aW9uUHJvcHM6IGZhbHNlIH0pIHtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gaXNTVkdDb21wb25lbnQoQ29tcG9uZW50MykgPyBzdmdNb3Rpb25Db25maWcgOiBodG1sTW90aW9uQ29uZmlnO1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIC4uLmJhc2VDb25maWcsXG4gICAgICBwcmVsb2FkZWRGZWF0dXJlcyxcbiAgICAgIHVzZVJlbmRlcjogY3JlYXRlVXNlUmVuZGVyKGZvcndhcmRNb3Rpb25Qcm9wcyksXG4gICAgICBjcmVhdGVWaXN1YWxFbGVtZW50LFxuICAgICAgQ29tcG9uZW50OiBDb21wb25lbnQzXG4gICAgfTtcbiAgICByZXR1cm4gY3JlYXRlUmVuZGVyZXJNb3Rpb25Db21wb25lbnQoY29uZmlnKTtcbiAgfTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2NvbXBvbmVudHMvbS9jcmVhdGUubWpzXG52YXIgY3JlYXRlTWluaW1hbE1vdGlvbkNvbXBvbmVudCA9IGNyZWF0ZU1vdGlvbkNvbXBvbmVudEZhY3RvcnkoKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2NvbXBvbmVudHMvbS9wcm94eS5tanNcbnZhciBtID0gY3JlYXRlRE9NTW90aW9uQ29tcG9uZW50UHJveHkoY3JlYXRlTWluaW1hbE1vdGlvbkNvbXBvbmVudCk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9jb21wb25lbnRzL21vdGlvbi9wcm94eS5tanNcbnZhciBpbXBvcnRfZGlzdDgwOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODA5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0ODEwID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvY29tcG9uZW50cy9tb3Rpb24vY3JlYXRlLm1qc1xudmFyIGltcG9ydF9kaXN0ODA1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MDYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MDcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL21vdGlvbi9mZWF0dXJlcy9hbmltYXRpb25zLm1qc1xudmFyIGltcG9ydF9kaXN0NjQzID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q2NDQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q2NDUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL21vdGlvbi9mZWF0dXJlcy9hbmltYXRpb24vaW5kZXgubWpzXG52YXIgaW1wb3J0X2Rpc3Q2MzcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDYzOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDYzOSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL3V0aWxzL2FuaW1hdGlvbi1zdGF0ZS5tanNcbnZhciBpbXBvcnRfZGlzdDYzMSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjMyID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjMzID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy9zaGFsbG93LWNvbXBhcmUubWpzXG52YXIgaW1wb3J0X2Rpc3QyNzcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDI3OCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDI3OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIHNoYWxsb3dDb21wYXJlKG5leHQsIHByZXYpIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHByZXYpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgY29uc3QgcHJldkxlbmd0aCA9IHByZXYubGVuZ3RoO1xuICBpZiAocHJldkxlbmd0aCAhPT0gbmV4dC5sZW5ndGgpXG4gICAgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZMZW5ndGg7IGkrKykge1xuICAgIGlmIChwcmV2W2ldICE9PSBuZXh0W2ldKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvdXRpbHMvcmVzb2x2ZS1keW5hbWljLXZhcmlhbnRzLm1qc1xudmFyIGltcG9ydF9kaXN0MjgwID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyODEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyODIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiByZXNvbHZlVmFyaWFudCh2aXN1YWxFbGVtZW50LCBkZWZpbml0aW9uLCBjdXN0b20pIHtcbiAgY29uc3QgcHJvcHMgPSB2aXN1YWxFbGVtZW50LmdldFByb3BzKCk7XG4gIHJldHVybiByZXNvbHZlVmFyaWFudEZyb21Qcm9wcyhwcm9wcywgZGVmaW5pdGlvbiwgY3VzdG9tICE9PSB2b2lkIDAgPyBjdXN0b20gOiBwcm9wcy5jdXN0b20sIHZpc3VhbEVsZW1lbnQpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vaW50ZXJmYWNlcy92aXN1YWwtZWxlbWVudC5tanNcbnZhciBpbXBvcnRfZGlzdDYyNSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjI2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjI3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vaW50ZXJmYWNlcy92aXN1YWwtZWxlbWVudC10YXJnZXQubWpzXG52YXIgaW1wb3J0X2Rpc3Q2MTkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDYyMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDYyMSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL2luZGV4Lm1qc1xudmFyIGltcG9ydF9kaXN0Mzg4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzODkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzOTAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tZG9tQDExLjE4LjEvbm9kZV9tb2R1bGVzL21vdGlvbi1kb20vZGlzdC9lcy9hbmltYXRpb24vY29udHJvbHMvR3JvdXAubWpzXG52YXIgaW1wb3J0X2Rpc3QyODkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDI5MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDI5MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL2FuaW1hdGlvbi9jb250cm9scy9CYXNlR3JvdXAubWpzXG52YXIgaW1wb3J0X2Rpc3QyODYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDI4NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDI4OCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL3V0aWxzL3N1cHBvcnRzL3Njcm9sbC10aW1lbGluZS5tanNcbnZhciBpbXBvcnRfZGlzdDI4MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0Mjg0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0Mjg1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIHN1cHBvcnRzU2Nyb2xsVGltZWxpbmUgPSBtZW1vKCgpID0+IHdpbmRvdy5TY3JvbGxUaW1lbGluZSAhPT0gdm9pZCAwKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL2FuaW1hdGlvbi9jb250cm9scy9CYXNlR3JvdXAubWpzXG52YXIgQmFzZUdyb3VwUGxheWJhY2tDb250cm9scyA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoYW5pbWF0aW9uczIpIHtcbiAgICB0aGlzLnN0b3AgPSAoKSA9PiB0aGlzLnJ1bkFsbChcInN0b3BcIik7XG4gICAgdGhpcy5hbmltYXRpb25zID0gYW5pbWF0aW9uczIuZmlsdGVyKEJvb2xlYW4pO1xuICB9XG4gIGdldCBmaW5pc2hlZCgpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5hbmltYXRpb25zLm1hcCgoYW5pbWF0aW9uKSA9PiBcImZpbmlzaGVkXCIgaW4gYW5pbWF0aW9uID8gYW5pbWF0aW9uLmZpbmlzaGVkIDogYW5pbWF0aW9uKSk7XG4gIH1cbiAgLyoqXG4gICAqIFRPRE86IEZpbHRlciBvdXQgY2FuY2VsbGVkIG9yIHN0b3BwZWQgYW5pbWF0aW9ucyBiZWZvcmUgcmV0dXJuaW5nXG4gICAqL1xuICBnZXRBbGwocHJvcE5hbWUpIHtcbiAgICByZXR1cm4gdGhpcy5hbmltYXRpb25zWzBdW3Byb3BOYW1lXTtcbiAgfVxuICBzZXRBbGwocHJvcE5hbWUsIG5ld1ZhbHVlKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFuaW1hdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuYW5pbWF0aW9uc1tpXVtwcm9wTmFtZV0gPSBuZXdWYWx1ZTtcbiAgICB9XG4gIH1cbiAgYXR0YWNoVGltZWxpbmUodGltZWxpbmUsIGZhbGxiYWNrKSB7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IHRoaXMuYW5pbWF0aW9ucy5tYXAoKGFuaW1hdGlvbikgPT4ge1xuICAgICAgaWYgKHN1cHBvcnRzU2Nyb2xsVGltZWxpbmUoKSAmJiBhbmltYXRpb24uYXR0YWNoVGltZWxpbmUpIHtcbiAgICAgICAgcmV0dXJuIGFuaW1hdGlvbi5hdHRhY2hUaW1lbGluZSh0aW1lbGluZSk7XG4gICAgICB9IGVsc2UgaWYgKHR5cGVvZiBmYWxsYmFjayA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBmYWxsYmFjayhhbmltYXRpb24pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBzdWJzY3JpcHRpb25zLmZvckVhY2goKGNhbmNlbCwgaSkgPT4ge1xuICAgICAgICBjYW5jZWwgJiYgY2FuY2VsKCk7XG4gICAgICAgIHRoaXMuYW5pbWF0aW9uc1tpXS5zdG9wKCk7XG4gICAgICB9KTtcbiAgICB9O1xuICB9XG4gIGdldCB0aW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldEFsbChcInRpbWVcIik7XG4gIH1cbiAgc2V0IHRpbWUodGltZTIpIHtcbiAgICB0aGlzLnNldEFsbChcInRpbWVcIiwgdGltZTIpO1xuICB9XG4gIGdldCBzcGVlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5nZXRBbGwoXCJzcGVlZFwiKTtcbiAgfVxuICBzZXQgc3BlZWQoc3BlZWQpIHtcbiAgICB0aGlzLnNldEFsbChcInNwZWVkXCIsIHNwZWVkKTtcbiAgfVxuICBnZXQgc3RhcnRUaW1lKCkge1xuICAgIHJldHVybiB0aGlzLmdldEFsbChcInN0YXJ0VGltZVwiKTtcbiAgfVxuICBnZXQgZHVyYXRpb24oKSB7XG4gICAgbGV0IG1heCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFuaW1hdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG1heCA9IE1hdGgubWF4KG1heCwgdGhpcy5hbmltYXRpb25zW2ldLmR1cmF0aW9uKTtcbiAgICB9XG4gICAgcmV0dXJuIG1heDtcbiAgfVxuICBydW5BbGwobWV0aG9kTmFtZSkge1xuICAgIHRoaXMuYW5pbWF0aW9ucy5mb3JFYWNoKChjb250cm9scykgPT4gY29udHJvbHNbbWV0aG9kTmFtZV0oKSk7XG4gIH1cbiAgZmxhdHRlbigpIHtcbiAgICB0aGlzLnJ1bkFsbChcImZsYXR0ZW5cIik7XG4gIH1cbiAgcGxheSgpIHtcbiAgICB0aGlzLnJ1bkFsbChcInBsYXlcIik7XG4gIH1cbiAgcGF1c2UoKSB7XG4gICAgdGhpcy5ydW5BbGwoXCJwYXVzZVwiKTtcbiAgfVxuICBjYW5jZWwoKSB7XG4gICAgdGhpcy5ydW5BbGwoXCJjYW5jZWxcIik7XG4gIH1cbiAgY29tcGxldGUoKSB7XG4gICAgdGhpcy5ydW5BbGwoXCJjb21wbGV0ZVwiKTtcbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL2FuaW1hdGlvbi9jb250cm9scy9Hcm91cC5tanNcbnZhciBHcm91cFBsYXliYWNrQ29udHJvbHMgPSBjbGFzcyBleHRlbmRzIEJhc2VHcm91cFBsYXliYWNrQ29udHJvbHMge1xuICB0aGVuKG9uUmVzb2x2ZSwgb25SZWplY3QpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwodGhpcy5hbmltYXRpb25zKS50aGVuKG9uUmVzb2x2ZSkuY2F0Y2gob25SZWplY3QpO1xuICB9XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vbW90aW9uLWRvbUAxMS4xOC4xL25vZGVfbW9kdWxlcy9tb3Rpb24tZG9tL2Rpc3QvZXMvYW5pbWF0aW9uL3V0aWxzL2dldC12YWx1ZS10cmFuc2l0aW9uLm1qc1xudmFyIGltcG9ydF9kaXN0MjkyID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyOTMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyOTQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBnZXRWYWx1ZVRyYW5zaXRpb24odHJhbnNpdGlvbiwga2V5KSB7XG4gIHJldHVybiB0cmFuc2l0aW9uID8gdHJhbnNpdGlvbltrZXldIHx8IHRyYW5zaXRpb25bXCJkZWZhdWx0XCJdIHx8IHRyYW5zaXRpb24gOiB2b2lkIDA7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tZG9tQDExLjE4LjEvbm9kZV9tb2R1bGVzL21vdGlvbi1kb20vZGlzdC9lcy9hbmltYXRpb24vZ2VuZXJhdG9ycy91dGlscy9jYWxjLWR1cmF0aW9uLm1qc1xudmFyIGltcG9ydF9kaXN0Mjk1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyOTYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QyOTcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgbWF4R2VuZXJhdG9yRHVyYXRpb24gPSAyZTQ7XG5mdW5jdGlvbiBjYWxjR2VuZXJhdG9yRHVyYXRpb24oZ2VuZXJhdG9yKSB7XG4gIGxldCBkdXJhdGlvbiA9IDA7XG4gIGNvbnN0IHRpbWVTdGVwID0gNTA7XG4gIGxldCBzdGF0ZTIgPSBnZW5lcmF0b3IubmV4dChkdXJhdGlvbik7XG4gIHdoaWxlICghc3RhdGUyLmRvbmUgJiYgZHVyYXRpb24gPCBtYXhHZW5lcmF0b3JEdXJhdGlvbikge1xuICAgIGR1cmF0aW9uICs9IHRpbWVTdGVwO1xuICAgIHN0YXRlMiA9IGdlbmVyYXRvci5uZXh0KGR1cmF0aW9uKTtcbiAgfVxuICByZXR1cm4gZHVyYXRpb24gPj0gbWF4R2VuZXJhdG9yRHVyYXRpb24gPyBJbmZpbml0eSA6IGR1cmF0aW9uO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vbW90aW9uLWRvbUAxMS4xOC4xL25vZGVfbW9kdWxlcy9tb3Rpb24tZG9tL2Rpc3QvZXMvYW5pbWF0aW9uL2dlbmVyYXRvcnMvdXRpbHMvY3JlYXRlLWdlbmVyYXRvci1lYXNpbmcubWpzXG52YXIgaW1wb3J0X2Rpc3QyOTggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDI5OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDMwMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIGNyZWF0ZUdlbmVyYXRvckVhc2luZyhvcHRpb25zLCBzY2FsZTIgPSAxMDAsIGNyZWF0ZUdlbmVyYXRvcikge1xuICBjb25zdCBnZW5lcmF0b3IgPSBjcmVhdGVHZW5lcmF0b3IoeyAuLi5vcHRpb25zLCBrZXlmcmFtZXM6IFswLCBzY2FsZTJdIH0pO1xuICBjb25zdCBkdXJhdGlvbiA9IE1hdGgubWluKGNhbGNHZW5lcmF0b3JEdXJhdGlvbihnZW5lcmF0b3IpLCBtYXhHZW5lcmF0b3JEdXJhdGlvbik7XG4gIHJldHVybi
10617B7XG4gICAgdHlwZTogXCJrZXlmcmFtZXNcIixcbiAgICBlYXNlOiAocHJvZ3Jlc3MyKSA9PiB7XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yLm5leHQoZHVyYXRpb24gKiBwcm9ncmVzczIpLnZhbHVlIC8gc2NhbGUyO1xuICAgIH0sXG4gICAgZHVyYXRpb246IG1pbGxpc2Vjb25kc1RvU2Vjb25kcyhkdXJhdGlvbilcbiAgfTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL2FuaW1hdGlvbi9nZW5lcmF0b3JzL3V0aWxzL2lzLWdlbmVyYXRvci5tanNcbnZhciBpbXBvcnRfZGlzdDMwMSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzAyID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzAzID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gaXNHZW5lcmF0b3IodHlwZSkge1xuICByZXR1cm4gdHlwZW9mIHR5cGUgPT09IFwiZnVuY3Rpb25cIjtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL2FuaW1hdGlvbi93YWFwaS9OYXRpdmVBbmltYXRpb25Db250cm9scy5tanNcbnZhciBpbXBvcnRfZGlzdDMwNyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzA4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzA5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vbW90aW9uLWRvbUAxMS4xOC4xL25vZGVfbW9kdWxlcy9tb3Rpb24tZG9tL2Rpc3QvZXMvYW5pbWF0aW9uL3dhYXBpL3V0aWxzL2F0dGFjaC10aW
106171lbGluZS5tanNcbnZhciBpbXBvcnRfZGlzdDMwNCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzA1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzA2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gYXR0YWNoVGltZWxpbmUoYW5pbWF0aW9uLCB0aW1lbGluZSkge1xuICBhbmltYXRpb24udGltZWxpbmUgPSB0aW1lbGluZTtcbiAgYW5pbWF0aW9uLm9uZmluaXNoID0gbnVsbDtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL2FuaW1hdGlvbi93YWFwaS9OYXRpdmVBbmltYXRpb25Db250cm9scy5tanNcbnZhciBOYXRpdmVBbmltYXRpb25Db250cm9scyA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoYW5pbWF0aW9uKSB7XG4gICAgdGhpcy5hbmltYXRpb24gPSBhbmltYXRpb247XG4gIH1cbiAgZ2V0IGR1cmF0aW9uKCkge1xuICAgIHZhciBfYSwgX2IsIF9jO1xuICAgIGNvbnN0IGR1cmF0aW9uSW5NcyA9ICgoX2IgPSAoX2EgPSB0aGlzLmFuaW1hdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmVmZmVjdCkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmdldENvbXB1dGVkVGltaW5nKCkuZHVyYXRpb24pIHx8ICgoX2MgPSB0aGlzLm9wdGlvbnMpID09PSBudWxsIHx8IF9jID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYy5kdXJhdGlvbikgfHwgMzAwO1xuICAgIHJldHVybiBtaWxsaXNlY29uZHNUb1NlY29uZHMoTnVtYmVyKGR1cmF0aW9uSW5NcykpO1xuICB9XG4gIGdldCB0aW1lKCkge1xuICAgIHZhciBfYTtcbiAgICBpZiAodGhpcy5hbmltYXRpb24pIHtcbiAgICAgIHJldHVybiBtaWxsaXNlY29uZHNUb1NlY29uZHMoKChfYSA9IHRoaXMuYW5pbWF0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY3VycmVudFRpbWUpIHx8IDApO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuICBzZXQgdGltZShuZXdUaW1lKSB7XG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uKSB7XG4gICAgICB0aGlzLmFuaW1hdGlvbi5jdXJyZW50VGltZSA9IHNlY29uZHNUb01pbGxpc2Vjb25kcyhuZXdUaW1lKTtcbiAgICB9XG4gIH1cbiAgZ2V0IHNwZWVkKCkge1xuICAgIHJldHVybiB0aGlzLmFuaW1hdGlvbiA/IHRoaXMuYW5pbWF0aW9uLnBsYXliYWNrUmF0ZSA6IDE7XG4gIH1cbiAgc2V0IHNwZWVkKG5ld1NwZWVkKSB7XG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uKSB7XG4gICAgICB0aGlzLmFuaW1hdGlvbi5wbGF5YmFja1JhdGUgPSBuZXdTcGVlZDtcbiAgICB9XG4gIH1cbiAgZ2V0IHN0YXRlKCkge1xuICAgIHJldHVybiB0aGlzLmFuaW1hdGlvbiA/IHRoaXMuYW5pbWF0aW9uLnBsYXlTdGF0ZSA6IFwiZmluaXNoZWRcIjtcbiAgfVxuICBnZXQgc3RhcnRUaW1lKCkge1xuICAgIHJldHVybiB0aGlzLmFuaW1hdGlvbiA/IHRoaXMuYW5pbWF0aW9uLnN0YXJ0VGltZSA6IG51bGw7XG4gIH1cbiAgZ2V0IGZpbmlzaGVkKCkge1xuICAgIHJldHVybiB0aGlzLmFuaW1hdGlvbiA/IHRoaXMuYW5pbWF0aW9uLmZpbmlzaGVkIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgcGxheSgpIHtcbiAgICB0aGlzLmFuaW1hdGlvbiAmJiB0aGlzLmFuaW1hdGlvbi5wbGF5KCk7XG4gIH1cbiAgcGF1c2UoKSB7XG4gICAgdGhpcy5hbmltYXRpb24gJiYgdGhpcy5hbmltYXRpb24ucGF1c2UoKTtcbiAgfVxuICBzdG9wKCkge1xuICAgIGlmICghdGhpcy5hbmltYXRpb24gfHwgdGhpcy5zdGF0ZSA9PT0gXCJpZGxlXCIgfHwgdGhpcy5zdGF0ZSA9PT0gXCJmaW5pc2hlZFwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmFuaW1hdGlvbi5jb21taXRTdHlsZXMpIHtcbiAgICAgIHRoaXMuYW5pbWF0aW9uLmNvbW1pdFN0eWxlcygpO1xuICAgIH1cbiAgICB0aGlzLmNhbmNlbCgpO1xuICB9XG4gIGZsYXR0ZW4oKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmICghdGhpcy5hbmltYXRpb24pXG4gICAgICByZXR1cm47XG4gICAgKF9hID0gdGhpcy5hbmltYXRpb24uZWZmZWN0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EudXBkYXRlVGltaW5nKHsgZWFzaW5nOiBcImxpbmVhclwiIH0pO1xuICB9XG4gIGF0dGFjaFRpbWVsaW5lKHRpbWVsaW5lKSB7XG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uKVxuICAgICAgYXR0YWNoVGltZWxpbmUodGhpcy5hbmltYXRpb24sIHRpbWVsaW5lKTtcbiAgICByZXR1cm4gbm9vcDtcbiAgfVxuICBjb21wbGV0ZSgpIHtcbiAgICB0aGlzLmFuaW1hdGlvbiAmJiB0aGlzLmFuaW1hdGlvbi5maW5pc2goKTtcbiAgfVxuICBjYW5jZWwoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuYW5pbWF0aW9uICYmIHRoaXMuYW5pbWF0aW9uLmNhbmNlbCgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICB9XG4gIH1cbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tZG9tQDExLjE4LjEvbm9kZV9tb2R1bGVzL21vdGlvbi1kb20vZGlzdC9lcy9hbmltYXRpb24vd2FhcGkvdXRpbHMvZWFzaW5nLm1qc1xudmFyIGltcG9ydF9kaXN0MzI1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzMjYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzMjcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tZG9tQDExLjE4LjEvbm9kZV9tb2R1bGVzL21vdGlvbi1kb20vZGlzdC9lcy91dGlscy9pcy1iZXppZXItZGVmaW5pdGlvbi5tanNcbnZhciBpbXBvcnRfZGlzdDMxMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzExID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzEyID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGlzQmV6aWVyRGVmaW5pdGlvbiA9IChlYXNpbmcpID0+IEFycmF
106175LmlzQXJyYXkoZWFzaW5nKSAmJiB0eXBlb2YgZWFzaW5nWzBdID09PSBcIm51bWJlclwiO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vbW90aW9uLWRvbUAxMS4xOC4xL25vZGVfbW9kdWxlcy9tb3Rpb24tZG9tL2Rpc3QvZXMvdXRpbHMvc3VwcG9ydHMvbGluZWFyLWVhc2luZy5tanNcbnZhciBpbXBvcnRfZGlzdDMxOSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzIwID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzIxID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vbW90aW9uLWRvbUAxMS4xOC4xL25vZGVfbW9kdWxlcy9tb3Rpb24tZG9tL2Rpc3QvZXMvdXRpbHMvc3VwcG9ydHMvbWVtby5tanNcbnZhciBpbXBvcnRfZGlzdDMxNiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzE3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzE4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vbW90aW9uLWRvbUAxMS4xOC4xL25vZGVfbW9kdWxlcy9tb3Rpb24tZG9tL2Rpc3QvZXMvdXRpbHMvc3VwcG9ydHMvZmxhZ3MubWpzXG52YXIgaW1wb3J0X2Rpc3QzMTMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDMxNCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDMxNSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBzdXBwb3J0c0ZsYWdzID0ge1xuICBsaW5lYXJFYXNpbmc6IHZvaWQgMFxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL3V0aWxzL3N1cHBvcnRzL21lbW8ubWpzXG5mdW5jdGlvbiBtZW1vU3VwcG9ydHMoY2FsbGJhY2ssIHN1cHBvcnRzRmxhZykge1xuICBjb25zdCBtZW1vaXplZCA9IG1lbW8oY2FsbGJhY2spO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKF9hID0gc3VwcG9ydHNGbGFnc1tzdXBwb3J0c0ZsYWddKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBtZW1vaXplZCgpO1xuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vbW90aW9uLWRvbUAxMS4xOC4xL25vZGVfbW9kdWxlcy9tb3Rpb24tZG9tL2Rpc3QvZXMvdXRpbHMvc3VwcG9ydHMvbGluZWFyLWVhc2luZy5tanNcbnZhciBzdXBwb3J0c0xpbmVhckVhc2luZyA9IG1lbW9TdXBwb3J0cygoKSA9PiB7XG4gIHRyeSB7XG4gICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKS5hbmltYXRlKHsgb3BhY2l0eTogMCB9LCB7IGVhc2luZzogXCJsaW5lYXIoMCwgMSlcIiB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn0sIFwibGluZWFyRWFzaW5nXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vbW90aW9uLWRvbUAxMS4xOC4xL25vZGVfbW9kdWxlcy9tb3Rpb24tZG9tL2Rpc3QvZXMvYW5pbWF0aW9uL3dhYXBpL3V0aWxzL2xpbmVhci5tanNcbnZhciBpbXBvcnRfZGlzdDMyMiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzIzID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzI0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGdlbmVyYXRlTGluZWFyRWFzaW5nID0gKGVhc2luZywgZHVyYXRpb24sIHJlc29sdXRpb24gPSAxMCkgPT4ge1xuICBsZXQgcG9pbnRzID0gXCJcIjtcbiAgY29uc3QgbnVtUG9pbnRzID0gTWF0aC5tYXgoTWF0aC5yb3VuZChkdXJhdGlvbiAvIHJlc29sdXRpb24pLCAyKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Qb2ludHM7IGkrKykge1xuICAgIHBvaW50cyArPSBlYXNpbmcocHJvZ3Jlc3MoMCwgbnVtUG9pbnRzIC0gMSwgaSkpICsgXCIsIFwiO1xuICB9XG4gIHJldHVybiBgbGluZWFyKCR7cG9pbnRzLnN1YnN0cmluZygwLCBwb2ludHMubGVuZ3RoIC0gMil9KWA7XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vbW90aW9uLWRvbUAxMS4xOC4xL25vZGVfbW9kdWxlcy9tb3Rpb24tZG9tL2Rpc3QvZXMvYW5pbWF0aW9uL3dhYXBpL3V0aWxzL2Vhc2luZy5tanNcbmZ1bmN0aW9uIGlzV2FhcGlTdXBwb3J0ZWRFYXNpbmcoZWFzaW5nKSB7XG4gIHJldHVybiBCb29sZWFuKHR5cGVvZiBlYXNpbmcgPT09IFwiZnVuY3Rpb25cIiAmJiBzdXBwb3J0c0xpbmVhckVhc2luZygpIHx8ICFlYXNpbmcgfHwgdHlwZW9mIGVhc2luZyA9PT0gXCJzdHJpbmdcIiAmJiAoZWFzaW5nIGluIHN1cHBvcnRlZFdhYXBpRWFzaW5nIHx8IHN1cHBvcnRzTGluZWFyRWFzaW5nKCkpIHx8IGlzQmV6aWVyRGVmaW5pdGlvbihlYXNpbmcpIHx8IEFycmF5LmlzQXJyYXkoZWFzaW5nKSAmJiBlYXNpbmcuZXZlcnkoaXNXYWFwaVN1cHBvcnRlZEVhc2luZykpO1xufVxudmFyIGN1YmljQmV6aWVyQXNTdHJpbmcgPSAoW2EsIGIsIGMsIGRdKSA9PiBgY3ViaWMtYmV6aWVyKCR7YX0sICR7Yn0sICR7Y30sICR7ZH0pYDtcbnZhciBzdXBwb3J0ZWRXYWFwaUVhc2luZyA9IHtcbiAgbGluZWFyOiBcImxpbmVhclwiLFxuICBlYXNlOiBcImVhc2VcIixcbiAgZWFzZUluOiBcImVhc2UtaW5cIixcbiAgZWFzZU91dDogXCJlYXNlLW91dFwiLFxuICBlYXNlSW5PdXQ6IFwiZWFzZS1pbi1vdXRcIixcbiAgY2lyY0luOiBjdWJpY0JlemllckFzU3RyaW5nKFswLCAwLjY1LCAwLjU1LCAxXSksXG4gIGNpcmNPdXQ6IGN1YmljQmV6aWVyQXNTdHJpbmcoWzAuNTUsIDAsIDEsIDAuNDVdKSxcbiAgYmFja0luOiBjdWJpY0JlemllckFzU3RyaW5nKFswLjMxLCAwLjAxLCAwLjY2LCAtMC41OV0pLFxuICBiYWNrT3V0OiBjdWJpY0JlemllckFzU3RyaW5nKFswLjMzLCAxLjUzLCAwLjY5LCAwLjk5XSlcbn07XG5mdW5jdGlvbiBtYXBFYXNpbmdUb05hdGl2ZUVhc2luZyhlYXNpbmcsIGR1cmF0aW9uKSB7XG4gIGlmICghZWFzaW5nKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZWFzaW5nID09PSBcImZ1bmN0aW9uXCIgJiYgc3VwcG9ydHNMaW5lYXJFYXNpbmcoKSkge1xuICAgIHJldHVybi
10617BnZW5lcmF0ZUxpbmVhckVhc2luZyhlYXNpbmcsIGR1cmF0aW9uKTtcbiAgfSBlbHNlIGlmIChpc0JlemllckRlZmluaXRpb24oZWFzaW5nKSkge1xuICAgIHJldHVybiBjdWJpY0JlemllckFzU3RyaW5nKGVhc2luZyk7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShlYXNpbmcpKSB7XG4gICAgcmV0dXJuIGVhc2luZy5tYXAoKHNlZ21lbnRFYXNpbmcpID0+IG1hcEVhc2luZ1RvTmF0aXZlRWFzaW5nKHNlZ21lbnRFYXNpbmcsIGR1cmF0aW9uKSB8fCBzdXBwb3J0ZWRXYWFwaUVhc2luZy5lYXNlT3V0KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3VwcG9ydGVkV2FhcGlFYXNpbmdbZWFzaW5nXTtcbiAgfVxufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vbW90aW9uLWRvbUAxMS4xOC4xL25vZGVfbW9kdWxlcy9tb3Rpb24tZG9tL2Rpc3QvZXMvZ2VzdHVyZXMvaG92ZXIubWpzXG52YXIgaW1wb3J0X2Rpc3QzMzcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDMzOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDMzOSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL2dlc3R1cmVzL2RyYWcvc3RhdGUvaXMtYWN0aXZlLm1qc1xudmFyIGltcG9ydF9kaXN0MzI4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzMjkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzMzAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaXNEcmFnZ2luZyA9IHtcbiAgeDogZmFsc2UsXG4gIHk6IGZhbHNlXG59O1xuZnVuY3Rpb24gaXNEcmFnQWN0aXZlKCkge1xuICByZXR1cm4gaXNEcmFnZ2luZy54IHx8IGlzRHJhZ2dpbmcueTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL2dlc3R1cmVzL3V0aWxzL3NldHVwLm1qc1xudmFyIGltcG9ydF9kaXN0MzM0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzMzUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzMzYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tZG9tQDExLjE4LjEvbm9kZV9tb2R1bGVzL21vdGlvbi1kb20vZGlzdC9lcy91dGlscy9yZXNvbHZlLWVsZW1lbnRzLm1qc1xudmFyIGltcG9ydF9kaXN0MzMxID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzMzIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzMzMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiByZXNvbHZlRWxlbWVudHMoZWxlbWVudE9yU2VsZWN0b3IsIHNjb3BlLCBzZWxlY3RvckNhY2hlKSB7XG4gIHZhciBfYTtcbiAgaWYgKGVsZW1lbnRPclNlbGVjdG9yIGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgIHJldHVybiBbZWxlbWVudE9yU2VsZWN0b3JdO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlbGVtZW50T3JTZWxlY3RvciA9PT0gXCJzdHJpbmdcIikge1xuICAgIGxldCByb290ID0gZG9jdW1lbnQ7XG4gICAgaWYgKHNjb3BlKSB7XG4gICAgICByb290ID0gc2NvcGUuY3VycmVudDtcbiAgICB9XG4gICAgY29uc3QgZWxlbWVudHMgPSAoX2EgPSBzZWxlY3RvckNhY2hlID09PSBudWxsIHx8IHNlbGVjdG9yQ2FjaGUgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHNlbGVjdG9yQ2FjaGVbZWxlbWVudE9yU2VsZWN0b3JdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiByb290LnF1ZXJ5U2VsZWN0b3JBbGwoZWxlbWVudE9yU2VsZWN0b3IpO1xuICAgIHJldHVybiBlbGVtZW50cyA/IEFycmF5LmZyb20oZWxlbWVudHMpIDogW107XG4gIH1cbiAgcmV0dXJuIEFycmF5LmZyb20oZWxlbWVudE9yU2VsZWN0b3IpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vbW90aW9uLWRvbUAxMS4xOC4xL25vZGVfbW9kdWxlcy9tb3Rpb24tZG9tL2Rpc3QvZXMvZ2VzdHVyZXMvdXRpbHMvc2V0dXAubWpzXG5mdW5jdGlvbiBzZXR1cEdlc3R1cmUoZWxlbWVudE9yU2VsZWN0b3IsIG9wdGlvbnMpIHtcbiAgY29uc3QgZWxlbWVudHMgPSByZXNvbHZlRWxlbWVudHMoZWxlbWVudE9yU2VsZWN0b3IpO1xuICBjb25zdCBnZXN0dXJlQWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBldmVudE9wdGlvbnMgPSB7XG4gICAgcGFzc2l2ZTogdHJ1ZSxcbiAgICAuLi5vcHRpb25zLFxuICAgIHNpZ25hbDogZ2VzdHVyZUFib3J0Q29udHJvbGxlci5zaWduYWxcbiAgfTtcbiAgY29uc3QgY2FuY2VsID0gKCkgPT4gZ2VzdHVyZUFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICByZXR1cm4gW2VsZW1lbnRzLCBldmVudE9wdGlvbnMsIGNhbmNlbF07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tZG9tQDExLjE4LjEvbm9kZV9tb2R1bGVzL21vdGlvbi1kb20vZGlzdC9lcy9nZXN0dXJlcy9ob3Zlci5tanNcbmZ1bmN0aW9uIGZpbHRlckV2ZW50cyhjYWxsYmFjaykge1xuICByZXR1cm4gKGV2ZW50KSA9PiB7XG4gICAgaWYgKGV2ZW50LnBvaW50ZXJUeXBlID09PSBcInRvdWNoXCIgfHwgaXNEcmFnQWN0aXZlKCkpXG4gICAgICByZXR1cm47XG4gICAgY2FsbGJhY2soZXZlbnQpO1xuICB9O1xufVxuZnVuY3Rpb24gaG92ZXIoZWxlbWVudE9yU2VsZWN0b3IsIG9uSG92ZXJTdGFydCwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IFtlbGVtZW50cywgZXZlbnRPcHRpb25zLCBjYW5jZWxdID0gc2V0dXBHZXN0dXJlKGVsZW1lbnRPclNlbGVjdG9yLCBvcHRpb25zKTtcbiAgY29uc3Qgb25Qb2ludGVyRW50ZXIgPSBmaWx0ZXJFdmVudHMoKGVudGVyRXZlbnQpID0+IHtcbiAgICBjb25zdCB7IHRhcmdldCB9ID0gZW50ZXJFdmVudDtcbiAgICBjb25zdCBvbkhvdmVyRW5kID0gb25Ib3ZlclN0YXJ0KGVudGVyRXZlbnQpO1xuICAgIGlmICh0eXBlb2Ygb25Ib3ZlckVuZCAhPT0gXCJmdW5jdGlvblwiIHx8ICF0YXJnZXQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3Qgb25Qb2ludGVyTGVhdmUgP
10617SBmaWx0ZXJFdmVudHMoKGxlYXZlRXZlbnQpID0+IHtcbiAgICAgIG9uSG92ZXJFbmQobGVhdmVFdmVudCk7XG4gICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJsZWF2ZVwiLCBvblBvaW50ZXJMZWF2ZSk7XG4gICAgfSk7XG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVybGVhdmVcIiwgb25Qb2ludGVyTGVhdmUsIGV2ZW50T3B0aW9ucyk7XG4gIH0pO1xuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmVudGVyXCIsIG9uUG9pbnRlckVudGVyLCBldmVudE9wdGlvbnMpO1xuICB9KTtcbiAgcmV0dXJuIGNhbmNlbDtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL2dlc3R1cmVzL3ByZXNzL2luZGV4Lm1qc1xudmFyIGltcG9ydF9kaXN0MzU1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzNTYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzNTcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tZG9tQDExLjE4LjEvbm9kZV9tb2R1bGVzL21vdGlvbi1kb20vZGlzdC9lcy9nZXN0dXJlcy91dGlscy9pcy1ub2RlLW9yLWNoaWxkLm1qc1xudmFyIGltcG9ydF9kaXN0MzQwID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzNDEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzNDIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaXNOb2RlT3JDaGlsZCA9IChwYXJlbnQsIGNoaWxkKSA9PiB7XG4gIGlmICghY2hpbGQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAocGFyZW50ID09PSBjaGlsZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBpc05vZGVPckNoaWxkKHBhcmVudCwgY2hpbGQucGFyZW50RWxlbWVudCk7XG4gIH1cbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tZG9tQDExLjE4LjEvbm9kZV9tb2R1bGVzL21vdGlvbi1kb20vZGlzdC9lcy9nZXN0dXJlcy91dGlscy9pcy1wcmltYXJ5LXBvaW50ZXIubWpzXG52YXIgaW1wb3J0X2Rpc3QzNDMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM0NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM0NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpc1ByaW1hcnlQb2ludGVyID0gKGV2ZW50KSA9PiB7XG4gIGlmIChldmVudC5wb2ludGVyVHlwZSA9PT0gXCJtb3VzZVwiKSB7XG4gICAgcmV0dXJuIHR5cGVvZiBldmVudC5idXR0b24gIT09IFwibnVtYmVyXCIgfHwgZXZlbnQuYnV0dG9uIDw9IDA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGV2ZW50LmlzUHJpbWFyeSAhPT0gZmFsc2U7XG4gIH1cbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tZG9tQDExLjE4LjEvbm9kZV9tb2R1bGVzL21vdGlvbi1kb20vZGlzdC9lcy9nZXN0dXJlcy9wcmVzcy91dGlscy9pcy1rZXlib2FyZC1hY2Nlc3NpYmxlLm1qc1xudmFyIGltcG9ydF9kaXN0MzQ2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzNDcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzNDggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgZm9jdXNhYmxlRWxlbWVudHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldChbXG4gIFwiQlVUVE9OXCIsXG4gIFwiSU5QVVRcIixcbiAgXCJTRUxFQ1RcIixcbiAgXCJURVhUQVJFQVwiLFxuICBcIkFcIlxuXSk7XG5mdW5jdGlvbiBpc0VsZW1lbnRLZXlib2FyZEFjY2Vzc2libGUoZWxlbWVudCkge1xuICByZXR1cm4gZm9jdXNhYmxlRWxlbWVudHMuaGFzKGVsZW1lbnQudGFnTmFtZSkgfHwgZWxlbWVudC50YWJJbmRleCAhPT0gLTE7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tZG9tQDExLjE4LjEvbm9kZV9tb2R1bGVzL21vdGlvbi1kb20vZGlzdC9lcy9nZXN0dXJlcy9wcmVzcy91dGlscy9rZXlib2FyZC5tanNcbnZhciBpbXBvcnRfZGlzdDM1MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzUzID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MzU0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vbW90aW9uLWRvbUAxMS4xOC4xL25vZGVfbW9kdWxlcy9tb3Rpb24tZG9tL2Rpc3QvZXMvZ2VzdHVyZXMvcHJlc3MvdXRpbHMvc3RhdGUubWpzXG52YXIgaW1wb3J0X2Rpc3QzNDkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM1MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM1MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpc1ByZXNzaW5nID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrU2V0KCk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tZG9tQDExLjE4LjEvbm9kZV9tb2R1bGVzL21vdGlvbi1kb20vZGlzdC9lcy9nZXN0dXJlcy9wcmVzcy91dGlscy9rZXlib2FyZC5tanNcbmZ1bmN0aW9uIGZpbHRlckV2ZW50czIoY2FsbGJhY2spIHtcbiAgcmV0dXJuIChldmVudCkgPT4ge1xuICAgIGlmIChldmVudC5rZXkgIT09IFwiRW50ZXJcIilcbiAgICAgIHJldHVybjtcbiAgICBjYWxsYmFjayhldmVudCk7XG4gIH07XG59XG5mdW5jdGlvbiBmaXJlUG9pbnRlckV2ZW50KHRhcmdldCwgdHlwZSkge1xuICB0YXJnZXQuZGlzcGF0Y2hFdmVudChuZXcgUG9pbnRlckV2ZW50KFwicG9pbnRlclwiICsgdHlwZSwgeyBpc1ByaW1hcnk6IHRydWUsIGJ1YmJsZXM6IHRydWUgfSkpO1xufVxudmFyIGVuYWJsZUtleWJvYXJkUHJlc3MgPSAoZm9jdXNFdmVudCwgZXZlbnRPcHRpb25zKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnQgPSBmb2N1c0V2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gIGlmICghZWxlbWVudClcbiAgICByZXR1cm47XG4gIGNvbnN0IGhhbmRsZUtleWRvd24gPSBmaWx0ZXJFdmVudHMyKCgpID0+IHtcbiAgICBpZiAoaXNQcmVzc2luZy5oYXMoZWxlbWVudCkpXG4gICAgICByZXR1cm47XG4gICAgZmlyZVBvaW50ZXJFdmVudChlbGVtZW50LCBcImRvd25cIik7XG4gICAgY29uc3QgaGFuZGxlS2V5dXAgPSBmaWx0ZXJFdmVudHMyKCgpID0+IHtcbiAgICAgIGZpcmVQb2ludGVyRXZlbnQoZWxlbWVudCwgXCJ1cFwiKTtcbiAgICB9KTtcbiAgICBjb25zdCBoYW5kbGVCbHVyID0gKCkgPT4gZmlyZVBvaW50ZXJFdmVudChlbGVtZW50LCBcImNhbmNlbFwiKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLCBoYW5kbGVLZXl1cCwgZXZlbnRPcHRpb25zKTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZUJsdXIsIGV2ZW50T3B0aW9ucyk7XG4gIH0pO1xuICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsIGhhbmRsZUtleWRvd24sIGV2ZW50T3B0aW9ucyk7XG4gIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgKCkgPT4gZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLCBoYW5kbGVLZXlkb3duKSwgZXZlbnRPcHRpb25zKTtcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tZG9tQDExLjE4LjEvbm9kZV9tb2R1bGVzL21vdGlvbi1kb20vZGlzdC9lcy9nZXN0dXJlcy9wcmVzcy9pbmRleC5tanNcbmZ1bmN0aW9uIGlzVmFsaWRQcmVzc0V2ZW50KGV2ZW50KSB7XG4gIHJldHVybi
10617Bpc1ByaW1hcnlQb2ludGVyKGV2ZW50KSAmJiAhaXNEcmFnQWN0aXZlKCk7XG59XG5mdW5jdGlvbiBwcmVzcyhlbGVtZW50T3JTZWxlY3Rvciwgb25QcmVzc1N0YXJ0LCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgW2VsZW1lbnRzLCBldmVudE9wdGlvbnMsIGNhbmNlbEV2ZW50c10gPSBzZXR1cEdlc3R1cmUoZWxlbWVudE9yU2VsZWN0b3IsIG9wdGlvbnMpO1xuICBjb25zdCBzdGFydFByZXNzID0gKHN0YXJ0RXZlbnQpID0+IHtcbiAgICBjb25zdCBlbGVtZW50ID0gc3RhcnRFdmVudC5jdXJyZW50VGFyZ2V0O1xuICAgIGlmICghaXNWYWxpZFByZXNzRXZlbnQoc3RhcnRFdmVudCkgfHwgaXNQcmVzc2luZy5oYXMoZWxlbWVudCkpXG4gICAgICByZXR1cm47XG4gICAgaXNQcmVzc2luZy5hZGQoZWxlbWVudCk7XG4gICAgY29uc3Qgb25QcmVzc0VuZCA9IG9uUHJlc3NTdGFydChzdGFydEV2ZW50KTtcbiAgICBjb25zdCBvblBvaW50ZXJFbmQgPSAoZW5kRXZlbnQsIHN1Y2Nlc3MpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIG9uUG9pbnRlclVwKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmNhbmNlbFwiLCBvblBvaW50ZXJDYW5jZWwpO1xuICAgICAgaWYgKCFpc1ZhbGlkUHJlc3NFdmVudChlbmRFdmVudCkgfHwgIWlzUHJlc3NpbmcuaGFzKGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlzUHJlc3NpbmcuZGVsZXRlKGVsZW1lbnQpO1xuICAgICAgaWYgKHR5cGVvZiBvblByZXNzRW5kID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgb25QcmVzc0VuZChlbmRFdmVudCwgeyBzdWNjZXNzIH0pO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3Qgb25Qb2ludGVyVXAgPSAodXBFdmVudCkgPT4ge1xuICAgICAgb25Qb2ludGVyRW5kKHVwRXZlbnQsIG9wdGlvbnMudXNlR2xvYmFsVGFyZ2V0IHx8IGlzTm9kZU9yQ2hpbGQoZWxlbWVudCwgdXBFdmVudC50YXJnZXQpKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uUG9pbnRlckNhbmNlbCA9IChjYW5jZWxFdmVudCkgPT4ge1xuICAgICAgb25Qb2ludGVyRW5kKGNhbmNlbEV2ZW50LCBmYWxzZSk7XG4gICAgfTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBvblBvaW50ZXJVcCwgZXZlbnRPcHRpb25zKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJjYW5jZWxcIiwgb25Qb2ludGVyQ2FuY2VsLCBldmVudE9wdGlvbnMpO1xuICB9O1xuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgaWYgKCFpc0VsZW1lbnRLZXlib2FyZEFjY2Vzc2libGUoZWxlbWVudCkgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSA9PT0gbnVsbCkge1xuICAgICAgZWxlbWVudC50YWJJbmRleCA9IDA7XG4gICAgfVxuICAgIGNvbnN0IHRhcmdldCA9IG9wdGlvbnMudXNlR2xvYmFsVGFyZ2V0ID8gd2luZG93IDogZWxlbWVudDtcbiAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIHN0YXJ0UHJlc3MsIGV2ZW50T3B0aW9ucyk7XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNcIiwgKGV2ZW50KSA9PiBlbmFibGVLZXlib2FyZFByZXNzKGV2ZW50LCBldmVudE9wdGlvbnMpLCBldmVudE9wdGlvbnMpO1xuICB9KTtcbiAgcmV0dXJuIGNhbmNlbEV2ZW50cztcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL3ZpZXcvaW5kZXgubWpzXG52YXIgaW1wb3J0X2Rpc3QzODIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM4MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM4NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL3ZpZXcvc3RhcnQubWpzXG52YXIgaW1wb3J0X2Rpc3QzNzkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM4MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM4MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL2FuaW1hdGlvbi93YWFwaS9Qc2V1ZG9BbmltYXRpb24ubWpzXG52YXIgaW1wb3J0X2Rpc3QzNjEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM2MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM2MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL2FuaW1hdGlvbi93YWFwaS91dGlscy9jb252ZXJ0LW9wdGlvbnMubWpzXG52YXIgaW1wb3J0X2Rpc3QzNTggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM1OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM2MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL3ZpZXcvdXRpbHMvY2hvb3NlLWxheWVyLXR5cGUubWpzXG52YXIgaW1wb3J0X2Rpc3QzNjQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM2NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM2NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL3ZpZXcvdXRpbHMvY3NzLm1qc1xudmFyIGltcG9ydF9kaXN0MzY3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzNjggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzNjkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tZG9tQDExLjE4LjEvbm9kZV9tb2R1bGVzL21vdGlvbi1kb20vZGlzdC9lcy92aWV3L3V0aWxzL2dldC1sYXllci1uYW1lLm1qc1xudmFyIGltcG9ydF9kaXN0MzcwID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzNzEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzNzIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9tb3Rpb24tZG9tQDExLjE4LjEvbm9kZV9tb2R1bGVzL21vdGlvbi1kb20vZGlzdC9lcy92aWV3L3V0aWxzL2dldC12aWV3LWFuaW1hdGlvbnMubWpzXG52YXIgaW1wb3J0X2Rpc3QzNzMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM3NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM3NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL21vdGlvbi1kb21AMTEuMTguMS9ub2RlX21vZHVsZXMvbW90aW9uLWRvbS9kaXN0L2VzL3ZpZXcvdXRpbHMvaGFzLXRhcmdldC5tanNcbnZhciBpbXBvcnRfZGlzdDM3NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0Mzc3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0Mzc4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vbW90aW9uLWRvbUAxMS4xOC4xL25vZGVfbW9kdWxlcy9tb3Rpb24tZG9tL2Rpc3QvZXMvZ2VzdHVyZXMvZHJhZy9zdGF0ZS9zZXQtYWN0aXZlLm1qc1xudmFyIGltcG9ydF9kaXN0Mzg1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzODYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzODcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBzZXREcmFnTG9jayhheGlzKSB7XG4gIGlmIChheGlzID09PSBcInhcIiB8fCBheGlzID09PSBcInlcIikge1xuICAgIGlmIChpc0RyYWdnaW5nW2F4aXNdKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgaXNEcmFnZ2luZ1theGlzXSA9IHRydWU7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpc0RyYWdnaW5nW2F4aXNdID0gZmFsc2U7XG4gICAgICB9O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaXNEcmFnZ2luZy54IHx8IGlzRHJhZ2dpbmcueSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlzRHJhZ2dpbmcueCA9IGlzRHJhZ2dpbmcueSA9IHRydWU7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBpc0RyYWdnaW5nLnggPSBpc0RyYWdnaW5nLnkgPSBmYWxzZTtcbiAgICAgIH07XG4gICAgfVxuICB9XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9odG1sL3V0aWxzL2tleXMtcG9zaXRpb24ubWpzXG52YXIgaW1wb3J0X2Rpc3QzOTEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM5MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDM5MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBwb3NpdGlvbmFsS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtcbiAgXCJ3aWR0aFwiLFxuICBcImhlaWdodFwiLFxuICBcInRvcFwiLFxuICBcImxlZnRcIixcbiAgXCJyaWdodFwiLFxuICBcImJvdHRvbVwiLFxuICAuLi50cmFuc2Zvcm1Qcm9wT3JkZXJcbl0pO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvdXRpbHMvc2V0dGVycy5tanNcbnZhciBpbXBvcnRfZGlzdDQwOSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDEwID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDExID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS9pbmRleC5tanNcbnZhciBpbXBvcnRfZGlzdDQwNiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDA3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDA4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9mcmFtZWxvb3Avc3luYy10aW1lLm1qc1xudmFyIGltcG9ydF9kaXN0Mzk0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzOTUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QzOTYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgbm93O1xuZnVuY3Rpb24gY2xlYXJUaW1lKCkge1xuICBub3cgPSB2b2lkIDA7XG59XG52YXIgdGltZSA9IHtcbiAgbm93OiAoKSA9PiB7XG4gICAgaWYgKG5vdyA9PT0gdm9pZCAwKSB7XG4gICAgICB0aW1lLnNldChmcmFtZURhdGEuaXNQcm9jZXNzaW5nIHx8IE1vdGlvbkdsb2JhbENvbmZpZy51c2VNYW51YWxUaW1pbmcgPyBmcmFtZURhdGEudGltZXN0YW1wIDogcGVyZm9ybWFuY2Uubm93KCkpO1xuICAgIH1cbiAgICByZXR1cm4gbm93O1xuICB9LFxuICBzZXQ6IChuZXdUaW1lKSA9PiB7XG4gICAgbm93ID0gbmV3VGltZTtcbiAgICBxdWV1ZU1pY3JvdGFzayhjbGVhclRpbWUpO1xuICB9XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy9zdWJzY3JpcHRpb24tbWFuYWdlci5tanNcbnZhciBpbXBvcnRfZGlzdDQwMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDAxID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDAyID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy9hcnJheS5tanNcbnZhciBpbXBvcnRfZGlzdDM5NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0Mzk4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0Mzk5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gYWRkVW5pcXVlSXRlbShhcnIsIGl0ZW0pIHtcbiAgaWYgKGFyci5pbmRleE9mKGl0ZW0pID09PSAtMSlcbiAgICBhcnIucHVzaChpdGVtKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUl0ZW0oYXJyLCBpdGVtKSB7XG4gIGNvbnN0IGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7XG4gIGlmIChpbmRleCA+IC0xKVxuICAgIGFyci5zcGxpY2UoaW5kZXgsIDEpO1xufVxuZnVuY3Rpb24gbW92ZUl0ZW0oWy4uLmFycl0sIGZyb21JbmRleCwgdG9JbmRleCkge1xuICBjb25zdCBzdGFydEluZGV4ID0gZnJvbUluZGV4IDwgMCA/IGFyci5sZW5ndGggKyBmcm9tSW5kZXggOiBmcm9tSW5kZXg7XG4gIGlmIChzdGFydEluZGV4ID49IDAgJiYgc3RhcnRJbmRleCA8IGFyci5sZW5ndGgpIHtcbiAgICBjb25zdCBlbmRJbmRleCA9IHRvSW5kZXggPCAwID8gYXJyLmxlbmd0aCArIHRvSW5kZXggOiB0b0luZGV4O1xuICAgIGNvbnN0IFtpdGVtXSA9IGFyci5zcGxpY2UoZnJvbUluZGV4LCAxKTtcbiAgICBhcnIuc3BsaWNlKGVuZEluZGV4LCAwLCBpdGVtKTtcbiAgfVxuICByZXR1cm4gYXJyO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy9zdWJzY3JpcHRpb24tbWFuYWdlci5tanNcbnZhciBTdWJzY3JpcHRpb25NYW5hZ2VyID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgfVxuICBhZGQoaGFuZGxlcikge1xuICAgIGFkZFVuaXF1ZUl0ZW0odGhpcy5zdWJzY3JpcHRpb25zLCBoYW5kbGVyKTtcbiAgICByZXR1cm4gKCkgPT4gcmVtb3ZlSXRlbSh0aGlzLnN1YnNjcmlwdGlvbnMsIGhhbmRsZXIpO1xuICB9XG4gIG5vdGlmeShhLCBiLCBjKSB7XG4gICAgY29uc3QgbnVtU3Vic2NyaXB0aW9ucyA9IHRoaXMuc3Vic2NyaXB0aW9ucy5sZW5ndGg7XG4gICAgaWYgKCFudW1TdWJzY3JpcHRpb25zKVxuICAgICAgcmV0dXJuO1xuICAgIGlmIChudW1TdWJzY3JpcHRpb25zID09PSAxKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnNbMF0oYSwgYiwgYyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtU3Vic2NyaXB0aW9uczsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLnN1YnNjcmlwdGlvbnNbaV07XG4gICAgICAgIGhhbmRsZXIgJiYgaGFuZGxlcihhLCBiLCBjKTtcbiAgICAgIH1cbiAgICB9XG4gI
10617H1cbiAgZ2V0U2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25zLmxlbmd0aDtcbiAgfVxuICBjbGVhcigpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMubGVuZ3RoID0gMDtcbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvdmVsb2NpdHktcGVyLXNlY29uZC5tanNcbnZhciBpbXBvcnRfZGlzdDQwMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDA0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDA1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gdmVsb2NpdHlQZXJTZWNvbmQodmVsb2NpdHksIGZyYW1lRHVyYXRpb24pIHtcbiAgcmV0dXJuIGZyYW1lRHVyYXRpb24gPyB2ZWxvY2l0eSAqICgxZTMgLyBmcmFtZUR1cmF0aW9uKSA6IDA7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3ZhbHVlL2luZGV4Lm1qc1xudmFyIE1BWF9WRUxPQ0lUWV9ERUxUQSA9IDMwO1xudmFyIGlzRmxvYXQgPSAodmFsdWUpID0+IHtcbiAgcmV0dXJuICFpc05hTihwYXJzZUZsb2F0KHZhbHVlKSk7XG59O1xudmFyIGNvbGxlY3RNb3Rpb25WYWx1ZXMgPSB7XG4gIGN1cnJlbnQ6IHZvaWQgMFxufTtcbnZhciBNb3Rpb25WYWx1ZSA9IGNsYXNzIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBpbml0IC0gVGhlIGluaXRpYXRpbmcgdmFsdWVcbiAgICogQHBhcmFtIGNvbmZpZyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9uc1xuICAgKlxuICAgKiAtICBgdHJhbnNmb3JtZXJgOiBBIGZ1bmN0aW9uIHRvIHRyYW5zZm9ybSBpbmNvbWluZyB2YWx1ZXMgd2l0aC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihpbml0LCBvcHRpb25zID0ge30pIHtcbiAgICB0aGlzLnZlcnNpb24gPSBcIjExLjE4LjJcIjtcbiAgICB0aGlzLmNhblRyYWNrVmVsb2NpdHkgPSBudWxsO1xuICAgIHRoaXMuZXZlbnRzID0ge307XG4gICAgdGhpcy51cGRhdGVBbmROb3RpZnkgPSAodiwgcmVuZGVyID0gdHJ1ZSkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudFRpbWUgPSB0aW1lLm5vdygpO1xuICAgICAgaWYgKHRoaXMudXBkYXRlZEF0ICE9PSBjdXJyZW50VGltZSkge1xuICAgICAgICB0aGlzLnNldFByZXZGcmFtZVZhbHVlKCk7XG4gICAgICB9XG4gICAgICB0aGlzLnByZXYgPSB0aGlzLmN1cnJlbnQ7XG4gICAgICB0aGlzLnNldEN1cnJlbnQodik7XG4gICAgICBpZiAodGhpcy5jdXJyZW50ICE9PSB0aGlzLnByZXYgJiYgdGhpcy5ldmVudHMuY2hhbmdlKSB7XG4gICAgICAgIHRoaXMuZXZlbnRzLmNoYW5nZS5ub3RpZnkodGhpcy5jdXJyZW50KTtcbiAgICAgIH1cbiAgICAgIGlmIChyZW5kZXIgJiYgdGhpcy5ldmVudHMucmVuZGVyUmVxdWVzdCkge1xuICAgICAgICB0aGlzLmV2ZW50cy5yZW5kZXJSZXF1ZXN0Lm5vdGlmeSh0aGlzLmN1cnJlbnQpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5oYXNBbmltYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuc2V0Q3VycmVudChpbml0KTtcbiAgICB0aGlzLm93bmVyID0gb3B0aW9ucy5vd25lcjtcbiAgfVxuICBzZXRDdXJyZW50KGN1cnJlbnQpIHtcbiAgICB0aGlzLmN1cnJlbnQgPSBjdXJyZW50O1xuICAgIHRoaXMudXBkYXRlZEF0ID0gdGltZS5ub3coKTtcbiAgICBpZiAodGhpcy5jYW5UcmFja1ZlbG9jaXR5ID09PSBudWxsICYmIGN1cnJlbnQgIT09IHZvaWQgMCkge1xuICAgICAgdGhpcy5jYW5UcmFja1ZlbG9jaXR5ID0gaXNGbG9hdCh0aGlzLmN1cnJlbnQpO1xuICAgIH1cbiAgfVxuICBzZXRQcmV2RnJhbWVWYWx1ZShwcmV2RnJhbWVWYWx1ZSA9IHRoaXMuY3VycmVudCkge1xuICAgIHRoaXMucHJldkZyYW1lVmFsdWUgPSBwcmV2RnJhbWVWYWx1ZTtcbiAgICB0aGlzLnByZXZVcGRhdGVkQXQgPSB0aGlzLnVwZGF0ZWRBdDtcbiAgfVxuICAvKipcbiAgICogQWRkcyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBgTW90aW9uVmFsdWVgIGlzIHVwZGF0ZWQuXG4gICAqXG4gICAqIEl0IHJldHVybnMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGNhbGxlZCwgd2lsbCBjYW5jZWwgdGhlIHN1YnNjcmlwdGlvbi5cbiAgICpcbiAgICogV2hlbiBjYWxsaW5nIGBvbkNoYW5nZWAgaW5zaWRlIGEgUmVhY3QgY29tcG9uZW50LCBpdCBzaG91bGQgYmUgd3JhcHBlZCB3aXRoIHRoZVxuICAgKiBgdXNlRWZmZWN0YCBob29rLiBBcyBpdCByZXR1cm5zIGFuIHVuc3Vic2NyaWJlIGZ1bmN0aW9uLCB0aGlzIHNob3VsZCBiZSByZXR1cm5lZFxuICAgKiBmcm9tIHRoZSBgdXNlRWZmZWN0YCBmdW5jdGlvbiB0byBlbnN1cmUgeW91IGRvbid0IGFkZCBkdXBsaWNhdGUgc3Vic2NyaWJlcnMuLlxuICAgKlxuICAgKiBgYGBqc3hcbiAgICogZXhwb3J0IGNvbnN0IE15Q29tcG9uZW50ID0gKCkgPT4ge1xuICAgKiAgIGNvbnN0IHggPSB1c2VNb3Rpb25WYWx1ZSgwKVxuICAgKiAgIGNvbnN0IHkgPSB1c2VNb3Rpb25WYWx1ZSgwKVxuICAgKiAgIGNvbnN0IG9wYWNpdHkgPSB1c2VNb3Rpb25WYWx1ZSgxKVxuICAgKlxuICAgKiAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAqICAgICBmdW5jdGlvbiB1cGRhdGVPcGFjaXR5KCkge1xuICAgKiAgICAgICBjb25zdCBtYXhYWSA9IE1hdGgubWF4KHguZ2V0KCksIHkuZ2V0KCkpXG4gICAqICAgICAgIGNvbnN0IG5ld09wYWNpdHkgPSB0cmFuc2Zvcm0obWF4WFksIFswLCAxMDBdLCBbMSwgMF0pXG4gICAqICAgICAgIG9wYWNpdHkuc2V0KG5ld09wYWNpdHkpXG4gICAqICAgICB9XG4gICAqXG4gICAqICAgICBjb25zdCB1bnN1YnNjcmliZVggPSB4Lm9uKFwiY2hhbmdlXCIsIHVwZGF0ZU9wYWNpdHkpXG4gICAqICAgICBjb25zdCB1bnN1YnNjcmliZVkgPSB5Lm9uKFwiY2hhbmdlXCIsIHVwZGF0ZU9wYWNpdHkpXG4gICAqXG4gICAqICAgICByZXR1cm4gKCkgPT4ge1xuICAgKiAgICAgICB1bnN1YnNjcmliZVgoKVxuICAgKiAgICAgICB1bnN1YnNjcmliZVkoKVxuICAgKiAgICAgfVxuICAgKiAgIH0sIFtdKVxuICAgKlxuICAgKiAgIHJldHVybiA8bW90aW9uLmRpdiBzdHlsZT17eyB4IH19IC8+XG4gICAqIH1cbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBzdWJzY3JpYmVyIC0gQSBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIHRoZSBsYXRlc3QgdmFsdWUuXG4gICAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCwgd2hlbiBjYWxsZWQsIHdpbGwgY2FuY2VsIHR
10617oaXMgc3Vic2NyaXB0aW9uLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgb25DaGFuZ2Uoc3Vic2NyaXB0aW9uKSB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgd2Fybk9uY2UoZmFsc2UsIGB2YWx1ZS5vbkNoYW5nZShjYWxsYmFjaykgaXMgZGVwcmVjYXRlZC4gU3dpdGNoIHRvIHZhbHVlLm9uKFwiY2hhbmdlXCIsIGNhbGxiYWNrKS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMub24oXCJjaGFuZ2VcIiwgc3Vic2NyaXB0aW9uKTtcbiAgfVxuICBvbihldmVudE5hbWUsIGNhbGxiYWNrKSB7XG4gICAgaWYgKCF0aGlzLmV2ZW50c1tldmVudE5hbWVdKSB7XG4gICAgICB0aGlzLmV2ZW50c1tldmVudE5hbWVdID0gbmV3IFN1YnNjcmlwdGlvbk1hbmFnZXIoKTtcbiAgICB9XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSB0aGlzLmV2ZW50c1tldmVudE5hbWVdLmFkZChjYWxsYmFjayk7XG4gICAgaWYgKGV2ZW50TmFtZSA9PT0gXCJjaGFuZ2VcIikge1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdW5zdWJzY3JpYmUoKTtcbiAgICAgICAgZnJhbWUucmVhZCgoKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLmV2ZW50cy5jaGFuZ2UuZ2V0U2l6ZSgpKSB7XG4gICAgICAgICAgICB0aGlzLnN0b3AoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVuc3Vic2NyaWJlO1xuICB9XG4gIGNsZWFyTGlzdGVuZXJzKCkge1xuICAgIGZvciAoY29uc3QgZXZlbnRNYW5hZ2VycyBpbiB0aGlzLmV2ZW50cykge1xuICAgICAgdGhpcy5ldmVudHNbZXZlbnRNYW5hZ2Vyc10uY2xlYXIoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIEF0dGFjaGVzIGEgcGFzc2l2ZSBlZmZlY3QgdG8gdGhlIGBNb3Rpb25WYWx1ZWAuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgYXR0YWNoKHBhc3NpdmVFZmZlY3QsIHN0b3BQYXNzaXZlRWZmZWN0KSB7XG4gICAgdGhpcy5wYXNzaXZlRWZmZWN0ID0gcGFzc2l2ZUVmZmVjdDtcbiAgICB0aGlzLnN0b3BQYXNzaXZlRWZmZWN0ID0gc3RvcFBhc3NpdmVFZmZlY3Q7XG4gIH1cbiAgLyoqXG4gICAqIFNldHMgdGhlIHN0YXRlIG9mIHRoZSBgTW90aW9uVmFsdWVgLlxuICAgKlxuICAgKiBAcmVtYXJrc1xuICAgKlxuICAgKiBgYGBqc3hcbiAgICogY29uc3QgeCA9IHVzZU1vdGlvblZhbHVlKDApXG4gICAqIHguc2V0KDEwKVxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGxhdGVzdCAtIExhdGVzdCB2YWx1ZSB0byBzZXQuXG4gICAqIEBwYXJhbSByZW5kZXIgLSBXaGV0aGVyIHRvIG5vdGlmeSByZW5kZXIgc3Vic2NyaWJlcnMuIERlZmF1bHRzIHRvIGB0cnVlYFxuICAgKlxuICAgKiBAcHVibGljXG4gICAqL1xuICBzZXQodiwgcmVuZGVyID0gdHJ1ZSkge1xuICAgIGlmICghcmVuZGVyIHx8ICF0aGlzLnBhc3NpdmVFZmZlY3QpIHtcbiAgICAgIHRoaXMudXBkYXRlQW5kTm90aWZ5KHYsIHJlbmRlcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucGFzc2l2ZUVmZmVjdCh2LCB0aGlzLnVwZGF0ZUFuZE5vdGlmeSk7XG4gICAgfVxuICB9XG4gIHNldFdpdGhWZWxvY2l0eShwcmV2LCBjdXJyZW50LCBkZWx0YSkge1xuICAgIHRoaXMuc2V0KGN1cnJlbnQpO1xuICAgIHRoaXMucHJldiA9IHZvaWQgMDtcbiAgICB0aGlzLnByZXZGcmFtZVZhbHVlID0gcHJldjtcbiAgICB0aGlzLnByZXZVcGRhdGVkQXQgPSB0aGlzLnVwZGF0ZWRBdCAtIGRlbHRhO1xuICB9XG4gIC8qKlxuICAgKiBTZXQgdGhlIHN0YXRlIG9mIHRoZSBgTW90aW9uVmFsdWVgLCBzdG9wcGluZyBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsXG4gICAqIGVmZmVjdHMsIGFuZCByZXNldHMgdmVsb2NpdHkgdG8gYDBgLlxuICAgKi9cbiAganVtcCh2LCBlbmRBbmltYXRpb24gPSB0cnVlKSB7XG4gICAgdGhpcy51cGRhdGVBbmROb3RpZnkodik7XG4gICAgdGhpcy5wcmV2ID0gdjtcbiAgICB0aGlzLnByZXZVcGRhdGVkQXQgPSB0aGlzLnByZXZGcmFtZVZhbHVlID0gdm9pZCAwO1xuICAgIGVuZEFuaW1hdGlvbiAmJiB0aGlzLnN0b3AoKTtcbiAgICBpZiAodGhpcy5zdG9wUGFzc2l2ZUVmZmVjdClcbiAgICAgIHRoaXMuc3RvcFBhc3NpdmVFZmZlY3QoKTtcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbGF0ZXN0IHN0YXRlIG9mIGBNb3Rpb25WYWx1ZWBcbiAgICpcbiAgICogQHJldHVybnMgLSBUaGUgbGF0ZXN0IHN0YXRlIG9mIGBNb3Rpb25WYWx1ZWBcbiAgICpcbiAgICogQHB1YmxpY1xuICAgKi9cbiAgZ2V0KCkge1xuICAgIGlmIChjb2xsZWN0TW90aW9uVmFsdWVzLmN1cnJlbnQpIHtcbiAgICAgIGNvbGxlY3RNb3Rpb25WYWx1ZXMuY3VycmVudC5wdXNoKHRoaXMpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jdXJyZW50O1xuICB9XG4gIC8qKlxuICAgKiBAcHVibGljXG4gICAqL1xuICBnZXRQcmV2aW91cygpIHtcbiAgICByZXR1cm4gdGhpcy5wcmV2O1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsYXRlc3QgdmVsb2NpdHkgb2YgYE1vdGlvblZhbHVlYFxuICAgKlxuICAgKiBAcmV0dXJucyAtIFRoZSBsYXRlc3QgdmVsb2NpdHkgb2YgYE1vdGlvblZhbHVlYC4gUmV0dXJucyBgMGAgaWYgdGhlIHN0YXRlIGlzIG5vbi1udW1lcmljYWwuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGdldFZlbG9jaXR5KCkge1xuICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gdGltZS5ub3coKTtcbiAgICBpZiAoIXRoaXMuY2FuVHJhY2tWZWxvY2l0eSB8fCB0aGlzLnByZXZGcmFtZVZhbHVlID09PSB2b2lkIDAgfHwgY3VycmVudFRpbWUgLSB0aGlzLnVwZGF0ZWRBdCA+IE1BWF9WRUxPQ0lUWV9ERUxUQSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IGRlbHRhID0gTWF0aC5taW4odGhpcy51cGRhdGVkQXQgLSB0aGlzLnByZXZVcGRhdGVkQXQsIE1BWF9WRUxPQ0lUWV9ERUxUQSk7XG4gICAgcmV0dXJuIHZlbG9jaXR5UGVyU2Vjb25kKHBhcnNlRmxvYXQodGhpcy5jdXJyZW50KSAtIHBhcnNlRmxvYXQodGhpcy5wcmV2RnJhbWVWYWx1ZSksIGRlbHRhKTtcbiAgfVxuICAvKipcbiAgICogUmVnaXN0ZXJzIGEgbmV3IGFuaW1hdGlvbiB0byBjb250cm9sIHRoaXMgYE1vdGlvblZhbHVlYC4gT25seSBvbmVcbiAgICogYW5pbWF0aW9uIGNhbiBkcml2ZSBhIGBNb3Rpb25WYWx1ZWAgYXQgb25lIHRpbWUuXG4gICAqXG4gICAqIGBgYGpzeFxuICAgKiB2YWx1ZS
106175zdGFydCgpXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gYW5pbWF0aW9uIC0gQSBmdW5jdGlvbiB0aGF0IHN0YXJ0cyB0aGUgcHJvdmlkZWQgYW5pbWF0aW9uXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc3RhcnQoc3RhcnRBbmltYXRpb24pIHtcbiAgICB0aGlzLnN0b3AoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMuaGFzQW5pbWF0ZWQgPSB0cnVlO1xuICAgICAgdGhpcy5hbmltYXRpb24gPSBzdGFydEFuaW1hdGlvbihyZXNvbHZlKTtcbiAgICAgIGlmICh0aGlzLmV2ZW50cy5hbmltYXRpb25TdGFydCkge1xuICAgICAgICB0aGlzLmV2ZW50cy5hbmltYXRpb25TdGFydC5ub3RpZnkoKTtcbiAgICAgIH1cbiAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmV2ZW50cy5hbmltYXRpb25Db21wbGV0ZSkge1xuICAgICAgICB0aGlzLmV2ZW50cy5hbmltYXRpb25Db21wbGV0ZS5ub3RpZnkoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2xlYXJBbmltYXRpb24oKTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogU3RvcCB0aGUgY3VycmVudGx5IGFjdGl2ZSBhbmltYXRpb24uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHN0b3AoKSB7XG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uKSB7XG4gICAgICB0aGlzLmFuaW1hdGlvbi5zdG9wKCk7XG4gICAgICBpZiAodGhpcy5ldmVudHMuYW5pbWF0aW9uQ2FuY2VsKSB7XG4gICAgICAgIHRoaXMuZXZlbnRzLmFuaW1hdGlvbkNhbmNlbC5ub3RpZnkoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jbGVhckFuaW1hdGlvbigpO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGlzIHZhbHVlIGlzIGN1cnJlbnRseSBhbmltYXRpbmcuXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGlzQW5pbWF0aW5nKCkge1xuICAgIHJldHVybiAhIXRoaXMuYW5pbWF0aW9uO1xuICB9XG4gIGNsZWFyQW5pbWF0aW9uKCkge1xuICAgIGRlbGV0ZSB0aGlzLmFuaW1hdGlvbjtcbiAgfVxuICAvKipcbiAgICogRGVzdHJveSBhbmQgY2xlYW4gdXAgc3Vic2NyaWJlcnMgdG8gdGhpcyBgTW90aW9uVmFsdWVgLlxuICAgKlxuICAgKiBUaGUgYE1vdGlvblZhbHVlYCBob29rcyBsaWtlIGB1c2VNb3Rpb25WYWx1ZWAgYW5kIGB1c2VUcmFuc2Zvcm1gIGF1dG9tYXRpY2FsbHlcbiAgICogaGFuZGxlIHRoZSBsaWZlY3ljbGUgb2YgdGhlIHJldHVybmVkIGBNb3Rpb25WYWx1ZWAsIHNvIHRoaXMgbWV0aG9kIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIHlvdSd2ZSBtYW51YWxseVxuICAgKiBjcmVhdGVkIGEgYE1vdGlvblZhbHVlYCB2aWEgdGhlIGBtb3Rpb25WYWx1ZWAgZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIGRlc3Ryb3koKSB7XG4gICAgdGhpcy5jbGVhckxpc3RlbmVycygpO1xuICAgIHRoaXMuc3RvcCgpO1xuICAgIGlmICh0aGlzLnN0b3BQYXNzaXZlRWZmZWN0KSB7XG4gICAgICB0aGlzLnN0b3BQYXNzaXZlRWZmZWN0KCk7XG4gICAgfVxuICB9XG59O1xuZnVuY3Rpb24gbW90aW9uVmFsdWUoaW5pdCwgb3B0aW9ucykge1xuICByZXR1cm4gbmV3IE1vdGlvblZhbHVlKGluaXQsIG9wdGlvbnMpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvdXRpbHMvc2V0dGVycy5tanNcbmZ1bmN0aW9uIHNldE1vdGlvblZhbHVlKHZpc3VhbEVsZW1lbnQsIGtleSwgdmFsdWUpIHtcbiAgaWYgKHZpc3VhbEVsZW1lbnQuaGFzVmFsdWUoa2V5KSkge1xuICAgIHZpc3VhbEVsZW1lbnQuZ2V0VmFsdWUoa2V5KS5zZXQodmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHZpc3VhbEVsZW1lbnQuYWRkVmFsdWUoa2V5LCBtb3Rpb25WYWx1ZSh2YWx1ZSkpO1xuICB9XG59XG5mdW5jdGlvbiBzZXRUYXJnZXQodmlzdWFsRWxlbWVudCwgZGVmaW5pdGlvbikge1xuICBjb25zdCByZXNvbHZlZCA9IHJlc29sdmVWYXJpYW50KHZpc3VhbEVsZW1lbnQsIGRlZmluaXRpb24pO1xuICBsZXQgeyB0cmFuc2l0aW9uRW5kID0ge30sIHRyYW5zaXRpb24gPSB7fSwgLi4udGFyZ2V0IH0gPSByZXNvbHZlZCB8fCB7fTtcbiAgdGFyZ2V0ID0geyAuLi50YXJnZXQsIC4uLnRyYW5zaXRpb25FbmQgfTtcbiAgZm9yIChjb25zdCBrZXkgaW4gdGFyZ2V0KSB7XG4gICAgY29uc3QgdmFsdWUgPSByZXNvbHZlRmluYWxWYWx1ZUluS2V5ZnJhbWVzKHRhcmdldFtrZXldKTtcbiAgICBzZXRNb3Rpb25WYWx1ZSh2aXN1YWxFbGVtZW50LCBrZXksIHZhbHVlKTtcbiAgfVxufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS91c2Utd2lsbC1jaGFuZ2UvYWRkLXdpbGwtY2hhbmdlLm1qc1xudmFyIGltcG9ydF9kaXN0NDE1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0MTYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0MTcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3ZhbHVlL3VzZS13aWxsLWNoYW5nZS9pcy5tanNcbnZhciBpbXBvcnRfZGlzdDQxMiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDEzID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDE0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gaXNXaWxsQ2hhbmdlTW90aW9uVmFsdWUodmFsdWUpIHtcbiAgcmV0dXJuIEJvb2xlYW4oaXNNb3Rpb25WYWx1ZSh2YWx1ZSkgJiYgdmFsdWUuYWRkKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdXNlLXdpbGwtY2hhbmdlL2FkZC13aWxsLWNoYW5nZS5tanNcbmZ1bmN0aW9uIGFkZFZhbHVlVG9XaWxsQ2hhbmdlKHZpc3VhbEVsZW1lbnQsIGtleSkge1xuICBjb25zdCB3aWxsQ2hhbmdlID0gdmlzdWFsRWxlbWVudC5nZXRWYWx1ZShcIndpbGxDaGFuZ2VcIik7XG4gIGlmIChpc1dpbGxDaGFuZ2VNb3Rpb25WYWx1ZSh3aWxsQ2hhbmdlKSkge1xuICAgIHJldHVybi
10617B3aWxsQ2hhbmdlLmFkZChrZXkpO1xuICB9XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9vcHRpbWl6ZWQtYXBwZWFyL2dldC1hcHBlYXItaWQubWpzXG52YXIgaW1wb3J0X2Rpc3Q0MTggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDQxOSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDQyMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIGdldE9wdGltaXNlZEFwcGVhcklkKHZpc3VhbEVsZW1lbnQpIHtcbiAgcmV0dXJuIHZpc3VhbEVsZW1lbnQucHJvcHNbb3B0aW1pemVkQXBwZWFyRGF0YUF0dHJpYnV0ZV07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9pbnRlcmZhY2VzL21vdGlvbi12YWx1ZS5tanNcbnZhciBpbXBvcnRfZGlzdDYxNiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjE3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjE4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy91c2UtaW5zdGFudC10cmFuc2l0aW9uLXN0YXRlLm1qc1xudmFyIGltcG9ydF9kaXN0NDIxID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0MjIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0MjMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW5zdGFudEFuaW1hdGlvblN0YXRlID0ge1xuICBjdXJyZW50OiBmYWxzZVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL2FuaW1hdG9ycy9BY2NlbGVyYXRlZEFuaW1hdGlvbi5tanNcbnZhciBpbXBvcnRfZGlzdDYwNyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjA4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjA5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9lYXNpbmcvYW50aWNpcGF0ZS5tanNcbnZhciBpbXBvcnRfZGlzdDQzNiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDM3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDM4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9lYXNpbmcvYmFjay5tanNcbnZhciBpbXBvcnRfZGlzdDQzMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDM0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDM1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9lYXNpbmcvY3ViaWMtYmV6aWVyLm1qc1xudmFyIGltcG9ydF9kaXN0NDI0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0MjUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0MjYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgY2FsY0JlemllciA9ICh0LCBhMSwgYTIpID0+ICgoKDEgLSAzICogYTIgKyAzICogYTEpICogdCArICgzICogYTIgLSA2ICogYTEpKSAqIHQgKyAzICogYTEpICogdDtcbnZhciBzdWJkaXZpc2lvblByZWNpc2lvbiA9IDFlLTc7XG52YXIgc3ViZGl2aXNpb25NYXhJdGVyYXRpb25zID0gMTI7XG5mdW5jdGlvbiBiaW5hcnlTdWJkaXZpZGUoeCwgbG93ZXJCb3VuZCwgdXBwZXJCb3VuZCwgbVgxLCBtWDIpIHtcbiAgbGV0IGN1cnJlbnRYO1xuICBsZXQgY3VycmVudFQ7XG4gIGxldCBpID0gMDtcbiAgZG8ge1xuICAgIGN1cnJlbnRUID0gbG93ZXJCb3VuZCArICh1cHBlckJvdW5kIC0gbG93ZXJCb3VuZCkgLyAyO1xuICAgIGN1cnJlbnRYID0gY2FsY0JlemllcihjdXJyZW50VCwgbVgxLCBtWDIpIC0geDtcbiAgICBpZiAoY3VycmVudFggPiAwKSB7XG4gICAgICB1cHBlckJvdW5kID0gY3VycmVudFQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvd2VyQm91bmQgPSBjdXJyZW50VDtcbiAgICB9XG4gIH0gd2hpbGUgKE1hdGguYWJzKGN1cnJlbnRYKSA+IHN1YmRpdmlzaW9uUHJlY2lzaW9uICYmICsraSA8IHN1YmRpdmlzaW9uTWF4SXRlcmF0aW9ucyk7XG4gIHJldHVybiBjdXJyZW50VDtcbn1cbmZ1bmN0aW9uIGN1YmljQmV6aWVyKG1YMSwgbVkxLCBtWDIsIG1ZMikge1xuICBpZiAobVgxID09PSBtWTEgJiYgbVgyID09PSBtWTIpXG4gICAgcmV0dXJuIG5vb3A7XG4gIGNvbnN0IGdldFRGb3JYID0gKGFY
10617KSA9PiBiaW5hcnlTdWJkaXZpZGUoYVgsIDAsIDEsIG1YMSwgbVgyKTtcbiAgcmV0dXJuICh0KSA9PiB0ID09PSAwIHx8IHQgPT09IDEgPyB0IDogY2FsY0JlemllcihnZXRURm9yWCh0KSwgbVkxLCBtWTIpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9lYXNpbmcvbW9kaWZpZXJzL21pcnJvci5tanNcbnZhciBpbXBvcnRfZGlzdDQyNyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDI4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDI5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIG1pcnJvckVhc2luZyA9IChlYXNpbmcpID0+IChwKSA9PiBwIDw9IDAuNSA/IGVhc2luZygyICogcCkgLyAyIDogKDIgLSBlYXNpbmcoMiAqICgxIC0gcCkpKSAvIDI7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2Vhc2luZy9tb2RpZmllcnMvcmV2ZXJzZS5tanNcbnZhciBpbXBvcnRfZGlzdDQzMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDMxID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDMyID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIHJldmVyc2VFYXNpbmcgPSAoZWFzaW5nKSA9PiAocCkgPT4gMSAtIGVhc2luZygxIC0gcCk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2Vhc2luZy9iYWNrLm1qc1xudmFyIGJhY2tPdXQgPSBjdWJpY0JlemllcigwLjMzLCAxLjUzLCAwLjY5LCAwLjk5KTtcbnZhciBiYWNrSW4gPSByZXZlcnNlRWFzaW5nKGJhY2tPdXQpO1xudmFyIGJhY2tJbk91dCA9IG1pcnJvckVhc2luZyhiYWNrSW4pO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9lYXNpbmcvYW50aWNpcGF0ZS5tanNcbnZhciBhbnRpY2lwYXRlID0gKHApID0+IChwICo9IDIpIDwgMSA/IDAuNSAqIGJhY2tJbihwKSA6IDAuNSAqICgyIC0gTWF0aC5wb3coMiwgLTEwICogKHAgLSAxKSkpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9lYXNpbmcvY2lyYy5tanNcbnZhciBpbXBvcnRfZGlzdDQzOSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDQwID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDQxID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGNpcmNJbiA9IChwKSA9PiAxIC0gTWF0aC5zaW4oTWF0aC5hY29zKHApKTtcbnZhciBjaXJjT3V0ID0gcmV2ZXJzZUVhc2luZyhjaXJjSW4pO1xudmFyIGNpcmNJbk91dCA9IG1pcnJvckVhc2luZyhjaXJjSW4pO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL0RPTUtleWZyYW1lc1Jlc29sdmVyLm1qc1xudmFyIGltcG9ydF9kaXN0NTE0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1MTUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1MTYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi91dGlscy9pcy1ub25lLm1qc1xudmFyIGltcG9ydF9kaXN0NDQ1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0NDYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0NDcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3V0aWxzL2lzLXplcm8tdmFsdWUtc3RyaW5nLm1qc1xudmFyIGltcG9ydF9kaXN0NDQyID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0NDMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0NDQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaXNaZXJvVmFsdWVTdHJpbmcgPSAodikgPT4gL14wW14uXFxzXSskL3UudGVzdCh2KTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL3V0aWxzL2lzLW5vbmUubWpzXG5mdW5jdGlvbiBpc05vbmUodmFsdWUpIHtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiB2YWx1ZSA9PT0gMDtcbiAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gbnVsbCkge1xuICAgIHJldHVybi
10617B2YWx1ZSA9PT0gXCJub25lXCIgfHwgdmFsdWUgPT09IFwiMFwiIHx8IGlzWmVyb1ZhbHVlU3RyaW5nKHZhbHVlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvaHRtbC91dGlscy9tYWtlLW5vbmUtYW5pbWF0YWJsZS5tanNcbnZhciBpbXBvcnRfZGlzdDQ5MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDkxID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDkyID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS90eXBlcy9jb21wbGV4L2luZGV4Lm1qc1xudmFyIGltcG9ydF9kaXN0NDc4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0NzkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0ODAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3ZhbHVlL3R5cGVzL2NvbG9yL2luZGV4Lm1qc1xudmFyIGltcG9ydF9kaXN0NDcyID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0NzMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0NzQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3ZhbHVlL3R5cGVzL2NvbG9yL2hleC5tanNcbnZhciBpbXBvcnRfZGlzdDQ2NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDY3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDY4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS90eXBlcy9jb2xvci9yZ2JhLm1qc1xudmFyIGltcG9ydF9kaXN0NDYzID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0NjQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0NjUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3ZhbHVlL3R5cGVzL3V0aWxzL3Nhbml0aXplLm1qc1xudmFyIGltcG9ydF9kaXN0NDQ4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0NDkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0NTAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgc2FuaXRpemUgPSAodikgPT4gTWF0aC5yb3VuZCh2ICogMWU1KSAvIDFlNTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdHlwZXMvY29sb3IvdXRpbHMubWpzXG52YXIgaW1wb3J0X2Rpc3Q0NjAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDQ2MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDQ2MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdHlwZXMvdXRpbHMvZmxvYXQtcmVnZXgubWpzXG52YXIgaW1wb3J0X2Rpc3Q0NTEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDQ1MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDQ1MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBmbG9hdFJlZ2V4ID0gLy0/KD86XFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKS9ndTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdHlwZXMvdXRpbHMvaXMtbnVsbGlzaC5tanNcbnZhciBpbXBvcnRfZGlzdDQ1NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDU1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDU2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gaXNOdWxsaXNoKHYpIHtcbiAgcmV0dXJuIHYgPT0gbnVsbDtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdHlwZXMvdXRpbHMvc2luZ2xlLWNvbG9yLXJlZ2V4Lm1qc1xudmFyIGltcG9ydF9kaXN0NDU3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0NTggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0NTkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgc2luZ2xlQ29sb3JSZWdleCA9IC9eKD86I1tcXGRhLWZdezMsOH18KD86cmdifGhzbClhP1xcKCg/Oi0/W1xcZC5dKyU/Wy
10617xcXHNdKyl7Mn0tP1tcXGQuXSslP1xccyooPzpbLC9dXFxzKik/KD86XFxiXFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKT8lP1xcKSkkL2l1O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS90eXBlcy9jb2xvci91dGlscy5tanNcbnZhciBpc0NvbG9yU3RyaW5nID0gKHR5cGUsIHRlc3RQcm9wKSA9PiAodikgPT4ge1xuICByZXR1cm4gQm9vbGVhbih0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiAmJiBzaW5nbGVDb2xvclJlZ2V4LnRlc3QodikgJiYgdi5zdGFydHNXaXRoKHR5cGUpIHx8IHRlc3RQcm9wICYmICFpc051bGxpc2godikgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHYsIHRlc3RQcm9wKSk7XG59O1xudmFyIHNwbGl0Q29sb3IgPSAoYU5hbWUsIGJOYW1lLCBjTmFtZSkgPT4gKHYpID0+IHtcbiAgaWYgKHR5cGVvZiB2ICE9PSBcInN0cmluZ1wiKVxuICAgIHJldHVybiB2O1xuICBjb25zdCBbYSwgYiwgYywgYWxwaGEyXSA9IHYubWF0Y2goZmxvYXRSZWdleCk7XG4gIHJldHVybiB7XG4gICAgW2FOYW1lXTogcGFyc2VGbG9hdChhKSxcbiAgICBbYk5hbWVdOiBwYXJzZUZsb2F0KGIpLFxuICAgIFtjTmFtZV06IHBhcnNlRmxvYXQoYyksXG4gICAgYWxwaGE6IGFscGhhMiAhPT0gdm9pZCAwID8gcGFyc2VGbG9hdChhbHBoYTIpIDogMVxuICB9O1xufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdHlwZXMvY29sb3IvcmdiYS5tanNcbnZhciBjbGFtcFJnYlVuaXQgPSAodikgPT4gY2xhbXAoMCwgMjU1LCB2KTtcbnZhciByZ2JVbml0ID0ge1xuICAuLi5udW1iZXIsXG4gIHRyYW5zZm9ybTogKHYpID0+IE1hdGgucm91bmQoY2xhbXBSZ2JVbml0KHYpKVxufTtcbnZhciByZ2JhID0ge1xuICB0ZXN0OiBpc0NvbG9yU3RyaW5nKFwicmdiXCIsIFwicmVkXCIpLFxuICBwYXJzZTogc3BsaXRDb2xvcihcInJlZFwiLCBcImdyZWVuXCIsIFwiYmx1ZVwiKSxcbiAgdHJhbnNmb3JtOiAoeyByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTogYWxwaGEkMSA9IDEgfSkgPT4gXCJyZ2JhKFwiICsgcmdiVW5pdC50cmFuc2Zvcm0ocmVkKSArIFwiLCBcIiArIHJnYlVuaXQudHJhbnNmb3JtKGdyZWVuKSArIFwiLCBcIiArIHJnYlVuaXQudHJhbnNmb3JtKGJsdWUpICsgXCIsIFwiICsgc2FuaXRpemUoYWxwaGEudHJhbnNmb3JtKGFscGhhJDEpKSArIFwiKVwiXG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS90eXBlcy9jb2xvci9oZXgubWpzXG5mdW5jdGlvbiBwYXJzZUhleCh2KSB7XG4gIGxldCByID0gXCJcIjtcbiAgbGV0IGcgPSBcIlwiO1xuICBsZXQgYiA9IFwiXCI7XG4gIGxldCBhID0gXCJcIjtcbiAgaWYgKHYubGVuZ3RoID4gNSkge1xuICAgIHIgPSB2LnN1YnN0cmluZygxLCAzKTtcbiAgICBnID0gdi5zdWJzdHJpbmcoMywgNSk7XG4gICAgYiA9IHYuc3Vic3RyaW5nKDUsIDcpO1xuICAgIGEgPSB2LnN1YnN0cmluZyg3LCA5KTtcbiAgfSBlbHNlIHtcbiAgICByID0gdi5zdWJzdHJpbmcoMSwgMik7XG4gICAgZyA9IHYuc3Vic3RyaW5nKDIsIDMpO1xuICAgIGIgPSB2LnN1YnN0cmluZygzLCA0KTtcbiAgICBhID0gdi5zdWJzdHJpbmcoNCwgNSk7XG4gICAgciArPSByO1xuICAgIGcgKz0gZztcbiAgICBiICs9IGI7XG4gICAgYSArPSBhO1xuICB9XG4gIHJldHVybiB7XG4gICAgcmVkOiBwYXJzZUludChyLCAxNiksXG4gICAgZ3JlZW46IHBhcnNlSW50KGcsIDE2KSxcbiAgICBibHVlOiBwYXJzZUludChiLCAxNiksXG4gICAgYWxwaGE6IGEgPyBwYXJzZUludChhLCAxNikgLyAyNTUgOiAxXG4gIH07XG59XG52YXIgaGV4ID0ge1xuICB0ZXN0OiBpc0NvbG9yU3RyaW5nKFwiI1wiKSxcbiAgcGFyc2U6IHBhcnNlSGV4LFxuICB0cmFuc2Zvcm06IHJnYmEudHJhbnNmb3JtXG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS90eXBlcy9jb2xvci9oc2xhLm1qc1xudmFyIGltcG9ydF9kaXN0NDY5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0NzAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q0NzEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaHNsYSA9IHtcbiAgdGVzdDogaXNDb2xvclN0cmluZyhcImhzbFwiLCBcImh1ZVwiKSxcbiAgcGFyc2U6IHNwbGl0Q29sb3IoXCJodWVcIiwgXCJzYXR1cmF0aW9uXCIsIFwibGlnaHRuZXNzXCIpLFxuICB0cmFuc2Zvcm06ICh7IGh1ZSwgc2F0dXJhdGlvbiwgbGlnaHRuZXNzLCBhbHBoYTogYWxwaGEkMSA9IDEgfSkgPT4ge1xuICAgIHJldHVybiBcImhzbGEoXCIgKyBNYXRoLnJvdW5kKGh1ZSkgKyBcIiwgXCIgKyBwZXJjZW50LnRyYW5zZm9ybShzYW5pdGl6ZShzYXR1cmF0aW9uKSkgKyBcIiwgXCIgKyBwZXJjZW50LnRyYW5zZm9ybShzYW5pdGl6ZShsaWdodG5lc3MpKSArIFwiLCBcIiArIHNhbml0aXplKGFscGhhLnRyYW5zZm9ybShhbHBoYSQxKSkgKyBcIilcIjtcbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdHlwZXMvY29sb3IvaW5kZXgubWpzXG52YXIgY29sb3IgPSB7XG4gIHRlc3Q6ICh2KSA9PiByZ2JhLnRlc3QodikgfHwgaGV4LnRlc3QodikgfHwgaHNsYS50ZXN0KHYpLFxuICBwYXJzZTogKHYpID0+IHtcbiAgICBpZiAocmdiYS50ZXN0KHYpKSB7XG4gICAgICByZXR1cm4gcmdiYS5wYXJzZSh2KTtcbiAgICB9IGVsc2UgaWYgKGhzbGEudGVzdCh2KSkge1xuICAgICAgcmV0dXJuIGhzbGEucGFyc2Uodik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybi
10617BoZXgucGFyc2Uodik7XG4gICAgfVxuICB9LFxuICB0cmFuc2Zvcm06ICh2KSA9PiB7XG4gICAgcmV0dXJuIHR5cGVvZiB2ID09PSBcInN0cmluZ1wiID8gdiA6IHYuaGFzT3duUHJvcGVydHkoXCJyZWRcIikgPyByZ2JhLnRyYW5zZm9ybSh2KSA6IGhzbGEudHJhbnNmb3JtKHYpO1xuICB9XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS90eXBlcy91dGlscy9jb2xvci1yZWdleC5tanNcbnZhciBpbXBvcnRfZGlzdDQ3NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDc2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDc3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGNvbG9yUmVnZXggPSAvKD86I1tcXGRhLWZdezMsOH18KD86cmdifGhzbClhP1xcKCg/Oi0/W1xcZC5dKyU/WyxcXHNdKyl7Mn0tP1tcXGQuXSslP1xccyooPzpbLC9dXFxzKik/KD86XFxiXFxkKyg/OlxcLlxcZCspP3xcXC5cXGQrKT8lP1xcKSkvZ2l1O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS90eXBlcy9jb21wbGV4L2luZGV4Lm1qc1xuZnVuY3Rpb24gdGVzdCh2KSB7XG4gIHZhciBfYSwgX2I7XG4gIHJldHVybiBpc05hTih2KSAmJiB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIiAmJiAoKChfYSA9IHYubWF0Y2goZmxvYXRSZWdleCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5sZW5ndGgpIHx8IDApICsgKCgoX2IgPSB2Lm1hdGNoKGNvbG9yUmVnZXgpKSA9PT0gbnVsbCB8fCBfYiA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2IubGVuZ3RoKSB8fCAwKSA+IDA7XG59XG52YXIgTlVNQkVSX1RPS0VOID0gXCJudW1iZXJcIjtcbnZhciBDT0xPUl9UT0tFTiA9IFwiY29sb3JcIjtcbnZhciBWQVJfVE9LRU4gPSBcInZhclwiO1xudmFyIFZBUl9GVU5DVElPTl9UT0tFTiA9IFwidmFyKFwiO1xudmFyIFNQTElUX1RPS0VOID0gXCIke31cIjtcbnZhciBjb21wbGV4UmVnZXggPSAvdmFyXFxzKlxcKFxccyotLSg/OltcXHctXStcXHMqfFtcXHctXStcXHMqLCg/OlxccypbXikoXFxzXXxcXHMqXFwoKD86W14pKF18XFwoW14pKF0qXFwpKSpcXCkpK1xccyopXFwpfCNbXFxkYS1mXXszLDh9fCg/OnJnYnxoc2wpYT9cXCgoPzotP1tcXGQuXSslP1ssXFxzXSspezJ9LT9bXFxkLl0rJT9cXHMqKD86WywvXVxccyopPyg/OlxcYlxcZCsoPzpcXC5cXGQrKT98XFwuXFxkKyk/JT9cXCl8LT8oPzpcXGQrKD86XFwuXFxkKyk/fFxcLlxcZCspL2dpdTtcbmZ1bmN0aW9uIGFuYWx5c2VDb21wbGV4VmFsdWUodmFsdWUpIHtcbiAgY29uc3Qgb3JpZ2luYWxWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCk7XG4gIGNvbnN0IHZhbHVlcyA9IFtdO1xuICBjb25zdCBpbmRleGVzID0ge1xuICAgIGNvbG9yOiBbXSxcbiAgICBudW1iZXI6IFtdLFxuICAgIHZhcjogW11cbiAgfTtcbiAgY29uc3QgdHlwZXMgPSBbXTtcbiAgbGV0IGkgPSAwO1xuICBjb25zdCB0b2tlbmlzZWQgPSBvcmlnaW5hbFZhbHVlLnJlcGxhY2UoY29tcGxleFJlZ2V4LCAocGFyc2VkVmFsdWUpID0+IHtcbiAgICBpZiAoY29sb3IudGVzdChwYXJzZWRWYWx1ZSkpIHtcbiAgICAgIGluZGV4ZXMuY29sb3IucHVzaChpKTtcbiAgICAgIHR5cGVzLnB1c2goQ09MT1JfVE9LRU4pO1xuICAgICAgdmFsdWVzLnB1c2goY29sb3IucGFyc2UocGFyc2VkVmFsdWUpKTtcbiAgICB9IGVsc2UgaWYgKHBhcnNlZFZhbHVlLnN0YXJ0c1dpdGgoVkFSX0ZVTkNUSU9OX1RPS0VOKSkge1xuICAgICAgaW5kZXhlcy52YXIucHVzaChpKTtcbiAgICAgIHR5cGVzLnB1c2goVkFSX1RPS0VOKTtcbiAgICAgIHZhbHVlcy5wdXNoKHBhcnNlZFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5kZXhlcy5udW1iZXIucHVzaChpKTtcbiAgICAgIHR5cGVzLnB1c2goTlVNQkVSX1RPS0VOKTtcbiAgICAgIHZhbHVlcy5wdXNoKHBhcnNlRmxvYXQocGFyc2VkVmFsdWUpKTtcbiAgICB9XG4gICAgKytpO1xuICAgIHJldHVybiBTUExJVF9UT0tFTjtcbiAgfSk7XG4gIGNvbnN0IHNwbGl0ID0gdG9rZW5pc2VkLnNwbGl0KFNQTElUX1RPS0VOKTtcbiAgcmV0dXJuIHsgdmFsdWVzLCBzcGxpdCwgaW5kZXhlcywgdHlwZXMgfTtcbn1cbmZ1bmN0aW9uIHBhcnNlQ29tcGxleFZhbHVlKHYpIHtcbiAgcmV0dXJuIGFuYWx5c2VDb21wbGV4VmFsdWUodikudmFsdWVzO1xufVxuZnVuY3Rpb24gY3JlYXRlVHJhbnNmb3JtZXIoc291cmNlKSB7XG4gIGNvbnN0IHsgc3BsaXQsIHR5cGVzIH0gPSBhbmFseXNlQ29tcGxleFZhbHVlKHNvdXJjZSk7XG4gIGNvbnN0IG51bVNlY3Rpb25zID0gc3BsaXQubGVuZ3RoO1xuICByZXR1cm4gKHYpID0+IHtcbiAgICBsZXQgb3V0cHV0ID0gXCJcIjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVNlY3Rpb25zOyBpKyspIHtcbiAgICAgIG91dHB1dCArPSBzcGxpdFtpXTtcbiAgICAgIGlmICh2W2ldICE9PSB2b2lkIDApIHtcbiAgICAgICAgY29uc3QgdHlwZSA9IHR5cGVzW2ldO1xuICAgICAgICBpZiAodHlwZSA9PT0gTlVNQkVSX1RPS0VOKSB7XG4gICAgICAgICAgb3V0cHV0ICs9IHNhbml0aXplKHZbaV0pO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IENPTE9SX1RPS0VOKSB7XG4gICAgICAgICAgb3V0cHV0ICs9IGNvbG9yLnRyYW5zZm9ybSh2W2ldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXRwdXQgKz0gdltpXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9O1xufVxudmFyIGNvbnZlcnROdW1iZXJzVG9aZXJvID0gKHYpID0+IHR5cGVvZiB2ID09PSBcIm51bWJlclwiID8gMCA6IHY7XG5mdW5jdGlvbiBnZXRBbmltYXRhYmxlTm9uZSh2KSB7XG4gIGNvbnN0IHBhcnNlZCA9IHBhcnNlQ29tcGxleFZhbHVlKHYpO1xuICBjb25zdCB0cmFuc2Zvcm1lciA9IGNyZWF0ZVRyYW5zZm9ybWVyKHYpO1xuICByZXR1cm4gdHJhbnNmb3JtZXIocGFyc2VkLm1hcChjb252ZXJ0TnVtYmVyc1RvWmVybykpO1xufVxudmFyIGNvbXBsZXggPSB7XG4gIHRlc3QsXG4gIHBhcnNlOiBwYXJzZUNvbXBsZXhWYWx1ZSxcbiAgY3JlYXRlVHJhbnNmb3JtZXIsXG4gIGdldEFuaW1hdGFibGVOb25lXG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3ZhbHVlLXR5cGVzL2FuaW1hdGFibGUtbm9uZS5tanNcbnZhciBpbXBvcnRfZGlzdDQ4NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDg4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0NDg5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS90eXBlcy9jb21wbGV4L2ZpbHRlci5tanNcbnZhciBpbXBvcnRfZGlzdDQ4MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDgyID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDgzID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIG1heERlZmF1bHRzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1wiYnJpZ2h0bmVzc1wiLCBcImNvbnRyYXN0XCIsIFwic2F0dXJhdGVcIiwgXCJvcGFjaXR5XCJdKTtcbmZ1bmN0aW9uIGFwcGx5RGVmYXVsdEZpbHRlcih2KSB7XG4gIGNvbnN0IFtuYW1lLCB2YWx1ZV0gPSB2LnNsaWNlKDAsIC0xKS5zcGxpdChcIihcIik7XG4gIGlmIChuYW1lID09PSBcImRyb3Atc2hhZG93XCIpXG4gICAgcmV0dXJuIHY7XG4gIGNvbnN0IFtudW1iZXIyXSA9IHZhbHVlLm1hdGNoKGZsb2F0UmVnZXgpIHx8IFtdO1xuICBpZiAoIW51bWJlcjIpXG4gICAgcmV0dXJuIHY7XG4gIGNvbnN0IHVuaXQgPSB2YWx1ZS5yZXBsYWNlKG51bWJlcjIsIFwiXCIpO1xuICBsZXQgZGVmYXVsdFZhbHVlID0gbWF4RGVmYXVsdHMuaGFzKG5hbWUpID8gMSA6IDA7XG4gIGlmIChudW1iZXIyICE9PSB2YWx1ZSlcbiAgICBkZWZhdWx0VmFsdWUgKj0gMTAwO1xuICByZXR1cm4gbmFtZSArIFwiKFwiICsgZGVmYXVsdFZhbHVlICsgdW5pdCArIFwiKVwiO1xufVxudmFyIGZ1bmN0aW9uUmVnZXggPSAvXFxiKFthLXotXSopXFwoLio/XFwpL2d1O1xudmFyIGZpbHRlciA9IHtcbiAgLi4uY29tcGxleCxcbiAgZ2V0QW5pbWF0YWJsZU5vbmU6ICh2KSA9PiB7XG4gICAgY29uc3QgZnVuY3Rpb25zID0gdi5tYXRjaChmdW5jdGlvblJlZ2V4KTtcbiAgICByZXR1cm4gZnVuY3Rpb25zID8gZnVuY3Rpb25zLm1hcChhcHBseURlZmF1bHRGaWx0ZXIpLmpvaW4oXCIgXCIpIDogdjtcbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2RvbS92YWx1ZS10eXBlcy9kZWZhdWx0cy5tanNcbnZhciBpbXBvcnRfZGlzdDQ4NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDg1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NDg2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGRlZmF1bHRWYWx1ZVR5cGVzID0ge1xuICAuLi5udW1iZXJWYWx1ZVR5cGVzLFxuICAvLyBDb2xvciBwcm9wc1xuICBjb2xvcixcbiAgYmFja2dyb3VuZENvbG9yOiBjb2xvcixcbiAgb3V0bGluZUNvbG9yOiBjb2xvcixcbiAgZmlsbDogY29sb3IsXG4gIHN0cm9rZTogY29sb3IsXG4gIC8vIEJvcmRlciBwcm9wc1xuICBib3JkZXJDb2xvcjogY29sb3IsXG4gIGJvcmRlclRvcENvbG9yOiBjb2xvcixcbiAgYm9yZGVyUmlnaHRDb2xvcjogY29sb3IsXG4gIGJvcmRlckJvdHRvbUNvbG9yOiBjb2xvcixcbiAgYm9yZGVyTGVmdENvbG9yOiBjb2xvcixcbiAgZmlsdGVyLFxuICBXZWJraXRGaWx0ZXI6IGZpbHRlclxufTtcbnZhciBnZXREZWZhdWx0VmFsdWVUeXBlID0gKGtleSkgPT4gZGVmYXVsdFZhbHVlVHlwZXNba2V5XTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2RvbS92YWx1ZS10eXBlcy9hbmltYXRhYmxlLW5vbmUubWpzXG5mdW5jdGlvbiBnZXRBbmltYXRhYmxlTm9uZTIoa2V5LCB2YWx1ZSkge1xuICBsZXQgZGVmYXVsdFZhbHVlVHlwZSA9IGdldERlZmF1bHRWYWx1ZVR5cGUoa2V5KTtcbiAgaWYgKGRlZmF1bHRWYWx1ZVR5cGUgIT09IGZpbHRlcilcbiAgICBkZWZhdWx0VmFsdWVUeXBlID0gY29tcGxleDtcbiAgcmV0dXJuIGRlZmF1bHRWYWx1ZVR5cGUuZ2V0QW5pbWF0YWJsZU5vbmUgPyBkZWZhdWx0VmFsdWVUeXBlLmdldEFuaW1hdGFibGVOb25lKHZhbHVlKSA6IHZvaWQgMDtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2h0bWwvdXRpbHMvbWFrZS1ub25lLWFuaW1hdGFibGUubWpzXG52YXIgaW52YWxpZFRlbXBsYXRlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtcImF1dG9cIiwgXCJub25lXCIsIFwiMFwiXSk7XG5mdW5jdGlvbiBtYWtlTm9uZUtleWZyYW1lc0FuaW1hdGFibGUodW5yZXNvbHZlZEtleWZyYW1lcywgbm9uZUtleWZyYW1lSW5kZXhlcywgbmFtZSkge1xuICBsZXQgaSA9IDA7XG4gIGxldCBhbmltYXRhYmxlVGVtcGxhdGUgPSB2b2lkIDA7XG4gIHdoaWxlIChpIDwgdW5yZXNvbHZlZEtleWZyYW1lcy5sZW5ndGggJiYgIWFuaW1hdGFibGVUZW1wbGF0ZSkge1xuICAgIGNvbnN0IGtleWZyYW1lID0gdW5yZXNvbHZlZEtleWZyYW1lc1tpXTtcbiAgICBpZiAodHlwZW9mIGtleWZyYW1lID09PSBcInN0cmluZ1wiICYmICFpbnZhbGlkVGVtcGxhdGVzLmhhcyhrZXlmcmFtZSkgJiYgYW5hbHlzZUNvbXBsZXhWYWx1ZShrZXlmcmFtZSkudmFsdWVzLmxlbmd0aCkge1xuICAgICAgYW5pbWF0YWJsZVRlbXBsYXRlID0gdW5yZXNvbHZlZEtleWZyYW1lc1tpXTtcbiAgICB9XG4gICAgaSsrO1xuICB9XG4gIGlmIChhbmltYXRhYmxlVGVtcGxhdGUgJiYgbmFtZSkge1xuICAgIGZvciAoY29uc3Qgbm9uZUluZGV4IG9mIG5vbmVLZXlmcmFtZUluZGV4ZXMpIHtcbiAgICAgIHVucmVzb2x2ZWRLZXlmcmFtZXNbbm9uZUluZGV4XSA9IGdldEFuaW1hdGFibGVOb25lMihuYW1lLCBhbmltYXRhYmxlVGVtcGxhdGUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvdXRpbHMvS2V5ZnJhbWVzUmVzb2x2ZXIubWpzXG52YXIgaW1wb3J0X2Rpc3Q0OTYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDQ5NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDQ5OCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2RvbS91dGlscy91bml0LWNvbnZlcnNpb24ubWpzXG52YXIgaW1wb3J0X2Rpc3Q0OTMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDQ5NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDQ5NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpc051bU9yUHhUeXBlID0gKHYpID0+IHYgPT09IG51bWJlciB8fCB2ID09PSBweDtcbnZhciBnZXRQb3NGcm9tTWF0cml4ID0gKG1hdHJpeCwgcG9zKSA9PiBwYXJzZU
10617Zsb2F0KG1hdHJpeC5zcGxpdChcIiwgXCIpW3Bvc10pO1xudmFyIGdldFRyYW5zbGF0ZUZyb21NYXRyaXggPSAocG9zMiwgcG9zMykgPT4gKF9iYm94LCB7IHRyYW5zZm9ybTogdHJhbnNmb3JtMiB9KSA9PiB7XG4gIGlmICh0cmFuc2Zvcm0yID09PSBcIm5vbmVcIiB8fCAhdHJhbnNmb3JtMilcbiAgICByZXR1cm4gMDtcbiAgY29uc3QgbWF0cml4M2QgPSB0cmFuc2Zvcm0yLm1hdGNoKC9ebWF0cml4M2RcXCgoLispXFwpJC91KTtcbiAgaWYgKG1hdHJpeDNkKSB7XG4gICAgcmV0dXJuIGdldFBvc0Zyb21NYXRyaXgobWF0cml4M2RbMV0sIHBvczMpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG1hdHJpeCA9IHRyYW5zZm9ybTIubWF0Y2goL15tYXRyaXhcXCgoLispXFwpJC91KTtcbiAgICBpZiAobWF0cml4KSB7XG4gICAgICByZXR1cm4gZ2V0UG9zRnJvbU1hdHJpeChtYXRyaXhbMV0sIHBvczIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cbn07XG52YXIgdHJhbnNmb3JtS2V5cyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtcInhcIiwgXCJ5XCIsIFwielwiXSk7XG52YXIgbm9uVHJhbnNsYXRpb25hbFRyYW5zZm9ybUtleXMgPSB0cmFuc2Zvcm1Qcm9wT3JkZXIuZmlsdGVyKChrZXkpID0+ICF0cmFuc2Zvcm1LZXlzLmhhcyhrZXkpKTtcbmZ1bmN0aW9uIHJlbW92ZU5vblRyYW5zbGF0aW9uYWxUcmFuc2Zvcm0odmlzdWFsRWxlbWVudCkge1xuICBjb25zdCByZW1vdmVkVHJhbnNmb3JtcyA9IFtdO1xuICBub25UcmFuc2xhdGlvbmFsVHJhbnNmb3JtS2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IHZpc3VhbEVsZW1lbnQuZ2V0VmFsdWUoa2V5KTtcbiAgICBpZiAodmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgcmVtb3ZlZFRyYW5zZm9ybXMucHVzaChba2V5LCB2YWx1ZS5nZXQoKV0pO1xuICAgICAgdmFsdWUuc2V0KGtleS5zdGFydHNXaXRoKFwic2NhbGVcIikgPyAxIDogMCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlbW92ZWRUcmFuc2Zvcm1zO1xufVxudmFyIHBvc2l0aW9uYWxWYWx1ZXMgPSB7XG4gIC8vIERpbWVuc2lvbnNcbiAgd2lkdGg6ICh7IHggfSwgeyBwYWRkaW5nTGVmdCA9IFwiMFwiLCBwYWRkaW5nUmlnaHQgPSBcIjBcIiB9KSA9PiB4Lm1heCAtIHgubWluIC0gcGFyc2VGbG9hdChwYWRkaW5nTGVmdCkgLSBwYXJzZUZsb2F0KHBhZGRpbmdSaWdodCksXG4gIGhlaWdodDogKHsgeSB9LCB7IHBhZGRpbmdUb3AgPSBcIjBcIiwgcGFkZGluZ0JvdHRvbSA9IFwiMFwiIH0pID0+IHkubWF4IC0geS5taW4gLSBwYXJzZUZsb2F0KHBhZGRpbmdUb3ApIC0gcGFyc2VGbG9hdChwYWRkaW5nQm90dG9tKSxcbiAgdG9wOiAoX2Jib3gsIHsgdG9wIH0pID0+IHBhcnNlRmxvYXQodG9wKSxcbiAgbGVmdDogKF9iYm94LCB7IGxlZnQgfSkgPT4gcGFyc2VGbG9hdChsZWZ0KSxcbiAgYm90dG9tOiAoeyB5IH0sIHsgdG9wIH0pID0+IHBhcnNlRmxvYXQodG9wKSArICh5Lm1heCAtIHkubWluKSxcbiAgcmlnaHQ6ICh7IHggfSwgeyBsZWZ0IH0pID0+IHBhcnNlRmxvYXQobGVmdCkgKyAoeC5tYXggLSB4Lm1pbiksXG4gIC8vIFRyYW5zZm9ybVxuICB4OiBnZXRUcmFuc2xhdGVGcm9tTWF0cml4KDQsIDEzKSxcbiAgeTogZ2V0VHJhbnNsYXRlRnJvbU1hdHJpeCg1LCAxNClcbn07XG5wb3NpdGlvbmFsVmFsdWVzLnRyYW5zbGF0ZVggPSBwb3NpdGlvbmFsVmFsdWVzLng7XG5wb3NpdGlvbmFsVmFsdWVzLnRyYW5zbGF0ZVkgPSBwb3NpdGlvbmFsVmFsdWVzLnk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci91dGlscy9LZXlmcmFtZXNSZXNvbHZlci5tanNcbnZhciB0b1Jlc29sdmUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xudmFyIGlzU2NoZWR1bGVkID0gZmFsc2U7XG52YXIgYW55TmVlZHNNZWFzdXJlbWVudCA9IGZhbHNlO1xuZnVuY3Rpb24gbWVhc3VyZUFsbEtleWZyYW1lcygpIHtcbiAgaWYgKGFueU5lZWRzTWVhc3VyZW1lbnQpIHtcbiAgICBjb25zdCByZXNvbHZlcnNUb01lYXN1cmUgPSBBcnJheS5mcm9tKHRvUmVzb2x2ZSkuZmlsdGVyKChyZXNvbHZlcikgPT4gcmVzb2x2ZXIubmVlZHNNZWFzdXJlbWVudCk7XG4gICAgY29uc3QgZWxlbWVudHNUb01lYXN1cmUgPSBuZXcgU2V0KHJlc29sdmVyc1RvTWVhc3VyZS5tYXAoKHJlc29sdmVyKSA9PiByZXNvbHZlci5lbGVtZW50KSk7XG4gICAgY29uc3QgdHJhbnNmb3Jtc1RvUmVzdG9yZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgZWxlbWVudHNUb01lYXN1cmUuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgcmVtb3ZlZFRyYW5zZm9ybXMgPSByZW1vdmVOb25UcmFuc2xhdGlvbmFsVHJhbnNmb3JtKGVsZW1lbnQpO1xuICAgICAgaWYgKCFyZW1vdmVkVHJhbnNmb3Jtcy5sZW5ndGgpXG4gICAgICAgIHJldHVybjtcbiAgICAgIHRyYW5zZm9ybXNUb1Jlc3RvcmUuc2V0KGVsZW1lbnQsIHJlbW92ZWRUcmFuc2Zvcm1zKTtcbiAgICAgIGVsZW1lbnQucmVuZGVyKCk7XG4gICAgfSk7XG4gICAgcmVzb2x2ZXJzVG9NZWFzdXJlLmZvckVhY2goKHJlc29sdmVyKSA9PiByZXNvbHZlci5tZWFzdXJlSW5pdGlhbFN0YXRlKCkpO1xuICAgIGVsZW1lbnRzVG9NZWFzdXJlLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgIGVsZW1lbnQucmVuZGVyKCk7XG4gICAgICBjb25zdCByZXN0b3JlID0gdHJhbnNmb3Jtc1RvUmVzdG9yZS5nZXQoZWxlbWVudCk7XG4gICAgICBpZiAocmVzdG9yZSkge1xuICAgICAgICByZXN0b3JlLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgIHZhciBfYTtcbiAgICAgICAgICAoX2EgPSBlbGVtZW50LmdldFZhbHVlKGtleSkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zZXQodmFsdWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXNvbHZlcnNUb01lYXN1cmUuZm9yRWFjaCgocmVzb2x2ZXIpID0+IHJlc29sdmVyLm1lYXN1cmVFbmRTdGF0ZSgpKTtcbiAgICByZXNvbHZlcnNUb01lYXN1cmUuZm9yRWFjaCgocmVzb2x2ZXIpID0+IHtcbiAgICAgIGlmIChyZXNvbHZlci5zdXNwZW5kZWRTY3JvbGxZICE9PSB2b2lkIDApIHtcbiAgICAgICAgd2luZG93LnNjcm9sbFRvKDAsIHJlc29sdmVyLnN1c3BlbmRlZFNjcm9sbFkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGFueU5lZWRzTWVhc3VyZW1lbnQgPSBmYWxzZTtcbiAgaXNTY2hlZHVsZWQgPSBmYWxzZTtcbiAgdG9SZXNvbHZlLmZvckVhY2goKHJlc29sdmVyKSA9PiByZXNvbHZlci5jb21wbGV0ZSgpKTtcbiAgdG9SZXNvbHZlLmNsZWFyKCk7XG59XG5mdW5jdGlvbiByZWFkQWxsS2V5ZnJhbWVzKCkge1xuICB0b1Jlc29sdmUuZm9yRWFjaCgocmVzb2x2ZXIpID0+IHtcbiAgICByZXNvbHZlci5yZWFkS2V5ZnJhbWVzKCk7XG4gICAgaWYgKHJlc29sdmVyLm5lZWRzTWVhc3VyZW1lbnQpIHtcbiAgICAgIGFueU5lZWRzTWVhc3VyZW1lbnQgPSB0cnVlO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBmbHVzaEtleWZyYW1lUmVzb2x2ZXJzKCkge1xuICByZWFkQWxsS2V5ZnJhbWVzKCk7XG4gIG1lYXN1cmVBbGxLZXlmcmFtZXMoKTtcbn1cbnZhciBLZXlmcmFtZVJlc29sdmVyID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcih1bnJlc29sdmVkS2V5ZnJhbWVzLCBvbkNvbXBsZXRlLCBuYW1lLCBtb3Rpb25WYWx1ZTIsIGVsZW1lbnQsIGlzQXN5bmMgPSBmYWxzZSkge1xuICAgIHRoaXMuaXNDb21wbGV0ZSA9IGZhbHNlO1xuICAgIHRoaXMuaXNBc3luYyA9IGZhbHNlO1xuICAgIHRoaXMubmVlZHNNZWFzdXJlbWVudCA9IGZhbHNlO1xuICAgIHRoaXMuaXNTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICB0aGlzLnVucmVzb2x2ZWRLZXlmcmFtZXMgPSBbLi4udW5yZXNvbHZlZEtleWZyYW1lc107XG4gICAgdGhpcy5vbkNvbXBsZXRlID0gb25Db21wbGV0ZTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICAgIHRoaXMubW90aW9uVmFsdWUgPSBtb3Rpb25WYWx1ZTI7XG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICB0aGlzLmlzQXN5bmMgPSBpc0FzeW5jO1xuICB9XG4gI
10617HNjaGVkdWxlUmVzb2x2ZSgpIHtcbiAgICB0aGlzLmlzU2NoZWR1bGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5pc0FzeW5jKSB7XG4gICAgICB0b1Jlc29sdmUuYWRkKHRoaXMpO1xuICAgICAgaWYgKCFpc1NjaGVkdWxlZCkge1xuICAgICAgICBpc1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICAgIGZyYW1lLnJlYWQocmVhZEFsbEtleWZyYW1lcyk7XG4gICAgICAgIGZyYW1lLnJlc29sdmVLZXlmcmFtZXMobWVhc3VyZUFsbEtleWZyYW1lcyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVhZEtleWZyYW1lcygpO1xuICAgICAgdGhpcy5jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuICByZWFkS2V5ZnJhbWVzKCkge1xuICAgIGNvbnN0IHsgdW5yZXNvbHZlZEtleWZyYW1lcywgbmFtZSwgZWxlbWVudCwgbW90aW9uVmFsdWU6IG1vdGlvblZhbHVlMiB9ID0gdGhpcztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVucmVzb2x2ZWRLZXlmcmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmICh1bnJlc29sdmVkS2V5ZnJhbWVzW2ldID09PSBudWxsKSB7XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gbW90aW9uVmFsdWUyID09PSBudWxsIHx8IG1vdGlvblZhbHVlMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogbW90aW9uVmFsdWUyLmdldCgpO1xuICAgICAgICAgIGNvbnN0IGZpbmFsS2V5ZnJhbWUgPSB1bnJlc29sdmVkS2V5ZnJhbWVzW3VucmVzb2x2ZWRLZXlmcmFtZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgICB1bnJlc29sdmVkS2V5ZnJhbWVzWzBdID0gY3VycmVudFZhbHVlO1xuICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCAmJiBuYW1lKSB7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZUFzUmVhZCA9IGVsZW1lbnQucmVhZFZhbHVlKG5hbWUsIGZpbmFsS2V5ZnJhbWUpO1xuICAgICAgICAgICAgaWYgKHZhbHVlQXNSZWFkICE9PSB2b2lkIDAgJiYgdmFsdWVBc1JlYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdW5yZXNvbHZlZEtleWZyYW1lc1swXSA9IHZhbHVlQXNSZWFkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodW5yZXNvbHZlZEtleWZyYW1lc1swXSA9PT0gdm9pZCAwKSB7XG4gICAgICAgICAgICB1bnJlc29sdmVkS2V5ZnJhbWVzWzBdID0gZmluYWxLZXlmcmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG1vdGlvblZhbHVlMiAmJi
10617BjdXJyZW50VmFsdWUgPT09IHZvaWQgMCkge1xuICAgICAgICAgICAgbW90aW9uVmFsdWUyLnNldCh1bnJlc29sdmVkS2V5ZnJhbWVzWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdW5yZXNvbHZlZEtleWZyYW1lc1tpXSA9IHVucmVzb2x2ZWRLZXlmcmFtZXNbaSAtIDFdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHNldEZpbmFsS2V5ZnJhbWUoKSB7XG4gIH1cbiAgbWVhc3VyZUluaXRpYWxTdGF0ZSgpIHtcbiAgfVxuICByZW5kZXJFbmRTdHlsZXMoKSB7XG4gIH1cbiAgbWVhc3VyZUVuZFN0YXRlKCkge1xuICB9XG4gIGNvbXBsZXRlKCkge1xuICAgIHRoaXMuaXNDb21wbGV0ZSA9IHRydWU7XG4gICAgdGhpcy5vbkNvbXBsZXRlKHRoaXMudW5yZXNvbHZlZEtleWZyYW1lcywgdGhpcy5maW5hbEtleWZyYW1lKTtcbiAgICB0b1Jlc29sdmUuZGVsZXRlKHRoaXMpO1xuICB9XG4gIGNhbmNlbCgpIHtcbiAgICBpZiAoIXRoaXMuaXNDb21wbGV0ZSkge1xuICAgICAgdGhpcy5pc1NjaGVkdWxlZCA9IGZhbHNlO1xuICAgICAgdG9SZXNvbHZlLmRlbGV0ZSh0aGlzKTtcbiAgICB9XG4gIH1cbiAgcmVzdW1lKCkge1xuICAgIGlmICghdGhpcy5pc0NvbXBsZXRlKVxuICAgICAgdGhpcy5zY2hlZHVsZVJlc29sdmUoKTtcbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2RvbS91dGlscy9jc3MtdmFyaWFibGVzLWNvbnZlcnNpb24ubWpzXG52YXIgaW1wb3J0X2Rpc3Q1MDIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDUwMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDUwNCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvaXMtbnVtZXJpY2FsLXN0cmluZy5tanNcbnZhciBpbXBvcnRfZGlzdDQ5OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTAwID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTAxID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGlzTnVtZXJpY2FsU3RyaW5nID0gKHYpID0+IC9eLT8oPzpcXGQrKD86XFwuXFxkKyk/fFxcLlxcZCspJC91LnRlc3Qodik7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9kb20vdXRpbHMvY3NzLXZhcmlhYmxlcy1jb252ZXJzaW9uLm1qc1xudmFyIHNwbGl0Q1NTVmFyaWFibGVSZWdleCA9IChcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZG9zLWRldGVjdG9yL25vLXVuc2FmZS1yZWdleCAtLSBmYWxzZSBwb3NpdGl2ZSwgYXMgaXQgY2FuIG1hdGNoIGEgbG90IG9mIHdvcmRzXG4gIC9edmFyXFwoLS0oPzooW1xcdy1dKyl8KFtcXHctXSspLCA/KFthLXpBLVpcXGQgKCklIy4sLV0rKSlcXCkvdVxuKTtcbmZ1bmN0aW9uIHBhcnNlQ1NTVmFyaWFibGUoY3VycmVudCkge1xuICBjb25zdCBtYXRjaCA9IHNwbGl0Q1NTVmFyaWFibGVSZWdleC5leGVjKGN1cnJlbnQpO1xuICBpZiAoIW1hdGNoKVxuICAgIHJldHVybiBbLF07XG4gIGNvbnN0IFssIHRva2VuMSwgdG9rZW4yLCBmYWxsYmFja10gPSBtYXRjaDtcbiAgcmV0dXJuIFtgLS0ke3Rva2VuMSAhPT0gbnVsbCAmJiB0b2tlbjEgIT09IHZvaWQgMCA/IHRva2VuMSA6IHRva2VuMn1gLCBmYWxsYmFja107XG59XG52YXIgbWF4RGVwdGggPSA0O1xuZnVuY3Rpb24gZ2V0VmFyaWFibGVWYWx1ZShjdXJyZW50LCBlbGVtZW50LCBkZXB0aCA9IDEpIHtcbiAgaW52YXJpYW50KGRlcHRoIDw9IG1heERlcHRoLCBgTWF4IENTUyB2YXJpYWJsZSBmYWxsYmFjayBkZXB0aCBkZXRlY3RlZCBpbiBwcm9wZXJ0eSBcIiR7Y3VycmVudH1cIi4gVGhpcyBtYXkgaW5kaWNhdGUgYSBjaXJjdWxhciBmYWxsYmFjayBkZXBlbmRlbmN5LmApO1xuICBjb25zdCBbdG9rZW4sIGZhbGxiYWNrXSA9IHBhcnNlQ1NTVmFyaWFibGUoY3VycmVudCk7XG4gIGlmICghdG9rZW4pXG4gICAgcmV0dXJuO1xuICBjb25zdCByZXNvbHZlZCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUodG9rZW4pO1xuICBpZiAocmVzb2x2ZWQpIHtcbiAgICBjb25zdCB0cmltbWVkID0gcmVzb2x2ZWQudHJpbSgpO1xuICAgIHJldHVybiBpc051bWVyaWNhbFN0cmluZyh0cmltbWVkKSA/IHBhcnNlRmxvYXQodHJpbW1lZCkgOiB0cmltbWVkO1xuICB9XG4gIHJldHVybiBpc0NTU1ZhcmlhYmxlVG9rZW4oZmFsbGJhY2spID8gZ2V0VmFyaWFibGVWYWx1ZShmYWxsYmFjaywgZWxlbWVudCwgZGVwdGggKyAxKSA6IGZhbGxiYWNrO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3ZhbHVlLXR5cGVzL2RpbWVuc2lvbnMubWpzXG52YXIgaW1wb3J0X2Rpc3Q1MTEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDUxMiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDUxMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2RvbS92YWx1ZS10eXBlcy90ZXN0Lm1qc1xudmFyIGltcG9ydF9kaXN0NTA1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1MDYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1MDcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgdGVzdFZhbHVlVHlwZSA9ICh2KSA9PiAodHlwZSkgPT4gdHlwZS50ZXN0KHYpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3ZhbHVlLXR5cGVzL3R5cGUtYXV0by5tanNcbnZhciBpbXBvcnRfZGlzdDUwOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTA5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0NTEwID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGF1dG8gPSB7XG4gIHRlc3Q6ICh2KSA9PiB2ID09PSBcImF1dG9cIixcbiAgcGFyc2U6ICh2KSA9PiB2XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3ZhbHVlLXR5cGVzL2RpbWVuc2lvbnMubWpzXG52YXIgZGltZW5zaW9uVmFsdWVUeXBlcyA9IFtudW1iZXIsIHB4LCBwZXJjZW50LCBkZWdyZWVzLCB2dywgdmgsIGF1dG9dO1xudmFyIGZpbmREaW1lbnNpb25WYWx1ZVR5cGUgPSAodikgPT4gZGltZW5zaW9uVmFsdWVUeXBlcy5maW5kKHRlc3RWYWx1ZVR5cGUodikpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL0RPTUtleWZyYW1lc1Jlc29sdmVyLm1qc1xudmFyIERPTUtleWZyYW1lc1Jlc29sdmVyID0gY2xhc3MgZXh0ZW5kcyBLZXlmcmFtZVJlc29sdmVyIHtcbiAgY29uc3RydWN0b3IodW5yZXNvbHZlZEtleWZyYW1lcywgb25Db21wbGV0ZSwgbmFtZSwgbW90aW9uVmFsdWUyLCBlbGVtZW50KSB7XG4gICAgc3VwZXIodW5yZXNvbHZlZEtleWZyYW1lcywgb25Db21wbGV0ZSwgbmFtZSwgbW90aW9uVmFsdWUyLCBlbGVtZW50LCB0cnVlKTtcbiAgfVxuICByZWFkS2V5ZnJhbWVzKCkge1xuICAgIGNvbnN0IHsgdW5yZXNvbHZlZEtleWZyYW1lcywgZWxlbWVudCwgbmFtZSB9ID0gdGhpcztcbiAgICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQuY3VycmVudClcbiAgICAgIHJldHVybjtcbiAgICBzdXBlci5yZWFkS2V5ZnJhbWVzKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bnJlc29sdmVkS2V5ZnJhbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQga2V5ZnJhbWUgPSB1bnJlc29sdmVkS2V5ZnJhbWVzW2ldO1xuICAgICAgaWYgKHR5cGVvZiBrZXlmcmFtZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBrZXlmcmFtZSA9IGtleWZyYW1lLnRyaW0oKTtcbiAgICAgICAgaWYgKGlzQ1NTVmFyaWFibGVUb2tlbihrZXlmcmFtZSkpIHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IGdldFZhcmlhYmxlVmFsdWUoa2V5ZnJhbWUsIGVsZW1lbnQuY3VycmVudCk7XG4gICAgICAgICAgaWYgKHJlc29sdmVkICE9PSB2b2lkIDApIHtcbiAgICAgICAgICAgIHVucmVzb2x2ZWRLZXlmcmFtZXNbaV0gPSByZXNvbHZlZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPT09IHVucmVzb2x2ZWRLZXlmcmFtZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgdGhpcy5maW5hbEtleWZyYW1lID0ga2V5ZnJhbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucmVzb2x2ZU5vbmVLZXlmcmFtZXMoKTtcbiAgICBpZiAoIXBvc2l0aW9uYWxLZXlzLmhhcyhuYW1lKSB8fCB1bnJlc29sdmVkS2V5ZnJhbWVzLmxlbmd0aCAhPT0gMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBbb3JpZ2luLCB0YXJnZXRdID0gdW5yZXNvbHZlZEtleWZyYW1lcztcbiAgICBjb25zdCBvcmlnaW5UeXBlID0gZmluZERpbWVuc2lvblZhbHVlVHlwZShvcmlnaW4pO1xuICAgIGNvbnN0IHRhcmdldFR5cGUgPSBmaW5kRGltZW5zaW9uVmFsdWVUeXBlKHRhcmdldCk7XG4gICAgaWYgKG9yaWdpblR5cGUgPT09IHRhcmdldFR5cGUpXG4gICAgICByZXR1cm47XG4gICAgaWYgKGlzTnVtT3JQeFR5cGUob3JpZ2luVHlwZSkgJiYgaXNOdW1PclB4VHlwZSh0YXJnZXRUeXBlKSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1bnJlc29sdmVkS2V5ZnJhbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gdW5yZXNvbHZlZEtleWZyYW1lc1tpXTtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIHVucmVzb2x2ZWRLZXlmcmFtZXNbaV0gPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5lZWRzTWVhc3VyZW1lbnQgPSB0cnVlO1xuICAgIH1cbiAgfVxuICByZXNvbHZlTm9uZUtleWZyYW1lcygpIHtcbiAgICBjb25zdCB7IHVucmVzb2x2ZWRLZXlmcmFtZXMsIG5hbWUgfSA9IHRoaXM7XG4gICAgY29uc3Qgbm9uZUtleWZyYW1lSW5kZXhlcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdW5yZXNvbHZlZEtleWZyYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKGlzTm9uZSh1bnJlc29sdmVkS2V5ZnJhbWVzW2ldKSkge1xuICAgICAgICBub25lS2V5ZnJhbWVJbmRleGVzLnB1c2goaSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChub25lS2V5ZnJhbWVJbmRleGVzLmxlbmd0aCkge1xuICAgICAgbWFrZU5vbmVLZXlmcmFtZXNBbmltYXRhYmxlKHVucmVzb2x2ZWRLZXlmcmFtZXMsIG5vbmVLZXlmcmFtZUluZGV4ZXMsIG5hbWUpO1xuICAgIH1cbiAgfVxuICBtZWFzdXJlSW5pdGlhbFN0YXRlKCkge1xuICAgIGNvbnN0IHsgZWxlbWVudCwgdW5yZXNvbHZlZEtleWZyYW1lcywgbmFtZSB9ID0gdGhpcztcbiAgICBpZiAoIWVsZW1lbnQgfHwgIWVsZW1lbnQuY3VycmVudClcbiAgICAgIHJldHVybjtcbiAgICBpZiAobmFtZSA9PT0gXCJoZWlnaHRcIikge1xuICAgICAgdGhpcy5zdXNwZW5kZWRTY3JvbGxZID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuICAgIH1cbiAgICB0aGlzLm1lYXN1cmVkT3JpZ2luID0gcG9zaXRpb25hbFZhbHVlc1tuYW1lXShlbGVtZW50Lm1lYXN1cmVWaWV3cG9ydEJveCgpLCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50LmN1cnJlbnQpKTtcbiAgICB1bnJlc29sdmVkS2V5ZnJhbWVzWzBdID0gdGhpcy5tZWFzdXJlZE9yaWdpbjtcbiAgICBjb25zdCBtZWFzdXJlS2V5ZnJhbWUgPSB1bnJlc29sdmVkS2V5ZnJhbWVzW3VucmVzb2x2ZWRLZXlmcmFtZXMubGVuZ3RoIC0gMV07XG4gICAgaWYgKG1lYXN1cmVLZXlmcmFtZSAhPT0gdm9pZCAwKSB7XG4gICAgICBlbGVtZW50LmdldFZhbHVlKG5hbWUsIG1lYXN1cmVLZXlmcmFtZSkuanVtcChtZWFzdXJlS2V5ZnJhbWUsIGZhbHNlKTtcbiAgICB9XG4gI
10617H1cbiAgbWVhc3VyZUVuZFN0YXRlKCkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCB7IGVsZW1lbnQsIG5hbWUsIHVucmVzb2x2ZWRLZXlmcmFtZXMgfSA9IHRoaXM7XG4gICAgaWYgKCFlbGVtZW50IHx8ICFlbGVtZW50LmN1cnJlbnQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgdmFsdWUgPSBlbGVtZW50LmdldFZhbHVlKG5hbWUpO1xuICAgIHZhbHVlICYmIHZhbHVlLmp1bXAodGhpcy5tZWFzdXJlZE9yaWdpbiwgZmFsc2UpO1xuICAgIGNvbnN0IGZpbmFsS2V5ZnJhbWVJbmRleCA9IHVucmVzb2x2ZWRLZXlmcmFtZXMubGVuZ3RoIC0gMTtcbiAgICBjb25zdCBmaW5hbEtleWZyYW1lID0gdW5yZXNvbHZlZEtleWZyYW1lc1tmaW5hbEtleWZyYW1lSW5kZXhdO1xuICAgIHVucmVzb2x2ZWRLZXlmcmFtZXNbZmluYWxLZXlmcmFtZUluZGV4XSA9IHBvc2l0aW9uYWxWYWx1ZXNbbmFtZV0oZWxlbWVudC5tZWFzdXJlVmlld3BvcnRCb3goKSwgd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudC5jdXJyZW50KSk7XG4gICAgaWYgKGZpbmFsS2V5ZnJhbWUgIT09IG51bGwgJiYgdGhpcy5maW5hbEtleWZyYW1lID09PSB2b2lkIDApIHtcbiAgICAgIHRoaXMuZmluYWxLZXlmcmFtZSA9IGZpbmFsS2V5ZnJhbWU7XG4gICAgfVxuICAgIGlmICgoX2EgPSB0aGlzLnJlbW92ZWRUcmFuc2Zvcm1zKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJlbW92ZWRUcmFuc2Zvcm1zLmZvckVhY2goKFt1bnNldFRyYW5zZm9ybU5hbWUsIHVuc2V0VHJhbnNmb3JtVmFsdWVdKSA9PiB7XG4gICAgICAgIGVsZW1lbnQuZ2V0VmFsdWUodW5zZXRUcmFuc2Zvcm1OYW1lKS5zZXQodW5zZXRUcmFuc2Zvcm1WYWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5yZXNvbHZlTm9uZUtleWZyYW1lcygpO1xuICB9XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vYW5pbWF0b3JzL0Jhc2VBbmltYXRpb24ubWpzXG52YXIgaW1wb3J0X2Rpc3Q1MjYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDUyNyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDUyOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL2FuaW1hdG9ycy91dGlscy9jYW4tYW5pbWF0ZS5tanNcbnZhciBpbXBvcnRfZGlzdDUyMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTIxID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTIyID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vdXRpbHMvaXMtYW5pbWF0YWJsZS5tanNcbnZhciBpbXBvcnRfZGlzdDUxNyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTE4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTE5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGlzQW5pbWF0YWJsZSA9ICh2YWx1ZSwgbmFtZSkgPT4ge1xuICBpZiAobmFtZSA9PT0gXCJ6SW5kZXhcIilcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpXG4gICAgcmV0dXJuIHRydWU7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgLy8gSXQncyBhbmltYXRhYmxlIGlmIHdlIGhhdmUgYSBzdHJpbmdcbiAgKGNvbXBsZXgudGVzdCh2YWx1ZSkgfHwgdmFsdWUgPT09IFwiMFwiKSAmJiAvLyBBbmQgaXQgY29udGFpbnMgbnVtYmVycyBhbmQvb3IgY29sb3JzXG4gICF2YWx1ZS5zdGFydHNXaXRoKFwidXJsKFwiKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9hbmltYXRvcnMvdXRpbHMvY2FuLWFuaW1hdGUubWpzXG5mdW5jdGlvbiBoYXNLZXlmcmFtZXNDaGFuZ2VkKGtleWZyYW1lczIpIHtcbiAgY29uc3QgY3VycmVudCA9IGtleWZyYW1lczJbMF07XG4gIGlmIChrZXlmcmFtZXMyLmxlbmd0aCA9PT0gMSlcbiAgICByZXR1cm4gdHJ1ZTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlmcmFtZXMyLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGtleWZyYW1lczJbaV0gIT09IGN1cnJlbnQpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuZnVuY3Rpb24gY2FuQW5pbWF0ZShrZXlmcmFtZXMyLCBuYW1lLCB0eXBlLCB2ZWxvY2l0eSkge1xuICBjb25zdCBvcmlnaW5LZXlmcmFtZSA9IGtleWZyYW1lczJbMF07XG4gIGlmIChvcmlnaW5LZXlmcmFtZSA9PT0gbnVsbClcbiAgICByZXR1cm4gZmFsc2U7XG4gIGlmIChuYW1lID09PSBcImRpc3BsYXlcIiB8fCBuYW1lID09PSBcInZpc2liaWxpdHlcIilcbiAgICByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgdGFyZ2V0S2V5ZnJhbWUgPSBrZXlmcmFtZXMyW2tleWZyYW1lczIubGVuZ3RoIC0gMV07XG4gIGNvbnN0IGlzT3JpZ2luQW5pbWF0YWJsZSA9IGlzQW5pbWF0YWJsZShvcmlnaW5LZXlmcmFtZSwgbmFtZSk7XG4gIGNvbnN0IGlzVGFyZ2V0QW5pbWF0YWJsZSA9IGlzQW5pbWF0YWJsZSh0YXJnZXRLZXlmcmFtZSwgbmFtZSk7XG4gIHdhcm5pbmcoaXNPcmlnaW5BbmltYXRhYmxlID09PSBpc1RhcmdldEFuaW1hdGFibGUsIGBZb3UgYXJlIHRyeWluZyB0byBhbmltYXRlICR7bmFtZX0gZnJvbSBcIiR7b3JpZ2luS2V5ZnJhbWV9XCIgdG8gXCIke3RhcmdldEtleWZyYW1lfVwiLiAke29yaWdpbktleWZyYW1lfSBpcyBub3QgYW4gYW5pbWF0YWJsZSB2YWx1ZSAtIHRvIGVuYWJsZSB0aGlzIGFuaW1hdGlvbiBzZXQgJHtvcmlnaW5L
10617ZXlmcmFtZX0gdG8gYSB2YWx1ZSBhbmltYXRhYmxlIHRvICR7dGFyZ2V0S2V5ZnJhbWV9IHZpYSB0aGUgXFxgc3R5bGVcXGAgcHJvcGVydHkuYCk7XG4gIGlmICghaXNPcmlnaW5BbmltYXRhYmxlIHx8ICFpc1RhcmdldEFuaW1hdGFibGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGhhc0tleWZyYW1lc0NoYW5nZWQoa2V5ZnJhbWVzMikgfHwgKHR5cGUgPT09IFwic3ByaW5nXCIgfHwgaXNHZW5lcmF0b3IodHlwZSkpICYmIHZlbG9jaXR5O1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vYW5pbWF0b3JzL3dhYXBpL3V0aWxzL2dldC1maW5hbC1rZXlmcmFtZS5tanNcbnZhciBpbXBvcnRfZGlzdDUyMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTI0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTI1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGlzTm90TnVsbCA9ICh2YWx1ZSkgPT4gdmFsdWUgIT09IG51bGw7XG5mdW5jdGlvbiBnZXRGaW5hbEtleWZyYW1lKGtleWZyYW1lczIsIHsgcmVwZWF0LCByZXBlYXRUeXBlID0gXCJsb29wXCIgfSwgZmluYWxLZXlmcmFtZSkge1xuICBjb25zdCByZXNvbHZlZEtleWZyYW1lcyA9IGtleWZyYW1lczIuZmlsdGVyKGlzTm90TnVsbCk7XG4gIGNvbnN0IGluZGV4ID0gcmVwZWF0ICYmIHJlcGVhdFR5cGUgIT09IFwibG9vcFwiICYmIHJlcGVhdCAlIDIgPT09IDEgPyAwIDogcmVzb2x2ZWRLZXlmcmFtZXMubGVuZ3RoIC0gMTtcbiAgcmV0dXJuICFpbmRleCB8fCBmaW5hbEtleWZyYW1lID09PSB2b2lkIDAgPyByZXNvbHZlZEtleWZyYW1lc1tpbmRleF0gOiBmaW5hbEtleWZyYW1lO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vYW5pbWF0b3JzL0Jhc2VBbmltYXRpb24ubWpzXG52YXIgTUFYX1JFU09MVkVfREVMQVkgPSA0MDtcbnZhciBCYXNlQW5pbWF0aW9uID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcih7IGF1dG9wbGF5ID0gdHJ1ZSwgZGVsYXk6IGRlbGF5MiA9IDAsIHR5cGUgPSBcImtleWZyYW1lc1wiLCByZXBlYXQgPSAwLCByZXBlYXREZWxheSA9IDAsIHJlcGVhdFR5cGUgPSBcImxvb3BcIiwgLi4ub3B0aW9ucyB9KSB7XG4gICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTtcbiAgICB0aGlzLmhhc0F0dGVtcHRlZFJlc29sdmUgPSBmYWxzZTtcbiAgICB0aGlzLmNyZWF0ZWRBdCA9IHRpbWUubm93KCk7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgYXV0b3BsYXksXG4gICAgICBkZWxheTogZGVsYXkyLFxuICAgICAgdHlwZSxcbiAgICAgIHJlcGVhdCxcbiAgICAgIHJlcGVhdERlbGF5LFxuICAgICAgcmVwZWF0VHlwZSxcbiAgICAgIC4uLm9wdGlvbnNcbiAgICB9O1xuICAgIHRoaXMudXBkYXRlRmluaXNoZWRQcm9taXNlKCk7XG4gIH1cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHVzZXMgdGhlIGNyZWF0ZWRBdCBhbmQgcmVzb2x2ZWRBdCB0byBjYWxjdWxhdGUgdGhlXG4gICAqIGFuaW1hdGlvbiBzdGFydFRpbWUuICpJZGVhbGx5Kiwgd2Ugd291bGQgdXNlIHRoZSBjcmVhdGVkQXQgdGltZSBhcyB0PTBcbiAgICogYXMgdGhlIGZvbGxvd2luZyBmcmFtZSB3b3VsZCB0aGVuIGJlIHRoZSBmaXJzdCBmcmFtZSBvZiB0aGUgYW5pbWF0aW9uIGluXG4gICAqIHByb2dyZXNzLCB3aGljaCB3b3VsZCBmZWVsIHNuYXBwaWVyLlxuICAgKlxuICAgKiBIb3dldmVyLCBpZiB0aGVyZSdzIGEgZGVsYXkgKG1haW4gdGhyZWFkIHdvcmspIGJldHdlZW4gdGhlIGNyZWF0aW9uIG9mXG4gICAqIHRoZSBhbmltYXRpb24gYW5kIHRoZSBmaXJzdCBjb21taXRlZCBmcmFtZSwgd2UgcHJlZmVyIHRvIHVzZSByZXNvbHZlZEF0XG4gICAqIHRvIGF2b2lkIGEgc3VkZGVuIGp1bXAgaW50byB0aGUgYW5pbWF0aW9uLlxuICAgKi9cbiAgY2FsY1N0YXJ0VGltZSgpIHtcbiAgICBpZiAoIXRoaXMucmVzb2x2ZWRBdClcbiAgICAgIHJldHVybiB0aGlzLmNyZWF0ZWRBdDtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlZEF0IC0gdGhpcy5jcmVhdGVkQXQgPiBNQVhfUkVTT0xWRV9ERUxBWSA/IHRoaXMucmVzb2x2ZWRBdCA6IHRoaXMuY3JlYXRlZEF0O1xuICB9XG4gIC8qKlxuICAgKiBBIGdldHRlciBmb3IgcmVzb2x2ZWQgZGF0YS4gSWYga2V5ZnJhbWVzIGFyZSBub3QgeWV0IHJlc29sdmVkLCBhY2Nlc3NpbmdcbiAgICogdGhpcy5yZXNvbHZlZCB3aWxsIHN5bmNocm9ub3VzbHkgZmx1c2ggYWxsIHBlbmRpbmcga2V5ZnJhbWUgcmVzb2x2ZXJzLlxuICAgKiBUaGlzIGlzIGEgZGVvcHRpbWlzYXRpb24sIGJ1dCBhdCBpdHMgd29yc3Qgc3RpbGwgYmF0Y2hlcyByZWFkL3dyaXRlcy5cbiAgICovXG4gIGdldCByZXNvbHZlZCgpIHtcbiAgICBpZiAoIXRoaXMuX3Jlc29sdmVkICYmICF0aGlzLmhhc0F0dGVtcHRlZFJlc29sdmUpIHtcbiAgICAgIGZsdXNoS2V5ZnJhbWVSZXNvbHZlcnMoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVkO1xuICB9XG4gIC8qKlxuICAgKiBBIG1ldGhvZCB0byBiZSBjYWxsZWQgd2hlbiB0aGUga2V5ZnJhbWVzIHJlc29sdmVyIGNvbXBsZXRlcy4gVGhpcyBtZXRob2RcbiAgICogd2lsbCBjaGVjayBpZiBpdHMgcG9zc2libGUgdG8gcnVuIHRoZSBhbmltYXRpb24gYW5kLCBpZiBub3QsIHNraXAgaXQuXG4gICAqIE90aGVyd2lzZSwgaXQgd2lsbCBjYWxsIGluaXRQbGF5YmFjayBvbiB0aGUgaW1wbGVtZW50aW5nIGNsYXNzLlxuICAgKi9cbiAgb25LZXlmcmFtZXNSZXNvbHZlZChrZXlmcmFtZXMyLCBmaW5hbEtleWZyYW1lKSB7XG4gICAgdGhpcy5yZXNvbHZlZEF0ID0gdGltZS5ub3coKTtcbiAgICB0aGlzLmhhc0F0dGVtcHRlZFJlc29sdmUgPSB0cnVlO1xuICAgIGNvbnN0IHsgbmFtZSwgdHlwZSwgdmVsb2NpdHksIGRlbGF5OiBkZWxheTIsIG9uQ29tcGxldGUsIG9uVXBkYXRlLCBpc0dlbmVyYXRvcjogaXNHZW5lcmF0b3IyIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgaWYgKCFpc0dlbmVyYXRvcjIgJiYgIWNhbkFuaW1hdGUoa2V5ZnJhbWVzMiwgbmFtZSwgdHlwZSwgdmVsb2NpdHkpKSB7XG4gICAgICBpZiAoaW5zdGFudEFuaW1hdGlvblN0YXRlLmN1cnJlbnQgfHwgIWRlbGF5Mikge1xuICAgICAgICBvblVwZGF0ZSAmJiBvblVwZGF0ZShnZXRGaW5hbEtleWZyYW1lKGtleWZyYW1lczIsIHRoaXMub3B0aW9ucywgZmluYWxLZXlmcmFtZSkpO1xuICAgICAgICBvbkNvbXBsZXRlICYmIG9uQ29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5yZXNvbHZlRmluaXNoZWRQcm9taXNlKCk7XG4gICAgICAgI
10617HJldHVybjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5kdXJhdGlvbiA9IDA7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkQW5pbWF0aW9uID0gdGhpcy5pbml0UGxheWJhY2soa2V5ZnJhbWVzMiwgZmluYWxLZXlmcmFtZSk7XG4gICAgaWYgKHJlc29sdmVkQW5pbWF0aW9uID09PSBmYWxzZSlcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLl9yZXNvbHZlZCA9IHtcbiAgICAgIGtleWZyYW1lczoga2V5ZnJhbWVzMixcbiAgICAgIGZpbmFsS2V5ZnJhbWUsXG4gICAgICAuLi5yZXNvbHZlZEFuaW1hdGlvblxuICAgIH07XG4gICAgdGhpcy5vblBvc3RSZXNvbHZlZCgpO1xuICB9XG4gIG9uUG9zdFJlc29sdmVkKCkge1xuICB9XG4gIC8qKlxuICAgKiBBbGxvd3MgdGhlIHJldHVybmVkIGFuaW1hdGlvbiB0byBiZSBhd2FpdGVkIG9yIHByb21pc2UtY2hhaW5lZC4gQ3VycmVudGx5XG4gICAqIHJlc29sdmVzIHdoZW4gdGhlIGFuaW1hdGlvbiBmaW5pc2hlcyBhdCBhbGwgYnV0IGluIGEgZnV0dXJlIHVwZGF0ZSBjb3VsZC9zaG91bGRcbiAgICogcmVqZWN0IGlmIGl0cyBjYW5jZWxzLlxuICAgKi9cbiAgdGhlbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50RmluaXNoZWRQcm9taXNlLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgfVxuICBmbGF0dGVuKCkge1xuICAgIHRoaXMub3B0aW9ucy50eXBlID0gXCJrZXlmcmFtZXNcIjtcbiAgICB0aGlzLm9wdGlvbnMuZWFzZSA9IFwibGluZWFyXCI7XG4gIH1cbiAgdXBkYXRlRmluaXNoZWRQcm9taXNlKCkge1xuICAgIHRoaXMuY3VycmVudEZpbmlzaGVkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLnJlc29sdmVGaW5pc2hlZFByb21pc2UgPSByZXNvbHZlO1xuICAgIH0pO1xuICB9XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vYW5pbWF0b3JzL01haW5UaHJlYWRBbmltYXRpb24ubWpzXG52YXIgaW1wb3J0X2Rpc3Q1OTUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDU5NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDU5NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvbWl4L2luZGV4Lm1qc1xudmFyIGltcG9ydF9kaXN0NTUwID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1NTEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1NTIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3V0aWxzL21peC9jb21wbGV4Lm1qc1xudmFyIGltcG9ydF9kaXN0NTQ3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1NDggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1NDkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3V0aWxzL21peC9udW1iZXIubWpzXG52YXIgaW1wb3J0X2Rpc3Q1MjkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDUzMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDUzMSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBtaXhOdW1iZXIgPSAoZnJvbSwgdG8sIHByb2dyZXNzMikgPT4ge1xuICByZXR1cm4gZnJvbSArICh0byAtIGZyb20pICogcHJvZ3Jlc3MyO1xufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvbWl4L2NvbG9yLm1qc1xudmFyIGltcG9ydF9kaXN0NTM4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1MzkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1NDAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3V0aWxzL2hzbGEtdG8tcmdiYS5tanNcbnZhciBpbXBvcnRfZGlzdDUzMiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTMzID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTM0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gaHVlVG9SZ2IocCwgcSwgdCkge1xuICBpZiAodCA8IDApXG4gICAgdCArPSAxO1xuICBpZiAodCA+IDEpXG4gICAgdCAtPSAxO1xuICBpZiAodCA8IDEgLyA2KVxuICAgIHJldHVybiBwICsgKHEgLSBwKSAqIDYgKiB0O1xuICBpZiAodCA8IDEgLyAyKVxuICAgIHJldHVybiBxO1xuICBpZiAodCA8IDIgLyAzKVxuICAgIHJldHVybiBwICsgKHEgLSBwKSAqICgyIC8gMyAtIHQpICogNjtcbiAgcmV0dXJuIHA7XG59XG5mdW5jdGlvbiBoc2xhVG9SZ2JhKHsgaHVlLCBzYXR1cmF0aW9uLCBsaWdodG5lc3MsIGFscGhhOiBhbHBoYTIgfSkge1xuICBodWUgLz0gMzYwO1xuICBzYXR1cmF0aW9uIC89IDEwMDtcbiAgbGlnaHRuZXNzIC89IDEwMDtcbiAgbGV0IHJlZCA9IDA7XG4gIGxldCBncmVlbiA9IDA7XG4gIGxldCBibHVlID0gMDtcbiAgaWYgKCFzY
10617XR1cmF0aW9uKSB7XG4gICAgcmVkID0gZ3JlZW4gPSBibHVlID0gbGlnaHRuZXNzO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHEgPSBsaWdodG5lc3MgPCAwLjUgPyBsaWdodG5lc3MgKiAoMSArIHNhdHVyYXRpb24pIDogbGlnaHRuZXNzICsgc2F0dXJhdGlvbiAtIGxpZ2h0bmVzcyAqIHNhdHVyYXRpb247XG4gICAgY29uc3QgcCA9IDIgKiBsaWdodG5lc3MgLSBxO1xuICAgIHJlZCA9IGh1ZVRvUmdiKHAsIHEsIGh1ZSArIDEgLyAzKTtcbiAgICBncmVlbiA9IGh1ZVRvUmdiKHAsIHEsIGh1ZSk7XG4gICAgYmx1ZSA9IGh1ZVRvUmdiKHAsIHEsIGh1ZSAtIDEgLyAzKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIHJlZDogTWF0aC5yb3VuZChyZWQgKiAyNTUpLFxuICAgIGdyZWVuOiBNYXRoLnJvdW5kKGdyZWVuICogMjU1KSxcbiAgICBibHVlOiBNYXRoLnJvdW5kKGJsdWUgKiAyNTUpLFxuICAgIGFscGhhOiBhbHBoYTJcbiAgfTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvbWl4L2ltbWVkaWF0ZS5tanNcbnZhciBpbXBvcnRfZGlzdDUzNSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTM2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTM3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gbWl4SW1tZWRpYXRlKGEsIGIpIHtcbiAgcmV0dXJuIChwKSA9PiBwID4gMCA/IGIgOiBhO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy9taXgvY29sb3IubWpzXG52YXIgbWl4TGluZWFyQ29sb3IgPSAoZnJvbSwgdG8sIHYpID0+IHtcbiAgY29uc3QgZnJvbUV4cG8gPSBmcm9tICogZnJvbTtcbiAgY29uc3QgZXhwbyA9IHYgKiAodG8gKiB0byAtIGZyb21FeHBvKSArIGZyb21FeHBvO1xuICByZXR1cm4gZXhwbyA8IDAgPyAwIDogTWF0aC5zcXJ0KGV4cG8pO1xufTtcbnZhciBjb2xvclR5cGVzID0gW2hleCwgcmdiYSwgaHNsYV07XG52YXIgZ2V0Q29sb3JUeXBlID0gKHYpID0+IGNvbG9yVHlwZXMuZmluZCgodHlwZSkgPT4gdHlwZS50ZXN0KHYpKTtcbmZ1bmN0aW9uIGFzUkdCQShjb2xvcjIpIHtcbiAgY29uc3QgdHlwZSA9IGdldENvbG9yVHlwZShjb2xvcjIpO1xuICB3YXJuaW5nKEJvb2xlYW4odHlwZSksIGAnJHtjb2xvcjJ9JyBpcyBub3QgYW4gYW5pbWF0YWJsZSBjb2xvci4gVXNlIHRoZSBlcXVpdmFsZW50IGNvbG9yIGNvZGUgaW5zdGVhZC5gKTtcbiAgaWYgKCFCb29sZWFuKHR5cGUpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgbGV0IG1vZGVsID0gdHlwZS5wYXJzZShjb2xvcjIpO1xuICBpZiAodHlwZSA9PT0gaHNsYSkge1xuICAgIG1vZGVsID0gaHNsYVRvUmdiYShtb2RlbCk7XG4gIH1cbiAgcmV0dXJuIG1vZGVsO1xufVxudmFyIG1peENvbG9yID0gKGZyb20sIHRvKSA9PiB7XG4gIGNvbnN0IGZyb21SR0JBID0gYXNSR0JBKGZyb20pO1xuICBjb25zdCB0b1JHQkEgPSBhc1JHQkEodG8pO1xuICBpZiAoIWZyb21SR0JBIHx8ICF0b1JHQkEpIHtcbiAgICByZXR1cm4gbWl4SW1tZWRpYXRlKGZyb20sIHRvKTtcbiAgfVxuICBjb25zdCBibGVuZGVkID0geyAuLi5mcm9tUkdCQSB9O1xuICByZXR1cm4gKHYpID0+IHtcbiAgICBibGVuZGVkLnJlZCA9IG1peExpbmVhckNvbG9yKGZyb21SR0JBLnJlZCwgdG9SR0JBLnJlZCwgdik7XG4gICAgYmxlbmRlZC5ncmVlbiA9IG1peExpbmVhckNvbG9yKGZyb21SR0JBLmdyZWVuLCB0b1JHQkEuZ3JlZW4sIHYpO1xuICAgIGJsZW5kZWQuYmx1ZSA9IG1peExpbmVhckNvbG9yKGZyb21SR0JBLmJsdWUsIHRvUkdCQS5ibHVlLCB2KTtcbiAgICBibGVuZGVkLmFscGhhID0gbWl4TnVtYmVyKGZyb21SR0JBLmFscGhhLCB0b1JHQkEuYWxwaGEsIHYpO1xuICAgIHJldHVybiByZ2JhLnRyYW5zZm9ybShibGVuZGVkKTtcbiAgfTtcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3V0aWxzL3BpcGUubWpzXG52YXIgaW1wb3J0X2Rpc3Q1NDEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDU0MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDU0MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBjb21iaW5lRnVuY3Rpb25zID0gKGEsIGIpID0+ICh2KSA9PiBiKGEodikpO1xudmFyIHBpcGUgPSAoLi4udHJhbnNmb3JtZXJzKSA9PiB0cmFuc2Zvcm1lcnMucmVkdWNlKGNvbWJpbmVGdW5jdGlvbnMpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy9taXgvdmlzaWJpbGl0eS5tanNcbnZhciBpbXBvcnRfZGlzdDU0NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTQ1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTQ2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGludmlzaWJsZVZhbHVlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KFtcIm5vbmVcIiwgXCJoaWRkZW5cIl0pO1xuZnVuY3Rpb24gbWl4VmlzaWJpbGl0eShvcmlnaW4sIHRhcmdldCkge1xuICBpZiAoaW52aXNpYmxlVmFsdWVzLmhhcyhvcmlnaW4pKSB7XG4gICAgcmV0dXJuIChwKSA9PiBwIDw9IDAgPyBvcmlnaW4gOiB0YXJnZXQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIChwKSA9PiBwID49IDEgPyB0YXJnZXQgOiBvcmlnaW47XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvbWl4L2NvbXBsZXgubWpzXG5mdW5jdGlvbiBtaXhOdW1iZXIyKGEsIGIpIHtcbiAgcmV0dXJuIChwKSA9PiBtaXhOdW1iZXIoYSwgYiwgcCk7XG59XG5mdW5jdGlvbiBnZXRNaXhlcihhKSB7XG4gIGlmICh0eXBlb2YgYSA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybi
10617BtaXhOdW1iZXIyO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBhID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIGlzQ1NTVmFyaWFibGVUb2tlbihhKSA/IG1peEltbWVkaWF0ZSA6IGNvbG9yLnRlc3QoYSkgPyBtaXhDb2xvciA6IG1peENvbXBsZXg7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhKSkge1xuICAgIHJldHVybiBtaXhBcnJheTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgYSA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBjb2xvci50ZXN0KGEpID8gbWl4Q29sb3IgOiBtaXhPYmplY3Q7XG4gIH1cbiAgcmV0dXJuIG1peEltbWVkaWF0ZTtcbn1cbmZ1bmN0aW9uIG1peEFycmF5KGEsIGIpIHtcbiAgY29uc3Qgb3V0cHV0ID0gWy4uLmFdO1xuICBjb25zdCBudW1WYWx1ZXMgPSBvdXRwdXQubGVuZ3RoO1xuICBjb25zdCBibGVuZFZhbHVlID0gYS5tYXAoKHYsIGkpID0+IGdldE1peGVyKHYpKHYsIGJbaV0pKTtcbiAgcmV0dXJuIChwKSA9PiB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7IGkrKykge1xuICAgICAgb3V0cHV0W2ldID0gYmxlbmRWYWx1ZVtpXShwKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfTtcbn1cbmZ1bmN0aW9uIG1peE9iamVjdChhLCBiKSB7XG4gIGNvbnN0IG91dHB1dCA9IHsgLi4uYSwgLi4uYiB9O1xuICBjb25zdCBibGVuZFZhbHVlID0ge307XG4gIGZvciAoY29uc3Qga2V5IGluIG91dHB1dCkge1xuICAgIGlmIChhW2tleV0gIT09IHZvaWQgMCAmJiBiW2tleV0gIT09IHZvaWQgMCkge1xuICAgICAgYmxlbmRWYWx1ZVtrZXldID0gZ2V0TWl4ZXIoYVtrZXldKShhW2tleV0sIGJba2V5XSk7XG4gICAgfVxuICB9XG4gIHJldHVybiAodikgPT4ge1xuICAgIGZvciAoY29uc3Qga2V5IGluIGJsZW5kVmFsdWUpIHtcbiAgICAgIG91dHB1dFtrZXldID0gYmxlbmRWYWx1ZVtrZXldKHYpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0O1xuICB9O1xufVxuZnVuY3Rpb24gbWF0Y2hPcmRlcihvcmlnaW4sIHRhcmdldCkge1xuICB2YXIgX2E7XG4gIGNvbnN0IG9yZGVyZWRPcmlnaW4gPSBbXTtcbiAgY29uc3QgcG9pbnRlcnMgPSB7IGNvbG9yOiAwLCB2YXI6IDAsIG51bWJlcjogMCB9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldC52YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB0eXBlID0gdGFyZ2V0LnR5cGVzW2ldO1xuICAgIGNvbnN0IG9yaWdpbkluZGV4ID0gb3JpZ2luLmluZGV4ZXNbdHlwZV1bcG9pbnRlcnNbdHlwZV1dO1xuICAgIGNvbnN0IG9yaWdpblZhbHVlID0gKF9hID0gb3JpZ2luLnZhbHVlc1tvcmlnaW5JbmRleF0pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDA7XG4gICAgb3JkZXJlZE9yaWdpbltpXSA9IG9yaWdpblZhbHVlO1xuICAgIHBvaW50ZXJzW3R5cGVdKys7XG4gIH1cbiAgcmV0dXJuIG9yZGVyZWRPcmlnaW47XG59XG52YXIgbWl4Q29tcGxleCA9IChvcmlnaW4sIHRhcmdldCkgPT4ge1xuICBjb25zdCB0ZW1wbGF0ZSA9IGNvbXBsZXguY3JlYXRlVHJhbnNmb3JtZXIodGFyZ2V0KTtcbiAgY29uc3Qgb3JpZ2luU3RhdHMgPSBhbmFseXNlQ29tcGxleFZhbHVlKG9yaWdpbik7XG4gIGNvbnN0IHRhcmdldFN0YXRzID0gYW5hbHlzZUNvbXBsZXhWYWx1ZSh0YXJnZXQpO1xuICBjb25zdCBjYW5JbnRlcnBvbGF0ZSA9IG9yaWdpblN0YXRzLmluZGV4ZXMudmFyLmxlbmd0aCA9PT0gdGFyZ2V0U3RhdHMuaW5kZXhlcy52YXIubGVuZ3RoICYmIG9yaWdpblN0YXRzLmluZGV4ZXMuY29sb3IubGVuZ3RoID09PSB0YXJnZXRTdGF0cy5pbmRleGVzLmNvbG9yLmxlbmd0aCAmJiBvcmlnaW5TdGF0cy5pbmRleGVzLm51bWJlci5sZW5ndGggPj0gdGFyZ2V0U3RhdHMuaW5kZXhlcy5udW1iZXIubGVuZ3RoO1xuICBpZiAoY2FuSW50ZXJwb2xhdGUpIHtcbiAgICBpZiAoaW52aXNpYmxlVmFsdWVzLmhhcyhvcmlnaW4pICYmICF0YXJnZXRTdGF0cy52YWx1ZXMubGVuZ3RoIHx8IGludmlzaWJsZVZhbHVlcy5oYXModGFyZ2V0KSAmJiAhb3JpZ2luU3RhdHMudmFsdWVzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG1peFZpc2liaWxpdHkob3JpZ2luLCB0YXJnZXQpO1xuICAgIH1cbiAgICByZXR1cm4gcGlwZShtaXhBcnJheShtYXRjaE9yZGVyKG9yaWdpblN0YXRzLCB0YXJnZXRTdGF0cyksIHRhcmdldFN0YXRzLnZhbHVlcyksIHRlbXBsYXRlKTtcbiAgfSBlbHNlIHtcbiAgICB3YXJuaW5nKHRydWUsIGBDb21wbGV4IHZhbHVlcyAnJHtvcmlnaW59JyBhbmQgJyR7dGFyZ2V0fScgdG9vIGRpZmZlcmVudCB0byBtaXguIEVuc3VyZSBhbGwgY29sb3JzIGFyZSBvZiB0aGUgc2FtZSB0eXBlLCBhbmQgdGhhdCBlYWNoIGNvbnRhaW5zIHRoZSBzYW1lIHF1YW50aXR5IG9mIG51bWJlciBhbmQgY29sb3IgdmFsdWVzLiBGYWxsaW5nIGJhY2sgdG8gaW5zdGFudCB0cmFuc2l0aW9uLmApO1xuICAgIHJldHVybiBtaXhJbW1lZGlhdGUob3JpZ2luLCB0YXJnZXQpO1xuICB9XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy9taXgvaW5kZXgubWpzXG5mdW5jdGlvbiBtaXgoZnJvbSwgdG8sIHApIHtcbiAgaWYgKHR5cGVvZiBmcm9tID09PSBcIm51bWJlclwiICYmIHR5cGVvZiB0byA9PT0gXCJudW1iZXJcIiAmJiB0eXBlb2YgcCA9PT0gXCJudW1iZXJcIikge1xuICAgIHJldHVybiBtaXhOdW1iZXIoZnJvbSwgdG8sIHApO1xuICB9XG4gIGNvbnN0IG1peGVyID0gZ2V0TWl4ZXIoZnJvbSk7XG4gIHJldHVybiBtaXhlcihmcm9tLCB0byk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9nZW5lcmF0b3JzL2luZXJ0aWEubWpzXG52YXIgaW1wb3J0X2Rpc3Q1NjUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDU2NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDU2NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL2dlbmVyYXRvcnMvc3ByaW5nL2luZGV4Lm1qc1xudmFyIGltcG9ydF9kaXN0NTYyID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1NjMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1NjQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9nZW5lcmF0b3JzL3V0aWxzL3ZlbG9jaXR5Lm1qc1xudmFyIGltcG9ydF9kaXN0NTUzID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1NTQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1NTUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgdmVsb2NpdHlTYW1wbGVEdXJhdGlvbiA9IDU7XG5mdW5jdGlvbiBjYWxjR2VuZXJhdG9yVmVsb2NpdHkocmVzb2x2ZVZhbHVlLCB0LCBjdXJyZW50KSB7XG4gIGNvbnN0IHByZXZUID0gTWF0aC5tYXgodCAtIHZlbG9jaXR5U2FtcGxlRHVyYXRpb24sIDApO1xuICByZXR1cm4gdmVsb2NpdHlQZXJTZWNvbmQoY3
10617VycmVudCAtIHJlc29sdmVWYWx1ZShwcmV2VCksIHQgLSBwcmV2VCk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9nZW5lcmF0b3JzL3NwcmluZy9kZWZhdWx0cy5tanNcbnZhciBpbXBvcnRfZGlzdDU1NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTU3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTU4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIHNwcmluZ0RlZmF1bHRzID0ge1xuICAvLyBEZWZhdWx0IHNwcmluZyBwaHlzaWNzXG4gIHN0aWZmbmVzczogMTAwLFxuICBkYW1waW5nOiAxMCxcbiAgbWFzczogMSxcbiAgdmVsb2NpdHk6IDAsXG4gIC8vIERlZmF1bHQgZHVyYXRpb24vYm91bmNlLWJhc2VkIG9wdGlvbnNcbiAgZHVyYXRpb246IDgwMCxcbiAgLy8gaW4gbXNcbiAgYm91bmNlOiAwLjMsXG4gIHZpc3VhbER1cmF0aW9uOiAwLjMsXG4gIC8vIGluIHNlY29uZHNcbiAgLy8gUmVzdCB0aHJlc2hvbGRzXG4gIHJlc3RTcGVlZDoge1xuICAgIGdyYW51bGFyOiAwLjAxLFxuICAgIGRlZmF1bHQ6IDJcbiAgfSxcbiAgcmVzdERlbHRhOiB7XG4gICAgZ3JhbnVsYXI6IDVlLTMsXG4gICAgZGVmYXVsdDogMC41XG4gIH0sXG4gIC8vIExpbWl0c1xuICBtaW5EdXJhdGlvbjogMC4wMSxcbiAgLy8gaW4gc2Vjb25kc1xuICBtYXhEdXJhdGlvbjogMTAsXG4gIC8vIGluIHNlY29uZHNcbiAgbWluRGFtcGluZzogMC4wNSxcbiAgbWF4RGFtcGluZzogMVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL2dlbmVyYXRvcnMvc3ByaW5nL2ZpbmQubWpzXG52YXIgaW1wb3J0X2Rpc3Q1NTkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDU2MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDU2MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBzYWZlTWluID0gMWUtMztcbmZ1bmN0aW9uIGZpbmRTcHJpbmcoeyBkdXJhdGlvbiA9IHNwcmluZ0RlZmF1bHRzLmR1cmF0aW9uLCBib3VuY2UgPSBzcHJpbmdEZWZhdWx0cy5ib3VuY2UsIHZlbG9jaXR5ID0gc3ByaW5nRGVmYXVsdHMudmVsb2NpdHksIG1hc3MgPSBzcHJpbmdEZWZhdWx0cy5tYXNzIH0pIHtcbiAgbGV0IGVudmVsb3BlO1xuICBsZXQgZGVyaXZhdGl2ZTtcbiAgd2FybmluZyhkdXJhdGlvbiA8PSBzZWNvbmRzVG9NaWxsaXNlY29uZHMoc3ByaW5nRGVmYXVsdHMubWF4RHVyYXRpb24pLCBcIlNwcmluZyBkdXJhdGlvbiBtdXN0IGJlIDEwIHNlY29uZHMgb3IgbGVzc1wiKTtcbiAgbGV0IGRhbXBpbmdSYXRpbyA9IDEgLSBib3VuY2U7XG4gIGRhbXBpbmdSYXRpbyA9IGNsYW1wKHNwcmluZ0RlZmF1bHRzLm1pbkRhbXBpbmcsIHNwcmluZ0RlZmF1bHRzLm1heERhbXBpbmcsIGRhbXBpbmdSYXRpbyk7XG4gIGR1cmF0aW9uID0gY2xhbXAoc3ByaW5nRGVmYXVsdHMubWluRHVyYXRpb24sIHNwcmluZ0RlZmF1bHRzLm1heER1cmF0aW9uLCBtaWxsaXNlY29uZHNUb1NlY29uZHMoZHVyYXRpb24pKTtcbiAgaWYgKGRhbXBpbmdSYXRpbyA8IDEpIHtcbiAgICBlbnZlbG9wZSA9ICh1bmRhbXBlZEZyZXEyKSA9PiB7XG4gICAgICBjb25zdCBleHBvbmVudGlhbERlY2F5ID0gdW5kYW1wZWRGcmVxMiAqIGRhbXBpbmdSYXRpbztcbiAgICAgIGNvbnN0IGRlbHRhID0gZXhwb25lbnRpYWxEZWNheSAqIGR1cmF0aW9uO1xuICAgICAgY29uc3QgYSA9IGV4cG9uZW50aWFsRGVjYXkgLSB2ZWxvY2l0eTtcbiAgICAgIGNvbnN0IGIgPSBjYWxjQW5ndWxhckZyZXEodW5kYW1wZWRGcmVxMiwgZGFtcGluZ1JhdGlvKTtcbiAgICAgIGNvbnN0IGMgPSBNYXRoLmV4cCgtZGVsdGEpO1xuICAgICAgcmV0dXJuIHNhZmVNaW4gLSBhIC8gYiAqIGM7XG4gICAgfTtcbiAgICBkZXJpdmF0aXZlID0gKHVuZGFtcGVkRnJlcTIpID0+IHtcbiAgICAgIGNvbnN0IGV4cG9uZW50aWFsRGVjYXkgPSB1bmRhbXBlZEZyZXEyICogZGFtcGluZ1JhdGlvO1xuICAgICAgY29uc3QgZGVsdGEgPSBleHBvbmVudGlhbERlY2F5ICogZHVyYXRpb247XG4gICAgICBjb25zdCBkID0gZGVsdGEgKiB2ZWxvY2l0eSArIHZlbG9jaXR5O1xuICAgICAgY29uc3QgZSA9IE1hdGgucG93KGRhbXBpbmdSYXRpbywgMikgKiBNYXRoLnBvdyh1bmRhbXBlZEZyZXEyLCAyKSAqIGR1cmF0aW9uO1xuICAgICAgY29uc3QgZiA9IE1hdGguZXhwKC1kZWx0YSk7XG4gICAgICBjb25zdCBnID0gY2FsY0FuZ3VsYXJGcmVxKE1hdGgucG93KHVuZGFtcGVkRnJlcTIsIDIpLCBkYW1waW5nUmF0aW8pO1xuICAgICAgY29uc3QgZmFjdG9yID0gLWVudmVsb3BlKHVuZGFtcGVkRnJlcTIpICsgc2FmZU1pbiA+IDAgPyAtMSA6IDE7XG4gICAgICByZXR1cm4gZmFjdG9yICogKChkIC0gZSkgKiBmKSAvIGc7XG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBlbnZlbG9wZSA9ICh1bmRhbXBlZEZyZXEyKSA9PiB7XG4gICAgICBjb25zdCBhID0gTWF0aC5leHAoLXVuZGFtcGVkRnJlcTIgKiBkdXJhdGlvbik7XG4gICAgICBjb25zdCBiID0gKHVuZGFtcGVkRnJlcTIgLSB2ZWxvY2l0eSkgKiBkdXJhdGlvbiArIDE7XG4gICAgICByZXR1cm4gLXNhZmVNaW4gKyBhICogYjtcbiAgICB9O1xuICAgIGRlcml2YXRpdmUgPSAodW5kYW1wZWRGcmVxMikgPT4ge1xuICAgICAgY29uc3QgYSA9IE1hdGguZXhwKC11bmRhbXBlZEZyZXEyICogZHVyYXRpb24pO1xuICAgICAgY29uc3QgYiA9ICh2ZWxvY2l0eSAtIHVuZGFtcGVkRnJlcTIpICogKGR1cmF0aW9uICogZHVyYXRpb24pO1xuICAgICAgcmV0dXJuIGEgKiBiO1xuICAgIH07XG4gIH1cbiAgY29uc3QgaW5pdGlhbEd1ZXNzID0gNSAvIGR1cmF0aW9uO1xuICBjb25zdCB1bmRhbXBlZEZyZXEgPSBhcHByb3hpbWF0ZVJvb3QoZW52ZWxvcGUsIGRlcml2YXRpdmUsIGluaXRpYWxHdWVzcyk7XG4gIGR1cmF0aW9uID0gc2Vjb25kc1RvTWlsbGlzZWNvbmRzKGR1cmF0aW9uKTtcbiAgaWYgKGlzTmFOKHVuZGFtcGVkRnJlcSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RpZmZuZXNzOiBzcHJpbmdEZWZhdWx0cy5zdGlmZm5lc3MsXG4gICAgICBkYW1waW5nOiBzcHJpbmdEZWZhdWx0cy5kYW1waW5nLFxuICAgICAgZHVyYXRpb25cbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHN0aWZmbmVzcyA9IE1hdGgucG93KHVuZGFtcGVkRnJlcSwgMikgKiBtYXNzO1xuICAgIHJldHVybi
10617B7XG4gICAgICBzdGlmZm5lc3MsXG4gICAgICBkYW1waW5nOiBkYW1waW5nUmF0aW8gKiAyICogTWF0aC5zcXJ0KG1hc3MgKiBzdGlmZm5lc3MpLFxuICAgICAgZHVyYXRpb25cbiAgICB9O1xuICB9XG59XG52YXIgcm9vdEl0ZXJhdGlvbnMgPSAxMjtcbmZ1bmN0aW9uIGFwcHJveGltYXRlUm9vdChlbnZlbG9wZSwgZGVyaXZhdGl2ZSwgaW5pdGlhbEd1ZXNzKSB7XG4gIGxldCByZXN1bHQgPSBpbml0aWFsR3Vlc3M7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcm9vdEl0ZXJhdGlvbnM7IGkrKykge1xuICAgIHJlc3VsdCA9IHJlc3VsdCAtIGVudmVsb3BlKHJlc3VsdCkgLyBkZXJpdmF0aXZlKHJlc3VsdCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIGNhbGNBbmd1bGFyRnJlcSh1bmRhbXBlZEZyZXEsIGRhbXBpbmdSYXRpbykge1xuICByZXR1cm4gdW5kYW1wZWRGcmVxICogTWF0aC5zcXJ0KDEgLSBkYW1waW5nUmF0aW8gKiBkYW1waW5nUmF0aW8pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vZ2VuZXJhdG9ycy9zcHJpbmcvaW5kZXgubWpzXG52YXIgZHVyYXRpb25LZXlzID0gW1wiZHVyYXRpb25cIiwgXCJib3VuY2VcIl07XG52YXIgcGh5c2ljc0tleXMgPSBbXCJzdGlmZm5lc3NcIiwgXCJkYW1waW5nXCIsIFwibWFzc1wiXTtcbmZ1bmN0aW9uIGlzU3ByaW5nVHlwZShvcHRpb25zLCBrZXlzMikge1xuICByZXR1cm4ga2V5czIuc29tZSgoa2V5KSA9PiBvcHRpb25zW2tleV0gIT09IHZvaWQgMCk7XG59XG5mdW5jdGlvbiBnZXRTcHJpbmdPcHRpb25zKG9wdGlvbnMpIHtcbiAgbGV0IHNwcmluZ09wdGlvbnMgPSB7XG4gICAgdmVsb2NpdHk6IHNwcmluZ0RlZmF1bHRzLnZlbG9jaXR5LFxuICAgIHN0aWZmbmVzczogc3ByaW5nRGVmYXVsdHMuc3RpZmZuZXNzLFxuICAgIGRhbXBpbmc6IHNwcmluZ0RlZmF1bHRzLmRhbXBpbmcsXG4gICAgbWFzczogc3ByaW5nRGVmYXVsdHMubWFzcyxcbiAgICBpc1Jlc29sdmVkRnJvbUR1cmF0aW9uOiBmYWxzZSxcbiAgICAuLi5vcHRpb25zXG4gIH07XG4gIGlmICghaXNTcHJpbmdUeXBlKG9wdGlvbnMsIHBoeXNpY3NLZXlzKSAmJiBpc1NwcmluZ1R5cGUob3B0aW9ucywgZHVyYXRpb25LZXlzKSkge1xuICAgIGlmIChvcHRpb25zLnZpc3VhbER1cmF0aW9uKSB7XG4gICAgICBjb25zdCB2aXN1YWxEdXJhdGlvbiA9IG9wdGlvbnMudmlzdWFsRHVyYXRpb247XG4gICAgICBjb25zdCByb290ID0gMiAqIE1hdGguUEkgLyAodmlzdWFsRHVyYXRpb24gKiAxLjIpO1xuICAgICAgY29uc3Qgc3RpZmZuZXNzID0gcm9vdCAqIHJvb3Q7XG4gICAgICBjb25zdCBkYW1waW5nID0gMiAqIGNsYW1wKDAuMDUsIDEsIDEgLSAob3B0aW9ucy5ib3VuY2UgfHwgMCkpICogTWF0aC5zcXJ0KHN0aWZmbmVzcyk7XG4gICAgICBzcHJpbmdPcHRpb25zID0ge1xuICAgICAgICAuLi5zcHJpbmdPcHRpb25zLFxuICAgICAgICBtYXNzOiBzcHJpbmdEZWZhdWx0cy5tYXNzLFxuICAgICAgICBzdGlmZm5lc3MsXG4gICAgICAgIGRhbXBpbmdcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGRlcml2ZWQgPSBmaW5kU3ByaW5nKG9wdGlvbnMpO1xuICAgICAgc3ByaW5nT3B0aW9ucyA9IHtcbiAgICAgICAgLi4uc3ByaW5nT3B0aW9ucyxcbiAgICAgICAgLi4uZGVyaXZlZCxcbiAgICAgICAgbWFzczogc3ByaW5nRGVmYXVsdHMubWFzc1xuICAgICAgfTtcbiAgICAgIHNwcmluZ09wdGlvbnMuaXNSZXNvbHZlZEZyb21EdXJhdGlvbiA9IHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBzcHJpbmdPcHRpb25zO1xufVxuZnVuY3Rpb24gc3ByaW5nKG9wdGlvbnNPclZpc3VhbER1cmF0aW9uID0gc3ByaW5nRGVmYXVsdHMudmlzdWFsRHVyYXRpb24sIGJvdW5jZSA9IHNwcmluZ0RlZmF1bHRzLmJvdW5jZSkge1xuICBjb25zdCBvcHRpb25zID0gdHlwZW9mIG9wdGlvbnNPclZpc3VhbER1cmF0aW9uICE9PSBcIm9iamVjdFwiID8ge1xuICAgIHZpc3VhbER1cmF0aW9uOiBvcHRpb25zT3JWaXN1YWxEdXJhdGlvbixcbiAgICBrZXlmcmFtZXM6IFswLCAxXSxcbiAgICBib3VuY2VcbiAgfSA6IG9wdGlvbnNPclZpc3VhbER1cmF0aW9uO1xuICBsZXQgeyByZXN0U3BlZWQsIHJlc3REZWx0YSB9ID0gb3B0aW9ucztcbiAgY29uc3Qgb3JpZ2luID0gb3B0aW9ucy5rZXlmcmFtZXNbMF07XG4gIGNvbnN0IHRhcmdldCA9IG9wdGlvbnMua2V5ZnJhbWVzW29wdGlvbnMua2V5ZnJhbWVzLmxlbmd0aCAtIDFdO1xuICBjb25zdCBzdGF0ZTIgPSB7IGRvbmU6IGZhbHNlLCB2YWx1ZTogb3JpZ2luIH07XG4gIGNvbnN0IHsgc3RpZmZuZXNzLCBkYW1waW5nLCBtYXNzLCBkdXJhdGlvbiwgdmVsb2NpdHksIGlzUmVzb2x2ZWRGcm9tRHVyYXRpb24gfSA9IGdldFNwcmluZ09wdGlvbnMoe1xuICAgIC4uLm9wdGlvbnMsXG4gICAgdmVsb2NpdHk6IC1taWxsaXNlY29uZHNUb1NlY29uZHMob3B0aW9ucy52ZWxvY2l0eSB8fCAwKVxuICB9KTtcbiAgY29uc3QgaW5pdGlhbFZlbG9jaXR5ID0gdmVsb2NpdHkgfHwgMDtcbiAgY29uc3QgZGFtcGluZ1JhdGlvID0gZGFtcGluZyAvICgyICogTWF0aC5zcXJ0KHN0aWZmbmVzcyAqIG1hc3MpKTtcbiAgY29uc3QgaW5pdGlhbERlbHRhID0gdGFyZ2V0IC0gb3JpZ2luO1xuICBjb25zdCB1bmRhbXBlZEFuZ3VsYXJGcmVxID0gbWlsbGlzZWNvbmRzVG9TZWNvbmRzKE1hdGguc3FydChzdGlmZm5lc3MgLyBtYXNzKSk7XG4gIGNvbnN0IGlzR3JhbnVsYXJTY2FsZSA9IE1hdGguYWJzKGluaXRpYWxEZWx0YSkgPCA1O1xuICByZXN0U3BlZWQgfHwgKHJlc3RTcGVlZCA9IGlzR3JhbnVsYXJTY2FsZSA/IHNwcmluZ0RlZmF1bHRzLnJlc3RTcGVlZC5ncmFudWxhciA6IHNwcmluZ0RlZmF1bHRzLnJlc3RTcGVlZC5kZWZhdWx0KTtcbiAgcmVzdERlbHRhIHx8IChyZXN0RGVsdGEgPSBpc0dyYW51bGFyU2NhbGUgPyBzcHJpbmdEZWZhdWx0cy5yZXN0RGVsdGEuZ3JhbnVsYXIgOiBzcHJpbmdEZWZhdWx0cy5yZXN0RGVsdGEuZGVmYXVsdCk7XG4gIGxldCByZXNvbHZlU3ByaW5nO1xuICBpZiAoZGFtcGluZ1JhdGlvIDwgMSkge1xuICAgIGNvbnN0IGFuZ3VsYXJGcmVxID0gY2FsY0FuZ3VsYXJGcmVxKHVuZGFtcGVkQW5ndWxhckZyZXEsIGRhbXBpbmdSYXRpbyk7XG4gICAgcmVzb2x2ZVNwcmluZyA9ICh0KSA9PiB7XG4gICAgICBjb25zdCBlbnZlbG9wZSA9IE1hdGguZXhwKC1kYW1waW5nUmF0aW8gKiB1bmRhbXBlZEFuZ3VsYXJGcmVxICogdCk7XG4gICAgICByZXR1cm4gdGFyZ2V0IC0gZW52ZWxvcGUgKiAoKGluaXRpYWxWZWxvY2l0eSArIGRhbXBpbmdSYXRpbyAqIHVuZGFtcGVkQW5ndWxhckZyZXEgKiBpbml0aWFsRGVsdGEpIC8gYW5ndWxhckZyZXEgKiBNYXRoLnNpbihhbmd1bGFyRnJlcSAqIHQpICsgaW5pdGlhbERlbHRhICogTWF0aC5jb3MoYW5ndWxhckZyZXEgKiB0KSk7XG4gICAgfTtcbiAgfSBlbHNlIGlmIChkYW1waW5nUmF0aW8gPT09IDEpIHtcbiAgICByZXNvbHZlU3ByaW5nID0gKHQpID0+IHRhcmdldCAtIE1hdGguZXhwKC11bmRhbXBlZEFuZ3VsYXJGcmVxICogdCkgKiAoaW5pdGlhbERlbHRhICsgKGluaXRpYWxWZWxvY2l0eSArIHVuZGFtcGVkQW5ndWxhckZyZXEgKiBpbml0aWFsRGVsdGEpICogdCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZGFtcGVkQW5ndWxhckZyZXEgPSB1bmRhbXBlZEFuZ3VsYXJGcmVxICogTWF0aC5zcXJ0KGRhbXBpbmdSYXRpbyAqIGRhbXBpbmdSYXRpbyAtIDEpO1xuICAgIHJlc29sdmVTcHJpbmcgPSAodCkgPT4ge1xuICAgICAgY29uc3QgZW52ZWxvcGUgPSBNYXRoLmV4cCgtZGFtcGluZ1JhdGlvICogdW5kYW1wZWRBbmd1bGFyRnJlcSAqIHQpO1xuICAgICAgY29uc3QgZnJlcUZvclQgPSBNYXRoLm1pbihkYW1wZWRBbmd1bGFyRnJlcSAqIHQsIDMwMCk7XG4gICAgICByZXR1cm4gdGFyZ2V0IC0gZW52ZWxvcGUgKiAoKGluaXRpYWxWZWxvY2l0eSArIGRhbXBpbmdSYXRpbyAqIHVuZGFtcGVkQW5ndWxhckZyZXEgKiBpbml0aWFsRGVsdGEpICogTWF0aC5zaW5oKGZyZXFGb3JUKSArIGRhbXBlZEFuZ3VsYXJGcmVxICogaW5pdGlhbERlbHRhICogTWF0aC5jb3NoKGZyZXFGb3JUKSkgLyBkYW1wZWRBbmd1bGFyRnJlcTtcbiAgICB9O1xuICB9XG4gIGNvbnN0IGdlbmVyYXRvciA9IHtcbiAgICBjYWxjdWxhdGVkRHVyYXRpb246IGlzUmVzb2x2ZWRGcm9tRHVyYXRpb24gPyBkdXJhdGlvbiB8fCBudWxsIDogbnVsbCxcbiAgICBuZXh0OiAodCkgPT4ge1xuICAgICAgY29uc3QgY3VycmVudCA9IHJlc29sdmVTcHJpbmcodCk7XG4gICAgICBpZiAoIWlzUmVzb2x2ZWRGcm9tRHVyYXRpb24pIHtcbiAgICAgICAgbGV0IGN1cnJlbnRWZWxvY2l0eSA9IDA7XG4gICAgICAgIGlmIChkYW1waW5nUmF0aW8gPCAxKSB7XG4gICAgICAgICAgY3VycmVudFZlbG9jaXR5ID0gdCA9PT0gMCA/IHNlY29uZHNUb01pbGxpc2Vjb25kcyhpbml0aWFsVmVsb2NpdHkpIDogY2FsY0dlbmVyYXRvclZlbG9jaXR5KHJlc29sdmVTcHJpbmcsIHQsIGN1cnJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzQmVsb3dWZWxvY2l0eVRocmVzaG9sZCA9IE1hdGguYWJzKGN1cnJlbnRWZWxvY2l0eSkgPD0gcmVzdFNwZWVkO1xuICAgICAgICBjb25zdCBpc0JlbG93RGlzcGxhY2VtZW50VGhyZXNob2xkID0gTWF0aC5hYnModGFyZ2V0IC0gY3VycmVudCkgPD0gcmVzdERlbHRhO1xuICAgICAgICBzdGF0ZTIuZG9uZSA9IGlzQmVsb3dWZWxvY2l0eVRocmVzaG9sZCAmJiBpc0JlbG93RGlzcGxhY2VtZW50VGhyZXNob2xkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RhdGUyLmRvbmUgPSB0ID49IGR1cmF0aW9uO1xuICAgICAgfVxuICAgICAgc3RhdGUyLnZhbHVlID0gc3RhdGUyLmRvbmUgPyB0YXJnZXQgOiBjdXJyZW50O1xuICAgICAgcmV0dXJuIHN0YXRlMjtcbiAgICB9LFxuICAgIHRv
10617U3RyaW5nOiAoKSA9PiB7XG4gICAgICBjb25zdCBjYWxjdWxhdGVkRHVyYXRpb24gPSBNYXRoLm1pbihjYWxjR2VuZXJhdG9yRHVyYXRpb24oZ2VuZXJhdG9yKSwgbWF4R2VuZXJhdG9yRHVyYXRpb24pO1xuICAgICAgY29uc3QgZWFzaW5nID0gZ2VuZXJhdGVMaW5lYXJFYXNpbmcoKHByb2dyZXNzMikgPT4gZ2VuZXJhdG9yLm5leHQoY2FsY3VsYXRlZER1cmF0aW9uICogcHJvZ3Jlc3MyKS52YWx1ZSwgY2FsY3VsYXRlZER1cmF0aW9uLCAzMCk7XG4gICAgICByZXR1cm4gY2FsY3VsYXRlZER1cmF0aW9uICsgXCJtcyBcIiArIGVhc2luZztcbiAgICB9XG4gIH07XG4gIHJldHVybiBnZW5lcmF0b3I7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9nZW5lcmF0b3JzL2luZXJ0aWEubWpzXG5mdW5jdGlvbiBpbmVydGlhKHsga2V5ZnJhbWVzOiBrZXlmcmFtZXMyLCB2ZWxvY2l0eSA9IDAsIHBvd2VyID0gMC44LCB0aW1lQ29uc3RhbnQgPSAzMjUsIGJvdW5jZURhbXBpbmcgPSAxMCwgYm91bmNlU3RpZmZuZXNzID0gNTAwLCBtb2RpZnlUYXJnZXQsIG1pbiwgbWF4LCByZXN0RGVsdGEgPSAwLjUsIHJlc3RTcGVlZCB9KSB7XG4gIGNvbnN0IG9yaWdpbiA9IGtleWZyYW1lczJbMF07XG4gIGNvbnN0IHN0YXRlMiA9IHtcbiAgICBkb25lOiBmYWxzZSxcbiAgICB2YWx1ZTogb3JpZ2luXG4gIH07XG4gIGNvbnN0IGlzT3V0T2ZCb3VuZHMgPSAodikgPT4gbWluICE9PSB2b2lkIDAgJiYgdiA8IG1pbiB8fCBtYXggIT09IHZvaWQgMCAmJiB2ID4gbWF4O1xuICBjb25zdCBuZWFyZXN0Qm91bmRhcnkgPSAodikgPT4ge1xuICAgIGlmIChtaW4gPT09IHZvaWQgMClcbiAgICAgIHJldHVybiBtYXg7XG4gICAgaWYgKG1heCA9PT0gdm9pZCAwKVxuICAgICAgcmV0dXJuIG1pbjtcbiAgICByZXR1cm4gTWF0aC5hYnMobWluIC0gdikgPCBNYXRoLmFicyhtYXggLSB2KSA/IG1pbiA6IG1heDtcbiAgfTtcbiAgbGV0IGFtcGxpdHVkZSA9IHBvd2VyICogdmVsb2NpdHk7XG4gIGNvbnN0IGlkZWFsID0gb3JpZ2luICsgYW1wbGl0dWRlO1xuICBjb25zdCB0YXJnZXQgPSBtb2RpZnlUYXJnZXQgPT09IHZvaWQgMCA/IGlkZWFsIDogbW9kaWZ5VGFyZ2V0KGlkZWFsKTtcbiAgaWYgKHRhcmdldCAhPT0gaWRlYWwpXG4gICAgYW1wbGl0dWRlID0gdGFyZ2V0IC0gb3JpZ2luO1xuICBjb25zdCBjYWxjRGVsdGEgPSAodCkgPT4gLWFtcGxpdHVkZSAqIE1hdGguZXhwKC10IC8gdGltZUNvbnN0YW50KTtcbiAgY29uc3QgY2FsY0xhdGVzdCA9ICh0KSA9PiB0YXJnZXQgKyBjYWxjRGVsdGEodCk7XG4gIGNvbnN0IGFwcGx5RnJpY3Rpb24gPSAodCkgPT4ge1xuICAgIGNvbnN0IGRlbHRhID0gY2FsY0RlbHRhKHQpO1xuICAgIGNvbnN0IGxhdGVzdCA9IGNhbGNMYXRlc3QodCk7XG4gICAgc3RhdGUyLmRvbmUgPSBNYXRoLmFicyhkZWx0YSkgPD0gcmVzdERlbHRhO1xuICAgIHN0YXRlMi52YWx1ZSA9IHN0YXRlMi5kb25lID8gdGFyZ2V0IDogbGF0ZXN0O1xuICB9O1xuICBsZXQgdGltZVJlYWNoZWRCb3VuZGFyeTtcbiAgbGV0IHNwcmluZyQxO1xuICBjb25zdCBjaGVja0NhdGNoQm91bmRhcnkgPSAodCkgPT4ge1xuICAgIGlmICghaXNPdXRPZkJvdW5kcyhzdGF0ZTIudmFsdWUpKVxuICAgICAgcmV0dXJuO1xuICAgIHRpbWVSZWFjaGVkQm91bmRhcnkgPSB0O1xuICAgIHNwcmluZyQxID0gc3ByaW5nKHtcbiAgICAgIGtleWZyYW1lczogW3N0YXRlMi52YWx1ZSwgbmVhcmVzdEJvdW5kYXJ5KHN0YXRlMi52YWx1ZSldLFxuICAgICAgdmVsb2NpdHk6IGNhbGNHZW5lcmF0b3JWZWxvY2l0eShjYWxjTGF0ZXN0LCB0LCBzdGF0ZTIudmFsdWUpLFxuICAgICAgLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgcGFzc2luZyAqIDEwMDBcbiAgICAgIGRhbXBpbmc6IGJvdW5jZURhbXBpbmcsXG4gICAgICBzdGlmZm5lc3M6IGJvdW5jZVN0aWZmbmVzcyxcbiAgICAgIHJlc3REZWx0YSxcbiAgICAgIHJlc3RTcGVlZFxuICAgIH0pO1xuICB9O1xuICBjaGVja0NhdGNoQm91bmRhcnkoMCk7XG4gIHJldHVybiB7XG4gICAgY2FsY3VsYXRlZER1cmF0aW9uOiBudWxsLFxuICAgIG5leHQ6ICh0KSA9PiB7XG4gICAgICBsZXQgaGFzVXBkYXRlZEZyYW1lID0gZmFsc2U7XG4gICAgICBpZiAoIXNwcmluZyQxICYmIHRpbWVSZWFjaGVkQm91bmRhcnkgPT09IHZvaWQgMCkge1xuICAgICAgICBoYXNVcGRhdGVkRnJhbWUgPSB0cnVlO1xuICAgICAgICBhcHBseUZyaWN0aW9uKHQpO1xuICAgICAgICBjaGVja0NhdGNoQm91bmRhcnkodCk7XG4gICAgICB9XG4gICAgICBpZiAodGltZVJlYWNoZWRCb3VuZGFyeSAhPT0gdm9pZCAwICYmIHQgPj0gdGltZVJlYWNoZWRCb3VuZGFyeSkge1xuICAgICAgICByZXR1cm4gc3ByaW5nJDEubmV4dCh0IC0gdGltZVJlYWNoZWRCb3VuZGFyeSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAhaGFzVXBkYXRlZEZyYW1lICYmIGFwcGx5RnJpY3Rpb24odCk7XG4gICAgICAgIHJldHVybiBzdGF0ZTI7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vZ2VuZXJhdG9ycy9rZXlmcmFtZXMubWpzXG52YXIgaW1wb3J0X2Rpc3Q1ODkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDU5MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDU5MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvZWFzaW5nL2Vhc2UubWpzXG52YXIgaW1wb3J0X2Rpc3Q1NjggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDU2OSA9I
10617F9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDU3MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBlYXNlSW4gPSBjdWJpY0JlemllcigwLjQyLCAwLCAxLCAxKTtcbnZhciBlYXNlT3V0ID0gY3ViaWNCZXppZXIoMCwgMCwgMC41OCwgMSk7XG52YXIgZWFzZUluT3V0ID0gY3ViaWNCZXppZXIoMC40MiwgMCwgMC41OCwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2Vhc2luZy91dGlscy9pcy1lYXNpbmctYXJyYXkubWpzXG52YXIgaW1wb3J0X2Rpc3Q1NzEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDU3MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDU3MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpc0Vhc2luZ0FycmF5ID0gKGVhc2UyKSA9PiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGVhc2UyKSAmJiB0eXBlb2YgZWFzZTJbMF0gIT09IFwibnVtYmVyXCI7XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9lYXNpbmcvdXRpbHMvbWFwLm1qc1xudmFyIGltcG9ydF9kaXN0NTc0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1NzUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1NzYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgZWFzaW5nTG9va3VwID0ge1xuICBsaW5lYXI6IG5vb3AsXG4gIGVhc2VJbixcbiAgZWFzZUluT3V0LFxuICBlYXNlT3V0LFxuICBjaXJjSW4sXG4gIGNpcmNJbk91dCxcbiAgY2lyY091dCxcbiAgYmFja0luLFxuICBiYWNrSW5PdXQsXG4gIGJhY2tPdXQsXG4gIGFudGljaXBhdGVcbn07XG52YXIgZWFzaW5nRGVmaW5pdGlvblRvRnVuY3Rpb24gPSAoZGVmaW5pdGlvbikgPT4ge1xuICBpZiAoaXNCZXppZXJEZWZpbml0aW9uKGRlZmluaXRpb24pKSB7XG4gICAgaW52YXJpYW50KGRlZmluaXRpb24ubGVuZ3RoID09PSA0LCBgQ3ViaWMgYmV6aWVyIGFycmF5cyBtdXN0IGNvbnRhaW4gZm91ciBudW1lcmljYWwgdmFsdWVzLmApO1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBkZWZpbml0aW9uO1xuICAgIHJldHVybiBjdWJpY0Jlemllcih4MSwgeTEsIHgyLCB5Mik7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluaXRpb24gPT09IFwic3RyaW5nXCIpIHtcbiAgICBpbnZhcmlhbnQoZWFzaW5nTG9va3VwW2RlZmluaXRpb25dICE9PSB2b2lkIDAsIGBJbnZhbGlkIGVhc2luZyB0eXBlICcke2RlZmluaXRpb259J2ApO1xuICAgIHJldHVybiBlYXNpbmdMb29rdXBbZGVmaW5pdGlvbl07XG4gIH1cbiAgcmV0dXJuIGRlZmluaXRpb247XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy9pbnRlcnBvbGF0ZS5tanNcbnZhciBpbXBvcnRfZGlzdDU3NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTc4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTc5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gY3JlYXRlTWl4ZXJzKG91dHB1dCwgZWFzZTIsIGN1c3RvbU1peGVyKSB7XG4gIGNvbnN0IG1peGVycyA9IFtdO1xuICBjb25zdCBtaXhlckZhY3RvcnkgPSBjdXN0b21NaXhlciB8fCBtaXg7XG4gIGNvbnN0IG51bU1peGVycyA9IG91dHB1dC5sZW5ndGggLSAxO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU1peGVyczsgaSsrKSB7XG4gICAgbGV0IG1peGVyID0gbWl4ZXJGYWN0b3J5KG91dHB1dFtpXSwgb3V0cHV0W2kgKyAxXSk7XG4gICAgaWYgKGVhc2UyKSB7XG4gICAgICBjb25zdCBlYXNpbmdGdW5jdGlvbiA9IEFycmF5LmlzQXJyYXkoZWFzZTIpID8gZWFzZTJbaV0gfHwgbm9vcCA6IGVhc2UyO1xuICAgICAgbWl4ZXIgPSBwaXBlKGVhc2luZ0Z1bmN0aW9uLCBtaXhlcik7XG4gICAgfVxuICAgIG1peGVycy5wdXNoKG1peGVyKTtcbiAgfVxuICByZXR1cm4gbWl4ZXJzO1xufVxuZnVuY3Rpb24gaW50ZXJwb2xhdGUoaW5wdXQsIG91dHB1dCwgeyBjbGFtcDogaXNDbGFtcCA9IHRydWUsIGVhc2U6IGVhc2UyLCBtaXhlciB9ID0ge30pIHtcbiAgY29uc3QgaW5wdXRMZW5ndGggPSBpbnB1dC5sZW5ndGg7XG4gIGludmFyaWFudChpbnB1dExlbmd0aCA9PT0gb3V0cHV0Lmxlbmd0aCwgXCJCb3RoIGlucHV0IGFuZCBvdXRwdXQgcmFuZ2VzIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoXCIpO1xuICBpZiAoaW5wdXRMZW5ndGggPT09IDEpXG4gICAgcmV0dXJuICgpID0+IG91dHB1dFswXTtcbiAgaWYgKGlucHV0TGVuZ3RoID09PSAyICYmIG91dHB1dFswXSA9PT0gb3V0cHV0WzFdKVxuICAgIHJldHVybiAoKSA9PiBvdXRwdXRbMV07XG4gIGNvbnN0IGlzWmVyb0RlbHRhUmFuZ2UgPSBpbnB1dFswXSA9PT0gaW5wdXRbMV07XG4gIGlmIChpbnB1dFswXSA+IGlucHV0W2lucHV0TGVuZ3RoIC0gMV0pIHtcbiAgICBpbnB1dCA9IFsuLi5pbnB1dF0ucmV2ZXJzZSgpO1xuICAgIG91dHB1dCA9IFsuLi5vdXRwdXRdLnJldmVyc2UoKTtcbiAgfVxuICBjb25zdCBtaXhlcnMgPSBjcmVhdGVNaXhlcnMob3V0cHV0LCBlYXNlMiwgbWl4ZXIpO1xuICBjb25zdCBudW1NaXhlcnMgPSBtaXhlcnMubGVuZ3RoO1xuICBjb25zdCBpbnRlcnBvbGF0b3IgPSAodikgPT4ge1xuICAgIGlmIChpc1plcm9EZWx0YVJhbmdlICYmIHYgPCBpbnB1dFswXSlcbiAgICAgIHJldHVybiBvdXRwdXRbMF07XG4gICAgbGV0IGkgPSAwO1xuICAgIGlmIChudW1NaXhlcnMgPiAxKSB7XG4gICAgICBmb3IgKDsgaSA8IGlucHV0Lmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICBpZiAodiA8IGlucHV0W2kgKyAxXSlcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcHJvZ3Jlc3NJblJhbmdlID0gcHJvZ3Jlc3MoaW5wdXRbaV0sIGlucHV0W2kgKyAxXSwgdik7XG4gICAgcmV0dXJuIG1peGVyc1tpXShwcm9ncmVzc0luUmFuZ2UpO1xuICB9O1xuICByZXR1cm4gaXNDbGFtcCA/ICh2KSA9PiBpbnRlcnBvbGF0b3IoY2xhbXAoaW5wdXRbMF0sIGlucHV0W2lucHV0TGVuZ3RoIC0gMV0sIHYpKSA6IGludGVycG9sYXRvcjtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvb2Zmc2V0cy9kZWZhdWx0Lm1qc1xudmFyIGltcG9ydF9kaXN0NTgzID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1ODQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1ODUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3V0aWxzL29mZnNldHMvZmlsbC5tanNcbnZhciBpbXBvcnRfZGlzdDU4MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTgxID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0NTgyID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gZmlsbE9mZnNldChvZmZzZXQsIHJlbWFpbmluZykge1xuICBjb25zdCBtaW4gPSBvZmZzZXRbb2Zmc2V0Lmxlbmd0aCAtIDFdO1xuICBmb3IgKGxldCBpID0gMTsgaSA8PSByZW1haW5pbmc7IGkrKykge1xuICAgIGNvbnN0IG9mZnNldFByb2dyZXNzID0gcHJvZ3Jlc3MoMCwgcmVtYWluaW5nLCBpKTtcbiAgICBvZmZzZXQucHVzaChtaXhOdW1iZXIobWluLCAxLCBvZmZzZXRQcm9ncmVzcykpO1xuICB9XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3V0aWxzL29mZnNldHMvZGVmYXVsdC5tanNcbmZ1bmN0aW9uIGRlZmF1bHRPZmZzZXQoYXJyKSB7XG4gIGNvbnN0IG9mZnNldCA9IFswXTtcbiAgZmlsbE9mZnNldChvZmZzZXQsIGFyci5sZW5ndGggLSAxKTtcbiAgcmV0dXJuIG9mZnNldDtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvb2Zmc2V0cy90aW1lLm1qc1xudmFyIGltcG9ydF9kaXN0NTg2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1ODcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q1ODggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBjb252ZXJ0T2Zmc2V0VG9UaW1lcyhvZmZzZXQsIGR1cmF0aW9uKSB7XG4gIHJldHVybiBvZmZzZXQubWFwKChvKSA9PiBvICogZHVyYXRpb24pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vZ2VuZXJhdG9ycy9rZXlmcmFtZXMubWpzXG5mdW5jdGlvbiBkZWZhdWx0RWFzaW5nKHZhbHVlcywgZWFzaW5nKSB7XG4gIHJldHVybiB2YWx1ZXMubWFwKCgpID0+IGVhc2luZyB8fCBlYXNlSW5PdXQpLnNwbGljZSgwLCB2YWx1ZXMubGVuZ3RoIC0gMSk7XG59XG5mdW5jdGlvbiBrZXlmcmFtZXMoeyBkdXJhdGlvbiA9IDMwMCwga2V5ZnJhbWVzOiBrZXlmcmFtZVZhbHVlcywgdGltZXMsIGVhc2U6IGVhc2UyID0gXCJlYXNlSW5PdXRcIiB9KSB7XG4gIGNvbnN0IGVhc2luZ0Z1bmN0aW9ucyA9IGlzRWFzaW5nQXJyYXkoZWFzZTIpID8gZWFzZTIubWFwKGVhc2luZ0RlZmluaXRpb25Ub0Z1bmN0aW9uKSA6IGVhc2luZ0RlZmluaXRpb25Ub0Z1bmN0aW9uKGVhc2UyKTtcbiAgY29uc3Qgc3RhdGUyID0ge1xuICAgIGRvbmU6IGZhbHNlLFxuICAgIHZhbHVlOiBrZXlmcmFtZVZhbHVlc1swXVxuICB9O1xuICBjb25zdCBhYnNvbHV0ZVRpbWVzID0gY29udmVydE9mZnNldFRvVGltZXMoXG4gICAgLy8gT25seSB1c2UgdGhlIHByb3ZpZGVkIG9mZnNldHMgaWYgdGhleSdyZSB0aGUgY29ycmVjdCBsZW5ndGhcbiAgICAvLyBUT0RPIE1heWJlIHdlIHNob3VsZCB3YXJuIGhlcmUgaWYgdGhlcmUncyBhIGxlbmd0aCBtaXNtYXRjaFxuICAgIHRpbWVzICYmIHRpbWVzLmxlbmd0aCA9PT0ga2V5ZnJhbWVWYWx1ZXMubGVuZ3RoID8gdGltZXMgOiBkZWZhdWx0T2Zmc2V0KGtleWZyYW1lVmFsdWVzKSxcbiAgICBkdXJhdGlvblxuICApO1xuICBjb25zdCBtYXBUaW1lVG9LZXlmcmFtZSA9IGludGVycG9sYXRlKGFic29sdXRlVGltZXMsIGtleWZyYW1lVmFsdWVzLCB7XG4gICAgZWFzZTogQXJyYXkuaXNBcnJheShlYXNpbmdGdW5jdGlvbnMpID8gZWFzaW5nRnVuY3Rpb25zIDogZGVmYXVsdEVhc2luZyhrZXlmcmFtZVZhbHVlcywgZWFzaW5nRnVuY3Rpb25zKVxuICB9KTtcbiAgcmV0dXJuIHtcbiAgICBjYWxjdWxhdGVkRHVyYXRpb246IGR1cmF0aW9uLFxuICAgIG5leHQ6ICh0KSA9PiB7XG4gICAgICBzdGF0ZTIudmFsdWUgPSBtYXBUaW1lVG9LZXlmcmFtZSh0KTtcbiAgICAgIHN0YXRlMi5kb25lID0gdCA+PSBkdXJhdGlvbjtcbiAgICAgIHJldHVybiBzdGF0ZTI7XG4gICAgfVxuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vYW5pbWF0b3JzL2RyaXZlcnMvZHJpdmVyLWZyYW1lbG9vcC5tanNcbnZhciBpbXBvcnRfZGlzdDU5MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTkzID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTk0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGZyYW1lbG9vcERyaXZlciA9ICh1cGRhdGUpID0+IHtcbiAgY29uc3QgcGFzc1RpbWVzdGFtcCA9ICh7IHRpbWVzdGFtcCB9KSA9PiB1cGRhdGUodGltZXN0YW1wKTtcbiAgcmV0dXJuIHtcbiAgICBzdGFydDogKCkgPT4gZnJhbWUudXBkYXRlKHBhc3NUaW1lc3RhbXAsIHRydWUpLFxuICAgIHN0b3A6ICgpID0+IGNhbmNlbEZyYW1lKHBhc3NUaW1lc3RhbXApLFxuICAgIC8qKlxuICAgICAqIElmIHdlJ3JlIHByb2Nlc3NpbmcgdGhpcyBmcmFtZSB3ZSBjYW4gdXNlIHRoZVxuICAgICAqIGZyYW1lbG9ja2VkIHRpbWVzdGFtcCB0byBrZWVwIHRoaW5ncyBpbiBzeW5jLlxuICAgICAqL1xuICAgIG5vdzogKCkgPT4gZnJhbWVEYXRhLmlzUHJvY2Vzc2luZyA/IGZyYW1lRGF0YS50aW1lc3RhbXAgOiB0aW1lLm5vdygpXG4gIH07XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vYW5pbWF0b3JzL01haW5UaHJlYWRBbmltYXRpb24ubWpzXG52YXIgZ2VuZXJhdG9ycyA9IHtcbiAgZGVjYXk6IGluZXJ0aWEsXG4gIGluZXJ0aWEsXG4gIHR3ZWVuOiBrZXlmcmFtZXMsXG4gIGtleWZyYW1lcyxcbiAgc3ByaW5nXG59O1xudmFyIHBlcmNlbnRUb1Byb2dyZXNzID0gKHBlcmNlbnQyKSA9PiBwZXJjZW50MiAvIDEwMDtcbnZhciBNYWluVGhyZWFkQW5pbWF0aW9uID0gY2xhc3MgZXh0ZW5kcyBCYXNlQW5pbWF0aW9uIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHN1cGVyKG9wdGlvbnMpO1xuICAgIHRoaXMuaG9sZFRpbWUgPSBudWxsO1xuICAgIHRoaXMuY2FuY2VsVGltZSA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50VGltZSA9IDA7XG4gICAgdGhpcy5wbGF5YmFja1NwZWVkID0gMTtcbiAgICB0aGlzLnBlbmRpbmdQbGF5U3RhdGUgPSBcInJ1bm5pbmdcIjtcbiAgICB0aGlzLnN0YXJ0VGltZSA9IG51bGw7XG4gICAgdGhpcy5zdGF0ZSA9IFwiaWRsZVwiO1xuICAgIHRoaXMuc3RvcCA9ICgpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZXIuY2FuY2VsKCk7XG4gICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7XG4gICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gXCJpZGxlXCIpXG4gICAgICAgI
10617HJldHVybjtcbiAgICAgIHRoaXMudGVhcmRvd24oKTtcbiAgICAgIGNvbnN0IHsgb25TdG9wIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICBvblN0b3AgJiYgb25TdG9wKCk7XG4gICAgfTtcbiAgICBjb25zdCB7IG5hbWUsIG1vdGlvblZhbHVlOiBtb3Rpb25WYWx1ZTIsIGVsZW1lbnQsIGtleWZyYW1lczoga2V5ZnJhbWVzMiB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IEtleWZyYW1lUmVzb2x2ZXIkMSA9IChlbGVtZW50ID09PSBudWxsIHx8IGVsZW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsZW1lbnQuS2V5ZnJhbWVSZXNvbHZlcikgfHwgS2V5ZnJhbWVSZXNvbHZlcjtcbiAgICBjb25zdCBvblJlc29sdmVkID0gKHJlc29sdmVkS2V5ZnJhbWVzLCBmaW5hbEtleWZyYW1lKSA9PiB0aGlzLm9uS2V5ZnJhbWVzUmVzb2x2ZWQocmVzb2x2ZWRLZXlmcmFtZXMsIGZpbmFsS2V5ZnJhbWUpO1xuICAgIHRoaXMucmVzb2x2ZXIgPSBuZXcgS2V5ZnJhbWVSZXNvbHZlciQxKGtleWZyYW1lczIsIG9uUmVzb2x2ZWQsIG5hbWUsIG1vdGlvblZhbHVlMiwgZWxlbWVudCk7XG4gICAgdGhpcy5yZXNvbHZlci5zY2hlZHVsZVJlc29sdmUoKTtcbiAgfVxuICBmbGF0dGVuKCkge1xuICAgIHN1cGVyLmZsYXR0ZW4oKTtcbiAgICBpZiAodGhpcy5fcmVzb2x2ZWQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24odGhpcy5fcmVzb2x2ZWQsIHRoaXMuaW5pdFBsYXliYWNrKHRoaXMuX3Jlc29sdmVkLmtleWZyYW1lcykpO1xuICAgIH1cbiAgfVxuICBpbml0UGxheWJhY2soa2V5ZnJhbWVzJDEpIHtcbiAgICBjb25zdCB7IHR5cGUgPSBcImtleWZyYW1lc1wiLCByZXBlYXQgPSAwLCByZXBlYXREZWxheSA9IDAsIHJlcGVhdFR5cGUsIHZlbG9jaXR5ID0gMCB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IGdlbmVyYXRvckZhY3RvcnkgPSBpc0dlbmVyYXRvcih0eXBlKSA/IHR5cGUgOiBnZW5lcmF0b3JzW3R5cGVdIHx8IGtleWZyYW1lcztcbiAgICBsZXQgbWFwUGVyY2VudFRvS2V5ZnJhbWVzO1xuICAgIGxldCBtaXJyb3JlZEdlbmVyYXRvcjtcbiAgICBpZiAoZ2VuZXJhdG9yRmFjdG9yeSAhPT0ga2V5ZnJhbWVzICYmIHR5cGVvZiBrZXlmcmFtZXMkMVswXSAhPT0gXCJudW1iZXJcIikge1xuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBpbnZhcmlhbnQoa2V5ZnJhbWVzJDEubGVuZ3RoID09PSAyLCBgT25seSB0d28ga2V5ZnJhbWVzIGN1cnJlbnRseSBzdXBwb3J0ZWQgd2l0aCBzcHJpbmcgYW5kIGluZXJ0aWEgYW5pbWF0aW9ucy4gVHJ5aW5nIHRvIGFuaW1hdGUgJHtrZXlmcmFtZXMkMX1gKTtcbiAgICAgIH1cbiAgICAgIG1hcFBlcmNlbnRUb0tleWZyYW1lcyA9IHBpcGUocGVyY2VudFRvUHJvZ3Jlc3MsIG1peChrZXlmcmFtZXMkMVswXSwga2V5ZnJhbWVzJDFbMV0pKTtcbiAgICAgIGtleWZyYW1lcyQxID0gWzAsIDEwMF07XG4gICAgfVxuICAgIGNvbnN0IGdlbmVyYXRvciA9IGdlbmVyYXRvckZhY3RvcnkoeyAuLi50aGlzLm9wdGlvbnMsIGtleWZyYW1lczoga2V5ZnJhbWVzJDEgfSk7XG4gICAgaWYgKHJlcGVhdFR5cGUgPT09IFwibWlycm9yXCIpIHtcbiAgICAgIG1pcnJvcmVkR2VuZXJhdG9yID0gZ2VuZXJhdG9yRmFjdG9yeSh7XG4gICAgICAgIC4uLnRoaXMub3B0aW9ucyxcbiAgICAgICAga2V5ZnJhbWVzOiBbLi4ua2V5ZnJhbWVzJDFdLnJldmVyc2UoKSxcbiAgICAgICAgdmVsb2NpdHk6IC12ZWxvY2l0eVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmIChnZW5lcmF0b3IuY2FsY3VsYXRlZER1cmF0aW9uID09PSBudWxsKSB7XG4gICAgICBnZW5lcmF0b3IuY2FsY3VsYXRlZER1cmF0aW9uID0gY2FsY0dlbmVyYXRvckR1cmF0aW9uKGdlbmVyYXRvcik7XG4gICAgfVxuICAgIGNvbnN0IHsgY2FsY3VsYXRlZER1cmF0aW9uIH0gPSBnZW5lcmF0b3I7XG4gICAgY29uc3QgcmVzb2x2ZWREdXJhdGlvbiA9IGNhbGN1bGF0ZWREdXJhdGlvbiArIHJlcGVhdERlbGF5O1xuICAgIGNvbnN0IHRvdGFsRHVyYXRpb24gPSByZXNvbHZlZER1cmF0aW9uICogKHJlcGVhdCArIDEpIC0gcmVwZWF0RGVsYXk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdlbmVyYXRvcixcbiAgICAgIG1pcnJvcmVkR2VuZXJhdG9yLFxuICAgICAgbWFwUGVyY2VudFRvS2V5ZnJhbWVzLFxuICAgICAgY2FsY3VsYXRlZER1cmF0aW9uLFxuICAgICAgcmVzb2x2ZWREdXJhdGlvbixcbiAgICAgIHRvdGFsRHVyYXRpb25cbiAgICB9O1xuICB9XG4gIG9uUG9zdFJlc29sdmVkKCkge1xuICAgIGNvbnN0IHsgYXV0b3BsYXkgPSB0cnVlIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgdGhpcy5wbGF5KCk7XG4gICAgaWYgKHRoaXMucGVuZGluZ1BsYXlTdGF0ZSA9PT0gXCJwYXVzZWRcIiB8fCAhYXV0b3BsYXkpIHtcbiAgICAgIHRoaXMucGF1c2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMucGVuZGluZ1BsYXlTdGF0ZTtcbiAgICB9XG4gIH1cbiAgdGljayh0aW1lc3RhbXAsIHNhbXBsZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgeyByZXNvbHZlZCB9ID0gdGhpcztcbiAgICBpZiAoIXJlc29sdmVkKSB7XG4gICAgICBjb25zdCB7IGtleWZyYW1lczoga2V5ZnJhbWVzMyB9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IGtleWZyYW1lczNba2V5ZnJhbWVzMy5sZW5ndGggLSAxXSB9O1xuICAgIH1cbiAgICBjb25zdCB7IGZpbmFsS2V5ZnJhbWUsIGdlbmVyYXRvciwgbWlycm9yZWRHZW5lcmF0b3IsIG1hcFBlcmNlbnRUb0tleWZyYW1lcywga2V5ZnJhbWVzOiBrZXlmcmFtZXMyLCBjYWxjdWxhdGVkRHVyYXRpb24sIHRvdGFsRHVyYXRpb24sIHJlc29sdmVkRHVyYXRpb24gfSA9IHJlc29sdmVkO1xuICAgIGlmICh0aGlzLnN0YXJ0VGltZSA9PT0gbnVsbClcbiAgICAgIHJldHVybiBnZW5lcmF0b3IubmV4dCgwKTtcbiAgICBjb25zdCB7IGRlbGF5OiBkZWxheTIsIHJlcGVhdCwgcmVwZWF0VHlwZSwgcmVwZWF0RGVsYXksIG9uVXBkYXRlIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgaWYgKHRoaXMuc3BlZWQgPiAwKSB7XG4gICAgICB0aGlzLnN0YXJ0VGltZSA9IE1hdGgubWluKHRoaXMuc3RhcnRUaW1lLCB0aW1lc3RhbXApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zcGVlZCA8IDApIHtcbiAgICAgIHRoaXMuc3RhcnRUaW1lID0gTWF0aC5taW4odGltZXN0YW1wIC0gdG90YWxEdXJhdGlvbiAvIHRoaXMuc3BlZWQsIHRoaXMuc3RhcnRUaW1lKTtcbiAgICB9XG4gICAgaWYgKHNhbXBsZSkge1xuICAgICAgdGhpcy5jdXJyZW50VGltZSA9IHRpbWVzdGFtcDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaG9sZFRpbWUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuY3VycmVudFRpbWUgPSB0aGlzLmhvbGRUaW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmN1cnJlbnRUaW1lID0gTWF0aC5yb3VuZCh0aW1lc3RhbXAgLSB0aGlzLnN0YXJ0VGltZSkgKiB0aGlzLnNwZWVkO1xuICAgIH1cbiAgICBjb25zdCB0aW1lV2l0aG91dERlbGF5ID0gdGh
10617pcy5jdXJyZW50VGltZSAtIGRlbGF5MiAqICh0aGlzLnNwZWVkID49IDAgPyAxIDogLTEpO1xuICAgIGNvbnN0IGlzSW5EZWxheVBoYXNlID0gdGhpcy5zcGVlZCA+PSAwID8gdGltZVdpdGhvdXREZWxheSA8IDAgOiB0aW1lV2l0aG91dERlbGF5ID4gdG90YWxEdXJhdGlvbjtcbiAgICB0aGlzLmN1cnJlbnRUaW1lID0gTWF0aC5tYXgodGltZVdpdGhvdXREZWxheSwgMCk7XG4gICAgaWYgKHRoaXMuc3RhdGUgPT09IFwiZmluaXNoZWRcIiAmJiB0aGlzLmhvbGRUaW1lID09PSBudWxsKSB7XG4gICAgICB0aGlzLmN1cnJlbnRUaW1lID0gdG90YWxEdXJhdGlvbjtcbiAgICB9XG4gICAgbGV0IGVsYXBzZWQgPSB0aGlzLmN1cnJlbnRUaW1lO1xuICAgIGxldCBmcmFtZUdlbmVyYXRvciA9IGdlbmVyYXRvcjtcbiAgICBpZiAocmVwZWF0KSB7XG4gICAgICBjb25zdCBwcm9ncmVzczIgPSBNYXRoLm1pbih0aGlzLmN1cnJlbnRUaW1lLCB0b3RhbER1cmF0aW9uKSAvIHJlc29sdmVkRHVyYXRpb247XG4gICAgICBsZXQgY3VycmVudEl0ZXJhdGlvbiA9IE1hdGguZmxvb3IocHJvZ3Jlc3MyKTtcbiAgICAgIGxldCBpdGVyYXRpb25Qcm9ncmVzcyA9IHByb2dyZXNzMiAlIDE7XG4gICAgICBpZiAoIWl0ZXJhdGlvblByb2dyZXNzICYmIHByb2dyZXNzMiA+PSAxKSB7XG4gICAgICAgIGl0ZXJhdGlvblByb2dyZXNzID0gMTtcbiAgICAgIH1cbiAgICAgIGl0ZXJhdGlvblByb2dyZXNzID09PSAxICYmIGN1cnJlbnRJdGVyYXRpb24tLTtcbiAgICAgIGN1cnJlbnRJdGVyYXRpb24gPSBNYXRoLm1pbihjdXJyZW50SXRlcmF0aW9uLCByZXBlYXQgKyAxKTtcbiAgICAgIGNvbnN0IGlzT2RkSXRlcmF0aW9uID0gQm9vbGVhbihjdXJyZW50SXRlcmF0aW9uICUgMik7XG4gICAgICBpZiAoaXNPZGRJdGVyYXRpb24pIHtcbiAgICAgICAgaWYgKHJlcGVhdFR5cGUgPT09IFwicmV2ZXJzZVwiKSB7XG4gICAgICAgICAgaXRlcmF0aW9uUHJvZ3Jlc3MgPSAxIC0gaXRlcmF0aW9uUHJvZ3Jlc3M7XG4gICAgICAgICAgaWYgKHJlcGVhdERlbGF5KSB7XG4gICAgICAgICAgICBpdGVyYXRpb25Qcm9ncmVzcyAtPSByZXBlYXREZWxheSAvIHJlc29sdmVkRHVyYXRpb247XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHJlcGVhdFR5cGUgPT09IFwibWlycm9yXCIpIHtcbiAgICAgICAgICBmcmFtZUdlbmVyYXRvciA9IG1pcnJvcmVkR2VuZXJhdG9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbGFwc2VkID0gY2xhbXAoMCwgMSwgaXRlcmF0aW9uUHJvZ3Jlc3MpICogcmVzb2x2ZWREdXJhdGlvbjtcbiAgICB9XG4gICAgY29uc3Qgc3RhdGUyID0gaXNJbkRlbGF5UGhhc2UgPyB7IGRvbmU6IGZhbHNlLCB2YWx1ZToga2V5ZnJhbWVzMlswXSB9IDogZnJhbWVHZW5lcmF0b3IubmV4dChlbGFwc2VkKTtcbiAgICBpZiAobWFwUGVyY2VudFRvS2V5ZnJhbWVzKSB7XG4gICAgICBzdGF0ZTIudmFsdWUgPSBtYXBQZXJjZW50VG9LZXlmcmFtZXMoc3RhdGUyLnZhbHVlKTtcbiAgICB9XG4gICAgbGV0IHsgZG9uZSB9ID0gc3RhdGUyO1xuICAgIGlmICghaXNJbkRlbGF5UGhhc2UgJiYgY2FsY3VsYXRlZER1cmF0aW9uICE9PSBudWxsKSB7XG4gICAgICBkb25lID0gdGhpcy5zcGVlZCA+PSAwID8gdGhpcy5jdXJyZW50VGltZSA+PSB0b3RhbER1cmF0aW9uIDogdGhpcy5jdXJyZW50VGltZSA8PSAwO1xuICAgIH1cbiAgICBjb25zdCBpc0FuaW1hdGlvbkZpbmlzaGVkID0gdGhpcy5ob2xkVGltZSA9PT0gbnVsbCAmJiAodGhpcy5zdGF0ZSA9PT0gXCJmaW5pc2hlZFwiIHx8IHRoaXMuc3RhdGUgPT09IFwicnVubmluZ1wiICYmIGRvbmUpO1xuICAgIGlmIChpc0FuaW1hdGlvbkZpbmlzaGVkICYmIGZpbmFsS2V5ZnJhbWUgIT09IHZvaWQgMCkge1xuICAgICAgc3RhdGUyLnZhbHVlID0gZ2V0RmluYWxLZXlmcmFtZShrZXlmcmFtZXMyLCB0aGlzLm9wdGlvbnMsIGZpbmFsS2V5ZnJhbWUpO1xuICAgIH1cbiAgICBpZiAob25VcGRhdGUpIHtcbiAgICAgIG9uVXBkYXRlKHN0YXRlMi52YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpc0FuaW1hdGlvbkZpbmlzaGVkKSB7XG4gICAgICB0aGlzLmZpbmlzaCgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RhdGUyO1xuICB9XG4gIGdldCBkdXJhdGlvbigpIHtcbiAgICBjb25zdCB7IHJlc29sdmVkIH0gPSB0aGlzO1xuICAgIHJldHVybiByZXNvbHZlZCA/IG1pbGxpc2Vjb25kc1RvU2Vjb25kcyhyZXNvbHZlZC5jYWxjdWxhdGVkRHVyYXRpb24pIDogMDtcbiAgfVxuICBnZXQgdGltZSgpIHtcbiAgICByZXR1cm4gbWlsbGlzZWNvbmRzVG9TZWNvbmRzKHRoaXMuY3VycmVudFRpbWUpO1xuICB9XG4gIHNldCB0aW1lKG5ld1RpbWUpIHtcbiAgICBuZXdUaW1lID0gc2Vjb25kc1RvTWlsbGlzZWNvbmRzKG5ld1RpbWUpO1xuICAgIHRoaXMuY3VycmVudFRpbWUgPSBuZXdUaW1lO1xuICAgIGlmICh0aGlzLmhvbGRUaW1lICE9PSBudWxsIHx8IHRoaXMuc3BlZWQgPT09IDApIHtcbiAgICAgIHRoaXMuaG9sZFRpbWUgPSBuZXdUaW1lO1xuICAgIH0gZWxzZSBpZiAodGhpcy5kcml2ZXIpIHtcbiAgICAgIHRoaXMuc3RhcnRUaW1lID0gdGhpcy5kcml2ZXIubm93KCkgLSBuZXdUaW1lIC8gdGhpcy5zcGVlZDtcbiAgICB9XG4gIH1cbiAgZ2V0IHNwZWVkKCkge1xuICAgIHJldHVybiB0aGlzLnBsYXliYWNrU3BlZWQ7XG4gIH1cbiAgc2V0IHNwZWVkKG5ld1NwZWVkKSB7XG4gICAgY29uc3QgaGFzQ2hhbmdlZCA9IHRoaXMucGxheWJhY2tTcGVlZCAhPT0gbmV3U3BlZWQ7XG4gICAgdGhpcy5wbGF5YmFja1NwZWVkID0gbmV3U3BlZWQ7XG4gICAgaWYgKGhhc0NoYW5nZWQpIHtcbiAgICAgIHRoaXMudGltZSA9IG1pbGxpc2Vjb25kc1RvU2Vjb25kcyh0aGlzLmN1cnJlbnRUaW1lKTtcbiAgICB9XG4gIH1cbiAgcGxheSgpIHtcbiAgICBpZiAoIXRoaXMucmVzb2x2ZXIuaXNTY2hlZHVsZWQpIHtcbiAgICAgIHRoaXMucmVzb2x2ZXIucmVzdW1lKCk7XG4gICAgfVxuICAgIGlmICghdGhpcy5fcmVzb2x2ZWQpIHtcbiAgICAgIHRoaXMucGVuZGluZ1BsYXlTdGF0ZSA9IFwicnVubmluZ1wiO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1N0b3BwZWQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgeyBkcml2ZXIgPSBmcmFtZWxvb3BEcml2ZXIsIG9uUGxheSwgc3RhcnRUaW1lIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgaWYgKCF0aGlzLmRyaXZlcikge1xuICAgICAgdGhpcy5kcml2ZXIgPSBkcml2ZXIoKHRpbWVzdGFtcCkgPT4gdGhpcy50aWNrKHRpbWVzdGFtcCkpO1xuICAgIH1cbiAgICBvblBsYXkgJiYgb25QbGF5KCk7XG4gICAgY29uc3Qgbm93MiA9IHRoaXMuZHJpdmVyLm5vdygpO1xuICAgIGlmICh0aGlzLmhvbGRUaW1lICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnN0YXJ0VGltZSA9IG5vdzIgLSB0aGlzLmhvbGRUaW1lO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMuc3RhcnRUaW1lKSB7XG4gICAgICB0aGlzLnN0YXJ0VGltZSA9IHN0YXJ0VGltZSAhPT0gbnVsbCAmJiBzdGFydFRpbWUgIT09IHZvaWQgMCA/IHN0YXJ0VGltZSA6IHRoaXMuY2FsY1N0YXJ0VGltZSgpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gXCJmaW5pc2hlZFwiKSB7XG4gICAgICB0aGlzLnN0YXJ0VGltZSA9IG5vdzI7XG4gICAgfVxuICAgIGlmICh0aGlzLnN0YXRlID09PSBcImZpbmlzaGVkXCIpIHtcbiAgICAgIHRoaXMudXBkYXRlRmluaXNoZWRQcm9taXNlKCk7XG4gICAgfVxuICAgIHRoaXMuY2FuY2VsVGltZSA9IHRoaXMuc3RhcnRUaW1lO1xuICAgIHRoaXMuaG9sZFRpbWUgPSBudWxsO1xuICAgIHRoaXMuc3RhdGUgPSBcInJ1bm5pbmdcIjtcbiAgICB0aGlzLmRyaXZlci5zdGFydCgpO1xuICB9XG4gI
10617HBhdXNlKCkge1xuICAgIHZhciBfYTtcbiAgICBpZiAoIXRoaXMuX3Jlc29sdmVkKSB7XG4gICAgICB0aGlzLnBlbmRpbmdQbGF5U3RhdGUgPSBcInBhdXNlZFwiO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlID0gXCJwYXVzZWRcIjtcbiAgICB0aGlzLmhvbGRUaW1lID0gKF9hID0gdGhpcy5jdXJyZW50VGltZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogMDtcbiAgfVxuICBjb21wbGV0ZSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSAhPT0gXCJydW5uaW5nXCIpIHtcbiAgICAgIHRoaXMucGxheSgpO1xuICAgIH1cbiAgICB0aGlzLnBlbmRpbmdQbGF5U3RhdGUgPSB0aGlzLnN0YXRlID0gXCJmaW5pc2hlZFwiO1xuICAgIHRoaXMuaG9sZFRpbWUgPSBudWxsO1xuICB9XG4gIGZpbmlzaCgpIHtcbiAgICB0aGlzLnRlYXJkb3duKCk7XG4gICAgdGhpcy5zdGF0ZSA9IFwiZmluaXNoZWRcIjtcbiAgICBjb25zdCB7IG9uQ29tcGxldGUgfSA9IHRoaXMub3B0aW9ucztcbiAgICBvbkNvbXBsZXRlICYmIG9uQ29tcGxldGUoKTtcbiAgfVxuICBjYW5jZWwoKSB7XG4gICAgaWYgKHRoaXMuY2FuY2VsVGltZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy50aWNrKHRoaXMuY2FuY2VsVGltZSk7XG4gICAgfVxuICAgIHRoaXMudGVhcmRvd24oKTtcbiAgICB0aGlzLnVwZGF0ZUZpbmlzaGVkUHJvbWlzZSgpO1xuICB9XG4gIHRlYXJkb3duKCkge1xuICAgIHRoaXMuc3RhdGUgPSBcImlkbGVcIjtcbiAgICB0aGlzLnN0b3BEcml2ZXIoKTtcbiAgICB0aGlzLnJlc29sdmVGaW5pc2hlZFByb21pc2UoKTtcbiAgICB0aGlzLnVwZGF0ZUZpbmlzaGVkUHJvbWlzZSgpO1xuICAgIHRoaXMuc3RhcnRUaW1lID0gdGhpcy5jYW5jZWxUaW1lID0gbnVsbDtcbiAgICB0aGlzLnJlc29sdmVyLmNhbmNlbCgpO1xuICB9XG4gIHN0b3BEcml2ZXIoKSB7XG4gICAgaWYgKCF0aGlzLmRyaXZlcilcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmRyaXZlci5zdG9wKCk7XG4gICAgdGhpcy5kcml2ZXIgPSB2b2lkIDA7XG4gIH1cbiAgc2FtcGxlKHRpbWUyKSB7XG4gICAgdGhpcy5zdGFydFRpbWUgPSAwO1xuICAgIHJldHVybiB0aGlzLnRpY2sodGltZTIsIHRydWUpO1xuICB9XG59O1xuZnVuY3Rpb24gYW5pbWF0ZVZhbHVlKG9wdGlvbnMpIHtcbiAgcmV0dXJuIG5ldyBNYWluVGhyZWFkQW5pbWF0aW9uKG9wdGlvbnMpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vYW5pbWF0b3JzL3V0aWxzL2FjY2VsZXJhdGVkLXZhbHVlcy5tanNcbnZhciBpbXBvcnRfZGlzdDU5OCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NTk5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjAwID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGFjY2VsZXJhdGVkVmFsdWVzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoW1xuICBcIm9wYWNpdHlcIixcbiAgXCJjbGlwUGF0aFwiLFxuICBcImZpbHRlclwiLFxuICBcInRyYW5zZm9ybVwiXG4gIC8vIFRPRE86IENhbiBiZSBhY2NlbGVyYXRlZCBidXQgY3VycmVudGx5IGRpc2FibGVkIHVudGlsIGh0dHBzOi8vaXNzdWVzLmNocm9taXVtLm9yZy9pc3N1ZXMvNDE0OTEwOTggaXMgcmVzb2x2ZWRcbiAgLy8gb3IgdW50aWwgd2UgaW1wbGVtZW50IHN1cHBvcnQgZm9yIGxpbmVhcigpIGVhc2luZy5cbiAgLy8gXCJiYWNrZ3JvdW5kLWNvbG9yXCJcbl0pO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vYW5pbWF0b3JzL3dhYXBpL2luZGV4Lm1qc1xudmFyIGltcG9ydF9kaXN0NjAxID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q2MDIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q2MDMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBzdGFydFdhYXBpQW5pbWF0aW9uKGVsZW1lbnQsIHZhbHVlTmFtZSwga2V5ZnJhbWVzMiwgeyBkZWxheTogZGVsYXkyID0gMCwgZHVyYXRpb24gPSAzMDAsIHJlcGVhdCA9IDAsIHJlcGVhdFR5cGUgPSBcImxvb3BcIiwgZWFzZTogZWFzZTIgPSBcImVhc2VJbk91dFwiLCB0aW1lcyB9ID0ge30pIHtcbiAgY29uc3Qga2V5ZnJhbWVPcHRpb25zID0geyBbdmFsdWVOYW1lXToga2V5ZnJhbWVzMiB9O1xuICBpZiAodGltZXMpXG4gICAga2V5ZnJhbWVPcHRpb25zLm9mZnNldCA9IHRpbWVzO1xuICBjb25zdCBlYXNpbmcgPSBtYXBFYXNpbmdUb05hdGl2ZUVhc2luZyhlYXNlMiwgZHVyYXRpb24pO1xuICBpZiAoQXJyYXkuaXNBcnJheShlYXNpbmcpKVxuICAgIGtleWZyYW1lT3B0aW9ucy5lYXNpbmcgPSBlYXNpbmc7XG4gIHJldHVybiBlbGVtZW50LmFuaW1hdGUoa2V5ZnJhbWVPcHRpb25zLCB7XG4gICAgZGVsYXk6IGRlbGF5MixcbiAgICBkdXJhdGlvbixcbiAgICBlYXNpbmc6ICFBcnJheS5pc0FycmF5KGVhc2luZykgPyBlYXNpbmcgOiBcImxpbmVhclwiLFxuICAgIGZpbGw6IFwiYm90aFwiLFxuICAgIGl0ZXJhdGlvbnM6IHJlcGVhdCArIDEsXG4gICAgZGlyZWN0aW9uOiByZXBlYXRUeXBlID09PSBcInJldmVyc2VcIiA/IFwiYWx0ZXJuYXRlXCIgOiBcIm5vcm1hbFwiXG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vYW5pbWF0b3JzL3dhYXBpL3V0aWxzL3N1cHBvcnRzLXdhYXBpLm1qc1xudmFyIGltcG9ydF9kaXN0NjA0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q2MDUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q2MDYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgc3VwcG9ydHNXYWFwaSA9IG1lbW8oKCkgPT4gT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwoRWxlbWVudC5wcm90b3R5cGUsIFwiYW5pbWF0ZVwiKSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9hbmltYXRvcnMvQWNjZWxlcmF0ZWRBbmltYXRpb24ubWpzXG52YXIgc2FtcGxlRGVsdGEgPSAxMDtcbnZhciBtYXhEdXJhdGlvbiA9IDJlNDtcbmZ1bmN0aW9uIHJlcXVpcmVzUHJlZ2VuZXJhdGVkS2V5ZnJhbWVzKG9wdGlvbnMpIHtcbiAgcmV0dXJuIGlzR2VuZXJhdG9yKG9wdGlvbnMudHlwZSkgfHwgb3B0aW9ucy50eXBlID09PSBcInNwcmluZ1wiIHx8ICFpc1dhYXBpU3VwcG9ydGVkRWFzaW5nKG9wdGlvbnMuZWFzZSk7XG59XG5mdW5jdGlvbiBwcmVnZW5lcmF0ZUtleWZyYW1lcyhrZXlmcmFtZXMyLCBvcHRpb25zKSB7XG4gIGNvbnN0IHNhbXBsZUFuaW1hdGlvbiA9IG5ldyBNYWluVGhyZWFkQW5pbWF0aW9uKHtcbiAgICAuLi5vcHRpb25zLFxuICAgIGtleWZyYW1lczoga2V5ZnJhbWVzMixcbiAgICByZXBlYXQ6IDAsXG4gICAgZGVsYXk6IDAsXG4gICAgaXNHZW5lcmF0b3I6IHRydWVcbiAgfSk7XG4gIGxldCBzdGF0ZTIgPSB7IGRvbmU6IGZhbHNlLCB2YWx1ZToga2V5ZnJhbWVzMlswXSB9O1xuICBjb25zdCBwcmVnZW5lcmF0ZWRLZXlmcmFtZXMgPSBbXTtcbiAgbGV0IHQgPSAwO1xuICB3aGlsZSAoIXN0YXRlMi5kb25lICYmIHQgPCBtYXhEdXJhdGlvbikge1xuICAgIHN0YXRlMiA9IHNhbXBsZUFuaW1hdGlvbi5zYW1wbGUo
10617dCk7XG4gICAgcHJlZ2VuZXJhdGVkS2V5ZnJhbWVzLnB1c2goc3RhdGUyLnZhbHVlKTtcbiAgICB0ICs9IHNhbXBsZURlbHRhO1xuICB9XG4gIHJldHVybiB7XG4gICAgdGltZXM6IHZvaWQgMCxcbiAgICBrZXlmcmFtZXM6IHByZWdlbmVyYXRlZEtleWZyYW1lcyxcbiAgICBkdXJhdGlvbjogdCAtIHNhbXBsZURlbHRhLFxuICAgIGVhc2U6IFwibGluZWFyXCJcbiAgfTtcbn1cbnZhciB1bnN1cHBvcnRlZEVhc2luZ0Z1bmN0aW9ucyA9IHtcbiAgYW50aWNpcGF0ZSxcbiAgYmFja0luT3V0LFxuICBjaXJjSW5PdXRcbn07XG5mdW5jdGlvbiBpc1Vuc3VwcG9ydGVkRWFzZShrZXkpIHtcbiAgcmV0dXJuIGtleSBpbiB1bnN1cHBvcnRlZEVhc2luZ0Z1bmN0aW9ucztcbn1cbnZhciBBY2NlbGVyYXRlZEFuaW1hdGlvbiA9IGNsYXNzIGV4dGVuZHMgQmFzZUFuaW1hdGlvbiB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICBzdXBlcihvcHRpb25zKTtcbiAgICBjb25zdCB7IG5hbWUsIG1vdGlvblZhbHVlOiBtb3Rpb25WYWx1ZTIsIGVsZW1lbnQsIGtleWZyYW1lczoga2V5ZnJhbWVzMiB9ID0gdGhpcy5vcHRpb25zO1xuICAgIHRoaXMucmVzb2x2ZXIgPSBuZXcgRE9NS2V5ZnJhbWVzUmVzb2x2ZXIoa2V5ZnJhbWVzMiwgKHJlc29sdmVkS2V5ZnJhbWVzLCBmaW5hbEtleWZyYW1lKSA9PiB0aGlzLm9uS2V5ZnJhbWVzUmVzb2x2ZWQocmVzb2x2ZWRLZXlmcmFtZXMsIGZpbmFsS2V5ZnJhbWUpLCBuYW1lLCBtb3Rpb25WYWx1ZTIsIGVsZW1lbnQpO1xuICAgIHRoaXMucmVzb2x2ZXIuc2NoZWR1bGVSZXNvbHZlKCk7XG4gIH1cbiAgaW5pdFBsYXliYWNrKGtleWZyYW1lczIsIGZpbmFsS2V5ZnJhbWUpIHtcbiAgICBsZXQgeyBkdXJhdGlvbiA9IDMwMCwgdGltZXMsIGVhc2U6IGVhc2UyLCB0eXBlLCBtb3Rpb25WYWx1ZTogbW90aW9uVmFsdWUyLCBuYW1lLCBzdGFydFRpbWUgfSA9IHRoaXMub3B0aW9ucztcbiAgICBpZiAoIW1vdGlvblZhbHVlMi5vd25lciB8fCAhbW90aW9uVmFsdWUyLm93bmVyLmN1cnJlbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlYXNlMiA9PT0gXCJzdHJpbmdcIiAmJiBzdXBwb3J0c0xpbmVhckVhc2luZygpICYmIGlzVW5zdXBwb3J0ZWRFYXNlKGVhc2UyKSkge1xuICAgICAgZWFzZTIgPSB1bnN1cHBvcnRlZEVhc2luZ0Z1bmN0aW9uc1tlYXNlMl07XG4gICAgfVxuICAgIGlmIChyZXF1aXJlc1ByZWdlbmVyYXRlZEtleWZyYW1lcyh0aGlzLm9wdGlvbnMpKSB7XG4gICAgICBjb25zdCB7IG9uQ29tcGxldGUsIG9uVXBkYXRlLCBtb3Rpb25WYWx1ZTogbW90aW9uVmFsdWUzLCBlbGVtZW50LCAuLi5vcHRpb25zIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICBjb25zdCBwcmVnZW5lcmF0ZWRBbmltYXRpb24gPSBwcmVnZW5lcmF0ZUtleWZyYW1lcyhrZXlmcmFtZXMyLCBvcHRpb25zKTtcbiAgICAgIGtleWZyYW1lczIgPSBwcmVnZW5lcmF0ZWRBbmltYXRpb24ua2V5ZnJhbWVzO1xuICAgICAgaWYgKGtleWZyYW1lczIubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGtleWZyYW1lczJbMV0gPSBrZXlmcmFtZXMyWzBdO1xuICAgICAgfVxuICAgICAgZHVyYXRpb24gPSBwcmVnZW5lcmF0ZWRBbmltYXRpb24uZHVyYXRpb247XG4gICAgICB0aW1lcyA9IHByZWdlbmVyYXRlZEFuaW1hdGlvbi50aW1lcztcbiAgICAgIGVhc2UyID0gcHJlZ2VuZXJhdGVkQW5pbWF0aW9uLmVhc2U7XG4gICAgICB0eXBlID0gXCJrZXlmcmFtZXNcIjtcbiAgICB9XG4gICAgY29uc3QgYW5pbWF0aW9uID0gc3RhcnRXYWFwaUFuaW1hdGlvbihtb3Rpb25WYWx1ZTIub3duZXIuY3VycmVudCwgbmFtZSwga2V5ZnJhbWVzMiwgeyAuLi50aGlzLm9wdGlvbnMsIGR1cmF0aW9uLCB0aW1lcywgZWFzZTogZWFzZTIgfSk7XG4gICAgYW5pbWF0aW9uLnN0YXJ0VGltZSA9IHN0YXJ0VGltZSAhPT0gbnVsbCAmJiBzdGFydFRpbWUgIT09IHZvaWQgMCA/IHN0YXJ0VGltZSA6IHRoaXMuY2FsY1N0YXJ0VGltZSgpO1xuICAgIGlmICh0aGlzLnBlbmRpbmdUaW1lbGluZSkge1xuICAgICAgYXR0YWNoVGltZWxpbmUoYW5pbWF0aW9uLCB0aGlzLnBlbmRpbmdUaW1lbGluZSk7XG4gICAgICB0aGlzLnBlbmRpbmdUaW1lbGluZSA9IHZvaWQgMDtcbiAgICB9IGVsc2Uge1xuICAgICAgYW5pbWF0aW9uLm9uZmluaXNoID0gKCkgPT4ge1xuICAgICAgICBjb25zdCB7IG9uQ29tcGxldGUgfSA9IHRoaXMub3B0aW9ucztcbiAgICAgICAgbW90aW9uVmFsdWUyLnNldChnZXRGaW5hbEtleWZyYW1lKGtleWZyYW1lczIsIHRoaXMub3B0aW9ucywgZmluYWxLZXlmcmFtZSkpO1xuICAgICAgICBvbkNvbXBsZXRlICYmIG9uQ29tcGxldGUoKTtcbiAgICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgICAgdGhpcy5yZXNvbHZlRmluaXNoZWRQcm9taXNlKCk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYW5pbWF0aW9uLFxuICAgICAgZHVyYXRpb24sXG4gICAgICB0aW1lcyxcbiAgICAgIHR5cGUsXG4gICAgICBlYXNlOiBlYXNlMixcbiAgICAgIGtleWZyYW1lczoga2V5ZnJhbWVzMlxuICAgIH07XG4gIH1cbiAgZ2V0IGR1cmF0aW9uKCkge1xuICAgIGNvbnN0IHsgcmVzb2x2ZWQgfSA9IHRoaXM7XG4gICAgaWYgKCFyZXNvbHZlZClcbiAgICAgIHJldHVybiAwO1xuICAgIGNvbnN0IHsgZHVyYXRpb24gfSA9IHJlc29sdmVkO1xuICAgIHJldHVybiBtaWxsaXNlY29uZHNUb1NlY29uZHMoZHVyYXRpb24pO1xuICB9XG4gIGdldCB0aW1lKCkge1xuICAgIGNvbnN0IHsgcmVzb2x2ZWQgfSA9IHRoaXM7XG4gICAgaWYgKCFyZXNvbHZlZClcbiAgICAgIHJldHVybiAwO1xuICAgIGNvbnN0IHsgYW5pbWF0aW9uIH0gPSByZXNvbHZlZDtcbiAgICByZXR1cm4gbWlsbGlzZWNvbmRzVG9TZWNvbmRzKGFuaW1hdGlvbi5jdXJyZW50VGltZSB8fCAwKTtcbiAgfVxuICBzZXQgdGltZShuZXdUaW1lKSB7XG4gICAgY29uc3QgeyByZXNvbHZlZCB9ID0gdGhpcztcbiAgICBpZiAoIXJlc29sdmVkKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHsgYW5pbWF0aW9uIH0gPSByZXNvbHZlZDtcbiAgICBhbmltYXRpb24uY3VycmVudFRpbWUgPSBzZWNvbmRzVG9NaWxsaXNlY29uZHMobmV3VGltZSk7XG4gIH1cbiAgZ2V0IHNwZWVkKCkge1xuICAgIGNvbnN0IHsgcmVzb2x2ZWQgfSA9IHRoaXM7XG4gICAgaWYgKCFyZXNvbHZlZClcbiAgICAgIHJldHVybiAxO1xuICAgIGNvbnN0IHsgYW5pbWF0aW9uIH0gPSByZXNvbHZlZDtcbiAgICByZXR1cm4gYW5pbWF0aW9uLnBsYXliYWNrUmF0ZTtcbiAgfVxuICBzZXQgc3BlZWQobmV3U3BlZWQpIHtcbiAgICBjb25zdCB7IHJlc29sdmVkIH0gPSB0aGlzO1xuICAgIGlmICghcmVzb2x2ZWQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgeyBhbmltYXRpb24gfSA9IHJlc29sdmVkO1xuICAgIGFuaW1hdGlvbi5wbGF5YmFja1JhdGUgPSBuZXdTcGVlZDtcbiAgfVxuICBnZXQgc3RhdGUoKSB7XG4gICAgY29uc3QgeyByZXNvbHZlZCB9ID0gdGhpcztcbiAgICBpZiAoIXJlc29sdmVkKVxuICAgICAgcmV0dXJuIFwiaWRsZVwiO1xuICAgIGNvbnN0IHsgYW5pbWF0aW9uIH0gPSByZXNvbHZlZDtcbiAgICByZXR1cm4gYW5pbWF0aW9uLnBsYXlTdGF0ZTtcbiAgfVxuICBnZXQgc3RhcnRUaW1lKCkge1xuICAgIGNvbnN0IHsgcmVzb2x2ZWQgfSA9IHRoaXM7XG4gICAgaWYgKCFyZXNvbHZlZClcbiAgICAgIHJldHVybi
10617BudWxsO1xuICAgIGNvbnN0IHsgYW5pbWF0aW9uIH0gPSByZXNvbHZlZDtcbiAgICByZXR1cm4gYW5pbWF0aW9uLnN0YXJ0VGltZTtcbiAgfVxuICAvKipcbiAgICogUmVwbGFjZSB0aGUgZGVmYXVsdCBEb2N1bWVudFRpbWVsaW5lIHdpdGggYW5vdGhlciBBbmltYXRpb25UaW1lbGluZS5cbiAgICogQ3VycmVudGx5IHVzZWQgZm9yIHNjcm9sbCBhbmltYXRpb25zLlxuICAgKi9cbiAgYXR0YWNoVGltZWxpbmUodGltZWxpbmUpIHtcbiAgICBpZiAoIXRoaXMuX3Jlc29sdmVkKSB7XG4gICAgICB0aGlzLnBlbmRpbmdUaW1lbGluZSA9IHRpbWVsaW5lO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IHJlc29sdmVkIH0gPSB0aGlzO1xuICAgICAgaWYgKCFyZXNvbHZlZClcbiAgICAgICAgcmV0dXJuIG5vb3A7XG4gICAgICBjb25zdCB7IGFuaW1hdGlvbiB9ID0gcmVzb2x2ZWQ7XG4gICAgICBhdHRhY2hUaW1lbGluZShhbmltYXRpb24sIHRpbWVsaW5lKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vb3A7XG4gIH1cbiAgcGxheSgpIHtcbiAgICBpZiAodGhpcy5pc1N0b3BwZWQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgeyByZXNvbHZlZCB9ID0gdGhpcztcbiAgICBpZiAoIXJlc29sdmVkKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHsgYW5pbWF0aW9uIH0gPSByZXNvbHZlZDtcbiAgICBpZiAoYW5pbWF0aW9uLnBsYXlTdGF0ZSA9PT0gXCJmaW5pc2hlZFwiKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZpbmlzaGVkUHJvbWlzZSgpO1xuICAgIH1cbiAgICBhbmltYXRpb24ucGxheSgpO1xuICB9XG4gIHBhdXNlKCkge1xuICAgIGNvbnN0IHsgcmVzb2x2ZWQgfSA9IHRoaXM7XG4gICAgaWYgKCFyZXNvbHZlZClcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB7IGFuaW1hdGlvbiB9ID0gcmVzb2x2ZWQ7XG4gICAgYW5pbWF0aW9uLnBhdXNlKCk7XG4gIH1cbiAgc3RvcCgpIHtcbiAgICB0aGlzLnJlc29sdmVyLmNhbmNlbCgpO1xuICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gXCJpZGxlXCIpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5yZXNvbHZlRmluaXNoZWRQcm9taXNlKCk7XG4gICAgdGhpcy51cGRhdGVGaW5pc2hlZFByb21pc2UoKTtcbiAgICBjb25zdCB7IHJlc29sdmVkIH0gPSB0aGlzO1xuICAgIGlmICghcmVzb2x2ZWQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgeyBhbmltYXRpb24sIGtleWZyYW1lczoga2V5ZnJhbWVzMiwgZHVyYXRpb24sIHR5cGUsIGVhc2U6IGVhc2UyLCB0aW1lcyB9ID0gcmVzb2x2ZWQ7XG4gICAgaWYgKGFuaW1hdGlvbi5wbGF5U3RhdGUgPT09IFwiaWRsZVwiIHx8IGFuaW1hdGlvbi5wbGF5U3RhdGUgPT09IFwiZmluaXNoZWRcIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy50aW1lKSB7XG4gICAgICBjb25zdCB7IG1vdGlvblZhbHVlOiBtb3Rpb25WYWx1ZTIsIG9uVXBkYXRlLCBvbkNvbXBsZXRlLCBlbGVtZW50LCAuLi5vcHRpb25zIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICBjb25zdCBzYW1wbGVBbmltYXRpb24gPSBuZXcgTWFpblRocmVhZEFuaW1hdGlvbih7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGtleWZyYW1lczoga2V5ZnJhbWVzMixcbiAgICAgICAgZHVyYXRpb24sXG4gICAgICAgIHR5cGUsXG4gICAgICAgIGVhc2U6IGVhc2UyLFxuICAgICAgICB0aW1lcyxcbiAgICAgICAgaXNHZW5lcmF0b3I6IHRydWVcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc2FtcGxlVGltZSA9IHNlY29uZHNUb01pbGxpc2Vjb25kcyh0aGlzLnRpbWUpO1xuICAgICAgbW90aW9uVmFsdWUyLnNldFdpdGhWZWxvY2l0eShzYW1wbGVBbmltYXRpb24uc2FtcGxlKHNhbXBsZVRpbWUgLSBzYW1wbGVEZWx0YSkudmFsdWUsIHNhbXBsZUFuaW1hdGlvbi5zYW1wbGUoc2FtcGxlVGltZSkudmFsdWUsIHNhbXBsZURlbHRhKTtcbiAgICB9XG4gICAgY29uc3QgeyBvblN0b3AgfSA9IHRoaXMub3B0aW9ucztcbiAgICBvblN0b3AgJiYgb25TdG9wKCk7XG4gICAgdGhpcy5jYW5jZWwoKTtcbiAgfVxuICBjb21wbGV0ZSgpIHtcbiAgICBjb25zdCB7IHJlc29sdmVkIH0gPSB0aGlzO1xuICAgIGlmICghcmVzb2x2ZWQpXG4gICAgICByZXR1cm47XG4gICAgcmVzb2x2ZWQuYW5pbWF0aW9uLmZpbmlzaCgpO1xuICB9XG4gIGNhbmNlbCgpIHtcbiAgICBjb25zdCB7IHJlc29sdmVkIH0gPSB0aGlzO1xuICAgIGlmICghcmVzb2x2ZWQpXG4gICAgICByZXR1cm47XG4gICAgcmVzb2x2ZWQuYW5pbWF0aW9uLmNhbmNlbCgpO1xuICB9XG4gIHN0YXRpYyBzdXBwb3J0cyhvcHRpb25zKSB7XG4gICAgY29uc3QgeyBtb3Rpb25WYWx1ZTogbW90aW9uVmFsdWUyLCBuYW1lLCByZXBlYXREZWxheSwgcmVwZWF0VHlwZSwgZGFtcGluZywgdHlwZSB9ID0gb3B0aW9ucztcbiAgICBpZiAoIW1vdGlvblZhbHVlMiB8fCAhbW90aW9uVmFsdWUyLm93bmVyIHx8ICEobW90aW9uVmFsdWUyLm93bmVyLmN1cnJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgeyBvblVwZGF0ZSwgdHJhbnNmb3JtVGVtcGxhdGUgfSA9IG1vdGlvblZhbHVlMi5vd25lci5nZXRQcm9wcygpO1xuICAgIHJldHVybiBzdXBwb3J0c1dhYXBpKCkgJiYgbmFtZSAmJiBhY2NlbGVyYXRlZFZhbHVlcy5oYXMobmFtZSkgJiYgLyoqXG4gICAgICogSWYgd2UncmUgb3V0cHV0dGluZyB2YWx1ZXMgdG8gb25VcGRhdGUgdGhlbiB3ZSBjYW4ndCB1c2UgV0FBUEkgYXMgdGhlcmUnc1xuICAgICAqIG5vIHdheSB0byByZWFkIHRoZSB2YWx1ZSBmcm9tIFdBQVBJIGV2ZXJ5IGZyYW1lLlxuICAgICAqL1xuICAgICFvblVwZGF0ZSAmJiAhdHJhbnNmb3JtVGVtcGxhdGUgJiYgIXJlcGVhdERlbGF5ICYmIHJlcGVhdFR5cGUgIT09IFwibWlycm9yXCIgJiYgZGFtcGluZyAhPT0gMCAmJiB0eXBlICE9PSBcImluZXJ0aWFcIjtcbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL3V0aWxzL2RlZmF1bHQtdHJhbnNpdGlvbnMubWpzXG52YXIgaW1wb3J0X2Rpc3Q2MTAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDYxMSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDYxMiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciB1bmRlckRhbXBlZFNwcmluZyA9IHtcbiAgdHlwZTogXCJzcHJpbmdcIixcbiAgc3RpZmZuZXNzOiA1MDAsXG4gIGRhbXBpbmc6IDI1LFxuICByZXN0U3BlZWQ6IDEwXG59O1xudmFyIGNyaXRpY2FsbHlEYW1wZWRTcHJpbmcgPSAodGFyZ2V0KSA9PiAoe1xuICB0eXBlOiBcInNwcmluZ1wiLFxuICBzdGlmZm5lc3M6IDU1MCxcbiAgZGFtcGluZzogdGFyZ2V0ID09PSAwID8gMiAqIE1hdGguc3FydCg1NTApI
10617DogMzAsXG4gIHJlc3RTcGVlZDogMTBcbn0pO1xudmFyIGtleWZyYW1lc1RyYW5zaXRpb24gPSB7XG4gIHR5cGU6IFwia2V5ZnJhbWVzXCIsXG4gIGR1cmF0aW9uOiAwLjhcbn07XG52YXIgZWFzZSA9IHtcbiAgdHlwZTogXCJrZXlmcmFtZXNcIixcbiAgZWFzZTogWzAuMjUsIDAuMSwgMC4zNSwgMV0sXG4gIGR1cmF0aW9uOiAwLjNcbn07XG52YXIgZ2V0RGVmYXVsdFRyYW5zaXRpb24gPSAodmFsdWVLZXksIHsga2V5ZnJhbWVzOiBrZXlmcmFtZXMyIH0pID0+IHtcbiAgaWYgKGtleWZyYW1lczIubGVuZ3RoID4gMikge1xuICAgIHJldHVybiBrZXlmcmFtZXNUcmFuc2l0aW9uO1xuICB9IGVsc2UgaWYgKHRyYW5zZm9ybVByb3BzLmhhcyh2YWx1ZUtleSkpIHtcbiAgICByZXR1cm4gdmFsdWVLZXkuc3RhcnRzV2l0aChcInNjYWxlXCIpID8gY3JpdGljYWxseURhbXBlZFNwcmluZyhrZXlmcmFtZXMyWzFdKSA6IHVuZGVyRGFtcGVkU3ByaW5nO1xuICB9XG4gIHJldHVybiBlYXNlO1xufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL3V0aWxzL2lzLXRyYW5zaXRpb24tZGVmaW5lZC5tanNcbnZhciBpbXBvcnRfZGlzdDYxMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjE0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjE1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gaXNUcmFuc2l0aW9uRGVmaW5lZCh7IHdoZW4sIGRlbGF5OiBfZGVsYXksIGRlbGF5Q2hpbGRyZW4sIHN0YWdnZXJDaGlsZHJlbiwgc3RhZ2dlckRpcmVjdGlvbiwgcmVwZWF0LCByZXBlYXRUeXBlLCByZXBlYXREZWxheSwgZnJvbSwgZWxhcHNlZCwgLi4udHJhbnNpdGlvbiB9KSB7XG4gIHJldHVybiAhIU9iamVjdC5rZXlzKHRyYW5zaXRpb24pLmxlbmd0aDtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL2ludGVyZmFjZXMvbW90aW9uLXZhbHVlLm1qc1xudmFyIGFuaW1hdGVNb3Rpb25WYWx1ZSA9IChuYW1lLCB2YWx1ZSwgdGFyZ2V0LCB0cmFuc2l0aW9uID0ge30sIGVsZW1lbnQsIGlzSGFuZG9mZikgPT4gKG9uQ29tcGxldGUpID0+IHtcbiAgY29uc3QgdmFsdWVUcmFuc2l0aW9uID0gZ2V0VmFsdWVUcmFuc2l0aW9uKHRyYW5zaXRpb24sIG5hbWUpIHx8IHt9O1xuICBjb25zdCBkZWxheTIgPSB2YWx1ZVRyYW5zaXRpb24uZGVsYXkgfHwgdHJhbnNpdGlvbi5kZWxheSB8fCAwO1xuICBsZXQgeyBlbGFwc2VkID0gMCB9ID0gdHJhbnNpdGlvbjtcbiAgZWxhcHNlZCA9IGVsYXBzZWQgLSBzZWNvbmRzVG9NaWxsaXNlY29uZHMoZGVsYXkyKTtcbiAgbGV0IG9wdGlvbnMgPSB7XG4gICAga2V5ZnJhbWVzOiBBcnJheS5pc0FycmF5KHRhcmdldCkgPyB0YXJnZXQgOiBbbnVsbCwgdGFyZ2V0XSxcbiAgICBlYXNlOiBcImVhc2VPdXRcIixcbiAgICB2ZWxvY2l0eTogdmFsdWUuZ2V0VmVsb2NpdHkoKSxcbiAgICAuLi52YWx1ZVRyYW5zaXRpb24sXG4gICAgZGVsYXk6IC1lbGFwc2VkLFxuICAgIG9uVXBkYXRlOiAodikgPT4ge1xuICAgICAgdmFsdWUuc2V0KHYpO1xuICAgICAgdmFsdWVUcmFuc2l0aW9uLm9uVXBkYXRlICYmIHZhbHVlVHJhbnNpdGlvbi5vblVwZGF0ZSh2KTtcbiAgICB9LFxuICAgIG9uQ29tcGxldGU6ICgpID0+IHtcbiAgICAgIG9uQ29tcGxldGUoKTtcbiAgICAgIHZhbHVlVHJhbnNpdGlvbi5vbkNvbXBsZXRlICYmIHZhbHVlVHJhbnNpdGlvbi5vbkNvbXBsZXRlKCk7XG4gICAgfSxcbiAgICBuYW1lLFxuICAgIG1vdGlvblZhbHVlOiB2YWx1ZSxcbiAgICBlbGVtZW50OiBpc0hhbmRvZmYgPyB2b2lkIDAgOiBlbGVtZW50XG4gIH07XG4gIGlmICghaXNUcmFuc2l0aW9uRGVmaW5lZCh2YWx1ZVRyYW5zaXRpb24pKSB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAuLi5nZXREZWZhdWx0VHJhbnNpdGlvbihuYW1lLCBvcHRpb25zKVxuICAgIH07XG4gIH1cbiAgaWYgKG9wdGlvbnMuZHVyYXRpb24pIHtcbiAgICBvcHRpb25zLmR1cmF0aW9uID0gc2Vjb25kc1RvTWlsbGlzZWNvbmRzKG9wdGlvbnMuZHVyYXRpb24pO1xuICB9XG4gIGlmIChvcHRpb25zLnJlcGVhdERlbGF5KSB7XG4gICAgb3B0aW9ucy5yZXBlYXREZWxheSA9IHNlY29uZHNUb01pbGxpc2Vjb25kcyhvcHRpb25zLnJlcGVhdERlbGF5KTtcbiAgfVxuICBpZiAob3B0aW9ucy5mcm9tICE9PSB2b2lkIDApIHtcbiAgICBvcHRpb25zLmtleWZyYW1lc1swXSA9IG9wdGlvbnMuZnJvbTtcbiAgfVxuICBsZXQgc2hvdWxkU2tpcCA9IGZhbHNlO1xuICBpZiAob3B0aW9ucy50eXBlID09PSBmYWxzZSB8fCBvcHRpb25zLmR1cmF0aW9uID09PSAwICYmICFvcHRpb25zLnJlcGVhdERlbGF5KSB7XG4gICAgb3B0aW9ucy5kdXJhdGlvbiA9IDA7XG4gICAgaWYgKG9wdGlvbnMuZGVsYXkgPT09IDApIHtcbiAgICAgIHNob3VsZFNraXAgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoaW5zdGFudEFuaW1hdGlvblN0YXRlLmN1cnJlbnQgfHwgTW90aW9uR2xvYmFsQ29uZmlnLnNraXBBbmltYXRpb25zKSB7XG4gICAgc2hvdWxkU2tpcCA9IHRydWU7XG4gICAgb3B0aW9ucy5kdXJhdGlvbiA9IDA7XG4gICAgb3B0aW9ucy5kZWxheSA9IDA7XG4gIH1cbiAgaWYgKHNob3VsZFNraXAgJiYgIWlzSGFuZG9mZiAmJiB2YWx1ZS5nZXQoKSAhPT0gdm9pZCAwKSB7XG4gICAgY29uc3QgZmluYWxLZXlmcmFtZSA9IGdldEZpbmFsS2V5ZnJhbWUob3B0aW9ucy5rZXlmcmFtZXMsIHZhbHVlVHJhbnNpdGlvbik7XG4gICAgaWYgKGZpbmFsS2V5ZnJhbWUgIT09IHZvaWQgMCkge1xuICAgICAgZnJhbWUudXBkYXRlKCgpID0+IHtcbiAgICAgICAgb3B0aW9ucy5vblVwZGF0ZShmaW5hbEtleWZyYW1lKTtcbiAgICAgICAgb3B0aW9ucy5vbkNvbXBsZXRlKCk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybi
10617BuZXcgR3JvdXBQbGF5YmFja0NvbnRyb2xzKFtdKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFpc0hhbmRvZmYgJiYgQWNjZWxlcmF0ZWRBbmltYXRpb24uc3VwcG9ydHMob3B0aW9ucykpIHtcbiAgICByZXR1cm4gbmV3IEFjY2VsZXJhdGVkQW5pbWF0aW9uKG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgTWFpblRocmVhZEFuaW1hdGlvbihvcHRpb25zKTtcbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL2ludGVyZmFjZXMvdmlzdWFsLWVsZW1lbnQtdGFyZ2V0Lm1qc1xuZnVuY3Rpb24gc2hvdWxkQmxvY2tBbmltYXRpb24oeyBwcm90ZWN0ZWRLZXlzLCBuZWVkc0FuaW1hdGluZyB9LCBrZXkpIHtcbiAgY29uc3Qgc2hvdWxkQmxvY2sgPSBwcm90ZWN0ZWRLZXlzLmhhc093blByb3BlcnR5KGtleSkgJiYgbmVlZHNBbmltYXRpbmdba2V5XSAhPT0gdHJ1ZTtcbiAgbmVlZHNBbmltYXRpbmdba2V5XSA9IGZhbHNlO1xuICByZXR1cm4gc2hvdWxkQmxvY2s7XG59XG5mdW5jdGlvbiBhbmltYXRlVGFyZ2V0KHZpc3VhbEVsZW1lbnQsIHRhcmdldEFuZFRyYW5zaXRpb24sIHsgZGVsYXk6IGRlbGF5MiA9IDAsIHRyYW5zaXRpb25PdmVycmlkZSwgdHlwZSB9ID0ge30pIHtcbiAgdmFyIF9hO1xuICBsZXQgeyB0cmFuc2l0aW9uID0gdmlzdWFsRWxlbWVudC5nZXREZWZhdWx0VHJhbnNpdGlvbigpLCB0cmFuc2l0aW9uRW5kLCAuLi50YXJnZXQgfSA9IHRhcmdldEFuZFRyYW5zaXRpb247XG4gIGlmICh0cmFuc2l0aW9uT3ZlcnJpZGUpXG4gICAgdHJhbnNpdGlvbiA9IHRyYW5zaXRpb25PdmVycmlkZTtcbiAgY29uc3QgYW5pbWF0aW9uczIgPSBbXTtcbiAgY29uc3QgYW5pbWF0aW9uVHlwZVN0YXRlID0gdHlwZSAmJiB2aXN1YWxFbGVtZW50LmFuaW1hdGlvblN0YXRlICYmIHZpc3VhbEVsZW1lbnQuYW5pbWF0aW9uU3RhdGUuZ2V0U3RhdGUoKVt0eXBlXTtcbiAgZm9yIChjb25zdCBrZXkgaW4gdGFyZ2V0KSB7XG4gICAgY29uc3QgdmFsdWUgPSB2aXN1YWxFbGVtZW50LmdldFZhbHVlKGtleSwgKF9hID0gdmlzdWFsRWxlbWVudC5sYXRlc3RWYWx1ZXNba2V5XSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbnVsbCk7XG4gICAgY29uc3QgdmFsdWVUYXJnZXQgPSB0YXJnZXRba2V5XTtcbiAgICBpZiAodmFsdWVUYXJnZXQgPT09IHZvaWQgMCB8fCBhbmltYXRpb25UeXBlU3RhdGUgJiYgc2hvdWxkQmxvY2tBbmltYXRpb24oYW5pbWF0aW9uVHlwZVN0YXRlLCBrZXkpKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVUcmFuc2l0aW9uID0ge1xuICAgICAgZGVsYXk6IGRlbGF5MixcbiAgICAgIC4uLmdldFZhbHVlVHJhbnNpdGlvbih0cmFuc2l0aW9uIHx8IHt9LCBrZXkpXG4gICAgfTtcbiAgICBsZXQgaXNIYW5kb2ZmID0gZmFsc2U7XG4gICAgaWYgKHdpbmRvdy5Nb3Rpb25IYW5kb2ZmQW5pbWF0aW9uKSB7XG4gICAgICBjb25zdCBhcHBlYXJJZCA9IGdldE9wdGltaXNlZEFwcGVhcklkKHZpc3VhbEVsZW1lbnQpO1xuICAgICAgaWYgKGFwcGVhcklkKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IHdpbmRvdy5Nb3Rpb25IYW5kb2ZmQW5pbWF0aW9uKGFwcGVhcklkLCBrZXksIGZyYW1lKTtcbiAgICAgICAgaWYgKHN0YXJ0VGltZSAhPT0gbnVsbCkge1xuICAgICAgICAgIHZhbHVlVHJhbnNpdGlvbi5zdGFydFRpbWUgPSBzdGFydFRpbWU7XG4gICAgICAgICAgaXNIYW5kb2ZmID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBhZGRWYWx1ZVRvV2lsbENoYW5nZSh2aXN1YWxFbGVtZW50LCBrZXkpO1xuICAgIHZhbHVlLnN0YXJ0KGFuaW1hdGVNb3Rpb25WYWx1ZShrZXksIHZhbHVlLCB2YWx1ZVRhcmdldCwgdmlzdWFsRWxlbWVudC5zaG91bGRSZWR1Y2VNb3Rpb24gJiYgcG9zaXRpb25hbEtleXMuaGFzKGtleSkgPyB7IHR5cGU6IGZhbHNlIH0gOiB2YWx1ZVRyYW5zaXRpb24sIHZpc3VhbEVsZW1lbnQsIGlzSGFuZG9mZikpO1xuICAgIGNvbnN0IGFuaW1hdGlvbiA9IHZhbHVlLmFuaW1hdGlvbjtcbiAgICBpZiAoYW5pbWF0aW9uKSB7XG4gICAgICBhbmltYXRpb25zMi5wdXNoKGFuaW1hdGlvbik7XG4gICAgfVxuICB9XG4gIGlmICh0cmFuc2l0aW9uRW5kKSB7XG4gICAgUHJvbWlzZS5hbGwoYW5pbWF0aW9uczIpLnRoZW4oKCkgPT4ge1xuICAgICAgZnJhbWUudXBkYXRlKCgpID0+IHtcbiAgICAgICAgdHJhbnNpdGlvbkVuZCAmJiBzZXRUYXJnZXQodmlzdWFsRWxlbWVudCwgdHJhbnNpdGlvbkVuZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gYW5pbWF0aW9uczI7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9pbnRlcmZhY2VzL3Zpc3VhbC1lbGVtZW50LXZhcmlhbnQubWpzXG52YXIgaW1wb3J0X2Rpc3Q2MjIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDYyMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDYyNCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIGFuaW1hdGVWYXJpYW50KHZpc3VhbEVsZW1lbnQsIHZhcmlhbnQsIG9wdGlvbnMgPSB7fSkge1xuICB2YXIgX2E7XG4gIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZVZhcmlhbnQodmlzdWFsRWxlbWVudCwgdmFyaWFudCwgb3B0aW9ucy50eXBlID09PSBcImV4aXRcIiA/IChfYSA9IHZpc3VhbEVsZW1lbnQucHJlc2VuY2VDb250ZXh0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY3VzdG9tIDogdm9pZCAwKTtcbiAgbGV0IHsgdHJhbnNpdGlvbiA9IHZpc3VhbEVsZW1lbnQuZ2V0RGVmYXVsdFRyYW5zaXRpb24oKSB8fCB7fSB9ID0gcmVzb2x2ZWQgfHwge307XG4gIGlmIChvcHRpb25zLnRyYW5zaXRpb25PdmVycmlkZSkge1xuICAgIHRyYW5zaXRpb24gPSBvcHRpb25zLnRyYW5zaXRpb25PdmVycmlkZTtcbiAgfVxuICBjb25zdCBnZXRBbmltYXRpb24gPSByZXNvbHZlZCA/ICgpID0+IFByb21pc2UuYWxsKGFuaW1hdGVUYXJnZXQodmlzdWFsRWxlbWVudCwgcmVzb2x2ZWQsIG9wdGlvbnMpKSA6
10617ICgpID0+IFByb21pc2UucmVzb2x2ZSgpO1xuICBjb25zdCBnZXRDaGlsZEFuaW1hdGlvbnMgPSB2aXN1YWxFbGVtZW50LnZhcmlhbnRDaGlsZHJlbiAmJiB2aXN1YWxFbGVtZW50LnZhcmlhbnRDaGlsZHJlbi5zaXplID8gKGZvcndhcmREZWxheSA9IDApID0+IHtcbiAgICBjb25zdCB7IGRlbGF5Q2hpbGRyZW4gPSAwLCBzdGFnZ2VyQ2hpbGRyZW4sIHN0YWdnZXJEaXJlY3Rpb24gfSA9IHRyYW5zaXRpb247XG4gICAgcmV0dXJuIGFuaW1hdGVDaGlsZHJlbih2aXN1YWxFbGVtZW50LCB2YXJpYW50LCBkZWxheUNoaWxkcmVuICsgZm9yd2FyZERlbGF5LCBzdGFnZ2VyQ2hpbGRyZW4sIHN0YWdnZXJEaXJlY3Rpb24sIG9wdGlvbnMpO1xuICB9IDogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIGNvbnN0IHsgd2hlbiB9ID0gdHJhbnNpdGlvbjtcbiAgaWYgKHdoZW4pIHtcbiAgICBjb25zdCBbZmlyc3QsIGxhc3RdID0gd2hlbiA9PT0gXCJiZWZvcmVDaGlsZHJlblwiID8gW2dldEFuaW1hdGlvbiwgZ2V0Q2hpbGRBbmltYXRpb25zXSA6IFtnZXRDaGlsZEFuaW1hdGlvbnMsIGdldEFuaW1hdGlvbl07XG4gICAgcmV0dXJuIGZpcnN0KCkudGhlbigoKSA9PiBsYXN0KCkpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBQcm9taXNlLmFsbChbZ2V0QW5pbWF0aW9uKCksIGdldENoaWxkQW5pbWF0aW9ucyhvcHRpb25zLmRlbGF5KV0pO1xuICB9XG59XG5mdW5jdGlvbiBhbmltYXRlQ2hpbGRyZW4odmlzdWFsRWxlbWVudCwgdmFyaWFudCwgZGVsYXlDaGlsZHJlbiA9IDAsIHN0YWdnZXJDaGlsZHJlbiA9IDAsIHN0YWdnZXJEaXJlY3Rpb24gPSAxLCBvcHRpb25zKSB7XG4gIGNvbnN0IGFuaW1hdGlvbnMyID0gW107XG4gIGNvbnN0IG1heFN0YWdnZXJEdXJhdGlvbiA9ICh2aXN1YWxFbGVtZW50LnZhcmlhbnRDaGlsZHJlbi5zaXplIC0gMSkgKiBzdGFnZ2VyQ2hpbGRyZW47XG4gIGNvbnN0IGdlbmVyYXRlU3RhZ2dlckR1cmF0aW9uID0gc3RhZ2dlckRpcmVjdGlvbiA9PT0gMSA/IChpID0gMCkgPT4gaSAqIHN0YWdnZXJDaGlsZHJlbiA6IChpID0gMCkgPT4gbWF4U3RhZ2dlckR1cmF0aW9uIC0gaSAqIHN0YWdnZXJDaGlsZHJlbjtcbiAgQXJyYXkuZnJvbSh2aXN1YWxFbGVtZW50LnZhcmlhbnRDaGlsZHJlbikuc29ydChzb3J0QnlUcmVlT3JkZXIpLmZvckVhY2goKGNoaWxkLCBpKSA9PiB7XG4gICAgY2hpbGQubm90aWZ5KFwiQW5pbWF0aW9uU3RhcnRcIiwgdmFyaWFudCk7XG4gICAgYW5pbWF0aW9uczIucHVzaChhbmltYXRlVmFyaWFudChjaGlsZCwgdmFyaWFudCwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGRlbGF5OiBkZWxheUNoaWxkcmVuICsgZ2VuZXJhdGVTdGFnZ2VyRHVyYXRpb24oaSlcbiAgICB9KS50aGVuKCgpID0+IGNoaWxkLm5vdGlmeShcIkFuaW1hdGlvbkNvbXBsZXRlXCIsIHZhcmlhbnQpKSk7XG4gIH0pO1xuICByZXR1cm4gUHJvbWlzZS5hbGwoYW5pbWF0aW9uczIpO1xufVxuZnVuY3Rpb24gc29ydEJ5VHJlZU9yZGVyKGEsIGIpIHtcbiAgcmV0dXJuIGEuc29ydE5vZGVQb3NpdGlvbihiKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL2ludGVyZmFjZXMvdmlzdWFsLWVsZW1lbnQubWpzXG5mdW5jdGlvbiBhbmltYXRlVmlzdWFsRWxlbWVudCh2aXN1YWxFbGVtZW50LCBkZWZpbml0aW9uLCBvcHRpb25zID0ge30pIHtcbiAgdmlzdWFsRWxlbWVudC5ub3RpZnkoXCJBbmltYXRpb25TdGFydFwiLCBkZWZpbml0aW9uKTtcbiAgbGV0IGFuaW1hdGlvbjtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGVmaW5pdGlvbikpIHtcbiAgICBjb25zdCBhbmltYXRpb25zMiA9IGRlZmluaXRpb24ubWFwKCh2YXJpYW50KSA9PiBhbmltYXRlVmFyaWFudCh2aXN1YWxFbGVtZW50LCB2YXJpYW50LCBvcHRpb25zKSk7XG4gICAgYW5pbWF0aW9uID0gUHJvbWlzZS5hbGwoYW5pbWF0aW9uczIpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbml0aW9uID09PSBcInN0cmluZ1wiKSB7XG4gICAgYW5pbWF0aW9uID0gYW5pbWF0ZVZhcmlhbnQodmlzdWFsRWxlbWVudCwgZGVmaW5pdGlvbiwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcmVzb2x2ZWREZWZpbml0aW9uID0gdHlwZW9mIGRlZmluaXRpb24gPT09IFwiZnVuY3Rpb25cIiA/IHJlc29sdmVWYXJpYW50KHZpc3VhbEVsZW1lbnQsIGRlZmluaXRpb24sIG9wdGlvbnMuY3VzdG9tKSA6IGRlZmluaXRpb247XG4gICAgYW5pbWF0aW9uID0gUHJvbWlzZS5hbGwoYW5pbWF0ZVRhcmdldCh2aXN1YWxFbGVtZW50LCByZXNvbHZlZERlZmluaXRpb24sIG9wdGlvbnMpKTtcbiAgfVxuICByZXR1cm4gYW5pbWF0aW9uLnRoZW4oKCkgPT4ge1xuICAgIHZpc3VhbEVsZW1lbnQubm90aWZ5KFwiQW5pbWF0aW9uQ29tcGxldGVcIiwgZGVmaW5pdGlvbik7XG4gIH0pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvdXRpbHMvZ2V0LXZhcmlhbnQtY29udGV4dC5tanNcbnZhciBpbXBvcnRfZGlzdDYyOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjI5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjMwID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIG51bVZhcmlhbnRQcm9wcyA9IHZhcmlhbnRQcm9wcy5sZW5ndGg7XG5mdW5jdGlvbiBnZXRWYXJpYW50Q29udGV4dCh2aXN1YWxFbGVtZW50KSB7XG4gIGlmICghdmlzdWFsRWxlbWVudClcbiAgICByZXR1cm4gdm9pZCAwO1xuICBpZiAoIXZpc3VhbEVsZW1lbnQuaXNDb250cm9sbGluZ1ZhcmlhbnRzKSB7XG4gICAgY29uc3QgY29udGV4dDIgPSB2aXN1YWxFbGVtZW50LnBhcmVudCA/IGdldFZhcmlhbnRDb250ZXh0KHZpc3VhbEVsZW1lbnQucGFyZW50KSB8fCB7fSA6IHt9O1xuICAgIGlmICh2aXN1YWxFbGVtZW50LnByb3BzLmluaXRpYWwgIT09IHZvaWQgMCkge1xuICAgICAgY29udGV4dDIuaW5pdGlhbCA9IHZpc3VhbEVsZW1lbnQucHJvcHMuaW5pdGlhbDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQyO1xuICB9XG4gIGNvbnN0IGNvbnRleHQgPSB7fTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1WY
10617XJpYW50UHJvcHM7IGkrKykge1xuICAgIGNvbnN0IG5hbWUgPSB2YXJpYW50UHJvcHNbaV07XG4gICAgY29uc3QgcHJvcCA9IHZpc3VhbEVsZW1lbnQucHJvcHNbbmFtZV07XG4gICAgaWYgKGlzVmFyaWFudExhYmVsKHByb3ApIHx8IHByb3AgPT09IGZhbHNlKSB7XG4gICAgICBjb250ZXh0W25hbWVdID0gcHJvcDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci91dGlscy9hbmltYXRpb24tc3RhdGUubWpzXG52YXIgcmV2ZXJzZVByaW9yaXR5T3JkZXIgPSBbLi4udmFyaWFudFByaW9yaXR5T3JkZXJdLnJldmVyc2UoKTtcbnZhciBudW1BbmltYXRpb25UeXBlcyA9IHZhcmlhbnRQcmlvcml0eU9yZGVyLmxlbmd0aDtcbmZ1bmN0aW9uIGFuaW1hdGVMaXN0KHZpc3VhbEVsZW1lbnQpIHtcbiAgcmV0dXJuIChhbmltYXRpb25zMikgPT4gUHJvbWlzZS5hbGwoYW5pbWF0aW9uczIubWFwKCh7IGFuaW1hdGlvbiwgb3B0aW9ucyB9KSA9PiBhbmltYXRlVmlzdWFsRWxlbWVudCh2aXN1YWxFbGVtZW50LCBhbmltYXRpb24sIG9wdGlvbnMpKSk7XG59XG5mdW5jdGlvbiBjcmVhdGVBbmltYXRpb25TdGF0ZSh2aXN1YWxFbGVtZW50KSB7XG4gIGxldCBhbmltYXRlMiA9IGFuaW1hdGVMaXN0KHZpc3VhbEVsZW1lbnQpO1xuICBsZXQgc3RhdGUyID0gY3JlYXRlU3RhdGUoKTtcbiAgbGV0IGlzSW5pdGlhbFJlbmRlciA9IHRydWU7XG4gIGNvbnN0IGJ1aWxkUmVzb2x2ZWRUeXBlVmFsdWVzID0gKHR5cGUpID0+IChhY2MsIGRlZmluaXRpb24pID0+IHtcbiAgICB2YXIgX2E7XG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlVmFyaWFudCh2aXN1YWxFbGVtZW50LCBkZWZpbml0aW9uLCB0eXBlID09PSBcImV4aXRcIiA/IChfYSA9IHZpc3VhbEVsZW1lbnQucHJlc2VuY2VDb250ZXh0KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY3VzdG9tIDogdm9pZCAwKTtcbiAgICBpZiAocmVzb2x2ZWQpIHtcbiAgICAgIGNvbnN0IHsgdHJhbnNpdGlvbiwgdHJhbnNpdGlvbkVuZCwgLi4udGFyZ2V0IH0gPSByZXNvbHZlZDtcbiAgICAgIGFjYyA9IHsgLi4uYWNjLCAuLi50YXJnZXQsIC4uLnRyYW5zaXRpb25FbmQgfTtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfTtcbiAgZnVuY3Rpb24gc2V0QW5pbWF0ZUZ1bmN0aW9uKG1ha2VBbmltYXRvcikge1xuICAgIGFuaW1hdGUyID0gbWFrZUFuaW1hdG9yKHZpc3VhbEVsZW1lbnQpO1xuICB9XG4gIGZ1bmN0aW9uIGFuaW1hdGVDaGFuZ2VzKGNoYW5nZWRBY3RpdmVUeXBlKSB7XG4gICAgY29uc3QgeyBwcm9wcyB9ID0gdmlzdWFsRWxlbWVudDtcbiAgICBjb25zdCBjb250ZXh0ID0gZ2V0VmFyaWFudENvbnRleHQodmlzdWFsRWxlbWVudC5wYXJlbnQpIHx8IHt9O1xuICAgIGNvbnN0IGFuaW1hdGlvbnMyID0gW107XG4gICAgY29uc3QgcmVtb3ZlZEtleXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGxldCBlbmNvdW50ZXJlZEtleXMgPSB7fTtcbiAgICBsZXQgcmVtb3ZlZFZhcmlhbnRJbmRleCA9IEluZmluaXR5O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQW5pbWF0aW9uVHlwZXM7IGkrKykge1xuICAgICAgY29uc3QgdHlwZSA9IHJldmVyc2VQcmlvcml0eU9yZGVyW2ldO1xuICAgICAgY29uc3QgdHlwZVN0YXRlID0gc3RhdGUyW3R5cGVdO1xuICAgICAgY29uc3QgcHJvcCA9IHByb3BzW3R5cGVdICE9PSB2b2lkIDAgPyBwcm9wc1t0eXBlXSA6IGNvbnRleHRbdHlwZV07XG4gICAgICBjb25zdCBwcm9wSXNWYXJpYW50ID0gaXNWYXJpYW50TGFiZWwocHJvcCk7XG4gICAgICBjb25zdCBhY3RpdmVEZWx0YSA9IHR5cGUgPT09IGNoYW5nZWRBY3RpdmVUeXBlID8gdHlwZVN0YXRlLmlzQWN0aXZlIDogbnVsbDtcbiAgICAgIGlmIChhY3RpdmVEZWx0YSA9PT0gZmFsc2UpXG4gICAgICAgIHJlbW92ZWRWYXJpYW50SW5kZXggPSBpO1xuICAgICAgbGV0IGlzSW5oZXJpdGVkID0gcHJvcCA9PT0gY29udGV4dFt0eXBlXSAmJiBwcm9wICE9PSBwcm9wc1t0eXBlXSAmJiBwcm9wSXNWYXJpYW50O1xuICAgICAgaWYgKGlzSW5oZXJpdGVkICYmIGlzSW5pdGlhbFJlbmRlciAmJiB2aXN1YWxFbGVtZW50Lm1hbnVhbGx5QW5pbWF0ZU9uTW91bnQpIHtcbiAgICAgICAgaXNJbmhlcml0ZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHR5cGVTdGF0ZS5wcm90ZWN0ZWRLZXlzID0geyAuLi5lbmNvdW50ZXJlZEtleXMgfTtcbiAgICAgIGlmIChcbiAgICAgICAgLy8gSWYgaXQgaXNuJ3QgYWN0aXZlIGFuZCBoYXNuJ3QgKmp1c3QqIGJlZW4gc2V0IGFzIGluYWN0aXZlXG4gICAgICAgICF0eXBlU3RhdGUuaXNBY3RpdmUgJiYgYWN0aXZlRGVsdGEgPT09IG51bGwgfHwgLy8gSWYgd2UgZGlkbid0IGFuZCBkb24ndCBoYXZlIGFueSBkZWZpbmVkIHByb3AgZm9yIHRoaXMgYW5pbWF0aW9uIHR5cGVcbiAgICAgICAgIXByb3AgJiYgIXR5cGVTdGF0ZS5wcmV2UHJvcCB8fCAvLyBPciBpZiB0aGUgcHJvcCBkb2Vzbid0IGRlZmluZSBhbiBhbmltYXRpb25cbiAgICAgICAgaXNBbmltYXRpb25Db250cm9scyhwcm9wKSB8fCB0eXBlb2YgcHJvcCA9PT0gXCJib29sZWFuXCJcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhcmlhbnREaWRDaGFuZ2UgPSBjaGVja1ZhcmlhbnRzRGlkQ2hhbmdlKHR5cGVTdGF0ZS5wcmV2UHJvcCwgcHJvcCk7XG4gICAgICBsZXQgc2hvdWxkQW5pbWF0ZVR5cGUgPSB2YXJpYW50RGlkQ2hhbmdlIHx8IC8vIElmIHdlJ3JlIG1ha2luZyB0aGlzIHZhcmlhbnQgYWN0aXZlLCB3ZSB3YW50IHRvIGFsd2F5cyBtYWtlIGl0IGFjdGl2ZVxuICAgICAgdHlwZSA9PT0gY2hhbmdlZEFjdGl2ZVR5cGUgJiYgdHlwZVN0YXRlLmlzQWN0aXZlICYmICFpc0luaGVyaXRlZCAmJiBwcm9wSXNWYXJpYW50IHx8IC8vIElmIHdlIHJlbW92ZWQgYSBoaWdoZXItcHJpb3JpdHkgdmFyaWFudCAoaSBpcyBpbiByZXZlcnNlIG9yZGVyKVxuICAgICAgaSA+IHJlbW92ZWRWYXJpYW50SW5kZXggJiYgcHJvcElzVmFyaWFudDtcbiAgICAgIGxldCBoYW5kbGVkUmVtb3ZlZFZhbHVlcyA9IGZhbHNlO1xuICAgICAgY29uc3QgZGVmaW5pdGlvbkxpc3QgPSBBcnJheS5pc0FycmF
106175KHByb3ApID8gcHJvcCA6IFtwcm9wXTtcbiAgICAgIGxldCByZXNvbHZlZFZhbHVlcyA9IGRlZmluaXRpb25MaXN0LnJlZHVjZShidWlsZFJlc29sdmVkVHlwZVZhbHVlcyh0eXBlKSwge30pO1xuICAgICAgaWYgKGFjdGl2ZURlbHRhID09PSBmYWxzZSlcbiAgICAgICAgcmVzb2x2ZWRWYWx1ZXMgPSB7fTtcbiAgICAgIGNvbnN0IHsgcHJldlJlc29sdmVkVmFsdWVzID0ge30gfSA9IHR5cGVTdGF0ZTtcbiAgICAgIGNvbnN0IGFsbEtleXMgPSB7XG4gICAgICAgIC4uLnByZXZSZXNvbHZlZFZhbHVlcyxcbiAgICAgICAgLi4ucmVzb2x2ZWRWYWx1ZXNcbiAgICAgIH07XG4gICAgICBjb25zdCBtYXJrVG9BbmltYXRlID0gKGtleSkgPT4ge1xuICAgICAgICBzaG91bGRBbmltYXRlVHlwZSA9IHRydWU7XG4gICAgICAgIGlmIChyZW1vdmVkS2V5cy5oYXMoa2V5KSkge1xuICAgICAgICAgIGhhbmRsZWRSZW1vdmVkVmFsdWVzID0gdHJ1ZTtcbiAgICAgICAgICByZW1vdmVkS2V5cy5kZWxldGUoa2V5KTtcbiAgICAgICAgfVxuICAgICAgICB0eXBlU3RhdGUubmVlZHNBbmltYXRpbmdba2V5XSA9IHRydWU7XG4gICAgICAgIGNvbnN0IG1vdGlvblZhbHVlMiA9IHZpc3VhbEVsZW1lbnQuZ2V0VmFsdWUoa2V5KTtcbiAgICAgICAgaWYgKG1vdGlvblZhbHVlMilcbiAgICAgICAgICBtb3Rpb25WYWx1ZTIubGl2ZVN0eWxlID0gZmFsc2U7XG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gYWxsS2V5cykge1xuICAgICAgICBjb25zdCBuZXh0ID0gcmVzb2x2ZWRWYWx1ZXNba2V5XTtcbiAgICAgICAgY29uc3QgcHJldiA9IHByZXZSZXNvbHZlZFZhbHVlc1trZXldO1xuICAgICAgICBpZiAoZW5jb3VudGVyZWRLZXlzLmhhc093blByb3BlcnR5KGtleSkpXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIGxldCB2YWx1ZUhhc0NoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGlzS2V5ZnJhbWVzVGFyZ2V0KG5leHQpICYmIGlzS2V5ZnJhbWVzVGFyZ2V0KHByZXYpKSB7XG4gICAgICAgICAgdmFsdWVIYXNDaGFuZ2VkID0gIXNoYWxsb3dDb21wYXJlKG5leHQsIHByZXYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlSGFzQ2hhbmdlZCA9IG5leHQgIT09IHByZXY7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVlSGFzQ2hhbmdlZCkge1xuICAgICAgICAgIGlmIChuZXh0ICE9PSB2b2lkIDAgJiYgbmV4dCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbWFya1RvQW5pbWF0ZShrZXkpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZW1vdmVkS2V5cy5hZGQoa2V5KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobmV4dCAhPT0gdm9pZCAwICYmIHJlbW92ZWRLZXlzLmhhcyhrZXkpKSB7XG4gICAgICAgICAgbWFya1RvQW5pbWF0ZShrZXkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHR5cGVTdGF0ZS5wcm90ZWN0ZWRLZXlzW2tleV0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0eXBlU3RhdGUucHJldlByb3AgPSBwcm9wO1xuICAgICAgdHlwZVN0YXRlLnByZXZSZXNvbHZlZFZhbHVlcyA9IHJlc29sdmVkVmFsdWVzO1xuICAgICAgaWYgKHR5cGVTdGF0ZS5pc0FjdGl2ZSkge1xuICAgICAgICBlbmNvdW50ZXJlZEtleXMgPSB7IC4uLmVuY291bnRlcmVkS2V5cywgLi4ucmVzb2x2ZWRWYWx1ZXMgfTtcbiAgICAgIH1cbiAgICAgIGlmIChpc0luaXRpYWxSZW5kZXIgJiYgdmlzdWFsRWxlbWVudC5ibG9ja0luaXRpYWxBbmltYXRpb24pIHtcbiAgICAgICAgc2hvdWxkQW5pbWF0ZVR5cGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHdpbGxBbmltYXRlVmlhUGFyZW50ID0gaXNJbmhlcml0ZWQgJiYgdmFyaWFudERpZENoYW5nZTtcbiAgICAgIGNvbnN0IG5lZWRzQW5pbWF0aW5nID0gIXdpbGxBbmltYXRlVmlhUGFyZW50IHx8IGhhbmRsZWRSZW1vdmVkVmFsdWVzO1xuICAgICAgaWYgKHNob3VsZEFuaW1hdGVUeXBlICYmIG5lZWRzQW5pbWF0aW5nKSB7XG4gICAgICAgIGFuaW1hdGlvbnMyLnB1c2goLi4uZGVmaW5pdGlvbkxpc3QubWFwKChhbmltYXRpb24pID0+ICh7XG4gICAgICAgICAgYW5pbWF0aW9uLFxuICAgICAgICAgIG9wdGlvbnM6IHsgdHlwZSB9XG4gICAgICAgIH0pKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZW1vdmVkS2V5cy5zaXplKSB7XG4gICAgICBjb25zdCBmYWxsYmFja0FuaW1hdGlvbiA9IHt9O1xuICAgICAgcmVtb3ZlZEtleXMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgIGNvbnN0IGZhbGxiYWNrVGFyZ2V0ID0gdmlzdWFsRWxlbWVudC5nZXRCYXNlVGFyZ2V0KGtleSk7XG4gICAgICAgIGNvbnN0IG1vdGlvblZhbHVlMiA9IHZpc3VhbEVsZW1lbnQuZ2V0VmFsdWUoa2V5KTtcbiAgICAgICAgaWYgKG1vdGlvblZhbHVlMilcbiAgICAgICAgICBtb3Rpb25WYWx1ZTIubGl2ZVN0eWxlID0gdHJ1ZTtcbiAgICAgICAgZmFsbGJhY2tBbmltYXRpb25ba2V5XSA9IGZhbGxiYWNrVGFyZ2V0ICE9PSBudWxsICYmIGZhbGxiYWNrVGFyZ2V0ICE9PSB2b2lkIDAgPyBmYWxsYmFja1RhcmdldCA6IG51bGw7XG4gICAgICB9KTtcbiAgICAgIGFuaW1hdGlvbnMyLnB1c2goeyBhbmltYXRpb246IGZhbGxiYWNrQW5pbWF0aW9uIH0pO1xuICAgIH1cbiAgICBsZXQgc2hvdWxkQW5pbWF0ZSA9IEJvb2xlYW4oYW5pbWF0aW9uczIubGVuZ3RoKTtcbiAgICBpZiAoaXNJbml0aWFsUmVuZGVyICYmIChwcm9wcy5pbml0aWFsID09PSBmYWxzZSB8fCBwcm9wcy5pbml0aWFsID09PSBwcm9wcy5hbmltYXRlKSAmJiAhdmlzdWFsRWxlbWVudC5tYW51YWxseUFuaW1hdGVPbk1vdW50KSB7XG4gICAgICBzaG91bGRBbmltYXRlID0gZmFsc2U7XG4gICAgfVxuICAgIGlzSW5pdGlhbFJlbmRlciA9IGZhbHNlO1xuICAgIHJldHVybiBzaG91bGRBbmltYXRlID8gYW5pbWF0ZTIoYW5pbWF0aW9uczIpIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cbiAgZnVuY3Rpb24gc2V0QWN0aXZlKHR5cGUsIGlzQWN0aXZlKSB7XG4gICAgdmFyIF9hO1xuICAgIGlmIChzdGF0ZTJbdHlwZV0uaXNBY3RpdmUgPT09IGlzQWN0aXZlKVxuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIChfYSA9IHZpc3VhbEVsZW1lbnQudmFyaWFudENoaWxkcmVuKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgIHZhciBfYTI7XG4gICAgICByZXR1cm4gKF9hMiA9IGNoaWxkLmFuaW1hdGlvblN0YXRlKSA9PT0gbnVsbCB8fCBfYTIgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hMi5zZXRBY3RpdmUodHlwZSwgaXNBY3RpdmUpO1xuICAgIH0pO1xuICAgIHN0YXRlMlt0eXBlXS5pc0FjdGl2ZSA9IGlzQWN0aXZlO1xuICAgIGNvbnN0IGFuaW1hdGlvbnMyID0gYW5pbWF0ZUNoYW5nZXModHlwZSk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gc3RhdGUyKSB7XG4gICAgICBzdGF0ZTJba2V5XS5wcm90ZWN0ZWRLZXlzID0ge307XG4gICAgfVxuICAgIHJldHVybi
10617BhbmltYXRpb25zMjtcbiAgfVxuICByZXR1cm4ge1xuICAgIGFuaW1hdGVDaGFuZ2VzLFxuICAgIHNldEFjdGl2ZSxcbiAgICBzZXRBbmltYXRlRnVuY3Rpb24sXG4gICAgZ2V0U3RhdGU6ICgpID0+IHN0YXRlMixcbiAgICByZXNldDogKCkgPT4ge1xuICAgICAgc3RhdGUyID0gY3JlYXRlU3RhdGUoKTtcbiAgICAgIGlzSW5pdGlhbFJlbmRlciA9IHRydWU7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gY2hlY2tWYXJpYW50c0RpZENoYW5nZShwcmV2LCBuZXh0KSB7XG4gIGlmICh0eXBlb2YgbmV4dCA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBuZXh0ICE9PSBwcmV2O1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobmV4dCkpIHtcbiAgICByZXR1cm4gIXNoYWxsb3dDb21wYXJlKG5leHQsIHByZXYpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVR5cGVTdGF0ZShpc0FjdGl2ZSA9IGZhbHNlKSB7XG4gIHJldHVybiB7XG4gICAgaXNBY3RpdmUsXG4gICAgcHJvdGVjdGVkS2V5czoge30sXG4gICAgbmVlZHNBbmltYXRpbmc6IHt9LFxuICAgIHByZXZSZXNvbHZlZFZhbHVlczoge31cbiAgfTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVN0YXRlKCkge1xuICByZXR1cm4ge1xuICAgIGFuaW1hdGU6IGNyZWF0ZVR5cGVTdGF0ZSh0cnVlKSxcbiAgICB3aGlsZUluVmlldzogY3JlYXRlVHlwZVN0YXRlKCksXG4gICAgd2hpbGVIb3ZlcjogY3JlYXRlVHlwZVN0YXRlKCksXG4gICAgd2hpbGVUYXA6IGNyZWF0ZVR5cGVTdGF0ZSgpLFxuICAgIHdoaWxlRHJhZzogY3JlYXRlVHlwZVN0YXRlKCksXG4gICAgd2hpbGVGb2N1czogY3JlYXRlVHlwZVN0YXRlKCksXG4gICAgZXhpdDogY3JlYXRlVHlwZVN0YXRlKClcbiAgfTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvbW90aW9uL2ZlYXR1cmVzL0ZlYXR1cmUubWpzXG52YXIgaW1wb3J0X2Rpc3Q2MzQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDYzNSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDYzNiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBGZWF0dXJlID0gY2xhc3Mge1xuICBjb25zdHJ1Y3Rvcihub2RlKSB7XG4gICAgdGhpcy5pc01vdW50ZWQgPSBmYWxzZTtcbiAgICB0aGlzLm5vZGUgPSBub2RlO1xuICB9XG4gIHVwZGF0ZSgpIHtcbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvbW90aW9uL2ZlYXR1cmVzL2FuaW1hdGlvbi9pbmRleC5tanNcbnZhciBBbmltYXRpb25GZWF0dXJlID0gY2xhc3MgZXh0ZW5kcyBGZWF0dXJlIHtcbiAgLyoqXG4gICAqIFdlIGR5bmFtaWNhbGx5IGdlbmVyYXRlIHRoZSBBbmltYXRpb25TdGF0ZSBtYW5hZ2VyIGFzIGl0IGNvbnRhaW5zIGEgcmVmZXJlbmNlXG4gICAqIHRvIHRoZSB1bmRlcmx5aW5nIGFuaW1hdGlvbiBsaWJyYXJ5LiBXZSBvbmx5IHdhbnQgdG8gbG9hZCB0aGF0IGlmIHdlIGxvYWQgdGhpcyxcbiAgICogc28gcGVvcGxlIGNhbiBvcHRpb25hbGx5IGNvZGUgc3BsaXQgaXQgb3V0IHVzaW5nIHRoZSBgbWAgY29tcG9uZW50LlxuICAgKi9cbiAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgIHN1cGVyKG5vZGUpO1xuICAgIG5vZGUuYW5pbWF0aW9uU3RhdGUgfHwgKG5vZGUuYW5pbWF0aW9uU3RhdGUgPSBjcmVhdGVBbmltYXRpb25TdGF0ZShub2RlKSk7XG4gIH1cbiAgdXBkYXRlQW5pbWF0aW9uQ29udHJvbHNTdWJzY3JpcHRpb24oKSB7XG4gICAgY29uc3QgeyBhbmltYXRlOiBhbmltYXRlMiB9ID0gdGhpcy5ub2RlLmdldFByb3BzKCk7XG4gICAgaWYgKGlzQW5pbWF0aW9uQ29udHJvbHMoYW5pbWF0ZTIpKSB7XG4gICAgICB0aGlzLnVubW91bnRDb250cm9scyA9IGFuaW1hdGUyLnN1YnNjcmliZSh0aGlzLm5vZGUpO1xuICAgIH1cbiAgfVxuICAvKipcbiAgICogU3Vic2NyaWJlIGFueSBwcm92aWRlZCBBbmltYXRpb25Db250cm9scyB0byB0aGUgY29tcG9uZW50J3MgVmlzdWFsRWxlbWVudFxuICAgKi9cbiAgbW91bnQoKSB7XG4gICAgdGhpcy51cGRhdGVBbmltYXRpb25Db250cm9sc1N1YnNjcmlwdGlvbigpO1xuICB9XG4gIHVwZGF0ZSgpIHtcbiAgICBjb25zdCB7IGFuaW1hdGU6IGFuaW1hdGUyIH0gPSB0aGlzLm5vZGUuZ2V0UHJvcHMoKTtcbiAgICBjb25zdCB7IGFuaW1hdGU6IHByZXZBbmltYXRlIH0gPSB0aGlzLm5vZGUucHJldlByb3BzIHx8IHt9O1xuICAgIGlmIChhbmltYXRlMiAhPT0gcHJldkFuaW1hdGUpIHtcbiAgICAgIHRoaXMudXBkYXRlQW5pbWF0aW9uQ29udHJvbHNTdWJzY3JpcHRpb24oKTtcbiAgICB9XG4gIH1cbiAgdW5tb3VudCgpIHtcbiAgICB2YXIgX2E7XG4gICAgdGhpcy5ub2RlLmFuaW1hdGlvblN0YXRlLnJlc2V0KCk7XG4gICAgKF9hID0gdGhpcy51bm1vdW50Q29udHJvbHMpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jYWxsKHRoaXMpO1xuICB9XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9tb3Rpb24vZmVhdHVyZXMvYW5pbWF0aW9uL2V4aXQubWpzXG52YXIgaW1wb3J0X2Rpc3Q2NDAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY0MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY0MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpZCA9IDA7XG52YXIgRXhpdEFuaW1hdGlvbkZlYXR1cmUgPSBjbGFzcyBleHRlbmRzIEZlYXR1cmUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMuaWQgPSBpZCsrO1xuICB9XG4gI
10617HVwZGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMubm9kZS5wcmVzZW5jZUNvbnRleHQpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgeyBpc1ByZXNlbnQ6IGlzUHJlc2VudDIsIG9uRXhpdENvbXBsZXRlIH0gPSB0aGlzLm5vZGUucHJlc2VuY2VDb250ZXh0O1xuICAgIGNvbnN0IHsgaXNQcmVzZW50OiBwcmV2SXNQcmVzZW50IH0gPSB0aGlzLm5vZGUucHJldlByZXNlbmNlQ29udGV4dCB8fCB7fTtcbiAgICBpZiAoIXRoaXMubm9kZS5hbmltYXRpb25TdGF0ZSB8fCBpc1ByZXNlbnQyID09PSBwcmV2SXNQcmVzZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4aXRBbmltYXRpb24gPSB0aGlzLm5vZGUuYW5pbWF0aW9uU3RhdGUuc2V0QWN0aXZlKFwiZXhpdFwiLCAhaXNQcmVzZW50Mik7XG4gICAgaWYgKG9uRXhpdENvbXBsZXRlICYmICFpc1ByZXNlbnQyKSB7XG4gICAgICBleGl0QW5pbWF0aW9uLnRoZW4oKCkgPT4gb25FeGl0Q29tcGxldGUodGhpcy5pZCkpO1xuICAgIH1cbiAgfVxuICBtb3VudCgpIHtcbiAgICBjb25zdCB7IHJlZ2lzdGVyIH0gPSB0aGlzLm5vZGUucHJlc2VuY2VDb250ZXh0IHx8IHt9O1xuICAgIGlmIChyZWdpc3Rlcikge1xuICAgICAgdGhpcy51bm1vdW50ID0gcmVnaXN0ZXIodGhpcy5pZCk7XG4gICAgfVxuICB9XG4gIHVubW91bnQoKSB7XG4gIH1cbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL21vdGlvbi9mZWF0dXJlcy9hbmltYXRpb25zLm1qc1xudmFyIGFuaW1hdGlvbnMgPSB7XG4gIGFuaW1hdGlvbjoge1xuICAgIEZlYXR1cmU6IEFuaW1hdGlvbkZlYXR1cmVcbiAgfSxcbiAgZXhpdDoge1xuICAgIEZlYXR1cmU6IEV4aXRBbmltYXRpb25GZWF0dXJlXG4gIH1cbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL21vdGlvbi9mZWF0dXJlcy9kcmFnLm1qc1xudmFyIGltcG9ydF9kaXN0NzUxID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3NTIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3NTMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2dlc3R1cmVzL2RyYWcvaW5kZXgubWpzXG52YXIgaW1wb3J0X2Rpc3Q2OTEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY5MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY5MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvZ2VzdHVyZXMvZHJhZy9WaXN1YWxFbGVtZW50RHJhZ0NvbnRyb2xzLm1qc1xudmFyIGltcG9ydF9kaXN0Njg4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q2ODkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q2OTAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2dlc3R1cmVzL3Bhbi9QYW5TZXNzaW9uLm1qc1xudmFyIGltcG9ydF9kaXN0NjU4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q2NTkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q2NjAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2V2ZW50cy9hZGQtcG9pbnRlci1ldmVudC5tanNcbnZhciBpbXBvcnRfZGlzdDY1MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjUzID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjU0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9ldmVudHMvYWRkLWRvbS1ldmVudC5tanNcbnZhciBpbXBvcnRfZGlzdDY0NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjQ3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjQ4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gYWRkRG9tRXZlbnQodGFyZ2V0LCBldmVudE5hbWUsIGhhbmRsZXIsIG9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfSkge1xuICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICByZXR1cm4gKCkgPT4gdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvZXZlbnRzL2V2ZW50LWluZm8ubWpzXG52YXIgaW1wb3J0X2Rpc3Q2NDkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY1MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY1MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIGV4dHJhY3RFdmVudEluZm8oZXZlbnQpIHtcbiAgcmV0dXJuIHtcbiAgICBwb2ludDoge1xuICAgICAgeDogZXZlbnQucGFnZVgsXG4gICAgICB5OiBldmVudC5wYWdlWVxuICAgIH1cbiAgfTtcbn1cbnZhciBhZGRQb2ludGVySW5mbyA9IChoYW5kbGVyKSA9PiB7XG4gIHJldHVybiAoZXZlbnQpID0+IGlzUHJpbWFyeVBvaW50ZXIoZXZlbnQpICYmIGhhbmRsZXIoZXZlbnQsIGV4dHJhY3RFdmVudEluZm8oZXZlbnQpKTtcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2
10617V2ZW50cy9hZGQtcG9pbnRlci1ldmVudC5tanNcbmZ1bmN0aW9uIGFkZFBvaW50ZXJFdmVudCh0YXJnZXQsIGV2ZW50TmFtZSwgaGFuZGxlciwgb3B0aW9ucykge1xuICByZXR1cm4gYWRkRG9tRXZlbnQodGFyZ2V0LCBldmVudE5hbWUsIGFkZFBvaW50ZXJJbmZvKGhhbmRsZXIpLCBvcHRpb25zKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvZGlzdGFuY2UubWpzXG52YXIgaW1wb3J0X2Rpc3Q2NTUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY1NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY1NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBkaXN0YW5jZSA9IChhLCBiKSA9PiBNYXRoLmFicyhhIC0gYik7XG5mdW5jdGlvbiBkaXN0YW5jZTJEKGEsIGIpIHtcbiAgY29uc3QgeERlbHRhID0gZGlzdGFuY2UoYS54LCBiLngpO1xuICBjb25zdCB5RGVsdGEgPSBkaXN0YW5jZShhLnksIGIueSk7XG4gIHJldHVybiBNYXRoLnNxcnQoeERlbHRhICoqIDIgKyB5RGVsdGEgKiogMik7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2dlc3R1cmVzL3Bhbi9QYW5TZXNzaW9uLm1qc1xudmFyIFBhblNlc3Npb24gPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKGV2ZW50LCBoYW5kbGVycywgeyB0cmFuc2Zvcm1QYWdlUG9pbnQsIGNvbnRleHRXaW5kb3csIGRyYWdTbmFwVG9PcmlnaW4gPSBmYWxzZSB9ID0ge30pIHtcbiAgICB0aGlzLnN0YXJ0RXZlbnQgPSBudWxsO1xuICAgIHRoaXMubGFzdE1vdmVFdmVudCA9IG51bGw7XG4gICAgdGhpcy5sYXN0TW92ZUV2ZW50SW5mbyA9IG51bGw7XG4gICAgdGhpcy5oYW5kbGVycyA9IHt9O1xuICAgIHRoaXMuY29udGV4dFdpbmRvdyA9IHdpbmRvdztcbiAgICB0aGlzLnVwZGF0ZVBvaW50ID0gKCkgPT4ge1xuICAgICAgaWYgKCEodGhpcy5sYXN0TW92ZUV2ZW50ICYmIHRoaXMubGFzdE1vdmVFdmVudEluZm8pKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBpbmZvMiA9IGdldFBhbkluZm8odGhpcy5sYXN0TW92ZUV2ZW50SW5mbywgdGhpcy5oaXN0b3J5KTtcbiAgICAgIGNvbnN0IGlzUGFuU3RhcnRlZCA9IHRoaXMuc3RhcnRFdmVudCAhPT0gbnVsbDtcbiAgICAgIGNvbnN0IGlzRGlzdGFuY2VQYXN0VGhyZXNob2xkID0gZGlzdGFuY2UyRChpbmZvMi5vZmZzZXQsIHsgeDogMCwgeTogMCB9KSA+PSAzO1xuICAgICAgaWYgKCFpc1BhblN0YXJ0ZWQgJiYgIWlzRGlzdGFuY2VQYXN0VGhyZXNob2xkKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCB7IHBvaW50OiBwb2ludDMgfSA9IGluZm8yO1xuICAgICAgY29uc3QgeyB0aW1lc3RhbXA6IHRpbWVzdGFtcDIgfSA9IGZyYW1lRGF0YTtcbiAgICAgIHRoaXMuaGlzdG9yeS5wdXNoKHsgLi4ucG9pbnQzLCB0aW1lc3RhbXA6IHRpbWVzdGFtcDIgfSk7XG4gICAgICBjb25zdCB7IG9uU3RhcnQsIG9uTW92ZSB9ID0gdGhpcy5oYW5kbGVycztcbiAgICAgIGlmICghaXNQYW5TdGFydGVkKSB7XG4gICAgICAgIG9uU3RhcnQgJiYgb25TdGFydCh0aGlzLmxhc3RNb3ZlRXZlbnQsIGluZm8yKTtcbiAgICAgICAgdGhpcy5zdGFydEV2ZW50ID0gdGhpcy5sYXN0TW92ZUV2ZW50O1xuICAgICAgfVxuICAgICAgb25Nb3ZlICYmIG9uTW92ZSh0aGlzLmxhc3RNb3ZlRXZlbnQsIGluZm8yKTtcbiAgICB9O1xuICAgIHRoaXMuaGFuZGxlUG9pbnRlck1vdmUgPSAoZXZlbnQyLCBpbmZvMikgPT4ge1xuICAgICAgdGhpcy5sYXN0TW92ZUV2ZW50ID0gZXZlbnQyO1xuICAgICAgdGhpcy5sYXN0TW92ZUV2ZW50SW5mbyA9IHRyYW5zZm9ybVBvaW50KGluZm8yLCB0aGlzLnRyYW5zZm9ybVBhZ2VQb2ludCk7XG4gICAgICBmcmFtZS51cGRhdGUodGhpcy51cGRhdGVQb2ludCwgdHJ1ZSk7XG4gICAgfTtcbiAgICB0aGlzLmhhbmRsZVBvaW50ZXJVcCA9IChldmVudDIsIGluZm8yKSA9PiB7XG4gICAgICB0aGlzLmVuZCgpO1xuICAgICAgY29uc3QgeyBvbkVuZCwgb25TZXNzaW9uRW5kLCByZXN1bWVBbmltYXRpb24gfSA9IHRoaXMuaGFuZGxlcnM7XG4gICAgICBpZiAodGhpcy5kcmFnU25hcFRvT3JpZ2luKVxuICAgICAgICByZXN1bWVBbmltYXRpb24gJiYgcmVzdW1lQW5pbWF0aW9uKCk7XG4gICAgICBpZiAoISh0aGlzLmxhc3RNb3ZlRXZlbnQgJiYgdGhpcy5sYXN0TW92ZUV2ZW50SW5mbykpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IHBhbkluZm8gPSBnZXRQYW5JbmZvKGV2ZW50Mi50eXBlID09PSBcInBvaW50ZXJjYW5jZWxcIiA/IHRoaXMubGFzdE1vdmVFdmVudEluZm8gOiB0cmFuc2Zvcm1Qb2ludChpbmZvMiwgdGhpcy50cmFuc2Zvcm1QYWdlUG9pbnQpLCB0aGlzLmhpc3RvcnkpO1xuICAgICAgaWYgKHRoaXMuc3RhcnRFdmVudCAmJiBvbkVuZCkge1xuICAgICAgICBvbkVuZChldmVudDIsIHBhbkluZm8pO1xuICAgICAgfVxuICAgICAgb25TZXNzaW9uRW5kICYmIG9uU2Vzc2lvbkVuZChldmVudDIsIHBhbkluZm8pO1xuICAgIH07XG4gICAgaWYgKCFpc1ByaW1hcnlQb2ludGVyKGV2ZW50KSlcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLmRyYWdTbmFwVG9PcmlnaW4gPSBkcmFnU25hcFRvT3JpZ2luO1xuICAgIHRoaXMuaGFuZGxlcnMgPSBoYW5kbGVycztcbiAgICB0aGlzLnRyYW5zZm9ybVBhZ2VQb2ludCA9IHRyYW5zZm9ybVBhZ2VQb2ludDtcbiAgICB0aGlzLmNvbnRleHRXaW5kb3cgPSBjb250ZXh0V2luZG93IHx8IHdpbmRvdztcbiAgICBjb25zdCBpbmZvID0gZXh0cmFjdEV2ZW50SW5mbyhldmVudCk7XG4gICAgY29uc3QgaW5pdGlhbEluZm8gPSB0cmFuc2Zvcm1Qb2ludChpbmZvLCB0aGlzLnRyYW5zZm9ybVBhZ2VQb2ludCk7XG4gICAgY29uc3QgeyBwb2ludDogcG9pbnQyIH0gPSBpbml0aWFsSW5mbztcbiAgICBjb25zdCB7IHRpbWVzdGFtcCB9ID0gZnJhbWVEYXRhO1xuICAgIHRoaXMuaGlzdG9yeSA9IFt7IC4uLnBvaW50MiwgdGltZXN0YW1wIH1dO1xuICAgIGNvbnN0IHsgb25TZXNzaW9uU3RhcnQgfSA9IGhhbmRsZXJzO1xuICAgIG9uU2Vzc2lvblN0YXJ0ICYmIG9uU2Vzc2lvblN0YXJ0KGV2ZW50LCBnZXRQYW5JbmZvKGluaXRpYWxJbmZvLCB0aGlzLmhpc3RvcnkpKTtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVycyA9IHBpcGUoYWRkUG9pbnRlckV2ZW50KHRoaXMuY29udGV4dFdpbmRvdywgXCJwb2ludGVybW92ZVwiLCB0aGlzLmhhbmRsZVBvaW50ZXJNb3ZlKSwgYWRkUG9pbnRlckV2ZW50KHRoaXMuY29udGV4dFdpbmRvdywgXCJwb2ludGVydXBcIiwgdGhpcy5oYW5kbGVQb2ludGVyVXApLCBhZGRQb2ludGVyRXZlbnQodGhpcy5jb250ZXh0V2luZG93LCBcInBvaW50ZXJjYW5jZWxcIiwgdGhpcy5oYW5kbGVQb2ludGVyVXApKTtcbiAgfVxuICB1cGRhdGVIYW5kbGVycyhoYW5kbGVycykge1xuICAgIHRoaXMuaGFuZGxlcnMgPSBoYW5kbGVycztcbiAgfVxuICBlbmQoKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcnMgJiYgdGhpcy5yZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICBjYW5jZWxGcmFtZSh0aGlzLnVwZGF0ZVBvaW50KTtcbiAgfVxufTtcbmZ1bmN0aW9uIHRyYW5zZm9ybVBvaW50KGluZm8sIHRyYW5zZm9ybVBhZ2VQb2ludCkge1xuICByZXR1cm4gdHJhbnNmb3JtUGFnZVBvaW50ID8geyBwb2ludDogdHJhbnNmb3JtUGFnZVBvaW50KGluZm8ucG9pbnQpIH0gOiBpbmZvO1xufVxuZnVuY3Rpb24gc3VidHJhY3RQb2ludChhLCBiKSB7XG4gIHJldHVybi
10617B7IHg6IGEueCAtIGIueCwgeTogYS55IC0gYi55IH07XG59XG5mdW5jdGlvbiBnZXRQYW5JbmZvKHsgcG9pbnQ6IHBvaW50MiB9LCBoaXN0b3J5KSB7XG4gIHJldHVybiB7XG4gICAgcG9pbnQ6IHBvaW50MixcbiAgICBkZWx0YTogc3VidHJhY3RQb2ludChwb2ludDIsIGxhc3REZXZpY2VQb2ludChoaXN0b3J5KSksXG4gICAgb2Zmc2V0OiBzdWJ0cmFjdFBvaW50KHBvaW50Miwgc3RhcnREZXZpY2VQb2ludChoaXN0b3J5KSksXG4gICAgdmVsb2NpdHk6IGdldFZlbG9jaXR5KGhpc3RvcnksIDAuMSlcbiAgfTtcbn1cbmZ1bmN0aW9uIHN0YXJ0RGV2aWNlUG9pbnQoaGlzdG9yeSkge1xuICByZXR1cm4gaGlzdG9yeVswXTtcbn1cbmZ1bmN0aW9uIGxhc3REZXZpY2VQb2ludChoaXN0b3J5KSB7XG4gIHJldHVybiBoaXN0b3J5W2hpc3RvcnkubGVuZ3RoIC0gMV07XG59XG5mdW5jdGlvbiBnZXRWZWxvY2l0eShoaXN0b3J5LCB0aW1lRGVsdGEpIHtcbiAgaWYgKGhpc3RvcnkubGVuZ3RoIDwgMikge1xuICAgIHJldHVybiB7IHg6IDAsIHk6IDAgfTtcbiAgfVxuICBsZXQgaSA9IGhpc3RvcnkubGVuZ3RoIC0gMTtcbiAgbGV0IHRpbWVzdGFtcGVkUG9pbnQgPSBudWxsO1xuICBjb25zdCBsYXN0UG9pbnQgPSBsYXN0RGV2aWNlUG9pbnQoaGlzdG9yeSk7XG4gIHdoaWxlIChpID49IDApIHtcbiAgICB0aW1lc3RhbXBlZFBvaW50ID0gaGlzdG9yeVtpXTtcbiAgICBpZiAobGFzdFBvaW50LnRpbWVzdGFtcCAtIHRpbWVzdGFtcGVkUG9pbnQudGltZXN0YW1wID4gc2Vjb25kc1RvTWlsbGlzZWNvbmRzKHRpbWVEZWx0YSkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpLS07XG4gIH1cbiAgaWYgKCF0aW1lc3RhbXBlZFBvaW50KSB7XG4gICAgcmV0dXJuIHsgeDogMCwgeTogMCB9O1xuICB9XG4gIGNvbnN0IHRpbWUyID0gbWlsbGlzZWNvbmRzVG9TZWNvbmRzKGxhc3RQb2ludC50aW1lc3RhbXAgLSB0aW1lc3RhbXBlZFBvaW50LnRpbWVzdGFtcCk7XG4gIGlmICh0aW1lMiA9PT0gMCkge1xuICAgIHJldHVybiB7IHg6IDAsIHk6IDAgfTtcbiAgfVxuICBjb25zdCBjdXJyZW50VmVsb2NpdHkgPSB7XG4gICAgeDogKGxhc3RQb2ludC54IC0gdGltZXN0YW1wZWRQb2ludC54KSAvIHRpbWUyLFxuICAgIHk6IChsYXN0UG9pbnQueSAtIHRpbWVzdGFtcGVkUG9pbnQueSkgLyB0aW1lMlxuICB9O1xuICBpZiAoY3VycmVudFZlbG9jaXR5LnggPT09IEluZmluaXR5KSB7XG4gICAgY3VycmVudFZlbG9jaXR5LnggPSAwO1xuICB9XG4gIGlmIChjdXJyZW50VmVsb2NpdHkueSA9PT0gSW5maW5pdHkpIHtcbiAgICBjdXJyZW50VmVsb2NpdHkueSA9IDA7XG4gIH1cbiAgcmV0dXJuIGN1cnJlbnRWZWxvY2l0eTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvZ2VzdHVyZXMvZHJhZy91dGlscy9jb25zdHJhaW50cy5tanNcbnZhciBpbXBvcnRfZGlzdDY2NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjY1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjY2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9wcm9qZWN0aW9uL2dlb21ldHJ5L2RlbHRhLWNhbGMubWpzXG52YXIgaW1wb3J0X2Rpc3Q2NjEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY2MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY2MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBTQ0FMRV9QUkVDSVNJT04gPSAxZS00O1xudmFyIFNDQUxFX01JTiA9IDEgLSBTQ0FMRV9QUkVDSVNJT047XG52YXIgU0NBTEVfTUFYID0gMSArIFNDQUxFX1BSRUNJU0lPTjtcbnZhciBUUkFOU0xBVEVfUFJFQ0lTSU9OID0gMC4wMTtcbnZhciBUUkFOU0xBVEVfTUlOID0gMCAtIFRSQU5TTEFURV9QUkVDSVNJT047XG52YXIgVFJBTlNMQVRFX01BWCA9IDAgKyBUUkFOU0xBVEVfUFJFQ0lTSU9OO1xuZnVuY3Rpb24gY2FsY0xlbmd0aChheGlzKSB7XG4gIHJldHVybiBheGlzLm1heCAtIGF4aXMubWluO1xufVxuZnVuY3Rpb24gaXNOZWFyKHZhbHVlLCB0YXJnZXQsIG1heERpc3RhbmNlKSB7XG4gIHJldHVybiBNYXRoLmFicyh2YWx1ZSAtIHRhcmdldCkgPD0gbWF4RGlzdGFuY2U7XG59XG5mdW5jdGlvbiBjYWxjQXhpc0RlbHRhKGRlbHRhLCBzb3VyY2UsIHRhcmdldCwgb3JpZ2luID0gMC41KSB7XG4gIGRlbHRhLm9yaWdpbiA9IG9yaWdpbjtcbiAgZGVsdGEub3JpZ2luUG9pbnQgPSBtaXhOdW1iZXIoc291cmNlLm1pbiwgc291cmNlLm1heCwgZGVsdGEub3JpZ2luKTtcbiAgZGVsdGEuc2NhbGUgPSBjYWxjTGVuZ3RoKHRhcmdldCkgLyBjYWxjTGVuZ3RoKHNvdXJjZSk7XG4gIGRlbHRhLnRyYW5zbGF0ZSA9IG1peE51bWJlcih0YXJnZXQubWluLCB0YXJnZXQubWF4LCBkZWx0YS5vcmlnaW4pIC0gZGVsdGEub3JpZ2luUG9pbnQ7XG4gIGlmIChkZWx0YS5zY2FsZSA+PSBTQ0FMRV9NSU4gJiYgZGVsdGEuc2NhbGUgPD0gU0NBTEVfTUFYIHx8IGlzTmFOKGRlbHRhLnNjYWxlKSkge1xuICAgIGRlbHRhLnNjYWxlID0gMTtcbiAgfVxuICBpZiAoZGVsdGEudHJhbnNsYXRlID49IFRSQU5TTEFURV9NSU4gJiYgZGVsdGEudHJhbnNsYXRlIDw9IFRSQU5TTEFURV9NQVggfHwgaXNOYU4oZGVsdGEudHJhbnNsYXRlKSkge1xuICAgIGRlbHRhLnRyYW5zbGF0ZSA9IDA7XG4gIH1cbn1cbmZ1bmN0aW9uIGNhbGNCb3hEZWx0YShkZWx0YSwgc291cmNlLCB0YXJnZXQsIG9yaWdpbikge1xuICBjYWxjQXhpc0RlbHRhKGRlbHRhLngsIHNvdXJjZS54LCB0YXJnZXQueCwgb3JpZ2luID8gb3JpZ2luLm9yaWdpblggOiB2b2lkIDApO1xuICBjYWxjQXhpc0RlbHRhKGRlbHRhLnksIHNvdXJjZS55LCB0YXJnZXQueSwgb3JpZ2luID8gb3JpZ2luLm9yaWdpblkgOiB2b2lkIDApO1xufVxuZnVuY3Rpb24gY2FsY1JlbGF0aXZlQXhpcyh0YXJnZXQsIHJlbGF0aXZlLCBwYXJlbnQpIHtcbiAgdGFyZ2V0Lm1pbiA9IHBhcmVudC5taW4gKyByZWxhdGl2ZS5taW47XG4gIHRhcmdldC5tYXggPSB0YXJnZXQubWluICsgY2FsY0xlbmd0aChyZWxhdGl2ZSk7XG59XG5mdW5jdGlvbiBjYWxjUmVsYXRpdmVCb3godGFyZ2V0LCByZWxhdGl2ZSwgcGFyZW50KSB7XG4gIGNhbGNSZWxhdGl2ZUF4aXModGFyZ2V0LngsIHJlbGF0aXZlLngsIHBhcmVudC54KTtcbiAgY2FsY1JlbGF0aXZlQXhpcyh0YXJnZXQueSwgcmVsYXRpdmUueSwgcGFyZW50LnkpO1xufVxuZnVuY3Rpb24gY2FsY1JlbGF0aXZlQXhpc1Bvc2l0aW9uKHRhcmdldCwgbGF5b3V0MiwgcGFyZW50KSB7XG4gIHRhcmdldC5taW4gPSBsYXlvdXQyLm1pbiAtIHBhcmVudC5taW47XG4gIHRhcmdldC5tYXggPSB0YXJnZXQubWluICsgY2FsY0xlbmd0aChsYXlvdXQyKTtcbn1cbmZ1bmN0aW9uIGNhbGNSZWxhdGl2ZVBvc2l0aW9uKHRhcmdldCwgbGF5b3V0MiwgcGFyZW50KSB7XG4gIGNhbGNSZWxhdGl2ZUF4aXNQb3NpdGlvbih0YXJnZXQueCwgbGF5b3V0Mi54LCBwYXJlbnQueCk7XG4gIGNhbGNSZWxhdGl2ZUF4aXNQb3NpdGlvbih0YXJnZXQueSwgbGF5b3V0Mi55LCBwYXJlbnQueSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2dlc3R1cmVzL2RyYWcvdXRpbHMvY29uc3RyYWludHMubWpzXG5mdW5jdGlvbiBhcHBseUNvbnN0cmFpbnRzKHBvaW50MiwgeyBtaW4sIG1heCB9LCBlbGFzdGljKSB7XG4gIGlmIChtaW4gIT09IHZvaWQgMCAmJiBwb2ludDIgPCBtaW4pIHtcbiAgICBwb2ludDIgPSBlbGFzdGljID8gbWl4TnVtYmVyKG1pbiwgcG9pbnQyLCBlbGFzdGljLm1pbikgOiBNYXRoLm1heChwb2ludDIsIG1pbik7XG4gIH0gZWxzZSBpZiAobWF4ICE9PSB2b2lkIDAgJiYgcG9pbnQyID4gbWF4KSB7XG4gICAgcG9pbnQyID0gZWxhc3RpYyA/IG1peE51bWJlcihtYXgsIHBvaW50MiwgZWxhc3RpYy5tYXgpIDogTWF0aC5taW4ocG9pbnQyLCBtYXgpO1xuICB9XG4gI
10617HJldHVybiBwb2ludDI7XG59XG5mdW5jdGlvbiBjYWxjUmVsYXRpdmVBeGlzQ29uc3RyYWludHMoYXhpcywgbWluLCBtYXgpIHtcbiAgcmV0dXJuIHtcbiAgICBtaW46IG1pbiAhPT0gdm9pZCAwID8gYXhpcy5taW4gKyBtaW4gOiB2b2lkIDAsXG4gICAgbWF4OiBtYXggIT09IHZvaWQgMCA/IGF4aXMubWF4ICsgbWF4IC0gKGF4aXMubWF4IC0gYXhpcy5taW4pIDogdm9pZCAwXG4gIH07XG59XG5mdW5jdGlvbiBjYWxjUmVsYXRpdmVDb25zdHJhaW50cyhsYXlvdXRCb3gsIHsgdG9wLCBsZWZ0LCBib3R0b20sIHJpZ2h0IH0pIHtcbiAgcmV0dXJuIHtcbiAgICB4OiBjYWxjUmVsYXRpdmVBeGlzQ29uc3RyYWludHMobGF5b3V0Qm94LngsIGxlZnQsIHJpZ2h0KSxcbiAgICB5OiBjYWxjUmVsYXRpdmVBeGlzQ29uc3RyYWludHMobGF5b3V0Qm94LnksIHRvcCwgYm90dG9tKVxuICB9O1xufVxuZnVuY3Rpb24gY2FsY1ZpZXdwb3J0QXhpc0NvbnN0cmFpbnRzKGxheW91dEF4aXMsIGNvbnN0cmFpbnRzQXhpcykge1xuICBsZXQgbWluID0gY29uc3RyYWludHNBeGlzLm1pbiAtIGxheW91dEF4aXMubWluO1xuICBsZXQgbWF4ID0gY29uc3RyYWludHNBeGlzLm1heCAtIGxheW91dEF4aXMubWF4O1xuICBpZiAoY29uc3RyYWludHNBeGlzLm1heCAtIGNvbnN0cmFpbnRzQXhpcy5taW4gPCBsYXlvdXRBeGlzLm1heCAtIGxheW91dEF4aXMubWluKSB7XG4gICAgW21pbiwgbWF4XSA9IFttYXgsIG1pbl07XG4gIH1cbiAgcmV0dXJuIHsgbWluLCBtYXggfTtcbn1cbmZ1bmN0aW9uIGNhbGNWaWV3cG9ydENvbnN0cmFpbnRzKGxheW91dEJveCwgY29uc3RyYWludHNCb3gpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiBjYWxjVmlld3BvcnRBeGlzQ29uc3RyYWludHMobGF5b3V0Qm94LngsIGNvbnN0cmFpbnRzQm94LngpLFxuICAgIHk6IGNhbGNWaWV3cG9ydEF4aXNDb25zdHJhaW50cyhsYXlvdXRCb3gueSwgY29uc3RyYWludHNCb3gueSlcbiAgfTtcbn1cbmZ1bmN0aW9uIGNhbGNPcmlnaW4yKHNvdXJjZSwgdGFyZ2V0KSB7XG4gIGxldCBvcmlnaW4gPSAwLjU7XG4gIGNvbnN0IHNvdXJjZUxlbmd0aCA9IGNhbGNMZW5ndGgoc291cmNlKTtcbiAgY29uc3QgdGFyZ2V0TGVuZ3RoID0gY2FsY0xlbmd0aCh0YXJnZXQpO1xuICBpZiAodGFyZ2V0TGVuZ3RoID4gc291cmNlTGVuZ3RoKSB7XG4gICAgb3JpZ2luID0gcHJvZ3Jlc3ModGFyZ2V0Lm1pbiwgdGFyZ2V0Lm1heCAtIHNvdXJjZUxlbmd0aCwgc291cmNlLm1pbik7XG4gIH0gZWxzZSBpZiAoc291cmNlTGVuZ3RoID4gdGFyZ2V0TGVuZ3RoKSB7XG4gICAgb3JpZ2luID0gcHJvZ3Jlc3Moc291cmNlLm1pbiwgc291cmNlLm1heCAtIHRhcmdldExlbmd0aCwgdGFyZ2V0Lm1pbik7XG4gIH1cbiAgcmV0dXJuIGNsYW1wKDAsIDEsIG9yaWdpbik7XG59XG5mdW5jdGlvbiByZWJhc2VBeGlzQ29uc3RyYWludHMobGF5b3V0MiwgY29uc3RyYWludHMpIHtcbiAgY29uc3QgcmVsYXRpdmVDb25zdHJhaW50cyA9IHt9O1xuICBpZiAoY29uc3RyYWludHMubWluICE9PSB2b2lkIDApIHtcbiAgICByZWxhdGl2ZUNvbnN0cmFpbnRzLm1pbiA9IGNvbnN0cmFpbnRzLm1pbiAtIGxheW91dDIubWluO1xuICB9XG4gIGlmIChjb25zdHJhaW50cy5tYXggIT09IHZvaWQgMCkge1xuICAgIHJlbGF0aXZlQ29uc3RyYWludHMubWF4ID0gY29uc3RyYWludHMubWF4IC0gbGF5b3V0Mi5taW47XG4gIH1cbiAgcmV0dXJuIHJlbGF0aXZlQ29uc3RyYWludHM7XG59XG52YXIgZGVmYXVsdEVsYXN0aWMgPSAwLjM1O1xuZnVuY3Rpb24gcmVzb2x2ZURyYWdFbGFzdGljKGRyYWdFbGFzdGljID0gZGVmYXVsdEVsYXN0aWMpIHtcbiAgaWYgKGRyYWdFbGFzdGljID09PSBmYWxzZSkge1xuICAgIGRyYWdFbGFzdGljID0gMDtcbiAgfSBlbHNlIGlmIChkcmFnRWxhc3RpYyA9PT0gdHJ1ZSkge1xuICAgIGRyYWdFbGFzdGljID0gZGVmYXVsdEVsYXN0aWM7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICB4OiByZXNvbHZlQXhpc0VsYXN0aWMoZHJhZ0VsYXN0aWMsIFwibGVmdFwiLCBcInJpZ2h0XCIpLFxuICAgIHk6IHJlc29sdmVBeGlzRWxhc3RpYyhkcmFnRWxhc3RpYywgXCJ0b3BcIiwgXCJib3R0b21cIilcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVBeGlzRWxhc3RpYyhkcmFnRWxhc3RpYywgbWluTGFiZWwsIG1heExhYmVsKSB7XG4gIHJldHVybiB7XG4gICAgbWluOiByZXNvbHZlUG9pbnRFbGFzdGljKGRyYWdFbGFzdGljLCBtaW5MYWJlbCksXG4gICAgbWF4OiByZXNvbHZlUG9pbnRFbGFzdGljKGRyYWdFbGFzdGljLCBtYXhMYWJlbClcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVQb2ludEVsYXN0aWMoZHJhZ0VsYXN0aWMsIGxhYmVsKSB7XG4gIHJldHVybiB0eXBlb2YgZHJhZ0VsYXN0aWMgPT09IFwibnVtYmVyXCIgPyBkcmFnRWxhc3RpYyA6IGRyYWdFbGFzdGljW2xhYmVsXSB8fCAwO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9wcm9qZWN0aW9uL2dlb21ldHJ5L21vZGVscy5tanNcbnZhciBpbXBvcnRfZGlzdDY2NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjY4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjY5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGNyZWF0ZUF4aXNEZWx0YSA9ICgpID0+ICh7XG4gIHRyYW5zbGF0ZTogMCxcbiAgc2NhbGU6IDEsXG4gIG9yaWdpbjogMCxcbiAgb3JpZ2luUG9pbnQ6IDBcbn0pO1xudmFyIGNyZWF0ZURlbHRhID0gKCkgPT4gKHtcbiAgeDogY3JlYXRlQXhpc0RlbHRhKCksXG4gIHk6IGNyZWF0ZUF4aXNEZWx0YSgpXG59KTtcbnZhciBjcmVhdGVBeGlzID0gKCkgPT4gKHsgbWluOiAwLCBtYXg6IDAgfSk7XG52YXIgY3JlYXRlQm94ID0gKCkgPT4gKHtcbiAgeDogY3JlYXRlQXhpcygpLFxuICB5OiBjcmVhdGVBeGlzKClcbn0pO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9wcm9qZWN0aW9uL3V0aWxzL2VhY2gtYXhpcy5tanNcbnZhciBpbXBvcnRfZGlzdDY3MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjcxID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0NjcyID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gZWFjaEF4aXMoY2FsbGJhY2spIHtcbiAgcmV0dXJuIFtjYWxsYmFjayhcInhcIiksIGNhbGxiYWNrKFwieVwiKV07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3Byb2plY3Rpb24vdXRpbHMvbWVhc3VyZS5tanNcbnZhciBpbXBvcnRfZGlzdDY4MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjgzID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0Njg0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9wcm9qZWN0aW9uL2dlb21ldHJ5L2NvbnZlcnNpb24ubWpzXG52YXIgaW1wb3J0X2Rpc3Q2NzMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY3NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY3NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIGNvbnZlcnRCb3VuZGluZ0JveFRvQm94KHsgdG9wLCBsZWZ0LCByaWdodCwgYm90dG9tIH0pIHtcbiAgcmV0dXJuIHtcbiAgICB4OiB7IG1pbjogbGVmdCwgbWF4OiByaWdodCB9LFxuICAgIHk6IHsgbWluOiB0b3AsIG1heDogYm90dG9tIH1cbiAgfTtcbn1cbmZ1bmN0aW9uIGNvbnZlcnRCb3hUb0JvdW5kaW5nQm94KHsgeCwgeSB9KSB7XG4gIHJldHVybiB7IHRvcDogeS5taW4sIHJpZ2h0OiB4Lm1heCwgYm90dG9tOiB5Lm1heCwgbGVmdDogeC5taW4gfTtcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybUJveFBvaW50cyhwb2ludDIsIHRyYW5zZm9ybVBvaW50Mikge1xuICBpZiAoIXRyYW5zZm9ybVBvaW50MilcbiAgICByZXR1cm4gcG9pbnQyO1xuICBjb25zdCB0b3BMZWZ0ID0gdHJhbnNmb3JtUG9pbnQyKHsgeDogcG9pbnQyLmxlZnQsIHk6IHBvaW50Mi50b3AgfSk7XG4gIGNvbnN0IGJvdHRvbVJpZ2h0ID0gdHJhbnNmb3JtUG9pbnQyKHsgeDogcG9pbnQyLnJpZ2h0LCB5OiBwb2ludDIuYm90dG9tIH0pO1xuICByZXR1cm4ge1xuICAgIHRvcDogdG9wTGVmdC55LFxuICAgIGxlZnQ6IHRvcExlZnQueCxcbiAgICBib3R0b206IGJvdHRvbVJpZ2h0LnksXG4gICAgcmlnaHQ6IGJvdHRvbVJpZ2h0LnhcbiAgfTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcHJvamVjdGlvbi9nZW9tZXRyeS9kZWx0YS1hcHBseS5tanNcbnZhciBpbXBvcnRfZGlzdDY3OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjgwID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NjgxID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9wcm9qZWN0aW9uL3V0aWxzL2hhcy10cmFuc2Zvcm0ubWpzXG52YXIgaW1wb3J0X2Rpc3Q2NzYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY3NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY3OCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIGlzSWRlbnRpdHlTY2FsZShzY2FsZTIpIHtcbiAgcmV0dXJuIHNjYWxlMiA9PT0gdm9pZCAwIHx8IHNjYWxlMiA9PT0gMTtcbn1cbmZ1bmN0aW9uIGhhc1NjYWxlKHsgc2NhbGU6IHNjYWxlMiwgc2NhbGVYLCBzY2FsZVkgfSkge1xuICByZXR1cm4gIWlzSWRlbnRpdHlTY2FsZShzY2FsZTIpIHx8ICFpc0lkZW50aXR5U2NhbGUoc2NhbGVYKSB8fCAhaXNJZGVudGl0eVNjYWxlKHNjYWxlWSk7XG59XG5mdW5jdGlvbiBoYXNUcmFuc2Zvcm0odmFsdWVzKSB7XG4gIHJldHVybiBoYXNTY2FsZSh2YWx1ZXMpIHx8IGhhczJEVHJhbnNsYXRlKHZhbHVlcykgfHwgdmFsdWVzLnogfHwgdmFsdWVzLnJvdGF0ZSB8fCB2YWx1ZXMucm90YXRlWCB8fCB2YWx1ZXMucm90YXRlWSB8fCB2YWx1ZXMuc2tld1ggfHwgdmFsdWVzLnNrZXdZO1xufVxuZnVuY3Rpb24gaGFzMkRUcmFuc2xhdGUodmFsdWVzKSB7XG4gIHJldHVybiBpczJEVHJhbnNsYXRlKHZhbHVlcy54KSB8fCBpczJEVHJhbnNsYXRlKHZhbHVlcy55KTtcbn1cbmZ1bmN0aW9uIGlzMkRUcmFuc2xhdGUodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIHZhbHVlICE9PSBcIjAlXCI7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3Byb2plY3Rpb24vZ2VvbWV0cnkvZGVsdGEtYXBwbHkubWpzXG5mdW5jdGlvbiBzY2FsZVBvaW50KHBvaW50Miwgc2NhbGUyLCBvcmlnaW5Qb2ludCkge1xuICBjb25zdCBkaXN0YW5jZUZyb21PcmlnaW4gPSBwb2ludDIgLSBvcmlnaW5Qb2ludDtcbiAgY29uc3Qgc2NhbGVkID0gc2NhbGUyICogZGlzdGFuY2VGcm9tT3JpZ2luO1xuICByZXR1cm4gb3JpZ2luUG9pbnQgKyBzY2FsZWQ7XG59XG5mdW5jdGlvbiBhcHBseVBvaW50RGVsdGEocG9pbnQyLCB0cmFuc2xhdGUsIHNjYWxlMiwgb3JpZ2luUG9pbnQsIGJveFNjYWxlKSB7XG4gIGlmIChib3hTY2FsZSAhPT0gdm9pZCAwKSB7XG4gICAgcG9pbnQyID0gc2NhbGVQb2ludChwb2ludDIsIGJveFNjYWxlLCBvcmlnaW5Qb2ludCk7XG4gIH1cbiAgcmV0dXJuIHNjYWxlUG9pbnQocG9pbnQyLCBzY2FsZTIsIG9yaWdpblBvaW50KSArIHRyYW5zbGF0ZTtcbn1cbmZ1bmN0aW9uIGFwcGx5QXhpc0RlbHRhKGF4aXMsIHRyYW5zbGF0ZSA9IDAsIHNjYWxlMiA9IDEsIG9yaWdpblBvaW50LCBib3hTY2FsZSkge1xuICBheGlzLm1pbiA9IGFwcGx5UG9pbnREZWx0YShheGlzLm1pbiwgdHJhbnNsYXRlLCBzY2FsZTIsIG9yaWdpblBvaW50LCBib3hTY2FsZSk7XG4gIGF4aXMubWF4ID0gYXBwbHlQb2ludERlbHRhKGF4aXMubWF4LCB0cmFuc2xhdGUsIHNjYWxlMiwgb3JpZ2luUG9pbnQsIGJveFNjYWxlKTtcbn1cbmZ1bmN0aW9uIGFwcGx5Qm94RGVsdGEoYm94LCB7IHgsIHkgfSkge1xuICBhcHBseUF4aXNEZWx0YShib3gueCwgeC50cmFuc2xhdGUsIHguc2NhbGUsIHgub3JpZ2luUG9pbnQpO1xuICBhcHBseUF4aXNEZWx0YShib3gueSwgeS50cmFuc2xhdGUsIHkuc2NhbGUsIHkub3JpZ2luUG9pbnQpO1xufVxudmFyIFRSRUVfU0NBTEVfU05BUF9NSU4gPSAwLjk5OTk5OTk5OTk5OTtcbnZhciBUUkVFX1NDQUxFX1NOQVBfTUFYID0gMS4wMDAwMDAwMDAwMDAxO1xuZnVuY3Rpb24gYXBwbHlUcmVlRGVsdGFzKGJveCwgdHJlZVNjYWxlLCB0cmVlUGF0aCwgaXNTaGFyZWRUcmFuc2l0aW9uID0gZmFsc2UpIHtcbiAgY29uc3QgdHJlZUxlbmd0aCA9IHRyZWVQYXR
10617oLmxlbmd0aDtcbiAgaWYgKCF0cmVlTGVuZ3RoKVxuICAgIHJldHVybjtcbiAgdHJlZVNjYWxlLnggPSB0cmVlU2NhbGUueSA9IDE7XG4gIGxldCBub2RlO1xuICBsZXQgZGVsdGE7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdHJlZUxlbmd0aDsgaSsrKSB7XG4gICAgbm9kZSA9IHRyZWVQYXRoW2ldO1xuICAgIGRlbHRhID0gbm9kZS5wcm9qZWN0aW9uRGVsdGE7XG4gICAgY29uc3QgeyB2aXN1YWxFbGVtZW50IH0gPSBub2RlLm9wdGlvbnM7XG4gICAgaWYgKHZpc3VhbEVsZW1lbnQgJiYgdmlzdWFsRWxlbWVudC5wcm9wcy5zdHlsZSAmJiB2aXN1YWxFbGVtZW50LnByb3BzLnN0eWxlLmRpc3BsYXkgPT09IFwiY29udGVudHNcIikge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChpc1NoYXJlZFRyYW5zaXRpb24gJiYgbm9kZS5vcHRpb25zLmxheW91dFNjcm9sbCAmJiBub2RlLnNjcm9sbCAmJiBub2RlICE9PSBub2RlLnJvb3QpIHtcbiAgICAgIHRyYW5zZm9ybUJveChib3gsIHtcbiAgICAgICAgeDogLW5vZGUuc2Nyb2xsLm9mZnNldC54LFxuICAgICAgICB5OiAtbm9kZS5zY3JvbGwub2Zmc2V0LnlcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZGVsdGEpIHtcbiAgICAgIHRyZWVTY2FsZS54ICo9IGRlbHRhLnguc2NhbGU7XG4gICAgICB0cmVlU2NhbGUueSAqPSBkZWx0YS55LnNjYWxlO1xuICAgICAgYXBwbHlCb3hEZWx0YShib3gsIGRlbHRhKTtcbiAgICB9XG4gICAgaWYgKGlzU2hhcmVkVHJhbnNpdGlvbiAmJiBoYXNUcmFuc2Zvcm0obm9kZS5sYXRlc3RWYWx1ZXMpKSB7XG4gICAgICB0cmFuc2Zvcm1Cb3goYm94LCBub2RlLmxhdGVzdFZhbHVlcyk7XG4gICAgfVxuICB9XG4gIGlmICh0cmVlU2NhbGUueCA8IFRSRUVfU0NBTEVfU05BUF9NQVggJiYgdHJlZVNjYWxlLnggPiBUUkVFX1NDQUxFX1NOQVBfTUlOKSB7XG4gICAgdHJlZVNjYWxlLnggPSAxO1xuICB9XG4gIGlmICh0cmVlU2NhbGUueSA8IFRSRUVfU0NBTEVfU05BUF9NQVggJiYgdHJlZVNjYWxlLnkgPiBUUkVFX1NDQUxFX1NOQVBfTUlOKSB7XG4gICAgdHJlZVNjYWxlLnkgPSAxO1xuICB9XG59XG5mdW5jdGlvbiB0cmFuc2xhdGVBeGlzKGF4aXMsIGRpc3RhbmNlMikge1xuICBheGlzLm1pbiA9IGF4aXMubWluICsgZGlzdGFuY2UyO1xuICBheGlzLm1heCA9IGF4aXMubWF4ICsgZGlzdGFuY2UyO1xufVxuZnVuY3Rpb24gdHJhbnNmb3JtQXhpcyhheGlzLCBheGlzVHJhbnNsYXRlLCBheGlzU2NhbGUsIGJveFNjYWxlLCBheGlzT3JpZ2luID0gMC41KSB7XG4gIGNvbnN0IG9yaWdpblBvaW50ID0gbWl4TnVtYmVyKGF4aXMubWluLCBheGlzLm1heCwgYXhpc09yaWdpbik7XG4gIGFwcGx5QXhpc0RlbHRhKGF4aXMsIGF4aXNUcmFuc2xhdGUsIGF4aXNTY2FsZSwgb3JpZ2luUG9pbnQsIGJveFNjYWxlKTtcbn1cbmZ1bmN0aW9uIHRyYW5zZm9ybUJveChib3gsIHRyYW5zZm9ybTIpIHtcbiAgdHJhbnNmb3JtQXhpcyhib3gueCwgdHJhbnNmb3JtMi54LCB0cmFuc2Zvcm0yLnNjYWxlWCwgdHJhbnNmb3JtMi5zY2FsZSwgdHJhbnNmb3JtMi5vcmlnaW5YKTtcbiAgdHJhbnNmb3JtQXhpcyhib3gueSwgdHJhbnNmb3JtMi55LCB0cmFuc2Zvcm0yLnNjYWxlWSwgdHJhbnNmb3JtMi5zY2FsZSwgdHJhbnNmb3JtMi5vcmlnaW5ZKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcHJvamVjdGlvbi91dGlscy9tZWFzdXJlLm1qc1xuZnVuY3Rpb24gbWVhc3VyZVZpZXdwb3J0Qm94KGluc3RhbmNlLCB0cmFuc2Zvcm1Qb2ludDIpIHtcbiAgcmV0dXJuIGNvbnZlcnRCb3VuZGluZ0JveFRvQm94KHRyYW5zZm9ybUJveFBvaW50cyhpbnN0YW5jZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgdHJhbnNmb3JtUG9pbnQyKSk7XG59XG5mdW5jdGlvbiBtZWFzdXJlUGFnZUJveChlbGVtZW50LCByb290UHJvamVjdGlvbk5vZGUyLCB0cmFuc2Zvcm1QYWdlUG9pbnQpIHtcbiAgY29uc3Qgdmlld3BvcnRCb3ggPSBtZWFzdXJlVmlld3BvcnRCb3goZWxlbWVudCwgdHJhbnNmb3JtUGFnZVBvaW50KTtcbiAgY29uc3QgeyBzY3JvbGw6IHNjcm9sbDIgfSA9IHJvb3RQcm9qZWN0aW9uTm9kZTI7XG4gIGlmIChzY3JvbGwyKSB7XG4gICAgdHJhbnNsYXRlQXhpcyh2aWV3cG9ydEJveC54LCBzY3JvbGwyLm9mZnNldC54KTtcbiAgICB0cmFuc2xhdGVBeGlzKHZpZXdwb3J0Qm94LnksIHNjcm9sbDIub2Zmc2V0LnkpO1xuICB9XG4gIHJldHVybiB2aWV3cG9ydEJveDtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvZ2V0LWNvbnRleHQtd2luZG93Lm1qc1xudmFyIGltcG9ydF9kaXN0Njg1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q2ODYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q2ODcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgZ2V0Q29udGV4dFdpbmRvdyA9ICh7IGN1cnJlbnQgfSkgPT4ge1xuICByZXR1cm4gY3VycmVudCA/IGN1cnJlbnQub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyA6IG51bGw7XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9nZXN0dXJlcy9kcmFnL1Zpc3VhbEVsZW1lbnREcmFnQ29udHJvbHMubWpzXG52YXIgZWxlbWVudERyYWdDb250cm9scyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xudmFyIFZpc3VhbEVsZW1lbnREcmFnQ29udHJvbHMgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKHZpc3VhbEVsZW1lbnQpIHtcbiAgICB0aGlzLm9wZW5EcmFnTG9jayA9IG51bGw7XG4gICAgdGhpcy5pc0RyYWdnaW5nID0gZmFsc2U7XG4gICAgdGhpcy5jdXJyZW50RGlyZWN0aW9uID0gbnVsbDtcbiAgICB0aGlzLm9yaWdpblBvaW50ID0geyB4OiAwLCB5OiAwIH07XG4gICAgdGhpcy5jb25zdHJhaW50cyA9IGZhbHNlO1xuICAgIHRoaXMuaGFzTXV0YXRlZENvbnN0cmFpbnRzID0gZmFsc2U7XG4gICAgdGhpcy5lbGFzdGljID0gY3JlYXRlQm94KCk7XG4gICAgdGhpcy52aXN1YWxFbGVtZW50ID0gdmlzdWFsRWxlbWVudDtcbiAgfVxuICBzdGFydChvcmlnaW5FdmVudCwgeyBzbmFwVG9DdXJzb3IgPSBmYWxzZSB9ID0ge30pIHtcbiAgICBjb25zdCB7IHByZXNlbmNlQ29udGV4dCB9ID0gdGhpcy52aXN1YWxFbGVtZW50O1xuICAgIGlmIChwcmVzZW5jZUNvbnRleHQgJiYgcHJlc2VuY2VDb250ZXh0LmlzUHJlc2VudCA9PT0gZmFsc2UpXG4gICAgICByZXR1cm47XG4gICAgY29uc3Qgb25TZXNzaW9uU3RhcnQgPSAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgZHJhZ1NuYXBUb09yaWdpbjogZHJhZ1NuYXBUb09yaWdpbjIgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICAgIGRyYWdTbmFwVG9PcmlnaW4yID8gdGhpcy5wYXVzZUFuaW1hdGlvbigpIDogdGhpcy5zdG9wQW5pbWF0aW9uKCk7XG4gICAgICBpZiAoc25hcFRvQ3Vyc29yKSB7XG4gICAgICAgI
10617HRoaXMuc25hcFRvQ3Vyc29yKGV4dHJhY3RFdmVudEluZm8oZXZlbnQpLnBvaW50KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IG9uU3RhcnQgPSAoZXZlbnQsIGluZm8pID0+IHtcbiAgICAgIGNvbnN0IHsgZHJhZzogZHJhZzIsIGRyYWdQcm9wYWdhdGlvbiwgb25EcmFnU3RhcnQgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICAgIGlmIChkcmFnMiAmJiAhZHJhZ1Byb3BhZ2F0aW9uKSB7XG4gICAgICAgIGlmICh0aGlzLm9wZW5EcmFnTG9jaylcbiAgICAgICAgICB0aGlzLm9wZW5EcmFnTG9jaygpO1xuICAgICAgICB0aGlzLm9wZW5EcmFnTG9jayA9IHNldERyYWdMb2NrKGRyYWcyKTtcbiAgICAgICAgaWYgKCF0aGlzLm9wZW5EcmFnTG9jaylcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmlzRHJhZ2dpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5jdXJyZW50RGlyZWN0aW9uID0gbnVsbDtcbiAgICAgIHRoaXMucmVzb2x2ZUNvbnN0cmFpbnRzKCk7XG4gICAgICBpZiAodGhpcy52aXN1YWxFbGVtZW50LnByb2plY3Rpb24pIHtcbiAgICAgICAgdGhpcy52aXN1YWxFbGVtZW50LnByb2plY3Rpb24uaXNBbmltYXRpb25CbG9ja2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aXN1YWxFbGVtZW50LnByb2plY3Rpb24udGFyZ2V0ID0gdm9pZCAwO1xuICAgICAgfVxuICAgICAgZWFjaEF4aXMoKGF4aXMpID0+IHtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLmdldEF4aXNNb3Rpb25WYWx1ZShheGlzKS5nZXQoKSB8fCAwO1xuICAgICAgICBpZiAocGVyY2VudC50ZXN0KGN1cnJlbnQpKSB7XG4gICAgICAgICAgY29uc3QgeyBwcm9qZWN0aW9uIH0gPSB0aGlzLnZpc3VhbEVsZW1lbnQ7XG4gICAgICAgICAgaWYgKHByb2plY3Rpb24gJiYgcHJvamVjdGlvbi5sYXlvdXQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lYXN1cmVkQXhpcyA9IHByb2plY3Rpb24ubGF5b3V0LmxheW91dEJveFtheGlzXTtcbiAgICAgICAgICAgIGlmIChtZWFzdXJlZEF4aXMpIHtcbiAgICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gY2FsY0xlbmd0aChtZWFzdXJlZEF4aXMpO1xuICAgICAgICAgICAgICBjdXJyZW50ID0gbGVuZ3RoICogKHBhcnNlRmxvYXQoY3VycmVudCkgLyAxMDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLm9yaWdpblBvaW50W2F4aXNdID0gY3VycmVudDtcbiAgICAgIH0pO1xuICAgICAgaWYgKG9uRHJhZ1N0YXJ0KSB7XG4gICAgICAgIGZyYW1lLnBvc3RSZW5kZXIoKCkgPT4gb25EcmFnU3RhcnQoZXZlbnQsIGluZm8pKTtcbiAgICAgIH1cbiAgICAgIGFkZFZhbHVlVG9XaWxsQ2hhbmdlKHRoaXMudmlzdWFsRWxlbWVudCwgXCJ0cmFuc2Zvcm1cIik7XG4gICAgICBjb25zdCB7IGFuaW1hdGlvblN0YXRlIH0gPSB0aGlzLnZpc3VhbEVsZW1lbnQ7XG4gICAgICBhbmltYXRpb25TdGF0ZSAmJiBhbmltYXRpb25TdGF0ZS5zZXRBY3RpdmUoXCJ3aGlsZURyYWdcIiwgdHJ1ZSk7XG4gICAgfTtcbiAgICBjb25zdCBvbk1vdmUgPSAoZXZlbnQsIGluZm8pID0+IHtcbiAgICAgIGNvbnN0IHsgZHJhZ1Byb3BhZ2F0aW9uLCBkcmFnRGlyZWN0aW9uTG9jaywgb25EaXJlY3Rpb25Mb2NrLCBvbkRyYWcgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICAgIGlmICghZHJhZ1Byb3BhZ2F0aW9uICYmICF0aGlzLm9wZW5EcmFnTG9jaylcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgeyBvZmZzZXQgfSA9IGluZm87XG4gICAgICBpZiAoZHJhZ0RpcmVjdGlvbkxvY2sgJiYgdGhpcy5jdXJyZW50RGlyZWN0aW9uID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMuY3VycmVudERpcmVjdGlvbiA9IGdldEN1cnJlbnREaXJlY3Rpb24ob2Zmc2V0KTtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudERpcmVjdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICAgIG9uRGlyZWN0aW9uTG9jayAmJiBvbkRpcmVjdGlvbkxvY2sodGhpcy5jdXJyZW50RGlyZWN0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnVwZGF0ZUF4aXMoXCJ4XCIsIGluZm8ucG9pbnQsIG9mZnNldCk7XG4gICAgICB0aGlzLnVwZGF0ZUF4aXMoXCJ5XCIsIGluZm8ucG9pbnQsIG9mZnNldCk7XG4gICAgICB0aGlzLnZpc3VhbEVsZW1lbnQucmVuZGVyKCk7XG4gICAgICBvbkRyYWcgJiYgb25EcmFnKGV2ZW50LCBpbmZvKTtcbiAgICB9O1xuICAgIGNvbnN0IG9uU2Vzc2lvbkVuZCA9IChldmVudCwgaW5mbykgPT4gdGhpcy5zdG9wKGV2ZW50LCBpbmZvKTtcbiAgICBjb25zdCByZXN1bWVBbmltYXRpb24gPSAoKSA9PiBlYWNoQXhpcygoYXhpcykgPT4ge1xuICAgICAgdmFyIF9hO1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0QW5pbWF0aW9uU3RhdGUoYXhpcykgPT09IFwicGF1c2VkXCIgJiYgKChfYSA9IHRoaXMuZ2V0QXhpc01vdGlvblZhbHVlKGF4aXMpLmFuaW1hdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBsYXkoKSk7XG4gICAgfSk7XG4gICAgY29uc3QgeyBkcmFnU25hcFRvT3JpZ2luIH0gPSB0aGlzLmdldFByb3BzKCk7XG4gICAgdGhpcy5wYW5TZXNzaW9uID0gbmV3IFBhblNlc3Npb24ob3JpZ2luRXZlbnQsIHtcbiAgICAgIG9uU2Vzc2lvblN0YXJ0LFxuICAgICAgb25TdGFydCxcbiAgICAgIG9uTW92ZSxcbiAgICAgIG9uU2Vzc2lvbkVuZCxcbiAgICAgIHJlc3VtZUFuaW1hdGlvblxuICAgIH0sIHtcbiAgICAgIHRyYW5zZm9ybVBhZ2VQb2ludDogdGhpcy52aXN1YWxFbGVtZW50LmdldFRyYW5zZm9ybVBhZ2VQb2ludCgpLFxuICAgICAgZHJhZ1NuYXBUb09yaWdpbixcbiAgICAgIGNvbnRleHRXaW5kb3c6IGdldENvbnRleHRXaW5kb3codGhpcy52aXN1YWxFbGVtZW50KVxuICAgIH0pO1xuICB9XG4gIHN0b3AoZXZlbnQsIGluZm8pIHtcbiAgICBjb25zdCBpc0RyYWdnaW5nMiA9IHRoaXMuaXNEcmFnZ2luZztcbiAgICB0aGlzLmNhbmNlbCgpO1xuICAgIGlmICghaXNEcmFnZ2luZzIpXG4gICAgICByZXR1cm47XG4gICAgY29uc3QgeyB2ZWxvY2l0eSB9ID0gaW5mbztcbiAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uKHZlbG9jaXR5KTtcbiAgICBjb25zdCB7IG9uRHJhZ0VuZCB9ID0gdGhpcy5nZXRQcm9wcygpO1xuICAgIGlmIChvbkRyYWdFbmQpIHtcbiAgICAgIGZyYW1lLnBvc3RSZW5kZXIoKCkgPT4gb25EcmFnRW5kKGV2ZW50LCBpbmZvKSk7XG4gICAgfVxuICB9XG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICBjb25zdCB7IHByb2plY3Rpb24sIGFuaW1hdGlvblN0YXRlIH0gPSB0aGlzLnZpc3VhbEVsZW1lbnQ7XG4gICAgaWYgKHByb2plY3Rpb24pIHtcbiAgICAgIHByb2plY3Rpb24uaXNBbmltYXRpb25CbG9ja2VkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMucGFuU2Vzc2lvbiAmJiB0aGlzLnBhblNlc3Npb24uZW5kKCk7XG4gICAgdGhpcy5wYW5TZXNzaW9uID0gdm9pZCAwO1xuICAgIGNvbnN0IHsgZHJhZ1Byb3BhZ2F0aW9uIH0gPSB0aGlzLmdldFByb3BzKCk7XG4gICAgaWYgKCFkcmFnUHJvcGFnYXRpb24gJiYgdGhpcy5vcGVuRHJhZ0xvY2spIHtcbiAgICAgIHRoaXMub3BlbkRyYWdMb2NrKCk7XG4gICAgICB0aGlzLm9wZW5EcmFnTG9jayA9IG51bGw7XG4gICAgfVxuICAgIGFuaW1hdGlvblN0YXRlICYmIGFuaW1hdGlvblN0YXRlLnNldEFjdGl2ZShcIndoaWxlRHJhZ1wiLCBmYWxzZSk7XG4gIH1cbiAgdXBkYXRlQXhpcyhheGlzLCBfcG9pbnQsIG9mZnNldCkge1xuICAgIGNvbnN0IHsgZHJhZzogZHJhZzIgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICBpZiAoIW9mZnNldCB8fCAhc2hvdWxkRHJhZyhheGlzLCBkcmFnMiwgdGhpcy5jdXJyZW50RGlyZWN0aW9uKSlcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBheGlzVmFsdWUgPSB0aGlzLmdldEF4aXNNb3Rpb25WYWx1ZShheGlzKTtcbiAgICBsZXQgbm
10617V4dCA9IHRoaXMub3JpZ2luUG9pbnRbYXhpc10gKyBvZmZzZXRbYXhpc107XG4gICAgaWYgKHRoaXMuY29uc3RyYWludHMgJiYgdGhpcy5jb25zdHJhaW50c1theGlzXSkge1xuICAgICAgbmV4dCA9IGFwcGx5Q29uc3RyYWludHMobmV4dCwgdGhpcy5jb25zdHJhaW50c1theGlzXSwgdGhpcy5lbGFzdGljW2F4aXNdKTtcbiAgICB9XG4gICAgYXhpc1ZhbHVlLnNldChuZXh0KTtcbiAgfVxuICByZXNvbHZlQ29uc3RyYWludHMoKSB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IHsgZHJhZ0NvbnN0cmFpbnRzLCBkcmFnRWxhc3RpYyB9ID0gdGhpcy5nZXRQcm9wcygpO1xuICAgIGNvbnN0IGxheW91dDIgPSB0aGlzLnZpc3VhbEVsZW1lbnQucHJvamVjdGlvbiAmJiAhdGhpcy52aXN1YWxFbGVtZW50LnByb2plY3Rpb24ubGF5b3V0ID8gdGhpcy52aXN1YWxFbGVtZW50LnByb2plY3Rpb24ubWVhc3VyZShmYWxzZSkgOiAoX2EgPSB0aGlzLnZpc3VhbEVsZW1lbnQucHJvamVjdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmxheW91dDtcbiAgICBjb25zdCBwcmV2Q29uc3RyYWludHMgPSB0aGlzLmNvbnN0cmFpbnRzO1xuICAgIGlmIChkcmFnQ29uc3RyYWludHMgJiYgaXNSZWZPYmplY3QoZHJhZ0NvbnN0cmFpbnRzKSkge1xuICAgICAgaWYgKCF0aGlzLmNvbnN0cmFpbnRzKSB7XG4gICAgICAgIHRoaXMuY29uc3RyYWludHMgPSB0aGlzLnJlc29sdmVSZWZDb25zdHJhaW50cygpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoZHJhZ0NvbnN0cmFpbnRzICYmIGxheW91dDIpIHtcbiAgICAgICAgdGhpcy5jb25zdHJhaW50cyA9IGNhbGNSZWxhdGl2ZUNvbnN0cmFpbnRzKGxheW91dDIubGF5b3V0Qm94LCBkcmFnQ29uc3RyYWludHMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jb25zdHJhaW50cyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmVsYXN0aWMgPSByZXNvbHZlRHJhZ0VsYXN0aWMoZHJhZ0VsYXN0aWMpO1xuICAgIGlmIChwcmV2Q29uc3RyYWludHMgIT09IHRoaXMuY29uc3RyYWludHMgJiYgbGF5b3V0MiAmJiB0aGlzLmNvbnN0cmFpbnRzICYmICF0aGlzLmhhc011dGF0ZWRDb25zdHJhaW50cykge1xuICAgICAgZWFjaEF4aXMoKGF4aXMpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29uc3RyYWludHMgIT09IGZhbHNlICYmIHRoaXMuZ2V0QXhpc01vdGlvblZhbHVlKGF4aXMpKSB7XG4gICAgICAgICAgdGhpcy5jb25zdHJhaW50c1theGlzXSA9IHJlYmFzZUF4aXNDb25zdHJhaW50cyhsYXlvdXQyLmxheW91dEJveFtheGlzXSwgdGhpcy5jb25zdHJhaW50c1theGlzXSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXNvbHZlUmVmQ29uc3RyYWludHMoKSB7XG4gICAgY29uc3QgeyBkcmFnQ29uc3RyYWludHM6IGNvbnN0cmFpbnRzLCBvbk1lYXN1cmVEcmFnQ29uc3RyYWludHMgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICBpZiAoIWNvbnN0cmFpbnRzIHx8ICFpc1JlZk9iamVjdChjb25zdHJhaW50cykpXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgY29uc3QgY29uc3RyYWludHNFbGVtZW50ID0gY29uc3RyYWludHMuY3VycmVudDtcbiAgICBpbnZhcmlhbnQoY29uc3RyYWludHNFbGVtZW50ICE9PSBudWxsLCBcIklmIGBkcmFnQ29uc3RyYWludHNgIGlzIHNldCBhcyBhIFJlYWN0IHJlZiwgdGhhdCByZWYgbXVzdCBiZSBwYXNzZWQgdG8gYW5vdGhlciBjb21wb25lbnQncyBgcmVmYCBwcm9wLlwiKTtcbiAgICBjb25zdCB7IHByb2plY3Rpb24gfSA9IHRoaXMudmlzdWFsRWxlbWVudDtcbiAgICBpZiAoIXByb2plY3Rpb24gfHwgIXByb2plY3Rpb24ubGF5b3V0KVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNvbnN0cmFpbnRzQm94ID0gbWVhc3VyZVBhZ2VCb3goY29uc3RyYWludHNFbGVtZW50LCBwcm9qZWN0aW9uLnJvb3QsIHRoaXMudmlzdWFsRWxlbWVudC5nZXRUcmFuc2Zvcm1QYWdlUG9pbnQoKSk7XG4gICAgbGV0IG1lYXN1cmVkQ29uc3RyYWludHMgPSBjYWxjVmlld3BvcnRDb25zdHJhaW50cyhwcm9qZWN0aW9uLmxheW91dC5sYXlvdXRCb3gsIGNvbnN0cmFpbnRzQm94KTtcbiAgICBpZiAob25NZWFzdXJlRHJhZ0NvbnN0cmFpbnRzKSB7XG4gICAgICBjb25zdCB1c2VyQ29uc3RyYWludHMgPSBvbk1lYXN1cmVEcmFnQ29uc3RyYWludHMoY29udmVydEJveFRvQm91bmRpbmdCb3gobWVhc3VyZWRDb25zdHJhaW50cykpO1xuICAgICAgdGhpcy5oYXNNdXRhdGVkQ29uc3RyYWludHMgPSAhIXVzZXJDb25zdHJhaW50cztcbiAgICAgIGlmICh1c2VyQ29uc3RyYWludHMpIHtcbiAgICAgICAgbWVhc3VyZWRDb25zdHJhaW50cyA9IGNvbnZlcnRCb3VuZGluZ0JveFRvQm94KHVzZXJDb25zdHJhaW50cyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtZWFzdXJlZENvbnN0cmFpbnRzO1xuICB9XG4gIHN0YXJ0QW5pbWF0aW9uKHZlbG9jaXR5KSB7XG4gICAgY29uc3QgeyBkcmFnOiBkcmFnMiwgZHJhZ01vbWVudHVtLCBkcmFnRWxhc3RpYywgZHJhZ1RyYW5zaXRpb24sIGRyYWdTbmFwVG9PcmlnaW4sIG9uRHJhZ1RyYW5zaXRpb25FbmQgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICBjb25zdCBjb25zdHJhaW50cyA9IHRoaXMuY29uc3RyYWludHMgfHwge307XG4gICAgY29uc3QgbW9tZW50dW1BbmltYXRpb25zID0gZWFjaEF4aXMoKGF4aXMpID0+IHtcbiAgICAgIGlmICghc2hvdWxkRHJhZyhheGlzLCBkcmFnMiwgdGhpcy5jdXJyZW50RGlyZWN0aW9uKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBsZXQgdHJhbnNpdGlvbiA9IGNvbnN0cmFpbnRzICYmIGNvbnN0cmFpbnRzW2F4aXNdIHx8IHt9O1xuICAgICAgaWYgKGRyYWdTbmFwVG9PcmlnaW4pXG4gICAgICAgIHRyYW5zaXRpb24gPSB7IG1pbjogMCwgbWF4OiAwIH07XG4gICAgICBjb25zdCBib3VuY2VTdGlmZm5lc3MgPSBkcmFnRWxhc3RpYyA/IDIwMCA6IDFlNjtcbiAgICAgIGNvbnN0IGJvdW5jZURhbXBpbmcgPSBkcmFnRWxhc3RpYyA/IDQwIDogMWU3O1xuICAgICAgY29uc3QgaW5lcnRpYTIgPSB7XG4gICAgICAgI
10617HR5cGU6IFwiaW5lcnRpYVwiLFxuICAgICAgICB2ZWxvY2l0eTogZHJhZ01vbWVudHVtID8gdmVsb2NpdHlbYXhpc10gOiAwLFxuICAgICAgICBib3VuY2VTdGlmZm5lc3MsXG4gICAgICAgIGJvdW5jZURhbXBpbmcsXG4gICAgICAgIHRpbWVDb25zdGFudDogNzUwLFxuICAgICAgICByZXN0RGVsdGE6IDEsXG4gICAgICAgIHJlc3RTcGVlZDogMTAsXG4gICAgICAgIC4uLmRyYWdUcmFuc2l0aW9uLFxuICAgICAgICAuLi50cmFuc2l0aW9uXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRoaXMuc3RhcnRBeGlzVmFsdWVBbmltYXRpb24oYXhpcywgaW5lcnRpYTIpO1xuICAgIH0pO1xuICAgIHJldHVybiBQcm9taXNlLmFsbChtb21lbnR1bUFuaW1hdGlvbnMpLnRoZW4ob25EcmFnVHJhbnNpdGlvbkVuZCk7XG4gIH1cbiAgc3RhcnRBeGlzVmFsdWVBbmltYXRpb24oYXhpcywgdHJhbnNpdGlvbikge1xuICAgIGNvbnN0IGF4aXNWYWx1ZSA9IHRoaXMuZ2V0QXhpc01vdGlvblZhbHVlKGF4aXMpO1xuICAgIGFkZFZhbHVlVG9XaWxsQ2hhbmdlKHRoaXMudmlzdWFsRWxlbWVudCwgYXhpcyk7XG4gICAgcmV0dXJuIGF4aXNWYWx1ZS5zdGFydChhbmltYXRlTW90aW9uVmFsdWUoYXhpcywgYXhpc1ZhbHVlLCAwLCB0cmFuc2l0aW9uLCB0aGlzLnZpc3VhbEVsZW1lbnQsIGZhbHNlKSk7XG4gIH1cbiAgc3RvcEFuaW1hdGlvbigpIHtcbiAgICBlYWNoQXhpcygoYXhpcykgPT4gdGhpcy5nZXRBeGlzTW90aW9uVmFsdWUoYXhpcykuc3RvcCgpKTtcbiAgfVxuICBwYXVzZUFuaW1hdGlvbigpIHtcbiAgICBlYWNoQXhpcygoYXhpcykgPT4ge1xuICAgICAgdmFyIF9hO1xuICAgICAgcmV0dXJuIChfYSA9IHRoaXMuZ2V0QXhpc01vdGlvblZhbHVlKGF4aXMpLmFuaW1hdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnBhdXNlKCk7XG4gICAgfSk7XG4gIH1cbiAgZ2V0QW5pbWF0aW9uU3RhdGUoYXhpcykge1xuICAgIHZhciBfYTtcbiAgICByZXR1cm4gKF9hID0gdGhpcy5nZXRBeGlzTW90aW9uVmFsdWUoYXhpcykuYW5pbWF0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc3RhdGU7XG4gIH1cbiAgLyoqXG4gICAqIERyYWcgd29ya3MgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHdoaWNoIHByb3BzIGFyZSBwcm92aWRlZC5cbiAgICpcbiAgICogLSBJZiBfZHJhZ1ggYW5kIF9kcmFnWSBhcmUgcHJvdmlkZWQsIHdlIG91dHB1dCB0aGUgZ2VzdHVyZSBkZWx0YSBkaXJlY3RseSB0byB0aG9zZSBtb3Rpb24gdmFsdWVzLlxuICAgKiAtIE90aGVyd2lzZSwgd2UgYXBwbHkgdGhlIGRlbHRhIHRvIHRoZSB4L3kgbW90aW9uIHZhbHVlcy5cbiAgICovXG4gIGdldEF4aXNNb3Rpb25WYWx1ZShheGlzKSB7XG4gICAgY29uc3QgZHJhZ0tleSA9IGBfZHJhZyR7YXhpcy50b1VwcGVyQ2FzZSgpfWA7XG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLnZpc3VhbEVsZW1lbnQuZ2V0UHJvcHMoKTtcbiAgICBjb25zdCBleHRlcm5hbE1vdGlvblZhbHVlID0gcHJvcHNbZHJhZ0tleV07XG4gICAgcmV0dXJuIGV4dGVybmFsTW90aW9uVmFsdWUgPyBleHRlcm5hbE1vdGlvblZhbHVlIDogdGhpcy52aXN1YWxFbGVtZW50LmdldFZhbHVlKGF4aXMsIChwcm9wcy5pbml0aWFsID8gcHJvcHMuaW5pdGlhbFtheGlzXSA6IHZvaWQgMCkgfHwgMCk7XG4gIH1cbiAgc25hcFRvQ3Vyc29yKHBvaW50Mikge1xuICAgIGVhY2hBeGlzKChheGlzKSA9PiB7XG4gICAgICBjb25zdCB7IGRyYWc6IGRyYWcyIH0gPSB0aGlzLmdldFByb3BzKCk7XG4gICAgICBpZiAoIXNob3VsZERyYWcoYXhpcywgZHJhZzIsIHRoaXMuY3VycmVudERpcmVjdGlvbikpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IHsgcHJvamVjdGlvbiB9ID0gdGhpcy52aXN1YWxFbGVtZW50O1xuICAgICAgY29uc3QgYXhpc1ZhbHVlID0gdGhpcy5nZXRBeGlzTW90aW9uVmFsdWUoYXhpcyk7XG4gICAgICBpZiAocHJvamVjdGlvbiAmJiBwcm9qZWN0aW9uLmxheW91dCkge1xuICAgICAgICBjb25zdCB7IG1pbiwgbWF4IH0gPSBwcm9qZWN0aW9uLmxheW91dC5sYXlvdXRCb3hbYXhpc107XG4gICAgICAgIGF4aXNWYWx1ZS5zZXQocG9pbnQyW2F4aXNdIC0gbWl4TnVtYmVyKG1pbiwgbWF4LCAwLjUpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogV2hlbiB0aGUgdmlld3BvcnQgcmVzaXplcyB3ZSB3YW50IHRvIGNoZWNrIGlmIHRoZSBtZWFzdXJlZCBjb25zdHJhaW50c1xuICAgKiBoYXZlIGNoYW5nZWQgYW5kLCBpZiBzbywgcmVwb3NpdGlvbiB0aGUgZWxlbWVudCB3aXRoaW4gdGhvc2UgbmV3IGNvbnN0cmFpbnRzXG4gICAqIHJlbGF0aXZlIHRvIHdoZXJlIGl0IHdhcyBiZWZvcmUgdGhlIHJlc2l6ZS5cbiAgICovXG4gIHNjYWxlUG9zaXRpb25XaXRoaW5Db25zdHJhaW50cygpIHtcbiAgICBpZiAoIXRoaXMudmlzdWFsRWxlbWVudC5jdXJyZW50KVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHsgZHJhZzogZHJhZzIsIGRyYWdDb25zdHJhaW50cyB9ID0gdGhpcy5nZXRQcm9wcygpO1xuICAgIGNvbnN0IHsgcHJvamVjdGlvbiB9ID0gdGhpcy52aXN1YWxFbGVtZW50O1xuICAgIGlmICghaXNSZWZPYmplY3QoZHJhZ0NvbnN0cmFpbnRzKSB8fCAhcHJvamVjdGlvbiB8fCAhdGhpcy5jb25zdHJhaW50cylcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnN0b3BBbmltYXRpb24oKTtcbiAgICBjb25zdCBib3hQcm9ncmVzcyA9IHsgeDogMCwgeTogMCB9O1xuICAgIGVhY2hBeGlzKChheGlzKSA9PiB7XG4gICAgICBjb25zdCBheGlzVmFsdWUgPSB0aGlzLmdldEF4aXNNb3Rpb25WYWx1ZShheGlzKTtcbiAgICAgIGlmIChheGlzVmFsdWUgJiYgdGhpcy5jb25zdHJhaW50cyAhPT0gZmFsc2UpIHtcbiAgICAgICAgY29uc3QgbGF0ZXN0ID0gYXhpc1ZhbHVlLmdldCgpO1xuICAgICAgICBib3hQcm9ncmVzc1theGlzXSA9IGNhbGNPcmlnaW4yKHsgbWluOiBsYXRlc3QsIG1heDogbGF0ZXN0IH0sIHRoaXMuY29uc3RyYWludHNbYXhpc10pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHsgdHJhbnNmb3JtVGVtcGxhdGUgfSA9IHRoaXMudmlzdWFsRWxlbWVudC5nZXRQcm9wcygpO1xuICAgIHRoaXMudmlzdWFsRWxlbWVudC5jdXJyZW50LnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zZm9ybVRlbXBsYXRlID8gdHJhbnNmb3JtVGVtcGxhdGUoe30sIFwiXCIpIDogXCJub25lXCI7XG4gICAgcHJvamVjdGlvbi5yb290ICYmIHByb2plY3Rpb24ucm9vdC51cGRhdGVTY3JvbGwoKTtcbiAgICBwcm9qZWN0aW9uLnVwZGF0ZUxheW91dCgpO1xuICAgIHRoaXMucmVzb2x2ZUNvbnN0cmFpbnRzKCk7XG4gICAgZWFjaEF4aXMoKGF4aXMpID0+IHtcbiAgICAgIGlmICghc2hvdWxkRHJhZyhheGlzLCBkcmFnMiwgbnVsbCkpXG4gICAgICAgI
10617HJldHVybjtcbiAgICAgIGNvbnN0IGF4aXNWYWx1ZSA9IHRoaXMuZ2V0QXhpc01vdGlvblZhbHVlKGF4aXMpO1xuICAgICAgY29uc3QgeyBtaW4sIG1heCB9ID0gdGhpcy5jb25zdHJhaW50c1theGlzXTtcbiAgICAgIGF4aXNWYWx1ZS5zZXQobWl4TnVtYmVyKG1pbiwgbWF4LCBib3hQcm9ncmVzc1theGlzXSkpO1xuICAgIH0pO1xuICB9XG4gIGFkZExpc3RlbmVycygpIHtcbiAgICBpZiAoIXRoaXMudmlzdWFsRWxlbWVudC5jdXJyZW50KVxuICAgICAgcmV0dXJuO1xuICAgIGVsZW1lbnREcmFnQ29udHJvbHMuc2V0KHRoaXMudmlzdWFsRWxlbWVudCwgdGhpcyk7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMudmlzdWFsRWxlbWVudC5jdXJyZW50O1xuICAgIGNvbnN0IHN0b3BQb2ludGVyTGlzdGVuZXIgPSBhZGRQb2ludGVyRXZlbnQoZWxlbWVudCwgXCJwb2ludGVyZG93blwiLCAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHsgZHJhZzogZHJhZzIsIGRyYWdMaXN0ZW5lciA9IHRydWUgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICAgIGRyYWcyICYmIGRyYWdMaXN0ZW5lciAmJiB0aGlzLnN0YXJ0KGV2ZW50KTtcbiAgICB9KTtcbiAgICBjb25zdCBtZWFzdXJlRHJhZ0NvbnN0cmFpbnRzID0gKCkgPT4ge1xuICAgICAgY29uc3QgeyBkcmFnQ29uc3RyYWludHMgfSA9IHRoaXMuZ2V0UHJvcHMoKTtcbiAgICAgIGlmIChpc1JlZk9iamVjdChkcmFnQ29uc3RyYWludHMpICYmIGRyYWdDb25zdHJhaW50cy5jdXJyZW50KSB7XG4gICAgICAgIHRoaXMuY29uc3RyYWludHMgPSB0aGlzLnJlc29sdmVSZWZDb25zdHJhaW50cygpO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgeyBwcm9qZWN0aW9uIH0gPSB0aGlzLnZpc3VhbEVsZW1lbnQ7XG4gICAgY29uc3Qgc3RvcE1lYXN1cmVMYXlvdXRMaXN0ZW5lciA9IHByb2plY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcihcIm1lYXN1cmVcIiwgbWVhc3VyZURyYWdDb25zdHJhaW50cyk7XG4gICAgaWYgKHByb2plY3Rpb24gJiYgIXByb2plY3Rpb24ubGF5b3V0KSB7XG4gICAgICBwcm9qZWN0aW9uLnJvb3QgJiYgcHJvamVjdGlvbi5yb290LnVwZGF0ZVNjcm9sbCgpO1xuICAgICAgcHJvamVjdGlvbi51cGRhdGVMYXlvdXQoKTtcbiAgICB9XG4gICAgZnJhbWUucmVhZChtZWFzdXJlRHJhZ0NvbnN0cmFpbnRzKTtcbiAgICBjb25zdCBzdG9wUmVzaXplTGlzdGVuZXIgPSBhZGREb21FdmVudCh3aW5kb3csIFwicmVzaXplXCIsICgpID0+IHRoaXMuc2NhbGVQb3NpdGlvbldpdGhpbkNvbnN0cmFpbnRzKCkpO1xuICAgIGNvbnN0IHN0b3BMYXlvdXRVcGRhdGVMaXN0ZW5lciA9IHByb2plY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcihcImRpZFVwZGF0ZVwiLCAoeyBkZWx0YSwgaGFzTGF5b3V0Q2hhbmdlZCB9KSA9PiB7XG4gICAgICBpZiAodGhpcy5pc0RyYWdnaW5nICYmIGhhc0xheW91dENoYW5nZWQpIHtcbiAgICAgICAgZWFjaEF4aXMoKGF4aXMpID0+IHtcbiAgICAgICAgICBjb25zdCBtb3Rpb25WYWx1ZTIgPSB0aGlzLmdldEF4aXNNb3Rpb25WYWx1ZShheGlzKTtcbiAgICAgICAgICBpZiAoIW1vdGlvblZhbHVlMilcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB0aGlzLm9yaWdpblBvaW50W2F4aXNdICs9IGRlbHRhW2F4aXNdLnRyYW5zbGF0ZTtcbiAgICAgICAgICBtb3Rpb25WYWx1ZTIuc2V0KG1vdGlvblZhbHVlMi5nZXQoKSArIGRlbHRhW2F4aXNdLnRyYW5zbGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnZpc3VhbEVsZW1lbnQucmVuZGVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHN0b3BSZXNpemVMaXN0ZW5lcigpO1xuICAgICAgc3RvcFBvaW50ZXJMaXN0ZW5lcigpO1xuICAgICAgc3RvcE1lYXN1cmVMYXlvdXRMaXN0ZW5lcigpO1xuICAgICAgc3RvcExheW91dFVwZGF0ZUxpc3RlbmVyICYmIHN0b3BMYXlvdXRVcGRhdGVMaXN0ZW5lcigpO1xuICAgIH07XG4gIH1cbiAgZ2V0UHJvcHMoKSB7XG4gICAgY29uc3QgcHJvcHMgPSB0aGlzLnZpc3VhbEVsZW1lbnQuZ2V0UHJvcHMoKTtcbiAgICBjb25zdCB7IGRyYWc6IGRyYWcyID0gZmFsc2UsIGRyYWdEaXJlY3Rpb25Mb2NrID0gZmFsc2UsIGRyYWdQcm9wYWdhdGlvbiA9IGZhbHNlLCBkcmFnQ29uc3RyYWludHMgPSBmYWxzZSwgZHJhZ0VsYXN0aWMgPSBkZWZhdWx0RWxhc3RpYywgZHJhZ01vbWVudHVtID0gdHJ1ZSB9ID0gcHJvcHM7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgZHJhZzogZHJhZzIsXG4gICAgICBkcmFnRGlyZWN0aW9uTG9jayxcbiAgICAgIGRyYWdQcm9wYWdhdGlvbixcbiAgICAgIGRyYWdDb25zdHJhaW50cyxcbiAgICAgIGRyYWdFbGFzdGljLFxuICAgICAgZHJhZ01vbWVudHVtXG4gICAgfTtcbiAgfVxufTtcbmZ1bmN0aW9uIHNob3VsZERyYWcoZGlyZWN0aW9uLCBkcmFnMiwgY3VycmVudERpcmVjdGlvbikge1xuICByZXR1cm4gKGRyYWcyID09PSB0cnVlIHx8IGRyYWcyID09PSBkaXJlY3Rpb24pICYmIChjdXJyZW50RGlyZWN0aW9uID09PSBudWxsIHx8IGN1cnJlbnREaXJlY3Rpb24gPT09IGRpcmVjdGlvbik7XG59XG5mdW5jdGlvbiBnZXRDdXJyZW50RGlyZWN0aW9uKG9mZnNldCwgbG9ja1RocmVzaG9sZCA9IDEwKSB7XG4gIGxldCBkaXJlY3Rpb24gPSBudWxsO1xuICBpZiAoTWF0aC5hYnMob2Zmc2V0LnkpID4gbG9ja1RocmVzaG9sZCkge1xuICAgIGRpcmVjdGlvbiA9IFwieVwiO1xuICB9IGVsc2UgaWYgKE1hdGguYWJzKG9mZnNldC54KSA+IGxvY2tUaHJlc2hvbGQpIHtcbiAgICBkaXJlY3Rpb24gPSBcInhcIjtcbiAgfVxuICByZXR1cm4gZGlyZWN0aW9uO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9nZXN0dXJlcy9kcmFnL2luZGV4Lm1qc1xudmFyIERyYWdHZXN0dXJlID0gY2xhc3MgZXh0ZW5kcyBGZWF0dXJlIHtcbiAgY29uc3RydWN0b3Iobm9kZSkge1xuICAgIHN1cGVyKG5vZGUpO1xuICAgIHRoaXMucmVtb3ZlR3JvdXBDb250cm9scyA9IG5vb3A7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcnMgPSBub29wO1xuICAgIHRoaXMuY29udHJvbHMgPSBuZXcgVmlzdWFsRWxlbWVudERyYWdDb250cm9scyhub2RlKTtcbiAgfVxuICBtb3VudCgpIHtcbiAgICBjb25zdCB7IGRyYWdDb250cm9scyB9ID0gdGhpcy5ub2RlLmdldFByb3BzKCk7XG4gICAgaWYgKGRyYWdDb250cm9scykge1xuICAgICAgdGhpcy5yZW1vdmVHcm91cENvbnRyb2xzID0gZHJhZ0NvbnRyb2xzLnN1YnNjcmliZSh0aGlzLmNvbnRyb2xzKTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcnMgPSB0aGlzLmNvbnRyb2xzLmFkZExpc3RlbmVycygpIH
10617x8IG5vb3A7XG4gIH1cbiAgdW5tb3VudCgpIHtcbiAgICB0aGlzLnJlbW92ZUdyb3VwQ29udHJvbHMoKTtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVycygpO1xuICB9XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9nZXN0dXJlcy9wYW4vaW5kZXgubWpzXG52YXIgaW1wb3J0X2Rpc3Q2OTQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY5NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY5NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBhc3luY0hhbmRsZXIgPSAoaGFuZGxlcikgPT4gKGV2ZW50LCBpbmZvKSA9PiB7XG4gIGlmIChoYW5kbGVyKSB7XG4gICAgZnJhbWUucG9zdFJlbmRlcigoKSA9PiBoYW5kbGVyKGV2ZW50LCBpbmZvKSk7XG4gIH1cbn07XG52YXIgUGFuR2VzdHVyZSA9IGNsYXNzIGV4dGVuZHMgRmVhdHVyZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy5yZW1vdmVQb2ludGVyRG93bkxpc3RlbmVyID0gbm9vcDtcbiAgfVxuICBvblBvaW50ZXJEb3duKHBvaW50ZXJEb3duRXZlbnQpIHtcbiAgICB0aGlzLnNlc3Npb24gPSBuZXcgUGFuU2Vzc2lvbihwb2ludGVyRG93bkV2ZW50LCB0aGlzLmNyZWF0ZVBhbkhhbmRsZXJzKCksIHtcbiAgICAgIHRyYW5zZm9ybVBhZ2VQb2ludDogdGhpcy5ub2RlLmdldFRyYW5zZm9ybVBhZ2VQb2ludCgpLFxuICAgICAgY29udGV4dFdpbmRvdzogZ2V0Q29udGV4dFdpbmRvdyh0aGlzLm5vZGUpXG4gICAgfSk7XG4gIH1cbiAgY3JlYXRlUGFuSGFuZGxlcnMoKSB7XG4gICAgY29uc3QgeyBvblBhblNlc3Npb25TdGFydCwgb25QYW5TdGFydCwgb25QYW4sIG9uUGFuRW5kIH0gPSB0aGlzLm5vZGUuZ2V0UHJvcHMoKTtcbiAgICByZXR1cm4ge1xuICAgICAgb25TZXNzaW9uU3RhcnQ6IGFzeW5jSGFuZGxlcihvblBhblNlc3Npb25TdGFydCksXG4gICAgICBvblN0YXJ0OiBhc3luY0hhbmRsZXIob25QYW5TdGFydCksXG4gICAgICBvbk1vdmU6IG9uUGFuLFxuICAgICAgb25FbmQ6IChldmVudCwgaW5mbykgPT4ge1xuICAgICAgICBkZWxldGUgdGhpcy5zZXNzaW9uO1xuICAgICAgICBpZiAob25QYW5FbmQpIHtcbiAgICAgICAgICBmcmFtZS5wb3N0UmVuZGVyKCgpID0+IG9uUGFuRW5kKGV2ZW50LCBpbmZvKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIG1vdW50KCkge1xuICAgIHRoaXMucmVtb3ZlUG9pbnRlckRvd25MaXN0ZW5lciA9IGFkZFBvaW50ZXJFdmVudCh0aGlzLm5vZGUuY3VycmVudCwgXCJwb2ludGVyZG93blwiLCAoZXZlbnQpID0+IHRoaXMub25Qb2ludGVyRG93bihldmVudCkpO1xuICB9XG4gIHVwZGF0ZSgpIHtcbiAgICB0aGlzLnNlc3Npb24gJiYgdGhpcy5zZXNzaW9uLnVwZGF0ZUhhbmRsZXJzKHRoaXMuY3JlYXRlUGFuSGFuZGxlcnMoKSk7XG4gIH1cbiAgdW5tb3VudCgpIHtcbiAgICB0aGlzLnJlbW92ZVBvaW50ZXJEb3duTGlzdGVuZXIoKTtcbiAgICB0aGlzLnNlc3Npb24gJiYgdGhpcy5zZXNzaW9uLmVuZCgpO1xuICB9XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9tb3Rpb24vZmVhdHVyZXMvbGF5b3V0L01lYXN1cmVMYXlvdXQubWpzXG52YXIgaW1wb3J0X2Rpc3Q3MDYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcwNyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcwOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfanN4X3J1bnRpbWU4ID0gX190b0VTTShyZXF1aXJlX2pzeF9ydW50aW1lKCksIDEpO1xudmFyIGltcG9ydF9yZWFjdDI4ID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9wcm9qZWN0aW9uL25vZGUvc3RhdGUubWpzXG52YXIgaW1wb3J0X2Rpc3Q2OTcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY5OCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDY5OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBnbG9iYWxQcm9qZWN0aW9uU3RhdGUgPSB7XG4gIC8qKlxuICAgKiBHbG9iYWwgZmxhZyBhcyB0byB3aGV0aGVyIHR
10617oZSB0cmVlIGhhcyBhbmltYXRlZCBzaW5jZSB0aGUgbGFzdCB0aW1lXG4gICAqIHdlIHJlc2l6ZWQgdGhlIHdpbmRvd1xuICAgKi9cbiAgaGFzQW5pbWF0ZWRTaW5jZVJlc2l6ZTogdHJ1ZSxcbiAgLyoqXG4gICAqIFdlIHNldCB0aGlzIHRvIHRydWUgb25jZSwgb24gdGhlIGZpcnN0IHVwZGF0ZS4gQW55IG5vZGVzIGFkZGVkIHRvIHRoZSB0cmVlIGJleW9uZCB0aGF0XG4gICAqIHVwZGF0ZSB3aWxsIGJlIGdpdmVuIGEgYGRhdGEtcHJvamVjdGlvbi1pZGAgYXR0cmlidXRlLlxuICAgKi9cbiAgaGFzRXZlclVwZGF0ZWQ6IGZhbHNlXG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9wcm9qZWN0aW9uL3N0eWxlcy9zY2FsZS1ib3JkZXItcmFkaXVzLm1qc1xudmFyIGltcG9ydF9kaXN0NzAwID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3MDEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3MDIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBwaXhlbHNUb1BlcmNlbnQocGl4ZWxzLCBheGlzKSB7XG4gIGlmIChheGlzLm1heCA9PT0gYXhpcy5taW4pXG4gICAgcmV0dXJuIDA7XG4gIHJldHVybiBwaXhlbHMgLyAoYXhpcy5tYXggLSBheGlzLm1pbikgKiAxMDA7XG59XG52YXIgY29ycmVjdEJvcmRlclJhZGl1cyA9IHtcbiAgY29ycmVjdDogKGxhdGVzdCwgbm9kZSkgPT4ge1xuICAgIGlmICghbm9kZS50YXJnZXQpXG4gICAgICByZXR1cm4gbGF0ZXN0O1xuICAgIGlmICh0eXBlb2YgbGF0ZXN0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBpZiAocHgudGVzdChsYXRlc3QpKSB7XG4gICAgICAgIGxhdGVzdCA9IHBhcnNlRmxvYXQobGF0ZXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBsYXRlc3Q7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHggPSBwaXhlbHNUb1BlcmNlbnQobGF0ZXN0LCBub2RlLnRhcmdldC54KTtcbiAgICBjb25zdCB5ID0gcGl4ZWxzVG9QZXJjZW50KGxhdGVzdCwgbm9kZS50YXJnZXQueSk7XG4gICAgcmV0dXJuIGAke3h9JSAke3l9JWA7XG4gIH1cbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3Byb2plY3Rpb24vc3R5bGVzL3NjYWxlLWJveC1zaGFkb3cubWpzXG52YXIgaW1wb3J0X2Rpc3Q3MDMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcwNCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcwNSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBjb3JyZWN0Qm94U2hhZG93ID0ge1xuICBjb3JyZWN0OiAobGF0ZXN0LCB7IHRyZWVTY2FsZSwgcHJvamVjdGlvbkRlbHRhIH0pID0+IHtcbiAgICBjb25zdCBvcmlnaW5hbCA9IGxhdGVzdDtcbiAgICBjb25zdCBzaGFkb3cgPSBjb21wbGV4LnBhcnNlKGxhdGVzdCk7XG4gICAgaWYgKHNoYWRvdy5sZW5ndGggPiA1KVxuICAgICAgcmV0dXJuIG9yaWdpbmFsO1xuICAgIGNvbnN0IHRlbXBsYXRlID0gY29tcGxleC5jcmVhdGVUcmFuc2Zvcm1lcihsYXRlc3QpO1xuICAgIGNvbnN0IG9mZnNldCA9IHR5cGVvZiBzaGFkb3dbMF0gIT09IFwibnVtYmVyXCIgPyAxIDogMDtcbiAgICBjb25zdCB4U2NhbGUgPSBwcm9qZWN0aW9uRGVsdGEueC5zY2FsZSAqIHRyZWVTY2FsZS54O1xuICAgIGNvbnN0IHlTY2FsZSA9IHByb2plY3Rpb25EZWx0YS55LnNjYWxlICogdHJlZVNjYWxlLnk7XG4gICAgc2hhZG93WzAgKyBvZmZzZXRdIC89IHhTY2FsZTtcbiAgICBzaGFkb3dbMSArIG9mZnNldF0gLz0geVNjYWxlO1xuICAgIGNvbnN0IGF2ZXJhZ2VTY2FsZSA9IG1peE51bWJlcih4U2NhbGUsIHlTY2FsZSwgMC41KTtcbiAgICBpZiAodHlwZW9mIHNoYWRvd1syICsgb2Zmc2V0XSA9PT0gXCJudW1iZXJcIilcbiAgICAgIHNoYWRvd1syICsgb2Zmc2V0XSAvPSBhdmVyYWdlU2NhbGU7XG4gICAgaWYgKHR5cGVvZiBzaGFkb3dbMyArIG9mZnNldF0gPT09IFwibnVtYmVyXCIpXG4gICAgICBzaGFkb3dbMyArIG9mZnNldF0gLz0gYXZlcmFnZVNjYWxlO1xuICAgIHJldHVybiB0ZW1wbGF0ZShzaGFkb3cpO1xuICB9XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9tb3Rpb24vZmVhdHVyZXMvbGF5b3V0L01lYXN1cmVMYXlvdXQubWpzXG52YXIgTWVhc3VyZUxheW91dFdpdGhDb250ZXh0ID0gY2xhc3MgZXh0ZW5kcyBpbXBvcnRfcmVhY3QyOC5Db21wb25lbnQge1xuICAvKipcbiAgICogVGhpcyBvbmx5IG1vdW50cyBwcm9qZWN0aW9uIG5vZGVzIGZvciBjb21wb25lbnRzIHRoYXRcbiAgICogbmVlZCBtZWFzdXJpbmcsIHdlIG1pZ2h0IHdhbnQgdG8gZG8gaXQgZm9yIGFsbCBjb21wb25lbnRzXG4gICAqIGluIG9yZGVyIHRvIGluY29ycG9yYXRlIHRyYW5zZm9ybXNcbiAgICovXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIGNvbnN0IHsgdmlzdWFsRWxlbWVudCwgbGF5b3V0R3JvdXAsIHN3aXRjaExheW91dEdyb3VwLCBsYXlvdXRJZCB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IHByb2plY3Rpb24gfSA9IHZpc3VhbEVsZW1lbnQ7XG4gICAgYWRkU2NhbGVDb3JyZWN0b3IoZGVmYXVsdFNjYWxlQ29ycmVjdG9ycyk7XG4gICAgaWYgKHByb2plY3Rpb24pIHtcbiAgICAgIGlmIChsYXlvdXRHcm91cC5ncm91cClcbiAgICAgICAgbGF5b3V0R3JvdXAuZ3JvdXAuYWRkKHByb2plY3Rpb24pO1xuICAgICAgaWYgKHN3aXRjaExheW91dEdyb3VwICYmIHN3aXRjaExheW91dEdyb3VwLnJlZ2lzdGVyICYmIGxheW91dElkKSB7XG4gICAgICAgI
10617HN3aXRjaExheW91dEdyb3VwLnJlZ2lzdGVyKHByb2plY3Rpb24pO1xuICAgICAgfVxuICAgICAgcHJvamVjdGlvbi5yb290LmRpZFVwZGF0ZSgpO1xuICAgICAgcHJvamVjdGlvbi5hZGRFdmVudExpc3RlbmVyKFwiYW5pbWF0aW9uQ29tcGxldGVcIiwgKCkgPT4ge1xuICAgICAgICB0aGlzLnNhZmVUb1JlbW92ZSgpO1xuICAgICAgfSk7XG4gICAgICBwcm9qZWN0aW9uLnNldE9wdGlvbnMoe1xuICAgICAgICAuLi5wcm9qZWN0aW9uLm9wdGlvbnMsXG4gICAgICAgIG9uRXhpdENvbXBsZXRlOiAoKSA9PiB0aGlzLnNhZmVUb1JlbW92ZSgpXG4gICAgICB9KTtcbiAgICB9XG4gICAgZ2xvYmFsUHJvamVjdGlvblN0YXRlLmhhc0V2ZXJVcGRhdGVkID0gdHJ1ZTtcbiAgfVxuICBnZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZShwcmV2UHJvcHMpIHtcbiAgICBjb25zdCB7IGxheW91dERlcGVuZGVuY3ksIHZpc3VhbEVsZW1lbnQsIGRyYWc6IGRyYWcyLCBpc1ByZXNlbnQ6IGlzUHJlc2VudDIgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgcHJvamVjdGlvbiA9IHZpc3VhbEVsZW1lbnQucHJvamVjdGlvbjtcbiAgICBpZiAoIXByb2plY3Rpb24pXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBwcm9qZWN0aW9uLmlzUHJlc2VudCA9IGlzUHJlc2VudDI7XG4gICAgaWYgKGRyYWcyIHx8IHByZXZQcm9wcy5sYXlvdXREZXBlbmRlbmN5ICE9PSBsYXlvdXREZXBlbmRlbmN5IHx8IGxheW91dERlcGVuZGVuY3kgPT09IHZvaWQgMCkge1xuICAgICAgcHJvamVjdGlvbi53aWxsVXBkYXRlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2FmZVRvUmVtb3ZlKCk7XG4gICAgfVxuICAgIGlmIChwcmV2UHJvcHMuaXNQcmVzZW50ICE9PSBpc1ByZXNlbnQyKSB7XG4gICAgICBpZiAoaXNQcmVzZW50Mikge1xuICAgICAgICBwcm9qZWN0aW9uLnByb21vdGUoKTtcbiAgICAgIH0gZWxzZSBpZiAoIXByb2plY3Rpb24ucmVsZWdhdGUoKSkge1xuICAgICAgICBmcmFtZS5wb3N0UmVuZGVyKCgpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGFjayA9IHByb2plY3Rpb24uZ2V0U3RhY2soKTtcbiAgICAgICAgICBpZiAoIXN0YWNrIHx8ICFzdGFjay5tZW1iZXJzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5zYWZlVG9SZW1vdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb21wb25lbnREaWRVcGRhdGUoKSB7XG4gICAgY29uc3QgeyBwcm9qZWN0aW9uIH0gPSB0aGlzLnByb3BzLnZpc3VhbEVsZW1lbnQ7XG4gICAgaWYgKHByb2plY3Rpb24pIHtcbiAgICAgIHByb2plY3Rpb24ucm9vdC5kaWRVcGRhdGUoKTtcbiAgICAgIG1pY3JvdGFzay5wb3N0UmVuZGVyKCgpID0+IHtcbiAgICAgICAgaWYgKCFwcm9qZWN0aW9uLmN1cnJlbnRBbmltYXRpb24gJiYgcHJvamVjdGlvbi5pc0xlYWQoKSkge1xuICAgICAgICAgIHRoaXMuc2FmZVRvUmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICBjb25zdCB7IHZpc3VhbEVsZW1lbnQsIGxheW91dEdyb3VwLCBzd2l0Y2hMYXlvdXRHcm91cDogcHJvbW90ZUNvbnRleHQgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyBwcm9qZWN0aW9uIH0gPSB2aXN1YWxFbGVtZW50O1xuICAgIGlmIChwcm9qZWN0aW9uKSB7XG4gICAgICBwcm9qZWN0aW9uLnNjaGVkdWxlQ2hlY2tBZnRlclVubW91bnQoKTtcbiAgICAgIGlmIChsYXlvdXRHcm91cCAmJiBsYXlvdXRHcm91cC5ncm91cClcbiAgICAgICAgbGF5b3V0R3JvdXAuZ3JvdXAucmVtb3ZlKHByb2plY3Rpb24pO1xuICAgICAgaWYgKHByb21vdGVDb250ZXh0ICYmIHByb21vdGVDb250ZXh0LmRlcmVnaXN0ZXIpXG4gICAgICAgIHByb21vdGVDb250ZXh0LmRlcmVnaXN0ZXIocHJvamVjdGlvbik7XG4gICAgfVxuICB9XG4gIHNhZmVUb1JlbW92ZSgpIHtcbiAgICBjb25zdCB7IHNhZmVUb1JlbW92ZSB9ID0gdGhpcy5wcm9wcztcbiAgICBzYWZlVG9SZW1vdmUgJiYgc2FmZVRvUmVtb3ZlKCk7XG4gIH1cbiAgcmVuZGVyKCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59O1xuZnVuY3Rpb24gTWVhc3VyZUxheW91dChwcm9wcykge1xuICBjb25zdCBbaXNQcmVzZW50Miwgc2FmZVRvUmVtb3ZlXSA9IHVzZVByZXNlbmNlKCk7XG4gIGNvbnN0IGxheW91dEdyb3VwID0gKDAsIGltcG9ydF9yZWFjdDI4LnVzZUNvbnRleHQpKExheW91dEdyb3VwQ29udGV4dCk7XG4gIHJldHVybiAoMCwgaW1wb3J0X2pzeF9ydW50aW1lOC5qc3gpKE1lYXN1cmVMYXlvdXRXaXRoQ29udGV4dCwgeyAuLi5wcm9wcywgbGF5b3V0R3JvdXAsIHN3aXRjaExheW91dEdyb3VwOiAoMCwgaW1wb3J0X3JlYWN0MjgudXNlQ29udGV4dCkoU3dpdGNoTGF5b3V0R3JvdXBDb250ZXh0KSwgaXNQcmVzZW50OiBpc1ByZXNlbnQyLCBzYWZlVG9SZW1vdmUgfSk7XG59XG52YXIgZGVmYXVsdFNjYWxlQ29ycmVjdG9ycyA9IHtcbiAgYm9yZGVyUmFkaXVzOiB7XG4gICAgLi4uY29ycmVjdEJvcmRlclJhZGl1cyxcbiAgICBhcHBseVRvOiBbXG4gICAgICBcImJvcmRlclRvcExlZnRSYWRpdXNcIixcbiAgICAgIFwiYm9yZGVyVG9wUmlnaHRSYWRpdXNcIixcbiAgICAgIFwiYm9yZGVyQm90dG9tTGVmdFJhZGl1c1wiLFxuICAgICAgXCJib3JkZXJCb3R0b21SaWdodFJhZGl1c1wiXG4gICAgXVxuICB9LFxuICBib3JkZXJUb3BMZWZ0UmFkaXVzOiBjb3JyZWN0Qm9yZGVyUmFkaXVzLFxuICBib3JkZXJUb3BSaWdodFJhZGl1czogY29ycmVjdEJvcmRlclJhZGl1cyxcbiAgYm9yZGVyQm90dG9tTGVmdFJhZGl1czogY29ycmVjdEJvcmRlclJhZGl1cyxcbiAgYm9yZGVyQm90dG9tUmlnaHRSYWRpdXM6IGNvcnJlY3RCb3JkZXJSYWRpdXMsXG4gIGJveFNoYWRvdzogY29ycmVjdEJveFNoYWRvd1xufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcHJvamVjdGlvbi9ub2RlL0hUTUxQcm9qZWN0aW9uTm9kZS5tanNcbnZhciBpbXBvcnRfZGlzdDc0OCA9I
10617F9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NzQ5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NzUwID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9wcm9qZWN0aW9uL25vZGUvY3JlYXRlLXByb2plY3Rpb24tbm9kZS5tanNcbnZhciBpbXBvcnRfZGlzdDc0MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NzQzID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NzQ0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vYW5pbWF0ZS9zaW5nbGUtdmFsdWUubWpzXG52YXIgaW1wb3J0X2Rpc3Q3MDkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcxMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcxMSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIGFuaW1hdGVTaW5nbGVWYWx1ZSh2YWx1ZSwga2V5ZnJhbWVzMiwgb3B0aW9ucykge1xuICBjb25zdCBtb3Rpb25WYWx1ZSQxID0gaXNNb3Rpb25WYWx1ZSh2YWx1ZSkgPyB2YWx1ZSA6IG1vdGlvblZhbHVlKHZhbHVlKTtcbiAgbW90aW9uVmFsdWUkMS5zdGFydChhbmltYXRlTW90aW9uVmFsdWUoXCJcIiwgbW90aW9uVmFsdWUkMSwga2V5ZnJhbWVzMiwgb3B0aW9ucykpO1xuICByZXR1cm4gbW90aW9uVmFsdWUkMS5hbmltYXRpb247XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9kb20vdXRpbHMvaXMtc3ZnLWVsZW1lbnQubWpzXG52YXIgaW1wb3J0X2Rpc3Q3MTIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcxMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcxNCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIGlzU1ZHRWxlbWVudChlbGVtZW50KSB7XG4gIHJldHVybiBlbGVtZW50IGluc3RhbmNlb2YgU1ZHRWxlbWVudCAmJiBlbGVtZW50LnRhZ05hbWUgIT09IFwic3ZnXCI7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci91dGlscy9mbGF0LXRyZWUubWpzXG52YXIgaW1wb3J0X2Rpc3Q3MTggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcxOSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcyMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL3V0aWxzL2NvbXBhcmUtYnktZGVwdGgubWpzXG52YXIgaW1wb3J0X2Rpc3Q3MTUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcxNiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcxNyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBjb21wYXJlQnlEZXB0aCA9IChhLCBiKSA9PiBhLmRlcHRoIC0gYi5kZXB0aDtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL3V0aWxzL2ZsYXQtdHJlZS5tanNcbnZhciBGbGF0VHJlZSA9IGNsYXNzIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jaGlsZHJlbiA9IFtdO1xuICAgIHRoaXMuaXNEaXJ0eSA9IGZhbHNlO1xuICB9XG4gIGFkZChjaGlsZCkge1xuICAgIGFkZFVuaXF1ZUl0ZW0odGhpcy5jaGlsZHJlbiwgY2hpbGQpO1xuICAgIHRoaXMuaXNEaXJ0eSA9IHRydWU7XG4gIH1cbiAgcmVtb3ZlKGNoaWxkKSB7XG4gICAgcmVtb3ZlSXRlbSh0aGlzLmNoaWxkcmVuLCBjaGlsZCk7XG4gICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZTtcbiAgfVxuICBmb3JFYWNoKGNhbGxiYWNrKSB7XG4gICAgdGhpcy5pc0RpcnR5ICYmIHRoaXMuY2hpbGRyZW4uc29ydChjb21wYXJlQnlEZXB0aCk7XG4gICAgdGhpcy5pc0RpcnR5ID0gZmFsc2U7XG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvZGVsYXkubWpzXG52YXIgaW1wb3J0X2Rpc3Q3MjEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcyMiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcyMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIGRlbGF5KGNhbGxiYWNrLCB0aW1lb3V0KSB7XG4gIGNvbnN0IHN0YXJ0ID0gdGltZS5ub3coKTtcbiAgY29uc3QgY2hlY2tFbGFwc2VkID0gKHsgdGltZXN0YW1wIH0pID0+IHtcbiAgICBjb25zdCBlbGFwc2VkID0gdGltZXN0YW1wIC0gc3RhcnQ7XG4gICAgaWYgKGVsYXBzZWQgPj0gdGltZW91dCkge1xuICAgICAgY2FuY2VsRnJhbWUoY2hlY2tFbGFwc2VkKTtcbiAgICAgIGNhbGxiYWNrKGVsYXBzZWQgLSB0aW1lb3V0KTtcbiAgICB9XG4gI
10617H07XG4gIGZyYW1lLnJlYWQoY2hlY2tFbGFwc2VkLCB0cnVlKTtcbiAgcmV0dXJuICgpID0+IGNhbmNlbEZyYW1lKGNoZWNrRWxhcHNlZCk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3Byb2plY3Rpb24vYW5pbWF0aW9uL21peC12YWx1ZXMubWpzXG52YXIgaW1wb3J0X2Rpc3Q3MjQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcyNSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcyNiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBib3JkZXJzID0gW1wiVG9wTGVmdFwiLCBcIlRvcFJpZ2h0XCIsIFwiQm90dG9tTGVmdFwiLCBcIkJvdHRvbVJpZ2h0XCJdO1xudmFyIG51bUJvcmRlcnMgPSBib3JkZXJzLmxlbmd0aDtcbnZhciBhc051bWJlciA9ICh2YWx1ZSkgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gcGFyc2VGbG9hdCh2YWx1ZSkgOiB2YWx1ZTtcbnZhciBpc1B4ID0gKHZhbHVlKSA9PiB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgfHwgcHgudGVzdCh2YWx1ZSk7XG5mdW5jdGlvbiBtaXhWYWx1ZXModGFyZ2V0LCBmb2xsb3csIGxlYWQsIHByb2dyZXNzMiwgc2hvdWxkQ3Jvc3NmYWRlT3BhY2l0eSwgaXNPbmx5TWVtYmVyKSB7XG4gIGlmIChzaG91bGRDcm9zc2ZhZGVPcGFjaXR5KSB7XG4gICAgdGFyZ2V0Lm9wYWNpdHkgPSBtaXhOdW1iZXIoXG4gICAgICAwLFxuICAgICAgLy8gVE9ETyBSZWluc3RhdGUgdGhpcyBpZiBvbmx5IGNoaWxkXG4gICAgICBsZWFkLm9wYWNpdHkgIT09I
10617HZvaWQgMCA/IGxlYWQub3BhY2l0eSA6IDEsXG4gICAgICBlYXNlQ3Jvc3NmYWRlSW4ocHJvZ3Jlc3MyKVxuICAgICk7XG4gICAgdGFyZ2V0Lm9wYWNpdHlFeGl0ID0gbWl4TnVtYmVyKGZvbGxvdy5vcGFjaXR5ICE9PSB2b2lkIDAgPyBmb2xsb3cub3BhY2l0eSA6IDEsIDAsIGVhc2VDcm9zc2ZhZGVPdXQocHJvZ3Jlc3MyKSk7XG4gIH0gZWxzZSBpZiAoaXNPbmx5TWVtYmVyKSB7XG4gICAgdGFyZ2V0Lm9wYWNpdHkgPSBtaXhOdW1iZXIoZm9sbG93Lm9wYWNpdHkgIT09IHZvaWQgMCA/IGZvbGxvdy5vcGFjaXR5IDogMSwgbGVhZC5vcGFjaXR5ICE9PSB2b2lkIDAgPyBsZWFkLm9wYWNpdHkgOiAxLCBwcm9ncmVzczIpO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQm9yZGVyczsgaSsrKSB7XG4gICAgY29uc3QgYm9yZGVyTGFiZWwgPSBgYm9yZGVyJHtib3JkZXJzW2ldfVJhZGl1c2A7XG4gICAgbGV0IGZvbGxvd1JhZGl1cyA9IGdldFJhZGl1cyhmb2xsb3csIGJvcmRlckxhYmVsKTtcbiAgICBsZXQgbGVhZFJhZGl1cyA9IGdldFJhZGl1cyhsZWFkLCBib3JkZXJMYWJlbCk7XG4gICAgaWYgKGZvbGxvd1JhZGl1cyA9PT0gdm9pZCAwICYmIGxlYWRSYWRpdXMgPT09IHZvaWQgMClcbiAgICAgIGNvbnRpbnVlO1xuICAgIGZvbGxvd1JhZGl1cyB8fCAoZm9sbG93UmFkaXVzID0gMCk7XG4gICAgbGVhZFJhZGl1cyB8fCAobGVhZFJhZGl1cyA9IDApO1xuICAgIGNvbnN0IGNhbk1peCA9IGZvbGxvd1JhZGl1cyA9PT0gMCB8fCBsZWFkUmFkaXVzID09PSAwIHx8IGlzUHgoZm9sbG93UmFkaXVzKSA9PT0gaXNQeChsZWFkUmFkaXVzKTtcbiAgICBpZiAoY2FuTWl4KSB7XG4gICAgICB0YXJnZXRbYm9yZGVyTGFiZWxdID0gTWF0aC5tYXgobWl4TnVtYmVyKGFzTnVtYmVyKGZvbGxvd1JhZGl1cyksIGFzTnVtYmVyKGxlYWRSYWRpdXMpLCBwcm9ncmVzczIpLCAwKTtcbiAgICAgIGlmIChwZXJjZW50LnRlc3QobGVhZFJhZGl1cykgfHwgcGVyY2VudC50ZXN0KGZvbGxvd1JhZGl1cykpIHtcbiAgICAgICAgdGFyZ2V0W2JvcmRlckxhYmVsXSArPSBcIiVcIjtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0W2JvcmRlckxhYmVsXSA9IGxlYWRSYWRpdXM7XG4gICAgfVxuICB9XG4gIGlmIChmb2xsb3cucm90YXRlIHx8IGxlYWQucm90YXRlKSB7XG4gICAgdGFyZ2V0LnJvdGF0ZSA9IG1peE51bWJlcihmb2xsb3cucm90YXRlIHx8IDAsIGxlYWQucm90YXRlIHx8IDAsIHByb2dyZXNzMik7XG4gIH1cbn1cbmZ1bmN0aW9uIGdldFJhZGl1cyh2YWx1ZXMsIHJhZGl1c05hbWUpIHtcbiAgcmV0dXJuIHZhbHVlc1tyYWRpdXNOYW1lXSAhPT0gdm9pZCAwID8gdmFsdWVzW3JhZGl1c05hbWVdIDogdmFsdWVzLmJvcmRlclJhZGl1cztcbn1cbnZhciBlYXNlQ3Jvc3NmYWRlSW4gPSBjb21wcmVzcygwLCAwLjUsIGNpcmNPdXQpO1xudmFyIGVhc2VDcm9zc2ZhZGVPdXQgPSBjb21wcmVzcygwLjUsIDAuOTUsIG5vb3ApO1xuZnVuY3Rpb24gY29tcHJlc3MobWluLCBtYXgsIGVhc2luZykge1xuICByZXR1cm4gKHApID0+IHtcbiAgICBpZiAocCA8IG1pbilcbiAgICAgIHJldHVybiAwO1xuICAgIGlmIChwID4gbWF4KVxuICAgICAgcmV0dXJuIDE7XG4gICAgcmV0dXJuIGVhc2luZyhwcm9ncmVzcyhtaW4sIG1heCwgcCkpO1xuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9wcm9qZWN0aW9uL2dlb21ldHJ5L2NvcHkubWpzXG52YXIgaW1wb3J0X2Rpc3Q3MjcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcyOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDcyOSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIGNvcHlBeGlzSW50byhheGlzLCBvcmlnaW5BeGlzKSB7XG4gIGF4aXMubWluID0gb3JpZ2luQXhpcy5taW47XG4gIGF4aXMubWF4ID0gb3JpZ2luQXhpcy5tYXg7XG59XG5mdW5jdGlvbiBjb3B5Qm94SW50byhib3gsIG9yaWdpbkJveCkge1xuICBjb3B5QXhpc0ludG8oYm94LngsIG9yaWdpbkJveC54KTtcbiAgY29weUF4aXNJbnRvKGJveC55LCBvcmlnaW5Cb3gueSk7XG59XG5mdW5jdGlvbiBjb3B5QXhpc0RlbHRhSW50byhkZWx0YSwgb3JpZ2luRGVsdGEpIHtcbiAgZGVsdGEudHJhbnNsYXRlID0gb3JpZ2luRGVsdGEudHJhbnNsYXRlO1xuICBkZWx0YS5zY2FsZSA9IG9yaWdpbkRlbHRhLnNjYWxlO1xuICBkZWx0YS5vcmlnaW5Qb2ludCA9IG9yaWdpbkRlbHRhLm9yaWdpblBvaW50O1xuICBkZWx0YS5vcmlnaW4gPSBvcmlnaW5EZWx0YS5vcmlnaW47XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3Byb2plY3Rpb24vZ2VvbWV0cnkvZGVsdGEtcmVtb3ZlLm1qc1xudmFyIGltcG9ydF9kaXN0NzMwID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3MzEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3MzIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiByZW1vdmVQb2ludERlbHRhKHBvaW50MiwgdHJhbnNsYXRlLCBzY2FsZTIsIG9yaWdpblBvaW50LCBib3hTY2FsZSkge1xuICBwb2ludDIgLT0gdHJhbnNsYXRlO1xuICBwb2ludDIgPSBzY2FsZVBvaW50KHBvaW50MiwgMSAvIHNjYWxlMiwgb3JpZ2luUG9pbnQpO1xuICBpZiAoYm94U2NhbGUgIT09IHZvaWQgMCkge1xuICAgIHBvaW50MiA9IHNjYWxlUG9pbnQocG9pbnQyLCAxIC8gYm94U2NhbGUsIG9yaWdpblBvaW50KTtcbiAgfVxuICByZXR1cm4gcG9pbnQyO1xufVxuZnVuY3Rpb24gcmVtb3ZlQXhpc0RlbHRhKGF4aXMsIHRyYW5zbGF0ZSA9IDAsIHNjYWxlMiA9IDEsIG9yaWdpbiA9IDAuNSwgYm94U2NhbGUsIG9yaWdpbkF4aXMgPSBheGlzLCBzb3VyY2VBeGlzID0gYXhpcykge1xuICBpZiAocGVyY2VudC50ZXN0KHRyYW5zbGF0ZSkpIHtcbiAgICB0cmFuc2xhdGUgPSBwYXJzZU
10617Zsb2F0KHRyYW5zbGF0ZSk7XG4gICAgY29uc3QgcmVsYXRpdmVQcm9ncmVzcyA9IG1peE51bWJlcihzb3VyY2VBeGlzLm1pbiwgc291cmNlQXhpcy5tYXgsIHRyYW5zbGF0ZSAvIDEwMCk7XG4gICAgdHJhbnNsYXRlID0gcmVsYXRpdmVQcm9ncmVzcyAtIHNvdXJjZUF4aXMubWluO1xuICB9XG4gIGlmICh0eXBlb2YgdHJhbnNsYXRlICE9PSBcIm51bWJlclwiKVxuICAgIHJldHVybjtcbiAgbGV0IG9yaWdpblBvaW50ID0gbWl4TnVtYmVyKG9yaWdpbkF4aXMubWluLCBvcmlnaW5BeGlzLm1heCwgb3JpZ2luKTtcbiAgaWYgKGF4aXMgPT09IG9yaWdpbkF4aXMpXG4gICAgb3JpZ2luUG9pbnQgLT0gdHJhbnNsYXRlO1xuICBheGlzLm1pbiA9IHJlbW92ZVBvaW50RGVsdGEoYXhpcy5taW4sIHRyYW5zbGF0ZSwgc2NhbGUyLCBvcmlnaW5Qb2ludCwgYm94U2NhbGUpO1xuICBheGlzLm1heCA9IHJlbW92ZVBvaW50RGVsdGEoYXhpcy5tYXgsIHRyYW5zbGF0ZSwgc2NhbGUyLCBvcmlnaW5Qb2ludCwgYm94U2NhbGUpO1xufVxuZnVuY3Rpb24gcmVtb3ZlQXhpc1RyYW5zZm9ybXMoYXhpcywgdHJhbnNmb3JtcywgW2tleSwgc2NhbGVLZXksIG9yaWdpbktleV0sIG9yaWdpbiwgc291cmNlQXhpcykge1xuICByZW1vdmVBeGlzRGVsdGEoYXhpcywgdHJhbnNmb3Jtc1trZXldLCB0cmFuc2Zvcm1zW3NjYWxlS2V5XSwgdHJhbnNmb3Jtc1tvcmlnaW5LZXldLCB0cmFuc2Zvcm1zLnNjYWxlLCBvcmlnaW4sIHNvdXJjZUF4aXMpO1xufVxudmFyIHhLZXlzID0gW1wieFwiLCBcInNjYWxlWFwiLCBcIm9yaWdpblhcIl07XG52YXIgeUtleXMgPSBbXCJ5XCIsIFwic2NhbGVZXCIsIFwib3JpZ2luWVwiXTtcbmZ1bmN0aW9uIHJlbW92ZUJveFRyYW5zZm9ybXMoYm94LCB0cmFuc2Zvcm1zLCBvcmlnaW5Cb3gsIHNvdXJjZUJveCkge1xuICByZW1vdmVBeGlzVHJhbnNmb3Jtcyhib3gueCwgdHJhbnNmb3JtcywgeEtleXMsIG9yaWdpbkJveCA/IG9yaWdpbkJveC54IDogdm9pZCAwLCBzb3VyY2VCb3ggPyBzb3VyY2VCb3gueCA6IHZvaWQgMCk7XG4gIHJlbW92ZUF4aXNUcmFuc2Zvcm1zKGJveC55LCB0cmFuc2Zvcm1zLCB5S2V5cywgb3JpZ2luQm94ID8gb3JpZ2luQm94LnkgOiB2b2lkIDAsIHNvdXJjZUJveCA/IHNvdXJjZUJveC55IDogdm9pZCAwKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcHJvamVjdGlvbi9nZW9tZXRyeS91dGlscy5tanNcbnZhciBpbXBvcnRfZGlzdDczMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NzM0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NzM1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gaXNBeGlzRGVsdGFaZXJvKGRlbHRhKSB7XG4gIHJldHVybiBkZWx0YS50cmFuc2xhdGUgPT09IDAgJiYgZGVsdGEuc2NhbGUgPT09IDE7XG59XG5mdW5jdGlvbiBpc0RlbHRhWmVybyhkZWx0YSkge1xuICByZXR1cm4gaXNBeGlzRGVsdGFaZXJvKGRlbHRhLngpICYmIGlzQXhpc0RlbHRhWmVybyhkZWx0YS55KTtcbn1cbmZ1bmN0aW9uIGF4aXNFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYS5taW4gPT09IGIubWluICYmIGEubWF4ID09PSBiLm1heDtcbn1cbmZ1bmN0aW9uIGJveEVxdWFscyhhLCBiKSB7XG4gIHJldHVybiBheGlzRXF1YWxzKGEueCwgYi54KSAmJiBheGlzRXF1YWxzKGEueSwgYi55KTtcbn1cbmZ1bmN0aW9uIGF4aXNFcXVhbHNSb3VuZGVkKGEsIGIpIHtcbiAgcmV0dXJuIE1hdGgucm91bmQoYS5taW4pID09PSBNYXRoLnJvdW5kKGIubWluKSAmJiBNYXRoLnJvdW5kKGEubWF4KSA9PT0gTWF0aC5yb3VuZChiLm1heCk7XG59XG5mdW5jdGlvbiBib3hFcXVhbHNSb3VuZGVkKGEsIGIpIHtcbiAgcmV0dXJuIGF4aXNFcXVhbHNSb3VuZGVkKGEueCwgYi54KSAmJiBheGlzRXF1YWxzUm91bmRlZChhLnksIGIueSk7XG59XG5mdW5jdGlvbiBhc3BlY3RSYXRpbyhib3gpIHtcbiAgcmV0dXJuIGNhbGNMZW5ndGgoYm94LngpIC8gY2FsY0xlbmd0aChib3gueSk7XG59XG5mdW5jdGlvbiBheGlzRGVsdGFFcXVhbHMoYSwgYikge1xuICByZXR1cm4gYS50cmFuc2xhdGUgPT09IGIudHJhbnNsYXRlICYmIGEuc2NhbGUgPT09IGIuc2NhbGUgJiYgYS5vcmlnaW5Qb2ludCA9PT0gYi5vcmlnaW5Qb2ludDtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcHJvamVjdGlvbi9zaGFyZWQvc3RhY2subWpzXG52YXIgaW1wb3J0X2Rpc3Q3MzYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDczNyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDczOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBOb2RlU3RhY2sgPSBjbGFzcyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubWVtYmVycyA9IFtdO1xuICB9XG4gIGFkZChub2RlKSB7XG4gICAgYWRkVW5pcXVlSXRlbSh0aGlzLm1lbWJlcnMsIG5vZGUpO1xuICAgIG5vZGUuc2NoZWR1bGVSZW5kZXIoKTtcbiAgfVxuICByZW1vdmUobm9kZSkge1xuICAgIHJlbW92ZUl0ZW0odGhpcy5tZW1iZXJzLCBub2RlKTtcbiAgICBpZiAobm9kZSA9PT0gdGhpcy5wcmV2TGVhZCkge1xuICAgICAgdGhpcy5wcmV2TGVhZCA9IHZvaWQgMDtcbiAgICB9XG4gICAgaWYgKG5vZGUgPT09IHRoaXMubGVhZCkge1xuICAgICAgY29uc3QgcHJldkxlYWQgPSB0aGlzLm1lbWJlcnNbdGhpcy5tZW1iZXJzLmxlbmd0aCAtIDFdO1xuICAgICAgaWYgKHByZXZMZWFkKSB7XG4gICAgICAgIHRoaXMucHJvbW90ZShwcmV2TGVhZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJlbGVnYXRlKG5vZGUpIHtcbiAgICBjb25zdCBpbmRleE9mTm9kZSA9IHRoaXMubWVtYmVycy5maW5kSW5kZXgoKG1lbWJlcikgPT4gbm9kZSA9PT0gbWVtYmVyKTtcbiAgICBpZiAoaW5kZX
10617hPZk5vZGUgPT09IDApXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgbGV0IHByZXZMZWFkO1xuICAgIGZvciAobGV0IGkgPSBpbmRleE9mTm9kZTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG1lbWJlciA9IHRoaXMubWVtYmVyc1tpXTtcbiAgICAgIGlmIChtZW1iZXIuaXNQcmVzZW50ICE9PSBmYWxzZSkge1xuICAgICAgICBwcmV2TGVhZCA9IG1lbWJlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChwcmV2TGVhZCkge1xuICAgICAgdGhpcy5wcm9tb3RlKHByZXZMZWFkKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHByb21vdGUobm9kZSwgcHJlc2VydmVGb2xsb3dPcGFjaXR5KSB7XG4gICAgY29uc3QgcHJldkxlYWQgPSB0aGlzLmxlYWQ7XG4gICAgaWYgKG5vZGUgPT09IHByZXZMZWFkKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMucHJldkxlYWQgPSBwcmV2TGVhZDtcbiAgICB0aGlzLmxlYWQgPSBub2RlO1xuICAgIG5vZGUuc2hvdygpO1xuICAgIGlmIChwcmV2TGVhZCkge1xuICAgICAgcHJldkxlYWQuaW5zdGFuY2UgJiYgcHJldkxlYWQuc2NoZWR1bGVSZW5kZXIoKTtcbiAgICAgIG5vZGUuc2NoZWR1bGVSZW5kZXIoKTtcbiAgICAgIG5vZGUucmVzdW1lRnJvbSA9IHByZXZMZWFkO1xuICAgICAgaWYgKHByZXNlcnZlRm9sbG93T3BhY2l0eSkge1xuICAgICAgICBub2RlLnJlc3VtZUZyb20ucHJlc2VydmVPcGFjaXR5ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChwcmV2TGVhZC5zbmFwc2hvdCkge1xuICAgICAgICBub2RlLnNuYXBzaG90ID0gcHJldkxlYWQuc25hcHNob3Q7XG4gICAgICAgIG5vZGUuc25hcHNob3QubGF0ZXN0VmFsdWVzID0gcHJldkxlYWQuYW5pbWF0aW9uVmFsdWVzIHx8IHByZXZMZWFkLmxhdGVzdFZhbHVlcztcbiAgICAgIH1cbiAgICAgIGlmIChub2RlLnJvb3QgJiYgbm9kZS5yb290LmlzVXBkYXRpbmcpIHtcbiAgICAgICAgbm9kZS5pc0xheW91dERpcnR5ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgY3Jvc3NmYWRlIH0gPSBub2RlLm9wdGlvbnM7XG4gICAgICBpZiAoY3Jvc3NmYWRlID09PSBmYWxzZSkge1xuICAgICAgICBwcmV2TGVhZC5oaWRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGV4aXRBbmltYXRpb25Db21wbGV0ZSgpIHtcbiAgICB0aGlzLm1lbWJlcnMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgY29uc3QgeyBvcHRpb25zLCByZXN1bWluZ0Zyb20gfSA9IG5vZGU7XG4gICAgICBvcHRpb25zLm9uRXhpdENvbXBsZXRlICYmIG9wdGlvbnMub25FeGl0Q29tcGxldGUoKTtcbiAgICAgIGlmIChyZXN1bWluZ0Zyb20pIHtcbiAgICAgICAgcmVzdW1pbmdGcm9tLm9wdGlvbnMub25FeGl0Q29tcGxldGUgJiYgcmVzdW1pbmdGcm9tLm9wdGlvbnMub25FeGl0Q29tcGxldGUoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBzY2hlZHVsZVJlbmRlcigpIHtcbiAgICB0aGlzLm1lbWJlcnMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgbm9kZS5pbnN0YW5jZSAmJiBub2RlLnNjaGVkdWxlUmVuZGVyKGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuICAvKipcbiAgICogQ2xlYXIgYW55IGxlYWRzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgdGhpcyByZW5kZXIgdG8gcHJldmVudCB0aGVtIGZyb20gYmVpbmdcbiAgICogdXNlZCBpbiBmdXR1cmUgYW5pbWF0aW9ucyBhbmQgdG8gcHJldmVudCBtZW1vcnkgbGVha3NcbiAgICovXG4gIHJlbW92ZUxlYWRTbmFwc2hvdCgpIHtcbiAgICBpZiAodGhpcy5sZWFkICYmIHRoaXMubGVhZC5zbmFwc2hvdCkge1xuICAgICAgdGhpcy5sZWFkLnNuYXBzaG90ID0gdm9pZCAwO1xuICAgIH1cbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcHJvamVjdGlvbi9zdHlsZXMvdHJhbnNmb3JtLm1qc1xudmFyIGltcG9ydF9kaXN0NzM5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3NDAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3NDEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBidWlsZFByb2plY3Rpb25UcmFuc2Zvcm0oZGVsdGEsIHRyZWVTY2FsZSwgbGF0ZXN0VHJhbnNmb3JtKSB7XG4gIGxldCB0cmFuc2Zvcm0yID0gXCJcIjtcbiAgY29uc3QgeFRyYW5zbGF0ZSA9IGRlbHRhLngudHJhbnNsYXRlIC8gdHJlZVNjYWxlLng7XG4gIGNvbnN0IHlUcmFuc2xhdGUgPSBkZWx0YS55LnRyYW5zbGF0ZSAvIHRyZWVTY2FsZS55O1xuICBjb25zdCB6VHJhbnNsYXRlID0gKGxhdGVzdFRyYW5zZm9ybSA9PT0gbnVsbCB8fCBsYXRlc3RUcmFuc2Zvcm0gPT09IHZvaWQgMCA/IHZvaWQgMCA6IGxhdGVzdFRyYW5zZm9ybS56KSB8fCAwO1xuICBpZiAoeFRyYW5zbGF0ZSB8fCB5VHJhbnNsYXRlIHx8IHpUcmFuc2xhdGUpIHtcbiAgICB0cmFuc2Zvcm0yID0gYHRyYW5zbGF0ZTNkKCR7eFRyYW5zbGF0ZX1weCwgJHt5VHJhbnNsYXRlfXB4LCAke3pUcmFuc2xhdGV9cHgpIGA7XG4gIH1cbiAgaWYgKHRyZWVTY2FsZS54ICE9PSAxIHx8IHRyZWVTY2FsZS55ICE9PSAxKSB7XG4gICAgdHJhbnNmb3JtMiArPSBgc2NhbGUoJHsxIC8gdHJlZVNjYWxlLnh9LCAkezEgLyB0cmVlU2NhbGUueX0pIGA7XG4gIH1cbiAgaWYgKGxhdGVzdFRyYW5zZm9ybSkge1xuICAgIGNvbnN0IHsgdHJhbnNmb3JtUGVyc3BlY3RpdmUsIHJvdGF0ZSwgcm90YXRlWCwgcm90YXRlWSwgc2tld1gsIHNrZXdZIH0gPSBsYXRlc3RUcmFuc2Zvcm07XG4gICAgaWYgKHRyYW5zZm9ybVBlcnNwZWN0aXZlKVxuICAgICAgdHJhbnNmb3JtMiA9IGBwZXJzcGVjdGl2ZSgke3RyYW5zZm9ybVBlcnNwZWN0aXZlfXB4KSAke3RyYW5zZm9ybTJ9YDtcbiAgICBpZiAocm90YXRlKVxuICAgICAgdHJhbnNmb3JtMiArPSBgcm90YXRlKCR7cm90YXRlfWRlZykgYDtcbiAgICBpZiAocm90YXRlWClcbiAgICAgIHRyYW5zZm9ybTIgKz0gYHJvdGF0ZVgoJHtyb3RhdGVYfWRlZykgYDtcbiAgICBpZiAocm90YXRlWSlcbiAgICAgIHRyYW5zZm9ybTIgKz0gYHJvdGF0ZVkoJHtyb3RhdGVZfWRlZykgYDtcbiAgICBpZiAoc2tld1gpXG4gICAgICB0cmFuc2Zvcm0yICs9IGBza2V3WCgke3NrZXdYfWRlZykgYDtcbiAgICBpZiAoc2tld1kpXG4gICAgICB0cmFuc2Zvcm0yICs9IGBza2V3WSgke3NrZXdZfWRlZykgYDtcbiAgfVxuICBjb25zdCBlbGVtZW50U2NhbGVYID0gZGVsdGEueC5zY2FsZSAqIHRyZWVTY2FsZS54O1xuICBjb25zdCBlbGVtZW50U2NhbGVZID0gZGVsdGEueS5zY2FsZSAqIHRyZWVTY2FsZS55O1xuICBpZiAoZWxlbWVudFNjYWxlWCAhPT0gMSB8fCBlbGVtZW50U2NhbGVZICE9PSAxKSB7XG4gICAgdHJhbnNmb3JtMiArPSBgc2NhbGUoJHtlbGVtZW50U2NhbGVYfSwgJHtlbGVtZW50U2NhbGVZfSlgO1xuICB9XG4gI
10617HJldHVybiB0cmFuc2Zvcm0yIHx8IFwibm9uZVwiO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9wcm9qZWN0aW9uL25vZGUvY3JlYXRlLXByb2plY3Rpb24tbm9kZS5tanNcbnZhciBtZXRyaWNzID0ge1xuICB0eXBlOiBcInByb2plY3Rpb25GcmFtZVwiLFxuICB0b3RhbE5vZGVzOiAwLFxuICByZXNvbHZlZFRhcmdldERlbHRhczogMCxcbiAgcmVjYWxjdWxhdGVkUHJvamVjdGlvbjogMFxufTtcbnZhciBpc0RlYnVnID0gdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB3aW5kb3cuTW90aW9uRGVidWcgIT09IHZvaWQgMDtcbnZhciB0cmFuc2Zvcm1BeGVzID0gW1wiXCIsIFwiWFwiLCBcIllcIiwgXCJaXCJdO1xudmFyIGhpZGRlblZpc2liaWxpdHkgPSB7IHZpc2liaWxpdHk6IFwiaGlkZGVuXCIgfTtcbnZhciBhbmltYXRpb25UYXJnZXQgPSAxZTM7XG52YXIgaWQyID0gMDtcbmZ1bmN0aW9uIHJlc2V0RGlzdG9ydGluZ1RyYW5zZm9ybShrZXksIHZpc3VhbEVsZW1lbnQsIHZhbHVlcywgc2hhcmVkQW5pbWF0aW9uVmFsdWVzKSB7XG4gIGNvbnN0IHsgbGF0ZXN0VmFsdWVzIH0gPSB2aXN1YWxFbGVtZW50O1xuICBpZiAobGF0ZXN0VmFsdWVzW2tleV0pIHtcbiAgICB2YWx1ZXNba2V5XSA9IGxhdGVzdFZhbHVlc1trZXldO1xuICAgIHZpc3VhbEVsZW1lbnQuc2V0U3RhdGljVmFsdWUoa2V5LCAwKTtcbiAgICBpZiAoc2hhcmVkQW5pbWF0aW9uVmFsdWVzKSB7XG4gICAgICBzaGFyZWRBbmltYXRpb25WYWx1ZXNba2V5XSA9IDA7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBjYW5jZWxUcmVlT3B0aW1pc2VkVHJhbnNmb3JtQW5pbWF0aW9ucyhwcm9qZWN0aW9uTm9kZSkge1xuICBwcm9qZWN0aW9uTm9kZS5oYXNDaGVja2VkT3B0aW1pc2VkQXBwZWFyID0gdHJ1ZTtcbiAgaWYgKHByb2plY3Rpb25Ob2RlLnJvb3QgPT09IHByb2plY3Rpb25Ob2RlKVxuICAgIHJldHVybjtcbiAgY29uc3QgeyB2aXN1YWxFbGVtZW50IH0gPSBwcm9qZWN0aW9uTm9kZS5vcHRpb25zO1xuICBpZiAoIXZpc3VhbEVsZW1lbnQpXG4gICAgcmV0dXJuO1xuICBjb25zdCBhcHBlYXJJZCA9IGdldE9wdGltaXNlZEFwcGVhcklkKHZpc3VhbEVsZW1lbnQpO1xuICBpZiAod2luZG93Lk1vdGlvbkhhc09wdGltaXNlZEFuaW1hdGlvbihhcHBlYXJJZCwgXCJ0cmFuc2Zvcm1cIikpIHtcbiAgICBjb25zdCB7IGxheW91dDogbGF5b3V0MiwgbGF5b3V0SWQgfSA9IHByb2plY3Rpb25Ob2RlLm9wdGlvbnM7XG4gICAgd2luZG93Lk1vdGlvbkNhbmNlbE9wdGltaXNlZEFuaW1hdGlvbihhcHBlYXJJZCwgXCJ0cmFuc2Zvcm1cIiwgZnJhbWUsICEobGF5b3V0MiB8fCBsYXlvdXRJZCkpO1xuICB9XG4gIGNvbnN0IHsgcGFyZW50IH0gPSBwcm9qZWN0aW9uTm9kZTtcbiAgaWYgKHBhcmVudCAmJiAhcGFyZW50Lmhhc0NoZWNrZWRPcHRpbWlzZWRBcHBlYXIpIHtcbiAgICBjYW5jZWxUcmVlT3B0aW1pc2VkVHJhbnNmb3JtQW5pbWF0aW9ucyhwYXJlbnQpO1xuICB9XG59XG5mdW5jdGlvbiBjcmVhdGVQcm9qZWN0aW9uTm9kZTIoeyBhdHRhY2hSZXNpemVMaXN0ZW5lciwgZGVmYXVsdFBhcmVudCwgbWVhc3VyZVNjcm9sbCwgY2hlY2tJc1Njcm9sbFJvb3QsIHJlc2V0VHJhbnNmb3JtIH0pIHtcbiAgcmV0dXJuIGNsYXNzIFByb2plY3Rpb25Ob2RlIHtcbiAgICBjb25zdHJ1Y3RvcihsYXRlc3RWYWx1ZXMgPSB7fSwgcGFyZW50ID0gZGVmYXVsdFBhcmVudCA9PT0gbnVsbCB8fCBkZWZhdWx0UGFyZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBkZWZhdWx0UGFyZW50KCkpIHtcbiAgICAgIHRoaXMuaWQgPSBpZDIrKztcbiAgICAgIHRoaXMuYW5pbWF0aW9uSWQgPSAwO1xuICAgICAgdGhpcy5jaGlsZHJlbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgICB0aGlzLm9wdGlvbnMgPSB7fTtcbiAgICAgIHRoaXMuaXNUcmVlQW5pbWF0aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmlzQW5pbWF0aW9uQmxvY2tlZCA9IGZhbHNlO1xuICAgICAgdGhpcy5pc0xheW91dERpcnR5ID0gZmFsc2U7XG4gICAgICB0aGlzLmlzUHJvamVjdGlvbkRpcnR5ID0gZmFsc2U7XG4gICAgICB0aGlzLmlzU2hhcmVkUHJvamVjdGlvbkRpcnR5ID0gZmFsc2U7XG4gICAgICB0aGlzLmlzVHJhbnNmb3JtRGlydHkgPSBmYWxzZTtcbiAgICAgIHRoaXMudXBkYXRlTWFudWFsbHlCbG9ja2VkID0gZmFsc2U7XG4gICAgICB0aGlzLnVwZGF0ZUJsb2NrZWRCeVJlc2l6ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5pc1VwZGF0aW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmlzU1ZHID0gZmFsc2U7XG4gICAgICB0aGlzLm5lZWRzUmVzZXQgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2hvdWxkUmVzZXRUcmFuc2Zvcm0gPSBmYWxzZTtcbiAgICAgIHRoaXMuaGFzQ2hlY2tlZE9wdGltaXNlZEFwcGVhciA9IGZhbHNlO1xuICAgICAgdGhpcy50cmVlU2NhbGUgPSB7IHg6IDEsIHk6IDEgfTtcbiAgICAgIHRoaXMuZXZlbnRIYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICB0aGlzLmhhc1RyZWVBbmltYXRlZCA9IGZhbHNlO1xuICAgICAgdGhpcy51cGRhdGVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuc2NoZWR1bGVVcGRhdGUgPSAoKSA9PiB0aGlzLnVwZGF0ZSgpO1xuICAgICAgdGhpcy5wcm9qZWN0aW9uVXBkYXRlU2NoZWR1bGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmNoZWNrVXBkYXRlRmFpbGVkID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc1VwZGF0aW5nKSB7XG4gICAgICAgICAgdGhpcy5pc1VwZGF0aW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5jbGVhckFsbFNuYXBzaG90cygpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy51cGRhdGVQcm9qZWN0aW9uID0gKCkgPT4ge1xuICAgICAgICB0aGlzLnByb2plY3Rpb25VcGRhdGVTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGlzRGVidWcpIHtcbiAgICAgICAgICBtZXRyaWNzLnRvdGFsTm9kZXMgPSBtZXRyaWNzLnJlc29sdmVkVGFyZ2V0RGVsdGFzID0gbWV0cmljcy5yZWNhbGN1bGF0ZWRQcm9qZWN0aW9uID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGVzLmZvckVhY2gocHJvcGFnYXRlRGlydHlOb2Rlcyk7XG4gICAgICAgI
10617HRoaXMubm9kZXMuZm9yRWFjaChyZXNvbHZlVGFyZ2V0RGVsdGEpO1xuICAgICAgICB0aGlzLm5vZGVzLmZvckVhY2goY2FsY1Byb2plY3Rpb24pO1xuICAgICAgICB0aGlzLm5vZGVzLmZvckVhY2goY2xlYW5EaXJ0eU5vZGVzKTtcbiAgICAgICAgaWYgKGlzRGVidWcpIHtcbiAgICAgICAgICB3aW5kb3cuTW90aW9uRGVidWcucmVjb3JkKG1ldHJpY3MpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgdGhpcy5yZXNvbHZlZFJlbGF0aXZlVGFyZ2V0QXQgPSAwO1xuICAgICAgdGhpcy5oYXNQcm9qZWN0ZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuaXNWaXNpYmxlID0gdHJ1ZTtcbiAgICAgIHRoaXMuYW5pbWF0aW9uUHJvZ3Jlc3MgPSAwO1xuICAgICAgdGhpcy5zaGFyZWROb2RlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICB0aGlzLmxhdGVzdFZhbHVlcyA9IGxhdGVzdFZhbHVlcztcbiAgICAgIHRoaXMucm9vdCA9IHBhcmVudCA/IHBhcmVudC5yb290IHx8IHBhcmVudCA6IHRoaXM7XG4gICAgICB0aGlzLnBhdGggPSBwYXJlbnQgPyBbLi4ucGFyZW50LnBhdGgsIHBhcmVudF0gOiBbXTtcbiAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgICAgdGhpcy5kZXB0aCA9IHBhcmVudCA/IHBhcmVudC5kZXB0aCArIDEgOiAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5wYXRoW2ldLnNob3VsZFJlc2V0VHJhbnNmb3JtID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnJvb3QgPT09IHRoaXMpXG4gICAgICAgIHRoaXMubm9kZXMgPSBuZXcgRmxhdFRyZWUoKTtcbiAgICB9XG4gICAgYWRkRXZlbnRMaXN0ZW5lcihuYW1lLCBoYW5kbGVyKSB7XG4gICAgICBpZiAoIXRoaXMuZXZlbnRIYW5kbGVycy5oYXMobmFtZSkpIHtcbiAgICAgICAgdGhpcy5ldmVudEhhbmRsZXJzLnNldChuYW1lLCBuZXcgU3Vic2NyaXB0aW9uTWFuYWdlcigpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmV2ZW50SGFuZGxlcnMuZ2V0KG5hbWUpLmFkZChoYW5kbGVyKTtcbiAgICB9XG4gICAgbm90aWZ5TGlzdGVuZXJzKG5hbWUsIC4uLmFyZ3MpIHtcbiAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbk1hbmFnZXIgPSB0aGlzLmV2ZW50SGFuZGxlcnMuZ2V0KG5hbWUpO1xuICAgICAgc3Vic2NyaXB0aW9uTWFuYWdlciAmJiBzdWJzY3JpcHRpb25NYW5hZ2VyLm5vdGlmeSguLi5hcmdzKTtcbiAgICB9XG4gICAgaGFzTGlzdGVuZXJzKG5hbWUpIHtcbiAgICAgIHJldHVybiB0aGlzLmV2ZW50SGFuZGxlcnMuaGFzKG5hbWUpO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBMaWZlY3ljbGVzXG4gICAgICovXG4gICAgbW91bnQoaW5zdGFuY2UsIGlzTGF5b3V0RGlydHkgPSB0aGlzLnJvb3QuaGFzVHJlZUFuaW1hdGVkKSB7XG4gICAgICBpZiAodGhpcy5pbnN0YW5jZSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdGhpcy5pc1NWRyA9IGlzU1ZHRWxlbWVudChpbnN0YW5jZSk7XG4gICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgICBjb25zdCB7IGxheW91dElkLCBsYXlvdXQ6IGxheW91dDIsIHZpc3VhbEVsZW1lbnQgfSA9IHRoaXMub3B0aW9ucztcbiAgICAgIGlmICh2aXN1YWxFbGVtZW50ICYmICF2aXN1YWxFbGVtZW50LmN1cnJlbnQpIHtcbiAgICAgICAgdmlzdWFsRWxlbWVudC5tb3VudChpbnN0YW5jZSk7XG4gICAgICB9XG4gICAgICB0aGlzLnJvb3Qubm9kZXMuYWRkKHRoaXMpO1xuICAgICAgdGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuY2hpbGRyZW4uYWRkKHRoaXMpO1xuICAgICAgaWYgKGlzTGF5b3V0RGlydHkgJiYgKGxheW91dDIgfHwgbGF5b3V0SWQpKSB7XG4gICAgICAgIHRoaXMuaXNMYXlvdXREaXJ0eSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoYXR0YWNoUmVzaXplTGlzdGVuZXIpIHtcbiAgICAgICAgbGV0IGNhbmNlbERlbGF5O1xuICAgICAgICBjb25zdCByZXNpemVVbmJsb2NrVXBkYXRlID0gKCkgPT4gdGhpcy5yb290LnVwZGF0ZUJsb2NrZWRCeVJlc2l6ZSA9IGZhbHNlO1xuICAgICAgICBhdHRhY2hSZXNpemVMaXN0ZW5lcihpbnN0YW5jZSwgKCkgPT4ge1xuICAgICAgICAgIHRoaXMucm9vdC51cGRhdGVCbG9ja2VkQnlSZXNpemUgPSB0cnVlO1xuICAgICAgICAgIGNhbmNlbERlbGF5ICYmIGNhbmNlbERlbGF5KCk7XG4gICAgICAgICAgY2FuY2VsRGVsYXkgPSBkZWxheShyZXNpemVVbmJsb2NrVXBkYXRlLCAyNTApO1xuICAgICAgICAgIGlmIChnbG9iYWxQcm9qZWN0aW9uU3RhdGUuaGFzQW5pbWF0ZWRTaW5jZVJlc2l6ZSkge1xuICAgICAgICAgICAgZ2xvYmFsUHJvamVjdGlvblN0YXRlLmhhc0FuaW1hdGVkU2luY2VSZXNpemUgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMubm9kZXMuZm9yRWFjaChmaW5pc2hBbmltYXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAobGF5b3V0SWQpIHtcbiAgICAgICAgdGhpcy5yb290LnJlZ2lzdGVyU2hhcmVkTm9kZShsYXlvdXRJZCwgdGhpcyk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5vcHRpb25zLmFuaW1hdGUgIT09IGZhbHNlICYmIHZpc3VhbEVsZW1lbnQgJiYgKGxheW91dElkIHx8IGxheW91dDIpKSB7XG4gICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcImRpZFVwZGF0ZVwiLCAoeyBkZWx0YSwgaGFzTGF5b3V0Q2hhbmdlZCwgaGFzUmVsYXRpdmVUYXJnZXRDaGFuZ2VkLCBsYXlvdXQ6IG5ld0xheW91dCB9KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNUcmVlQW5pbWF0aW9uQmxvY2tlZCgpKSB7XG4gICAgICAgICAgICB0aGlzLnRhcmdldCA9IHZvaWQgMDtcbiAgICAgICAgICAgIHRoaXMucmVsYXRpdmVUYXJnZXQgPSB2b2lkIDA7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGxheW91dFRyYW5zaXRpb24gPSB0aGlzLm9wdGlvbnMudHJhbnNpdGlvbiB8fCB2aXN1YWxFbGVtZW50LmdldERlZmF1bHRUcmFuc2l0aW9uKCkgfHwgZGVmYXVsdExheW91dFRyYW5zaXRpb247XG4gICAgICAgICAgY29uc3QgeyBvbkxheW91dEFuaW1hdGlvblN0YXJ0LCBvbkxheW91dEFuaW1hdGlvbkNvbXBsZXRlIH0gPSB2aXN1YWxFbGVtZW50LmdldFByb3BzKCk7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0Q2hhbmdlZCA9ICF0aGlzLnRhcmdldExheW91dCB8fCAhYm94RXF1YWxzUm91bmRlZCh0aGlzLnRhcmdldExheW91dCwgbmV3TGF5b3V0KSB8fCBoYXNSZWxhdGl2ZVRhcmdldENoYW5nZWQ7XG4gICAgICAgICAgY29uc3QgaGFzT25seVJlbGF0aXZlVGFyZ2V0Q2hhbmdlZCA9ICFoYXNMYXlvdXRDaGFuZ2VkICYmIGhhc1JlbGF0aXZlVGFyZ2V0Q2hhbmdlZDtcbiAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmxheW91dFJvb3QgfHwgdGhpcy5yZXN1bWVGcm9tICYmIHRoaXMucmVzdW1lRnJvbS5pbnN0YW5jZSB8fCBoYXNPbmx5UmVsYXRpdmVUYXJnZXRDaGFuZ2VkIHx8IGhhc0xheW91dENoYW5nZWQgJiYgKHRhcmdldENoYW5nZWQgfHwgIXRoaXMuY3VycmVudEFuaW1hdGlvbikpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlc3VtZUZyb20pIHtcbiAgICAgICAgICAgICAgdGhpcy5yZXN1bWluZ0Zyb20gPSB0aGlzLnJlc3VtZUZyb207XG4gICAgICAgICAgICAgI
10617HRoaXMucmVzdW1pbmdGcm9tLnJlc3VtaW5nRnJvbSA9IHZvaWQgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0QW5pbWF0aW9uT3JpZ2luKGRlbHRhLCBoYXNPbmx5UmVsYXRpdmVUYXJnZXRDaGFuZ2VkKTtcbiAgICAgICAgICAgIGNvbnN0IGFuaW1hdGlvbk9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgIC4uLmdldFZhbHVlVHJhbnNpdGlvbihsYXlvdXRUcmFuc2l0aW9uLCBcImxheW91dFwiKSxcbiAgICAgICAgICAgICAgb25QbGF5OiBvbkxheW91dEFuaW1hdGlvblN0YXJ0LFxuICAgICAgICAgICAgICBvbkNvbXBsZXRlOiBvbkxheW91dEFuaW1hdGlvbkNvbXBsZXRlXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHZpc3VhbEVsZW1lbnQuc2hvdWxkUmVkdWNlTW90aW9uIHx8IHRoaXMub3B0aW9ucy5sYXlvdXRSb290KSB7XG4gICAgICAgICAgICAgIGFuaW1hdGlvbk9wdGlvbnMuZGVsYXkgPSAwO1xuICAgICAgICAgICAgICBhbmltYXRpb25PcHRpb25zLnR5cGUgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RhcnRBbmltYXRpb24oYW5pbWF0aW9uT3B0aW9ucyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICghaGFzTGF5b3V0Q2hhbmdlZCkge1xuICAgICAgICAgICAgICBmaW5pc2hBbmltYXRpb24odGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5pc0xlYWQoKSAmJiB0aGlzLm9wdGlvbnMub25FeGl0Q29tcGxldGUpIHtcbiAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLm9uRXhpdENvbXBsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudGFyZ2V0TGF5b3V0ID0gbmV3TGF5b3V0O1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdW5tb3VudCgpIHtcbiAgICAgIHRoaXMub3B0aW9ucy5sYXlvdXRJZCAmJiB0aGlzLndpbGxVcGRhdGUoKTtcbiAgICAgIHRoaXMucm9vdC5ub2Rlcy5yZW1vdmUodGhpcyk7XG4gICAgICBjb25zdCBzdGFjayA9IHRoaXMuZ2V0U3RhY2soKTtcbiAgICAgIHN0YWNrICYmIHN0YWNrLnJlbW92ZSh0aGlzKTtcbiAgICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmNoaWxkcmVuLmRlbGV0ZSh0aGlzKTtcbiAgICAgIHRoaXMuaW5zdGFuY2UgPSB2b2lkIDA7XG4gICAgICBjYW5jZWxGcmFtZSh0aGlzLnVwZGF0ZVByb2plY3Rpb24pO1xuICAgIH1cbiAgICAvLyBvbmx5IG9uIHRoZSByb290XG4gICAgYmxvY2tVcGRhdGUoKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1hbnVhbGx5QmxvY2tlZCA9IHRydWU7XG4gICAgfVxuICAgIHVuYmxvY2tVcGRhdGUoKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1hbnVhbGx5QmxvY2tlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBpc1VwZGF0ZUJsb2NrZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVNYW51YWxseUJsb2NrZWQgfHwgdGhpcy51cGRhdGVCbG9ja2VkQnlSZXNpemU7XG4gICAgfVxuICAgIGlzVHJlZUFuaW1hdGlvbkJsb2NrZWQoKSB7XG4gICAgICByZXR1cm4gdGhpcy5pc0FuaW1hdGlvbkJsb2NrZWQgfHwgdGhpcy5wYXJlbnQgJiYgdGhpcy5wYXJlbnQuaXNUcmVlQW5pbWF0aW9uQmxvY2tlZCgpIHx8IGZhbHNlO1xuICAgIH1cbiAgICAvLyBOb3RlOiBjdXJyZW50bHkgb25seSBydW5uaW5nIG9uIHJvb3Qgbm9kZVxuICAgIHN0YXJ0VXBkYXRlKCkge1xuICAgICAgaWYgKHRoaXMuaXNVcGRhdGVCbG9ja2VkKCkpXG4gICAgICAgIHJldHVybjtcbiAgICAgIHRoaXMuaXNVcGRhdGluZyA9IHRydWU7XG4gICAgICB0aGlzLm5vZGVzICYmIHRoaXMubm9kZXMuZm9yRWFjaChyZXNldFNrZXdBbmRSb3RhdGlvbik7XG4gICAgICB0aGlzLmFuaW1hdGlvbklkKys7XG4gICAgfVxuICAgIGdldFRyYW5zZm9ybVRlbXBsYXRlKCkge1xuICAgICAgY29uc3QgeyB2aXN1YWxFbGVtZW50IH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICByZXR1cm4gdmlzdWFsRWxlbWVudCAmJiB2aXN1YWxFbGVtZW50LmdldFByb3BzKCkudHJhbnNmb3JtVGVtcGxhdGU7XG4gICAgfVxuICAgIHdpbGxVcGRhdGUoc2hvdWxkTm90aWZ5TGlzdGVuZXJzID0gdHJ1ZSkge1xuICAgICAgdGhpcy5yb290Lmhhc1RyZWVBbmltYXRlZCA9IHRydWU7XG4gICAgICBpZiAodGhpcy5yb290LmlzVXBkYXRlQmxvY2tlZCgpKSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy5vbkV4aXRDb21wbGV0ZSAmJiB0aGlzLm9wdGlvbnMub25FeGl0Q29tcGxldGUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHdpbmRvdy5Nb3Rpb25DYW5jZWxPcHRpbWlzZWRBbmltYXRpb24gJiYgIXRoaXMuaGFzQ2hlY2tlZE9wdGltaXNlZEFwcGVhcikge1xuICAgICAgICBjYW5jZWxUcmVlT3B0aW1pc2VkVHJhbnNmb3JtQW5pbWF0aW9ucyh0aGlzKTtcbiAgICAgIH1cbiAgICAgICF0aGlzLnJvb3QuaXNVcGRhdGluZyAmJiB0aGlzLnJvb3Quc3RhcnRVcGRhdGUoKTtcbiAgICAgIGlmICh0aGlzLmlzTGF5b3V0RGlydHkpXG4gICAgICAgIHJldHVybjtcbiAgICAgIHRoaXMuaXNMYXlvdXREaXJ0eSA9IHRydWU7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5wYXRoW2ldO1xuICAgICAgICBub2RlLnNob3VsZFJlc2V0VHJhbnNmb3JtID0gdHJ1ZTtcbiAgICAgICAgbm9kZS51cGRhdGVTY3JvbGwoXCJzbmFwc2hvdFwiKTtcbiAgICAgICAgaWYgKG5vZGUub3B0aW9ucy5sYXlvdXRSb290KSB7XG4gICAgICAgICAgbm9kZS53aWxsVXBkYXRlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgeyBsYXlvdXRJZCwgbGF5b3V0OiBsYXlvdXQyIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICBpZiAobGF5b3V0SWQgPT09IHZvaWQgMCAmJiAhbGF5b3V0MilcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgdHJhbnNmb3JtVGVtcGxhdGUgPSB0aGlzLmdldFRyYW5zZm9ybVRlbXBsYXRlKCk7XG4gICAgICB0aGlzLnByZXZUcmFuc2Zvcm1UZW1wbGF0ZVZhbHVlID0gdHJhbnNmb3JtVGVtcGxhdGUgPyB0cmFuc2Zvcm1UZW1wbGF0ZSh0aGlzLmxhdGVzdFZhbHVlcywgXCJcIikgOiB2b2lkIDA7XG4gICAgICB0aGlzLnVwZGF0ZVNuYXBzaG90KCk7XG4gICAgICBzaG91bGROb3RpZnlMaXN0ZW5lcnMgJiYgdGhpcy5ub3RpZnlMaXN0ZW5lcnMoXCJ3aWxsVXBkYXRlXCIpO1xuICAgIH1cbiAgICB1cGRhdGUoKSB7XG4gICAgICB0aGlzLnVwZGF0ZVNjaG
10617VkdWxlZCA9IGZhbHNlO1xuICAgICAgY29uc3QgdXBkYXRlV2FzQmxvY2tlZCA9IHRoaXMuaXNVcGRhdGVCbG9ja2VkKCk7XG4gICAgICBpZiAodXBkYXRlV2FzQmxvY2tlZCkge1xuICAgICAgICB0aGlzLnVuYmxvY2tVcGRhdGUoKTtcbiAgICAgICAgdGhpcy5jbGVhckFsbFNuYXBzaG90cygpO1xuICAgICAgICB0aGlzLm5vZGVzLmZvckVhY2goY2xlYXJNZWFzdXJlbWVudHMpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMuaXNVcGRhdGluZykge1xuICAgICAgICB0aGlzLm5vZGVzLmZvckVhY2goY2xlYXJJc0xheW91dERpcnR5KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaXNVcGRhdGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5ub2Rlcy5mb3JFYWNoKHJlc2V0VHJhbnNmb3JtU3R5bGUpO1xuICAgICAgdGhpcy5ub2Rlcy5mb3JFYWNoKHVwZGF0ZUxheW91dCk7XG4gICAgICB0aGlzLm5vZGVzLmZvckVhY2gobm90aWZ5TGF5b3V0VXBkYXRlKTtcbiAgICAgIHRoaXMuY2xlYXJBbGxTbmFwc2hvdHMoKTtcbiAgICAgIGNvbnN0IG5vdzIgPSB0aW1lLm5vdygpO1xuICAgICAgZnJhbWVEYXRhLmRlbHRhID0gY2xhbXAoMCwgMWUzIC8gNjAsIG5vdzIgLSBmcmFtZURhdGEudGltZXN0YW1wKTtcbiAgICAgIGZyYW1lRGF0YS50aW1lc3RhbXAgPSBub3cyO1xuICAgICAgZnJhbWVEYXRhLmlzUHJvY2Vzc2luZyA9IHRydWU7XG4gICAgICBmcmFtZVN0ZXBzLnVwZGF0ZS5wcm9jZXNzKGZyYW1lRGF0YSk7XG4gICAgICBmcmFtZVN0ZXBzLnByZVJlbmRlci5wcm9jZXNzKGZyYW1lRGF0YSk7XG4gICAgICBmcmFtZVN0ZXBzLnJlbmRlci5wcm9jZXNzKGZyYW1lRGF0YSk7XG4gICAgICBmcmFtZURhdGEuaXNQcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgfVxuICAgIGRpZFVwZGF0ZSgpIHtcbiAgICAgIGlmICghdGhpcy51cGRhdGVTY2hlZHVsZWQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVTY2hlZHVsZWQgPSB0cnVlO1xuICAgICAgICBtaWNyb3Rhc2sucmVhZCh0aGlzLnNjaGVkdWxlVXBkYXRlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY2xlYXJBbGxTbmFwc2hvdHMoKSB7XG4gICAgICB0aGlzLm5vZGVzLmZvckVhY2goY2xlYXJTbmFwc2hvdCk7XG4gICAgICB0aGlzLnNoYXJlZE5vZGVzLmZvckVhY2gocmVtb3ZlTGVhZFNuYXBzaG90cyk7XG4gICAgfVxuICAgIHNjaGVkdWxlVXBkYXRlUHJvamVjdGlvbigpIHtcbiAgICAgIGlmICghdGhpcy5wcm9qZWN0aW9uVXBkYXRlU2NoZWR1bGVkKSB7XG4gICAgICAgIHRoaXMucHJvamVjdGlvblVwZGF0ZVNjaGVkdWxlZCA9IHRydWU7XG4gICAgICAgIGZyYW1lLnByZVJlbmRlcih0aGlzLnVwZGF0ZVByb2plY3Rpb24sIGZhbHNlLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc2NoZWR1bGVDaGVja0FmdGVyVW5tb3VudCgpIHtcbiAgICAgIGZyYW1lLnBvc3RSZW5kZXIoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0xheW91dERpcnR5KSB7XG4gICAgICAgICAgdGhpcy5yb290LmRpZFVwZGF0ZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucm9vdC5jaGVja1VwZGF0ZUZhaWxlZCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVXBkYXRlIG1lYXN1cmVtZW50c1xuICAgICAqL1xuICAgIHVwZGF0ZVNuYXBzaG90KCkge1xuICAgICAgaWYgKHRoaXMuc25hcHNob3QgfHwgIXRoaXMuaW5zdGFuY2UpXG4gICAgICAgIHJldHVybjtcbiAgICAgIHRoaXMuc25hcHNob3QgPSB0aGlzLm1lYXN1cmUoKTtcbiAgICB9XG4gICAgdXBkYXRlTGF5b3V0KCkge1xuICAgICAgaWYgKCF0aGlzLmluc3RhbmNlKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLnVwZGF0ZVNjcm9sbCgpO1xuICAgICAgaWYgKCEodGhpcy5vcHRpb25zLmFsd2F5c01lYXN1cmVMYXlvdXQgJiYgdGhpcy5pc0xlYWQoKSkgJiYgIXRoaXMuaXNMYXlvdXREaXJ0eSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yZXN1bWVGcm9tICYmICF0aGlzLnJlc3VtZUZyb20uaW5zdGFuY2UpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBub2RlID0gdGhpcy5wYXRoW2ldO1xuICAgICAgICAgIG5vZGUudXBkYXRlU2Nyb2xsKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHByZXZMYXlvdXQgPSB0aGlzLmxheW91dDtcbiAgICAgIHRoaXMubGF5b3V0ID0gdGhpcy5tZWFzdXJlKGZhbHNlKTtcbiAgICAgIHRoaXMubGF5b3V0Q29ycmVjdGVkID0gY3JlYXRlQm94KCk7XG4gICAgICB0aGlzLmlzTGF5b3V0RGlydHkgPSBmYWxzZTtcbiAgICAgIHRoaXMucHJvamVjdGlvbkRlbHRhID0gdm9pZCAwO1xuICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnMoXCJtZWFzdXJlXCIsIHRoaXMubGF5b3V0LmxheW91dEJveCk7XG4gICAgICBjb25zdCB7IHZpc3VhbEVsZW1lbnQgfSA9IHRoaXMub3B0aW9ucztcbiAgICAgIHZpc3VhbEVsZW1lbnQgJiYgdmlzdWFsRWxlbWVudC5ub3RpZnkoXCJMYXlvdXRNZWFzdXJlXCIsIHRoaXMubGF5b3V0LmxheW91dEJveCwgcHJldkxheW91dCA/IHByZXZMYXlvdXQubGF5b3V0Qm94IDogdm9pZCAwKTtcbiAgICB9XG4gICAgdXBkYXRlU2Nyb2xsKHBoYXNlID0gXCJtZWFzdXJlXCIpIHtcbiAgICAgIGxldCBuZWVkc01lYXN1cmVtZW50ID0gQm9vbGVhbih0aGlzLm9wdGlvbnMubGF5b3V0U2Nyb2xsICYmIHRoaXMuaW5zdGFuY2UpO1xuICAgICAgaWYgKHRoaXMuc2Nyb2xsICYmIHRoaXMuc2Nyb2xsLmFuaW1hdGlvbklkID09PSB0aGlzLnJvb3QuYW5pbWF0aW9uSWQgJiYgdGhpcy5zY3JvbGwucGhhc2UgPT09IHBoYXNlKSB7XG4gICAgICAgIG5lZWRzTWVhc3VyZW1lbnQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChuZWVkc01lYXN1cmVtZW50KSB7XG4gICAgICAgIGNvbnN0IGlzUm9vdCA9IGNoZWNrSXNTY3JvbGxSb290KHRoaXMuaW5zdGFuY2UpO1xuICAgICAgICB0aGlzLnNjcm9sbCA9IHtcbiAgICAgICAgICBhbmltYXRpb25JZDogdGhpcy5yb290LmFuaW1hdGlvbklkLFxuICAgICAgICAgI
10617HBoYXNlLFxuICAgICAgICAgIGlzUm9vdCxcbiAgICAgICAgICBvZmZzZXQ6IG1lYXN1cmVTY3JvbGwodGhpcy5pbnN0YW5jZSksXG4gICAgICAgICAgd2FzUm9vdDogdGhpcy5zY3JvbGwgPyB0aGlzLnNjcm9sbC5pc1Jvb3QgOiBpc1Jvb3RcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzZXRUcmFuc2Zvcm0oKSB7XG4gICAgICBpZiAoIXJlc2V0VHJhbnNmb3JtKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBpc1Jlc2V0UmVxdWVzdGVkID0gdGhpcy5pc0xheW91dERpcnR5IHx8IHRoaXMuc2hvdWxkUmVzZXRUcmFuc2Zvcm0gfHwgdGhpcy5vcHRpb25zLmFsd2F5c01lYXN1cmVMYXlvdXQ7XG4gICAgICBjb25zdCBoYXNQcm9qZWN0aW9uID0gdGhpcy5wcm9qZWN0aW9uRGVsdGEgJiYgIWlzRGVsdGFaZXJvKHRoaXMucHJvamVjdGlvbkRlbHRhKTtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybVRlbXBsYXRlID0gdGhpcy5nZXRUcmFuc2Zvcm1UZW1wbGF0ZSgpO1xuICAgICAgY29uc3QgdHJhbnNmb3JtVGVtcGxhdGVWYWx1ZSA9IHRyYW5zZm9ybVRlbXBsYXRlID8gdHJhbnNmb3JtVGVtcGxhdGUodGhpcy5sYXRlc3RWYWx1ZXMsIFwiXCIpIDogdm9pZCAwO1xuICAgICAgY29uc3QgdHJhbnNmb3JtVGVtcGxhdGVIYXNDaGFuZ2VkID0gdHJhbnNmb3JtVGVtcGxhdGVWYWx1ZSAhPT0gdGhpcy5wcmV2VHJhbnNmb3JtVGVtcGxhdGVWYWx1ZTtcbiAgICAgIGlmIChpc1Jlc2V0UmVxdWVzdGVkICYmIChoYXNQcm9qZWN0aW9uIHx8IGhhc1RyYW5zZm9ybSh0aGlzLmxhdGVzdFZhbHVlcykgfHwgdHJhbnNmb3JtVGVtcGxhdGVIYXNDaGFuZ2VkKSkge1xuICAgICAgICByZXNldFRyYW5zZm9ybSh0aGlzLmluc3RhbmNlLCB0cmFuc2Zvcm1UZW1wbGF0ZVZhbHVlKTtcbiAgICAgICAgdGhpcy5zaG91bGRSZXNldFRyYW5zZm9ybSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNjaGVkdWxlUmVuZGVyKCk7XG4gICAgICB9XG4gICAgfVxuICAgIG1lYXN1cmU
10617ocmVtb3ZlVHJhbnNmb3JtID0gdHJ1ZSkge1xuICAgICAgY29uc3QgcGFnZUJveCA9IHRoaXMubWVhc3VyZVBhZ2VCb3goKTtcbiAgICAgIGxldCBsYXlvdXRCb3ggPSB0aGlzLnJlbW92ZUVsZW1lbnRTY3JvbGwocGFnZUJveCk7XG4gICAgICBpZiAocmVtb3ZlVHJhbnNmb3JtKSB7XG4gICAgICAgIGxheW91dEJveCA9IHRoaXMucmVtb3ZlVHJhbnNmb3JtKGxheW91dEJveCk7XG4gICAgICB9XG4gICAgICByb3VuZEJveChsYXlvdXRCb3gpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYW5pbWF0aW9uSWQ6IHRoaXMucm9vdC5hbmltYXRpb25JZCxcbiAgICAgICAgbWVhc3VyZWRCb3g6IHBhZ2VCb3gsXG4gICAgICAgIGxheW91dEJveCxcbiAgICAgICAgbGF0ZXN0VmFsdWVzOiB7fSxcbiAgICAgICAgc291cmNlOiB0aGlzLmlkXG4gICAgICB9O1xuICAgIH1cbiAgICBtZWFzdXJlUGFnZUJveCgpIHtcbiAgICAgIHZhciBfYTtcbiAgICAgIGNvbnN0IHsgdmlzdWFsRWxlbWVudCB9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgaWYgKCF2aXN1YWxFbGVtZW50KVxuICAgICAgICByZXR1cm4gY3JlYXRlQm94KCk7XG4gICAgICBjb25zdCBib3ggPSB2aXN1YWxFbGVtZW50Lm1lYXN1cmVWaWV3cG9ydEJveCgpO1xuICAgICAgY29uc3Qgd2FzSW5TY3JvbGxSb290ID0gKChfYSA9IHRoaXMuc2Nyb2xsKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Eud2FzUm9vdCkgfHwgdGhpcy5wYXRoLnNvbWUoY2hlY2tOb2RlV2FzU2Nyb2xsUm9vdCk7XG4gICAgICBpZiAoIXdhc0luU2Nyb2xsUm9vdCkge1xuICAgICAgICBjb25zdCB7IHNjcm9sbDogc2Nyb2xsMiB9ID0gdGhpcy5yb290O1xuICAgICAgICBpZiAoc2Nyb2xsMikge1xuICAgICAgICAgIHRyYW5zbGF0ZUF4aXMoYm94LngsIHNjcm9sbDIub2Zmc2V0LngpO1xuICAgICAgICAgIHRyYW5zbGF0ZUF4aXMoYm94LnksIHNjcm9sbDIub2Zmc2V0LnkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYm94O1xuICAgIH1cbiAgICByZW1vdmVFbGVtZW50U2Nyb2xsKGJveCkge1xuICAgICAgdmFyIF9hO1xuICAgICAgY29uc3QgYm94V2l0aG91dFNjcm9sbCA9IGNyZWF0ZUJveCgpO1xuICAgICAgY29weUJveEludG8oYm94V2l0aG91dFNjcm9sbCwgYm94KTtcbiAgICAgIGlmICgoX2EgPSB0aGlzLnNjcm9sbCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLndhc1Jvb3QpIHtcbiAgICAgICAgcmV0dXJuIGJveFdpdGhvdXRTY3JvbGw7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5wYXRoW2ldO1xuICAgICAgICBjb25zdCB7IHNjcm9sbDogc2Nyb2xsMiwgb3B0aW9ucyB9ID0gbm9kZTtcbiAgICAgICAgaWYgKG5vZGUgIT09IHRoaXMucm9vdCAmJiBzY3JvbGwyICYmIG9wdGlvbnMubGF5b3V0U2Nyb2xsKSB7XG4gICAgICAgICAgaWYgKHNjcm9sbDIud2FzUm9vdCkge1xuICAgICAgICAgICAgY29weUJveEludG8oYm94V2l0aG91dFNjcm9sbCwgYm94KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJhbnNsYXRlQXhpcyhib3hXaXRob3V0U2Nyb2xsLngsIHNjcm9sbDIub2Zmc2V0LngpO1xuICAgICAgICAgIHRyYW5zbGF0ZUF4aXMoYm94V2l0aG91dFNjcm9sbC55LCBzY3JvbGwyLm9mZnNldC55KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGJveFdpdGhvdXRTY3JvbGw7XG4gICAgfVxuICAgIGFwcGx5VHJhbnNmb3JtKGJveCwgdHJhbnNmb3JtT25seSA9IGZhbHNlKSB7XG4gICAgICBjb25zdCB3aXRoVHJhbnNmb3JtcyA9IGNyZWF0ZUJveCgpO1xuICAgICAgY29weUJveEludG8od2l0aFRyYW5zZm9ybXMsIGJveCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5wYXRoW2ldO1xuICAgICAgICBpZiAoIXRyYW5zZm9ybU9ubHkgJiYgbm9kZS5vcHRpb25zLmxheW91dFNjcm9sbCAmJiBub2RlLnNjcm9sbCAmJiBub2RlICE9PSBub2RlLnJvb3QpIHtcbiAgICAgICAgICB0cmFuc2Zvcm1Cb3god2l0aFRyYW5zZm9ybXMsIHtcbiAgICAgICAgICAgIHg6IC1ub2RlLnNjcm9sbC5vZmZzZXQueCxcbiAgICAgICAgICAgIHk6IC1ub2RlLnNjcm9sbC5vZmZzZXQueVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaGFzVHJhbnNmb3JtKG5vZGUubGF0ZXN0VmFsdWVzKSlcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgdHJhbnNmb3JtQm94KHdpdGhUcmFuc2Zvcm1zLCBub2RlLmxhdGVzdFZhbHVlcyk7XG4gICAgICB9XG4gICAgICBpZiAoaGFzVHJhbnNmb3JtKHRoaXMubGF0ZXN0VmFsdWVzKSkge1xuICAgICAgICB0cmFuc2Zvcm1Cb3god2l0aFRyYW5zZm9ybXMsIHRoaXMubGF0ZXN0VmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3aXRoVHJhbnNmb3JtcztcbiAgICB9XG4gICAgcmVtb3ZlVHJhbnNmb3JtKGJveCkge1xuICAgICAgY29uc3QgYm94V2l0aG91dFRyYW5zZm9ybSA9IGNyZWF0ZUJveCgpO1xuICAgICAgY29weUJveEludG8oYm94V2l0aG91dFRyYW5zZm9ybSwgYm94KTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wYXRoLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLnBhdGhbaV07XG4gICAgICAgIGlmICghbm9kZS5pbnN0YW5jZSlcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgaWYgKCFoYXNUcmFuc2Zvcm0obm9kZS5sYXRlc3RWYWx1ZXMpKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBoYXNTY2FsZShub2RlLmxhdGVzdFZhbHVlcykgJiYgbm9kZS51cGRhdGVTbmFwc2hvdCgpO1xuICAgICAgICBjb25zdCBzb3VyY2VCb3ggPSBjcmVhdGVCb3goKTtcbiAgICAgICAgY29uc3Qgbm9kZUJveCA9IG5vZGUubWVhc3VyZVBhZ2VCb3goKTtcbiAgICAgICAgY29weUJveEludG8oc291cmNlQm94LCBub2RlQm94KTtcbiAgICAgICAgcmVtb3ZlQm94VHJhbnNmb3Jtcyhib3hXaXRob3V0VHJhbnNmb3JtLCBub2RlLmxhdGVzdFZhbHVlcywgbm9kZS5zbmFwc2hvdCA/IG5vZGUuc25hcHNob3QubGF5b3V0Qm94IDogdm9pZCAwLCBzb3VyY2VCb3gpO1xuICAgICAgfVxuICAgICAgaWYgKGhhc1RyYW5zZm9ybSh0aGlzLmxhdGVzdFZhbHVlcykpIHtcbiAgICAgICAgcmVtb3ZlQm94VHJhbnNmb3Jtcyhib3hXaXRob3V0VHJhbnNmb3JtLCB0aGlzLmxhdGVzdFZhbHVlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYm94V2l0aG91dFRyYW5zZm9ybTtcbiAgICB9XG4gICAgc2V0VGFyZ2V0RGVsdGEoZGVsdGEpIHtcbiAgICAgIHRoaXMudGFyZ2V0RGVsdGEgPSBkZWx0YTtcbiAgICAgIHRoaXMucm9vdC5zY2hlZHVsZVVwZGF0ZVByb2plY3Rpb24oKTtcbiAgICAgIHRoaXMuaXNQcm9qZWN0aW9uRGlydHkgPSB0cnVlO1xuICAgIH1cbiAgICBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgIHRoaXMub3B0aW9ucyA9IHtcbiAgICAgICAgLi4udGhpcy5vcHRpb25zLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBjcm9zc2ZhZGU6IG9wdGlvbnMuY3Jvc3
10617NmYWRlICE9PSB2b2lkIDAgPyBvcHRpb25zLmNyb3NzZmFkZSA6IHRydWVcbiAgICAgIH07XG4gICAgfVxuICAgIGNsZWFyTWVhc3VyZW1lbnRzKCkge1xuICAgICAgdGhpcy5zY3JvbGwgPSB2b2lkIDA7XG4gICAgICB0aGlzLmxheW91dCA9IHZvaWQgMDtcbiAgICAgIHRoaXMuc25hcHNob3QgPSB2b2lkIDA7XG4gICAgICB0aGlzLnByZXZUcmFuc2Zvcm1UZW1wbGF0ZVZhbHVlID0gdm9pZCAwO1xuICAgICAgdGhpcy50YXJnZXREZWx0YSA9IHZvaWQgMDtcbiAgICAgIHRoaXMudGFyZ2V0ID0gdm9pZCAwO1xuICAgICAgdGhpcy5pc0xheW91dERpcnR5ID0gZmFsc2U7XG4gICAgfVxuICAgIGZvcmNlUmVsYXRpdmVQYXJlbnRUb1Jlc29sdmVUYXJnZXQoKSB7XG4gICAgICBpZiAoIXRoaXMucmVsYXRpdmVQYXJlbnQpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGlmICh0aGlzLnJlbGF0aXZlUGFyZW50LnJlc29sdmVkUmVsYXRpdmVUYXJnZXRBdCAhPT0gZnJhbWVEYXRhLnRpbWVzdGFtcCkge1xuICAgICAgICB0aGlzLnJlbGF0aXZlUGFyZW50LnJlc29sdmVUYXJnZXREZWx0YSh0cnVlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzb2x2ZVRhcmdldERlbHRhKGZvcmNlUmVjYWxjdWxhdGlvbiA9IGZhbHNlKSB7XG4gICAgICB2YXIgX2E7XG4gICAgICBjb25zdCBsZWFkID0gdGhpcy5nZXRMZWFkKCk7XG4gICAgICB0aGlzLmlzUHJvamVjdGlvbkRpcnR5IHx8ICh0aGlzLmlzUHJvamVjdGlvbkRpcnR5ID0gbGVhZC5pc1Byb2plY3Rpb25EaXJ0eSk7XG4gICAgICB0aGlzLmlzVHJhbnNmb3JtRGlydHkgfHwgKHRoaXMuaXNUcmFuc2Zvcm1EaXJ0eSA9IGxlYWQuaXNUcmFuc2Zvcm1EaXJ0eSk7XG4gICAgICB0aGlzLmlzU2hhcmVkUHJvamVjdGlvbkRpcnR5IHx8ICh0aGlzLmlzU2hhcmVkUHJvamVjdGlvbkRpcnR5ID0gbGVhZC5pc1NoYXJlZFByb2plY3Rpb25EaXJ0eSk7XG4gICAgICBjb25zdCBpc1NoYXJlZCA9IEJvb2xlYW4odGhpcy5yZXN1bWluZ0Zyb20pIHx8IHRoaXMgIT09IGxlYWQ7XG4gICAgICBjb25zdCBjYW5Ta2lwID0gIShmb3JjZVJlY2FsY3VsYXRpb24gfHwgaXNTaGFyZWQgJiYgdGhpcy5pc1NoYXJlZFByb2plY3Rpb25EaXJ0eSB8fCB0aGlzLmlzUHJvamVjdGlvbkRpcnR5IHx8ICgoX2EgPSB0aGlzLnBhcmVudCkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmlzUHJvamVjdGlvbkRpcnR5KSB8fCB0aGlzLmF0dGVtcHRUb1Jlc29sdmVSZWxhdGl2ZVRhcmdldCB8fCB0aGlzLnJvb3QudXBkYXRlQmxvY2tlZEJ5UmVzaXplKTtcbiAgICAgIGlmIChjYW5Ta2lwKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCB7IGxheW91dDogbGF5b3V0MiwgbGF5b3V0SWQgfSA9IHRoaXMub3B0aW9ucztcbiAgICAgIGlmICghdGhpcy5sYXlvdXQgfHwgIShsYXlvdXQyIHx8IGxheW91dElkKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdGhpcy5yZXNvbHZlZFJlbGF0aXZlVGFyZ2V0QXQgPSBmcmFtZURhdGEudGltZXN0YW1wO1xuICAgICAgaWYgKCF0aGlzLnRhcmdldERlbHRhICYmICF0aGlzLnJlbGF0aXZlVGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGFyZW50ID0gdGhpcy5nZXRDbG9zZXN0UHJvamVjdGluZ1BhcmVudCgpO1xuICAgICAgICBpZiAocmVsYXRpdmVQYXJlbnQgJiYgcmVsYXRpdmVQYXJlbnQubGF5b3V0ICYmIHRoaXMuYW5pbWF0aW9uUHJvZ3Jlc3MgIT09IDEpIHtcbiAgICAgICAgICB0aGlzLnJlbGF0aXZlUGFyZW50ID0gcmVsYXRpdmVQYXJlbnQ7XG4gICAgICAgICAgdGhpcy5mb3JjZVJlbGF0aXZlUGFyZW50VG9SZXNvbHZlVGFyZ2V0KCk7XG4gICAgICAgICAgdGhpcy5yZWxhdGl2ZVRhcmdldCA9IGNyZWF0ZUJveCgpO1xuICAgICAgICAgIHRoaXMucmVsYXRpdmVUYXJnZXRPcmlnaW4gPSBjcmVhdGVCb3goKTtcbiAgICAgICAgICBjYWxjUmVsYXRpdmVQb3NpdGlvbih0aGlzLnJlbGF0aXZlVGFyZ2V0T3JpZ2luLCB0aGlzLmxheW91dC5sYXlvdXRCb3gsIHJlbGF0aXZlUGFyZW50LmxheW91dC5sYXlvdXRCb3gpO1xuICAgICAgICAgIGNvcHlCb3hJbnRvKHRoaXMucmVsYXRpdmVUYXJnZXQsIHRoaXMucmVsYXRpdmVUYXJnZXRPcmlnaW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMucmVsYXRpdmVQYXJlbnQgPSB0aGlzLnJlbGF0aXZlVGFyZ2V0ID0gdm9pZCAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXRoaXMucmVsYXRpdmVUYXJnZXQgJiYgIXRoaXMudGFyZ2V0RGVsdGEpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGlmICghdGhpcy50YXJnZXQpIHtcbiAgICAgICAgdGhpcy50YXJnZXQgPSBjcmVhdGVCb3goKTtcbiAgICAgICAgdGhpcy50YXJnZXRXaXRoVHJhbnNmb3JtcyA9IGNyZWF0ZUJveCgpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucmVsYXRpdmVUYXJnZXQgJiYgdGhpcy5yZWxhdGl2ZVRhcmdldE9yaWdpbiAmJiB0aGlzLnJlbGF0aXZlUGFyZW50ICYmIHRoaXMucmVsYXRpdmVQYXJlbnQudGFyZ2V0KSB7XG4gICAgICAgIHRoaXMuZm9yY2VSZWxhdGl2ZVBhcmVudFRvUmVzb2x2ZVRhcmdldCgpO1xuICAgICAgICBjYWxjUmVsYXRpdmVCb3godGhpcy50YXJnZXQsIHRoaXMucmVsYXRpdmVUYXJnZXQsIHRoaXMucmVsYXRpdmVQYXJlbnQudGFyZ2V0KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy50YXJnZXREZWx0YSkge1xuICAgICAgICBpZiAoQm9vbGVhbih0aGlzLnJlc3VtaW5nRnJvbSkpIHtcbiAgICAgICAgICB0aGlzLnRhcmdldCA9IHRoaXMuYXBwbHlUcmFuc2Zvcm0odGhpcy5sYXlvdXQubGF5b3V0Qm94KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb3B5Qm94SW50byh0aGlzLnRhcmdldCwgdGhpcy5sYXlvdXQubGF5b3V0Qm94KTtcbiAgICAgICAgfVxuICAgICAgICBhcHBseUJveERlbHRhKHRoaXMudGFyZ2V0LCB0aGlzLnRhcmdldERlbHRhKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvcHlCb3hJbnRvKHRoaXMudGFyZ2V0LCB0aGlzLmxheW91dC5sYXlvdXRCb3gpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYXR0ZW1wdFRvUmVzb2x2ZVJlbGF0aXZlVGFyZ2V0KSB7XG4gICAgICAgI
10617HRoaXMuYXR0ZW1wdFRvUmVzb2x2ZVJlbGF0aXZlVGFyZ2V0ID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlUGFyZW50ID0gdGhpcy5nZXRDbG9zZXN0UHJvamVjdGluZ1BhcmVudCgpO1xuICAgICAgICBpZiAocmVsYXRpdmVQYXJlbnQgJiYgQm9vbGVhbihyZWxhdGl2ZVBhcmVudC5yZXN1bWluZ0Zyb20pID09PSBCb29sZWFuKHRoaXMucmVzdW1pbmdGcm9tKSAmJiAhcmVsYXRpdmVQYXJlbnQub3B0aW9ucy5sYXlvdXRTY3JvbGwgJiYgcmVsYXRpdmVQYXJlbnQudGFyZ2V0ICYmIHRoaXMuYW5pbWF0aW9uUHJvZ3Jlc3MgIT09IDEpIHtcbiAgICAgICAgICB0aGlzLnJlbGF0aXZlUGFyZW50ID0gcmVsYXRpdmVQYXJlbnQ7XG4gICAgICAgICAgdGhpcy5mb3JjZVJlbGF0aXZlUGFyZW50VG9SZXNvbHZlVGFyZ2V0KCk7XG4gICAgICAgICAgdGhpcy5yZWxhdGl2ZVRhcmdldCA9IGNyZWF0ZUJveCgpO1xuICAgICAgICAgIHRoaXMucmVsYXRpdmVUYXJnZXRPcmlnaW4gPSBjcmVhdGVCb3goKTtcbiAgICAgICAgICBjYWxjUmVsYXRpdmVQb3NpdGlvbih0aGlzLnJlbGF0aXZlVGFyZ2V0T3JpZ2luLCB0aGlzLnRhcmdldCwgcmVsYXRpdmVQYXJlbnQudGFyZ2V0KTtcbiAgICAgICAgICBjb3B5Qm94SW50byh0aGlzLnJlbGF0aXZlVGFyZ2V0LCB0aGlzLnJlbGF0aXZlVGFyZ2V0T3JpZ2luKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnJlbGF0aXZlUGFyZW50ID0gdGhpcy5yZWxhdGl2ZVRhcmdldCA9IHZvaWQgMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGlzRGVidWcpIHtcbiAgICAgICAgbWV0cmljcy5yZXNvbHZlZFRhcmdldERlbHRhcysrO1xuICAgICAgfVxuICAgIH1cbiAgICBnZXRDbG9zZXN0UHJvamVjdGluZ1BhcmVudCgpIHtcbiAgICAgIGlmICghdGhpcy5wYXJlbnQgfHwgaGFzU2NhbGUodGhpcy5wYXJlbnQubGF0ZXN0VmFsdWVzKSB8fCBoYXMyRFRyYW5zbGF0ZSh0aGlzLnBhcmVudC5sYXRlc3RWYWx1ZXMpKSB7XG4gICAgICAgIHJldHVybiB2b2lkIDA7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wYXJlbnQuaXNQcm9qZWN0aW5nKCkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmdldENsb3Nlc3RQcm9qZWN0aW5nUGFyZW50KCk7XG4gICAgICB9XG4gICAgfVxuICAgIGlzUHJvamVjdGluZygpIHtcbiAgICAgIHJldHVybiBCb29sZWFuKCh0aGlzLnJlbGF0aXZlVGFyZ2V0IHx8IHRoaXMudGFyZ2V0RGVsdGEgfHwgdGhpcy5vcHRpb25zLmxheW91dFJvb3QpICYmIHRoaXMubGF5b3V0KTtcbiAgICB9XG4gICAgY2FsY1Byb2plY3Rpb24oKSB7XG4gICAgICB2Y
10617XIgX2E7XG4gICAgICBjb25zdCBsZWFkID0gdGhpcy5nZXRMZWFkKCk7XG4gICAgICBjb25zdCBpc1NoYXJlZCA9IEJvb2xlYW4odGhpcy5yZXN1bWluZ0Zyb20pIHx8IHRoaXMgIT09IGxlYWQ7XG4gICAgICBsZXQgY2FuU2tpcCA9IHRydWU7XG4gICAgICBpZiAodGhpcy5pc1Byb2plY3Rpb25EaXJ0eSB8fCAoKF9hID0gdGhpcy5wYXJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5pc1Byb2plY3Rpb25EaXJ0eSkpIHtcbiAgICAgICAgY2FuU2tpcCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKGlzU2hhcmVkICYmICh0aGlzLmlzU2hhcmVkUHJvamVjdGlvbkRpcnR5IHx8IHRoaXMuaXNUcmFuc2Zvcm1EaXJ0eSkpIHtcbiAgICAgICAgY2FuU2tpcCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMucmVzb2x2ZWRSZWxhdGl2ZVRhcmdldEF0ID09PSBmcmFtZURhdGEudGltZXN0YW1wKSB7XG4gICAgICAgIGNhblNraXAgPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChjYW5Ta2lwKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCB7IGxheW91dDogbGF5b3V0MiwgbGF5b3V0SWQgfSA9IHRoaXMub3B0aW9ucztcbiAgICAgIHRoaXMuaXNUcmVlQW5pbWF0aW5nID0gQm9vbGVhbih0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC5pc1RyZWVBbmltYXRpbmcgfHwgdGhpcy5jdXJyZW50QW5pbWF0aW9uIHx8IHRoaXMucGVuZGluZ0FuaW1hdGlvbik7XG4gICAgICBpZiAoIXRoaXMuaXNUcmVlQW5pbWF0aW5nKSB7XG4gICAgICAgIHRoaXMudGFyZ2V0RGVsdGEgPSB0aGlzLnJlbGF0aXZlVGFyZ2V0ID0gdm9pZCAwO1xuICAgICAgfVxuICAgICAgaWYgKCF0aGlzLmxheW91dCB8fCAhKGxheW91dDIgfHwgbGF5b3V0SWQpKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb3B5Qm94SW50byh0aGlzLmxheW91dENvcnJlY3RlZCwgdGhpcy5sYXlvdXQubGF5b3V0Qm94KTtcbiAgICAgIGNvbnN0IHByZXZUcmVlU2NhbGVYID0gdGhpcy50cmVlU2NhbGUueDtcbiAgICAgIGNvbnN0IHByZXZUcmVlU2NhbGVZID0gdGhpcy50cmVlU2NhbGUueTtcbiAgICAgIGFwcGx5VHJlZURlbHRhcyh0aGlzLmxheW91dENvcnJlY3RlZCwgdGhpcy50cmVlU2NhbGUsIHRoaXMucGF0aCwgaXNTaGFyZWQpO1xuICAgICAgaWYgKGxlYWQubGF5b3V0ICYmICFsZWFkLnRhcmdldCAmJiAodGhpcy50cmVlU2NhbGUueCAhPT0gMSB8fCB0aGlzLnRyZWVTY2FsZS55ICE9PSAxKSkge1xuICAgICAgICBsZWFkLnRhcmdldCA9IGxlYWQubGF5b3V0LmxheW91dEJveDtcbiAgICAgICAgbGVhZC50YXJnZXRXaXRoVHJhbnNmb3JtcyA9IGNyZWF0ZUJveCgpO1xuICAgICAgfVxuICAgICAgY29uc3QgeyB0YXJnZXQgfSA9IGxlYWQ7XG4gICAgICBpZiAoIXRhcmdldCkge1xuICAgICAgICBpZiAodGhpcy5wcmV2UHJvamVjdGlvbkRlbHRhKSB7XG4gICAgICAgICAgdGhpcy5jcmVhdGVQcm9qZWN0aW9uRGVsdGFzKCk7XG4gICAgICAgICAgdGhpcy5zY2hlZHVsZVJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5wcm9qZWN0aW9uRGVsdGEgfHwgIXRoaXMucHJldlByb2plY3Rpb25EZWx0YSkge1xuICAgICAgICB0aGlzLmNyZWF0ZVByb2plY3Rpb25EZWx0YXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvcHlBeGlzRGVsdGFJbnRvKHRoaXMucHJldlByb2plY3Rpb25EZWx0YS54LCB0aGlzLnByb2plY3Rpb25EZWx0YS54KTtcbiAgICAgICAgY29weUF4aXNEZWx0YUludG8odGhpcy5wcmV2UHJvamVjdGlvbkRlbHRhLnksIHRoaXMucHJvamVjdGlvbkRlbHRhLnkpO1xuICAgICAgfVxuICAgICAgY2FsY0JveERlbHRhKHRoaXMucHJvamVjdGlvbkRlbHRhLCB0aGlzLmxheW91dENvcnJlY3RlZCwgdGFyZ2V0LCB0aGlzLmxhdGVzdFZhbHVlcyk7XG4gICAgICBpZiAodGhpcy50cmVlU2NhbGUueCAhPT0gcHJldlRyZWVTY2FsZVggfHwgdGhpcy50cmVlU2NhbGUueSAhPT0gcHJldlRyZWVTY2FsZVkgfHwgIWF4aXNEZWx0YUVxdWFscyh0aGlzLnByb2plY3Rpb25EZWx0YS54LCB0aGlzLnByZXZQcm9qZWN0aW9uRGVsdGEueCkgfHwgIWF4aXNEZWx0YUVxdWFscyh0aGlzLnByb2plY3Rpb25EZWx0YS55LCB0aGlzLnByZXZQcm9qZWN0aW9uRGVsdGEueSkpIHtcbiAgICAgICAgdGhpcy5oYXNQcm9qZWN0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNjaGVkdWxlUmVuZGVyKCk7XG4gICAgICAgIHRoaXMubm90aWZ5TGlzdGVuZXJzKFwicHJvamVjdGlvblVwZGF0ZVwiLCB0YXJnZXQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzRGVidWcpIHtcbiAgICAgICAgbWV0cmljcy5yZWNhbGN1bGF0ZWRQcm9qZWN0aW9uKys7XG4gICAgICB9XG4gICAgfVxuICAgIGhpZGUoKSB7XG4gICAgICB0aGlzLmlzVmlzaWJsZSA9IGZhbHNlO1xuICAgIH1cbiAgICBzaG93KCkge1xuICAgICAgdGhpcy5pc1Zpc2libGUgPSB0cnVlO1xuICAgIH1cbiAgICBzY2hlZHVsZVJlbmRlcihub3RpZnlBbGwyID0gdHJ1ZSkge1xuICAgICAgdmFyIF9hO1xuICAgICAgKF9hID0gdGhpcy5vcHRpb25zLnZpc3VhbEVsZW1lbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5zY2hlZHVsZVJlbmRlcigpO1xuICAgICAgaWYgKG5vdGlmeUFsbDIpIHtcbiAgICAgICAgY29uc3Qgc3RhY2sgPSB0aGlzLmdldFN0YWNrKCk7XG4gICAgICAgIHN0YWNrICYmIHN0YWNrLnNjaGVkdWxlUmVuZGVyKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yZXN1bWluZ0Zyb20gJiYgIXRoaXMucmVzdW1pbmdGcm9tLmluc3RhbmNlKSB7XG4gICAgICAgIHRoaXMucmVzdW1pbmdGcm9tID0gdm9pZCAwO1xuICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVQcm9qZWN0aW9uRGVsdGFzKCkge1xuICAgICAgdGhpcy5wcmV2UHJvamVjdGlvbkRlbHRhID0gY3JlYXRlRGVsdGEoKTtcbiAgICAgIHRoaXMucHJvamVjdGlvbkRlbHRhID0gY3JlYXRlRGVsdGEoKTtcbiAgICAgIHRoaXMucHJvamVjdGlvbkRlbHRhV2l0aFRyYW5zZm9ybSA9IGNyZWF0ZURlbHRhKCk7XG4gICAgfVxuICAgIHNldEFuaW1hdGlvbk9yaWdpbihkZWx0YSwgaGFzT25seVJlbGF0aXZlVGFyZ2V0Q2hhbmdlZCA9IGZhbHNlKSB7XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMuc25hcHNob3Q7XG4gICAgICBjb25zdCBzbmFwc2hvdExhdGVzdFZhbHVlcyA9IHNuYXBzaG90ID8gc25hcHNob3QubGF0ZXN0VmFsdWVzIDoge307XG4gICAgICBjb25zdCBtaXhlZFZhbHVlcyA9IHsgLi4udGhpcy5sYXRlc3RWYWx1ZXMgfTtcbiAgICAgIGNvbnN0IHRhcmdldERlbHRhID0gY3JlYXRlRGVsdGEoKTtcbiAgICAgIGlmICghdGhpcy5yZWxhdGl2ZVBhcmVudCB8fCAhdGhpcy5yZWxhdGl2ZVBhcmVudC5vcHRpb25zLmxheW91dFJvb3QpIHtcbiAgICAgICAgdGhpcy5yZWxhdGl2ZVRhcmdldCA9IHRoaXMucmVsYXRpdmVUYXJnZXRPcmlnaW4gPSB2b2lkIDA7XG4gICAgICB9XG4gICAgICB0aGlzLmF0dGVtcHRUb1Jlc29sdmVSZWxhdGl2ZVRhcmdldCA9ICFoYXNPbmx5UmVsYXRpdmVUYXJnZXRDaGFuZ2VkO1xuICAgICAgY29uc3QgcmVsYXRpdmVMYXlvdXQgPSBjcmVhdGVCb3goKTtcbiAgICAgIGNvbnN0IHNuYXBzaG90U291cmNlID0gc25
10617hcHNob3QgPyBzbmFwc2hvdC5zb3VyY2UgOiB2b2lkIDA7XG4gICAgICBjb25zdCBsYXlvdXRTb3VyY2UgPSB0aGlzLmxheW91dCA/IHRoaXMubGF5b3V0LnNvdXJjZSA6IHZvaWQgMDtcbiAgICAgIGNvbnN0IGlzU2hhcmVkTGF5b3V0QW5pbWF0aW9uID0gc25hcHNob3RTb3VyY2UgIT09IGxheW91dFNvdXJjZTtcbiAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5nZXRTdGFjaygpO1xuICAgICAgY29uc3QgaXNPbmx5TWVtYmVyID0gIXN0YWNrIHx8IHN0YWNrLm1lbWJlcnMubGVuZ3RoIDw9IDE7XG4gICAgICBjb25zdCBzaG91bGRDcm9zc2ZhZGVPcGFjaXR5ID0gQm9vbGVhbihpc1NoYXJlZExheW91dEFuaW1hdGlvbiAmJiAhaXNPbmx5TWVtYmVyICYmIHRoaXMub3B0aW9ucy5jcm9zc2ZhZGUgPT09IHRydWUgJiYgIXRoaXMucGF0aC5zb21lKGhhc09wYWNpdHlDcm9zc2ZhZGUpKTtcbiAgICAgIHRoaXMuYW5pbWF0aW9uUHJvZ3Jlc3MgPSAwO1xuICAgICAgbGV0IHByZXZSZWxhdGl2ZVRhcmdldDtcbiAgICAgIHRoaXMubWl4VGFyZ2V0RGVsdGEgPSAobGF0ZXN0KSA9PiB7XG4gICAgICAgIGNvbnN0IHByb2dyZXNzMiA9IGxhdGVzdCAvIDFlMztcbiAgICAgICAgbWl4QXhpc0RlbHRhKHRhcmdldERlbHRhLngsIGRlbHRhLngsIHByb2dyZXNzMik7XG4gICAgICAgIG1peEF4aXNEZWx0YSh0YXJnZXREZWx0YS55LCBkZWx0YS55LCBwcm9ncmVzczIpO1xuICAgICAgICB0aGlzLnNldFRhcmdldERlbHRhKHRhcmdldERlbHRhKTtcbiAgICAgICAgaWYgKHRoaXMucmVsYXRpdmVUYXJnZXQgJiYgdGhpcy5yZWxhdGl2ZVRhcmdldE9yaWdpbiAmJiB0aGlzLmxheW91dCAmJiB0aGlzLnJlbGF0aXZlUGFyZW50ICYmIHRoaXMucmVsYXRpdmVQYXJlbnQubGF5b3V0KSB7XG4gICAgICAgICAgY2FsY1JlbGF0aXZlUG9zaXRpb24ocmVsYXRpdmVMYXlvdXQsIHRoaXMubGF5b3V0LmxheW91dEJveCwgdGhpcy5yZWxhdGl2ZVBhcmVudC5sYXlvdXQubGF5b3V0Qm94KTtcbiAgICAgICAgICBtaXhCb3godGhpcy5yZWxhdGl2ZVRhcmdldCwgdGhpcy5yZWxhdGl2ZVRhcmdldE9yaWdpbiwgcmVsYXRpdmVMYXlvdXQsIHByb2dyZXNzMik7XG4gICAgICAgICAgaWYgKHByZXZSZWxhdGl2ZVRhcmdldCAmJiBib3hFcXVhbHModGhpcy5yZWxhdGl2ZVRhcmdldCwgcHJldlJlbGF0aXZlVGFyZ2V0KSkge1xuICAgICAgICAgICAgdGhpcy5pc1Byb2plY3Rpb25EaXJ0eSA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXByZXZSZWxhdGl2ZVRhcmdldClcbiAgICAgICAgICAgIHByZXZSZWxhdGl2ZVRhcmdldCA9IGNyZWF0ZUJveCgpO1xuICAgICAgICAgIGNvcHlCb3hJbnRvKHByZXZSZWxhdGl2ZVRhcmdldCwgdGhpcy5yZWxhdGl2ZVRhcmdldCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzU2hhcmVkTGF5b3V0QW5pbWF0aW9uKSB7XG4gICAgICAgICAgdGhpcy5hbmltYXRpb25WYWx1ZXMgPSBtaXhlZFZhbHVlcztcbiAgICAgICAgICBtaXhWYWx1ZXMobWl4ZWRWYWx1ZXMsIHNuYXBzaG90TGF0ZXN0VmFsdWVzLCB0aGlzLmxhdGVzdFZhbHVlcywgcHJvZ3Jlc3MyLCBzaG91bGRDcm9zc2ZhZGVPcGFjaXR5LCBpc09ubHlNZW1iZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucm9vdC5zY2hlZHVsZVVwZGF0ZVByb2plY3Rpb24oKTtcbiAgICAgICAgdGhpcy5zY2hlZHVsZVJlbmRlcigpO1xuICAgICAgICB0aGlzLmFuaW1hdGlvblByb2dyZXNzID0gcHJvZ3Jlc3MyO1xuICAgICAgfTtcbiAgICAgIHRoaXMubWl4VGFyZ2V0RGVsdGEodGhpcy5vcHRpb25zLmxheW91dFJvb3QgPyAxZTMgOiAwKTtcbiAgICB9XG4gICAgc3RhcnRBbmltYXRpb24ob3B0aW9ucykge1xuICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnMoXCJhbmltYXRpb25TdGFydFwiKTtcbiAgICAgIHRoaXMuY3VycmVudEFuaW1hdGlvbiAmJiB0aGlzLmN1cnJlbnRBbmltYXRpb24uc3RvcCgpO1xuICAgICAgaWYgKHRoaXMucmVzdW1pbmdGcm9tICYmIHRoaXMucmVzdW1pbmdGcm9tLmN1cnJlbnRBbmltYXRpb24pIHtcbiAgICAgICAgdGhpcy5yZXN1bWluZ0Zyb20uY3VycmVudEFuaW1hdGlvbi5zdG9wKCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5wZW5kaW5nQW5pbWF0aW9uKSB7XG4gICAgICAgIGNhbmNlbEZyYW1lKHRoaXMucGVuZGluZ0FuaW1hdGlvbik7XG4gICAgICAgIHRoaXMucGVuZGluZ0FuaW1hdGlvbiA9IHZvaWQgMDtcbiAgICAgIH1cbiAgICAgIHRoaXMucGVuZGluZ0FuaW1hdGlvbiA9IGZyYW1lLnVwZGF0ZSgoKSA9PiB7XG4gICAgICAgIGdsb2JhbFByb2plY3Rpb25TdGF0ZS5oYXNBbmltYXRlZFNpbmNlUmVzaXplID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jdXJyZW50QW5pbWF0aW9uID0gYW5pbWF0ZVNpbmdsZVZhbHVlKDAsIGFuaW1hdGlvblRhcmdldCwge1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgb25VcGRhdGU6IChsYXRlc3QpID0+IHtcbiAgICAgICAgICAgIHRoaXMubWl4VGFyZ2V0RGVsdGEobGF0ZXN0KTtcbiAgICAgICAgICAgIG9wdGlvbnMub25VcGRhdGUgJiYgb3B0aW9ucy5vblVwZGF0ZShsYXRlc3QpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25Db21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgICAgb3B0aW9ucy5vbkNvbXBsZXRlICYmIG9wdGlvbnMub25Db21wbGV0ZSgpO1xuICAgICAgICAgICAgdGhpcy5jb21wbGV0ZUFuaW1hdGlvbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0aGlzLnJlc3VtaW5nRnJvbSkge1xuICAgICAgICAgIHRoaXMucmVzdW1pbmdGcm9tLmN1cnJlbnRBbmltYXRpb24gPSB0aGlzLmN1cnJlbnRBbmltYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wZW5kaW5nQW5pbWF0aW9uID0gdm9pZCAwO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbXBsZXRlQW5pbWF0aW9uKCkge1xuICAgICAgaWYgKHRoaXMucmVzdW1pbmdGcm9tKSB7XG4gICAgICAgIHRoaXMucmVzdW1pbmdGcm9tLmN1cnJlbnRBbmltYXRpb24gPSB2b2lkIDA7XG4gICAgICAgIHRoaXMucmVzdW1pbmdGcm9tLnByZXNlcnZlT3BhY2l0eSA9IHZvaWQgMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5nZXRTdGFjaygpO1xuICAgICAgc3RhY2sgJiYgc3RhY2suZXhpdEFuaW1hdGlvbkNvbXBsZXRlKCk7XG4gICAgICB0aGlzLnJlc3VtaW5nRnJvbSA9IHRoaXMuY3VycmVudEFuaW1hdGlvbiA9IHRoaXMuYW5pbWF0aW9uVmFsdWVzID0gdm9pZCAwO1xuICAgICAgdGhpcy5ub3RpZnlMaXN0ZW5lcnMoXCJhbmltYXRpb25Db21wbGV0ZVwiKTtcbiAgICB9XG4gICAgZmluaXNoQW5pbWF0aW9uKCkge1xuICAgICAgaWYgKHRoaXMuY3VycmVudEFuaW1hdGlvbikge1xuICAgICAgICB0aGlzLm1peFRhcmdldERlbHRhICYmIHRoaXMubWl4VGFyZ2V0RGVsdGEoYW5pbWF0aW9uVGFyZ2V0KTtcbiAgICAgICAgdGhpcy5jdXJyZW50QW5pbWF0aW9uLnN0b3AoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY29tcGxldGVBbmltYXRpb24oKTtcbiAgICB9XG4gICAgYXBwbHlUcmFuc2Zvcm1zVG9UYXJnZXQoKSB7XG4gICAgICBjb25zdCBsZWFkID0gdGhpcy5nZXRMZWFkKCk7XG4gICAgICBsZXQgeyB0YXJnZXRXaXRoVHJhbnNmb3JtcywgdGFyZ2V0LCBsYXlvdXQ6IGxheW91dDIsIGxhdGVzdFZhbHVlcyB9ID0gbGVhZDtcbiAgICAgIGlmICghdGFyZ2V0V2l0aFRyYW5zZm9ybXMgfHwgIXRhcmdldCB8fCAhbGF5b3V0MilcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKHRoaXMgIT09IGxlYWQgJiYgdGhpcy5sYXlvdXQgJiYgbGF5b3V0MiAmJiBzaG91bGRBbmltYXRlUG9zaXRpb25Pbmx5KHRoaXMub3B0aW9ucy5hbmltYXRpb25UeXBlLCB0aGlzLmxheW91dC5sYXlvdXRCb3gsIGxheW91dDIubGF5b3V0Qm94KSkge1xuICAgICAgICB0YXJnZXQgPSB0aGlzLnRhcmdldCB8fCBjcmVhdGVCb3goKTtcbiAgICAgICAgY29uc3QgeExlbmd0aCA9IGNhbGNMZW5ndGgodGhpcy5sYXlvdXQubGF5b3V0Qm94LngpO1xuICAgICAgICB0YXJnZXQueC5taW4gPSBsZWFkLnRhcmdldC54Lm1pbjtcbiAgICAgICAgdGFyZ2V0LngubWF4ID0gdGFyZ2V0LngubWluICsgeExlbmd0aDtcbiAgICAgICAgY29uc3QgeUxlbmd0aCA9IGNhbGNMZW5ndGgodGhpcy5sYXlvdXQubGF5b3V0Qm94LnkpO1xuICAgICAgICB0YXJnZXQueS5taW4gPSBsZWFkLnRhcmdldC55Lm1pbjtcbiAgICAgICAgdGFyZ2V0LnkubWF4ID0gdGFyZ2V0LnkubWluICsgeUxlbmd0aDtcbiAgICAgIH1cbiAgICAgIGNvcHlCb3hJbnRvKHRhcmdldFdpdGhUcmFuc2Zvcm1zLCB0YXJnZXQpO1xuICAgICAgdHJhbnNmb3JtQm94KHRhcmdldFdpdGhUcmFuc2Zvcm1zLCBsYXRlc3RWYWx1ZXMpO1xuICAgICAgY2FsY0JveERlbHRhKHRoaXMucHJvamVjdGlvbkRlbHRhV2l0aFRyYW5zZm9ybSwgdGhpcy5sYXlvdXRDb3JyZWN0ZWQsIHRhcmdldFdpdGhUcmFuc2Zvcm1zLCBsYXRlc3RWYWx1ZXMpO1xuICAgIH1cbiAgICByZWdpc3RlclNoYXJlZE5vZGUobGF5b3V0SWQsIG5vZGUpIHtcbiAgICAgIGlmICghdGhpcy5zaGFyZWROb2Rlcy5oYXMobGF5b3V0SWQpKSB7XG4gICAgICAgI
10617HRoaXMuc2hhcmVkTm9kZXMuc2V0KGxheW91dElkLCBuZXcgTm9kZVN0YWNrKCkpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhY2sgPSB0aGlzLnNoYXJlZE5vZGVzLmdldChsYXlvdXRJZCk7XG4gICAgICBzdGFjay5hZGQobm9kZSk7XG4gICAgICBjb25zdCBjb25maWcgPSBub2RlLm9wdGlvbnMuaW5pdGlhbFByb21vdGlvbkNvbmZpZztcbiAgICAgIG5vZGUucHJvbW90ZSh7XG4gICAgICAgIHRyYW5zaXRpb246IGNvbmZpZyA/IGNvbmZpZy50cmFuc2l0aW9uIDogdm9pZCAwLFxuICAgICAgICBwcmVzZXJ2ZUZvbGxvd09wYWNpdHk6IGNvbmZpZyAmJiBjb25maWcuc2hvdWxkUHJlc2VydmVGb2xsb3dPcGFjaXR5ID8gY29uZmlnLnNob3VsZFByZXNlcnZlRm9sbG93T3BhY2l0eShub2RlKSA6IHZvaWQgMFxuICAgICAgfSk7XG4gICAgfVxuICAgIGlzTGVhZCgpIHtcbiAgICAgIGNvbnN0IHN0YWNrID0gdGhpcy5nZXRTdGFjaygpO1xuICAgICAgcmV0dXJuIHN0YWNrID8gc3RhY2subGVhZCA9PT0gdGhpcyA6IHRydWU7XG4gICAgfVxuICAgIGdldExlYWQoKSB7XG4gICAgICB2YXIgX2E7XG4gICAgICBjb25zdCB7IGxheW91dElkIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICByZXR1cm4gbGF5b3V0SWQgPyAoKF9hID0gdGhpcy5nZXRTdGFjaygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EubGVhZCkgfHwgdGhpcyA6IHRoaXM7XG4gICAgfVxuICAgIGdldFByZXZMZWFkKCkge1xuICAgICAgdmFyIF9hO1xuICAgICAgY29uc3QgeyBsYXlvdXRJZCB9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgcmV0dXJuIGxheW91dElkID8gKF9hID0gdGhpcy5nZXRTdGFjaygpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EucHJldkxlYWQgOiB2b2lkIDA7XG4gICAgfVxuICAgIGdldFN0YWNrKCkge1xuICAgICAgY29uc3QgeyBsYXlvdXRJZCB9ID0gdGhpcy5vcHRpb25zO1xuICAgICAgaWYgKGxheW91dElkKVxuICAgICAgICByZXR1cm4gdGhpcy5yb290LnNoYXJlZE5vZGVzLmdldChsYXlvdXRJZCk7XG4gICAgfVxuICAgIHByb21vdGUoeyBuZWVkc1Jlc2V0LCB0cmFuc2l0aW9uLCBwcmVzZXJ2ZUZvbGxvd09wYWNpdHkgfSA9IHt9KSB7XG4gICAgICBjb25zdCBzdGFjayA9IHRoaXMuZ2V0U3RhY2soKTtcbiAgICAgIGlmIChzdGFjaylcbiAgICAgICAgc3RhY2sucHJvbW90ZSh0aGlzLCBwcmVzZXJ2ZUZvbGxvd09wYWNpdHkpO1xuICAgICAgaWYgKG5lZWRzUmVzZXQpIHtcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uRGVsdGEgPSB2b2lkIDA7XG4gICAgICAgIHRoaXMubmVlZHNSZXNldCA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAodHJhbnNpdGlvbilcbiAgICAgICAgdGhpcy5zZXRPcHRpb25zKHsgdHJhbnNpdGlvbiB9KTtcbiAgICB9XG4gICAgcmVsZWdhdGUoKSB7XG4gICAgICBjb25zdCBzdGFjayA9IHRoaXMuZ2V0U3RhY2soKTtcbiAgICAgIGlmIChzdGFjaykge1xuICAgICAgICByZXR1cm4gc3RhY2sucmVsZWdhdGUodGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc2V0U2tld0FuZFJvdGF0aW9uKCkge1xuICAgICAgY29uc3QgeyB2aXN1YWxFbGVtZW50IH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICBpZiAoIXZpc3VhbEVsZW1lbnQpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGxldCBoYXNEaXN0b3J0aW5nVHJhbnNmb3JtID0gZmFsc2U7XG4gICAgICBjb25zdCB7IGxhdGVzdFZhbHVlcyB9ID0gdmlzdWFsRWxlbWVudDtcbiAgICAgIGlmIChsYXRlc3RWYWx1ZXMueiB8fCBsYXRlc3RWYWx1ZXMucm90YXRlIHx8IGxhdGVzdFZhbHVlcy5yb3RhdGVYIHx8IGxhdGVzdFZhbHVlcy5yb3RhdGVZIHx8IGxhdGVzdFZhbHVlcy5yb3RhdGVaIHx8IGxhdGVzdFZhbHVlcy5za2V3WCB8fCBsYXRlc3RWYWx1ZXMuc2tld1kpIHtcbiAgICAgICAgaGFzRGlzdG9ydGluZ1RyYW5zZm9ybSA9IHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoIWhhc0Rpc3RvcnRpbmdUcmFuc2Zvcm0pXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IHJlc2V0VmFsdWVzID0ge307XG4gICAgICBpZiAobGF0ZXN0VmFsdWVzLnopIHtcbiAgICAgICAgcmVzZXREaXN0b3J0aW5nVHJhbnNmb3JtKFwielwiLCB2aXN1YWxFbGVtZW50LCByZXNldFZhbHVlcywgdGhpcy5hbmltYXRpb25WYWx1ZXMpO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFuc2Zvcm1BeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc2V0RGlzdG9ydGluZ1RyYW5zZm9ybShgcm90YXRlJHt0cmFuc2Zvcm1BeGVzW2ldfWAsIHZpc3VhbEVsZW1lbnQsIHJlc2V0VmFsdWVzLCB0aGlzLmFuaW1hdGlvblZhbHVlcyk7XG4gICAgICAgIHJlc2V0RGlzdG9ydGluZ1RyYW5zZm9ybShgc2tldyR7dHJhbnNmb3JtQXhlc1tpXX1gLCB2aXN1YWxFbGVtZW50LCByZXNldFZhbHVlcywgdGhpcy5hbmltYXRpb25WYWx1ZXMpO1xuICAgICAgfVxuICAgICAgdmlzdWFsRWxlbWVudC5yZW5kZXIoKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHJlc2V0VmFsdWVzKSB7XG4gICAgICAgIHZpc3VhbEVsZW1lbnQuc2V0U3RhdGljVmFsdWUoa2V5LCByZXNldFZhbHVlc1trZXldKTtcbiAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uVmFsdWVzKSB7XG4gICAgICAgICAgdGhpcy5hbmltYXRpb25WYWx1ZXNba2V5XSA9IHJlc2V0VmFsdWVzW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZpc3VhbEVsZW1lbnQuc2NoZWR1bGVSZW5kZXIoKTtcbiAgICB9XG4gICAgZ2V0UHJvamVjdGlvblN0eWxlcyhzdHlsZVByb3ApIHtcbiAgICAgIHZhciBfYSwgX2I7XG4gICAgICBpZiAoIXRoaXMuaW5zdGFuY2UgfHwgdGhpcy5pc1NWRylcbiAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICAgIGlmICghdGhpcy5pc1Zpc2libGUpIHtcbiAgICAgICAgcmV0dXJuIGhpZGRlblZpc2liaWxpdHk7XG4gICAgICB9XG4gICAgICBjb25zdCBzdHlsZXMgPSB7XG4gICAgICAgIHZpc2liaWxpdHk6IFwiXCJcbiAgICAgIH07XG4gICAgICBjb25zdCB0cmFuc2Zvcm1UZW1wbGF0ZSA9IHRoaXMuZ2V0VHJhbnNmb3JtVGVtcGxhdGUoKTtcbiAgICAgIGlmICh0aGlzLm5lZWRzUmVzZXQpIHtcbiAgICAgICAgdGhpcy5uZWVkc1Jlc2V0ID0gZmFsc2U7XG4gICAgICAgI
10617HN0eWxlcy5vcGFjaXR5ID0gXCJcIjtcbiAgICAgICAgc3R5bGVzLnBvaW50ZXJFdmVudHMgPSByZXNvbHZlTW90aW9uVmFsdWUoc3R5bGVQcm9wID09PSBudWxsIHx8IHN0eWxlUHJvcCA9PT0gdm9pZCAwID8gdm9pZCAwIDogc3R5bGVQcm9wLnBvaW50ZXJFdmVudHMpIHx8IFwiXCI7XG4gICAgICAgIHN0eWxlcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1UZW1wbGF0ZSA/IHRyYW5zZm9ybVRlbXBsYXRlKHRoaXMubGF0ZXN0VmFsdWVzLCBcIlwiKSA6IFwibm9uZVwiO1xuICAgICAgICByZXR1cm4gc3R5bGVzO1xuICAgICAgfVxuICAgICAgY29uc3QgbGVhZCA9IHRoaXMuZ2V0TGVhZCgpO1xuICAgICAgaWYgKCF0aGlzLnByb2plY3Rpb25EZWx0YSB8fCAhdGhpcy5sYXlvdXQgfHwgIWxlYWQudGFyZ2V0KSB7XG4gICAgICAgIGNvbnN0IGVtcHR5U3R5bGVzID0ge307XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubGF5b3V0SWQpIHtcbiAgICAgICAgICBlbXB0eVN0eWxlcy5vcGFjaXR5ID0gdGhpcy5sYXRlc3RWYWx1ZXMub3BhY2l0eSAhPT0gdm9pZCAwID8gdGhpcy5sYXRlc3RWYWx1ZXMub3BhY2l0eSA6IDE7XG4gICAgICAgICAgZW1wdHlTdHlsZXMucG9pbnRlckV2ZW50cyA9IHJlc29sdmVNb3Rpb25WYWx1ZShzdHlsZVByb3AgPT09IG51bGwgfHwgc3R5bGVQcm9wID09PSB2b2lkIDAgPyB2b2lkIDAgOiBzdHlsZVByb3AucG9pbnRlckV2ZW50cykgfHwgXCJcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oYXNQcm9qZWN0ZWQgJiYgIWhhc1RyYW5zZm9ybSh0aGlzLmxhdGVzdFZhbHVlcykpIHtcbiAgICAgICAgICBlbXB0eVN0eWxlcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1UZW1wbGF0ZSA/IHRyYW5zZm9ybVRlbXBsYXRlKHt9LCBcIlwiKSA6IFwibm9uZVwiO1xuICAgICAgICAgIHRoaXMuaGFzUHJvamVjdGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVtcHR5U3R5bGVzO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsdWVzVG9SZW5kZXIgPSBsZWFkLmFuaW1hdGlvblZhbHVlcyB8fCBsZWFkLmxhdGVzdFZhbHVlcztcbiAgICAgIHRoaXMuYXBwbHlUcmFuc2Zvcm1zVG9UYXJnZXQoKTtcbiAgICAgIHN0eWxlcy50cmFuc2Zvcm0gPSBidWlsZFByb2plY3Rpb25UcmFuc2Zvcm0odGhpcy5wcm9qZWN0aW9uRGVsdGFXaXRoVHJhbnNmb3JtLCB0aGlzLnRyZWVTY2FsZSwgdmFsdWVzVG9SZW5kZXIpO1xuICAgICAgaWYgKHRyYW5zZm9ybVRlbXBsYXRlKSB7XG4gICAgICAgIHN0eWxlcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1UZW1wbGF0ZSh2YWx1ZXNUb1JlbmRlciwgc3R5bGVzLnRyYW5zZm9ybSk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMucHJvamVjdGlvbkRlbHRhO1xuICAgICAgc3R5bGVzLnRyYW5zZm9ybU9yaWdpbiA9IGAke3gub3JpZ2luICogMTAwfSUgJHt5Lm9yaWdpbiAqIDEwMH0lIDBgO1xuICAgICAgaWYgKGxlYWQuYW5pbWF0aW9uVmFsdWVzKSB7XG4gICAgICAgIHN0eWxlcy5vcGFjaXR5ID0gbGVhZCA9PT0gdGhpcyA/IChfYiA9IChfYSA9IHZhbHVlc1RvUmVuZGVyLm9wYWNpdHkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IHRoaXMubGF0ZXN0VmFsdWVzLm9wYWNpdHkpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IDEgOiB0aGlzLnByZXNlcnZlT3BhY2l0eSA/IHRoaXMubGF0ZXN0VmFsdWVzLm9wYWNpdHkgOiB2YWx1ZXNUb1JlbmRlci5vcGFjaXR5RXhpdDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0eWxlcy5vcGFjaXR5ID0gbGVhZCA9PT0gdGhpcyA/IHZhbHVlc1RvUmVuZGVyLm9wYWNpdHkgIT09I
10617HZvaWQgMCA/IHZhbHVlc1RvUmVuZGVyLm9wYWNpdHkgOiBcIlwiIDogdmFsdWVzVG9SZW5kZXIub3BhY2l0eUV4aXQgIT09IHZvaWQgMCA/IHZhbHVlc1RvUmVuZGVyLm9wYWNpdHlFeGl0IDogMDtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHNjYWxlQ29ycmVjdG9ycykge1xuICAgICAgICBpZiAodmFsdWVzVG9SZW5kZXJba2V5XSA9PT0gdm9pZCAwKVxuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB7IGNvcnJlY3QsIGFwcGx5VG8gfSA9IHNjYWxlQ29ycmVjdG9yc1trZXldO1xuICAgICAgICBjb25zdCBjb3JyZWN0ZWQgPSBzdHlsZXMudHJhbnNmb3JtID09PSBcIm5vbmVcIiA/IHZhbHVlc1RvUmVuZGVyW2tleV0gOiBjb3JyZWN0KHZhbHVlc1RvUmVuZGVyW2tleV0sIGxlYWQpO1xuICAgICAgICBpZiAoYXBwbHlUbykge1xuICAgICAgICAgIGNvbnN0IG51bSA9IGFwcGx5VG8ubGVuZ3RoO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtOyBpKyspIHtcbiAgICAgICAgICAgIHN0eWxlc1thcHBseVRvW2ldXSA9IGNvcnJlY3RlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3R5bGVzW2tleV0gPSBjb3JyZWN0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9wdGlvbnMubGF5b3V0SWQpIHtcbiAgICAgICAgc3R5bGVzLnBvaW50ZXJFdmVudHMgPSBsZWFkID09PSB0aGlzID8gcmVzb2x2ZU1vdGlvblZhbHVlKHN0eWxlUHJvcCA9PT0gbnVsbCB8fCBzdHlsZVByb3AgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHN0eWxlUHJvcC5wb2ludGVyRXZlbnRzKSB8fCBcIlwiIDogXCJub25lXCI7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3R5bGVzO1xuICAgIH1cbiAgICBjbGVhclNuYXBzaG90KCkge1xuICAgICAgdGhpcy5yZXN1bWVGcm9tID0gdGhpcy5zbmFwc2hvdCA9IHZvaWQgMDtcbiAgICB9XG4gICAgLy8gT25seSBydW4gb24gcm9vdFxuICAgIHJlc2V0VHJlZSgpIHtcbiAgICAgIHRoaXMucm9vdC5ub2Rlcy5mb3JFYWNoKChub2RlKSA9PiB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgcmV0dXJuIChfYSA9IG5vZGUuY3VycmVudEFuaW1hdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLnN0b3AoKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5yb290Lm5vZGVzLmZvckVhY2goY2xlYXJNZWFzdXJlbWVudHMpO1xuICAgICAgdGhpcy5yb290LnNoYXJlZE5vZGVzLmNsZWFyKCk7XG4gICAgfVxuICB9O1xufVxuZnVuY3Rpb24gdXBkYXRlTGF5b3V0KG5vZGUpIHtcbiAgbm9kZS51cGRhdGVMYXlvdXQoKTtcbn1cbmZ1bmN0aW9uIG5vdGlmeUxheW91dFVwZGF0ZShub2RlKSB7XG4gIHZhciBfYTtcbiAgY29uc3Qgc25hcHNob3QgPSAoKF9hID0gbm9kZS5yZXN1bWVGcm9tKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2Euc25hcHNob3QpIHx8IG5vZGUuc25hcHNob3Q7XG4gIGlmIChub2RlLmlzTGVhZCgpICYmIG5vZGUubGF5b3V0ICYmIHNuYXBzaG90ICYmIG5vZGUuaGFzTGlzdGVuZXJzKFwiZGlkVXBkYXRlXCIpKSB7XG4gICAgY29uc3QgeyBsYXlvdXRCb3g6IGxheW91dDIsIG1lYXN1cmVkQm94OiBtZWFzdXJlZExheW91dCB9ID0gbm9kZS5sYXlvdXQ7XG4gICAgY29uc3QgeyBhbmltYXRpb25UeXBlIH0gPSBub2RlLm9wdGlvbnM7XG4gICAgY29uc3QgaXNTaGFyZWQgPSBzbmFwc2hvdC5zb3VyY2UgIT09IG5vZGUubGF5b3V0LnNvdXJjZTtcbiAgICBpZiAoYW5pbWF0aW9uVHlwZSA9PT0gXCJzaXplXCIpIHtcbiAgICAgIGVhY2hBeGlzKChheGlzKSA9PiB7XG4gICAgICAgIGNvbnN0IGF4aXNTbmFwc2hvdCA9IGlzU2hhcmVkID8gc25hcHNob3QubWVhc3VyZWRCb3hbYXhpc10gOiBzbmFwc2hvdC5sYXlvdXRCb3hbYXhpc107XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IGNhbGNMZW5ndGgoYXhpc1NuYXBzaG90KTtcbiAgICAgICAgYXhpc1NuYXBzaG90Lm1pbiA9IGxheW91dDJbYXhpc10ubWluO1xuICAgICAgICBheGlzU25hcHNob3QubWF4ID0gYXhpc1NuYXBzaG90Lm1pbiArIGxlbmd0aDtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoc2hvdWxkQW5pbWF0ZVBvc2l0aW9uT25seShhbmltYXRpb25UeXBlLCBzbmFwc2hvdC5sYXlvdXRCb3gsIGxheW91dDIpKSB7XG4gICAgICBlYWNoQXhpcygoYXhpcykgPT4ge1xuICAgICAgICBjb25zdCBheGlzU25hcHNob3QgPSBpc1NoYXJlZCA/IHNuYXBzaG90Lm1lYXN1cmVkQm94W2F4aXNdIDogc25hcHNob3QubGF5b3V0Qm94W2F4aXNdO1xuICAgICAgICBjb25zdCBsZW5ndGggPSBjYWxjTGVuZ3RoKGxheW91dDJbYXhpc10pO1xuICAgICAgICBheGlzU25hcHNob3QubWF4ID0gYXhpc1NuYXBzaG90Lm1pbiArIGxlbmd0aDtcbiAgICAgICAgaWYgKG5vZGUucmVsYXRpdmVUYXJnZXQgJiYgIW5vZGUuY3VycmVudEFuaW1hdGlvbikge1xuICAgICAgICAgIG5vZGUuaXNQcm9qZWN0aW9uRGlydHkgPSB0cnVlO1xuICAgICAgICAgIG5vZGUucmVsYXRpdmVUYXJnZXRbYXhpc10ubWF4ID0gbm9kZS5yZWxhdGl2ZVRhcmdldFtheGlzXS5taW4gKyBsZW5ndGg7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBjb25zdCBsYXlvdXREZWx0YSA9IGNyZWF0ZURlbHRhKCk7XG4gICAgY2FsY0JveERlbHRhKGxheW91dERlbHRhLCBsYXlvdXQyLCBzbmFwc2hvdC5sYXlvdXRCb3gpO1xuICAgIGNvbnN0IHZpc3VhbERlbHRhID0gY3JlYXRlRGVsdGEoKTtcbiAgICBpZiAoaXNTaGFyZWQpIHtcbiAgICAgIGNhbGNCb3hEZWx0YSh2aXN1YWxEZWx0YSwgbm9kZS5hcHBseVRyYW5zZm9ybShtZWFzdXJlZExheW91dCwgdHJ1ZSksIHNuYXBzaG90Lm1lYXN1cmVkQm94KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsY0JveERlbHRhKHZpc3VhbERlbHRhLCBsYXlvdXQyLCBzbmFwc2hvdC5sYXlvdXRCb3gpO1xuICAgIH1cbiAgICBjb25zdCBoYXNMYXlvdXRDaGFuZ2VkID0gIWlzRGVsdGFaZXJvKGxheW91dERlbHRhKTtcbiAgICBsZXQgaGFzUmVsYXRpdmVUYXJnZXRDaGFuZ2VkID0gZmFsc2U7XG4gICAgaWYgKCFub2RlLnJlc3VtZUZyb20pIHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGFyZW50ID0gbm9kZS5nZXRDbG9zZXN0UHJvamVjdGluZ1BhcmVudCgpO1xuICAgICAgaWYgKHJlbGF0aXZlUGFyZW50ICYmICFyZWxhdGl2ZVBhcmVudC5yZXN1bWVGcm9tKSB7XG4gICAgICAgIGNvbnN0IHsgc25hcHNob3Q6IHBhcmVudFNuYXBzaG90LCBsYXlvdXQ6IHBhcmVudExheW91dCB9ID0gcmVsYXRpdmVQYXJlbnQ7XG4gICAgICAgIGlmIChwYXJlbnRTbmFwc2hvdCAmJiBwYXJlbnRMYXlvdXQpIHtcbiAgICAgICAgICBjb25zdCByZWxhdGl2ZVNuYXBzaG90ID0gY3JlYXRlQm94KCk7XG4gICAgICAgICAgY2FsY1JlbGF0aXZlUG9zaXRpb24ocmVsYXRpdmVTbmFwc2hvdCwgc25
10617hcHNob3QubGF5b3V0Qm94LCBwYXJlbnRTbmFwc2hvdC5sYXlvdXRCb3gpO1xuICAgICAgICAgIGNvbnN0IHJlbGF0aXZlTGF5b3V0ID0gY3JlYXRlQm94KCk7XG4gICAgICAgICAgY2FsY1JlbGF0aXZlUG9zaXRpb24ocmVsYXRpdmVMYXlvdXQsIGxheW91dDIsIHBhcmVudExheW91dC5sYXlvdXRCb3gpO1xuICAgICAgICAgIGlmICghYm94RXF1YWxzUm91bmRlZChyZWxhdGl2ZVNuYXBzaG90LCByZWxhdGl2ZUxheW91dCkpIHtcbiAgICAgICAgICAgIGhhc1JlbGF0aXZlVGFyZ2V0Q2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChyZWxhdGl2ZVBhcmVudC5vcHRpb25zLmxheW91dFJvb3QpIHtcbiAgICAgICAgICAgIG5vZGUucmVsYXRpdmVUYXJnZXQgPSByZWxhdGl2ZUxheW91dDtcbiAgICAgICAgICAgIG5vZGUucmVsYXRpdmVUYXJnZXRPcmlnaW4gPSByZWxhdGl2ZVNuYXBzaG90O1xuICAgICAgICAgICAgbm9kZS5yZWxhdGl2ZVBhcmVudCA9IHJlbGF0aXZlUGFyZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBub2RlLm5vdGlmeUxpc3RlbmVycyhcImRpZFVwZGF0ZVwiLCB7XG4gICAgICBsYXlvdXQ6IGxheW91dDIsXG4gICAgICBzbmFwc2hvdCxcbiAgICAgIGRlbHRhOiB2aXN1YWxEZWx0YSxcbiAgICAgIGxheW91dERlbHRhLFxuICAgICAgaGFzTGF5b3V0Q2hhbmdlZCxcbiAgICAgIGhhc1JlbGF0aXZlVGFyZ2V0Q2hhbmdlZFxuICAgIH0pO1xuICB9IGVsc2UgaWYgKG5vZGUuaXNMZWFkKCkpIHtcbiAgICBjb25zdCB7IG9uRXhpdENvbXBsZXRlIH0gPSBub2RlLm9wdGlvbnM7XG4gICAgb25FeGl0Q29tcGxldGUgJiYgb25FeGl0Q29tcGxldGUoKTtcbiAgfVxuICBub2RlLm9wdGlvbnMudHJhbnNpdGlvbiA9IHZvaWQgMDtcbn1cbmZ1bmN0aW9uIHByb3BhZ2F0ZURpcnR5Tm9kZXMobm9kZSkge1xuICBpZiAoaXNEZWJ1Zykge1xuICAgIG1ldHJpY3MudG90YWxOb2RlcysrO1xuICB9XG4gIGlmICghbm9kZS5wYXJlbnQpXG4gICAgcmV0dXJuO1xuICBpZiAoIW5vZGUuaXNQcm9qZWN0aW5nKCkpIHtcbiAgICBub2RlLmlzUHJvamVjdGlvbkRpcnR5ID0gbm9kZS5wYXJlbnQuaXNQcm9qZWN0aW9uRGlydHk7XG4gIH1cbiAgbm9kZS5pc1NoYXJlZFByb2plY3Rpb25EaXJ0eSB8fCAobm9kZS5pc1NoYXJlZFByb2plY3Rpb25EaXJ0eSA9IEJvb2xlYW4obm9kZS5pc1Byb2plY3Rpb25EaXJ0eSB8fCBub2RlLnBhcmVudC5pc1Byb2plY3Rpb25EaXJ0eSB8fCBub2RlLnBhcmVudC5pc1NoYXJlZFByb2plY3Rpb25EaXJ0eSkpO1xuICBub2RlLmlzVHJhbnNmb3JtRGlydHkgfHwgKG5vZGUuaXNUcmFuc2Zvcm1EaXJ0eSA9IG5vZGUucGFyZW50LmlzVHJhbnNmb3JtRGlydHkpO1xufVxuZnVuY3Rpb24gY2xlYW5EaXJ0eU5vZGVzKG5vZGUpIHtcbiAgbm9kZS5pc1Byb2plY3Rpb25EaXJ0eSA9IG5vZGUuaXNTaGFyZWRQcm9qZWN0aW9uRGlydHkgPSBub2RlLmlzVHJhbnNmb3JtRGlydHkgPSBmYWxzZTtcbn1cbmZ1bmN0aW9uIGNsZWFyU25hcHNob3Qobm9kZSkge1xuICBub2RlLmNsZWFyU25hcHNob3QoKTtcbn1cbmZ1bmN0aW9uIGNsZWFyTWVhc3VyZW1lbnRzKG5vZGUpIHtcbiAgbm9kZS5jbGVhck1lYXN1cmVtZW50cygpO1xufVxuZnVuY3Rpb24gY2xlYXJJc0xheW91dERpcnR5KG5vZGUpIHtcbiAgbm9kZS5pc0xheW91dERpcnR5ID0gZmFsc2U7XG59XG5mdW5jdGlvbiByZXNldFRyYW5zZm9ybVN0eWxlKG5vZGUpIHtcbiAgY29uc3QgeyB2aXN1YWxFbGVtZW50IH0gPSBub2RlLm9wdGlvbnM7XG4gIGlmICh2aXN1YWxFbGVtZW50ICYmIHZpc3VhbEVsZW1lbnQuZ2V0UHJvcHMoKS5vbkJlZm9yZUxheW91dE1lYXN1cmUpIHtcbiAgICB2aXN1YWxFbGVtZW50Lm5vdGlmeShcIkJlZm9yZUxheW91dE1lYXN1cmVcIik7XG4gIH1cbiAgbm9kZS5yZXNldFRyYW5zZm9ybSgpO1xufVxuZnVuY3Rpb24gZmluaXNoQW5pbWF0aW9uKG5vZGUpIHtcbiAgbm9kZS5maW5pc2hBbmltYXRpb24oKTtcbiAgbm9kZS50YXJnZXREZWx0YSA9IG5vZGUucmVsYXRpdmVUYXJnZXQgPSBub2RlLnRhcmdldCA9IHZvaWQgMDtcbiAgbm9kZS5pc1Byb2plY3Rpb25EaXJ0eSA9IHRydWU7XG59XG5mdW5jdGlvbiByZXNvbHZlVGFyZ2V0RGVsdGEobm9kZSkge1xuICBub2RlLnJlc29sdmVUYXJnZXREZWx0YSgpO1xufVxuZnVuY3Rpb24gY2FsY1Byb2plY3Rpb24obm9kZSkge1xuICBub2RlLmNhbGNQcm9qZWN0aW9uKCk7XG59XG5mdW5jdGlvbiByZXNldFNrZXdBbmRSb3RhdGlvbihub2RlKSB7XG4gIG5vZGUucmVzZXRTa2V3QW5kUm90YXRpb24oKTtcbn1cbmZ1bmN0aW9uIHJlbW92ZUxlYWRTbmFwc2hvdHMoc3RhY2spIHtcbiAgc3RhY2sucmVtb3ZlTGVhZFNuYXBzaG90KCk7XG59XG5mdW5jdGlvbiBtaXhBeGlzRGVsdGEob3V0cHV0LCBkZWx0YSwgcCkge1xuICBvdXRwdXQudHJhbnNsYXRlID0gbWl4TnVtYmVyKGRlbHRhLnRyYW5zbGF0ZSwgMCwgcCk7XG4gIG91dHB1dC5zY2FsZSA9IG1peE51bWJlcihkZWx0YS5zY2FsZSwgMSwgcCk7XG4gIG91dHB1dC5vcmlnaW4gPSBkZWx0YS5vcmlnaW47XG4gIG91dHB1dC5vcmlnaW5Qb2ludCA9IGRlbHRhLm9yaWdpblBvaW50O1xufVxuZnVuY3Rpb24gbWl4QXhpcyhvdXRwdXQsIGZyb20sIHRvLCBwKSB7XG4gIG91dHB1dC5taW4gPSBtaXhOdW1iZXIoZnJvbS5taW4sIHRvLm1pbiwgcCk7XG4gIG91dHB1dC5tYXggPSBtaXhOdW1iZXIoZnJvbS5tYXgsIHRvLm1heCwgcCk7XG59XG5mdW5jdGlvbiBtaXhCb3gob3V0cHV0LCBmcm9tLCB0bywgcCkge1xuICBtaXhBeGlzKG91dHB1dC54LCBmcm9tLngsIHRvLngsIHApO1xuICBtaXhBeGlzKG91dHB1dC55LCBmcm9tLnksIHRvLnksIHApO1xufVxuZnVuY3Rpb24gaGFzT3BhY2l0eUNyb3NzZmFkZShub2RlKSB7XG4gIHJldHVybiBub2RlLmFuaW1hdGlvblZhbHVlcyAmJiBub2RlLmFuaW1hdGlvblZhbHVlcy5vcGFjaXR5RXhpdCAhPT0gdm9pZCAwO1xufVxudmFyIGRlZmF1bHRMYXlvdXRUcmFuc2l0aW9uID0ge1xuICBkdXJhdGlvbjogMC40NSxcbiAgZWFzZTogWzAuNCwgMCwgMC4xLCAxXVxufTtcbnZhciB1c2VyQWdlbnRDb250YWlucyA9IChzdHJpbmcpID0+IHR5cGVvZiBuYXZpZ2F0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgbmF2aWdhdG9yLnVzZXJBZ2VudCAmJiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc3RyaW5nKTtcbnZhciByb3VuZFBvaW50ID0gdXNlckFnZW50Q29udGFpbnMoXCJhcHBsZXdlYmtpdC9cIikgJiYgIXVzZXJBZ2VudENvbnRhaW5zKFwiY2hyb21lL1wiKSA/IE1hdGgucm91bmQgOiBub29wO1xuZnVuY3Rpb24gcm91bmRBeGlzKGF4aXMpIHtcbiAgYXhpcy5taW4gPSByb3VuZFBvaW50KGF4aXMubWluKTtcbiAgYXhpcy5tYXggPSByb3VuZFBvaW50KGF4aXMubWF4KTtcbn1cbmZ1bmN0aW9uIHJvdW5kQm94KGJveCkge1xuICByb3VuZEF4aXMoYm94LngpO1xuICByb3VuZEF4aXMoYm94LnkpO1xufVxuZnVuY3Rpb24gc2hvdWxkQW5pbWF0ZVBvc2l0aW9uT25seShhbmltYXRpb25UeXBlLCBzbmFwc2hvdCwgbGF5b3V0Mikge1xuICByZXR1cm4gYW5pbWF0aW9uVHlwZSA9PT0gXCJwb3NpdGlvblwiIHx8IGFuaW1hdGlvblR5cGUgPT09IFwicHJlc2VydmUtYXNwZWN0XCIgJiYgIWlzTmVhcihhc3BlY3RSYXRpbyhzbmFwc2hvdCksIGFzcGVjdFJhdGlvKGxheW91dDIpLCAwLjIpO1xufVxuZnVuY3Rpb24gY2hlY2tOb2RlV2FzU2Nyb2xsUm9vdChub2RlKSB7XG4gIHZhciBfYTtcbiAgcmV0dXJuIG5vZGUgIT09IG5vZGUucm9vdCAmJiAoKF9hID0gbm9kZS5zY3JvbGwpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS53YXNSb290KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcHJvamVjdGlvbi9ub2RlL0RvY3VtZW50UHJvamVjdGlvbk5vZGUubWpzXG52YXIgaW1wb3J0X2Rpc3Q3NDUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDc0NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDc0NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBEb2N1bWVudFByb2plY3Rpb25Ob2RlID0gY3JlYXRlUHJvamVjdGlvbk5vZGUyKHtcbiAgYXR0YWNoUmVzaXplTGlzdGVuZXI6IChyZWYsIG5vdGlmeTIpID0+IGFkZERvbUV2ZW50KHJlZiwgXCJyZXNpemVcIiwgbm90aWZ5MiksXG4gIG1lYXN1cmVTY3JvbGw6ICgpID0+ICh7XG4gICAgeDogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0LFxuICAgIHk6IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3BcbiAgfSksXG4gIGNoZWNrSXNTY3JvbGxSb290OiAoKSA9PiB0cnVlXG59KTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcHJvamVjdGlvbi9ub2RlL0hUTUxQcm9qZWN0aW9uTm9kZS5tanNcbnZhciByb290UHJvamVjdGlvbk5vZGUgPSB7XG4gIGN1cnJlbnQ6IHZvaWQgMFxufTtcbnZhciBIVE1MUHJvamVjdGlvbk5vZGUgPSBjcmVhdGVQcm9qZWN0aW9uTm9kZTIoe1xuICBtZWFzdXJlU2Nyb2xsOiAoaW5zdGFuY2UpID0+ICh7XG4gICAgeDogaW5zdGFuY2Uuc2Nyb2xsTGVmdCxcbiAgICB5OiBpbnN0YW5jZS5zY3JvbGxUb3BcbiAgfSksXG4gIGRlZmF1bHRQYXJlbnQ6ICgpID0+IHtcbiAgICBpZiAoIXJvb3RQcm9qZWN0aW9uTm9kZS5jdXJyZW50KSB7XG4gICAgICBjb25zdCBkb2N1bWVudE5vZGUgPSBuZXcgRG9jdW1lbnRQcm9qZWN0aW9uTm9kZSh7fSk7XG4gICAgICBkb2
10617N1bWVudE5vZGUubW91bnQod2luZG93KTtcbiAgICAgIGRvY3VtZW50Tm9kZS5zZXRPcHRpb25zKHsgbGF5b3V0U2Nyb2xsOiB0cnVlIH0pO1xuICAgICAgcm9vdFByb2plY3Rpb25Ob2RlLmN1cnJlbnQgPSBkb2N1bWVudE5vZGU7XG4gICAgfVxuICAgIHJldHVybiByb290UHJvamVjdGlvbk5vZGUuY3VycmVudDtcbiAgfSxcbiAgcmVzZXRUcmFuc2Zvcm06IChpbnN0YW5jZSwgdmFsdWUpID0+IHtcbiAgICBpbnN0YW5jZS5zdHlsZS50cmFuc2Zvcm0gPSB2YWx1ZSAhPT0gdm9pZCAwID8gdmFsdWUgOiBcIm5vbmVcIjtcbiAgfSxcbiAgY2hlY2tJc1Njcm9sbFJvb3Q6IChpbnN0YW5jZSkgPT4gQm9vbGVhbih3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShpbnN0YW5jZSkucG9zaXRpb24gPT09IFwiZml4ZWRcIilcbn0pO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9tb3Rpb24vZmVhdHVyZXMvZHJhZy5tanNcbnZhciBkcmFnID0ge1xuICBwYW46IHtcbiAgICBGZWF0dXJlOiBQYW5HZXN0dXJlXG4gIH0sXG4gIGRyYWc6IHtcbiAgICBGZWF0dXJlOiBEcmFnR2VzdHVyZSxcbiAgICBQcm9qZWN0aW9uTm9kZTogSFRNTFByb2plY3Rpb25Ob2RlLFxuICAgIE1lYXN1cmVMYXlvdXRcbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvbW90aW9uL2ZlYXR1cmVzL2dlc3R1cmVzLm1qc1xudmFyIGltcG9ydF9kaXN0NzY5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3NzAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3NzEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2dlc3R1cmVzL2hvdmVyLm1qc1xudmFyIGltcG9ydF9kaXN0NzU0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3NTUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3NTYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBoYW5kbGVIb3ZlckV2ZW50KG5vZGUsIGV2ZW50LCBsaWZlY3ljbGUpIHtcbiAgY29uc3QgeyBwcm9wcyB9ID0gbm9kZTtcbiAgaWYgKG5vZGUuYW5pbWF0aW9uU3RhdGUgJiYgcHJvcHMud2hpbGVIb3Zlcikge1xuICAgIG5vZGUuYW5pbWF0aW9uU3RhdGUuc2V0QWN0aXZlKFwid2hpbGVIb3ZlclwiLCBsaWZlY3ljbGUgPT09IFwiU3RhcnRcIik7XG4gIH1cbiAgY29uc3QgZXZlbnROYW1lID0gXCJvbkhvdmVyXCIgKyBsaWZlY3ljbGU7XG4gIGNvbnN0IGNhbGxiYWNrID0gcHJvcHNbZXZlbnROYW1lXTtcbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgZnJhbWUucG9zdFJlbmRlcigoKSA9PiBjYWxsYmFjayhldmVudCwgZXh0cmFjdEV2ZW50SW5mbyhldmVudCkpKTtcbiAgfVxufVxudmFyIEhvdmVyR2VzdHVyZSA9IGNsYXNzIGV4dGVuZHMgRmVhdHVyZSB7XG4gIG1vdW50KCkge1xuICAgIGNvbnN0IHsgY3VycmVudCB9ID0gdGhpcy5ub2RlO1xuICAgIGlmICghY3VycmVudClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnVubW91bnQgPSBob3ZlcihjdXJyZW50LCAoc3RhcnRFdmVudCkgPT4ge1xuICAgICAgaGFuZGxlSG92ZXJFdmVudCh0aGlzLm5vZGUsIHN0YXJ0RXZlbnQsIFwiU3RhcnRcIik7XG4gICAgICByZXR1cm4gKGVuZEV2ZW50KSA9PiBoYW5kbGVIb3ZlckV2ZW50KHRoaXMubm9kZSwgZW5kRXZlbnQsIFwiRW5kXCIpO1xuICAgIH0pO1xuICB9XG4gIHVubW91bnQoKSB7XG4gIH1cbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2dlc3R1cmVzL2ZvY3VzLm1qc1xudmFyIGltcG9ydF9kaXN0NzU3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3NTggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3NTkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgRm9jdXNHZXN0dXJlID0gY2xhc3MgZXh0ZW5kcyBGZWF0dXJlIHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG4gIH1cbiAgb25Gb2N1cygpIHtcbiAgICBsZXQgaXNGb2N1c1Zpc2libGUgPSBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgaXNGb2N1c1Zpc2libGUgPSB0aGlzLm5vZGUuY3VycmVudC5tYXRjaGVzKFwiOmZvY3VzLXZpc2libGVcIik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaXNGb2N1c1Zpc2libGUgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWlzRm9jdXNWaXNpYmxlIHx8ICF0aGlzLm5vZGUuYW5pbWF0aW9uU3RhdGUpXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5ub2RlLmFuaW1hdGlvblN0YXRlLnNldEFjdGl2ZShcIndoaWxlRm9jdXNcIiwgdHJ1ZSk7XG4gICAgdGhpcy5pc0FjdGl2ZSA9IHRydWU7XG4gIH1cbiAgb25CbHVyKCkge1xuICAgIGlmICghdGhpcy5pc0FjdGl2ZSB8fCAhdGhpcy5ub2RlLmFuaW1hdGlvblN0YXRlKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMubm9kZS5hbmltYXRpb25TdGF0ZS5zZXRBY3RpdmUoXCJ3aGlsZUZvY3VzXCIsIGZhbHNlKTtcbiAgICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG4gIH1cbiAgbW91bnQoKSB7XG4gICAgdGhpcy51bm1vdW50ID0gcGlwZShhZGREb21FdmVudCh0aGlzLm5vZGUuY3VycmVudCwgXCJmb2N1c1wiLCAoKSA9PiB0aGlzLm9uRm9jdXMoKSksIGFkZERvbUV2ZW50KHRoaXMubm9kZS5jdXJyZW50LCBcImJsdXJcIiwgKCkgPT4gdGhpcy5vbkJsdXIoKSkpO1xuICB9XG4gI
10617HVubW91bnQoKSB7XG4gIH1cbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2dlc3R1cmVzL3ByZXNzLm1qc1xudmFyIGltcG9ydF9kaXN0NzYwID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3NjEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3NjIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBoYW5kbGVQcmVzc0V2ZW50KG5vZGUsIGV2ZW50LCBsaWZlY3ljbGUpIHtcbiAgY29uc3QgeyBwcm9wcyB9ID0gbm9kZTtcbiAgaWYgKG5vZGUuYW5pbWF0aW9uU3RhdGUgJiYgcHJvcHMud2hpbGVUYXApIHtcbiAgICBub2RlLmFuaW1hdGlvblN0YXRlLnNldEFjdGl2ZShcIndoaWxlVGFwXCIsIGxpZmVjeWNsZSA9PT0gXCJTdGFydFwiKTtcbiAgfVxuICBjb25zdCBldmVudE5hbWUgPSBcIm9uVGFwXCIgKyAobGlmZWN5Y2xlID09PSBcIkVuZFwiID8gXCJcIiA6IGxpZmVjeWNsZSk7XG4gIGNvbnN0IGNhbGxiYWNrID0gcHJvcHNbZXZlbnROYW1lXTtcbiAgaWYgKGNhbGxiYWNrKSB7XG4gICAgZnJhbWUucG9zdFJlbmRlcigoKSA9PiBjYWxsYmFjayhldmVudCwgZXh0cmFjdEV2ZW50SW5mbyhldmVudCkpKTtcbiAgfVxufVxudmFyIFByZXNzR2VzdHVyZSA9IGNsYXNzIGV4dGVuZHMgRmVhdHVyZSB7XG4gIG1vdW50KCkge1xuICAgIGNvbnN0IHsgY3VycmVudCB9ID0gdGhpcy5ub2RlO1xuICAgIGlmICghY3VycmVudClcbiAgICAgIHJldHVybjtcbiAgICB0aGlzLnVubW91bnQgPSBwcmVzcyhjdXJyZW50LCAoc3RhcnRFdmVudCkgPT4ge1xuICAgICAgaGFuZGxlUHJlc3NFdmVudCh0aGlzLm5vZGUsIHN0YXJ0RXZlbnQsIFwiU3RhcnRcIik7XG4gICAgICByZXR1cm4gKGVuZEV2ZW50LCB7IHN1Y2Nlc3MgfSkgPT4gaGFuZGxlUHJlc3NFdmVudCh0aGlzLm5vZGUsIGVuZEV2ZW50LCBzdWNjZXNzID8gXCJFbmRcIiA6IFwiQ2FuY2VsXCIpO1xuICAgIH0sIHsgdXNlR2xvYmFsVGFyZ2V0OiB0aGlzLm5vZGUucHJvcHMuZ2xvYmFsVGFwVGFyZ2V0IH0pO1xuICB9XG4gIHVubW91bnQoKSB7XG4gIH1cbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL21vdGlvbi9mZWF0dXJlcy92aWV3cG9ydC9pbmRleC5tanNcbnZhciBpbXBvcnRfZGlzdDc2NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NzY3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NzY4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9tb3Rpb24vZmVhdHVyZXMvdmlld3BvcnQvb2JzZXJ2ZXJzLm1qc1xudmFyIGltcG9ydF9kaXN0NzYzID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3NjQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3NjUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgb2JzZXJ2ZXJDYWxsYmFja3MgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbnZhciBvYnNlcnZlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbnZhciBmaXJlT2JzZXJ2ZXJDYWxsYmFjayA9IChlbnRyeSkgPT4ge1xuICBjb25zdCBjYWxsYmFjayA9IG9ic2VydmVyQ2FsbGJhY2tzLmdldChlbnRyeS50YXJnZXQpO1xuICBjYWxsYmFjayAmJiBjYWxsYmFjayhlbnRyeSk7XG59O1xudmFyIGZpcmVBbGxPYnNlcnZlckNhbGxiYWNrcyA9IChlbnRyaWVzKSA9PiB7XG4gIGVudHJpZXMuZm9yRWFjaChmaXJlT2JzZXJ2ZXJDYWxsYmFjayk7XG59O1xuZnVuY3Rpb24gaW5pdEludGVyc2VjdGlvbk9ic2VydmVyKHsgcm9vdCwgLi4ub3B0aW9ucyB9KSB7XG4gIGNvbnN0IGxvb2t1cFJvb3QgPSByb290IHx8IGRvY3VtZW50O1xuICBpZiAoIW9ic2VydmVycy5oYXMobG9va3VwUm9vdCkpIHtcbiAgICBvYnNlcnZlcnMuc2V0KGxvb2t1cFJvb3QsIHt9KTtcbiAgfVxuICBjb25zdCByb290T2JzZXJ2ZXJzID0gb2JzZXJ2ZXJzLmdldChsb29rdXBSb290KTtcbiAgY29uc3Qga2V5ID0gSlNPTi5zdHJpbmdpZnkob3B0aW9ucyk7XG4gIGlmICghcm9vdE9ic2VydmVyc1trZXldKSB7XG4gICAgcm9vdE9ic2VydmVyc1trZXldID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZpcmVBbGxPYnNlcnZlckNhbGxiYWNrcywgeyByb290LCAuLi5vcHRpb25zIH0pO1xuICB9XG4gIHJldHVybiByb290T2JzZXJ2ZXJzW2tleV07XG59XG5mdW5jdGlvbiBvYnNlcnZlSW50ZXJzZWN0aW9uKGVsZW1lbnQsIG9wdGlvbnMsIGNhbGxiYWNrKSB7XG4gIGNvbnN0IHJvb3RJbnRlcmVzZWN0aW9uT2JzZXJ2ZXIgPSBpbml0SW50ZXJzZWN0aW9uT2JzZXJ2ZXIob3B0aW9ucyk7XG4gIG9ic2VydmVyQ2FsbGJhY2tzLnNldChlbGVtZW50LCBjYWxsYmFjayk7XG4gIHJvb3RJbnRlcmVzZWN0aW9uT2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50KTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBvYnNlcnZlckNhbGxiYWNrcy5kZWxldGUoZWxlbWVudCk7XG4gICAgcm9vdEludGVyZXNlY3Rpb25PYnNlcnZlci51bm9ic2VydmUoZWxlbWVudCk7XG4gIH07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL21vdGlvbi9mZWF0dXJlcy92aWV3cG9ydC9pbmRleC5tanNcbnZhciB0aHJlc2hvbGROYW1lcyA9IHtcbiAgc29tZTogMCxcbiAgYWxsOiAxXG59O1xudmFyIEluVmlld0ZlYXR1cmUgPSBjbGFzcyBleHRlbmRzIEZlYXR1cmUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMuaGFzRW50ZXJlZFZpZXcgPSBmYWxzZTtcbiAgICB0aGlzLmlzSW5WaWV3ID0gZmFsc2U7XG4gIH1cbiAgc3RhcnRPYnNlcnZlcigpIHtcbiAgICB0aGlzLnVubW91bnQoKTtcbiAgICBjb25zdCB7IHZpZXdwb3J0ID0ge30gfSA9IHRoaXMubm9kZS5nZXRQcm9wcygpO1xuICAgIGNvbnN0IHsgcm9vdCwgbWFyZ2luOiByb290TWFyZ2luLCBhbW91bnQgPSBcInNvbWVcIiwgb25jZSB9ID0gdmlld3BvcnQ7XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHJvb3Q6IHJvb3QgPyByb290LmN1cnJlbnQgOiB2b2lkIDAsXG4gICAgICByb290TWFyZ2luLFxuICAgICAgdGhyZXNob2xkOiB0eXBlb2YgYW1vdW50ID09PSBcIm51bWJlclwiID8gYW1vdW50IDogdGhyZXNob2xkTmFtZXNbYW1vdW50XVxuICAgIH07XG4gICAgY29uc3Qgb25JbnRlcnNlY3Rpb25VcGRhdGUgPSAoZW50cnkpID0+IHtcbiAgICAgIGNvbnN0IHsgaXNJbnRlcnNlY3RpbmcgfSA9IGVudHJ5O1xuICAgICAgaWYgKHRoaXMuaXNJblZpZXcgPT09IGlzSW50ZXJzZWN0aW5nKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLmlzSW5WaWV3ID0gaXNJbnRlcnNlY3Rpbmc7XG4gICAgICBpZiAob25jZSAmJiAhaXNJbnRlcnNlY3RpbmcgJiYgdGhpcy5oYXNFbnRlcmVkVmlldykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2UgaWYgKGlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgI
10617HRoaXMuaGFzRW50ZXJlZFZpZXcgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMubm9kZS5hbmltYXRpb25TdGF0ZSkge1xuICAgICAgICB0aGlzLm5vZGUuYW5pbWF0aW9uU3RhdGUuc2V0QWN0aXZlKFwid2hpbGVJblZpZXdcIiwgaXNJbnRlcnNlY3RpbmcpO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBvblZpZXdwb3J0RW50ZXIsIG9uVmlld3BvcnRMZWF2ZSB9ID0gdGhpcy5ub2RlLmdldFByb3BzKCk7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IGlzSW50ZXJzZWN0aW5nID8gb25WaWV3cG9ydEVudGVyIDogb25WaWV3cG9ydExlYXZlO1xuICAgICAgY2FsbGJhY2sgJiYgY2FsbGJhY2soZW50cnkpO1xuICAgIH07XG4gICAgcmV0dXJuIG9ic2VydmVJbnRlcnNlY3Rpb24odGhpcy5ub2RlLmN1cnJlbnQsIG9wdGlvbnMsIG9uSW50ZXJzZWN0aW9uVXBkYXRlKTtcbiAgfVxuICBtb3VudCgpIHtcbiAgICB0aGlzLnN0YXJ0T2JzZXJ2ZXIoKTtcbiAgfVxuICB1cGRhdGUoKSB7XG4gICAgaWYgKHR5cGVvZiBJbnRlcnNlY3Rpb25PYnNlcnZlciA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCB7IHByb3BzLCBwcmV2UHJvcHMgfSA9IHRoaXMubm9kZTtcbiAgICBjb25zdCBoYXNPcHRpb25zQ2hhbmdlZCA9IFtcImFtb3VudFwiLCBcIm1hcmdpblwiLCBcInJvb3RcIl0uc29tZShoYXNWaWV3cG9ydE9wdGlvbkNoYW5nZWQocHJvcHMsIHByZXZQcm9wcykpO1xuICAgIGlmIChoYXNPcHRpb25zQ2hhbmdlZCkge1xuICAgICAgdGhpcy5zdGFydE9ic2VydmVyKCk7XG4gICAgfVxuICB9XG4gIHVubW91bnQoKSB7XG4gIH1cbn07XG5mdW5jdGlvbiBoYXNWaWV3cG9ydE9wdGlvbkNoYW5nZWQoeyB2aWV3cG9ydCA9IHt9IH0sIHsgdmlld3BvcnQ6IHByZXZWaWV3cG9ydCA9IHt9IH0gPSB7fSkge1xuICByZXR1cm4gKG5hbWUpID0+IHZpZXdwb3J0W25hbWVdICE9PSBwcmV2Vmlld3BvcnRbbmFtZV07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL21vdGlvbi9mZWF0dXJlcy9nZXN0dXJlcy5tanNcbnZhciBnZXN0dXJlQW5pbWF0aW9ucyA9IHtcbiAgaW5WaWV3OiB7XG4gICAgRmVhdHVyZTogSW5WaWV3RmVhdHVyZVxuICB9LFxuICB0YXA6IHtcbiAgICBGZWF0dXJlOiBQcmVzc0dlc3R1cmVcbiAgfSxcbiAgZm9jdXM6IHtcbiAgICBGZWF0dXJlOiBGb2N1c0dlc3R1cmVcbiAgfSxcbiAgaG92ZXI6IHtcbiAgICBGZWF0dXJlOiBIb3Zlckdlc3R1cmVcbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvbW90aW9uL2ZlYXR1cmVzL2xheW91dC5tanNcbnZhciBpbXBvcnRfZGlzdDc3MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NzczID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0Nzc0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGxheW91dCA9IHtcbiAgbGF5b3V0OiB7XG4gICAgUHJvamVjdGlvbk5vZGU6IEhUTUxQcm9qZWN0aW9uTm9kZSxcbiAgICBNZWFzdXJlTGF5b3V0XG4gIH1cbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9kb20vY3JlYXRlLXZpc3VhbC1lbGVtZW50Lm1qc1xudmFyIGltcG9ydF9kaXN0ODAyID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MDMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MDQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW1wb3J0X3JlYWN0MjkgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9odG1sL0hUTUxWaXN1YWxFbGVtZW50Lm1qc1xudmFyIGltcG9ydF9kaXN0Nzk2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3OTcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3OTggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9kb20vRE9NVmlzdWFsRWxlbWVudC5tanNcbnZhciBpbXBvcnRfZGlzdDc5MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0Nzk0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0Nzk1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvVmlzdWFsRWxlbWVudC5tanNcbnZhciBpbXBvcnRfZGlzdDc5MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0NzkxID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0NzkyID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy9yZWR1Y2VkLW1vdGlvbi9pbmRleC5tanNcbnZhciBpbXBvcnRfZGlzdDc3OCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0Nzc5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0NzgwID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy9yZWR1Y2VkLW1vdGlvbi9zdGF0ZS5tanNcbnZhciBpbXBvcnRfZGlzdDc3NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0Nzc2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0Nzc3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIHByZWZlcnNSZWR1Y2VkTW90aW9uID0geyBjdXJyZW50OiBudWxsIH07XG52YXIgaGFzUmVkdWNlZE1vdGlvbkxpc3RlbmVyID0geyBjdXJyZW50OiBmYWxzZSB9O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy9yZWR1Y2VkLW1vdGlvbi9pbmRleC5tanNcbmZ1bmN0aW9uIGluaXRQcmVmZXJzUmVkdWNlZE1vdGlvbigpIHtcbiAgaGFzUmVkdWNlZE1vdGlvbkxpc3RlbmVyLmN1cnJlbnQgPSB0cnVlO1xuICBpZiAoIWlzQnJvd3NlcilcbiAgICByZXR1cm47XG4gIGlmICh3aW5kb3cubWF0Y2hNZWRpYSkge1xuICAgIGNvbnN0IG1vdGlvbk1lZGlhUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYShcIihwcmVmZXJzLXJlZHVjZWQtbW90aW9uKVwiKTtcbiAgICBjb25zdCBzZXRSZWR1Y2VkTW90aW9uUHJlZmVyZW5jZXMgPSAoKSA9PiBwcmVmZXJzUmVkdWNlZE1vdGlvbi5jdXJyZW50ID0gbW90aW9uTWVkaWFRdWVyeS5tYXRjaGVzO1xuICAgIG1vdGlvbk1lZGlhUXVlcnkuYWRkTGlzdGVuZXIoc2V0UmVkdWNlZE1vdGlvblByZWZlcmVuY2VzKTtcbiAgICBzZXRSZWR1Y2VkTW90aW9uUHJlZmVyZW5jZXMoKTtcbiAgfSBlbHNlIHtcbiAgICBwcmVmZXJzUmVkdWNlZE1vdGlvbi5jdXJyZW50ID0gZmFsc2U7XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2RvbS92YWx1ZS10eXBlcy9maW5kLm1qc1xudmFyIGltcG9ydF9kaXN0NzgxID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3ODIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q3ODMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgdmFsdWVUeXBlcyA9IFsuLi5kaW1lbnNpb25WYWx1ZVR5cGVzLCBjb2xvciwgY29tcGxleF07XG52YXIgZmluZFZhbHVlVHlwZSA9ICh2KSA9PiB2YWx1ZVR5cGVzLmZpbmQodGVzdFZhbHVlVHlwZSh2KSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9zdG9yZS5tanNcbnZhciBpbXBvcnRfZGlzdDc4NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0Nzg1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0Nzg2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIHZpc3VhbEVsZW1lbnRTdG9yZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvdXRpbHMvbW90aW9uLXZhbHVlcy5tanNcbnZhciBpbXBvcnRfZGlzdDc4NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0Nzg4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0Nzg5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gdXBkYXRlTW90aW9uVmFsdWVzRnJvbVByb3BzKGVsZW1lbnQsIG5leHQsIHByZXYpIHtcbiAgZm9yIChjb25zdCBrZXkgaW4gbmV4dCkge1xuICAgIGNvbnN0IG5leHRWYWx1ZSA9IG5leHRba2V5XTtcbiAgICBjb25zdCBwcmV2VmFsdWUgPSBwcmV2W2tleV07XG4gICAgaWYgKGlzTW90aW9uVmFsdWUobmV4dFZhbHVlKSkge1xuICAgICAgZWxlbWVudC5hZGRWYWx1ZShrZXksIG5leHRWYWx1ZSk7XG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikge1xuICAgICAgICB3YXJuT25jZShuZXh0VmFsdWUudmVyc2lvbiA9PT0gXCIxMS4xOC4yXCIsIGBBdHRlbXB0aW5nIHRvIG1peCBNb3Rpb24gdmVyc2lvbnMgJHtuZXh0VmFsdWUudmVyc2lvbn0gd2l0aCAxMS4xOC4yIG1heSBub3Qgd29yayBhcyBleHBlY3RlZC5gKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzTW90aW9uVmFsdWUocHJldlZhbHVlKSkge1xuICAgICAgZWxlbWVudC5hZGRWYWx1ZShrZXksIG1vdGlvblZhbHVlKG5leHRWYWx1ZSwgeyBvd25lcjogZWxlbWVudCB9KSk7XG4gICAgfSBlbHNlIGlmIChwcmV2VmFsdWUgIT09IG5leHRWYWx1ZSkge1xuICAgICAgaWYgKGVsZW1lbnQuaGFzVmFsdWUoa2V5KSkge1xuICAgICAgICBjb25zdCBleGlzdGluZ1ZhbHVlID0gZWxlbWVudC5nZXRWYWx1ZShrZXkpO1xuICAgICAgICBpZiAoZXhpc3RpbmdWYWx1ZS5saXZlU3R5bGUgPT09IHRydWUpIHtcbiAgICAgICAgICBleGlzdGluZ1ZhbHVlLmp1bXAobmV4dFZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICghZXhpc3RpbmdWYWx1ZS5oYXNBbmltYXRlZCkge1xuICAgICAgICAgIGV4aXN0aW5nVmFsdWUuc2V0KG5leHRWYWx1ZSk7XG4gICAgICAgI
10617H1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGxhdGVzdFZhbHVlID0gZWxlbWVudC5nZXRTdGF0aWNWYWx1ZShrZXkpO1xuICAgICAgICBlbGVtZW50LmFkZFZhbHVlKGtleSwgbW90aW9uVmFsdWUobGF0ZXN0VmFsdWUgIT09IHZvaWQgMCA/IGxhdGVzdFZhbHVlIDogbmV4dFZhbHVlLCB7IG93bmVyOiBlbGVtZW50IH0pKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBrZXkgaW4gcHJldikge1xuICAgIGlmIChuZXh0W2tleV0gPT09IHZvaWQgMClcbiAgICAgIGVsZW1lbnQucmVtb3ZlVmFsdWUoa2V5KTtcbiAgfVxuICByZXR1cm4gbmV4dDtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL1Zpc3VhbEVsZW1lbnQubWpzXG52YXIgcHJvcEV2ZW50SGFuZGxlcnMgPSBbXG4gIFwiQW5pbWF0aW9uU3RhcnRcIixcbiAgXCJBbmltYXRpb25Db21wbGV0ZVwiLFxuICBcIlVwZGF0ZVwiLFxuICBcIkJlZm9yZUxheW91dE1lYXN1cmVcIixcbiAgXCJMYXlvdXRNZWFzdXJlXCIsXG4gIFwiTGF5b3V0QW5pbWF0aW9uU3RhcnRcIixcbiAgXCJMYXlvdXRBbmltYXRpb25Db21wbGV0ZVwiXG5dO1xudmFyIFZpc3VhbEVsZW1lbnQgPSBjbGFzcyB7XG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCB0YWtlcyBSZWFjdCBwcm9wcyBhbmQgcmV0dXJucyBmb3VuZCBNb3Rpb25WYWx1ZXMuIEZvciBleGFtcGxlLCBIVE1MXG4gICAqIE1vdGlvblZhbHVlcyB3aWxsIGJlIGZvdW5kIHdpdGhpbiB0aGUgc3R5bGUgcHJvcCwgd2hlcmVhcyBmb3IgVGhyZWUuanMgd2l0aGluIGF0dHJpYnV0ZSBhcnJheXMuXG4gICAqXG4gICAqIFRoaXMgaXNuJ3QgYW4gYWJzdHJhY3QgbWV0aG9kIGFzIGl0IG5lZWRzIGNhbGxpbmcgaW4gdGhlIGNvbnN0cnVjdG9yLCBidXQgaXQgaXNcbiAgICogaW50ZW5kZWQgdG8gYmUgb25lLlxuICAgKi9cbiAgc2NyYXBlTW90aW9uVmFsdWVzRnJvbVByb3BzKF9wcm9wcywgX3ByZXZQcm9wcywgX3Zpc3VhbEVsZW1lbnQpIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgY29uc3RydWN0b3IoeyBwYXJlbnQsIHByb3BzLCBwcmVzZW5jZUNvbnRleHQsIHJlZHVjZWRNb3Rpb25Db25maWcsIGJsb2NrSW5pdGlhbEFuaW1hdGlvbiwgdmlzdWFsU3RhdGUgfSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgICB0aGlzLmNoaWxkcmVuID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICB0aGlzLmlzVmFyaWFudE5vZGUgPSBmYWxzZTtcbiAgICB0aGlzLmlzQ29udHJvbGxpbmdWYXJpYW50cyA9IGZhbHNlO1xuICAgIHRoaXMuc2hvdWxkUmVkdWNlTW90aW9uID0gbnVsbDtcbiAgICB0aGlzLnZhbHVlcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgdGhpcy5LZXlmcmFtZVJlc29sdmVyID0gS2V5ZnJhbWVSZXNvbHZlcjtcbiAgICB0aGlzLmZlYXR1cmVzID0ge307XG4gICAgdGhpcy52YWx1ZVN1YnNjcmlwdGlvbnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgIHRoaXMucHJldk1vdGlvblZhbHVlcyA9IHt9O1xuICAgIHRoaXMuZXZlbnRzID0ge307XG4gICAgdGhpcy5wcm9wRXZlbnRTdWJzY3JpcHRpb25zID0ge307XG4gICAgdGhpcy5ub3RpZnlVcGRhdGUgPSAoKSA9PiB0aGlzLm5vdGlmeShcIlVwZGF0ZVwiLCB0aGlzLmxhdGVzdFZhbHVlcyk7XG4gICAgdGhpcy5yZW5kZXIgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuY3VycmVudClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgdGhpcy50cmlnZ2VyQnVpbGQoKTtcbiAgICAgIHRoaXMucmVuZGVySW5zdGFuY2UodGhpcy5jdXJyZW50LCB0aGlzLnJlbmRlclN0YXRlLCB0aGlzLnByb3BzLnN0eWxlLCB0aGlzLnByb2plY3Rpb24pO1xuICAgIH07XG4gICAgdGhpcy5yZW5kZXJTY2hlZHVsZWRBdCA9IDA7XG4gICAgdGhpcy5zY2hlZHVsZVJlbmRlciA9ICgpID0+IHtcbiAgICAgIGNvbnN0IG5vdzIgPSB0aW1lLm5vdygpO1xuICAgICAgaWYgKHRoaXMucmVuZGVyU2NoZWR1bGVkQXQgPCBub3cyKSB7XG4gICAgICAgIHRoaXMucmVuZGVyU2NoZWR1bGVkQXQgPSBub3cyO1xuICAgICAgICBmcmFtZS5yZW5kZXIodGhpcy5yZW5kZXIsIGZhbHNlLCB0cnVlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IHsgbGF0ZXN0VmFsdWVzLCByZW5kZXJTdGF0ZSwgb25VcGRhdGUgfSA9IHZpc3VhbFN0YXRlO1xuICAgIHRoaXMub25VcGRhdGUgPSBvblVwZGF0ZTtcbiAgICB0aGlzLmxhdGVzdFZhbHVlcyA9IGxhdGVzdFZhbHVlcztcbiAgICB0aGlzLmJhc2VUYXJnZXQgPSB7IC4uLmxhdGVzdFZhbHVlcyB9O1xuICAgIHRoaXMuaW5pdGlhbFZhbHVlcyA9IHByb3BzLmluaXRpYWwgPyB7IC4uLmxhdGVzdFZhbHVlcyB9IDoge307XG4gICAgdGhpcy5yZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlO1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLnByZXNlbmNlQ29udGV4dCA9IHByZXNlbmNlQ29udGV4dDtcbiAgICB0aGlzLmRlcHRoID0gcGFyZW50ID8gcGFyZW50LmRlcHRoICsgMSA6IDA7XG4gICAgdGhpcy5yZWR1Y2VkTW90aW9uQ29uZmlnID0gcmVkdWNlZE1vdGlvbkNvbmZpZztcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMuYmxvY2tJbml0aWFsQW5pbWF0aW9uID0gQm9vbGVhbihibG9ja0luaXRpYWxBbmltYXRpb24pO1xuICAgIHRoaXMuaXNDb250cm9sbGluZ1ZhcmlhbnRzID0gaXNDb250cm9sbGluZ1ZhcmlhbnRzKHByb3BzKTtcbiAgICB0aGlzLmlzVmFyaWFudE5vZGUgPSBpc1ZhcmlhbnROb2RlKHByb3BzKTtcbiAgICBpZiAodGhpcy5pc1ZhcmlhbnROb2RlKSB7XG4gICAgICB0aGlzLnZhcmlhbnRDaGlsZHJlbiA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgfVxuICAgIHRoaXMubWFudWFsbHlBbmltYXRlT25Nb3VudCA9IEJvb2xlYW4ocGFyZW50ICYmIHBhcmVudC5jdXJyZW50KTtcbiAgICBjb25zdCB7IHdpbGxDaGFuZ2UsIC4uLmluaXRpYWxNb3Rpb25WYWx1ZXMgfSA9IHRoaXMuc2NyYXBlTW90aW9uVmFsdWVzRnJvbVByb3BzKHByb3BzLCB7fSwgdGhpcyk7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gaW5pdGlhbE1vdGlvblZhbHVlcykge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbml0aWFsTW90aW9uVmFsdWVzW2tleV07XG4gICAgICBpZiAobGF0ZXN0VmFsdWVzW2tleV0gIT09I
10617HZvaWQgMCAmJiBpc01vdGlvblZhbHVlKHZhbHVlKSkge1xuICAgICAgICB2YWx1ZS5zZXQobGF0ZXN0VmFsdWVzW2tleV0sIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgbW91bnQoaW5zdGFuY2UpIHtcbiAgICB0aGlzLmN1cnJlbnQgPSBpbnN0YW5jZTtcbiAgICB2aXN1YWxFbGVtZW50U3RvcmUuc2V0KGluc3RhbmNlLCB0aGlzKTtcbiAgICBpZiAodGhpcy5wcm9qZWN0aW9uICYmICF0aGlzLnByb2plY3Rpb24uaW5zdGFuY2UpIHtcbiAgICAgIHRoaXMucHJvamVjdGlvbi5tb3VudChpbnN0YW5jZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhcmVudCAmJiB0aGlzLmlzVmFyaWFudE5vZGUgJiYgIXRoaXMuaXNDb250cm9sbGluZ1ZhcmlhbnRzKSB7XG4gICAgICB0aGlzLnJlbW92ZUZyb21WYXJpYW50VHJlZSA9IHRoaXMucGFyZW50LmFkZFZhcmlhbnRDaGlsZCh0aGlzKTtcbiAgICB9XG4gICAgdGhpcy52YWx1ZXMuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4gdGhpcy5iaW5kVG9Nb3Rpb25WYWx1ZShrZXksIHZhbHVlKSk7XG4gICAgaWYgKCFoYXNSZWR1Y2VkTW90aW9uTGlzdGVuZXIuY3VycmVudCkge1xuICAgICAgaW5pdFByZWZlcnNSZWR1Y2VkTW90aW9uKCk7XG4gICAgfVxuICAgIHRoaXMuc2hvdWxkUmVkdWNlTW90aW9uID0gdGhpcy5yZWR1Y2VkTW90aW9uQ29uZmlnID09PSBcIm5ldmVyXCIgPyBmYWxzZSA6IHRoaXMucmVkdWNlZE1vdGlvbkNvbmZpZyA9PT0gXCJhbHdheXNcIiA/IHRydWUgOiBwcmVmZXJzUmVkdWNlZE1vdGlvbi5jdXJyZW50O1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIHdhcm5PbmNlKHRoaXMuc2hvdWxkUmVkdWNlTW90aW9uICE9PSB0cnVlLCBcIllvdSBoYXZlIFJlZHVjZWQgTW90aW9uIGVuYWJsZWQgb24geW91ciBkZXZpY2UuIEFuaW1hdGlvbnMgbWF5IG5vdCBhcHBlYXIgYXMgZXhwZWN0ZWQuXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wYXJlbnQpXG4gICAgICB0aGlzLnBhcmVudC5jaGlsZHJlbi5hZGQodGhpcyk7XG4gICAgdGhpcy51cGRhdGUodGhpcy5wcm9wcywgdGhpcy5wcmVzZW5jZUNvbnRleHQpO1xuICB9XG4gIHVubW91bnQoKSB7XG4gICAgdmlzdWFsRWxlbWVudFN0b3JlLmRlbGV0ZSh0aGlzLmN1cnJlbnQpO1xuICAgIHRoaXMucHJvamVjdGlvbiAmJiB0aGlzLnByb2plY3Rpb24udW5tb3VudCgpO1xuICAgIGNhbmNlbEZyYW1lKHRoaXMubm90aWZ5VXBkYXRlKTtcbiAgICBjYW5jZWxGcmFtZSh0aGlzLnJlbmRlcik7XG4gICAgdGhpcy52YWx1ZVN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocmVtb3ZlKSA9PiByZW1vdmUoKSk7XG4gICAgdGhpcy52YWx1ZVN1YnNjcmlwdGlvbnMuY2xlYXIoKTtcbiAgICB0aGlzLnJlbW92ZUZyb21WYXJpYW50VHJlZSAmJiB0aGlzLnJlbW92ZUZyb21WYXJpYW50VHJlZSgpO1xuICAgIHRoaXMucGFyZW50ICYmIHRoaXMucGFyZW50LmNoaWxkcmVuLmRlbGV0ZSh0aGlzKTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmV2ZW50cykge1xuICAgICAgdGhpcy5ldmVudHNba2V5XS5jbGVhcigpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmZlYXR1cmVzKSB7XG4gICAgICBjb25zdCBmZWF0dXJlID0gdGhpcy5mZWF0dXJlc1trZXldO1xuICAgICAgaWYgKGZlYXR1cmUpIHtcbiAgICAgICAgZmVhdHVyZS51bm1vdW50KCk7XG4gICAgICAgIGZlYXR1cmUuaXNNb3VudGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG4gIH1cbiAgYmluZFRvTW90aW9uVmFsdWUoa2V5LCB2YWx1ZSkge1xuICAgIGlmICh0aGlzLnZhbHVlU3Vic2NyaXB0aW9ucy5oYXMoa2V5KSkge1xuICAgICAgdGhpcy52YWx1ZVN1YnNjcmlwdGlvbnMuZ2V0KGtleSkoKTtcbiAgICB9XG4gICAgY29uc3QgdmFsdWVJc1RyYW5zZm9ybSA9IHRyYW5zZm9ybVByb3BzLmhhcyhrZXkpO1xuICAgIGNvbnN0IHJlbW92ZU9uQ2hhbmdlID0gdmFsdWUub24oXCJjaGFuZ2VcIiwgKGxhdGVzdFZhbHVlKSA9PiB7XG4gICAgICB0aGlzLmxhdGVzdFZhbHVlc1trZXldID0gbGF0ZXN0VmFsdWU7XG4gICAgICB0aGlzLnByb3BzLm9uVXBkYXRlICYmIGZyYW1lLnByZVJlbmRlcih0aGlzLm5vdGlmeVVwZGF0ZSk7XG4gICAgICBpZiAodmFsdWVJc1RyYW5zZm9ybSAmJiB0aGlzLnByb2plY3Rpb24pIHtcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uLmlzVHJhbnNmb3JtRGlydHkgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGNvbnN0IHJlbW92ZU9uUmVuZGVyUmVxdWVzdCA9IHZhbHVlLm9uKFwicmVuZGVyUmVxdWVzdFwiLCB0aGlzLnNjaGVkdWxlUmVuZGVyKTtcbiAgICBsZXQgcmVtb3ZlU3luY0NoZWNrO1xuICAgIGlmICh3aW5kb3cuTW90aW9uQ2hlY2tBcHBlYXJTeW5jKSB7XG4gICAgICByZW1vdmVTeW5jQ2hlY2sgPSB3aW5kb3cuTW90aW9uQ2hlY2tBcHBlYXJTeW5jKHRoaXMsIGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlU3Vic2NyaXB0aW9ucy5zZXQoa2V5LCAoKSA9PiB7XG4gICAgICByZW1vdmVPbkNoYW5nZSgpO1xuICAgICAgcmVtb3ZlT25SZW5kZXJSZXF1ZXN0KCk7XG4gICAgICBpZiAocmVtb3ZlU3luY0NoZWNrKVxuICAgICAgICByZW1vdmVTeW5jQ2hlY2soKTtcbiAgICAgIGlmICh2YWx1ZS5vd25lcilcbiAgICAgICAgdmFsdWUuc3RvcCgpO1xuICAgIH0pO1xuICB9XG4gIHNvcnROb2RlUG9zaXRpb24ob3RoZXIpIHtcbiAgICBpZiAoIXRoaXMuY3VycmVudCB8fCAhdGhpcy5zb3J0SW5zdGFuY2VOb2RlUG9zaXRpb24gfHwgdGhpcy50eXBlICE9PSBvdGhlci50eXBlKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc29ydEluc3RhbmNlTm9kZVBvc2l0aW9uKHRoaXMuY3VycmVudCwgb3RoZXIuY3VycmVudCk7XG4gIH1cbiAgdXBkYXRlRmVhdHVyZXMoKSB7XG4gICAgbGV0IGtleSA9IFwiYW5pbWF0aW9uXCI7XG4gICAgZm9yIChrZXkgaW4gZmVhdHVyZURlZmluaXRpb25zKSB7XG4gICAgICBjb25zdCBmZWF0dXJlRGVmaW5pdGlvbiA9IGZlYXR1cmVEZWZpbml0aW9uc1trZXldO1xuICAgICAgaWYgKCFmZWF0dXJlRGVmaW5pdGlvbilcbiAgICAgICAgY29udGludWU7XG4gICAgICBjb25zdCB7IGlzRW5hYmxlZCwgRmVhdHVyZTogRmVhdHVyZUNvbnN0cnVjdG9yIH0gPSBmZWF0dXJlRGVmaW5pdGlvbjtcbiAgICAgIGlmICghdGhpcy5mZWF0dXJlc1trZXldICYmIEZlYXR1cmVDb25zdHJ1Y3RvciAmJiBpc0VuYWJsZWQodGhpcy5wcm9wcykpIHtcbiAgICAgICAgdGhpcy5mZWF0dXJlc1trZXldID0gbmV3IEZlYXR1cmVDb25zdHJ1Y3Rvcih0aGlzKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZlYXR1cmVzW2tleV0pIHtcbiAgICAgICAgY29uc3QgZmVhdHVyZSA9IHRoaXMuZmVhdHVyZXNba2V5XTtcbiAgICAgICAgaWYgKGZlYXR1cmUuaXNNb3VudGVkKSB7XG4gICAgICAgICAgZmVhdHVyZS51cGRhdGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmZWF0dXJlLm1vdW50KCk7XG4gICAgICAgICAgZmVhdHVyZS5pc01vdW50ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gI
10617HRyaWdnZXJCdWlsZCgpIHtcbiAgICB0aGlzLmJ1aWxkKHRoaXMucmVuZGVyU3RhdGUsIHRoaXMubGF0ZXN0VmFsdWVzLCB0aGlzLnByb3BzKTtcbiAgfVxuICAvKipcbiAgICogTWVhc3VyZSB0aGUgY3VycmVudCB2aWV3cG9ydCBib3ggd2l0aCBvciB3aXRob3V0IHRyYW5zZm9ybXMuXG4gICAqIE9ubHkgbWVhc3VyZXMgYXhpcy1hbGlnbmVkIGJveGVzLCByb3RhdGUgYW5kIHNrZXcgbXVzdCBiZSBtYW51YWxseVxuICAgKiByZW1vdmVkIHdpdGggYSByZS1yZW5kZXIgdG8gd29yay5cbiAgICovXG4gIG1lYXN1cmVWaWV3cG9ydEJveCgpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50ID8gdGhpcy5tZWFzdXJlSW5zdGFuY2VWaWV3cG9ydEJveCh0aGlzLmN1cnJlbnQsIHRoaXMucHJvcHMpIDogY3JlYXRlQm94KCk7XG4gIH1cbiAgZ2V0U3RhdGljVmFsdWUoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMubGF0ZXN0VmFsdWVzW2tleV07XG4gIH1cbiAgc2V0U3RhdGljVmFsdWUoa2V5LCB2YWx1ZSkge1xuICAgIHRoaXMubGF0ZXN0VmFsdWVzW2tleV0gPSB2YWx1ZTtcbiAgfVxuICAvKipcbiAgICogVXBkYXRlIHRoZSBwcm92aWRlZCBwcm9wcy4gRW5zdXJlIGFueSBuZXdseS1hZGRlZCBtb3Rpb24gdmFsdWVzIGFyZVxuICAgKiBhZGRlZCB0byBvdXIgbWFwLCBvbGQgb25lcyByZW1vdmVkLCBhbmQgbGlzdGVuZXJzIHVwZGF0ZWQuXG4gICAqL1xuICB1cGRhdGUocHJvcHMsIHByZXNlbmNlQ29udGV4dCkge1xuICAgIGlmIChwcm9wcy50cmFuc2Zvcm1UZW1wbGF0ZSB8fCB0aGlzLnByb3BzLnRyYW5zZm9ybVRlbXBsYXRlKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlUmVuZGVyKCk7XG4gICAgfVxuICAgIHRoaXMucHJldlByb3BzID0gdGhpcy5wcm9wcztcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5wcmV2UHJlc2VuY2VDb250ZXh0ID0gdGhpcy5wcmVzZW5jZUNvbnRleHQ7XG4gICAgdGhpcy5wcmVzZW5jZUNvbnRleHQgPSBwcmVzZW5jZUNvbnRleHQ7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wRXZlbnRIYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0gcHJvcEV2ZW50SGFuZGxlcnNbaV07XG4gICAgICBpZiAodGhpcy5wcm9wRXZlbnRTdWJzY3JpcHRpb25zW2tleV0pIHtcbiAgICAgICAgdGhpcy5wcm9wRXZlbnRTdWJzY3JpcHRpb25zW2tleV0oKTtcbiAgICAgICAgZGVsZXRlIHRoaXMucHJvcEV2ZW50U3Vic2NyaXB0aW9uc1trZXldO1xuICAgICAgfVxuICAgICAgY29uc3QgbGlzdGVuZXJOYW1lID0gXCJvblwiICsga2V5O1xuICAgICAgY29uc3QgbGlzdGVuZXIgPSBwcm9wc1tsaXN0ZW5lck5hbWVdO1xuICAgICAgaWYgKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMucHJvcEV2ZW50U3Vic2NyaXB0aW9uc1trZXldID0gdGhpcy5vbihrZXksIGxpc3RlbmVyKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5wcmV2TW90aW9uVmFsdWVzID0gdXBkYXRlTW90aW9uVmFsdWVzRnJvbVByb3BzKHRoaXMsIHRoaXMuc2NyYXBlTW90aW9uVmFsdWVzRnJvbVByb3BzKHByb3BzLCB0aGlzLnByZXZQcm9wcywgdGhpcyksIHRoaXMucHJldk1vdGlvblZhbHVlcyk7XG4gICAgaWYgKHRoaXMuaGFuZGxlQ2hpbGRNb3Rpb25WYWx1ZSkge1xuICAgICAgdGhpcy5oYW5kbGVDaGlsZE1vdGlvblZhbHVlKCk7XG4gICAgfVxuICAgIHRoaXMub25VcGRhdGUgJiYgdGhpcy5vblVwZGF0ZSh0aGlzKTtcbiAgfVxuICBnZXRQcm9wcygpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9wcztcbiAgfVxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdmFyaWFudCBkZWZpbml0aW9uIHdpdGggYSBnaXZlbiBuYW1lLlxuICAgKi9cbiAgZ2V0VmFyaWFudChuYW1lKSB7XG4gICAgcmV0dXJuIHRoaXMucHJvcHMudmFyaWFudHMgPyB0aGlzLnByb3BzLnZhcmlhbnRzW25hbWVdIDogdm9pZCAwO1xuICB9XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBkZWZpbmVkIGRlZmF1bHQgdHJhbnNpdGlvbiBvbiB0aGlzIGNvbXBvbmVudC5cbiAgICovXG4gIGdldERlZmF1bHRUcmFuc2l0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnRyYW5zaXRpb247XG4gIH1cbiAgZ2V0VHJhbnNmb3JtUGFnZVBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLnByb3BzLnRyYW5zZm9ybVBhZ2VQb2ludDtcbiAgfVxuICBnZXRDbG9zZXN0VmFyaWFudE5vZGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNWYXJpYW50Tm9kZSA/IHRoaXMgOiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LmdldENsb3Nlc3RWYXJpYW50Tm9kZSgpIDogdm9pZCAwO1xuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBjaGlsZCB2aXN1YWwgZWxlbWVudCB0byBvdXIgc2V0IG9mIGNoaWxkcmVuLlxuICAgKi9cbiAgYWRkVmFyaWFudENoaWxkKGNoaWxkKSB7XG4gICAgY29uc3QgY2xvc2VzdFZhcmlhbnROb2RlID0gdGhpcy5nZXRDbG9zZXN0VmFyaWFudE5vZGUoKTtcbiAgICBpZiAoY2xvc2VzdFZhcmlhbnROb2RlKSB7XG4gICAgICBjbG9zZXN0VmFyaWFudE5vZGUudmFyaWFudENoaWxkcmVuICYmIGNsb3Nlc3RWYXJpYW50Tm9kZS52YXJpYW50Q2hpbGRyZW4uYWRkKGNoaWxkKTtcbiAgICAgIHJldHVybiAoKSA9PiBjbG9zZXN0VmFyaWFudE5vZGUudmFyaWFudENoaWxkcmVuLmRlbGV0ZShjaGlsZCk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBBZGQgYSBtb3Rpb24gdmFsdWUgYW5kIGJpbmQgaXQgdG8gdGhpcyB2aXN1YWwgZWxlbWVudC5cbiAgICovXG4gIGFkZFZhbHVlKGtleSwgdmFsdWUpIHtcbiAgICBjb25zdCBleGlzdGluZ1ZhbHVlID0gdGhpcy52YWx1ZXMuZ2V0KGtleSk7XG4gICAgaWYgKHZhbHVlICE9PSBleGlzdGluZ1ZhbHVlKSB7XG4gICAgICBpZiAoZXhpc3RpbmdWYWx1ZSlcbiAgICAgICAgdGhpcy5yZW1vdmVWYWx1ZShrZXkpO1xuICAgICAgdGhpcy5iaW5kVG9Nb3Rpb25WYWx1ZShrZXksIHZhbHVlKTtcbiAgICAgIHRoaXMudmFsdWVzLnNldChrZXksIHZhbHVlKTtcbiAgICAgIHRoaXMubGF0ZXN0VmFsdWVzW2tleV0gPSB2YWx1ZS5nZXQoKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFJlbW92ZSBhIG1vdGlvbiB2YWx1ZSBhbmQgdW5iaW5kIGFueSBhY3RpdmUgc3Vic2NyaXB0aW9ucy5cbiAgICovXG4gIHJlbW92ZVZhbHVlKGtleSkge1xuICAgIHRoaXMudmFsdWVzLmRlbGV0ZShrZXkpO1xuICAgIGNvbnN0IHVuc3Vic2NyaWJlID0gdGhpcy52YWx1ZVN1YnNjcmlwdGlvbnMuZ2V0KGtleSk7XG4gICAgaWYgKHVuc3Vic2NyaWJlKSB7XG4gICAgICB1bnN1YnNjcmliZSgpO1xuICAgICAgdGhpcy52YWx1ZVN1YnNjcmlwdGlvbnMuZGVsZXRlKGtleSk7XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLmxhdGVzdFZhbHVlc1trZXldO1xuICAgIHRoaXMucmVtb3ZlVmFsdWVGcm9tUmVuZGVyU3RhdGUoa2V5LCB0aGlzLnJlbmRlclN0YXRlKTtcbiAgfVxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciB3ZSBoYXZlIGEgbW90aW9uIHZhbHVlIGZvciB0aGlzIGtleVxuICAgKi9cbiAgaGFzVmFsdWUoa2V5KSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzLmhhcyhrZXkpO1xuICB9XG4gIGdldFZhbHVlKGtleSwgZGVmYXVsdFZhbHVlKSB7XG4gICAgaWYgKHRoaXMucHJvcHMudmFsdWVzICYmIHRoaXMucHJvcHMudmFsdWVzW2tleV0pIHtcbiAgICAgIHJldHVybi
10617B0aGlzLnByb3BzLnZhbHVlc1trZXldO1xuICAgIH1cbiAgICBsZXQgdmFsdWUgPSB0aGlzLnZhbHVlcy5nZXQoa2V5KTtcbiAgICBpZiAodmFsdWUgPT09IHZvaWQgMCAmJiBkZWZhdWx0VmFsdWUgIT09IHZvaWQgMCkge1xuICAgICAgdmFsdWUgPSBtb3Rpb25WYWx1ZShkZWZhdWx0VmFsdWUgPT09IG51bGwgPyB2b2lkIDAgOiBkZWZhdWx0VmFsdWUsIHsgb3duZXI6IHRoaXMgfSk7XG4gICAgICB0aGlzLmFkZFZhbHVlKGtleSwgdmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIElmIHdlJ3JlIHRyeWluZyB0byBhbmltYXRlIHRvIGEgcHJldmlvdXNseSB1bmVuY291bnRlcmVkIHZhbHVlLFxuICAgKiB3ZSBuZWVkIHRvIGNoZWNrIGZvciBpdCBpbiBvdXIgc3RhdGUgYW5kIGFzIGEgbGFzdCByZXNvcnQgcmVhZCBpdFxuICAgKiBkaXJlY3RseSBmcm9tIHRoZSBpbnN0YW5jZSAod2hpY2ggbWlnaHQgaGF2ZSBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMpLlxuICAgKi9cbiAgcmVhZFZhbHVlKGtleSwgdGFyZ2V0KSB7XG4gICAgdmFyIF9hO1xuICAgIGxldCB2YWx1ZSA9IHRoaXMubGF0ZXN0VmFsdWVzW2tleV0gIT09IHZvaWQgMCB8fCAhdGhpcy5jdXJyZW50ID8gdGhpcy5sYXRlc3RWYWx1ZXNba2V5XSA6IChfYSA9IHRoaXMuZ2V0QmFzZVRhcmdldEZyb21Qcm9wcyh0aGlzLnByb3BzLCBrZXkpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiB0aGlzLnJlYWRWYWx1ZUZyb21JbnN0YW5jZSh0aGlzLmN1cnJlbnQsIGtleSwgdGhpcy5vcHRpb25zKTtcbiAgICBpZiAodmFsdWUgIT09IHZvaWQgMCAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAoaXNOdW1lcmljYWxTdHJpbmcodmFsdWUpIHx8IGlzWmVyb1ZhbHVlU3RyaW5nKHZhbHVlKSkpIHtcbiAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoIWZpbmRWYWx1ZVR5cGUodmFsdWUpICYmIGNvbXBsZXgudGVzdCh0YXJnZXQpKSB7XG4gICAgICAgIHZhbHVlID0gZ2V0QW5pbWF0YWJsZU5vbmUyKGtleSwgdGFyZ2V0KTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0QmFzZVRhcmdldChrZXksIGlzTW90aW9uVmFsdWUodmFsdWUpID8gdmFsdWUuZ2V0KCkgOiB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBpc01vdGlvblZhbHVlKHZhbHVlKSA/IHZhbHVlLmdldCgpIDogdmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIFNldCB0aGUgYmFzZSB0YXJnZXQgdG8gbGF0ZXIgYW5pbWF0ZSBiYWNrIHRvLiBUaGlzIGlzIGN1cnJlbnRseVxuICAgKiBvbmx5IGh5ZHJhdGVkIG9uIGNyZWF0aW9uIGFuZCB3aGVuIHdlIGZpcnN0IHJlYWQgYSB2YWx1ZS5cbiAgICovXG4gIHNldEJhc2VUYXJnZXQoa2V5LCB2YWx1ZSkge1xuICAgIHRoaXMuYmFzZVRhcmdldFtrZXldID0gdmFsdWU7XG4gIH1cbiAgLyoqXG4gICAqIEZpbmQgdGhlIGJhc2UgdGFyZ2V0IGZvciBhIHZhbHVlIHRoYXRzIGJlZW4gcmVtb3ZlZCBmcm9tIGFsbCBhbmltYXRpb25cbiAgICogcHJvcHMuXG4gICAqL1xuICBnZXRCYXNlVGFyZ2V0KGtleSkge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCB7IGluaXRpYWwgfSA9IHRoaXMucHJvcHM7XG4gICAgbGV0IHZhbHVlRnJvbUluaXRpYWw7XG4gICAgaWYgKHR5cGVvZiBpbml0aWFsID09PSBcInN0cmluZ1wiIHx8IHR5cGVvZiBpbml0aWFsID09PSBcIm9iamVjdFwiKSB7XG4gICAgICBjb25zdCB2YXJpYW50ID0gcmVzb2x2ZVZhcmlhbnRGcm9tUHJvcHModGhpcy5wcm9wcywgaW5pdGlhbCwgKF9hID0gdGhpcy5wcmVzZW5jZUNvbnRleHQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5jdXN0b20pO1xuICAgICAgaWYgKHZhcmlhbnQpIHtcbiAgICAgICAgdmFsdWVGcm9tSW5pdGlhbCA9IHZhcmlhbnRba2V5XTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGluaXRpYWwgJiYgdmFsdWVGcm9tSW5pdGlhbCAhPT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gdmFsdWVGcm9tSW5pdGlhbDtcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5nZXRCYXNlVGFyZ2V0RnJvbVByb3BzKHRoaXMucHJvcHMsIGtleSk7XG4gICAgaWYgKHRhcmdldCAhPT0gdm9pZCAwICYmICFpc01vdGlvblZhbHVlKHRhcmdldCkpXG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIHJldHVybiB0aGlzLmluaXRpYWxWYWx1ZXNba2V5XSAhPT0gdm9pZCAwICYmIHZhbHVlRnJvbUluaXRpYWwgPT09IHZvaWQgMCA/IHZvaWQgMCA6IHRoaXMuYmFzZVRhcmdldFtrZXldO1xuICB9XG4gIG9uKGV2ZW50TmFtZSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIXRoaXMuZXZlbnRzW2V2ZW50TmFtZV0pIHtcbiAgICAgIHRoaXMuZXZlbnRzW2V2ZW50TmFtZV0gPSBuZXcgU3Vic2NyaXB0aW9uTWFuYWdlcigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5ldmVudHNbZXZlbnROYW1lXS5hZGQoY2FsbGJhY2spO1xuICB9XG4gIG5vdGlmeShldmVudE5hbWUsIC4uLmFyZ3MpIHtcbiAgICBpZiAodGhpcy5ldmVudHNbZXZlbnROYW1lXSkge1xuICAgICAgdGhpcy5ldmVudHNbZXZlbnROYW1lXS5ub3RpZnkoLi4uYXJncyk7XG4gICAgfVxuICB9XG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL0RPTVZpc3VhbEVsZW1lbnQubWpzXG52YXIgRE9NVmlzdWFsRWxlbWVudCA9IGNsYXNzIGV4dGVuZHMgVmlzdWFsRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy5LZXlmcmFtZVJlc29sdmVyID0gRE9NS2V5ZnJhbWVzUmVzb2x2ZXI7XG4gIH1cbiAgc29ydEluc3RhbmNlTm9kZVBvc2l0aW9uKGEsIGIpIHtcbiAgICByZXR1cm4gYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihiKSAmIDIgPyAxIDogLTE7XG4gIH1cbiAgZ2V0QmFzZVRhcmdldEZyb21Qcm9wcyhwcm9wcywga2V5KSB7XG4gICAgcmV0dXJuIHByb3BzLnN0eWxlID8gcHJvcHMuc3R5bGVba2V5XSA6IHZvaWQgMDtcbiAgfVxuICByZW1vdmVWYWx1ZUZyb21SZW5kZXJTdGF0ZShrZXksIHsgdmFycywgc3R5bGUgfSkge1xuICAgIGRlbGV0ZSB2YXJzW2tleV07XG4gICAgZGVsZXRlIHN0eWxlW2tleV07XG4gIH1cbiAgaGFuZGxlQ2hpbGRNb3Rpb25WYWx1ZSgpIHtcbiAgICBpZiAodGhpcy5jaGlsZFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5jaGlsZFN1YnNjcmlwdGlvbigpO1xuICAgICAgZGVsZXRlIHRoaXMuY2hpbGRTdWJzY3JpcHRpb247XG4gICAgfVxuICAgIGNvbnN0IHsgY2hpbGRyZW4gfSA9IHRoaXMucHJvcHM7XG4gICAgaWYgKGlzTW90aW9uVmFsdWUoY2hpbGRyZW4pKSB7XG4gICAgICB0aGlzLmNoaWxkU3Vic2NyaXB0aW9uID0gY2hpbGRyZW4ub24oXCJjaGFuZ2VcIiwgKGxhdGVzdCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50KSB7XG4gICAgICAgICAgdGhpcy5jdXJyZW50LnRleHRDb250ZW50ID0gYCR7bGF0ZXN0fWA7XG4gICAgICAgI
10617H1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2h0bWwvSFRNTFZpc3VhbEVsZW1lbnQubWpzXG5mdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlMihlbGVtZW50KSB7XG4gIHJldHVybiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbn1cbnZhciBIVE1MVmlzdWFsRWxlbWVudCA9IGNsYXNzIGV4dGVuZHMgRE9NVmlzdWFsRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy50eXBlID0gXCJodG1sXCI7XG4gICAgdGhpcy5yZW5kZXJJbnN0YW5jZSA9IHJlbmRlckhUTUw7XG4gIH1cbiAgcmVhZFZhbHVlRnJvbUluc3RhbmNlKGluc3RhbmNlLCBrZXkpIHtcbiAgICBpZiAodHJhbnNmb3JtUHJvcHMuaGFzKGtleSkpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRUeXBlID0gZ2V0RGVmYXVsdFZhbHVlVHlwZShrZXkpO1xuICAgICAgcmV0dXJuIGRlZmF1bHRUeXBlID8gZGVmYXVsdFR5cGUuZGVmYXVsdCB8fCAwIDogMDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUyKGluc3RhbmNlKTtcbiAgICAgIGNvbnN0IHZhbHVlID0gKGlzQ1NTVmFyaWFibGVOYW1lKGtleSkgPyBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoa2V5KSA6IGNvbXB1dGVkU3R5bGVba2V5XSkgfHwgMDtcbiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS50cmltKCkgOiB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgbWVhc3VyZUluc3RhbmNlVmlld3BvcnRCb3goaW5zdGFuY2UsIHsgdHJhbnNmb3JtUGFnZVBvaW50IH0pIHtcbiAgICByZXR1cm4gbWVhc3VyZVZpZXdwb3J0Qm94KGluc3RhbmNlLCB0cmFuc2Zvcm1QYWdlUG9pbnQpO1xuICB9XG4gIGJ1aWxkKHJlbmRlclN0YXRlLCBsYXRlc3RWYWx1ZXMsIHByb3BzKSB7XG4gICAgYnVpbGRIVE1MU3R5bGVzKHJlbmRlclN0YXRlLCBsYXRlc3RWYWx1ZXMsIHByb3BzLnRyYW5zZm9ybVRlbXBsYXRlKTtcbiAgfVxuICBzY3JhcGVNb3Rpb25WYWx1ZXNGcm9tUHJvcHMocHJvcHMsIHByZXZQcm9wcywgdmlzdWFsRWxlbWVudCkge1xuICAgIHJldHVybiBzY3JhcGVNb3Rpb25WYWx1ZXNGcm9tUHJvcHMocHJvcHMsIHByZXZQcm9wcywgdmlzdWFsRWxlbWVudCk7XG4gIH1cbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9zdmcvU1ZHVmlzdWFsRWxlbWVudC5tanNcbnZhciBpbXBvcnRfZGlzdDc5OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODAwID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODAxID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIFNWR1Zpc3VhbEVsZW1lbnQgPSBjbGFzcyBleHRlbmRzIERPTVZpc3VhbEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMudHlwZSA9IFwic3ZnXCI7XG4gICAgdGhpcy5pc1NWR1RhZyA9IGZhbHNlO1xuICAgIHRoaXMubWVhc3VyZUluc3RhbmNlVmlld3BvcnRCb3ggPSBjcmVhdGVCb3g7XG4gIH1cbiAgZ2V0QmFzZVRhcmdldEZyb21Qcm9wcyhwcm9wcywga2V5KSB7XG4gICAgcmV0dXJuIHByb3BzW2tleV07XG4gIH1cbiAgcmVhZFZhbHVlRnJvbUluc3RhbmNlKGluc3RhbmNlLCBrZXkpIHtcbiAgICBpZiAodHJhbnNmb3JtUHJvcHMuaGFzKGtleSkpIHtcbiAgICAgIGNvbnN0IGRlZmF1bHRUeXBlID0gZ2V0RGVmYXVsdFZhbHVlVHlwZShrZXkpO1xuICAgICAgcmV0dXJuIGRlZmF1bHRUeXBlID8gZGVmYXVsdFR5cGUuZGVmYXVsdCB8fCAwIDogMDtcbiAgICB9XG4gICAga2V5ID0gIWNhbWVsQ2FzZUF0dHJpYnV0ZXMuaGFzKGtleSkgPyBjYW1lbFRvRGFzaChrZXkpIDoga2V5O1xuICAgIHJldHVybiBpbnN0YW5jZS5nZXRBdHRyaWJ1dGUoa2V5KTtcbiAgfVxuICBzY3JhcGVNb3Rpb25WYWx1ZXNGcm9tUHJvcHMocHJvcHMsIHByZXZQcm9wcywgdmlzdWFsRWxlbWVudCkge1xuICAgIHJldHVybiBzY3JhcGVNb3Rpb25WYWx1ZXNGcm9tUHJvcHMyKHByb3BzLCBwcmV2UHJvcHMsIHZpc3VhbEVsZW1lbnQpO1xuICB9XG4gIGJ1aWxkKHJlbmRlclN0YXRlLCBsYXRlc3RWYWx1ZXMsIHByb3BzKSB7XG4gICAgYnVpbGRTVkdBdHRycyhyZW5kZXJTdGF0ZSwgbGF0ZXN0VmFsdWVzLCB0aGlzLmlzU1ZHVGFnLCBwcm9wcy50cmFuc2Zvcm1UZW1wbGF0ZSk7XG4gIH1cbiAgcmVuZGVySW5zdGFuY2UoaW5zdGFuY2UsIHJlbmRlclN0YXRlLCBzdHlsZVByb3AsIHByb2plY3Rpb24pIHtcbiAgICByZW5kZXJTVkcoaW5zdGFuY2UsIHJlbmRlclN0YXRlLCBzdHlsZVByb3AsIHByb2plY3Rpb24pO1xuICB9XG4gIG1vdW50KGluc3RhbmNlKSB7XG4gICAgdGhpcy5pc1NWR1RhZyA9IGlzU1ZHVGFnKGluc3RhbmNlLnRhZ05hbWUpO1xuICAgIHN1cGVyLm1vdW50KGluc3RhbmNlKTtcbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2RvbS9jcmVhdGUtdmlzdWFsLWVsZW1lbnQubWpzXG52YXIgY3JlYXRlRG9tVmlzdWFsRWxlbWVudCA9IChDb21wb25lbnQzLCBvcHRpb25zKSA9PiB7XG4gIHJldHVybiBpc1NWR0NvbXBvbmVudChDb21wb25lbnQzKSA/IG5ldyBTVkdWaXN1YWxFbGVtZW50KG9wdGlvbnMpIDogbmV3IEhUTUxWaXN1YWxFbGVtZW50KG9wdGlvbnMsIHtcbiAgICBhbGxvd1Byb2plY3Rpb246IENvbXBvbmVudDMgIT09IGltcG9ydF9yZWFjdDI5LkZyYWdtZW50XG4gIH0pO1xufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2NvbXBvbmVudHMvbW90aW9uL2NyZWF0ZS5tanNcbnZhciBjcmVhdGVNb3Rpb25Db21wb25lbnQgPSBjcmVhdGVNb3Rpb25Db21wb25lbnRGYWN0b3J5KHtcbiAgLi4uYW5pbWF0aW9ucyxcbiAgLi4uZ2VzdHVyZUFuaW1hdGlvbnMsXG4gIC4uLmRyYWcsXG4gIC4uLmxheW91dFxufSwgY3JlYXRlRG9tVmlzdWFsRWxlbWVudCk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9jb21wb25lbnRzL21vdGlvbi9wcm94eS5tanNcbnZhciBtb3Rpb24gPSBjcmVhdGVET01Nb3Rpb25Db21wb25lbnRQcm94eShjcmVhdGVNb3Rpb25Db21wb25lbnQpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL2ZlYXR1cmVzLWFuaW1hdGlvbi5tanNcbnZhciBpbXBvcnRfZGlzdDgxMSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODEyID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0ODEzID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGRvbUFuaW1hdGlvbiA9IHtcbiAgcmVuZGVyZXI6IGNyZWF0ZURvbVZpc3VhbEVsZW1lbnQsXG4gIC4uLmFuaW1hdGlvbnMsXG4gIC4uLmdlc3R1cmVBbmltYXRpb25zXG59O1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL2ZlYXR1cmVzLW1heC5tanNcbnZhciBpbXBvcnRfZGlzdDgxNCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODE1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODE2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGRvbU1heCA9IHtcbiAgLi4uZG9tQW5pbWF0aW9uLFxuICAuLi5kcmFnLFxuICAuLi5sYXlvdXRcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9kb20vZmVhdHVyZXMtbWluLm1qc1xudmFyIGltcG9ydF9kaXN0ODE3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MTggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MTkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgZG9tTWluID0ge1xuICByZW5kZXJlcjogY3JlYXRlRG9tVmlzdWFsRWxlbWVudCxcbiAgLi4uYW5pbWF0aW9uc1xufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvdXNlLW1vdGlvbi12YWx1ZS1ldmVudC5tanNcbnZhciBpbXBvcnRfZGlzdDgyMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODIxID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODIyID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGltcG9ydF9yZWFjdDMwID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksIDEpO1xuZnVuY3Rpb24gdXNlTW90aW9uVmFsdWVFdmVudCh2YWx1ZSwgZXZlbnQsIGNhbGxiYWNrKSB7XG4gICgwLCBpbXBvcnRfcmVhY3QzMC51c2VJbnNlcnRpb25FZmZlY3QpKCgpID0+IHZhbHVlLm9uKGV2ZW50LCBjYWxsYmFjayksIFt2YWx1ZSwgZXZlbnQsIGNhbGxiYWNrXSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3ZhbHVlL3Njcm9sbC91c2UtZWxlbWVudC1zY3JvbGwubWpzXG52YXIgaW1wb3J0X2Rpc3Q4NjUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDg2NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDg2NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdXNlLXNjcm9sbC5tanNcbnZhciBpbXBvcnRfZGlzdDg2MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODYzID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODY0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGltcG9ydF9yZWFjdDMxID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3Njcm9sbC9pbmRleC5tanNcbnZhciBpbXBvcnRfZGlzdDg1OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODYwID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODYxID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3Njcm9sbC9vYnNlcnZlLm1qc1xudmFyIGltcG9ydF9kaXN0ODIzID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MjQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MjUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBvYnNlcnZlVGltZWxpbmUodXBkYXRlLCB0aW1lbGluZSkge1xuICBsZXQgcHJldlByb2dyZXNzO1xuICBjb25zdCBvbkZyYW1lID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgY3VycmVudFRpbWUgfSA9IHRpbWVsaW5lO1xuICAgIGNvbnN0IHBlcmNlbnRhZ2UgPSBjdXJyZW50VGltZSA9PT0gbnVsbCA/IDAgOiBjdXJyZW50VGltZS52YWx1ZTtcbiAgICBjb25zdCBwcm9ncmVzczIgPSBwZXJjZW50YWdlIC8gMTAwO1xuICAgIGlmIChwcmV2UHJvZ3Jlc3MgIT09IHByb2dyZXNzMikge1xuICAgICAgdXBkYXRlKHByb2dyZXNzMik7XG4gICAgfVxuICAgIHByZXZQcm9ncmVzcyA9IHByb2dyZXNzMjtcbiAgfTtcbiAgZnJhbWUudXBkYXRlKG9uRnJhbWUsIHRydWUpO1xuICByZXR1cm4gKCkgPT4gY2FuY2VsRnJhbWUob25GcmFtZSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9kb20vc2Nyb2xsL3RyYWNrLm1qc1xudmFyIGltcG9ydF9kaXN0ODU2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4NTcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4NTggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9kb20vcmVzaXplL2luZGV4Lm1qc1xudmFyIGltcG9ydF9kaXN0ODMyID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MzMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MzQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9kb20vcmVzaXplL2hhbmRsZS1lbGVtZW50Lm1qc1xudmFyIGltcG9ydF9kaXN0ODI2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MjcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MjggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgcmVzaXplSGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbnZhciBvYnNlcnZlcjtcbmZ1bmN0aW9uIGdldEVsZW1lbnRTaXplKHRhcmdldCwgYm9yZGVyQm94U2l6ZSkge1xuICBpZiAoYm9yZGVyQm94U2l6ZSkge1xuICAgIGNvbnN0IHsgaW5saW5lU2l6ZSwgYmxvY2tTaXplIH0gPSBib3JkZXJCb3hTaXplWzBdO1xuICAgIHJldHVybi
10617B7IHdpZHRoOiBpbmxpbmVTaXplLCBoZWlnaHQ6IGJsb2NrU2l6ZSB9O1xuICB9IGVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQgJiYgXCJnZXRCQm94XCIgaW4gdGFyZ2V0KSB7XG4gICAgcmV0dXJuIHRhcmdldC5nZXRCQm94KCk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdpZHRoOiB0YXJnZXQub2Zmc2V0V2lkdGgsXG4gICAgICBoZWlnaHQ6IHRhcmdldC5vZmZzZXRIZWlnaHRcbiAgICB9O1xuICB9XG59XG5mdW5jdGlvbiBub3RpZnlUYXJnZXQoeyB0YXJnZXQsIGNvbnRlbnRSZWN0LCBib3JkZXJCb3hTaXplIH0pIHtcbiAgdmFyIF9hO1xuICAoX2EgPSByZXNpemVIYW5kbGVycy5nZXQodGFyZ2V0KSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICBoYW5kbGVyKHtcbiAgICAgIHRhcmdldCxcbiAgICAgIGNvbnRlbnRTaXplOiBjb250ZW50UmVjdCxcbiAgICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gZ2V0RWxlbWVudFNpemUodGFyZ2V0LCBib3JkZXJCb3hTaXplKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5mdW5jdGlvbiBub3RpZnlBbGwoZW50cmllcykge1xuICBlbnRyaWVzLmZvckVhY2gobm90aWZ5VGFyZ2V0KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVJlc2l6ZU9ic2VydmVyKCkge1xuICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyID09PSBcInVuZGVmaW5lZFwiKVxuICAgIHJldHVybjtcbiAgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIobm90aWZ5QWxsKTtcbn1cbmZ1bmN0aW9uIHJlc2l6ZUVsZW1lbnQodGFyZ2V0LCBoYW5kbGVyKSB7XG4gIGlmICghb2JzZXJ2ZXIpXG4gICAgY3JlYXRlUmVzaXplT2JzZXJ2ZXIoKTtcbiAgY29uc3QgZWxlbWVudHMgPSByZXNvbHZlRWxlbWVudHModGFyZ2V0KTtcbiAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGxldCBlbGVtZW50SGFuZGxlcnMgPSByZXNpemVIYW5kbGVycy5nZXQoZWxlbWVudCk7XG4gICAgaWYgKCFlbGVtZW50SGFuZGxlcnMpIHtcbiAgICAgIGVsZW1lbnRIYW5kbGVycyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gICAgICByZXNpemVIYW5kbGVycy5zZXQoZWxlbWVudCwgZWxlbWVudEhhbmRsZXJzKTtcbiAgICB9XG4gICAgZWxlbWVudEhhbmRsZXJzLmFkZChoYW5kbGVyKTtcbiAgICBvYnNlcnZlciA9PT0gbnVsbCB8fCBvYnNlcnZlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50KTtcbiAgfSk7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgZWxlbWVudEhhbmRsZXJzID0gcmVzaXplSGFuZGxlcnMuZ2V0KGVsZW1lbnQpO1xuICAgICAgZWxlbWVudEhhbmRsZXJzID09PSBudWxsIHx8IGVsZW1lbnRIYW5kbGVycyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWxlbWVudEhhbmRsZXJzLmRlbGV0ZShoYW5kbGVyKTtcbiAgICAgIGlmICghKGVsZW1lbnRIYW5kbGVycyA9PT0gbnVsbCB8fCBlbGVtZW50SGFuZGxlcnMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGVsZW1lbnRIYW5kbGVycy5zaXplKSkge1xuICAgICAgICBvYnNlcnZlciA9PT0gbnVsbCB8fCBvYnNlcnZlciA9PT0gdm9pZCAwID8gdm9pZCAwIDogb2JzZXJ2ZXIudW5vYnNlcnZlKGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3Jlc2l6ZS9oYW5kbGUtd2luZG93Lm1qc1xudmFyIGltcG9ydF9kaXN0ODI5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MzAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MzEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgd2luZG93Q2FsbGJhY2tzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbnZhciB3aW5kb3dSZXNpemVIYW5kbGVyO1xuZnVuY3Rpb24gY3JlYXRlV2luZG93UmVzaXplSGFuZGxlcigpIHtcbiAgd2luZG93UmVzaXplSGFuZGxlciA9ICgpID0+IHtcbiAgICBjb25zdCBzaXplID0ge1xuICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICB9O1xuICAgIGNvbnN0IGluZm8gPSB7XG4gICAgICB0YXJnZXQ6IHdpbmRvdyxcbiAgICAgIHNpemUsXG4gICAgICBjb250ZW50U2l6ZTogc2l6ZVxuICAgIH07XG4gICAgd2luZG93Q2FsbGJhY2tzLmZvckVhY2goKGNhbGxiYWNrKSA9PiBjYWxsYmFjayhpbmZvKSk7XG4gIH07XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHdpbmRvd1Jlc2l6ZUhhbmRsZXIpO1xufVxuZnVuY3Rpb24gcmVzaXplV2luZG93KGNhbGxiYWNrKSB7XG4gIHdpbmRvd0NhbGxiYWNrcy5hZGQoY2FsbGJhY2spO1xuICBpZiAoIXdpbmRvd1Jlc2l6ZUhhbmRsZXIpXG4gICAgY3JlYXRlV2luZG93UmVzaXplSGFuZGxlcigpO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIHdpbmRvd0NhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spO1xuICAgIGlmICghd2luZG93Q2FsbGJhY2tzLnNpemUgJiYgd2luZG93UmVzaXplSGFuZGxlcikge1xuICAgICAgd2luZG93UmVzaXplSGFuZGxlciA9IHZvaWQgMDtcbiAgICB9XG4gIH07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9kb20vcmVzaXplL2luZGV4Lm1qc1xuZnVuY3Rpb24gcmVzaXplKGEsIGIpIHtcbiAgcmV0dXJuIHR5cGVvZiBhID09PSBcImZ1bmN0aW9uXCIgPyByZXNpemVXaW5kb3coYSkgOiByZXNpemVFbGVtZW50KGEsIGIpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3Njcm9sbC9pbmZvLm1qc1xudmFyIGltcG9ydF9kaXN0ODM1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MzYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4MzcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgbWF4RWxhcHNlZDIgPSA1MDtcbnZhciBjcmVhdGVBeGlzSW5mbyA9ICgpID0+ICh7XG4gIGN1cnJlbnQ6IDAsXG4gIG9mZnNldDogW10sXG4gIHByb2dyZXNzOiAwLFxuICBzY3JvbGxMZW5ndGg6IDAsXG4gIHRhcmdldE9mZnNldDogMCxcbiAgdGFyZ2V0TGVuZ3RoOiAwLFxuICBjb250YWluZXJMZW5ndGg6IDAsXG4gIHZlbG9jaXR5OiAwXG59KTtcbnZhciBjcmVhdGVTY3JvbGxJbmZvID0gKCkgPT4gKHtcbiAgdGltZTogMCxcbiAgeDogY3JlYXRlQXhpc0luZm8oKSxcbiAgeTogY3JlYXRlQXhpc0luZm8oKVxufSk7XG52YXIga2V5cyA9IHtcbiAgeDoge1xuICAgIGxlbmd0aDogXCJXaWR0aFwiLFxuICAgIHBvc2l0aW9uOiBcIkxlZnRcIlxuICB9LFxuICB5OiB7XG4gICAgbGVuZ3RoOiBcIkhlaWdodFwiLFxuICAgIHBvc2l0aW9uOiBcIlRvcFwiXG4gIH1cbn07XG5mdW5jdGlvbiB1cGRhdGVBeGlzSW5mbyhlbGVtZW50LCBheGlzTmFtZSwgaW5mbywgdGltZTIpIHtcbiAgY29uc3QgYXhpcyA9IGluZm9bYXhpc05hbWVdO1xuICBjb25zdCB7IGxlbmd0aCwgcG9zaXRpb24gfSA9IGtleXNbYXhpc05hbWVdO1xuICBjb25zdCBwcmV2ID0gYXhpcy5jdXJyZW50O1xuICBjb25zdCBwcmV2VGltZSA9IGluZm8udGltZTtcbiAgYXhpcy5jdXJyZW50ID0gZWxlbWVudFtgc2Nyb2xsJHtwb3NpdGlvbn1gXTtcbiAgYXhpcy5zY3JvbGxMZW5ndGggPSBlbGVtZW50W2BzY3JvbGwke2xlbmd0aH1gXSAtIGVsZW1lbnRbYGNsaWVudCR7bGVuZ3RofWBdO1xuICBheGlzLm9mZnNldC5sZW5ndGggPSAwO1xuICBheGlzLm9mZnNldFswXSA9IDA7XG4gIGF4aXMub2Zmc2V0WzFdID0gYXhpcy5zY3JvbGxMZW5ndGg7XG4gIGF4aXMucHJvZ3Jlc3MgPSBwcm9ncmVzcygwLCBheGlzLnNjcm9sbExlbmd0aCwgYXhpcy5jdXJyZW50KTtcbiAgY29uc3QgZWxhcHNlZCA9IHRpbWUyIC0gcHJldlRpbW
10617U7XG4gIGF4aXMudmVsb2NpdHkgPSBlbGFwc2VkID4gbWF4RWxhcHNlZDIgPyAwIDogdmVsb2NpdHlQZXJTZWNvbmQoYXhpcy5jdXJyZW50IC0gcHJldiwgZWxhcHNlZCk7XG59XG5mdW5jdGlvbiB1cGRhdGVTY3JvbGxJbmZvKGVsZW1lbnQsIGluZm8sIHRpbWUyKSB7XG4gIHVwZGF0ZUF4aXNJbmZvKGVsZW1lbnQsIFwieFwiLCBpbmZvLCB0aW1lMik7XG4gIHVwZGF0ZUF4aXNJbmZvKGVsZW1lbnQsIFwieVwiLCBpbmZvLCB0aW1lMik7XG4gIGluZm8udGltZSA9IHRpbWUyO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3Njcm9sbC9vbi1zY3JvbGwtaGFuZGxlci5tanNcbnZhciBpbXBvcnRfZGlzdDg1MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODU0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODU1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3Njcm9sbC9vZmZzZXRzL2luZGV4Lm1qc1xudmFyIGltcG9ydF9kaXN0ODUwID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4NTEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4NTIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9kb20vc2Nyb2xsL29mZnNldHMvaW5zZXQubWpzXG52YXIgaW1wb3J0X2Rpc3Q4MzggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDgzOSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDg0MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIGNhbGNJbnNldChlbGVtZW50LCBjb250YWluZXIpIHtcbiAgY29uc3QgaW5zZXQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgbGV0IGN1cnJlbnQgPSBlbGVtZW50O1xuICB3aGlsZSAoY3VycmVudCAmJiBjdXJyZW50ICE9PSBjb250YWluZXIpIHtcbiAgICBpZiAoY3VycmVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICBpbnNldC54ICs9IGN1cnJlbnQub2Zmc2V0TGVmdDtcbiAgICAgIGluc2V0LnkgKz0gY3VycmVudC5vZmZzZXRUb3A7XG4gICAgICBjdXJyZW50ID0gY3VycmVudC5vZmZzZXRQYXJlbnQ7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50LnRhZ05hbWUgPT09IFwic3ZnXCIpIHtcbiAgICAgIGNvbnN0IHN2Z0JvdW5kaW5nQm94ID0gY3VycmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICBjb25zdCBwYXJlbnRCb3VuZGluZ0JveCA9IGN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICBpbnNldC54ICs9IHN2Z0JvdW5kaW5nQm94LmxlZnQgLSBwYXJlbnRCb3VuZGluZ0JveC5sZWZ0O1xuICAgICAgaW5zZXQueSArPSBzdmdCb3VuZGluZ0JveC50b3AgLSBwYXJlbnRCb3VuZGluZ0JveC50b3A7XG4gICAgfSBlbHNlIGlmIChjdXJyZW50IGluc3RhbmNlb2YgU1ZHR3JhcGhpY3NFbGVtZW50KSB7XG4gICAgICBjb25zdCB7IHgsIHkgfSA9IGN1cnJlbnQuZ2V0QkJveCgpO1xuICAgICAgaW5zZXQueCArPSB4O1xuICAgICAgaW5zZXQueSArPSB5O1xuICAgICAgbGV0IHN2ZyA9IG51bGw7XG4gICAgICBsZXQgcGFyZW50ID0gY3VycmVudC5wYXJlbnROb2RlO1xuICAgICAgd2hpbGUgKCFzdmcpIHtcbiAgICAgICAgaWYgKHBhcmVudC50YWdOYW1lID09PSBcInN2Z1wiKSB7XG4gICAgICAgICAgc3ZnID0gcGFyZW50O1xuICAgICAgICB9XG4gICAgICAgIHBhcmVudCA9IGN1cnJlbnQucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnQgPSBzdmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gaW5zZXQ7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9kb20vc2Nyb2xsL29mZnNldHMvb2Zmc2V0Lm1qc1xudmFyIGltcG9ydF9kaXN0ODQ0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4NDUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4NDYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9kb20vc2Nyb2xsL29mZnNldHMvZWRnZS5tanNcbnZhciBpbXBvcnRfZGlzdDg0MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODQyID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODQzID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIG5hbWVkRWRnZXMgPSB7XG4gIHN0YXJ0OiAwLFxuICBjZW50ZXI6IDAuNSxcbiAgZW5kOiAxXG59O1xuZnVuY3Rpb24gcmVzb2x2ZUVkZ2UoZWRnZSwgbGVuZ3RoLCBpbnNldCA9IDApIHtcbiAgbGV0IGRlbHRhID0gMDtcbiAgaWYgKGVkZ2UgaW4gbmFtZWRFZGdlcykge1xuICAgIGVkZ2UgPSBuYW1lZEVkZ2VzW2Vk
10617Z2VdO1xuICB9XG4gIGlmICh0eXBlb2YgZWRnZSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IGFzTnVtYmVyMiA9IHBhcnNlRmxvYXQoZWRnZSk7XG4gICAgaWYgKGVkZ2UuZW5kc1dpdGgoXCJweFwiKSkge1xuICAgICAgZGVsdGEgPSBhc051bWJlcjI7XG4gICAgfSBlbHNlIGlmIChlZGdlLmVuZHNXaXRoKFwiJVwiKSkge1xuICAgICAgZWRnZSA9IGFzTnVtYmVyMiAvIDEwMDtcbiAgICB9IGVsc2UgaWYgKGVkZ2UuZW5kc1dpdGgoXCJ2d1wiKSkge1xuICAgICAgZGVsdGEgPSBhc051bWJlcjIgLyAxMDAgKiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGg7XG4gICAgfSBlbHNlIGlmIChlZGdlLmVuZHNXaXRoKFwidmhcIikpIHtcbiAgICAgIGRlbHRhID0gYXNOdW1iZXIyIC8gMTAwICogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICB9IGVsc2Uge1xuICAgICAgZWRnZSA9IGFzTnVtYmVyMjtcbiAgICB9XG4gIH1cbiAgaWYgKHR5cGVvZiBlZGdlID09PSBcIm51bWJlclwiKSB7XG4gICAgZGVsdGEgPSBsZW5ndGggKiBlZGdlO1xuICB9XG4gIHJldHVybiBpbnNldCArIGRlbHRhO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3Njcm9sbC9vZmZzZXRzL29mZnNldC5tanNcbnZhciBkZWZhdWx0T2Zmc2V0MiA9IFswLCAwXTtcbmZ1bmN0aW9uIHJlc29sdmVPZmZzZXQob2Zmc2V0LCBjb250YWluZXJMZW5ndGgsIHRhcmdldExlbmd0aCwgdGFyZ2V0SW5zZXQpIHtcbiAgbGV0IG9mZnNldERlZmluaXRpb24gPSBBcnJheS5pc0FycmF5KG9mZnNldCkgPyBvZmZzZXQgOiBkZWZhdWx0T2Zmc2V0MjtcbiAgbGV0IHRhcmdldFBvaW50ID0gMDtcbiAgbGV0IGNvbnRhaW5lclBvaW50ID0gMDtcbiAgaWYgKHR5cGVvZiBvZmZzZXQgPT09IFwibnVtYmVyXCIpIHtcbiAgICBvZmZzZXREZWZpbml0aW9uID0gW29mZnNldCwgb2Zmc2V0XTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygb2Zmc2V0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0LnRyaW0oKTtcbiAgICBpZiAob2Zmc2V0LmluY2x1ZGVzKFwiIFwiKSkge1xuICAgICAgb2Zmc2V0RGVmaW5pdGlvbiA9IG9mZnNldC5zcGxpdChcIiBcIik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9mZnNldERlZmluaXRpb24gPSBbb2Zmc2V0LCBuYW1lZEVkZ2VzW29mZnNldF0gPyBvZmZzZXQgOiBgMGBdO1xuICAgIH1cbiAgfVxuICB0YXJnZXRQb2ludCA9IHJlc29sdmVFZGdlKG9mZnNldERlZmluaXRpb25bMF0sIHRhcmdldExlbmd0aCwgdGFyZ2V0SW5zZXQpO1xuICBjb250YWluZXJQb2ludCA9IHJlc29sdmVFZGdlKG9mZnNldERlZmluaXRpb25bMV0sIGNvbnRhaW5lckxlbmd0aCk7XG4gIHJldHVybiB0YXJnZXRQb2ludCAtIGNvbnRhaW5lclBvaW50O1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3Njcm9sbC9vZmZzZXRzL3ByZXNldHMubWpzXG52YXIgaW1wb3J0X2Rpc3Q4NDcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDg0OCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDg0OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBTY3JvbGxPZmZzZXQgPSB7XG4gIEVudGVyOiBbXG4gICAgWzAsIDFdLFxuICAgIFsxLCAxXVxuICBdLFxuICBFeGl0OiBbXG4gICAgWzAsIDBdLFxuICAgIFsxLCAwXVxuICBdLFxuICBBbnk6IFtcbiAgICBbMSwgMF0sXG4gICAgWzAsIDFdXG4gIF0sXG4gIEFsbDogW1xuICAgIFswLCAwXSxcbiAgICBbMSwgMV1cbiAgXVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvcmVuZGVyL2RvbS9zY3JvbGwvb2Zmc2V0cy9pbmRleC5tanNcbnZhciBwb2ludCA9IHsgeDogMCwgeTogMCB9O1xuZnVuY3Rpb24gZ2V0VGFyZ2V0U2l6ZSh0YXJnZXQpIHtcbiAgcmV0dXJuIFwiZ2V0QkJveFwiIGluIHRhcmdldCAmJiB0YXJnZXQudGFnTmFtZSAhPT0gXCJzdmdcIiA/IHRhcmdldC5nZXRCQm94KCkgOiB7IHdpZHRoOiB0YXJnZXQuY2xpZW50V2lkdGgsIGhlaWdodDogdGFyZ2V0LmNsaWVudEhlaWdodCB9O1xufVxuZnVuY3Rpb24gcmVzb2x2ZU9mZnNldHMoY29udGFpbmVyLCBpbmZvLCBvcHRpb25zKSB7XG4gIGNvbnN0IHsgb2Zmc2V0OiBvZmZzZXREZWZpbml0aW9uID0gU2Nyb2xsT2Zmc2V0LkFsbCB9ID0gb3B0aW9ucztcbiAgY29uc3QgeyB0YXJnZXQgPSBjb250YWluZXIsIGF4aXMgPSBcInlcIiB9ID0gb3B0aW9ucztcbiAgY29uc3QgbGVuZ3RoTGFiZWwgPSBheGlzID09PSBcInlcIiA/IFwiaGVpZ2h0XCIgOiBcIndpZHRoXCI7XG4gIGNvbnN0IGluc2V0ID0gdGFyZ2V0ICE9PSBjb250YWluZXIgPyBjYWxjSW5zZXQodGFyZ2V0LCBjb250YWluZXIpIDogcG9pbnQ7XG4gIGNvbnN0IHRhcmdldFNpemUgPSB0YXJnZXQgPT09IGNvbnRhaW5lciA/IHsgd2lkdGg6IGNvbnRhaW5lci5zY3JvbGxXaWR0aCwgaGVpZ2h0OiBjb250YWluZXIuc2Nyb2xsSGVpZ2h0IH0gOiBnZXRUYXJnZXRTaXplKHRhcmdldCk7XG4gIGNvbnN0IGNvbnRhaW5lclNpemUgPSB7XG4gICAgd2lkdGg6IGNvbnRhaW5lci5jbGllbnRXaWR0aCxcbiAgICBoZWlnaHQ6IGNvbnRhaW5lci5jbGllbnRIZWlnaHRcbiAgfTtcbiAgaW5mb1theGlzXS5vZmZzZXQubGVuZ3RoID0gMDtcbiAgbGV0IGhhc0NoYW5nZWQgPSAhaW5mb1theGlzXS5pbnRlcnBvbGF0ZTtcbiAgY29uc3QgbnVtT2Zmc2V0cyA9IG9mZnNldERlZmluaXRpb24ubGVuZ3RoO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bU9mZnNldHM7IGkrKykge1xuICAgIGNvbnN0IG9mZnNldCA9IHJlc29sdmVPZmZzZXQob2Zmc2V0RGVmaW5pdGlvbltpXSwgY29udGFpbmVyU2l6ZVtsZW5ndGhMYWJlbF0sIHRhcmdldFNpemVbbGVuZ3RoTGFiZWxdLCBpbnNldFtheGlzXSk7XG4gICAgaWYgKCFoYXNDaGFuZ2VkICYmIG9mZnNldCAhPT0gaW5mb1theGlzXS5pbnRlcnBvbGF0b3JPZmZzZXRzW2ldKSB7XG4gICAgICBoYXNDaGFuZ2VkI
10617D0gdHJ1ZTtcbiAgICB9XG4gICAgaW5mb1theGlzXS5vZmZzZXRbaV0gPSBvZmZzZXQ7XG4gIH1cbiAgaWYgKGhhc0NoYW5nZWQpIHtcbiAgICBpbmZvW2F4aXNdLmludGVycG9sYXRlID0gaW50ZXJwb2xhdGUoaW5mb1theGlzXS5vZmZzZXQsIGRlZmF1bHRPZmZzZXQob2Zmc2V0RGVmaW5pdGlvbiksIHsgY2xhbXA6IGZhbHNlIH0pO1xuICAgIGluZm9bYXhpc10uaW50ZXJwb2xhdG9yT2Zmc2V0cyA9IFsuLi5pbmZvW2F4aXNdLm9mZnNldF07XG4gIH1cbiAgaW5mb1theGlzXS5wcm9ncmVzcyA9IGNsYW1wKDAsIDEsIGluZm9bYXhpc10uaW50ZXJwb2xhdGUoaW5mb1theGlzXS5jdXJyZW50KSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9kb20vc2Nyb2xsL29uLXNjcm9sbC1oYW5kbGVyLm1qc1xuZnVuY3Rpb24gbWVhc3VyZShjb250YWluZXIsIHRhcmdldCA9IGNvbnRhaW5lciwgaW5mbykge1xuICBpbmZvLngudGFyZ2V0T2Zmc2V0ID0gMDtcbiAgaW5mby55LnRhcmdldE9mZnNldCA9IDA7XG4gIGlmICh0YXJnZXQgIT09IGNvbnRhaW5lcikge1xuICAgIGxldCBub2RlID0gdGFyZ2V0O1xuICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IGNvbnRhaW5lcikge1xuICAgICAgaW5mby54LnRhcmdldE9mZnNldCArPSBub2RlLm9mZnNldExlZnQ7XG4gICAgICBpbmZvLnkudGFyZ2V0T2Zmc2V0ICs9IG5vZGUub2Zmc2V0VG9wO1xuICAgICAgbm9kZSA9IG5vZGUub2Zmc2V0UGFyZW50O1xuICAgIH1cbiAgfVxuICBpbmZvLngudGFyZ2V0TGVuZ3RoID0gdGFyZ2V0ID09PSBjb250YWluZXIgPyB0YXJnZXQuc2Nyb2xsV2lkdGggOiB0YXJnZXQuY2xpZW50V2lkdGg7XG4gIGluZm8ueS50YXJnZXRMZW5ndGggPSB0YXJnZXQgPT09IGNvbnRhaW5lciA/IHRhcmdldC5zY3JvbGxIZWlnaHQgOiB0YXJnZXQuY2xpZW50SGVpZ2h0O1xuICBpbmZvLnguY29udGFpbmVyTGVuZ3RoID0gY29udGFpbmVyLmNsaWVudFdpZHRoO1xuICBpbmZvLnkuY29udGFpbmVyTGVuZ3RoID0gY29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmIChjb250YWluZXIgJiYgdGFyZ2V0ICYmIHRhcmdldCAhPT0gY29udGFpbmVyKSB7XG4gICAgICB3YXJuT25jZShnZXRDb21wdXRlZFN0eWxlKGNvbnRhaW5lcikucG9zaXRpb24gIT09IFwic3RhdGljXCIsIFwiUGxlYXNlIGVuc3VyZSB0aGF0IHRoZSBjb250YWluZXIgaGFzIGEgbm9uLXN0YXRpYyBwb3NpdGlvbiwgbGlrZSAncmVsYXRpdmUnLCAnZml4ZWQnLCBvciAnYWJzb2x1dGUnIHRvIGVuc3VyZSBzY3JvbGwgb2Zmc2V0IGlzIGNhbGN1bGF0ZWQgY29ycmVjdGx5LlwiKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGNyZWF0ZU9uU2Nyb2xsSGFuZGxlcihlbGVtZW50LCBvblNjcm9sbCwgaW5mbywgb3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiB7XG4gICAgbWVhc3VyZTogKCkgPT4gbWVhc3VyZShlbGVtZW50LCBvcHRpb25zLnRhcmdldCwgaW5mbyksXG4gICAgdXBkYXRlOiAodGltZTIpID0+IHtcbiAgICAgIHVwZGF0ZVNjcm9sbEluZm8oZWxlbWVudCwgaW5mbywgdGltZTIpO1xuICAgICAgaWYgKG9wdGlvbnMub2Zmc2V0IHx8IG9wdGlvbnMudGFyZ2V0KSB7XG4gICAgICAgIHJlc29sdmVPZmZzZXRzKGVsZW1lbnQsIGluZm8sIG9wdGlvbnMpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbm90aWZ5OiAoKSA9PiBvblNjcm9sbChpbmZvKVxuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3Njcm9sbC90cmFjay5tanNcbnZhciBzY3JvbGxMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbnZhciByZXNpemVMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbnZhciBvblNjcm9sbEhhbmRsZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG52YXIgZ2V0RXZlbnRUYXJnZXQgPSAoZWxlbWVudCkgPT4gZWxlbWVudCA9PT0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ID8gd2luZG93IDogZWxlbWVudDtcbmZ1bmN0aW9uIHNjcm9sbEluZm8ob25TY3JvbGwsIHsgY29udGFpbmVyID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCAuLi5vcHRpb25zIH0gPSB7fSkge1xuICBsZXQgY29udGFpbmVySGFuZGxlcnMgPSBvblNjcm9sbEhhbmRsZXJzLmdldChjb250YWluZXIpO1xuICBpZiAoIWNvbnRhaW5lckhhbmRsZXJzKSB7XG4gICAgY29udGFpbmVySGFuZGxlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIG9uU2Nyb2xsSGFuZGxlcnMuc2V0KGNvbnRhaW5lciwgY29udGFpbmVySGFuZGxlcnMpO1xuICB9XG4gIGNvbnN0IGluZm8gPSBjcmVhdGVTY3JvbGxJbmZvKCk7XG4gIGNvbnN0IGNvbnRhaW5lckhhbmRsZXIgPSBjcmVhdGVPblNjcm9sbEhhbmRsZXIoY29udGFpbmVyLCBvblNjcm9sbCwgaW5mbywgb3B0aW9ucyk7XG4gIGNvbnRhaW5lckhhbmRsZXJzLmFkZChjb250YWluZXJIYW5kbGVyKTtcbiAgaWYgKCFzY3JvbGxMaXN0ZW5lcnMuaGFzKGNvbnRhaW5lcikpIHtcbiAgICBjb25zdCBtZWFzdXJlQWxsID0gKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBoYW5kbGVyIG9mIGNvbnRhaW5lckhhbmRsZXJzKVxuICAgICAgICBoYW5kbGVyLm1lYXN1cmUoKTtcbiAgICB9O1xuICAgIGNvbnN0IHVwZGF0ZUFsbCA9ICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiBjb250YWluZXJIYW5kbGVycykge1xuICAgICAgICBoYW5kbGVyLnVwZGF0ZShmcmFtZURhdGEudGltZXN0YW1wKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGNvbnN0IG5vdGlmeUFsbDIgPSAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgY29udGFpbmVySGFuZGxlcnMpXG4gICAgICAgIGhhbmRsZXIubm90aWZ5KCk7XG4gICAgfTtcbiAgICBjb25zdCBsaXN0ZW5lcjIgPSAoKSA9PiB7XG4gICAgICBmcmFtZS5yZWFkKG1lYXN1cmVBbGwsIGZhbHNlLCB0cnVlKTtcbiAgICAgIGZyYW1lLnJlYWQodXBkYXRlQWxsLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICBmcmFtZS51cGRhdGUobm90aWZ5QWxsMiwgZmFsc2UsIHRydWUpO1xuICAgIH07XG4gICAgc2Nyb2xsTGlzdGVuZXJzLnNldChjb250YWluZXIsIGxpc3RlbmVyMik7XG4gICAgY29uc3QgdGFyZ2V0ID0gZ2V0RXZlbnRUYXJnZXQoY29udGFpbmVyKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCBsaXN0ZW5lcjIsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgICBpZiAoY29udGFpbmVyICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgIHJlc2l6ZUxpc3RlbmVycy5zZXQoY29udGFpbmVyLCByZXNpemUoY29udGFpbmVyLCBsaXN0ZW5lcjIpKTtcbiAgICB9XG4gICAgdGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgbGlzdGVuZXIyLCB7IHBhc3NpdmU6IHRydWUgfSk7XG4gIH1cbiAgY29uc3QgbGlzdGVuZXIgPSBzY3JvbGxMaXN0ZW5lcnMuZ2V0KGNvbnRhaW5lcik7XG4gIGZyYW1lLnJlYWQobGlzdGVuZXIsIGZhbHNlLCB0cnVlKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICB2YXIgX2E7XG4gICAgY2FuY2VsRnJhbWUobGlzdGVuZXIpO1xuICAgIGNvbnN0IGN1cnJlbnRIYW5kbGVycyA9IG9uU2Nyb2xsSGFuZGxlcnMuZ2V0KGNvbnRhaW5lcik7XG4gICAgaWYgKCFjdXJyZW50SGFuZGxlcnMpXG4gICAgICByZXR1cm47XG4gICAgY3VycmVudEhhbmRsZXJzLmRlbGV0ZShjb250YWluZXJIYW5kbGVyKTtcbiAgICBpZiAoY3VycmVudEhhbmRsZXJzLnNpemUpXG4gICAgICByZXR1cm47XG4gICAgY29uc3Qgc2Nyb2xsTGlzdGVuZXIgPSBzY3JvbGxMaXN0ZW5lcnMuZ2V0KGNvbnRhaW5lcik7XG4gICAgc2Nyb2xsTGlzdGVuZXJzLmRlbGV0ZShjb250YWluZXIpO1xuICAgIGlmIChzY3JvbGxMaXN0ZW5lcikge1xuICAgICAgZ2V0RXZlbnRUYXJnZXQoY29udGFpbmVyKS5yZW1vdmVFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIHNjcm9sbExpc3RlbmVyKTtcbiAgICAgIChfYSA9IHJlc2l6ZUxpc3RlbmVycy5nZXQoY29udGFpbmVyKSkgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hKCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCBzY3JvbGxMaXN0ZW5lcik7XG4gICAgfVxuICB9O1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3Njcm9sbC9pbmRleC5tanNcbmZ1bmN0aW9uIHNjcm9sbFRpbWVsaW5lRmFsbGJhY2soeyBzb3VyY2UsIGNvbnRhaW5lciwgYXhpcyA9IFwieVwiIH0pIHtcbiAgaWYgKHNvdXJjZSlcbiAgICBjb250YWluZXIgPSBzb3VyY2U7XG4gIGNvbnN0IGN1cnJlbnRUaW1lID0geyB2YWx1ZTogMCB9O1xuICBjb25zdCBjYW5jZWwgPSBzY3JvbGxJbmZvKChpbmZvKSA9PiB7XG4gICAgY3VycmVudFRpbWUudmFsdWUgPSBpbmZvW2F4aXNdLnByb2dyZXNzICogMTAwO1xuICB9LCB7IGNvbnRhaW5lciwgYXhpcyB9KTtcbiAgcmV0dXJuIHsgY3VycmVudFRpbWUsIGNhbmNlbCB9O1xufVxudmFyIHRpbWVsaW5lQ2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuZnVuY3Rpb24gZ2V0VGltZWxpbmUoeyBzb3VyY2UsIGNvbnRhaW5lciA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgYXhpcyA9IFwieVwiIH0gPSB7fSkge1xuICBpZiAoc291cmNlKVxuICAgIGNvbnRhaW5lciA9IHNvdXJjZTtcbiAgaWYgKCF0aW1lbGluZUNhY2hlLmhhcyhjb250YWluZXIpKSB7XG4gICAgdGltZWxpbmVDYWNoZS5zZXQoY29udGFpbmVyLCB7fSk7XG4gIH1cbiAgY29uc3QgZWxlbWVudENhY2hlID0gdGltZWxpbmVDYWNoZS5nZXQoY29udGFpbmVyKTtcbiAgaWYgKCFlbGVtZW50Q2FjaGVbYXhpc10pIHtcbiAgICBlbGVtZW50Q2FjaGVbYXhpc10gPSBzdXBwb3J0c1Njcm9sbFRpbWVsaW5lKCkgPyBuZXcgU2Nyb2xsVGltZWxpbmUoeyBzb3VyY2U6IGNvbnRhaW5lciwgYXhpcyB9KSA6IHNjcm9sbFRpbWVsaW5lRmFsbGJhY2soeyBzb3VyY2U6IGNvbnRhaW5lciwgYXhpcyB9KTtcbiAgfVxuICByZXR1cm4gZWxlbWVudENhY2hlW2F4aXNdO1xufVxuZnVuY3Rpb24gaXNPblNjcm9sbFdpdGhJbmZvKG9uU2Nyb2xsKSB7XG4gIHJldHVybi
10617BvblNjcm9sbC5sZW5ndGggPT09IDI7XG59XG5mdW5jdGlvbiBuZWVkc0VsZW1lbnRUcmFja2luZyhvcHRpb25zKSB7XG4gIHJldHVybiBvcHRpb25zICYmIChvcHRpb25zLnRhcmdldCB8fCBvcHRpb25zLm9mZnNldCk7XG59XG5mdW5jdGlvbiBzY3JvbGxGdW5jdGlvbihvblNjcm9sbCwgb3B0aW9ucykge1xuICBpZiAoaXNPblNjcm9sbFdpdGhJbmZvKG9uU2Nyb2xsKSB8fCBuZWVkc0VsZW1lbnRUcmFja2luZyhvcHRpb25zKSkge1xuICAgIHJldHVybiBzY3JvbGxJbmZvKChpbmZvKSA9PiB7XG4gICAgICBvblNjcm9sbChpbmZvW29wdGlvbnMuYXhpc10ucHJvZ3Jlc3MsIGluZm8pO1xuICAgIH0sIG9wdGlvbnMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBvYnNlcnZlVGltZWxpbmUob25TY3JvbGwsIGdldFRpbWVsaW5lKG9wdGlvbnMpKTtcbiAgfVxufVxuZnVuY3Rpb24gc2Nyb2xsQW5pbWF0aW9uKGFuaW1hdGlvbiwgb3B0aW9ucykge1xuICBhbmltYXRpb24uZmxhdHRlbigpO1xuICBpZiAobmVlZHNFbGVtZW50VHJhY2tpbmcob3B0aW9ucykpIHtcbiAgICBhbmltYXRpb24ucGF1c2UoKTtcbiAgICByZXR1cm4gc2Nyb2xsSW5mbygoaW5mbykgPT4ge1xuICAgICAgYW5pbWF0aW9uLnRpbWUgPSBhbmltYXRpb24uZHVyYXRpb24gKiBpbmZvW29wdGlvbnMuYXhpc10ucHJvZ3Jlc3M7XG4gICAgfSwgb3B0aW9ucyk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdGltZWxpbmUgPSBnZXRUaW1lbGluZShvcHRpb25zKTtcbiAgICBpZiAoYW5pbWF0aW9uLmF0dGFjaFRpbWVsaW5lKSB7XG4gICAgICByZXR1cm4gYW5pbWF0aW9uLmF0dGFjaFRpbWVsaW5lKHRpbWVsaW5lLCAodmFsdWVBbmltYXRpb24pID0+IHtcbiAgICAgICAgdmFsdWVBbmltYXRpb24ucGF1c2UoKTtcbiAgICAgICAgcmV0dXJuIG9ic2VydmVUaW1lbGluZSgocHJvZ3Jlc3MyKSA9PiB7XG4gICAgICAgICAgdmFsdWVBbmltYXRpb24udGltZSA9IHZhbHVlQW5pbWF0aW9uLmR1cmF0aW9uICogcHJvZ3Jlc3MyO1xuICAgICAgICB9LCB0aW1lbGluZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vb3A7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBzY3JvbGwob25TY3JvbGwsIHsgYXhpcyA9IFwieVwiLCAuLi5vcHRpb25zIH0gPSB7fSkge1xuICBjb25zdCBvcHRpb25zV2l0aERlZmF1bHRzID0geyBheGlzLCAuLi5vcHRpb25zIH07XG4gIHJldHVybiB0eXBlb2Ygb25TY3JvbGwgPT09IFwiZnVuY3Rpb25cIiA/IHNjcm9sbEZ1bmN0aW9uKG9uU2Nyb2xsLCBvcHRpb25zV2l0aERlZmF1bHRzKSA6IHNjcm9sbEFuaW1hdGlvbihvblNjcm9sbCwgb3B0aW9uc1dpdGhEZWZhdWx0cyk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3ZhbHVlL3VzZS1zY3JvbGwubWpzXG5mdW5jdGlvbiByZWZXYXJuaW5nKG5hbWUsIHJlZikge1xuICB3YXJuaW5nKEJvb2xlYW4oIXJlZiB8fCByZWYuY3VycmVudCksIGBZb3UgaGF2ZSBkZWZpbmVkIGEgJHtuYW1lfSBvcHRpb25zIGJ1dCB0aGUgcHJvdmlkZWQgcmVmIGlzIG5vdCB5ZXQgaHlkcmF0ZWQsIHByb2JhYmx5IGJlY2F1c2UgaXQncyBkZWZpbmVkIGhpZ2hlciB1cCB0aGUgdHJlZS4gVHJ5IGNhbGxpbmcgdXNlU2Nyb2xsKCkgaW4gdGhlIHNhbWUgY29tcG9uZW50IGFzIHRoZSByZWYsIG9yIHNldHRpbmcgaXRzIFxcYGxheW91dEVmZmVjdDogZmFsc2VcXGAgb3B0aW9uLmApO1xufVxudmFyIGNyZWF0ZVNjcm9sbE1vdGlvblZhbHVlcyA9ICgpID0+ICh7XG4gIHNjcm9sbFg6IG1vdGlvblZhbHVlKDApLFxuICBzY3JvbGxZOiBtb3Rpb25WYWx1ZSgwKSxcbiAgc2Nyb2xsWFByb2dyZXNzOiBtb3Rpb25WYWx1ZSgwKSxcbiAgc2Nyb2xsWVByb2dyZXNzOiBtb3Rpb25WYWx1ZSgwKVxufSk7XG5mdW5jdGlvbiB1c2VTY3JvbGwoeyBjb250YWluZXIsIHRhcmdldCwgbGF5b3V0RWZmZWN0ID0gdHJ1ZSwgLi4ub3B0aW9ucyB9ID0ge30pIHtcbiAgY29uc3QgdmFsdWVzID0gdXNlQ29uc3RhbnQoY3JlYXRlU2Nyb2xsTW90aW9uVmFsdWVzKTtcbiAgY29uc3QgdXNlTGlmZWN5Y2xlRWZmZWN0ID0gbGF5b3V0RWZmZWN0ID8gdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCA6IGltcG9ydF9yZWFjdDMxLnVzZUVmZmVjdDtcbiAgdXNlTGlmZWN5Y2xlRWZmZWN0KCgpID0+IHtcbiAgICByZWZXYXJuaW5nKFwidGFyZ2V0XCIsIHRhcmdldCk7XG4gICAgcmVmV2FybmluZyhcImNvbnRhaW5lclwiLCBjb250YWluZXIpO1xuICAgIHJldHVybiBzY3JvbGwoKF9wcm9ncmVzcywgeyB4LCB5IH0pID0+IHtcbiAgICAgIHZhbHVlcy5zY3JvbGxYLnNldCh4LmN1cnJlbnQpO1xuICAgICAgdmFsdWVzLnNjcm9sbFhQcm9ncmVzcy5zZXQoeC5wcm9ncmVzcyk7XG4gICAgICB2YWx1ZXMuc2Nyb2xsWS5zZXQoeS5jdXJyZW50KTtcbiAgICAgIHZhbHVlcy5zY3JvbGxZUHJvZ3Jlc3Muc2V0KHkucHJvZ3Jlc3MpO1xuICAgIH0sIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBjb250YWluZXI6IChjb250YWluZXIgPT09IG51bGwgfHwgY29udGFpbmVyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjb250YWluZXIuY3VycmVudCkgfHwgdm9pZCAwLFxuICAgICAgdGFyZ2V0OiAodGFyZ2V0ID09PSBudWxsIHx8IHRhcmdldCA9PT0gdm9pZCAwID8gdm9pZCAwIDogdGFyZ2V0LmN1cnJlbnQpIHx8IHZvaWQgMFxuICAgIH0pO1xuICB9LCBbY29udGFpbmVyLCB0YXJnZXQsIEpTT04uc3RyaW5naWZ5KG9wdGlvbnMub2Zmc2V0KV0pO1xuICByZXR1cm4gdmFsdWVzO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS9zY3JvbGwvdXNlLWVsZW1lbnQtc2Nyb2xsLm1qc1xuZnVuY3Rpb24gdXNlRWxlbWVudFNjcm9sbChyZWYpIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHtcbiAgICB3YXJuT25jZShmYWxzZSwgXCJ1c2VFbGVtZW50U2Nyb2xsIGlzIGRlcHJlY2F0ZWQuIENvbnZlcnQgdG8gdXNlU2Nyb2xsKHsgY29udGFpbmVyOiByZWYgfSkuXCIpO1xuICB9XG4gI
10617HJldHVybiB1c2VTY3JvbGwoeyBjb250YWluZXI6IHJlZiB9KTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvc2Nyb2xsL3VzZS12aWV3cG9ydC1zY3JvbGwubWpzXG52YXIgaW1wb3J0X2Rpc3Q4NjggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDg2OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDg3MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIHVzZVZpZXdwb3J0U2Nyb2xsKCkge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgd2Fybk9uY2UoZmFsc2UsIFwidXNlVmlld3BvcnRTY3JvbGwgaXMgZGVwcmVjYXRlZC4gQ29udmVydCB0byB1c2VTY3JvbGwoKS5cIik7XG4gIH1cbiAgcmV0dXJuIHVzZVNjcm9sbCgpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS91c2UtbW90aW9uLXRlbXBsYXRlLm1qc1xudmFyIGltcG9ydF9kaXN0ODc3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4NzggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4NzkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3ZhbHVlL3VzZS1jb21iaW5lLXZhbHVlcy5tanNcbnZhciBpbXBvcnRfZGlzdDg3NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODc1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODc2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS91c2UtbW90aW9uLXZhbHVlLm1qc1xudmFyIGltcG9ydF9kaXN0ODcxID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4NzIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4NzMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW1wb3J0X3JlYWN0MzIgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSwgMSk7XG5mdW5jdGlvbiB1c2VNb3Rpb25WYWx1ZShpbml0aWFsKSB7XG4gIGNvbnN0IHZhbHVlID0gdXNlQ29uc3RhbnQoKCkgPT4gbW90aW9uVmFsdWUoaW5pdGlhbCkpO1xuICBjb25zdCB7IGlzU3RhdGljIH0gPSAoMCwgaW1wb3J0X3JlYWN0MzIudXNlQ29udGV4dCkoTW90aW9uQ29uZmlnQ29udGV4dCk7XG4gIGlmIChpc1N0YXRpYykge1xuICAgIGNvbnN0IFssIHNldExhdGVzdF0gPSAoMCwgaW1wb3J0X3JlYWN0MzIudXNlU3RhdGUpKGluaXRpYWwpO1xuICAgICgwLCBpbXBvcnRfcmVhY3QzMi51c2VFZmZlY3QpKCgpID0+IHZhbHVlLm9uKFwiY2hhbmdlXCIsIHNldExhdGVzdCksIFtdKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3ZhbHVlL3VzZS1jb21iaW5lLXZhbHVlcy5tanNcbmZ1bmN0aW9uIHVzZUNvbWJpbmVNb3Rpb25WYWx1ZXModmFsdWVzLCBjb21iaW5lVmFsdWVzKSB7XG4gIGNvbnN0IHZhbHVlID0gdXNlTW90aW9uVmFsdWUoY29tYmluZVZhbHVlcygpKTtcbiAgY29uc3QgdXBkYXRlVmFsdWUgPSAoKSA9PiB2YWx1ZS5zZXQoY29tYmluZVZhbHVlcygpKTtcbiAgdXBkYXRlVmFsdWUoKTtcbiAgdXNlSXNvbW9ycGhpY0xheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3Qgc2NoZWR1bGVVcGRhdGUgPSAoKSA9PiBmcmFtZS5wcmVSZW5kZXIodXBkYXRlVmFsdWUsIGZhbHNlLCB0cnVlKTtcbiAgICBjb25zdCBzdWJzY3JpcHRpb25zID0gdmFsdWVzLm1hcCgodikgPT4gdi5vbihcImNoYW5nZVwiLCBzY2hlZHVsZVVwZGF0ZSkpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBzdWJzY3JpcHRpb25zLmZvckVhY2goKHVuc3Vic2NyaWJlKSA9PiB1bnN1YnNjcmliZSgpKTtcbiAgICAgIGNhbmNlbEZyYW1lKHVwZGF0ZVZhbHVlKTtcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS91c2UtbW90aW9uLXRlbXBsYXRlLm1qc1xuZnVuY3Rpb24gdXNlTW90aW9uVGVtcGxhdGUoZnJhZ21lbnRzLCAuLi52YWx1ZXMpIHtcbiAgY29uc3QgbnVtRnJhZ21lbnRzID0gZnJhZ21lbnRzLmxlbmd0aDtcbiAgZnVuY3Rpb24gYnVpbGRWYWx1ZSgpIHtcbiAgICBsZXQgb3V0cHV0ID0gYGA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1GcmFnbWVudHM7IGkrKykge1xuICAgICAgb3V0cHV0ICs9IGZyYWdtZW50c1tpXTtcbiAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldO1xuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIG91dHB1dCArPSBpc01vdGlvblZhbHVlKHZhbHVlKSA/IHZhbHVlLmdldCgpIDogdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybi
10617BvdXRwdXQ7XG4gIH1cbiAgcmV0dXJuIHVzZUNvbWJpbmVNb3Rpb25WYWx1ZXModmFsdWVzLmZpbHRlcihpc01vdGlvblZhbHVlKSwgYnVpbGRWYWx1ZSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3ZhbHVlL3VzZS1zcHJpbmcubWpzXG52YXIgaW1wb3J0X2Rpc3Q4ODAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDg4MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDg4MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3QzMyA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcbmZ1bmN0aW9uIHRvTnVtYmVyKHYpIHtcbiAgaWYgKHR5cGVvZiB2ID09PSBcIm51bWJlclwiKVxuICAgIHJldHVybiB2O1xuICByZXR1cm4gcGFyc2VGbG9hdCh2KTtcbn1cbmZ1bmN0aW9uIHVzZVNwcmluZyhzb3VyY2UsIGNvbmZpZyA9IHt9KSB7XG4gIGNvbnN0IHsgaXNTdGF0aWMgfSA9ICgwLCBpbXBvcnRfcmVhY3QzMy51c2VDb250ZXh0KShNb3Rpb25Db25maWdDb250ZXh0KTtcbiAgY29uc3QgYWN0aXZlU3ByaW5nQW5pbWF0aW9uID0gKDAsIGltcG9ydF9yZWFjdDMzLnVzZVJlZikobnVsbCk7XG4gIGNvbnN0IHZhbHVlID0gdXNlTW90aW9uVmFsdWUoaXNNb3Rpb25WYWx1ZShzb3VyY2UpID8gdG9OdW1iZXIoc291cmNlLmdldCgpKSA6IHNvdXJjZSk7XG4gIGNvbnN0IGxhdGVzdFZhbHVlID0gKDAsIGltcG9ydF9yZWFjdDMzLnVzZVJlZikodmFsdWUuZ2V0KCkpO1xuICBjb25zdCBsYXRlc3RTZXR0ZXIgPSAoMCwgaW1wb3J0X3JlYWN0MzMudXNlUmVmKSgoKSA9PiB7XG4gIH0pO1xuICBjb25zdCBzdGFydEFuaW1hdGlvbiA9ICgpID0+IHtcbiAgICBjb25zdCBhbmltYXRpb24gPSBhY3RpdmVTcHJpbmdBbmltYXRpb24uY3VycmVudDtcbiAgICBpZiAoYW5pbWF0aW9uICYmIGFuaW1hdGlvbi50aW1lID09PSAwKSB7XG4gICAgICBhbmltYXRpb24uc2FtcGxlKGZyYW1lRGF0YS5kZWx0YSk7XG4gICAgfVxuICAgIHN0b3BBbmltYXRpb24yKCk7XG4gICAgYWN0aXZlU3ByaW5nQW5pbWF0aW9uLmN1cnJlbnQgPSBhbmltYXRlVmFsdWUoe1xuICAgICAga2V5ZnJhbWVzOiBbdmFsdWUuZ2V0KCksIGxhdGVzdFZhbHVlLmN1cnJlbnRdLFxuICAgICAgdmVsb2NpdHk6IHZhbHVlLmdldFZlbG9jaXR5KCksXG4gICAgICB0eXBlOiBcInNwcmluZ1wiLFxuICAgICAgcmVzdERlbHRhOiAxZS0zLFxuICAgICAgcmVzdFNwZWVkOiAwLjAxLFxuICAgICAgLi4uY29uZmlnLFxuICAgICAgb25VcGRhdGU6IGxhdGVzdFNldHRlci5jdXJyZW50XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHN0b3BBbmltYXRpb24yID0gKCkgPT4ge1xuICAgIGlmIChhY3RpdmVTcHJpbmdBbmltYXRpb24uY3VycmVudCkge1xuICAgICAgYWN0aXZlU3ByaW5nQW5pbWF0aW9uLmN1cnJlbnQuc3RvcCgpO1xuICAgIH1cbiAgfTtcbiAgKDAsIGltcG9ydF9yZWFjdDMzLnVzZUluc2VydGlvbkVmZmVjdCkoKCkgPT4ge1xuICAgIHJldHVybiB2YWx1ZS5hdHRhY2goKHYsIHNldCkgPT4ge1xuICAgICAgaWYgKGlzU3RhdGljKVxuICAgICAgICByZXR1cm4gc2V0KHYpO1xuICAgICAgbGF0ZXN0VmFsdWUuY3VycmVudCA9IHY7XG4gICAgICBsYXRlc3RTZXR0ZXIuY3VycmVudCA9IHNldDtcbiAgICAgIGZyYW1lLnVwZGF0ZShzdGFydEFuaW1hdGlvbik7XG4gICAgICByZXR1cm4gdmFsdWUuZ2V0KCk7XG4gICAgfSwgc3RvcEFuaW1hdGlvbjIpO1xuICB9LCBbSlNPTi5zdHJpbmdpZnkoY29uZmlnKV0pO1xuICB1c2VJc29tb3JwaGljTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNNb3Rpb25WYWx1ZShzb3VyY2UpKSB7XG4gICAgICByZXR1cm4gc291cmNlLm9uKFwiY2hhbmdlXCIsICh2KSA9PiB2YWx1ZS5zZXQodG9OdW1iZXIodikpKTtcbiAgICB9XG4gIH0sIFt2YWx1ZV0pO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3ZhbHVlL3VzZS10aW1lLm1qc1xudmFyIGltcG9ydF9kaXN0ODg2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4ODcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4ODggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3V0aWxzL3VzZS1hbmltYXRpb24tZnJhbWUubWpzXG52YXIgaW1wb3J0X2Rpc3Q4ODMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDg4NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDg4NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3QzNCA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcbmZ1bmN0aW9uIHVzZUFuaW1hdGlvbkZyYW1lKGNhbGxiYWNrKSB7XG4gIGNvbnN0IGluaXRpYWxUaW1lc3RhbXAgPSAoMCwgaW1wb3J0X3JlYWN0MzQudXNlUmVmKSgwKTtcbiAgY29uc3QgeyBpc1N0YXRpYyB9ID0gKDAsIGltcG9ydF9yZWFjdDM0LnVzZUNvbnRleHQpKE1vdGlvbkNvbmZpZ0NvbnRleHQpO1xuICAoMCwgaW1wb3J0X3JlYWN0MzQudXNlRWZmZWN0KSgoKSA9PiB7XG4gICAgaWYgKGlzU3RhdGljKVxuICAgICAgcmV0dXJuO1xuICAgIGNvbnN0IHByb3ZpZGVUaW1lU2luY2VTdGFydCA9ICh7IHRpbWVzdGFtcCwgZGVsdGEgfSkgPT4ge1xuICAgICAgaWYgKCFpbml0aWFsVGltZXN0YW1wLmN1cnJlbnQpXG4gICAgICAgIGluaXRpYWxUaW1lc3RhbXAuY3VycmVudCA9IHRpbWVzdGFtcDtcbiAgICAgIGNhbGxiYWNrKHRpbWVzdGFtcCAtIGluaXRpYWxUaW1lc3RhbXAuY3VycmVudCwgZGVsdGEpO1xuICAgIH07XG4gICAgZnJhbWUudXBkYXRlKHByb3ZpZGVUaW1lU2luY2VTdGFydCwgdHJ1ZSk7XG4gICAgcmV0dXJuICgpID0+IGNhbmNlbEZyYW1lKHByb3ZpZGVUaW1lU2luY2VTdGFydCk7XG4gIH0sIFtjYWxsYmFja10pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS91c2UtdGltZS5tanNcbmZ1bmN0aW9uIHVzZVRpbWUoKSB7XG4gIGNvbnN0IHRpbWUyID0gdXNlTW90aW9uVmFsdWUoMCk7XG4gIHVzZUFuaW1hdGlvbkZyYW1lKCh0KSA9PiB0aW1lMi5zZXQodCkpO1xuICByZXR1cm4gdGltZTI7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3ZhbHVlL3VzZS10cmFuc2Zvcm0ubWpzXG52YXIgaW1wb3J0X2Rpc3Q4OTUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDg5NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDg5NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvdHJhbnNmb3JtLm1qc1xudmFyIGltcG9ydF9kaXN0ODg5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4OTAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4OTEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaXNDdXN0b21WYWx1ZVR5cGUgPSAodikgPT4ge1xuICByZXR1cm4gdiAmJiB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2Lm1peDtcbn07XG52YXIgZ2V0TWl4ZXIyID0gKHYpID0+IGlzQ3VzdG9tVmFsdWVUeXBlKHYpID8gdi5taXggOiB2b2lkIDA7XG5mdW5jdGlvbiB0cmFuc2Zvcm0oLi4uYXJncykge1xuICBjb25zdCB1c2VJbW1lZGlhdGUgPSAhQXJyYXkuaXNBcnJheShhcmdzWzBdKTtcbiAgY29uc3QgYXJnT2Zmc2V0ID0gdXNlSW1tZWRpYXRlID8gMCA6IC0xO1xuICBjb25zdCBpbnB1dFZhbHVlID0gYXJnc1swICsgYXJnT2Zmc2V0XTtcbiAgY29uc3QgaW5wdXRSYW5nZSA9IGFyZ3NbMSArIGFyZ09mZnNldF0
106177XG4gIGNvbnN0IG91dHB1dFJhbmdlID0gYXJnc1syICsgYXJnT2Zmc2V0XTtcbiAgY29uc3Qgb3B0aW9ucyA9IGFyZ3NbMyArIGFyZ09mZnNldF07XG4gIGNvbnN0IGludGVycG9sYXRvciA9IGludGVycG9sYXRlKGlucHV0UmFuZ2UsIG91dHB1dFJhbmdlLCB7XG4gICAgbWl4ZXI6IGdldE1peGVyMihvdXRwdXRSYW5nZVswXSksXG4gICAgLi4ub3B0aW9uc1xuICB9KTtcbiAgcmV0dXJuIHVzZUltbWVkaWF0ZSA/IGludGVycG9sYXRvcihpbnB1dFZhbHVlKSA6IGludGVycG9sYXRvcjtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdXNlLWNvbXB1dGVkLm1qc1xudmFyIGltcG9ydF9kaXN0ODkyID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4OTMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q4OTQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiB1c2VDb21wdXRlZChjb21wdXRlKSB7XG4gIGNvbGxlY3RNb3Rpb25WYWx1ZXMuY3VycmVudCA9IFtdO1xuICBjb21wdXRlKCk7XG4gIGNvbnN0IHZhbHVlID0gdXNlQ29tYmluZU1vdGlvblZhbHVlcyhjb2xsZWN0TW90aW9uVmFsdWVzLmN1cnJlbnQsIGNvbXB1dGUpO1xuICBjb2xsZWN0TW90aW9uVmFsdWVzLmN1cnJlbnQgPSB2b2lkIDA7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdXNlLXRyYW5zZm9ybS5tanNcbmZ1bmN0aW9uIHVzZVRyYW5zZm9ybShpbnB1dCwgaW5wdXRSYW5nZU9yVHJhbnNmb3JtZXIsIG91dHB1dFJhbmdlLCBvcHRpb25zKSB7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJldHVybiB1c2VDb21wdXRlZChpbnB1dCk7XG4gIH1cbiAgY29uc3QgdHJhbnNmb3JtZXIgPSB0eXBlb2YgaW5wdXRSYW5nZU9yVHJhbnNmb3JtZXIgPT09IFwiZnVuY3Rpb25cIiA/IGlucHV0UmFuZ2VPclRyYW5zZm9ybWVyIDogdHJhbnNmb3JtKGlucHV0UmFuZ2VPclRyYW5zZm9ybWVyLCBvdXRwdXRSYW5nZSwgb3B0aW9ucyk7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGlucHV0KSA/IHVzZUxpc3RUcmFuc2Zvcm0oaW5wdXQsIHRyYW5zZm9ybWVyKSA6IHVzZUxpc3RUcmFuc2Zvcm0oW2lucHV0XSwgKFtsYXRlc3RdKSA9PiB0cmFuc2Zvcm1lcihsYXRlc3QpKTtcbn1cbmZ1bmN0aW9uIHVzZUxpc3RUcmFuc2Zvcm0odmFsdWVzLCB0cmFuc2Zvcm1lcikge1xuICBjb25zdCBsYXRlc3QgPSB1c2VDb25zdGFudCgoKSA9PiBbXSk7XG4gIHJldHVybiB1c2VDb21iaW5lTW90aW9uVmFsdWVzKHZhbHVlcywgKCkgPT4ge1xuICAgIGxhdGVzdC5sZW5ndGggPSAwO1xuICAgIGNvbnN0IG51bVZhbHVlcyA9IHZhbHVlcy5sZW5ndGg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7IGkrKykge1xuICAgICAgbGF0ZXN0W2ldID0gdmFsdWVzW2ldLmdldCgpO1xuICAgIH1cbiAgICByZXR1cm4gdHJhbnNmb3JtZXIobGF0ZXN0KTtcbiAgfSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3ZhbHVlL3VzZS12ZWxvY2l0eS5tanNcbnZhciBpbXBvcnRfZGlzdDg5OCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0ODk5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTAwID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gdXNlVmVsb2NpdHkodmFsdWUpIHtcbiAgY29uc3QgdmVsb2NpdHkgPSB1c2VNb3Rpb25WYWx1ZSh2YWx1ZS5nZXRWZWxvY2l0eSgpKTtcbiAgY29uc3QgdXBkYXRlVmVsb2NpdHkgPSAoKSA9PiB7XG4gICAgY29uc3QgbGF0ZXN0ID0gdmFsdWUuZ2V0VmVsb2NpdHkoKTtcbiAgICB2ZWxvY2l0eS5zZXQobGF0ZXN0KTtcbiAgICBpZiAobGF0ZXN0KVxuICAgICAgZnJhbWUudXBkYXRlKHVwZGF0ZVZlbG9jaXR5KTtcbiAgfTtcbiAgdXNlTW90aW9uVmFsdWVFdmVudCh2YWx1ZSwgXCJjaGFuZ2VcIiwgKCkgPT4ge1xuICAgIGZyYW1lLnVwZGF0ZSh1cGRhdGVWZWxvY2l0eSwgZmFsc2UsIHRydWUpO1xuICB9KTtcbiAgcmV0dXJuIHZlbG9jaXR5O1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS91c2Utd2lsbC1jaGFuZ2UvaW5kZXgubWpzXG52YXIgaW1wb3J0X2Rpc3Q5MDcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDkwOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDkwOSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdXNlLXdpbGwtY2hhbmdlL1dpbGxDaGFuZ2VNb3Rpb25WYWx1ZS5tanNcbnZhciBpbXBvcnRfZGlzdDkwNCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTA1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTA2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS91c2Utd2lsbC1jaGFuZ2UvZ2V0LXdpbGwtY2hhbmdlLW5hbW
10617UubWpzXG52YXIgaW1wb3J0X2Rpc3Q5MDEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDkwMiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDkwMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIGdldFdpbGxDaGFuZ2VOYW1lKG5hbWUpIHtcbiAgaWYgKHRyYW5zZm9ybVByb3BzLmhhcyhuYW1lKSkge1xuICAgIHJldHVybiBcInRyYW5zZm9ybVwiO1xuICB9IGVsc2UgaWYgKGFjY2VsZXJhdGVkVmFsdWVzLmhhcyhuYW1lKSkge1xuICAgIHJldHVybiBjYW1lbFRvRGFzaChuYW1lKTtcbiAgfVxufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy92YWx1ZS91c2Utd2lsbC1jaGFuZ2UvV2lsbENoYW5nZU1vdGlvblZhbHVlLm1qc1xudmFyIFdpbGxDaGFuZ2VNb3Rpb25WYWx1ZSA9IGNsYXNzIGV4dGVuZHMgTW90aW9uVmFsdWUge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgIHRoaXMudmFsdWVzID0gW107XG4gIH1cbiAgYWRkKG5hbWUpIHtcbiAgICBjb25zdCBzdHlsZU5hbWUgPSBnZXRXaWxsQ2hhbmdlTmFtZShuYW1lKTtcbiAgICBpZiAoc3R5bGVOYW1lKSB7XG4gICAgICBhZGRVbmlxdWVJdGVtKHRoaXMudmFsdWVzLCBzdHlsZU5hbWUpO1xuICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICB9XG4gIH1cbiAgdXBkYXRlKCkge1xuICAgIHRoaXMuc2V0KHRoaXMudmFsdWVzLmxlbmd0aCA/IHRoaXMudmFsdWVzLmpvaW4oXCIsIFwiKSA6IFwiYXV0b1wiKTtcbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdXNlLXdpbGwtY2hhbmdlL2luZGV4Lm1qc1xuZnVuY3Rpb24gdXNlV2lsbENoYW5nZSgpIHtcbiAgcmV0dXJuIHVzZUNvbnN0YW50KCgpID0+IG5ldyBXaWxsQ2hhbmdlTW90aW9uVmFsdWUoXCJhdXRvXCIpKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvcmVkdWNlZC1tb3Rpb24vdXNlLXJlZHVjZWQtbW90aW9uLm1qc1xudmFyIGltcG9ydF9kaXN0OTEwID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5MTEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5MTIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW1wb3J0X3JlYWN0MzUgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSwgMSk7XG5mdW5jdGlvbiB1c2VSZWR1Y2VkTW90aW9uKCkge1xuICAhaGFzUmVkdWNlZE1vdGlvbkxpc3RlbmVyLmN1cnJlbnQgJiYgaW5pdFByZWZlcnNSZWR1Y2VkTW90aW9uKCk7XG4gIGNvbnN0IFtzaG91bGRSZWR1Y2VNb3Rpb25dID0gKDAsIGltcG9ydF9yZWFjdDM1LnVzZVN0YXRlKShwcmVmZXJzUmVkdWNlZE1vdGlvbi5jdXJyZW50KTtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHdhcm5PbmNlKHNob3VsZFJlZHVjZU1vdGlvbiAhPT0gdHJ1ZSwgXCJZb3UgaGF2ZSBSZWR1Y2VkIE1vdGlvbiBlbmFibGVkIG9uIHlvdXIgZGV2aWNlLiBBbmltYXRpb25zIG1heSBub3QgYXBwZWFyIGFzIGV4cGVjdGVkLlwiKTtcbiAgfVxuICByZXR1cm4gc2hvdWxkUmVkdWNlTW90aW9uO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy9yZWR1Y2VkLW1vdGlvbi91c2UtcmVkdWNlZC1tb3Rpb24tY29uZmlnLm1qc1xudmFyIGltcG9ydF9kaXN0OTEzID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5MTQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5MTUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW1wb3J0X3JlYWN0MzYgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSwgMSk7XG5mdW5jdGlvbiB1c2VSZWR1Y2VkTW90aW9uQ29uZmlnKCkge1xuICBjb25zdCByZWR1Y2VkTW90aW9uUHJlZmVyZW5jZSA9IHVzZVJlZHVjZWRNb3Rpb24oKTtcbiAgY29uc3QgeyByZWR1Y2VkTW90aW9uIH0gPSAoMCwgaW1wb3J0X3JlYWN0MzYudXNlQ29udGV4dCkoTW90aW9uQ29uZmlnQ29udGV4dCk7XG4gIGlmIChyZWR1Y2VkTW90aW9uID09PSBcIm5ldmVyXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0gZWxzZSBpZiAocmVkdWNlZE1vdGlvbiA9PT0gXCJhbHdheXNcIikge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZWR1Y2VkTW90aW9uUHJlZmVyZW5jZTtcbiAgfVxufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vaG9va3MvYW5pbWF0aW9uLWNvbnRyb2xzLm1qc1xudmFyIGltcG9ydF9kaXN0OTE2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5MTcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5MTggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBzdG9wQW5pbWF0aW9uKHZpc3VhbEVsZW1lbnQpIHtcbiAgdmlzdWFsRWxlbWVudC52YWx1ZXMuZm9yRWFjaCgodmFsdWUpID0+IHZhbHVlLnN0b3AoKSk7XG59XG5mdW5jdGlvbiBzZXRWYXJpYW50cyh2aXN1YWxFbGVtZW50LCB2YXJpYW50TGFiZWxzKSB7XG4gIGNvbnN0IHJldmVyc2VkTGFiZWxzID0gW
10617y4uLnZhcmlhbnRMYWJlbHNdLnJldmVyc2UoKTtcbiAgcmV2ZXJzZWRMYWJlbHMuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgY29uc3QgdmFyaWFudCA9IHZpc3VhbEVsZW1lbnQuZ2V0VmFyaWFudChrZXkpO1xuICAgIHZhcmlhbnQgJiYgc2V0VGFyZ2V0KHZpc3VhbEVsZW1lbnQsIHZhcmlhbnQpO1xuICAgIGlmICh2aXN1YWxFbGVtZW50LnZhcmlhbnRDaGlsZHJlbikge1xuICAgICAgdmlzdWFsRWxlbWVudC52YXJpYW50Q2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHtcbiAgICAgICAgc2V0VmFyaWFudHMoY2hpbGQsIHZhcmlhbnRMYWJlbHMpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbn1cbmZ1bmN0aW9uIHNldFZhbHVlcyh2aXN1YWxFbGVtZW50LCBkZWZpbml0aW9uKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGRlZmluaXRpb24pKSB7XG4gICAgcmV0dXJuIHNldFZhcmlhbnRzKHZpc3VhbEVsZW1lbnQsIGRlZmluaXRpb24pO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbml0aW9uID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHNldFZhcmlhbnRzKHZpc3VhbEVsZW1lbnQsIFtkZWZpbml0aW9uXSk7XG4gIH0gZWxzZSB7XG4gICAgc2V0VGFyZ2V0KHZpc3VhbEVsZW1lbnQsIGRlZmluaXRpb24pO1xuICB9XG59XG5mdW5jdGlvbiBhbmltYXRpb25Db250cm9scygpIHtcbiAgbGV0IGhhc01vdW50ZWQgPSBmYWxzZTtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICBjb25zdCBjb250cm9scyA9IHtcbiAgICBzdWJzY3JpYmUodmlzdWFsRWxlbWVudCkge1xuICAgICAgc3Vic2NyaWJlcnMuYWRkKHZpc3VhbEVsZW1lbnQpO1xuICAgICAgcmV0dXJuICgpID0+IHZvaWQgc3Vic2NyaWJlcnMuZGVsZXRlKHZpc3VhbEVsZW1lbnQpO1xuICAgIH0sXG4gICAgc3RhcnQoZGVmaW5pdGlvbiwgdHJhbnNpdGlvbk92ZXJyaWRlKSB7XG4gICAgICBpbnZhcmlhbnQoaGFzTW91bnRlZCwgXCJjb250cm9scy5zdGFydCgpIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciBhIGNvbXBvbmVudCBoYXMgbW91bnRlZC4gQ29uc2lkZXIgY2FsbGluZyB3aXRoaW4gYSB1c2VFZmZlY3QgaG9vay5cIik7XG4gICAgICBjb25zdCBhbmltYXRpb25zMiA9IFtdO1xuICAgICAgc3Vic2NyaWJlcnMuZm9yRWFjaCgodmlzdWFsRWxlbWVudCkgPT4ge1xuICAgICAgICBhbmltYXRpb25zMi5wdXNoKGFuaW1hdGVWaXN1YWxFbGVtZW50KHZpc3VhbEVsZW1lbnQsIGRlZmluaXRpb24sIHtcbiAgICAgICAgICB0cmFuc2l0aW9uT3ZlcnJpZGVcbiAgICAgICAgfSkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGwoYW5pbWF0aW9uczIpO1xuICAgIH0sXG4gICAgc2V0KGRlZmluaXRpb24pIHtcbiAgICAgIGludmFyaWFudChoYXNNb3VudGVkLCBcImNvbnRyb2xzLnNldCgpIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBhZnRlciBhIGNvbXBvbmVudCBoYXMgbW91bnRlZC4gQ29uc2lkZXIgY2FsbGluZyB3aXRoaW4gYSB1c2VFZmZlY3QgaG9vay5cIik7XG4gICAgICByZXR1cm4gc3Vic2NyaWJlcnMuZm9yRWFjaCgodmlzdWFsRWxlbWVudCkgPT4ge1xuICAgICAgICBzZXRWYWx1ZXModmlzdWFsRWxlbWVudCwgZGVmaW5pdGlvbik7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIHN0b3AoKSB7XG4gICAgICBzdWJzY3JpYmVycy5mb3JFYWNoKCh2aXN1YWxFbGVtZW50KSA9PiB7XG4gICAgICAgIHN0b3BBbmltYXRpb24odmlzdWFsRWxlbWVudCk7XG4gICAgICB9KTtcbiAgICB9LFxuICAgIG1vdW50KCkge1xuICAgICAgaGFzTW91bnRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICBoYXNNb3VudGVkID0gZmFsc2U7XG4gICAgICAgIGNvbnRyb2xzLnN0b3AoKTtcbiAgICAgIH07XG4gICAgfVxuICB9O1xuICByZXR1cm4gY29udHJvbHM7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9ob29rcy91c2UtYW5pbWF0ZS5tanNcbnZhciBpbXBvcnRfZGlzdDk2NyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTY4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTY5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy91c2UtdW5tb3VudC1lZmZlY3QubWpzXG52YXIgaW1wb3J0X2Rpc3Q5MTkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDkyMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDkyMSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3QzNyA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcbmZ1bmN0aW9uIHVzZVVubW91bnRFZmZlY3QoY2FsbGJhY2spIHtcbiAgcmV0dXJuICgwLCBpbXBvcnRfcmVhY3QzNy51c2VFZmZlY3QpKCgpID0+ICgpID0+IGNhbGxiYWNrKCksIFtdKTtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL2FuaW1hdGUvaW5kZXgubWpzXG52YXIgaW1wb3J0X2Rpc3Q5NjQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDk2NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDk2NiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL2FuaW1hdGUvc2VxdWVuY2UubWpzXG52YXIgaW1wb3J0X2Rpc3Q5NjEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDk2MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDk2MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL3NlcXVlbmNlL2NyZWF0ZS5tanNcbnZhciBpbXBvcnRfZGlzdDk0OSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTUwID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0OTUxID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9lYXNpbmcvdXRpbHMvZ2V0LWVhc2luZy1mb3Itc2VnbWVudC5tanNcbnZhciBpbXBvcnRfZGlzdDkyNSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTI2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTI3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy93cmFwLm1qc1xudmFyIGltcG9ydF9kaXN0OTIyID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5MjMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5MjQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgd3JhcCA9IChtaW4sIG1heCwgdikgPT4ge1xuICBjb25zdCByYW5nZVNpemUgPSBtYXggLSBtaW47XG4gIHJldHVybiAoKHYgLSBtaW4pICUgcmFuZ2VTaXplICsgcmFuZ2VTaXplKSAlIHJhbmdlU2l6ZSArIG1pbjtcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2Vhc2luZy91dGlscy9nZXQtZWFzaW5nLWZvci1zZWdtZW50Lm1qc1xuZnVuY3Rpb24gZ2V0RWFzaW5nRm9yU2VnbWVudChlYXNpbmcsIGkpIHtcbiAgcmV0dXJuIGlzRWFzaW5nQXJyYXkoZWFzaW5nKSA/IGVhc2luZ1t3cmFwKDAsIGVhc2luZy5sZW5ndGgsIGkpXSA6IGVhc2luZztcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL2FuaW1hdGUvcmVzb2x2ZS1zdWJqZWN0cy5tanNcbnZhciBpbXBvcnRfZGlzdDkzMSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTMyID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTMzID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vdXRpbHMvaXMtZG9tLWtleWZyYW1lcy5tanNcbnZhciBpbXBvcnRfZGlzdDkyOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTI5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTMwID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gaXNET01LZXlmcmFtZXMoa2V5ZnJhbWVzMikge1xuICByZXR1cm4gdHlwZW9mIGtleWZyYW1lczIgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkoa2V5ZnJhbWVzMik7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9hbmltYXRlL3Jlc29sdmUtc3ViamVjdHMubWpzXG5mdW5jdGlvbiByZXNvbHZlU3ViamVjdHMoc3ViamVjdCwga2V5ZnJhbWVzMiwgc2NvcGUsIHNlbGVjdG9yQ2FjaGUpIHtcbiAgaWYgKHR5cGVvZiBzdWJqZWN0ID09PSBcInN0cmluZ1wiICYmIGlzRE9NS2V5ZnJhbWVzKGtleWZyYW1lczIpKSB7XG4gICAgcmV0dXJuIHJlc29sdmVFbGVtZW50cyhzdWJqZWN0LCBzY29wZSwgc2VsZWN0b3JDYWNoZSk7XG4gIH0gZWxzZSBpZiAoc3ViamVjdCBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20oc3ViamVjdCk7XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzdWJqZWN0KSkge1xuICAgIHJldHVybiBzdWJqZWN0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBbc3ViamVjdF07XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL3NlcXVlbmNlL3V0aWxzL2NhbGMtcmVwZWF0LWR1cmF0aW9uLm1qc1xudmFyIGltcG9ydF9kaXN0OTM0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5MzUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5MzYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBjYWxjdWxhdGVSZXBlYXREdXJhdGlvbihkdXJhdGlvbiwgcmVwZWF0LCBfcmVwZWF0RGVsYXkpIHtcbiAgcmV0dXJuIGR1cmF0aW9uICogKHJlcGVhdCArIDEpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vc2VxdWVuY2UvdXRpbHMvY2FsYy10aW1lLm1qc1xudmFyIGltcG9ydF9kaXN0OTM3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5MzggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5MzkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBjYWxjTmV4dFRpbWUoY3VycmVudCwgbmV4dCwgcHJldiwgbGFiZWxzKSB7XG4gIHZhciBfYTtcbiAgaWYgKHR5cGVvZiBuZXh0ID09PSBcIm51bWJlclwiKSB7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH0gZWxzZSBpZiAobmV4dC5zdGFydHNXaXRoKFwiLVwiKSB8fCBuZXh0LnN0YXJ0c1dpdGgoXCIrXCIpKSB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIGN1cnJlbnQgKyBwYXJzZU
10617Zsb2F0KG5leHQpKTtcbiAgfSBlbHNlIGlmIChuZXh0ID09PSBcIjxcIikge1xuICAgIHJldHVybiBwcmV2O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiAoX2EgPSBsYWJlbHMuZ2V0KG5leHQpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBjdXJyZW50O1xuICB9XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9zZXF1ZW5jZS91dGlscy9lZGl0Lm1qc1xudmFyIGltcG9ydF9kaXN0OTQwID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5NDEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5NDIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBlcmFzZUtleWZyYW1lcyhzZXF1ZW5jZSwgc3RhcnRUaW1lLCBlbmRUaW1lKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VxdWVuY2UubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBrZXlmcmFtZSA9IHNlcXVlbmNlW2ldO1xuICAgIGlmIChrZXlmcmFtZS5hdCA+IHN0YXJ0VGltZSAmJiBrZXlmcmFtZS5hdCA8IGVuZFRpbWUpIHtcbiAgICAgIHJlbW92ZUl0ZW0oc2VxdWVuY2UsIGtleWZyYW1lKTtcbiAgICAgIGktLTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGFkZEtleWZyYW1lcyhzZXF1ZW5jZSwga2V5ZnJhbWVzMiwgZWFzaW5nLCBvZmZzZXQsIHN0YXJ0VGltZSwgZW5kVGltZSkge1xuICBlcmFzZUtleWZyYW1lcyhzZXF1ZW5jZSwgc3RhcnRUaW1lLCBlbmRUaW1lKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlmcmFtZXMyLmxlbmd0aDsgaSsrKSB7XG4gICAgc2VxdWVuY2UucHVzaCh7XG4gICAgICB2YWx1ZToga2V5ZnJhbWVzMltpXSxcbiAgICAgIGF0OiBtaXhOdW1iZXIoc3RhcnRUaW1lLCBlbmRUaW1lLCBvZmZzZXRbaV0pLFxuICAgICAgZWFzaW5nOiBnZXRFYXNpbmdGb3JTZWdtZW50KGVhc2luZywgaSlcbiAgICB9KTtcbiAgfVxufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vc2VxdWVuY2UvdXRpbHMvbm9ybWFsaXplLXRpbWVzLm1qc1xudmFyIGltcG9ydF9kaXN0OTQzID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5NDQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5NDUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBub3JtYWxpemVUaW1lcyh0aW1lcywgcmVwZWF0KSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGltZXMubGVuZ3RoOyBpKyspIHtcbiAgICB0aW1lc1tpXSA9IHRpbWVzW2ldIC8gKHJlcGVhdCArIDEpO1xuICB9XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9zZXF1ZW5jZS91dGlscy9zb3J0Lm1qc1xudmFyIGltcG9ydF9kaXN0OTQ2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5NDcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5NDggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBjb21wYXJlQnlUaW1lKGEsIGIpIHtcbiAgaWYgKGEuYXQgPT09IGIuYXQpIHtcbiAgICBpZiAoYS52YWx1ZSA9PT0gbnVsbClcbiAgICAgIHJldHVybiAxO1xuICAgIGlmIChiLnZhbHVlID09PSBudWxsKVxuICAgICAgcmV0dXJuIC0xO1xuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhLmF0IC0gYi5hdDtcbiAgfVxufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vc2VxdWVuY2UvY3JlYXRlLm1qc1xudmFyIGRlZmF1bHRTZWdtZW50RWFzaW5nID0gXCJlYXNlSW5PdXRcIjtcbnZhciBNQVhfUkVQRUFUID0gMjA7XG5mdW5jdGlvbiBjcmVhdGVBbmltYXRpb25zRnJvbVNlcXVlbmNlKHNlcXVlbmNlLCB7IGRlZmF1bHRUcmFuc2l0aW9uID0ge30sIC4uLnNlcXVlbmNlVHJhbnNpdGlvbiB9ID0ge30sIHNjb3BlLCBnZW5lcmF0b3JzMikge1xuICBjb25zdCBkZWZhdWx0RHVyYXRpb24gPSBkZWZhdWx0VHJhbnNpdGlvbi5kdXJhdGlvbiB8fCAwLjM7XG4gIGNvbnN0IGFuaW1hdGlvbkRlZmluaXRpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgY29uc3Qgc2VxdWVuY2VzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgY29uc3QgZWxlbWVudENhY2hlID0ge307XG4gIGNvbnN0IHRpbWVMYWJlbHMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICBsZXQgcHJldlRpbWUgPSAwO1xuICBsZXQgY3VycmVudFRpbWUgPSAwO1xuICBsZXQgdG90YWxEdXJhdGlvbiA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2VxdWVuY2UubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzZWdtZW50ID0gc2VxdWVuY2VbaV07XG4gICAgaWYgKHR5cGVvZiBzZWdtZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aW1lTGFiZWxzLnNldChzZWdtZW50LCBjdXJyZW50VGltZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2UgaWYgKCFBcnJheS5pc0FycmF5KHNlZ21lbnQpKSB7XG4gICAgICB0aW1lTGFiZWxzLnNldChzZWdtZW50Lm5hbWUsIGNhbGNOZXh0VGltZS
10617hjdXJyZW50VGltZSwgc2VnbWVudC5hdCwgcHJldlRpbWUsIHRpbWVMYWJlbHMpKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBsZXQgW3N1YmplY3QsIGtleWZyYW1lczIsIHRyYW5zaXRpb24gPSB7fV0gPSBzZWdtZW50O1xuICAgIGlmICh0cmFuc2l0aW9uLmF0ICE9PSB2b2lkIDApIHtcbiAgICAgIGN1cnJlbnRUaW1lID0gY2FsY05leHRUaW1lKGN1cnJlbnRUaW1lLCB0cmFuc2l0aW9uLmF0LCBwcmV2VGltZSwgdGltZUxhYmVscyk7XG4gICAgfVxuICAgIGxldCBtYXhEdXJhdGlvbjIgPSAwO1xuICAgIGNvbnN0IHJlc29sdmVWYWx1ZVNlcXVlbmNlID0gKHZhbHVlS2V5ZnJhbWVzLCB2YWx1ZVRyYW5zaXRpb24sIHZhbHVlU2VxdWVuY2UsIGVsZW1lbnRJbmRleCA9IDAsIG51bVN1YmplY3RzID0gMCkgPT4ge1xuICAgICAgY29uc3QgdmFsdWVLZXlmcmFtZXNBc0xpc3QgPSBrZXlmcmFtZXNBc0xpc3QodmFsdWVLZXlmcmFtZXMpO1xuICAgICAgY29uc3QgeyBkZWxheTogZGVsYXkyID0gMCwgdGltZXMgPSBkZWZhdWx0T2Zmc2V0KHZhbHVlS2V5ZnJhbWVzQXNMaXN0KSwgdHlwZSA9IFwia2V5ZnJhbWVzXCIsIHJlcGVhdCwgcmVwZWF0VHlwZSwgcmVwZWF0RGVsYXkgPSAwLCAuLi5yZW1haW5pbmdUcmFuc2l0aW9uIH0gPSB2YWx1ZVRyYW5zaXRpb247XG4gICAgICBsZXQgeyBlYXNlOiBlYXNlMiA9IGRlZmF1bHRUcmFuc2l0aW9uLmVhc2UgfHwgXCJlYXNlT3V0XCIsIGR1cmF0aW9uIH0gPSB2YWx1ZVRyYW5zaXRpb247XG4gICAgICBjb25zdCBjYWxjdWxhdGVkRGVsYXkgPSB0eXBlb2YgZGVsYXkyID09PSBcImZ1bmN0aW9uXCIgPyBkZWxheTIoZWxlbWVudEluZGV4LCBudW1TdWJqZWN0cykgOiBkZWxheTI7XG4gICAgICBjb25zdCBudW1LZXlmcmFtZXMgPSB2YWx1ZUtleWZyYW1lc0FzTGlzdC5sZW5ndGg7XG4gICAgICBjb25zdCBjcmVhdGVHZW5lcmF0b3IgPSBpc0dlbmVyYXRvcih0eXBlKSA/IHR5cGUgOiBnZW5lcmF0b3JzMiA9PT0gbnVsbCB8fCBnZW5lcmF0b3JzMiA9PT0gdm9pZCAwID8gdm9pZCAwIDogZ2VuZXJhdG9yczJbdHlwZV07XG4gICAgICBpZiAobnVtS2V5ZnJhbWVzIDw9IDIgJiYgY3JlYXRlR2VuZXJhdG9yKSB7XG4gICAgICAgIGxldCBhYnNvbHV0ZURlbHRhID0gMTAwO1xuICAgICAgICBpZiAobnVtS2V5ZnJhbWVzID09PSAyICYmIGlzTnVtYmVyS2V5ZnJhbWVzQXJyYXkodmFsdWVLZXlmcmFtZXNBc0xpc3QpKSB7XG4gICAgICAgICAgY29uc3QgZGVsdGEgPSB2YWx1ZUtleWZyYW1lc0FzTGlzdFsxXSAtIHZhbHVlS2V5ZnJhbWVzQXNMaXN0WzBdO1xuICAgICAgICAgIGFic29sdXRlRGVsdGEgPSBNYXRoLmFicyhkZWx0YSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3ByaW5nVHJhbnNpdGlvbiA9IHsgLi4ucmVtYWluaW5nVHJhbnNpdGlvbiB9O1xuICAgICAgICBpZiAoZHVyYXRpb24gIT09IHZvaWQgMCkge1xuICAgICAgICAgIHNwcmluZ1RyYW5zaXRpb24uZHVyYXRpb24gPSBzZWNvbmRzVG9NaWxsaXNlY29uZHMoZHVyYXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNwcmluZ0Vhc2luZyA9IGNyZWF0ZUdlbmVyYXRvckVhc2luZyhzcHJpbmdUcmFuc2l0aW9uLCBhYnNvbHV0ZURlbHRhLCBjcmVhdGVHZW5lcmF0b3IpO1xuICAgICAgICBlYXNlMiA9IHNwcmluZ0Vhc2luZy5lYXNlO1xuICAgICAgICBkdXJhdGlvbiA9IHNwcmluZ0Vhc2luZy5kdXJhdGlvbjtcbiAgICAgIH1cbiAgICAgIGR1cmF0aW9uICE9PSBudWxsICYmIGR1cmF0aW9uICE9PSB2b2lkIDAgPyBkdXJhdGlvbiA6IGR1cmF0aW9uID0gZGVmYXVsdER1cmF0aW9uO1xuICAgICAgY29uc3Qgc3RhcnRUaW1lID0gY3VycmVudFRpbWUgKyBjYWxjdWxhdGVkRGVsYXk7XG4gICAgICBpZiAodGltZXMubGVuZ3RoID09PSAxICYmIHRpbWVzWzBdID09PSAwKSB7XG4gICAgICAgIHRpbWVzWzFdID0gMTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlbWFpbmRlciA9IHRpbWVzLmxlbmd0aCAtIHZhbHVlS2V5ZnJhbWVzQXNMaXN0Lmxlbmd0aDtcbiAgICAgIHJlbWFpbmRlciA+IDAgJiYgZmlsbE9mZnNldCh0aW1lcywgcmVtYWluZGVyKTtcbiAgICAgIHZhbHVlS2V5ZnJhbWVzQXNMaXN0Lmxlbmd0aCA9PT0gMSAmJiB2YWx1ZUtleWZyYW1lc0FzTGlzdC51bnNoaWZ0KG51bGwpO1xuICAgICAgaWYgKHJlcGVhdCkge1xuICAgICAgICBpbnZhcmlhbnQocmVwZWF0IDwgTUFYX1JFUEVBVCwgXCJSZXBlYXQgY291bnQgdG9vIGhpZ2gsIG11c3QgYmUgbGVzcyB0aGFuIDIwXCIpO1xuICAgICAgICBkdXJhdGlvbiA9IGNhbGN1bGF0ZVJlcGVhdER1cmF0aW9uKGR1cmF0aW9uLCByZXBlYXQpO1xuICAgICAgICBjb25zdCBvcmlnaW5hbEtleWZyYW1lcyA9IFsuLi52YWx1ZUtleWZyYW1lc0FzTGlzdF07XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsVGltZXMgPSBbLi4udGltZXNdO1xuICAgICAgICBlYXNlMiA9IEFycmF5LmlzQXJyYXkoZWFzZTIpID8gWy4uLmVhc2UyXSA6IFtlYXNlMl07XG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRWFzZSA9IFsuLi5lYXNlMl07XG4gICAgICAgIGZvciAobGV0IHJlcGVhdEluZGV4ID0gMDsgcmVwZWF0SW5kZXggPCByZXBlYXQ7IHJlcGVhdEluZGV4KyspIHtcbiAgICAgICAgICB2YWx1ZUtleWZyYW1lc0FzTGlzdC5wdXNoKC4uLm9yaWdpbmFsS2V5ZnJhbWVzKTtcbiAgICAgICAgICBmb3IgKGxldCBrZXlmcmFtZUluZGV4ID0gMDsga2V5ZnJhbWVJbmRleCA8IG9yaWdpbmFsS2V5ZnJhbWVzLmxlbmd0aDsga2V5ZnJhbWVJbmRleCsrKSB7XG4gICAgICAgICAgICB0aW1lcy5wdXNoKG9yaWdpbmFsVGltZXNba2V5ZnJhbWVJbmRleF0gKyAocmVwZWF0SW5kZXggKyAxKSk7XG4gICAgICAgICAgICBlYXNlMi5wdXNoKGtleWZyYW1lSW5kZXggPT09IDAgPyBcImxpbmVhclwiIDogZ2V0RWFzaW5nRm9yU2VnbWVudChvcmlnaW5hbEVhc2UsIGtleWZyYW1lSW5kZXggLSAxKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5vcm1hbGl6ZVRpbWVzKHRpbWVzLCByZXBlYXQpO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0VGltZSA9IHN0YXJ0VGltZSArIGR1cmF0aW9uO1xuICAgICAgYWRkS2V5ZnJhbWVzKHZhbHVlU2VxdWVuY2UsIHZhbHVlS2V5ZnJhbWVzQXNMaXN0LCBlYXNlMiwgdGltZXMsIHN0YXJ0VGltZSwgdGFyZ2V0VGltZSk7XG4gICAgICBtYXhEdXJhdGlvbjIgPSBNYXRoLm1heChjYWxjdWxhdGVkRGVsYXkgKyBkdXJhdGlvbiwgbWF4RHVyYXRpb24yKTtcbiAgICAgIHRvdGFsRHVyYXRpb24gPSBNYXRoLm1heCh0YXJnZXRUaW1lLCB0b3RhbER1cmF0aW9uKTtcbiAgICB9O1xuICAgIGlmIChpc01vdGlvblZhbHVlKHN1YmplY3QpKSB7XG4gICAgICBjb25zdCBzdWJqZWN0U2VxdWVuY2UgPSBnZXRTdWJqZWN0U2VxdWVuY2Uoc3ViamVjdCwgc2VxdWVuY2VzKTtcbiAgICAgIHJlc29sdmVWYWx1ZVNlcXVlbmNlKGtleWZyYW1lczIsIHRyYW5zaXRpb24sIGdldFZhbHVlU2VxdWVuY2UoXCJkZWZhdWx0XCIsIHN1YmplY3RTZXF1ZW5jZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzdWJqZWN0cyA9IHJlc29sdmVTdWJqZWN0cyhzdWJqZWN0LCBrZXlmcmFtZXMyLCBzY29wZSwgZWxlbWVudENhY2hlKTtcbiAgICAgIGNvbnN0IG51bVN1YmplY3RzID0gc3ViamVjdHMubGVuZ3RoO1xuICAgICAgZm9yIChsZXQgc3ViamVjdEluZGV4ID0gMDsgc3ViamVjdEluZGV4IDwgbnVtU3ViamVjdHM7IHN1YmplY3RJbmRleCsrKSB7XG4gICAgICAgIGtleWZyYW1lczIgPSBrZXlmcmFtZXMyO1xuICAgICAgICB0cmFuc2l0aW9uID0gdHJhbnNpdGlvbjtcbiAgICAgICAgY29uc3QgdGhpc1N1YmplY3QgPSBzdWJqZWN0c1tzdWJqZWN0SW5kZXhdO1xuICAgICAgICBjb25zdCBzdWJqZWN0U2VxdWVuY2UgPSBnZXRTdWJqZWN0U2VxdWVuY2UodGhpc1N1YmplY3QsIHNlcXVlbmNlcyk7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIGtleWZyYW1lczIpIHtcbiAgICAgICAgICByZXNvbHZlVmFsdWVTZXF1ZW5jZShrZXlmcmFtZXMyW2tleV0sIGdldFZhbHVlVHJhbnNpdGlvbjIodHJhbnNpdGlvbiwga2V5KSwgZ2V0VmFsdWVTZXF1ZW5jZShrZXksIHN1YmplY3RTZXF1ZW5jZSksIHN1YmplY3RJbmRleCwgbnVtU3ViamVjdHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHByZXZUaW1lID0gY3VycmVudFRpbWU7XG4gICAgY3VycmVudFRpbWUgKz0gbWF4RHVyYXRpb24yO1xuICB9XG4gI
10617HNlcXVlbmNlcy5mb3JFYWNoKCh2YWx1ZVNlcXVlbmNlcywgZWxlbWVudCkgPT4ge1xuICAgIGZvciAoY29uc3Qga2V5IGluIHZhbHVlU2VxdWVuY2VzKSB7XG4gICAgICBjb25zdCB2YWx1ZVNlcXVlbmNlID0gdmFsdWVTZXF1ZW5jZXNba2V5XTtcbiAgICAgIHZhbHVlU2VxdWVuY2Uuc29ydChjb21wYXJlQnlUaW1lKTtcbiAgICAgIGNvbnN0IGtleWZyYW1lczIgPSBbXTtcbiAgICAgIGNvbnN0IHZhbHVlT2Zmc2V0ID0gW107XG4gICAgICBjb25zdCB2YWx1ZUVhc2luZyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZVNlcXVlbmNlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IHsgYXQsIHZhbHVlLCBlYXNpbmcgfSA9IHZhbHVlU2VxdWVuY2VbaV07XG4gICAgICAgIGtleWZyYW1lczIucHVzaCh2YWx1ZSk7XG4gICAgICAgIHZhbHVlT2Zmc2V0LnB1c2gocHJvZ3Jlc3MoMCwgdG90YWxEdXJhdGlvbiwgYXQpKTtcbiAgICAgICAgdmFsdWVFYXNpbmcucHVzaChlYXNpbmcgfHwgXCJlYXNlT3V0XCIpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlT2Zmc2V0WzBdICE9PSAwKSB7XG4gICAgICAgIHZhbHVlT2Zmc2V0LnVuc2hpZnQoMCk7XG4gICAgICAgIGtleWZyYW1lczIudW5zaGlmdChrZXlmcmFtZXMyWzBdKTtcbiAgICAgICAgdmFsdWVFYXNpbmcudW5zaGlmdChkZWZhdWx0U2VnbWVudEVhc2luZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWVPZmZzZXRbdmFsdWVPZmZzZXQubGVuZ3RoIC0gMV0gIT09IDEpIHtcbiAgICAgICAgdmFsdWVPZmZzZXQucHVzaCgxKTtcbiAgICAgICAga2V5ZnJhbWVzMi5wdXNoKG51bGwpO1xuICAgICAgfVxuICAgICAgaWYgKCFhbmltYXRpb25EZWZpbml0aW9ucy5oYXMoZWxlbWVudCkpIHtcbiAgICAgICAgYW5pbWF0aW9uRGVmaW5pdGlvbnMuc2V0KGVsZW1lbnQsIHtcbiAgICAgICAgICBrZXlmcmFtZXM6IHt9LFxuICAgICAgICAgIHRyYW5zaXRpb246IHt9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVmaW5pdGlvbiA9IGFuaW1hdGlvbkRlZmluaXRpb25zLmdldChlbGVtZW50KTtcbiAgICAgIGRlZmluaXRpb24ua2V5ZnJhbWVzW2tleV0gPSBrZXlmcmFtZXMyO1xuICAgICAgZGVmaW5pdGlvbi50cmFuc2l0aW9uW2tleV0gPSB7XG4gICAgICAgIC4uLmRlZmF1bHRUcmFuc2l0aW9uLFxuICAgICAgICBkdXJhdGlvbjogdG90YWxEdXJhdGlvbixcbiAgICAgICAgZWFzZTogdmFsdWVFYXNpbmcsXG4gICAgICAgIHRpbWVzOiB2YWx1ZU9mZnNldCxcbiAgICAgICAgLi4uc2VxdWVuY2VUcmFuc2l0aW9uXG4gICAgICB9O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBhbmltYXRpb25EZWZpbml0aW9ucztcbn1cbmZ1bmN0aW9uIGdldFN1YmplY3RTZXF1ZW5jZShzdWJqZWN0LCBzZXF1ZW5jZXMpIHtcbiAgIXNlcXVlbmNlcy5oYXMoc3ViamVjdCkgJiYgc2VxdWVuY2VzLnNldChzdWJqZWN0LCB7fSk7XG4gIHJldHVybiBzZXF1ZW5jZXMuZ2V0KHN1YmplY3QpO1xufVxuZnVuY3Rpb24gZ2V0VmFsdWVTZXF1ZW5jZShuYW1lLCBzZXF1ZW5jZXMpIHtcbiAgaWYgKCFzZXF1ZW5jZXNbbmFtZV0pXG4gICAgc2VxdWVuY2VzW25hbWVdID0gW107XG4gIHJldHVybiBzZXF1ZW5jZXNbbmFtZV07XG59XG5mdW5jdGlvbiBrZXlmcmFtZXNBc0xpc3Qoa2V5ZnJhbWVzMikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShrZXlmcmFtZXMyKSA/IGtleWZyYW1lczIgOiBba2V5ZnJhbWVzMl07XG59XG5mdW5jdGlvbiBnZXRWYWx1ZVRyYW5zaXRpb24yKHRyYW5zaXRpb24sIGtleSkge1xuICByZXR1cm4gdHJhbnNpdGlvbiAmJiB0cmFuc2l0aW9uW2tleV0gPyB7XG4gICAgLi4udHJhbnNpdGlvbixcbiAgICAuLi50cmFuc2l0aW9uW2tleV1cbiAgfSA6IHsgLi4udHJhbnNpdGlvbiB9O1xufVxudmFyIGlzTnVtYmVyID0gKGtleWZyYW1lKSA9PiB0eXBlb2Yga2V5ZnJhbWUgPT09IFwibnVtYmVyXCI7XG52YXIgaXNOdW1iZXJLZXlmcmFtZXNBcnJheSA9IChrZXlmcmFtZXMyKSA9PiBrZXlmcmFtZXMyLmV2ZXJ5KGlzTnVtYmVyKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL2FuaW1hdGUvc3ViamVjdC5tanNcbnZhciBpbXBvcnRfZGlzdDk1OCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTU5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTYwID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vdXRpbHMvY3JlYXRlLXZpc3VhbC1lbGVtZW50Lm1qc1xudmFyIGltcG9ydF9kaXN0OTU1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5NTYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5NTcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3JlbmRlci9vYmplY3QvT2JqZWN0VmlzdWFsRWxlbWVudC5tanNcbnZhciBpbXBvcnRfZGlzdDk1MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTUzID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTU0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gaXNPYmplY3RLZXkoa2V5LCBvYmplY3QpIHtcbiAgcmV0dXJuIGtleSBpbiBvYmplY3Q7XG59XG52YXIgT2JqZWN0VmlzdWFsRWxlbWVudCA9IGNsYXNzIGV4dGVuZHMgVmlzdWFsRWxlbWVudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgdGhpcy50eXBlID0gXCJvYmplY3RcIjtcbiAgfVxuICByZWFkVmFsdWVGcm9tSW5zdGFuY2UoaW5zdGFuY2UsIGtleSkge1xuICAgIGlmIChpc09iamVjdEtleShrZXksIGluc3RhbmNlKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbnN0YW5jZVtrZXldO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGdldEJhc2VUYXJnZXRGcm9tUHJvcHMoKSB7XG4gICAgcmV0dXJuIHZvaWQgMDtcbiAgfVxuICByZW1vdmVWYWx1ZUZyb21SZW5kZXJTdGF0ZShrZXksIHJlbmRlclN0YXRlKSB7XG4gICAgZGVsZXRlIHJlbmRlclN0YXRlLm91dHB1dFtrZXldO1xuICB9XG4gIG1lYXN1cmVJbnN0YW5jZVZpZXdwb3J0Qm94KCkge1xuICAgIHJldHVybi
10617BjcmVhdGVCb3goKTtcbiAgfVxuICBidWlsZChyZW5kZXJTdGF0ZSwgbGF0ZXN0VmFsdWVzKSB7XG4gICAgT2JqZWN0LmFzc2lnbihyZW5kZXJTdGF0ZS5vdXRwdXQsIGxhdGVzdFZhbHVlcyk7XG4gIH1cbiAgcmVuZGVySW5zdGFuY2UoaW5zdGFuY2UsIHsgb3V0cHV0IH0pIHtcbiAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLCBvdXRwdXQpO1xuICB9XG4gIHNvcnRJbnN0YW5jZU5vZGVQb3NpdGlvbigpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL3V0aWxzL2NyZWF0ZS12aXN1YWwtZWxlbWVudC5tanNcbmZ1bmN0aW9uIGNyZWF0ZURPTVZpc3VhbEVsZW1lbnQoZWxlbWVudCkge1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIHByZXNlbmNlQ29udGV4dDogbnVsbCxcbiAgICBwcm9wczoge30sXG4gICAgdmlzdWFsU3RhdGU6IHtcbiAgICAgIHJlbmRlclN0YXRlOiB7XG4gICAgICAgIHRyYW5zZm9ybToge30sXG4gICAgICAgIHRyYW5zZm9ybU9yaWdpbjoge30sXG4gICAgICAgIHN0eWxlOiB7fSxcbiAgICAgICAgdmFyczoge30sXG4gICAgICAgIGF0dHJzOiB7fVxuICAgICAgfSxcbiAgICAgIGxhdGVzdFZhbHVlczoge31cbiAgICB9XG4gIH07XG4gIGNvbnN0IG5vZGUgPSBpc1NWR0VsZW1lbnQoZWxlbWVudCkgPyBuZXcgU1ZHVmlzdWFsRWxlbWVudChvcHRpb25zKSA6IG5ldyBIVE1MVmlzdWFsRWxlbWVudChvcHRpb25zKTtcbiAgbm9kZS5tb3VudChlbGVtZW50KTtcbiAgdmlzdWFsRWxlbWVudFN0b3JlLnNldChlbGVtZW50LCBub2RlKTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZU9iamVjdFZpc3VhbEVsZW1lbnQoc3ViamVjdCkge1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIHByZXNlbmNlQ29udGV4dDogbnVsbCxcbiAgICBwcm9wczoge30sXG4gICAgdmlzdWFsU3RhdGU6IHtcbiAgICAgIHJlbmRlclN0YXRlOiB7XG4gICAgICAgIG91dHB1dDoge31cbiAgICAgIH0sXG4gICAgICBsYXRlc3RWYWx1ZXM6IHt9XG4gICAgfVxuICB9O1xuICBjb25zdCBub2RlID0gbmV3IE9iamVjdFZpc3VhbEVsZW1lbnQob3B0aW9ucyk7XG4gIG5vZGUubW91bnQoc3ViamVjdCk7XG4gIHZpc3VhbEVsZW1lbnRTdG9yZS5zZXQoc3ViamVjdCwgbm9kZSk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9hbmltYXRlL3N1YmplY3QubWpzXG5mdW5jdGlvbiBpc1NpbmdsZVZhbHVlKHN1YmplY3QsIGtleWZyYW1lczIpIHtcbiAgcmV0dXJuIGlzTW90aW9uVmFsdWUoc3ViamVjdCkgfHwgdHlwZW9mIHN1YmplY3QgPT09IFwibnVtYmVyXCIgfHwgdHlwZW9mIHN1YmplY3QgPT09IFwic3RyaW5nXCIgJiYgIWlzRE9NS2V5ZnJhbWVzKGtleWZyYW1lczIpO1xufVxuZnVuY3Rpb24gYW5pbWF0ZVN1YmplY3Qoc3ViamVjdCwga2V5ZnJhbWVzMiwgb3B0aW9ucywgc2NvcGUpIHtcbiAgY29uc3QgYW5pbWF0aW9uczIgPSBbXTtcbiAgaWYgKGlzU2luZ2xlVmFsdWUoc3ViamVjdCwga2V5ZnJhbWVzMikpIHtcbiAgICBhbmltYXRpb25zMi5wdXNoKGFuaW1hdGVTaW5nbGVWYWx1ZShzdWJqZWN0LCBpc0RPTUtleWZyYW1lcyhrZXlmcmFtZXMyKSA/IGtleWZyYW1lczIuZGVmYXVsdCB8fCBrZXlmcmFtZXMyIDoga2V5ZnJhbWVzMiwgb3B0aW9ucyA/IG9wdGlvbnMuZGVmYXVsdCB8fCBvcHRpb25zIDogb3B0aW9ucykpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHN1YmplY3RzID0gcmVzb2x2ZVN1YmplY3RzKHN1YmplY3QsIGtleWZyYW1lczIsIHNjb3BlKTtcbiAgICBjb25zdCBudW1TdWJqZWN0cyA9IHN1YmplY3RzLmxlbmd0aDtcbiAgICBpbnZhcmlhbnQoQm9vbGVhbihudW1TdWJqZWN0cyksIFwiTm8gdmFsaWQgZWxlbWVudHMgcHJvdmlkZWQuXCIpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtU3ViamVjdHM7IGkrKykge1xuICAgICAgY29uc3QgdGhpc1N1YmplY3QgPSBzdWJqZWN0c1tpXTtcbiAgICAgIGNvbnN0IGNyZWF0ZVZpc3VhbEVsZW1lbnQgPSB0aGlzU3ViamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQgPyBjcmVhdGVET01WaXN1YWxFbGVtZW50IDogY3JlYXRlT2JqZWN0VmlzdWFsRWxlbWVudDtcbiAgICAgIGlmICghdmlzdWFsRWxlbWVudFN0b3JlLmhhcyh0aGlzU3ViamVjdCkpIHtcbiAgICAgICAgY3JlYXRlVmlzdWFsRWxlbWVudCh0aGlzU3ViamVjdCk7XG4gICAgICB9XG4gICAgICBjb25zdCB2aXN1YWxFbGVtZW50ID0gdmlzdWFsRWxlbWVudFN0b3JlLmdldCh0aGlzU3ViamVjdCk7XG4gICAgICBjb25zdCB0cmFuc2l0aW9uID0geyAuLi5vcHRpb25zIH07XG4gICAgICBpZiAoXCJkZWxheVwiIGluIHRyYW5zaXRpb24gJiYgdHlwZW9mIHRyYW5zaXRpb24uZGVsYXkgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICB0cmFuc2l0aW9uLmRlbGF5ID0gdHJhbnNpdGlvbi5kZWxheShpLCBudW1TdWJqZWN0cyk7XG4gICAgICB9XG4gICAgICBhbmltYXRpb25zMi5wdXNoKC4uLmFuaW1hdGVUYXJnZXQodmlzdWFsRWxlbWVudCwgeyAuLi5rZXlmcmFtZXMyLCB0cmFuc2l0aW9uIH0sIHt9KSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBhbmltYXRpb25zMjtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL2FuaW1hdGUvc2VxdWVuY2UubWpzXG5mdW5jdGlvbiBhbmltYXRlU2VxdWVuY2Uoc2VxdWVuY2UsIG9wdGlvbnMsIHNjb3BlKSB7XG4gIGNvbnN0IGFuaW1hdGlvbnMyID0gW107XG4gIGNvbnN0IGFuaW1hdGlvbkRlZmluaXRpb25zID0gY3JlYXRlQW5pbWF0aW9uc0Zyb21TZXF1ZW5jZShzZXF1ZW5jZSwgb3B0aW9ucywgc2NvcGUsIHsgc3ByaW5nIH0pO1xuICBhbmltYXRpb25EZWZpbml0aW9ucy5mb3JFYWNoKCh7IGtleWZyYW1lczoga2V5ZnJhbWVzMiwgdHJhbnNpdGlvbiB9LCBzdWJqZWN0KSA9PiB7XG4gICAgYW5pbWF0aW9uczIucHVzaCguLi5hbmltYXRlU3ViamVjdChzdWJqZWN0LCBrZXlmcmFtZXMyLCB0cmFuc2l0aW9uKSk7XG4gIH0pO1xuICByZXR1cm4gYW5pbWF0aW9uczI7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9hbmltYXRlL2luZGV4Lm1qc1xuZnVuY3Rpb24gaXNTZXF1ZW5jZSh2YWx1ZSkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuc29tZShBcnJheS5pc0FycmF
106175KTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZVNjb3BlZEFuaW1hdGUoc2NvcGUpIHtcbiAgZnVuY3Rpb24gc2NvcGVkQW5pbWF0ZShzdWJqZWN0T3JTZXF1ZW5jZSwgb3B0aW9uc09yS2V5ZnJhbWVzLCBvcHRpb25zKSB7XG4gICAgbGV0IGFuaW1hdGlvbnMyID0gW107XG4gICAgaWYgKGlzU2VxdWVuY2Uoc3ViamVjdE9yU2VxdWVuY2UpKSB7XG4gICAgICBhbmltYXRpb25zMiA9IGFuaW1hdGVTZXF1ZW5jZShzdWJqZWN0T3JTZXF1ZW5jZSwgb3B0aW9uc09yS2V5ZnJhbWVzLCBzY29wZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFuaW1hdGlvbnMyID0gYW5pbWF0ZVN1YmplY3Qoc3ViamVjdE9yU2VxdWVuY2UsIG9wdGlvbnNPcktleWZyYW1lcywgb3B0aW9ucywgc2NvcGUpO1xuICAgIH1cbiAgICBjb25zdCBhbmltYXRpb24gPSBuZXcgR3JvdXBQbGF5YmFja0NvbnRyb2xzKGFuaW1hdGlvbnMyKTtcbiAgICBpZiAoc2NvcGUpIHtcbiAgICAgIHNjb3BlLmFuaW1hdGlvbnMucHVzaChhbmltYXRpb24pO1xuICAgIH1cbiAgICByZXR1cm4gYW5pbWF0aW9uO1xuICB9XG4gIHJldHVybiBzY29wZWRBbmltYXRlO1xufVxudmFyIGFuaW1hdGUgPSBjcmVhdGVTY29wZWRBbmltYXRlKCk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9ob29rcy91c2UtYW5pbWF0ZS5tanNcbmZ1bmN0aW9uIHVzZUFuaW1hdGUoKSB7XG4gIGNvbnN0IHNjb3BlID0gdXNlQ29uc3RhbnQoKCkgPT4gKHtcbiAgICBjdXJyZW50OiBudWxsLFxuICAgIC8vIFdpbGwgYmUgaHlkcmF0ZWQgYnkgUmVhY3RcbiAgICBhbmltYXRpb25zOiBbXVxuICB9KSk7XG4gIGNvbnN0IGFuaW1hdGUyID0gdXNlQ29uc3RhbnQoKCkgPT4gY3JlYXRlU2NvcGVkQW5pbWF0ZShzY29wZSkpO1xuICB1c2VVbm1vdW50RWZmZWN0KCgpID0+IHtcbiAgICBzY29wZS5hbmltYXRpb25zLmZvckVhY2goKGFuaW1hdGlvbikgPT4gYW5pbWF0aW9uLnN0b3AoKSk7XG4gIH0pO1xuICByZXR1cm4gW3Njb3BlLCBhbmltYXRlMl07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9ob29rcy91c2UtYW5pbWF0ZS1zdHlsZS5tanNcbnZhciBpbXBvcnRfZGlzdDk4NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTg2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTg3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vYW5pbWF0b3JzL3dhYXBpL2FuaW1hdGUtc3R5bGUubWpzXG52YXIgaW1wb3J0X2Rpc3Q5ODIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDk4MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDk4NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL2FuaW1hdG9ycy93YWFwaS9hbmltYXRlLWVsZW1lbnRzLm1qc1xudmFyIGltcG9ydF9kaXN0OTc5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5ODAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5ODEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9hbmltYXRvcnMvd2FhcGkvTmF0aXZlQW5pbWF0aW9uLm1qc1xudmFyIGltcG9ydF9kaXN0OTc2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5NzcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5NzggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9hbmltYXRvcnMvd2FhcGkvdXRpbHMvc3R5bGUubWpzXG52YXIgaW1wb3J0X2Rpc3Q5NzAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDk3MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDk3MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIHNldENTU1ZhcihlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICBlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KGAtLSR7bmFtZX1gLCB2YWx1ZSk7XG59XG5mdW5jdGlvbiBzZXRTdHlsZShlbGVtZW50LCBuYW1lLCB2YWx1ZSkge1xuICBlbGVtZW50LnN0eWxlW25hbWVdID0gdmFsdWU7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9hbmltYXRvcnMvd2FhcGkvdXRpbHMvc3VwcG9ydHMtcGFydGlhbC1rZXlmcmFtZXMubWpzXG52YXIgaW1wb3J0X2Rpc3Q5NzMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDk3NCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDk3NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBzdXBwb3J0c1BhcnRpYWxLZXlmcmFtZXMgPSBtZW1vKCgpID0+IHtcbiAgdHJ5IHtcbiAgICBkb2
10617N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLmFuaW1hdGUoeyBvcGFjaXR5OiBbMV0gfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59KTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL2FuaW1hdG9ycy93YWFwaS9OYXRpdmVBbmltYXRpb24ubWpzXG52YXIgc3RhdGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbmZ1bmN0aW9uIGh5ZHJhdGVLZXlmcmFtZXModmFsdWVOYW1lLCBrZXlmcmFtZXMyLCByZWFkKSB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5ZnJhbWVzMi5sZW5ndGg7IGkrKykge1xuICAgIGlmIChrZXlmcmFtZXMyW2ldID09PSBudWxsKSB7XG4gICAgICBrZXlmcmFtZXMyW2ldID0gaSA9PT0gMCA/IHJlYWQoKSA6IGtleWZyYW1lczJbaSAtIDFdO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGtleWZyYW1lczJbaV0gPT09IFwibnVtYmVyXCIgJiYgYnJvd3Nlck51bWJlclZhbHVlVHlwZXNbdmFsdWVOYW1lXSkge1xuICAgICAga2V5ZnJhbWVzMltpXSA9IGJyb3dzZXJOdW1iZXJWYWx1ZVR5cGVzW3ZhbHVlTmFtZV0udHJhbnNmb3JtKGtleWZyYW1lczJbaV0pO1xuICAgIH1cbiAgfVxuICBpZiAoIXN1cHBvcnRzUGFydGlhbEtleWZyYW1lcygpICYmIGtleWZyYW1lczIubGVuZ3RoIDwgMikge1xuICAgIGtleWZyYW1lczIudW5zaGlmdChyZWFkKCkpO1xuICB9XG59XG52YXIgZGVmYXVsdEVhc2luZzIgPSBcImVhc2VPdXRcIjtcbmZ1bmN0aW9uIGdldEVsZW1lbnRBbmltYXRpb25TdGF0ZShlbGVtZW50KSB7XG4gIGNvbnN0IGFuaW1hdGlvblN0YXRlID0gc3RhdGUuZ2V0KGVsZW1lbnQpIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIHN0YXRlLnNldChlbGVtZW50LCBhbmltYXRpb25TdGF0ZSk7XG4gIHJldHVybiBzdGF0ZS5nZXQoZWxlbWVudCk7XG59XG52YXIgTmF0aXZlQW5pbWF0aW9uID0gY2xhc3MgZXh0ZW5kcyBOYXRpdmVBbmltYXRpb25Db250cm9scyB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQsIHZhbHVlTmFtZSwgdmFsdWVLZXlmcmFtZXMsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBpc0NTU1ZhciA9IHZhbHVlTmFtZS5zdGFydHNXaXRoKFwiLS1cIik7XG4gICAgaW52YXJpYW50KHR5cGVvZiBvcHRpb25zLnR5cGUgIT09IFwic3RyaW5nXCIsIGBhbmltYXRlTWluaSBkb2Vzbid0IHN1cHBvcnQgXCJ0eXBlXCIgYXMgYSBzdHJpbmcuIERpZCB5b3UgbWVhbiB0byBpbXBvcnQgeyBzcHJpbmcgfSBmcm9tIFwiZnJhbWVyLW1vdGlvblwiP2ApO1xuICAgIGNvbnN0IGV4aXN0aW5nQW5pbWF0aW9uID0gZ2V0RWxlbWVudEFuaW1hdGlvblN0YXRlKGVsZW1lbnQpLmdldCh2YWx1ZU5hbWUpO1xuICAgIGV4aXN0aW5nQW5pbWF0aW9uICYmIGV4aXN0aW5nQW5pbWF0aW9uLnN0b3AoKTtcbiAgICBjb25zdCByZWFkSW5pdGlhbEtleWZyYW1lID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIHZhbHVlTmFtZS5zdGFydHNXaXRoKFwiLS1cIikgPyBlbGVtZW50LnN0eWxlLmdldFByb3BlcnR5VmFsdWUodmFsdWVOYW1lKSA6IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpW3ZhbHVlTmFtZV07XG4gICAgfTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVLZXlmcmFtZXMpKSB7XG4gICAgICB2YWx1ZUtleWZyYW1lcyA9IFt2YWx1ZUtleWZyYW1lc107XG4gICAgfVxuICAgIGh5ZHJhdGVLZXlmcmFtZXModmFsdWVOYW1lLCB2YWx1ZUtleWZyYW1lcywgcmVhZEluaXRpYWxLZXlmcmFtZSk7XG4gICAgaWYgKGlzR2VuZXJhdG9yKG9wdGlvbnMudHlwZSkpIHtcbiAgICAgIGNvbnN0IGdlbmVyYXRvck9wdGlvbnMgPSBjcmVhdGVHZW5lcmF0b3JFYXNpbmcob3B0aW9ucywgMTAwLCBvcHRpb25zLnR5cGUpO1xuICAgICAgb3B0aW9ucy5lYXNlID0gc3VwcG9ydHNMaW5lYXJFYXNpbmcoKSA/IGdlbmVyYXRvck9wdGlvbnMuZWFzZSA6IGRlZmF1bHRFYXNpbmcyO1xuICAgICAgb3B0aW9ucy5kdXJhdGlvbiA9IHNlY29uZHNUb01pbGxpc2Vjb25kcyhnZW5lcmF0b3JPcHRpb25zLmR1cmF0aW9uKTtcbiAgICAgIG9wdGlvbnMudHlwZSA9IFwia2V5ZnJhbWVzXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9wdGlvbnMuZWFzZSA9IG9wdGlvbnMuZWFzZSB8fCBkZWZhdWx0RWFzaW5nMjtcbiAgICB9XG4gICAgY29uc3Qgb25GaW5pc2ggPSAoKSA9PiB7XG4gICAgICB0aGlzLnNldFZhbHVlKGVsZW1lbnQsIHZhbHVlTmFtZSwgZ2V0RmluYWxLZXlmcmFtZSh2YWx1ZUtleWZyYW1lcywgb3B0aW9ucykpO1xuICAgICAgdGhpcy5jYW5jZWwoKTtcbiAgICAgIHRoaXMucmVzb2x2ZUZpbmlzaGVkUHJvbWlzZSgpO1xuICAgIH07XG4gICAgY29uc3QgaW5pdCA9ICgpID0+IHtcbiAgICAgIHRoaXMuc2V0VmFsdWUgPSBpc0NTU1ZhciA/IHNldENTU1ZhciA6IHNldFN0eWxlO1xuICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgIHRoaXMudXBkYXRlRmluaXNoZWRQcm9taXNlKCk7XG4gICAgICB0aGlzLnJlbW92ZUFuaW1hdGlvbiA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudFN0YXRlID0gc3RhdGUuZ2V0KGVsZW1lbnQpO1xuICAgICAgICBlbGVtZW50U3RhdGUgJiYgZWxlbWVudFN0YXRlLmRlbGV0ZSh2YWx1ZU5hbWUpO1xuICAgICAgfTtcbiAgICB9O1xuICAgIGlmICghc3VwcG9ydHNXYWFwaSgpKSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgaW5pdCgpO1xuICAgICAgb25GaW5pc2goKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3VwZXIoc3RhcnRXYWFwaUFuaW1hdGlvbihlbGVtZW50LCB2YWx1ZU5hbWUsIHZhbHVlS2V5ZnJhbWVzLCBvcHRpb25zKSk7XG4gICAgICBpbml0KCk7XG4gICAgICBpZiAob3B0aW9ucy5hdXRvcGxheSA9PT0gZmFsc2UpIHtcbiAgICAgICAgdGhpcy5hbmltYXRpb24ucGF1c2UoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYW5pbWF0aW9uLm9uZmluaXNoID0gb25GaW5pc2g7XG4gICAgICBnZXRFbGVtZW50QW5pbWF0aW9uU3RhdGUoZWxlbWVudCkuc2V0KHZhbHVlTmFtZSwgdGh
10617pcyk7XG4gICAgfVxuICB9XG4gIC8qKlxuICAgKiBBbGxvd3MgdGhlIHJldHVybmVkIGFuaW1hdGlvbiB0byBiZSBhd2FpdGVkIG9yIHByb21pc2UtY2hhaW5lZC4gQ3VycmVudGx5XG4gICAqIHJlc29sdmVzIHdoZW4gdGhlIGFuaW1hdGlvbiBmaW5pc2hlcyBhdCBhbGwgYnV0IGluIGEgZnV0dXJlIHVwZGF0ZSBjb3VsZC9zaG91bGRcbiAgICogcmVqZWN0IGlmIGl0cyBjYW5jZWxzLlxuICAgKi9cbiAgdGhlbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50RmluaXNoZWRQcm9taXNlLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgfVxuICB1cGRhdGVGaW5pc2hlZFByb21pc2UoKSB7XG4gICAgdGhpcy5jdXJyZW50RmluaXNoZWRQcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZUZpbmlzaGVkUHJvbWlzZSA9IHJlc29sdmU7XG4gICAgfSk7XG4gIH1cbiAgcGxheSgpIHtcbiAgICBpZiAodGhpcy5zdGF0ZSA9PT0gXCJmaW5pc2hlZFwiKSB7XG4gICAgICB0aGlzLnVwZGF0ZUZpbmlzaGVkUHJvbWlzZSgpO1xuICAgIH1cbiAgICBzdXBlci5wbGF5KCk7XG4gIH1cbiAgY2FuY2VsKCkge1xuICAgIHRoaXMucmVtb3ZlQW5pbWF0aW9uKCk7XG4gICAgc3VwZXIuY2FuY2VsKCk7XG4gIH1cbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9hbmltYXRvcnMvd2FhcGkvYW5pbWF0ZS1lbGVtZW50cy5tanNcbmZ1bmN0aW9uIGFuaW1hdGVFbGVtZW50cyhlbGVtZW50T3JTZWxlY3Rvciwga2V5ZnJhbWVzMiwgb3B0aW9ucywgc2NvcGUpIHtcbiAgY29uc3QgZWxlbWVudHMgPSByZXNvbHZlRWxlbWVudHMoZWxlbWVudE9yU2VsZWN0b3IsIHNjb3BlKTtcbiAgY29uc3QgbnVtRWxlbWVudHMgPSBlbGVtZW50cy5sZW5ndGg7XG4gIGludmFyaWFudChCb29sZWFuKG51bUVsZW1lbnRzKSwgXCJObyB2YWxpZCBlbGVtZW50IHByb3ZpZGVkLlwiKTtcbiAgY29uc3QgYW5pbWF0aW9uczIgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1FbGVtZW50czsgaSsrKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldO1xuICAgIGNvbnN0IGVsZW1lbnRUcmFuc2l0aW9uID0geyAuLi5vcHRpb25zIH07XG4gICAgaWYgKHR5cGVvZiBlbGVtZW50VHJhbnNpdGlvbi5kZWxheSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBlbGVtZW50VHJhbnNpdGlvbi5kZWxheSA9IGVsZW1lbnRUcmFuc2l0aW9uLmRlbGF5KGksIG51bUVsZW1lbnRzKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB2YWx1ZU5hbWUgaW4ga2V5ZnJhbWVzMikge1xuICAgICAgY29uc3QgdmFsdWVLZXlmcmFtZXMgPSBrZXlmcmFtZXMyW3ZhbHVlTmFtZV07XG4gICAgICBjb25zdCB2YWx1ZU9wdGlvbnMgPSB7XG4gICAgICAgIC4uLmdldFZhbHVlVHJhbnNpdGlvbihlbGVtZW50VHJhbnNpdGlvbiwgdmFsdWVOYW1lKVxuICAgICAgfTtcbiAgICAgIHZhbHVlT3B0aW9ucy5kdXJhdGlvbiA9IHZhbHVlT3B0aW9ucy5kdXJhdGlvbiA/IHNlY29uZHNUb01pbGxpc2Vjb25kcyh2YWx1ZU9wdGlvbnMuZHVyYXRpb24pIDogdmFsdWVPcHRpb25zLmR1cmF0aW9uO1xuICAgICAgdmFsdWVPcHRpb25zLmRlbGF5ID0gc2Vjb25kc1RvTWlsbGlzZWNvbmRzKHZhbHVlT3B0aW9ucy5kZWxheSB8fCAwKTtcbiAgICAgIGFuaW1hdGlvbnMyLnB1c2gobmV3IE5hdGl2ZUFuaW1hdGlvbihlbGVtZW50LCB2YWx1ZU5hbWUsIHZhbHVlS2V5ZnJhbWVzLCB2YWx1ZU9wdGlvbnMpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGFuaW1hdGlvbnMyO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vYW5pbWF0b3JzL3dhYXBpL2FuaW1hdGUtc3R5bGUubWpzXG52YXIgY3JlYXRlU2NvcGVkV2FhcGlBbmltYXRlID0gKHNjb3BlKSA9PiB7XG4gIGZ1bmN0aW9uIHNjb3BlZEFuaW1hdGUoZWxlbWVudE9yU2VsZWN0b3IsIGtleWZyYW1lczIsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEdyb3VwUGxheWJhY2tDb250cm9scyhhbmltYXRlRWxlbWVudHMoZWxlbWVudE9yU2VsZWN0b3IsIGtleWZyYW1lczIsIG9wdGlvbnMsIHNjb3BlKSk7XG4gIH1cbiAgcmV0dXJuIHNjb3BlZEFuaW1hdGU7XG59O1xudmFyIGFuaW1hdGVNaW5pID0gY3JlYXRlU2NvcGVkV2FhcGlBbmltYXRlKCk7XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9ob29rcy91c2UtYW5pbWF0ZS1zdHlsZS5tanNcbmZ1bmN0aW9uIHVzZUFuaW1hdGVNaW5pKCkge1xuICBjb25zdCBzY29wZSA9IHVzZUNvbnN0YW50KCgpID0+ICh7XG4gICAgY3VycmVudDogbnVsbCxcbiAgICAvLyBXaWxsIGJlIGh5ZHJhdGVkIGJ5IFJlYWN0XG4gICAgYW5pbWF0aW9uczogW11cbiAgfSkpO1xuICBjb25zdCBhbmltYXRlMiA9IHVzZUNvbnN0YW50KCgpID0+IGNyZWF0ZVNjb3BlZFdhYXBpQW5pbWF0ZShzY29wZSkpO1xuICB1c2VVbm1vdW50RWZmZWN0KCgpID0+IHtcbiAgICBzY29wZS5hbmltYXRpb25zLmZvckVhY2goKGFuaW1hdGlvbikgPT4gYW5pbWF0aW9uLnN0b3AoKSk7XG4gIH0pO1xuICByZXR1cm4gW3Njb3BlLCBhbmltYXRlMl07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9ob29rcy91c2UtYW5pbWF0aW9uLm1qc1xudmFyIGltcG9ydF9kaXN0OTg4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5ODkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5OTAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiB1c2VBbmltYXRpb25Db250cm9scygpIHtcbiAgY29uc3QgY29udHJvbHMgPSB1c2VDb25zdGFudChhbmltYXRpb25Db250cm9scyk7XG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QoY29udHJvbHMubW91bnQsIFtdKTtcbiAgcmV0dXJuIGNvbnRyb2xzO1xufVxudmFyIHVzZUFuaW1hdGlvbiA9IHVzZUFuaW1hdGlvbkNvbnRyb2xzO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9ldmVudHMvdXNlLWRvbS1ldmVudC5tanNcbnZhciBpbXBvcnRfZGlzdDk5MSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0OTkyID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0OTkzID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGltcG9ydF9yZWFjdDM4ID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksIDEpO1xuZnVuY3Rpb24gdXNlRG9tRXZlbnQocmVmLCBldmVudE5hbWUsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgKDAsIGltcG9ydF9yZWFjdDM4LnVzZUVmZmVjdCkoKCkgPT4ge1xuICAgIGNvbnN0IGVsZW1lbnQgPSByZWYuY3VycmVudDtcbiAgICBpZiAoaGFuZGxlciAmJiBlbGVtZW50KSB7XG4gICAgICByZXR1cm4gYWRkRG9tRXZlbnQoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICB9XG4gIH0sIFtyZWYsIGV2ZW50TmFtZSwgaGFuZGxlciwgb3B0aW9uc10pO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9nZXN0dXJlcy9kcmFnL3VzZS1kcmFnLWNvbnRyb2xzLm1qc1xudmFyIGltcG9ydF9kaXN0OTk0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5OTUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5OTYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgRHJhZ0NvbnRyb2xzID0gY2xhc3Mge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNvbXBvbmVudENvbnRyb2xzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgfVxuICAvKipcbiAgICogU3Vic2NyaWJlIGEgY29tcG9uZW50J3MgaW50ZXJuYWwgYFZpc3VhbEVsZW1lbnREcmFnQ29udHJvbHNgIHRvIHRoZSB1c2VyLWZhY2luZyBBUEkuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgc3Vic2NyaWJlKGNvbnRyb2xzKSB7XG4gICAgdGhpcy5jb21wb25lbnRDb250cm9scy5hZGQoY29udHJvbHMpO1xuICAgIHJldHVybiAoKSA9PiB0aGlzLmNvbXBvbmVudENvbnRyb2xzLmRlbGV0ZShjb250cm9scyk7XG4gIH1cbiAgLyoqXG4gICAqIFN0YXJ0IGEgZHJhZyBnZXN0dXJlIG9uIGV2ZXJ5IGBtb3Rpb25gIGNvbXBvbmVudCB0aGF0IGhhcyB0aGlzIHNldCBvZiBkcmFnIGNvbnRyb2xzXG4gICAqIHBhc3NlZCBpbnRvIGl0IHZpYSB0aGUgYGRyYWdDb250cm9sc2AgcHJvcC5cbiAgICpcbiAgICogYGBganN4XG4gICAqIGRyYWdDb250cm9scy5zdGFydChlLCB7XG4gICAqICAgc25hcFRvQ3Vyc29yOiB0cnVlXG4gICAqIH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgLSBQb2ludGVyRXZlbnRcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25zXG4gICAqXG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHN0YXJ0KGV2ZW50LCBvcHRpb25zKSB7XG4gICAgdGhpcy5jb21wb25lbnRDb250cm9scy5mb3JFYWNoKChjb250cm9scykgPT4ge1xuICAgICAgY29udHJvbHMuc3RhcnQoZXZlbnQubmF0aXZlRXZlbnQgfHwgZXZlbnQsIG9wdGlvbnMpO1xuICAgIH0pO1xuICB9XG59O1xudmFyIGNyZWF0ZURyYWdDb250cm9scyA9ICgpID0+IG5ldyBEcmFnQ29udHJvbHMoKTtcbmZ1bmN0aW9uIHVzZURyYWdDb250cm9scygpIHtcbiAgcmV0dXJuIHVzZUNvbnN0YW50KGNyZWF0ZURyYWdDb250cm9scyk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL21vdGlvbi91dGlscy9pcy1tb3Rpb24tY29tcG9uZW50Lm1qc1xudmFyIGltcG9ydF9kaXN0OTk3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5OTggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3Q5OTkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiBpc01vdGlvbkNvbXBvbmVudChjb21wb25lbnQpIHtcbiAgcmV0dXJuIGNvbXBvbmVudCAhPT0gbnVsbCAmJiB0eXBlb2YgY29tcG9uZW50ID09PSBcIm9iamVjdFwiICYmIG1vdGlvbkNvbXBvbmVudFN5bWJvbCBpbiBjb21wb25lbnQ7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL21vdGlvbi91dGlscy91bndyYXAtbW90aW9uLWNvbXBvbmVudC5tanNcbnZhciBpbXBvcnRfZGlzdDEwMDAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwMDEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDAyID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gdW53cmFwTW90aW9uQ29tcG9uZW50KGNvbXBvbmVudCkge1xuICBpZiAoaXNNb3Rpb25Db21wb25lbnQoY29tcG9uZW50KSkge1xuICAgIHJldHVybiBjb21wb25lbnRbbW90aW9uQ29tcG9uZW50U3ltYm9sXTtcbiAgfVxuICByZXR1cm4gdm9pZCAwO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9wcm9qZWN0aW9uL3VzZS1pbnN0YW50LWxheW91dC10cmFuc2l0aW9uLm1qc1xudmFyIGltcG9ydF9kaXN0MTAwMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTAwNCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwMDUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG5mdW5jdGlvbiB1c2VJbnN0YW50TGF5b3V0VHJhbnNpdGlvbigpIHtcbiAgcmV0dXJuIHN0YXJ0VHJhbnNpdGlvbjtcbn1cbmZ1bmN0aW9uIHN0YXJ0VHJhbnNpdGlvbihjYWxsYmFjaykge1xuICBpZiAoIXJvb3RQcm9qZWN0aW9uTm9kZS5jdXJyZW50KVxuICAgIHJldHVybjtcbiAgcm9vdFByb2plY3Rpb25Ob2RlLmN1cnJlbnQuaXNVcGRhdGluZyA9IGZhbHNlO1xuICByb290UHJvamVjdGlvbk5vZGUuY3VycmVudC5ibG9ja1VwZGF0ZSgpO1xuICBjYWxsYmFjayAmJiBjYWxsYmFjaygpO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9wcm9qZWN0aW9uL3VzZS1yZXNldC1wcm9qZWN0aW9uLm1qc1xudmFyIGltcG9ydF9kaXN0MTAwNiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTAwNyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwMDggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW1wb3J0X3JlYWN0MzkgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSwgMSk7XG5mdW5jdGlvbiB1c2VSZXNldFByb2plY3Rpb24oKSB7XG4gIGNvbnN0IHJlc2V0ID0gK
10617DAsIGltcG9ydF9yZWFjdDM5LnVzZUNhbGxiYWNrKSgoKSA9PiB7XG4gICAgY29uc3Qgcm9vdCA9IHJvb3RQcm9qZWN0aW9uTm9kZS5jdXJyZW50O1xuICAgIGlmICghcm9vdClcbiAgICAgIHJldHVybjtcbiAgICByb290LnJlc2V0VHJlZSgpO1xuICB9LCBbXSk7XG4gIHJldHVybiByZXNldDtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvdXNlLWN5Y2xlLm1qc1xudmFyIGltcG9ydF9kaXN0MTAwOSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTAxMCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwMTEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW1wb3J0X3JlYWN0NDAgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSwgMSk7XG5mdW5jdGlvbiB1c2VDeWNsZSguLi5pdGVtcykge1xuICBjb25zdCBpbmRleCA9ICgwLCBpbXBvcnRfcmVhY3Q0MC51c2VSZWYpKDApO1xuICBjb25zdCBbaXRlbSwgc2V0SXRlbV0gPSAoMCwgaW1wb3J0X3JlYWN0NDAudXNlU3RhdGUpKGl0ZW1zW2luZGV4LmN1cnJlbnRdKTtcbiAgY29uc3QgcnVuQ3ljbGUgPSAoMCwgaW1wb3J0X3JlYWN0NDAudXNlQ2FsbGJhY2spKFxuICAgIChuZXh0KSA9PiB7XG4gICAgICBpbmRleC5jdXJyZW50ID0gdHlwZW9mIG5leHQgIT09IFwibnVtYmVyXCIgPyB3cmFwKDAsIGl0ZW1zLmxlbmd0aCwgaW5kZXguY3VycmVudCArIDEpIDogbmV4dDtcbiAgICAgIHNldEl0ZW0oaXRlbXNbaW5kZXguY3VycmVudF0pO1xuICAgIH0sXG4gICAgLy8gVGhlIGFycmF5IHdpbGwgY2hhbmdlIG9uIGVhY2ggY2FsbCwgYnV0IGJ5IHB1dHRpbmcgaXRlbXMubGVuZ3RoIGF0XG4gICAgLy8gdGhlIGZyb250IG9mIHRoaXMgYXJyYXksIHdlIGd1YXJhbnRlZSB0aGUgZGVwZW5kZW5jeSBjb21wYXJpc29uIHdpbGwgbWF0Y2ggdXBcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcmVhY3QtaG9va3MvZXhoYXVzdGl2ZS1kZXBzXG4gICAgW2l0ZW1zLmxlbmd0aCwgLi4uaXRlbXNdXG4gICk7XG4gIHJldHVybiBbaXRlbSwgcnVuQ3ljbGVdO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy91dGlscy91c2UtaW4tdmlldy5tanNcbnZhciBpbXBvcnRfZGlzdDEwMTUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwMTYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDE3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGltcG9ydF9yZWFjdDQ
10617xID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9yZW5kZXIvZG9tL3ZpZXdwb3J0L2luZGV4Lm1qc1xudmFyIGltcG9ydF9kaXN0MTAxMiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTAxMyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwMTQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgdGhyZXNob2xkcyA9IHtcbiAgc29tZTogMCxcbiAgYWxsOiAxXG59O1xuZnVuY3Rpb24gaW5WaWV3KGVsZW1lbnRPclNlbGVjdG9yLCBvblN0YXJ0LCB7IHJvb3QsIG1hcmdpbjogcm9vdE1hcmdpbiwgYW1vdW50ID0gXCJzb21lXCIgfSA9IHt9KSB7XG4gIGNvbnN0IGVsZW1lbnRzID0gcmVzb2x2ZUVsZW1lbnRzKGVsZW1lbnRPclNlbGVjdG9yKTtcbiAgY29uc3QgYWN0aXZlSW50ZXJzZWN0aW9ucyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuICBjb25zdCBvbkludGVyc2VjdGlvbkNoYW5nZSA9IChlbnRyaWVzKSA9PiB7XG4gICAgZW50cmllcy5mb3JFYWNoKChlbnRyeSkgPT4ge1xuICAgICAgY29uc3Qgb25FbmQgPSBhY3RpdmVJbnRlcnNlY3Rpb25zLmdldChlbnRyeS50YXJnZXQpO1xuICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nID09PSBCb29sZWFuKG9uRW5kKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgIGNvbnN0IG5ld09uRW5kID0gb25TdGFydChlbnRyeSk7XG4gICAgICAgIGlmICh0eXBlb2YgbmV3T25FbmQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgIGFjdGl2ZUludGVyc2VjdGlvbnMuc2V0KGVudHJ5LnRhcmdldCwgbmV3T25FbmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9ic2VydmVyMi51bm9ic2VydmUoZW50cnkudGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygb25FbmQgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBvbkVuZChlbnRyeSk7XG4gICAgICAgIGFjdGl2ZUludGVyc2VjdGlvbnMuZGVsZXRlKGVudHJ5LnRhcmdldCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IG9ic2VydmVyMiA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihvbkludGVyc2VjdGlvbkNoYW5nZSwge1xuICAgIHJvb3QsXG4gICAgcm9vdE1hcmdpbixcbiAgICB0aHJlc2hvbGQ6IHR5cGVvZiBhbW91bnQgPT09IFwibnVtYmVyXCIgPyBhbW91bnQgOiB0aHJlc2hvbGRzW2Ftb3VudF1cbiAgfSk7XG4gIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IG9ic2VydmVyMi5vYnNlcnZlKGVsZW1lbnQpKTtcbiAgcmV0dXJuICgpID0+IG9ic2VydmVyMi5kaXNjb25uZWN0KCk7XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL3V0aWxzL3VzZS1pbi12aWV3Lm1qc1xuZnVuY3Rpb24gdXNlSW5WaWV3KHJlZiwgeyByb290LCBtYXJnaW4sIGFtb3VudCwgb25jZSA9IGZhbHNlIH0gPSB7fSkge1xuICBjb25zdCBbaXNJblZpZXcsIHNldEluVmlld10gPSAoMCwgaW1wb3J0X3JlYWN0NDEudXNlU3RhdGUpKGZhbHNlKTtcbiAgKDAsIGltcG9ydF9yZWFjdDQ
10617xLnVzZUVmZmVjdCkoKCkgPT4ge1xuICAgIGlmICghcmVmLmN1cnJlbnQgfHwgb25jZSAmJiBpc0luVmlldylcbiAgICAgIHJldHVybjtcbiAgICBjb25zdCBvbkVudGVyID0gKCkgPT4ge1xuICAgICAgc2V0SW5WaWV3KHRydWUpO1xuICAgICAgcmV0dXJuIG9uY2UgPyB2b2lkIDAgOiAoKSA9PiBzZXRJblZpZXcoZmFsc2UpO1xuICAgIH07XG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgIHJvb3Q6IHJvb3QgJiYgcm9vdC5jdXJyZW50IHx8IHZvaWQgMCxcbiAgICAgIG1hcmdpbixcbiAgICAgIGFtb3VudFxuICAgIH07XG4gICAgcmV0dXJuIGluVmlldyhyZWYuY3VycmVudCwgb25FbnRlciwgb3B0aW9ucyk7XG4gIH0sIFtyb290LCByZWYsIG1hcmdpbiwgb25jZSwgYW1vdW50XSk7XG4gIHJldHVybiBpc0luVmlldztcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdXRpbHMvdXNlLWluc3RhbnQtdHJhbnNpdGlvbi5tanNcbnZhciBpbXBvcnRfZGlzdDEwMTggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwMTkgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDIwID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGltcG9ydF9yZWFjdDQyID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksIDEpO1xuZnVuY3Rpb24gdXNlSW5zdGFudFRyYW5zaXRpb24oKSB7XG4gIGNvbnN0IFtmb3JjZVVwZGF0ZSwgZm9yY2VkUmVuZGVyQ291bnRdID0gdXNlRm9yY2VVcGRhdGUoKTtcbiAgY29uc3Qgc3RhcnRJbnN0YW50TGF5b3V0VHJhbnNpdGlvbiA9IHVzZUluc3RhbnRMYXlvdXRUcmFuc2l0aW9uKCk7XG4gIGNvbnN0IHVubG9ja09uRnJhbWVSZWYgPSAoMCwgaW1wb3J0X3JlYWN0NDIudXNlUmVmKSgtMSk7XG4gICgwLCBpbXBvcnRfcmVhY3Q0Mi51c2VFZmZlY3QpKCgpID0+IHtcbiAgICBmcmFtZS5wb3N0UmVuZGVyKCgpID0+IGZyYW1lLnBvc3RSZW5kZXIoKCkgPT4ge1xuICAgICAgaWYgKGZvcmNlZFJlbmRlckNvdW50ICE9PSB1bmxvY2tPbkZyYW1lUmVmLmN1cnJlbnQpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGluc3RhbnRBbmltYXRpb25TdGF0ZS5jdXJyZW50ID0gZmFsc2U7XG4gICAgfSkpO1xuICB9LCBbZm9yY2VkUmVuZGVyQ291bnRdKTtcbiAgcmV0dXJuIChjYWxsYmFjaykgPT4ge1xuICAgIHN0YXJ0SW5zdGFudExheW91dFRyYW5zaXRpb24oKCkgPT4ge1xuICAgICAgaW5zdGFudEFuaW1hdGlvblN0YXRlLmN1cnJlbnQgPSB0cnVlO1xuICAgICAgZm9yY2VVcGRhdGUoKTtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgICB1bmxvY2tPbkZyYW1lUmVmLmN1cnJlbnQgPSBmb3JjZWRSZW5kZXJDb3VudCArIDE7XG4gICAgfSk7XG4gIH07XG59XG5mdW5jdGlvbiBkaXNhYmxlSW5zdGFudFRyYW5zaXRpb25zKCkge1xuICBpbnN0YW50QW5pbWF0aW9uU3RhdGUuY3VycmVudCA9IGZhbHNlO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vb3B0aW1pemVkLWFwcGVhci9zdGFydC5tanNcbnZhciBpbXBvcnRfZGlzdDEwMzAgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwMzEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDMyID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vb3B0aW1pemVkLWFwcGVhci9zdG9yZS1pZC5tanNcbnZhciBpbXBvcnRfZGlzdDEwMjEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwMjIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDIzID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGFwcGVhclN0b3JlSWQgPSAoZWxlbWVudElkLCB2YWx1ZU5hbWUpID0+IHtcbiAgY29uc3Qga2V5ID0gdHJhbnNmb3JtUHJvcHMuaGFzKHZhbHVlTmFtZSkgPyBcInRyYW5zZm9ybVwiIDogdmFsdWVOYW1lO1xuICByZXR1cm4gYCR7ZWxlbWVudElkfTogJHtrZXl9YDtcbn07XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2FuaW1hdGlvbi9vcHRpbWl6ZWQtYXBwZWFyL2hhbmRvZmYubWpzXG52YXIgaW1wb3J0X2Rpc3QxMDI3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDI4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTAyOSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL29wdGltaXplZC1hcHBlYXIvc3RvcmUubWpzXG52YXIgaW1wb3J0X2Rpc3QxMDI0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDI1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTAyNiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBhcHBlYXJBbmltYXRpb25TdG9yZSA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG52YXIgYXBwZWFyQ29tcGxldGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vb3B0aW1pemVkLWFwcGVhci9oYW5kb2ZmLm1qc1xuZnVuY3Rpb24gaGFuZG9mZk9wdGltaXplZEFwcGVhckFuaW1hdGlvbihlbGVtZW50SWQsIHZhbHVlTmFtZSwgZnJhbWUyKSB7XG4gIHZhciBfYTtcbiAgY29uc3Qgc3RvcmVJZCA9IGFwcGVhclN0b3JlSWQoZWxlbWVudElkLCB2YWx1ZU5hbWUpO1xuICBjb25zdCBvcHRpbWlzZWRBbmltYXRpb24gPSBhcHBlYXJBbmltYXRpb25TdG9yZS5nZXQoc3RvcmVJZCk7XG4gIGlmICghb3B0aW1pc2VkQW5pbWF0aW9uKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgeyBhbmltYXRpb24sIHN0YXJ0VGltZSB9ID0gb3B0aW1pc2VkQW5pbWF0aW9uO1xuICBmdW5jdGlvbiBjYW5jZWxBbmltYXRpb24oKSB7XG4gICAgdmFyIF9hMjtcbiAgICAoX2EyID0gd2luZG93Lk1vdGlvbkNhbmNlbE9wdGltaXNlZEFuaW1hdGlvbikgPT09IG51bGwgfHwgX2EyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTIuY2FsbCh3aW5kb3csIGVsZW1lbnRJZCwgdmFsdWVOYW1lLCBmcmFtZTIpO1xuICB9XG4gIGFuaW1hdGlvbi5vbmZpbmlzaCA9IGNhbmNlbEFuaW1hdGlvbjtcbiAgaWYgKHN0YXJ0VGltZSA9PT0gbnVsbCB8fCAoKF9hID0gd2luZG93Lk1vdGlvbkhhbmRvZmZJc0NvbXBsZXRlKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuY2FsbCh3aW5kb3csIGVsZW1lbnRJZCkpKSB7XG4gICAgY2FuY2VsQW5pbWF0aW9uKCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0YXJ0VGltZTtcbiAgfVxufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vb3B0aW1pemVkLWFwcGVhci9zdGFydC5tanNcbnZhciBzdGFydEZyYW1lVGltZTtcbnZhciByZWFkeUFuaW1hdGlvbjtcbnZhciBzdXNwZW5kZWRBbmltYXRpb25zID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbmZ1bmN0aW9uIHJlc3VtZVN1c3BlbmRlZEFuaW1hdGlvbnMoKSB7XG4gIHN1c3BlbmRlZEFuaW1hdGlvbnMuZm9yRWFjaCgoZGF0YSkgPT4ge1xuICAgIGRhdGEuYW5pbWF0aW9uLnBsYXkoKTtcbiAgICBkYXRhLmFuaW1hdGlvbi5zdGFydFRpbWUgPSBkYXRhLnN0YXJ0VGltZTtcbiAgfSk7XG4gIHN1c3BlbmRlZEFuaW1hdGlvbnMuY2xlYXIoKTtcbn1cbmZ1bmN0aW9uIHN0YXJ0T3B0aW1pemVkQXBwZWFyQW5pbWF0aW9uKGVsZW1lbnQsIG5hbW
10617UsIGtleWZyYW1lczIsIG9wdGlvbnMsIG9uUmVhZHkpIHtcbiAgaWYgKHdpbmRvdy5Nb3Rpb25Jc01vdW50ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgaWQ0ID0gZWxlbWVudC5kYXRhc2V0W29wdGltaXplZEFwcGVhckRhdGFJZF07XG4gIGlmICghaWQ0KVxuICAgIHJldHVybjtcbiAgd2luZG93Lk1vdGlvbkhhbmRvZmZBbmltYXRpb24gPSBoYW5kb2ZmT3B0aW1pemVkQXBwZWFyQW5pbWF0aW9uO1xuICBjb25zdCBzdG9yZUlkID0gYXBwZWFyU3RvcmVJZChpZDQsIG5hbWUpO1xuICBpZiAoIXJlYWR5QW5pbWF0aW9uKSB7XG4gICAgcmVhZHlBbmltYXRpb24gPSBzdGFydFdhYXBpQW5pbWF0aW9uKFxuICAgICAgZWxlbWVudCxcbiAgICAgIG5hbWUsXG4gICAgICBba2V5ZnJhbWVzMlswXSwga2V5ZnJhbWVzMlswXV0sXG4gICAgICAvKipcbiAgICAgICAqIDEwIHNlY3MgaXMgYmFzaWNhbGx5IGp1c3QgYSBzdXBlci1zYWZlIGR1cmF0aW9uIHRvIGdpdmUgQ2hyb21lXG4gICAgICAgKiBsb25nIGVub3VnaCB0byBnZXQgdGhlIGFuaW1hdGlvbiByZWFkeS5cbiAgICAgICAqL1xuICAgICAgeyBkdXJhdGlvbjogMWU0LCBlYXNlOiBcImxpbmVhclwiIH1cbiAgICApO1xuICAgIGFwcGVhckFuaW1hdGlvblN0b3JlLnNldChzdG9yZUlkLCB7XG4gICAgICBhbmltYXRpb246IHJlYWR5QW5pbWF0aW9uLFxuICAgICAgc3RhcnRUaW1lOiBudWxsXG4gICAgfSk7XG4gICAgd2luZG93Lk1vdGlvbkhhbmRvZmZBbmltYXRpb24gPSBoYW5kb2ZmT3B0aW1pemVkQXBwZWFyQW5pbWF0aW9uO1xuICAgIHdpbmRvdy5Nb3Rpb25IYXNPcHRpbWlzZWRBbmltYXRpb24gPSAoZWxlbWVudElkLCB2YWx1ZU5hbWUpID0+IHtcbiAgICAgIGlmICghZWxlbWVudElkKVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIXZhbHVlTmFtZSkge1xuICAgICAgICByZXR1cm4gYXBwZWFyQ29tcGxldGUuaGFzKGVsZW1lbnRJZCk7XG4gICAgICB9XG4gICAgICBjb25zdCBhbmltYXRpb25JZCA9IGFwcGVhclN0b3JlSWQoZWxlbWVudElkLCB2YWx1ZU5hbWUpO1xuICAgICAgcmV0dXJuIEJvb2xlYW4oYXBwZWFyQW5pbWF0aW9uU3RvcmUuZ2V0KGFuaW1hdGlvbklkKSk7XG4gICAgfTtcbiAgICB3aW5kb3cuTW90aW9uSGFuZG9mZk1hcmtBc0NvbXBsZXRlID0gKGVsZW1lbnRJZCkgPT4ge1xuICAgICAgaWYgKGFwcGVhckNvbXBsZXRlLmhhcyhlbGVtZW50SWQpKSB7XG4gICAgICAgIGFwcGVhckNvbXBsZXRlLnNldChlbGVtZW50SWQsIHRydWUpO1xuICAgICAgfVxuICAgIH07XG4gICAgd2luZG93Lk1vdGlvbkhhbmRvZmZJc0NvbXBsZXRlID0gKGVsZW1lbnRJZCkgPT4ge1xuICAgICAgcmV0dXJuIGFwcGVhckNvbXBsZXRlLmdldChlbGVtZW50SWQpID09PSB0cnVlO1xuICAgIH07XG4gICAgd2luZG93Lk1vdGlvbkNhbmNlbE9wdGltaXNlZEFuaW1hdGlvbiA9IChlbGVtZW50SWQsIHZhbHVlTmFtZSwgZnJhbWUyLCBjYW5SZXN1bWUpID0+IHtcbiAgICAgIGNvbnN0IGFuaW1hdGlvbklkID0gYXBwZWFyU3RvcmVJZChlbGVtZW50SWQsIHZhbHVlTmFtZSk7XG4gICAgICBjb25zdCBkYXRhID0gYXBwZWFyQW5pbWF0aW9uU3RvcmUuZ2V0KGFuaW1hdGlvbklkKTtcbiAgICAgIGlmICghZGF0YSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgaWYgKGZyYW1lMiAmJiBjYW5SZXN1bWUgPT09IHZvaWQgMCkge1xuICAgICAgICBmcmFtZTIucG9zdFJlbmRlcigoKSA9PiB7XG4gICAgICAgICAgZnJhbWUyLnBvc3RSZW5kZXIoKCkgPT4ge1xuICAgICAgICAgICAgZGF0YS5hbmltYXRpb24uY2FuY2VsKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGF0YS5hbmltYXRpb24uY2FuY2VsKCk7XG4gICAgICB9XG4gICAgICBpZiAoZnJhbWUyICYmIGNhblJlc3VtZSkge1xuICAgICAgICBzdXNwZW5kZWRBbmltYXRpb25zLmFkZChkYXRhKTtcbiAgICAgICAgZnJhbWUyLnJlbmRlcihyZXN1bWVTdXNwZW5kZWRBbmltYXRpb25zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFwcGVhckFuaW1hdGlvblN0b3JlLmRlbGV0ZShhbmltYXRpb25JZCk7XG4gICAgICAgIGlmICghYXBwZWFyQW5pbWF0aW9uU3RvcmUuc2l6ZSkge1xuICAgICAgICAgIHdpbmRvdy5Nb3Rpb25DYW5jZWxPcHRpbWlzZWRBbmltYXRpb24gPSB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHdpbmRvdy5Nb3Rpb25DaGVja0FwcGVhclN5bmMgPSAodmlzdWFsRWxlbWVudCwgdmFsdWVOYW1lLCB2YWx1ZSkgPT4ge1xuICAgICAgdmFyIF9hLCBfYjtcbiAgICAgIGNvbnN0IGFwcGVhcklkID0gZ2V0T3B0aW1pc2VkQXBwZWFySWQodmlzdWFsRWxlbWVudCk7XG4gICAgICBpZiAoIWFwcGVhcklkKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCB2YWx1ZUlzT3B0aW1pc2VkID0gKF9hID0gd2luZG93Lk1vdGlvbkhhc09wdGltaXNlZEFuaW1hdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmNhbGwod2luZG93LCBhcHBlYXJJZCwgdmFsdWVOYW1lKTtcbiAgICAgIGNvbnN0IGV4dGVybmFsQW5pbWF0aW9uVmFsdWUgPSAoX2IgPSB2aXN1YWxFbGVtZW50LnByb3BzLnZhbHVlcykgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iW3ZhbHVlTmFtZV07XG4gICAgICBpZiAoIXZhbHVlSXNPcHRpbWlzZWQgfHwgIWV4dGVybmFsQW5pbWF0aW9uVmFsdWUpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGNvbnN0IHJlbW92ZVN5bmNDaGVjayA9IHZhbHVlLm9uKFwiY2hhbmdlXCIsIChsYXRlc3RWYWx1ZSkgPT4ge1xuICAgICAgICB2Y
10617XIgX2EyO1xuICAgICAgICBpZiAoZXh0ZXJuYWxBbmltYXRpb25WYWx1ZS5nZXQoKSAhPT0gbGF0ZXN0VmFsdWUpIHtcbiAgICAgICAgICAoX2EyID0gd2luZG93Lk1vdGlvbkNhbmNlbE9wdGltaXNlZEFuaW1hdGlvbikgPT09IG51bGwgfHwgX2EyID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYTIuY2FsbCh3aW5kb3csIGFwcGVhcklkLCB2YWx1ZU5hbWUpO1xuICAgICAgICAgIHJlbW92ZVN5bmNDaGVjaygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZW1vdmVTeW5jQ2hlY2s7XG4gICAgfTtcbiAgfVxuICBjb25zdCBzdGFydEFuaW1hdGlvbiA9ICgpID0+IHtcbiAgICByZWFkeUFuaW1hdGlvbi5jYW5jZWwoKTtcbiAgICBjb25zdCBhcHBlYXJBbmltYXRpb24gPSBzdGFydFdhYXBpQW5pbWF0aW9uKGVsZW1lbnQsIG5hbWUsIGtleWZyYW1lczIsIG9wdGlvbnMpO1xuICAgIGlmIChzdGFydEZyYW1lVGltZSA9PT0gdm9pZCAwKSB7XG4gICAgICBzdGFydEZyYW1lVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIH1cbiAgICBhcHBlYXJBbmltYXRpb24uc3RhcnRUaW1lID0gc3RhcnRGcmFtZVRpbWU7XG4gICAgYXBwZWFyQW5pbWF0aW9uU3RvcmUuc2V0KHN0b3JlSWQsIHtcbiAgICAgIGFuaW1hdGlvbjogYXBwZWFyQW5pbWF0aW9uLFxuICAgICAgc3RhcnRUaW1lOiBzdGFydEZyYW1lVGltZVxuICAgIH0pO1xuICAgIGlmIChvblJlYWR5KVxuICAgICAgb25SZWFkeShhcHBlYXJBbmltYXRpb24pO1xuICB9O1xuICBhcHBlYXJDb21wbGV0ZS5zZXQoaWQ0LCBmYWxzZSk7XG4gIGlmIChyZWFkeUFuaW1hdGlvbi5yZWFkeSkge1xuICAgIHJlYWR5QW5pbWF0aW9uLnJlYWR5LnRoZW4oc3RhcnRBbmltYXRpb24pLmNhdGNoKG5vb3ApO1xuICB9IGVsc2Uge1xuICAgIHN0YXJ0QW5pbWF0aW9uKCk7XG4gIH1cbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvYW5pbWF0aW9uL2hvb2tzL3VzZS1hbmltYXRlZC1zdGF0ZS5tanNcbnZhciBpbXBvcnRfZGlzdDEwMzMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwMzQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDM1ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGltcG9ydF9yZWFjdDQzID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksIDEpO1xudmFyIGNyZWF0ZU9iamVjdCA9ICgpID0+ICh7fSk7XG52YXIgU3RhdGVWaXN1YWxFbGVtZW50ID0gY2xhc3MgZXh0ZW5kcyBWaXN1YWxFbGVtZW50IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICB0aGlzLm1lYXN1cmVJbnN0YW5jZVZpZXdwb3J0Qm94ID0gY3JlYXRlQm94O1xuICB9XG4gIGJ1aWxkKCkge1xuICB9XG4gIHJlc2V0VHJhbnNmb3JtKCkge1xuICB9XG4gIHJlc3RvcmVUcmFuc2Zvcm0oKSB7XG4gIH1cbiAgcmVtb3ZlVmFsdWVGcm9tUmVuZGVyU3RhdGUoKSB7XG4gIH1cbiAgcmVuZGVySW5zdGFuY2UoKSB7XG4gIH1cbiAgc2NyYXBlTW90aW9uVmFsdWVzRnJvbVByb3BzKCkge1xuICAgIHJldHVybiBjcmVhdGVPYmplY3QoKTtcbiAgfVxuICBnZXRCYXNlVGFyZ2V0RnJvbVByb3BzKCkge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgcmVhZFZhbHVlRnJvbUluc3RhbmNlKF9zdGF0ZSwga2V5LCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuaW5pdGlhbFN0YXRlW2tleV0gfHwgMDtcbiAgfVxuICBzb3J0SW5zdGFuY2VOb2RlUG9zaXRpb24oKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG52YXIgdXNlVmlzdWFsU3RhdGUgPSBtYWtlVXNlVmlzdWFsU3RhdGUoe1xuICBzY3JhcGVNb3Rpb25WYWx1ZXNGcm9tUHJvcHM6IGNyZWF0ZU9iamVjdCxcbiAgY3JlYXRlUmVuZGVyU3RhdGU6IGNyZWF0ZU9iamVjdFxufSk7XG5mdW5jdGlvbiB1c2VBbmltYXRlZFN0YXRlKGluaXRpYWxTdGF0ZSkge1xuICBjb25zdCBbYW5pbWF0aW9uU3RhdGUsIHNldEFuaW1hdGlvblN0YXRlXSA9ICgwLCBpb
10617XBvcnRfcmVhY3Q0My51c2VTdGF0ZSkoaW5pdGlhbFN0YXRlKTtcbiAgY29uc3QgdmlzdWFsU3RhdGUgPSB1c2VWaXN1YWxTdGF0ZSh7fSwgZmFsc2UpO1xuICBjb25zdCBlbGVtZW50ID0gdXNlQ29uc3RhbnQoKCkgPT4ge1xuICAgIHJldHVybiBuZXcgU3RhdGVWaXN1YWxFbGVtZW50KHtcbiAgICAgIHByb3BzOiB7XG4gICAgICAgIG9uVXBkYXRlOiAodikgPT4ge1xuICAgICAgICAgIHNldEFuaW1hdGlvblN0YXRlKHsgLi4udiB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHZpc3VhbFN0YXRlLFxuICAgICAgcHJlc2VuY2VDb250ZXh0OiBudWxsXG4gICAgfSwgeyBpbml0aWFsU3RhdGUgfSk7XG4gIH0pO1xuICAoMCwgaW1wb3J0X3JlYWN0NDMudXNlTGF5b3V0RWZmZWN0KSgoKSA9PiB7XG4gICAgZWxlbWVudC5tb3VudCh7fSk7XG4gICAgcmV0dXJuICgpID0+IGVsZW1lbnQudW5tb3VudCgpO1xuICB9LCBbZWxlbWVudF0pO1xuICBjb25zdCBzdGFydEFuaW1hdGlvbiA9IHVzZUNvbnN0YW50KCgpID0+IChhbmltYXRpb25EZWZpbml0aW9uKSA9PiB7XG4gICAgcmV0dXJuIGFuaW1hdGVWaXN1YWxFbGVtZW50KGVsZW1lbnQsIGFuaW1hdGlvbkRlZmluaXRpb24pO1xuICB9KTtcbiAgcmV0dXJuIFthbmltYXRpb25TdGF0ZSwgc3RhcnRBbmltYXRpb25dO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9jb21wb25lbnRzL0FuaW1hdGVTaGFyZWRMYXlvdXQubWpzXG52YXIgaW1wb3J0X2Rpc3QxMDM2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDM3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTAzOCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfanN4X3J1bnRpbWU5ID0gX190b0VTTShyZXF1aXJlX2pzeF9ydW50aW1lKCksIDEpO1xudmFyIFJlYWN0MyA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcbnZhciBpZDMgPSAwO1xudmFyIEFuaW1hdGVTaGFyZWRMYXlvdXQgPSAoeyBjaGlsZHJlbiB9KSA9PiB7XG4gIFJlYWN0My51c2VFZmZlY3QoKCkgPT4ge1xuICAgIGludmFyaWFudChmYWxzZSwgXCJBbmltYXRlU2hhcmVkTGF5b3V0IGlzIGRlcHJlY2F0ZWQ6IGh0dHBzOi8vd3d3LmZyYW1lci5jb20vZG9jcy9ndWlkZS11cGdyYWRlLyMjc2hhcmVkLWxheW91dC1hbmltYXRpb25zXCIpO1xuICB9LCBbXSk7XG4gIHJldHVybiAoMCwgaW1wb3J0X2pzeF9ydW50aW1lOS5qc3gpKExheW91dEdyb3VwLCB7IGlkOiB1c2VDb25zdGFudCgoKSA9PiBgYXNsLSR7aWQzKyt9YCksIGNoaWxkcmVuIH0pO1xufTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvdmFsdWUvdXNlLWludmVydGVkLXNjYWxlLm1qc1xudmFyIGltcG9ydF9kaXN0MTAzOSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0KCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTA0MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MigpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwNDEgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDMoKSwgMSk7XG52YXIgaW1wb3J0X3JlYWN0NDQgPSBfX3RvRVNNKHJlcXVpcmVfcmVhY3QoKSwgMSk7XG52YXIgbWF4U2NhbGUgPSAxZTU7XG52YXIgaW52ZXJ0U2NhbGUgPSAoc2NhbGUyKSA9PiBzY2FsZTIgPiAxZS0zID8gMSAvIHNjYWxlMiA6IG1heFNjYWxlO1xudmFyIGhhc1dhcm5lZCA9IGZhbHNlO1xuZnVuY3Rpb24gdXNlSW52ZXJ0ZWRTY2FsZShzY2FsZTIpIHtcbiAgbGV0IHBhcmVudFNjYWxlWCA9IHVzZU1vdGlvblZhbHVlKDEpO1xuICBsZXQgcGFyZW50U2NhbGVZID0gdXNlTW90aW9uVmFsdWUoMSk7XG4gIGNvbnN0IHsgdmlzdWFsRWxlbWVudCB9ID0gKDAsIGltcG9ydF9yZWFjdDQ0LnVzZUNvbnRleHQpKE1vdGlvbkNvbnRleHQpO1xuICBpbnZhcmlhbnQoISEoc2NhbGUyIHx8IHZpc3VhbEVsZW1lbnQpLCBcIklmIG5vIHNjYWxlIHZhbHVlcyBhcmUgcHJvdmlkZWQsIHVzZUludmVydGVkU2NhbGUgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIGNoaWxkIG9mIGFub3RoZXIgbW90aW9uIGNvbXBvbmVudC5cIik7XG4gIHdhcm5pbmcoaGFzV2FybmVkLCBcInVzZUludmVydGVkU2NhbGUgaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIDMuMC4gVXNlIHRoZSBsYXlvdXQgcHJvcCBpbnN0ZWFkLlwiKTtcbiAgaGFzV2FybmVkID0gdHJ1ZTtcbiAgaWYgKHNjYWxlMikge1xuICAgIHBhcmVudFNjYWxlWCA9IHNjYWxlMi5zY2FsZVggfHwgcGFyZW50U2NhbGVYO1xuICAgIHBhcmVudFNjYWxlWSA9IHNjYWxlMi5zY2FsZVkgfHwgcGFyZW50U2NhbGVZO1xuICB9IGVsc2UgaWYgKHZpc3VhbEVsZW1lbnQpIHtcbiAgICBwYXJlbnRTY2FsZVggPSB2aXN1YWxFbGVtZW50LmdldFZhbHVlKFwic2NhbGVYXCIsIDEpO1xuICAgIHBhcmVudFNjYWxlWSA9IHZpc3VhbEVsZW1lbnQuZ2V0VmFsdWUoXCJzY2FsZVlcIiwgMSk7XG4gIH1cbiAgY29uc3Qgc2NhbGVYID0gdXNlVHJhbnNmb3JtKHBhcmVudFNjYWxlWCwgaW52ZXJ0U2NhbGUpO1xuICBjb25zdCBzY2FsZVkgPSB1c2VUcmFuc2Zvcm0ocGFyZW50U2NhbGVZLCBpbnZlcnRTY2FsZSk7XG4gIHJldHVybiB7IHNjYWxlWCwgc2NhbGVZIH07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2NvbXBvbmVudHMvUmVvcmRlci9uYW1lc3BhY2UubWpzXG52YXIgbmFtZXNwYWNlX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KG5hbWVzcGFjZV9leHBvcnRzLCB7XG4gIEdyb3VwOiAoKSA9PiBSZW9yZGVyR3JvdXAsXG4gIEl0ZW06ICgpID0+IFJlb3JkZXJJdGVtXG59KTtcbnZhciBpbXBvcnRfZGlzdDEwNTQgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwNTUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDU2ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9jb21wb25lbnRzL1Jlb3JkZXIvR3JvdXAubWpzXG52YXIgaW1wb3J0X2Rpc3QxMDQ4ID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDQ5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0MTA1MCA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfanN4X3J1bnRpbWUxMCA9IF9fdG9FU00ocmVxdWlyZV9qc3hfcnVudGltZSgpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3Q0NiA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvY29udGV4dC9SZW9yZGVyQ29udGV4dC5tanNcbnZhciBpbXBvcnRfZGlzdDEwNDIgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwNDMgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDQ0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xudmFyIGltcG9ydF9yZWFjdDQ1ID0gX190b0VTTShyZXF1aXJlX3JlYWN0KCksIDEpO1xudmFyIFJlb3JkZXJDb250ZXh0ID0gKDAsIGltcG9ydF9yZWFjdDQ1LmNyZWF0ZUNvbnRleHQpKG51bGwpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9jb21wb25lbnRzL1Jlb3JkZXIvdXRpbHMvY2hlY2stcmVvcmRlci5tanNcbnZhciBpbXBvcnRfZGlzdDEwNDUgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwNDYgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDQ3ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gY2hlY2tSZW9yZGVyKG9yZGVyLCB2YWx1ZSwgb2Zmc2V0LCB2ZWxvY2l0eSkge1xuICBpZiAoIXZlbG9jaXR5KVxuICAgIHJldHVybiBvcmRlcjtcbiAgY29uc3QgaW5kZXggPSBvcmRlci5maW5kSW5kZXgoKGl0ZW0yKSA9PiBpdGVtMi52YWx1ZSA9PT0gdmFsdWUpO1xuICBpZiAoaW5kZXggPT09IC0xKVxuICAgIHJldHVybiBvcmRlcjtcbiAgY29uc3QgbmV4dE9mZnNldCA9IHZlbG9jaXR5ID4gMCA/IDEgOiAtMTtcbiAgY29uc3QgbmV4dEl0ZW0gPSBvcmRlcltpbmRleCArIG5leHRPZmZzZXRdO1xuICBpZiAoIW5leHRJdGVtKVxuICAgIHJldHVybiBvcmRlcjtcbiAgY29uc3QgaXRlbSA9IG9yZGVyW2luZGV4XTtcbiAgY29uc3QgbmV4dExheW91dCA9IG5leHRJdGVtLmxheW91dDtcbiAgY29uc3QgbmV4dEl0ZW1DZW50ZXIgPSBtaXhOdW1iZXIobmV4dExheW91dC5taW4sIG5leHRMYXlvdXQubWF4LCAwLjUpO1xuICBpZiAobmV4dE9mZnNldCA9PT0gMSAmJiBpdGVtLmxheW91dC5tYXggKyBvZmZzZXQgPiBuZXh0SXRlbUNlbnRlciB8fCBuZXh0T2Zmc2V0ID09PSAtMSAmJiBpdGVtLmxheW91dC5taW4gKyBvZmZzZXQgPCBuZXh0SXRlbUNlbnRlcikge1xuICAgIHJldHVybiBtb3ZlSXRlbShvcmRlciwgaW5kZXgsIGluZGV4ICsgbmV4dE9mZnNldCk7XG4gIH1cbiAgcmV0dXJuIG9yZGVyO1xufVxuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9jb21wb25lbnRzL1Jlb3JkZXIvR3JvdXAubWpzXG5mdW5jdGlvbiBSZW9yZGVyR3JvdXBDb21wb25lbnQoeyBjaGlsZHJlbiwgYXMgPSBcInVsXCIsIGF4aXMgPSBcInlcIiwgb25SZW9yZGVyLCB2YWx1ZXMsIC4uLnByb3BzIH0sIGV4dGVybmFsUmVmKSB7XG4gIGNvbnN0IENvbXBvbmVudDMgPSB1c2VDb25zdGFudCgoKSA9PiBtb3Rpb25bYXNdKTtcbiAgY29uc3Qgb3JkZXIgPSBbXTtcbiAgY29uc3QgaXNSZW9yZGVyaW5nID0gKDAsIGltcG9ydF9yZWFjdDQ2LnVzZVJlZikoZmFsc2UpO1xuICBpbnZhcmlhbnQoQm9vbGVhbih2YWx1ZXMpLCBcIlJlb3JkZXIuR3JvdXAgbXVzdCBiZSBwcm92aWRlZCBhIHZhbHVlcyBwcm9wXCIpO1xuICBjb25zdCBjb250ZXh0ID0ge1xuICAgIGF4aXMsXG4gICAgcmVnaXN0ZXJJdGVtOiAodmFsdWUsIGxheW91dDIpID0+IHtcbiAgICAgIGNvbnN0IGlkeCA9IG9yZGVyLmZpbmRJbmRleCgoZW50cnkpID0+IHZhbHVlID09PSBlbnRyeS52YWx1ZSk7XG4gICAgICBpZiAoaWR4ICE9PSAtMSkge1xuICAgICAgICBvcmRlcltpZHhdLmxheW91dCA9IGxheW91dDJbYXhpc107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcmRlci5wdXNoKHsgdmFsdWUsIGxheW91dDogbGF5b3V0MltheGlzXSB9KTtcbiAgICAgIH1cbiAgICAgIG9yZGVyLnNvcnQoY29tcGFyZU1pbik7XG4gICAgfSxcbiAgICB1cGRhdGVPcmRlcjogKGl0ZW0sIG9mZnNldCwgdmVsb2NpdHkpID0+IHtcbiAgICAgIGlmIChpc1Jlb3JkZXJpbmcuY3VycmVudClcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY29uc3QgbmV3T3JkZXIgPSBjaGVja1Jlb3JkZXIob3JkZXIsIGl0ZW0sIG9mZnNldCwgdmVsb2NpdHkpO1xuICAgICAgaWYgKG9yZGVyICE9PSBuZXdPcmRlcikge1xuICAgICAgICBpc1Jlb3JkZXJpbmcuY3VycmVudCA9IHRydWU7XG4gICAgICAgIG9uUmVvcmRlcihuZXdPcmRlci5tYXAoZ2V0VmFsdWUpLmZpbHRlcigodmFsdWUpID0+IHZhbHVlcy5pbmRleE9mKHZhbHVlKSAhPT0gLTEpKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gICgwLCBpbXBvcnRfcmVhY3Q0Ni51c2VFZmZlY3QpKCgpID0+IHtcbiAgICBpc1Jlb3JkZXJpbmcuY3VycmVudCA9IGZhbHNlO1xuICB9KTtcbiAgcmV0dXJuICgwLCBpbXBvcnRfanN4X3J1bnRpbWUxMC5qc3gpKENvbXBvbmVudDMsIHsgLi4ucHJvcHMsIHJlZjogZXh0ZXJuYWxSZWYsIGlnbm9yZVN0cmljdDogdHJ1ZSwgY2hpbGRyZW46ICgwLCBpbXBvcnRfanN4X3J1bnRpbWUxMC5qc3gpKFJlb3JkZXJDb250ZXh0LlByb3ZpZGVyLCB7IHZhbHVlOiBjb250ZXh0LCBjaGlsZHJlbiB9KSB9KTtcbn1cbnZhciBSZW9yZGVyR3JvdXAgPSAoMCwgaW1wb3J0X3JlYWN0NDYuZm9yd2FyZFJlZikoUmVvcmRlckdyb3VwQ29tcG9uZW50KTtcbmZ1bmN0aW9uIGdldFZhbHVlKGl0ZW0pIHtcbiAgcmV0dXJuIGl0ZW0udmFsdWU7XG59XG5mdW5jdGlvbiBjb21wYXJlTWluKGEsIGIpIHtcbiAgcmV0dXJuIGEubGF5b3V0Lm1pbiAtIGIubGF5b3V0Lm1pbjtcbn1cblxuLy8gbm9kZV9tb2R1bGVzLy5wbnBtL2ZyYW1lci1tb3Rpb25AMTEuMTguMl9yZWFjdC1kb21AMTguMy4xX3JlYWN0QDE4LjMuMV9fcmVhY3RAMTguMy4xL25vZGVfbW9kdWxlcy9mcmFtZXItbW90aW9uL2Rpc3QvZXMvY29tcG9uZW50cy9SZW9yZGVyL0l0ZW0ubWpzXG52YXIgaW1wb3J0X2Rpc3QxMDUxID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDUyID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0MTA1MyA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBpbXBvcnRfanN4X3J1bnRpbWUxMSA9IF9fdG9FU00ocmVxdWlyZV9qc3hfcnVudGltZSgpLCAxKTtcbnZhciBpbXBvcnRfcmVhY3Q0NyA9IF9fdG9FU00ocmVxdWlyZV9yZWFjdCgpLCAxKTtcbmZ1bmN0aW9uIHVzZURlZmF1bHRNb3Rpb25WYWx1ZSh2YWx1ZSwgZGVmYXVsdFZhbHVlID0gMCkge1xuICByZXR1cm4gaXNNb3Rpb25WYWx1ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVzZU1vdGlvblZhbHVlKGRlZmF1bHRWYWx1ZSk7XG59XG5mdW5jdGlvbiBSZW9yZGVySXRlbUNvbXBvbmVudCh7IGNoaWxkcmVuLCBzdHlsZSA9IHt9LCB2YWx1ZSwgYXMgPSBcImxpXCIsIG9uRHJhZywgbGF5b3V0OiBsYXlvdXQyID0gdHJ1ZSwgLi4ucHJvcHMgfSwgZXh0ZXJuYWxSZWYpIHtcbiAgY29uc3QgQ29tcG9uZW50MyA9IHVzZUNvbnN0YW50KCgpID0+IG1vdGlvblthc10pO1xuICBjb25zdCBjb250ZXh0ID0gKDAsIGltcG9ydF9yZWFjdDQ3LnVzZUNvbnRleHQpKFJlb3JkZXJDb250ZXh0KTtcbiAgY29uc3QgcG9pbnQyID0ge1xuICAgIHg6IHVzZURlZmF1bHRNb3Rpb25WYWx1ZShzdHlsZS54KSxcbiAgICB5OiB1c2VEZWZhdWx0TW90aW9uVmFsdWUoc3R5bGUueSlcbiAgfTtcbiAgY29uc3QgekluZGV4ID0gdXNlVHJhbnNmb3JtKFtwb2ludDIueCwgcG9pbnQyLnldLCAoW2xhdGVzdFgsIGxhdGVzdFldKSA9PiBsYXRlc3RYIHx8IGxhdGVzdFkgPyAxIDogXCJ1bnNldFwiKTtcbiAgaW52YXJpYW50KEJvb2xlYW4oY29udGV4dCksIFwiUmVvcmRlci5JdGVtIG11c3QgYmUgYSBjaGlsZCBvZiBSZW9yZGVyLkdyb3VwXCIpO1xuICBjb25zdCB7IGF4aXMsIHJlZ2lzdGVySXRlbSwgdXBkYXRlT3JkZXIgfSA9IGNvbnRleHQ7XG4gIHJldHVybiAoMCwgaW1wb3J0X2pzeF9ydW50aW1lMTEuanN4KShDb21wb25lbnQzLCB7IGRyYWc6IGF4aXMsIC4uLnByb3BzLCBkcmFnU25hcFRvT3JpZ2luOiB0cnVlLCBzdHlsZTogeyAuLi5zdHlsZSwgeDogcG9pbnQyLngsIHk6IHBvaW50Mi55LCB6SW5kZXggfSwgbGF5b3V0OiBsYXlvdXQyLCBvbkRyYWc6IChldmVudCwgZ2VzdHVyZVBvaW50KSA9PiB7XG4gICAgY29uc3QgeyB2ZWxvY2l0eSB9ID0gZ2VzdHVyZVBvaW50O1xuICAgIHZlbG9jaXR5W2F4aXNdICYmIHVwZGF0ZU9yZGVyKHZhbHVlLCBwb2ludDJbYXhpc10uZ2V0KCksIHZlbG9jaXR5W2F4aXNdKTtcbiAgICBvbkRyYWcgJiYgb25EcmFnKGV2ZW50LCBnZXN0dXJlUG9pbnQpO1xuICB9LCBvbkxheW91dE1lYXN1cmU6IChtZWFzdXJlZCkgPT4gcmVnaXN0ZXJJdGVtKHZhbHVlLCBtZWFzdXJlZCksIHJlZjogZXh0ZXJuYWxSZWYsIGlnbm9yZVN0cmljdDogdHJ1ZSwgY2hpbGRyZW4gfSk7XG59XG52YXIgUmVvcmRlckl0ZW0gPSAoMCwgaW1wb3J0X3JlYWN0NDcuZm9yd2FyZFJlZikoUmVvcmRlckl0ZW1Db21wb25lbnQpO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9hbmltYXRpb24vdXRpbHMvc3RhZ2dlci5tanNcbnZhciBpbXBvcnRfZGlzdDEwNTcgPSBfX3RvRVNNKHJlcXVpcmVfZGlzdCgpLCAxKTtcbnZhciBpbXBvcnRfZGlzdDEwNTggPSBfX3RvRVNNKHJlcXVpcmVfZGlzdDIoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDU5ID0gX190b0VTTShyZXF1aXJlX2Rpc3QzKCksIDEpO1xuZnVuY3Rpb24gZ2V0T3JpZ2luSW5kZXgoZnJvbSwgdG90YWwpIHtcbiAgaWYgKGZyb20gPT09IFwiZmlyc3RcIikge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGxhc3RJbmRleCA9IHRvdGFsIC0gMTtcbiAgICByZXR1cm4gZnJvbSA9PT0gXCJsYXN0XCIgPyBsYXN0SW5kZXggOiBsYXN0SW5kZXggLyAyO1xuICB9XG59XG5mdW5jdGlvbiBzdGFnZ2VyKGR1cmF0aW9uID0gMC4xLCB7IHN0YXJ0RGVsYXkgPSAwLCBmcm9tID0gMCwgZWFzZTogZWFzZTIgfSA9IHt9KSB7XG4gIHJldHVybiAoaSwgdG90YWwpID0+IHtcbiAgICBjb25zdCBmcm9tSW5kZXggPSB0eXBlb2YgZnJvbSA9PT0gXCJudW1iZXJcIiA/IGZyb20gOiBnZXRPcmlnaW5JbmRleChmcm9tLCB0b3RhbCk7XG4gICAgY29uc3QgZGlzdGFuY2UyID0gTWF0aC5hYnMoZnJvbUluZGV4IC0gaSk7XG4gICAgbGV0IGRlbGF5MiA9IGR1cmF0aW9uICogZGlzdGFuY2UyO1xuICAgIGlmIChlYXNlMikge1xuICAgICAgY29uc3QgbWF4RGVsYXkgPSB0b3RhbCAqIGR1cmF0aW9uO1xuICAgICAgY29uc3QgZWFzaW5nRnVuY3Rpb24gPSBlYXNpbmdEZWZpbml0aW9uVG9GdW5jdGlvbihlYXNlMik7XG4gICAgICBkZWxheTIgPSBlYXNpbmdGdW5jdGlvbihkZWxheTIgLyBtYXhEZWxheSkgKiBtYXhEZWxheTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXJ0RGVsYXkgKyBkZWxheTI7XG4gIH07XG59XG5cbi8vIG5vZGVfbW9kdWxlcy8ucG5wbS9mcmFtZXItbW90aW9uQDExLjE4LjJfcmVhY3QtZG9tQDE4LjMuMV9yZWFjdEAxOC4zLjFfX3JlYWN0QDE4LjMuMS9ub2RlX21vZHVsZXMvZnJhbWVyLW1vdGlvbi9kaXN0L2VzL2ZyYW1lbG9vcC9pbmRleC1sZWdhY3kubWpzXG52YXIgaW1wb3J0X2Rpc3QxMDYwID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDYxID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksIDEpO1xudmFyIGltcG9ydF9kaXN0MTA2MiA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbnZhciBzeW5jID0gZnJhbWU7XG52YXIgY2FuY2VsU3luYyA9IHN0ZXBzT3JkZXIucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICBhY2Nba2V5XSA9IChwcm9jZXNzMikgPT4gY2FuY2VsRnJhbWUocHJvY2VzczIpO1xuICByZXR1cm4gYWNjO1xufSwge30pO1xuXG4vLyBub2RlX21vZHVsZXMvLnBucG0vZnJhbWVyLW1vdGlvbkAxMS4xOC4yX3JlYWN0LWRvbUAxOC4zLjFfcmVhY3RAMTguMy4xX19yZWFjdEAxOC4zLjEvbm9kZV9tb2R1bGVzL2ZyYW1lci1tb3Rpb24vZGlzdC9lcy9lYXNpbmcvc3RlcHMubWpzXG52YXIgaW1wb3J0X2Rpc3QxMDYzID0gX190b0VTTShyZXF1aXJlX2Rpc3QoKSwgMSk7XG52YXIgaW1wb3J0X2Rpc3QxMDY0ID0gX190b0VTTShyZXF1aXJlX2Rpc3QyKCksI
10617DEpO1xudmFyIGltcG9ydF9kaXN0MTA2NSA9IF9fdG9FU00ocmVxdWlyZV9kaXN0MygpLCAxKTtcbmZ1bmN0aW9uIHN0ZXBzKG51bVN0ZXBzLCBkaXJlY3Rpb24gPSBcImVuZFwiKSB7XG4gIHJldHVybiAocHJvZ3Jlc3MyKSA9PiB7XG4gICAgcHJvZ3Jlc3MyID0gZGlyZWN0aW9uID09PSBcImVuZFwiID8gTWF0aC5taW4ocHJvZ3Jlc3MyLCAwLjk5OSkgOiBNYXRoLm1heChwcm9ncmVzczIsIDFlLTMpO1xuICAgIGNvbnN0IGV4cGFuZGVkID0gcHJvZ3Jlc3MyICogbnVtU3RlcHM7XG4gICAgY29uc3Qgcm91bmRlZCA9IGRpcmVjdGlvbiA9PT0gXCJlbmRcIiA/IE1hdGguZmxvb3IoZXhwYW5kZWQpIDogTWF0aC5jZWlsKGV4cGFuZGVkKTtcbiAgICByZXR1cm4gY2xhbXAoMCwgMSwgcm91bmRlZCAvIG51bVN0ZXBzKTtcbiAgfTtcbn1cbmV4cG9ydCB7XG4gIEFjY2VsZXJhdGVkQW5pbWF0aW9uLFxuICBBbmltYXRlUHJlc2VuY2UsXG4gIEFuaW1hdGVTaGFyZWRMYXlvdXQsXG4gIERlcHJlY2F0ZWRMYXlvdXRHcm91cENvbnRleHQsXG4gIERyYWdDb250cm9scyxcbiAgRmxhdFRyZWUsXG4gIExheW91dEdyb3VwLFxuICBMYXlvdXRHcm91cENvbnRleHQsXG4gIExhenlNb3Rpb24sXG4gIE1vdGlvbkNvbmZpZyxcbiAgTW90aW9uQ29uZmlnQ29udGV4dCxcbiAgTW90aW9uQ29udGV4dCxcbiAgTW90aW9uR2xvYmFsQ29uZmlnLFxuICBNb3Rpb25WYWx1ZSxcbiAgUHJlc2VuY2VDb250ZXh0LFxuICBuYW1lc3BhY2VfZXhwb3J0cyBhcyBSZW9yZGVyLFxuICBTd2l0Y2hMYXlvdXRHcm91cENvbnRleHQsXG4gIFZpc3VhbEVsZW1lbnQsXG4gIGFkZFBvaW50ZXJFdmVudCxcbiAgYWRkUG9pbnRlckluZm8sXG4gIGFkZFNjYWxlQ29ycmVjdG9yLFxuICBhbmltYXRlLFxuICBhbmltYXRlTWluaSxcbiAgYW5pbWF0ZVZhbHVlLFxuICBhbmltYXRlVmlzdWFsRWxlbWVudCxcbiAgYW5pbWF0aW9uQ29udHJvbHMsXG4gIGFuaW1hdGlvbnMsXG4gIGFudGljaXBhdGUsXG4gIGJhY2tJbixcbiAgYmFja0luT3V0LFxuICBiYWNrT3V0LFxuICBidWlsZFRyYW5zZm9ybSxcbiAgY2FsY0xlbmd0aCxcbiAgY2FuY2VsRnJhbWUsXG4gIGNhbmNlbFN5bmMsXG4gIGNpcmNJbixcbiAgY2lyY0luT3V0LFxuICBjaXJjT3V0LFxuICBjbGFtcCxcbiAgY29sb3IsXG4gIGNvbXBsZXgsXG4gIGNyZWF0ZUJveCxcbiAgY3JlYXRlUmVuZGVyZXJNb3Rpb25Db21wb25lbnQsXG4gIGNyZWF0ZVNjb3BlZEFuaW1hdGUsXG4gIGN1YmljQmV6aWVyLFxuICBkZWxheSxcbiAgZGlzYWJsZUluc3RhbnRUcmFuc2l0aW9ucyxcbiAgZGlzdGFuY2UsXG4gIGRpc3RhbmNlMkQsXG4gIGRvbUFuaW1hdGlvbixcbiAgZG9tTWF4LFxuICBkb21NaW4sXG4gIGVhc2VJbixcbiAgZWFzZUluT3V0LFxuICBlYXNlT3V0LFxuICBmaWx0ZXJQcm9wcyxcbiAgZmluZFNwcmluZyxcbiAgZnJhbWUsXG4gIGZyYW1lRGF0YSxcbiAgZnJhbWVTdGVwcyxcbiAgaW5WaWV3LFxuICBpbmVydGlhLFxuICBpbnRlcnBvbGF0ZSxcbiAgaW52YXJpYW50LFxuICBpc0Jyb3dzZXIsXG4gIGlzRHJhZ0FjdGl2ZSxcbiAgaXNNb3Rpb25Db21wb25lbnQsXG4gIGlzTW90aW9uVmFsdWUsXG4gIGlzVmFsaWRNb3Rpb25Qcm9wLFxuICBrZXlmcmFtZXMsXG4gIG0sXG4gIG1ha2VVc2VWaXN1YWxTdGF0ZSxcbiAgbWlycm9yRWFzaW5nLFxuICBtaXgsXG4gIG1vdGlvbixcbiAgbW90aW9uVmFsdWUsXG4gIG5vb3AsXG4gIG9wdGltaXplZEFwcGVhckRhdGFBdHRyaWJ1dGUsXG4gIHBpcGUsXG4gIHByb2dyZXNzLFxuICBweCxcbiAgcmVzb2x2ZU1vdGlvblZhbHVlLFxuICByZXZlcnNlRWFzaW5nLFxuICBzY3JvbGwsXG4gIHNjcm9sbEluZm8sXG4gIHNwcmluZyxcbiAgc3RhZ2dlcixcbiAgc3RhcnRPcHRpbWl6ZWRBcHBlYXJBbmltYXRpb24sXG4gIHN0ZXBzLFxuICBzeW5jLFxuICB0aW1lLFxuICB0cmFuc2Zvcm0sXG4gIHVud3JhcE1vdGlvbkNvbXBvbmVudCxcbiAgdXNlQW5pbWF0ZSxcbiAgdXNlQW5pbWF0ZU1pbmksXG4gIHVzZUFuaW1hdGlvbixcbiAgdXNlQW5pbWF0aW9uQ29udHJvbHMsXG4gIHVzZUFuaW1hdGlvbkZyYW1lLFxuICB1c2VDeWNsZSxcbiAgdXNlQW5pbWF0ZWRTdGF0ZSBhcyB1c2VEZXByZWNhdGVkQW5pbWF0ZWRTdGF0ZSxcbiAgdXNlSW52ZXJ0ZWRTY2FsZSBhcyB1c2VEZXByZWNhdGVkSW52ZXJ0ZWRTY2FsZSxcbiAgdXNlRG9tRXZlbnQsXG4gIHVzZURyYWdDb250cm9scyxcbiAgdXNlRWxlbWVudFNjcm9sbCxcbiAgdXNlRm9yY2VVcGRhdGUsXG4gIHVzZUluVmlldyxcbiAgdXNlSW5zdGFudExheW91dFRyYW5zaXRpb24sXG4gIHVzZUluc3RhbnRUcmFuc2l0aW9uLFxuICB1c2VJc1ByZXNlbnQsXG4gIHVzZUlzb21vcnBoaWNMYXlvdXRFZmZlY3QsXG4gIHVzZU1vdGlvblRlbXBsYXRlLFxuICB1c2VNb3Rpb25WYWx1ZSxcbiAgdXNlTW90aW9uVmFsdWVFdmVudCxcbiAgdXNlUHJlc2VuY2UsXG4gIHVzZVJlZHVjZWRNb3Rpb24sXG4gIHVzZVJlZHVjZWRNb3Rpb25Db25maWcsXG4gIHVzZVJlc2V0UHJvamVjdGlvbixcbiAgdXNlU2Nyb2xsLFxuICB1c2VTcHJpbmcsXG4gIHVzZVRpbWUsXG4gIHVzZVRyYW5zZm9ybSxcbiAgdXNlVW5tb3VudEVmZmVjdCxcbiAgdXNlVmVsb2NpdHksXG4gIHVzZVZpZXdwb3J0U2Nyb2xsLFxuICB1c2VXaWxsQ2hhbmdlLFxuICB2aXN1YWxFbGVtZW50U3RvcmUsXG4gIHdyYXBcbn07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yxHQUFHLENBQUM7QUFDaEQsU0FBUyxlQUFlLE1BQU0sT0FBTztBQUNuQyxNQUFJLFNBQVMsU0FBUztBQUNwQixXQUFPO0FBQUEsRUFDVCxPQUFPO0FBQ0wsVUFBTSxZQUFZLFFBQVE7QUFDMUIsV0FBTyxTQUFTLFNBQVMsWUFBWSxZQUFZO0FBQUEsRUFDbkQ7QUFDRjtBQUNBLFNBQVMsUUFBUSxXQUFXLEtBQUssRUFBRSxhQUFhLEdBQUcsT0FBTyxHQUFHLE1BQU0sTUFBTSxJQUFJLENBQUMsR0FBRztBQUMvRSxTQUFPLENBQUMsR0FBRyxVQUFVO0FBQ25CLFVBQU0sWUFBWSxPQUFPLFNBQVMsV0FBVyxPQUFPLGVBQWUsTUFBTSxLQUFLO0FBQzlFLFVBQU0sWUFBWSxLQUFLLElBQUksWUFBWSxDQUFDO0FBQ3hDLFFBQUksU0FBUyxXQUFXO0FBQ3hCLFFBQUksT0FBTztBQUNULFlBQU0sV0FBVyxRQUFRO0FBQ3pCLFlBQU0saUJBQWlCLDJCQUEyQixLQUFLO0FBQ3ZELGVBQVMsZUFBZSxTQUFTLFFBQVEsSUFBSTtBQUFBLElBQy9DO0FBQ0EsV0FBTyxhQUFhO0FBQUEsRUFDdEI7QUFDRjtBQUdBLElBQUksa0JBQWtCLFFBQVEsYUFBYSxHQUFHLENBQUM7QUFDL0MsSUFBSSxrQkFBa0IsUUFBUSxjQUFjLEdBQUcsQ0FBQztBQUNoRCxJQUFJLGtCQUFrQixRQUFRLGNBQWMsR0FBRyxDQUFDO0FBQ2hELElBQUksT0FBTztBQUNYLElBQUksYUFBYSxXQUFXLE9BQU8sQ0FBQyxLQUFLLFFBQVE7QUFDL0MsTUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLFlBQVksUUFBUTtBQUM3QyxTQUFPO0FBQ1QsR0FBRyxDQUFDLENBQUM7QUFHTCxJQUFJLGtCQUFrQixRQUFRLGFBQWEsR0FBRyxDQUFDO0FBQy9DLElBQUksa0JBQWtCLFFBQVEsY0FBYyxHQUFHLENBQUM7QUFDaEQsSUFBSSxrQkFBa0IsUUFBUSxjQUFjLEdBQUcsQ0FBQztBQUNoRCxTQUFTLE1BQU0sVUFBVSxZQU
10617FZLE9BQU87QUFDMUMsU0FBTyxDQUFDLGNBQWM7QUFDcEIsZ0JBQVksY0FBYyxRQUFRLEtBQUssSUFBSSxXQUFXLEtBQUssSUFBSSxLQUFLLElBQUksV0FBVyxJQUFJO0FBQ3ZGLFVBQU0sV0FBVyxZQUFZO0FBQzdCLFVBQU0sVUFBVSxjQUFjLFFBQVEsS0FBSyxNQUFNLFFBQVEsSUFBSSxLQUFLLEtBQUssUUFBUTtBQUMvRSxXQUFPLE1BQU0sR0FBRyxHQUFHLFVBQVUsUUFBUTtBQUFBLEVBQ3ZDO0FBQ0Y7QUFDQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EscUJBQXFCO0FBQUEsRUFDckI7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQSxvQkFBb0I7QUFBQSxFQUNwQixvQkFBb0I7QUFBQSxFQUNwQjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQTsiLCJuYW1lcyI6W10sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswXX0=

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.