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.