import "/_nuxt/node_modules/@nuxt/devtools/dist/runtime/vue-devtools/overlay.js"; import { parentEntrySlot } from "/_nuxt/node_modules/optimism/lib/context.js?v=e4f18c29"; import { maybeUnsubscribe, arrayFromSet } from "/_nuxt/node_modules/optimism/lib/helpers.js?v=e4f18c29"; const emptySetPool = []; const POOL_TARGET_SIZE = 100; // Since this package might be used browsers, we should avoid using the // Node built-in assert module. function assert(condition, optionalMessage) { if (!condition) { throw new Error(optionalMessage || "assertion failure"); } } function valueIs(a, b) { const len = a.length; return ( // Unknown values are not equal to each other. len > 0 && // Both values must be ordinary (or both exceptional) to be equal. len === b.length && // The underlying value or exception must be the same. a[len - 1] === b[len - 1]); } function valueGet(value) { switch (value.length) { case 0: throw new Error("unknown value"); case 1: return value[0]; case 2: throw value[1]; } } function valueCopy(value) { return value.slice(0); } export class Entry { constructor(fn) { this.fn = fn; this.parents = new Set(); this.childValues = new Map(); // When this Entry has children that are dirty, this property becomes // a Set containing other Entry objects, borrowed from emptySetPool. // When the set becomes empty, it gets recycled back to emptySetPool. this.dirtyChildren = null; this.dirty = true; this.recomputing = false; this.value = []; this.deps = null; ++Entry.count; } peek() { if (this.value.length === 1 && !mightBeDirty(this)) { rememberParent(this); return this.value[0]; } } // This is the most important method of the Entry API, because it // determines whether the cached this.value can be returned immediately, // or must be recomputed. The overall performance of the caching system // depends on the truth of the following observations: (1) this.dirty is // usually false, (2) this.dirtyChildren is usually null/empty, and thus // (3) valueGet(this.value) is usually returned without recomputation. recompute(args) { assert(!this.recomputing, "already recomputing"); rememberParent(this); return mightBeDirty(this) ? reallyRecompute(this, args) : valueGet(this.value); } setDirty() { if (this.dirty) return; this.dirty = true; reportDirty(this); // We can go ahead and unsubscribe here, since any further dirty // notifications we receive will be redundant, and unsubscribing may // free up some resources, e.g. file watchers. maybeUnsubscribe(this); } dispose() { this.setDirty(); // Sever any dependency relationships with our own children, so those // children don't retain this parent Entry in their child.parents sets, // thereby preventing it from being fully garbage collected. forgetChildren(this); // Because this entry has been kicked out of the cache (in index.js), // we've lost the ability to find out if/when this entry becomes dirty, // whether that happens through a subscription, because of a direct call // to entry.setDirty(), or because one of its children becomes dirty. // Because of this loss of future information, we have to assume the // worst (that this entry might have become dirty very soon), so we must // immediately mark this entry's parents as dirty. Normally we could // just call entry.setDirty() rather than calling parent.setDirty() for // each parent, but that would leave this entry in parent.childValues // and parent.dirtyChildren, which would prevent the child from being // truly forgotten. eachParent(this, (parent, child) => { parent.setDirty(); forgetChild(parent, this); }); } forget() { // The code that creates Entry objects in index.ts will replace this method // with one that actually removes the Entry from the cache, which will also // trigger the entry.dispose method. this.dispose(); } dependOn(dep) { dep.add(this); if (!this.deps) { this.deps = emptySetPool.pop() || new Set(); } this.deps.add(dep); } forgetDeps() { if (this.deps) { arrayFromSet(this.deps).forEach(dep => dep.delete(this)); this.deps.clear(); emptySetPool.push(this.deps); this.deps = null; } } } Entry.count = 0; function rememberParent(child) { const parent = parentEntrySlot.getValue(); if (parent) { child.parents.add(parent); if (!parent.childValues.has(child)) { parent.childValues.set(child, []); } if (mightBeDirty(child)) { reportDirtyChild(parent, child); } else { reportCleanChild(parent, child); } return parent; } } function reallyRecompute(entry, args) { forgetChildren(entry); // Set entry as the parent entry while calling recomputeNewValue(entry). parentEntrySlot.withValue(entry, recomputeNewValue, [entry, args]); if (maybeSubscribe(entry, args)) { // If we successfully recomputed entry.value and did not fail to // (re)subscribe, then this Entry is no longer explicitly dirty. setClean(entry); } return valueGet(entry.value); } function recomputeNewValue(entry, args) { entry.recomputing = true; const { normalizeResult } = entry; let oldValueCopy; if (normalizeResult && entry.value.length === 1) { oldValueCopy = valueCopy(entry.value); } // Make entry.value an empty array, representing an unknown value. entry.value.length = 0; try { // If entry.fn succeeds, entry.value will become a normal Value. entry.value[0] = entry.fn.apply(null, args); // If we have a viable oldValueCopy to compare with the (successfully // recomputed) new entry.value, and they are not already === identical, give // normalizeResult a chance to pick/choose/reuse parts of oldValueCopy[0] // and/or entry.value[0] to determine the final cached entry.value. if (normalizeResult && oldValueCopy && !valueIs(oldValueCopy, entry.value)) { try { entry.value[0] = normalizeResult(entry.value[0], oldValueCopy[0]); } catch (_a) { // If normalizeResult throws, just use the newer value, rather than // saving the exception as entry.value[1]. } } } catch (e) { // If entry.fn throws, entry.value will hold that exception. entry.value[1] = e; } // Either way, this line is always reached. entry.recomputing = false; } function mightBeDirty(entry) { return entry.dirty || !!(entry.dirtyChildren && entry.dirtyChildren.size); } function setClean(entry) { entry.dirty = false; if (mightBeDirty(entry)) { // This Entry may still have dirty children, in which case we can't // let our parents know we're clean just yet. return; } reportClean(entry); } function reportDirty(child) { eachParent(child, reportDirtyChild); } function reportClean(child) { eachParent(child, reportCleanChild); } function eachParent(child, callback) { const parentCount = child.parents.size; if (parentCount) { const parents = arrayFromSet(child.parents); for (let i = 0; i < parentCount; ++i) { callback(parents[i], child); } } } // Let a parent Entry know that one of its children may be dirty. function reportDirtyChild(parent, child) { // Must have called rememberParent(child) before calling // reportDirtyChild(parent, child). assert(parent.childValues.has(child)); assert(mightBeDirty(child)); const parentWasClean = !mightBeDirty(parent); if (!parent.dirtyChildren) { parent.dirtyChildren = emptySetPool.pop() || new Set; } else if (parent.dirtyChildren.has(child)) { // If we already know this child is dirty, then we must have already // informed our own parents that we are dirty, so we can terminate // the recursion early. return; } parent.dirtyChildren.add(child); // If parent was clean before, it just became (possibly) dirty (according to // mightBeDirty), since we just added child to parent.dirtyChildren. if (parentWasClean) { reportDirty(parent); } } // Let a parent Entry know that one of its children is no longer dirty. function reportCleanChild(parent, child) { // Must have called rememberChild(child) before calling // reportCleanChild(parent, child). assert(parent.childValues.has(child)); assert(!mightBeDirty(child)); const childValue = parent.childValues.get(child); if (childValue.length === 0) { parent.childValues.set(child, valueCopy(child.value)); } else if (!valueIs(childValue, child.value)) { parent.setDirty(); } removeDirtyChild(parent, child); if (mightBeDirty(parent)) { return; } reportClean(parent); } function removeDirtyChild(parent, child) { const dc = parent.dirtyChildren; if (dc) { dc.delete(child); if (dc.size === 0) { if (emptySetPool.length < POOL_TARGET_SIZE) { emptySetPool.push(dc); } parent.dirtyChildren = null; } } } // Removes all children from this entry and returns an array of the // removed children. function forgetChildren(parent) { if (parent.childValues.size > 0) { parent.childValues.forEach((_value, child) => { forgetChild(parent, child); }); } // Remove this parent Entry from any sets to which it was added by the // addToSet method. parent.forgetDeps(); // After we forget all our children, this.dirtyChildren must be empty // and therefore must have been reset to null. assert(parent.dirtyChildren === null); } function forgetChild(parent, child) { child.parents.delete(parent); parent.childValues.delete(child); removeDirtyChild(parent, child); } function maybeSubscribe(entry, args) { if (typeof entry.subscribe === "function") { try { maybeUnsubscribe(entry); // Prevent double subscriptions. entry.unsubscribe = entry.subscribe.apply(null, args); } catch (e) { // If this Entry has a subscribe function and it threw an exception // (or an unsubscribe function it previously returned now throws), // return false to indicate that we were not able to subscribe (or // unsubscribe), and this Entry should remain dirty. entry.setDirty(); return false; } } // Returning true indicates either that there was no entry.subscribe // function or that it succeeded. return true; } import "/_nuxt/node_modules/vite-plugin-vue-inspector/src/load.js" //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZW50cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUcvQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFrQixNQUFNLGNBQWMsQ0FBQztBQUU5RSxNQUFNLFlBQVksR0FBZSxFQUFFLENBQUM7QUFDcEMsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7QUFFN0IsdUVBQXVFO0FBQ3ZFLCtCQUErQjtBQUMvQixTQUFTLE1BQU0sQ0FBQyxTQUFjLEVBQUUsZUFBd0I7SUFDdEQsSUFBSSxDQUFFLFNBQVMsRUFBRTtRQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxJQUFJLG1CQUFtQixDQUFDLENBQUM7S0FDekQ7QUFDSCxDQUFDO0FBU0QsU0FBUyxPQUFPLENBQUMsQ0FBYSxFQUFFLENBQWE7SUFDM0MsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNyQixPQUFPO0lBQ0wsOENBQThDO0lBQzlDLEdBQUcsR0FBRyxDQUFDO1FBQ1Asa0VBQWtFO1FBQ2xFLEdBQUcsS0FBSyxDQUFDLENBQUMsTUFBTTtRQUNoQixzREFBc0Q7UUFDdEQsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUMxQixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFJLEtBQWU7SUFDbEMsUUFBUSxLQUFLLENBQUMsTUFBTSxFQUFFO1FBQ3BCLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN6QyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FB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QyxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwYXJlbnRFbnRyeVNsb3QgfSBmcm9tIFwiLi9jb250ZXh0LmpzXCI7XG5pbXBvcnQgeyBPcHRpbWlzdGljV3JhcE9wdGlvbnMgfSBmcm9tIFwiLi9pbmRleC5qc1wiO1xuaW1wb3J0IHsgRGVwIH0gZnJvbSBcIi4vZGVwLmpzXCI7XG5pbXBvcnQgeyBtYXliZVVuc3Vic2NyaWJlLCBhcnJheUZyb21TZXQsIFVuc3Vic2NyaWJhYmxlIH0gZnJvbSBcIi4vaGVscGVycy5qc1wiO1xuXG5jb25zdCBlbXB0eVNldFBvb2w6IFNldDxhbnk+W10gPSBbXTtcbmNvbnN0IFBPT0xfVEFSR0VUX1NJWkUgPSAxMDA7XG5cbi8vIFNpbmNlIHRoaXMgcGFja2FnZSBtaWdodCBiZSB1c2VkIGJyb3dzZXJzLCB3ZSBzaG91bGQgYXZvaWQgdXNpbmcgdGhlXG4vLyBOb2RlIGJ1aWx0LWluIGFzc2VydCBtb2R1bGUuXG5mdW5jdGlvbiBhc3NlcnQoY29uZGl0aW9uOiBhbnksIG9wdGlvbmFsTWVzc2FnZT86IHN0cmluZykge1xuICBpZiAoISBjb25kaXRpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3Iob3B0aW9uYWxNZXNzYWdlIHx8IFwiYXNzZXJ0aW9uIGZhaWx1cmVcIik7XG4gIH1cbn1cblxuLy8gU2luY2UgZXhjZXB0aW9ucyBhcmUgY2FjaGVkIGp1c3QgbGlrZSBub3JtYWwgdmFsdWVzLCB3ZSBuZWVkIGFuIGVmZmljaWVudFxuLy8gd2F5IG9mIHJlcHJlc2VudGluZyB1bmtub3duLCBvcmRpbmFyeSwgYW5kIGV4Y2VwdGlvbmFsIHZhbHVlcy5cbnR5cGUgVmFsdWU8VD4gPVxuICB8IFtdICAgICAgICAgICAvLyB1bmtub3duXG4gIHwgW1RdICAgICAgICAgIC8vIGtub3duIHZhbHVlXG4gIHwgW3ZvaWQsIGFueV07IC8vIGtub3duIGV4Y2VwdGlvblxuXG5mdW5jdGlvbiB2YWx1ZUlzKGE6IFZhbHVlPGFueT4sIGI6IFZhbHVlPGFueT4pIHtcbiAgY29uc3QgbGVuID0gYS5sZW5ndGg7XG4gIHJldHVybiAoXG4gICAgLy8gVW5rbm93biB2YWx1ZXMgYXJlIG5vdCBlcXVhbCB0byBlYWNoIG90aGVyLlxuICAgIGxlbiA+IDAgJiZcbiAgICAvLyBCb3RoIHZhbHVlcyBtdXN0IGJlIG9yZGluYXJ5IChvciBib3RoIGV4Y2VwdGlvbmFsKSB0byBiZSBlcXVhbC5cbiAgICBsZW4gPT09IGIubGVuZ3RoICYmXG4gICAgLy8gVGhlIHVuZGVybHlpbmcgdmFsdWUgb3IgZXhjZXB0aW9uIG11c3QgYmUgdGhlIHNhbWUuXG4gICAgYVtsZW4gLSAxXSA9PT0gYltsZW4gLSAxXVxuICApO1xufVxuXG5mdW5jdGlvbiB2YWx1ZUdldDxUPih2YWx1ZTogVmFsdWU8VD4pOiBUIHtcbiAgc3dpdGNoICh2YWx1ZS5sZW5ndGgpIHtcbiAgICBjYXNlIDA6IHRocm93IG5ldyBFcnJvcihcInVua25vd24gdmFsdWVcIik7XG4gICAgY2FzZSAxOiByZXR1cm4gdmFsdWVbMF07XG4gICAgY2FzZSAyOiB0aHJvdyB2YWx1ZVsxXTtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWx1ZUNvcHk8VD4odmFsdWU6IFZhbHVlPFQ+KTogVmFsdWU8VD4ge1xuICByZXR1cm4gdmFsdWUuc2xpY2UoMCkgYXMgVmFsdWU8VD47XG59XG5cbmV4cG9ydCB0eXBlIEFueUVudHJ5ID0gRW50cnk8YW55LCBhbnk+O1xuXG5leHBvcnQgY2xhc3MgRW50cnk8VEFyZ3MgZXh0ZW5kcyBhbnlbXSwgVFZhbHVlPiB7XG4gIHB1YmxpYyBzdGF0aWMgY291bnQgPSAwO1xuXG4gIHB1YmxpYyBub3JtYWxpemVSZXN1bHQ6IE9wdGltaXN0aWNXcmFwT3B0aW9uczxUQXJncywgYW55LCBhbnksIFRWYWx1ZT5bXCJub3JtYWxpemVSZXN1bHRcIl07XG4gIHB1YmxpYyBzdWJzY3JpYmU6IE9wdGltaXN0aWNXcmFwT3B0aW9uczxUQXJncz5bXCJzdWJzY3JpYmVcIl07XG4gIHB1YmxpYyB1bnN1YnNjcmliZTogVW5zdWJzY3JpYmFibGVbXCJ1bnN1YnNjcmliZVwiXTtcblxuICBwdWJsaWMgcmVhZG9ubHkgcGFyZW50cyA9IG5ldyBTZXQ8QW55RW50cnk+KCk7XG4gIHB1YmxpYyByZWFkb25seSBjaGlsZFZhbHVlcyA9IG5ldyBNYXA8QW55RW50cnksIFZhbHVlPGFueT4+KCk7XG5cbiAgLy8gV2hlbiB0aGlzIEVudHJ5IGhhcyBjaGlsZHJlbiB0aGF0IGFyZSBkaXJ0eSwgdGhpcyBwcm9wZXJ0eSBiZWNvbWVzXG4gIC8vIGEgU2V0IGNvbnRhaW5pbmcgb3RoZXIgRW50cnkgb2JqZWN0cywgYm9ycm93ZWQgZnJvbSBlbXB0eVNldFBvb2wuXG4gIC8vIFdoZW4gdGhlIHNldCBiZWNvbWVzIGVtcHR5LCBpdCBnZXRzIHJlY3ljbGVkIGJhY2sgdG8gZW1wdHlTZXRQb29sLlxuICBwdWJsaWMgZGlydHlDaGlsZHJlbjogU2V0PEFueUVudHJ5PiB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBkaXJ0eSA9IHRydWU7XG4gIHB1YmxpYyByZWNvbXB1dGluZyA9IGZhbHNlO1xuICBwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IFZhbHVlPFRWYWx1ZT4gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgZm46ICguLi5hcmdzOiBUQXJncykgPT4gVFZhbHVlLFxuICApIHtcbiAgICArK0VudHJ5LmNvdW50O1xuICB9XG5cbiAgcHVibGljIHBlZWsoKTogVFZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy52YWx1ZS5sZW5ndGggPT09IDEgJiYgIW1pZ2h0QmVEaXJ0eSh0aGlzKSkge1xuICAgICAgcmVtZW1iZXJQYXJlbnQodGhpcyk7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZVswXTtcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIGlzIHRoZSBtb3N0IGltcG9ydGFudCBtZXRob2Qgb2YgdGhlIEVudHJ5IEFQSSwgYmVjYXVzZSBpdFxuICAvLyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGNhY2hlZCB0aGlzLnZhbHVlIGNhbiBiZSByZXR1cm5lZCBpbW1lZGlhdGVseSxcbiAgLy8gb3IgbXVzdCBiZSByZWNvbXB1dGVkLiBUaGUgb3ZlcmFsbCBwZXJmb3JtYW5jZSBvZiB0aGUgY2FjaGluZyBzeXN0ZW1cbiAgLy8gZGVwZW5kcyBvbiB0aGUgdHJ1dGggb2YgdGhlIGZvbGxvd2luZyBvYnNlcnZhdGlvbnM6ICgxKSB0aGlzLmRpcnR5IGlzXG4gIC8vIHVzdWFsbHkgZmFsc2UsICgyKSB0aGlzLmRpcnR5Q2hpbGRyZW4gaXMgdXN1YWxseSBudWxsL2VtcHR5LCBhbmQgdGh1c1xuICAvLyAoMykgdmFsdWVHZXQodGhpcy52YWx1ZSkgaXMgdXN1YWxseSByZXR1cm5lZCB3aXRob3V0IHJlY29tcHV0YXRpb24uXG4gIHB1YmxpYyByZWNvbXB1dGUoYXJnczogVEFyZ3MpOiBUVmFsdWUge1xuICAgIGFzc2VydCghIHRoaXMucmVjb21wdXRpbmcsIFwiYWxyZWFkeSByZWNvbXB1dGluZ1wiKTtcbiAgICByZW1lbWJlclBhcmVudCh0aGlzKTtcbiAgICByZXR1cm4gbWlnaHRCZURpcnR5KHRoaXMpXG4gICAgICA/IHJlYWxseVJlY29tcHV0ZSh0aGlzLCBhcmdzKVxuICAgICAgOiB2YWx1ZUdldCh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXREaXJ0eSgpIHtcbiAgICBpZiAodGhpcy5kaXJ0eSkgcmV0dXJuO1xuICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIHJlcG9ydERpcnR5KHRoaXMpO1xuICAgIC8vIFdlIGNhbiBnbyBhaGVhZCBhbmQgdW5zdWJzY3JpYmUgaGVyZSwgc2luY2UgYW55IGZ1cnRoZXIgZGlydHlcbiAgICAvLyBub3RpZmljYXRpb25zIHdlIHJlY2VpdmUgd2lsbCBiZSByZWR1bmRhbnQsIGFuZCB1bnN1YnNjcmliaW5nIG1heVxuICAgIC8vIGZyZWUgdXAgc29tZSByZXNvdXJjZXMsIGUuZy4gZmlsZSB3YXRjaGVycy5cbiAgICBtYXliZVVuc3Vic2NyaWJlKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgdGhpcy5zZXREaXJ0eSgpO1xuXG4gICAgLy8gU2V2ZXIgYW55IGRlcGVuZGVuY3kgcmVsYXRpb25zaGlwcyB3aXRoIG91ciBvd24gY2hpbGRyZW4sIHNvIHRob3NlXG4gICAgLy8gY2hpbGRyZW4gZG9uJ3QgcmV0YWluIHRoaXMgcGFyZW50IEVudHJ5IGluIHRoZWlyIGNoaWxkLnBhcmVudHMgc2V0cyxcbiAgICAvLyB0aGVyZWJ5IHByZXZlbnRpbmcgaXQgZnJvbSBiZWluZyBmdWxseSBnYXJiYWdlIGNvbGxlY3RlZC5cbiAgICBmb3JnZXRDaGlsZHJlbih0aGlzKTtcblxuICAgIC8vIEJlY2F1c2UgdGhpcyBlbnRyeSBoYXMgYmVlbiBraWNrZWQgb3V0IG9mIHRoZSBjYWNoZSAoaW4gaW5kZXguanMpLFxuICAgIC8vIHdlJ3ZlIGxvc3QgdGhlIGFiaWxpdHkgdG8gZmluZCBvdXQgaWYvd2hlbiB0aGlzIGVudHJ5IGJlY29tZXMgZGlydHksXG4gICAgLy8gd2hldGhlciB0aGF0IGhhcHBlbnMgdGhyb3VnaCBhIHN1YnNjcmlwdGlvbiwgYmVjYXVzZSBvZiBhIGRpcmVjdCBjYWxsXG4gICAgLy8gdG8gZW50cnkuc2V0RGlydHkoKSwgb3IgYmVjYXVzZSBvbmUgb2YgaXRzIGNoaWxkcmVuIGJlY29tZXMgZGlydHkuXG4gICAgLy8gQmVjYXVzZSBvZiB0aGlzIGxvc3Mgb2YgZnV0dXJlIGluZm9ybWF0aW9uLCB3ZSBoYXZlIHRvIGFzc3VtZSB0aGVcbiAgICAvLyB3b3JzdCAodGhhdCB0aGlzIGVudHJ5IG1pZ2h0IGhhdmUgYmVjb21lIGRpcnR5IHZlcnkgc29vbiksIHNvIHdlIG11c3RcbiAgICAvLyBpbW1lZGlhdGVseSBtYXJrIHRoaXMgZW50cnkncyBwYXJlbnRzIGFzIGRpcnR5LiBOb3JtYWxseSB3ZSBjb3VsZFxuICAgIC8vIGp1c3QgY2FsbCBlbnRyeS5zZXREaXJ0eSgpIHJhdGhlciB0aGFuIGNhbGxpbmcgcGFyZW50LnNldERpcnR5KCkgZm9yXG4gICAgLy8gZWFjaCBwYXJlbnQsIGJ1dCB0aGF0IHdvdWxkIGxlYXZlIHRoaXMgZW50cnkgaW4gcGFyZW50LmNoaWxkVmFsdWVzXG4gICAgLy8gYW5kIHBhcmVudC5kaXJ0eUNoaWxkcmVuLCB3aGljaCB3b3VsZCBwcmV2ZW50IHRoZSBjaGlsZCBmcm9tIGJlaW5nXG4gICAgLy8gdHJ1bHkgZm9yZ290dGVuLlxuICAgIGVhY2hQYXJlbnQodGhpcywgKHBhcmVudCwgY2hpbGQpID0+IHtcbiAgICAgIHBhcmVudC5zZXREaXJ0eSgpO1xuICAgICAgZm9yZ2V0Q2hpbGQocGFyZW50LCB0aGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBmb3JnZXQoKSB7XG4gICAgLy8gVGhlIGNvZGUgdGhhdCBjcmVhdGVzIEVudHJ5IG9iamVjdHMgaW4gaW5kZXgudHMgd2lsbCByZXBsYWNlIHRoaXMgbWV0aG9kXG4gICAgLy8gd2l0aCBvbmUgdGhhdCBhY3R1YWxseSByZW1vdmVzIHRoZSBFbnRyeSBmcm9tIHRoZSBjYWNoZSwgd2hpY2ggd2lsbCBhbHNvXG4gICAgLy8gdHJpZ2dlciB0aGUgZW50cnkuZGlzcG9zZSBtZXRob2QuXG4gICAgdGhpcy5kaXNwb3NlKCk7XG4gIH1cblxuICBwcml2YXRlIGRlcHM6IFNldDxEZXA8YW55Pj4gfCBudWxsID0gbnVsbDtcblxuICBwdWJsaWMgZGVwZW5kT24oZGVwOiBEZXA8YW55Pikge1xuICAgIGRlcC5hZGQodGhpcyk7XG4gICAgaWYgKCEgdGhpcy5kZXBzKSB7XG4gICAgICB0aGlzLmRlcHMgPSBlbXB0eVNldFBvb2wucG9wKCkgfHwgbmV3IFNldDxTZXQ8QW55RW50cnk+PigpO1xuICAgIH1cbiAgICB0aGlzLmRlcHMuYWRkKGRlcCk7XG4gIH1cblxuICBwdWJsaWMgZm9yZ2V0RGVwcygpIHtcbiAgICBpZiAodGhpcy5kZXBzKSB7XG4gICAgICBhcnJheUZyb21TZXQodGhpcy5kZXBzKS5mb3JFYWNoKGRlcCA9PiBkZXAuZGVsZXRlKHRoaXMpKTtcbiAgICAgIHRoaXMuZGVwcy5jbGVhcigpO1xuICAgICAgZW1wdHlTZXRQb29sLnB1c2godGhpcy5kZXBzKTtcbiAgICAgIHRoaXMuZGVwcyA9IG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlbWVtYmVyUGFyZW50KGNoaWxkOiBBbnlFbnRyeSkge1xuICBjb25zdCBwYXJlbnQgPSBwYXJlbnRFbnRyeVNsb3QuZ2V0VmFsdWUoKTtcbiAgaWYgKHBhcmVudCkge1xuICAgIGNoaWxkLnBhcmVudHMuYWRkKHBhcmVudCk7XG5cbiAgICBpZiAoISBwYXJlbnQuY2hpbGRWYWx1ZXMuaGFzKGNoaWxkKSkge1xuICAgICAgcGFyZW50LmNoaWxkVmFsdWVzLnNldChjaGlsZCwgW10pO1xuICAgIH1cblxuICAgIGlmIChtaWdodEJlRGlydHkoY2hpbGQpKSB7XG4gICAgICByZXBvcnREaXJ0eUNoaWxkKHBhcmVudCwgY2hpbGQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXBvcnRDbGVhbkNoaWxkKHBhcmVudCwgY2hpbGQpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJlbnQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhbGx5UmVjb21wdXRlKGVudHJ5OiBBbnlFbnRyeSwgYXJnczogYW55W10pIHtcbiAgZm9yZ2V0Q2hpbGRyZW4oZW50cnkpO1xuXG4gIC8vIFNldCBlbnRyeSBhcyB0aGUgcGFyZW50IGVudHJ5IHdoaWxlIGNhbGxpbmcgcmVjb21wdXRlTmV3VmFsdWUoZW50cnkpLlxuICBwYXJlbnRFbnRyeVNsb3Qud2l0aFZhbHVlKGVudHJ5LCByZWNvbXB1dGVOZXdWYWx1ZSwgW2VudHJ5LCBhcmdzXSk7XG5cbiAgaWYgKG1heWJlU3Vic2NyaWJlKGVudHJ5LCBhcmdzKSkge1xuICAgIC8vIElmIHdlIHN1Y2Nlc3NmdWxseSByZWNvbXB1dGVkIGVudHJ5LnZhbHVlIGFuZCBkaWQgbm90IGZhaWwgdG9cbiAgICAvLyAocmUpc3Vic2NyaWJlLCB0aGVuIHRoaXMgRW50cnkgaXMgbm8gbG9uZ2VyIGV4cGxpY2l0bHkgZGlydHkuXG4gICAgc2V0Q2xlYW4oZW50cnkpO1xuICB9XG5cbiAgcmV0dXJuIHZhbHVlR2V0KGVudHJ5LnZhbHVlKTtcbn1cblxuZnVuY3Rpb24gcmVjb21wdXRlTmV3VmFsdWUoZW50cnk6IEFueUVudHJ5LCBhcmdzOiBhbnlbXSkge1xuICBlbnRyeS5yZWNvbXB1dGluZyA9IHRydWU7XG5cbiAgY29uc3QgeyBub3JtYWxpemVSZXN1bHQgfSA9IGVudHJ5O1xuICBsZXQgb2xkVmFsdWVDb3B5OiBWYWx1ZTxhbnk+IHwgdW5kZWZpbmVkO1xuICBpZiAobm9ybWFsaXplUmVzdWx0ICYmIGVudHJ5LnZhbHVlLmxlbmd0aCA9PT0gMSkge1xuICAgIG9sZFZhbHVlQ29weSA9IHZhbHVlQ29weShlbnRyeS52YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVudHJ5LnZhbHVlIGFuIGVtcHR5IGFycmF5LCByZXByZXNlbnRpbmcgYW4gdW5rbm93biB2YWx1ZS5cbiAgZW50cnkudmFsdWUubGVuZ3RoID0gMDtcblxuICB0cnkge1xuICAgIC8vIElmIGVudHJ5LmZuIHN1Y2NlZWRzLCBlbnRyeS52YWx1ZSB3aWxsIGJlY29tZSBhIG5vcm1hbCBWYWx1ZS5cbiAgICBlbnRyeS52YWx1ZVswXSA9IGVudHJ5LmZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBhIHZpYWJsZSBvbGRWYWx1ZUNvcHkgdG8gY29tcGFyZSB3aXRoIHRoZSAoc3VjY2Vzc2Z1bGx5XG4gICAgLy8gcmVjb21wdXRlZCkgbmV3IGVudHJ5LnZhbHVlLCBhbmQgdGhleSBhcmUgbm90IGFscmVhZHkgPT09IGlkZW50aWNhbCwgZ2l2ZVxuICAgIC8vIG5vcm1hbGl6ZVJlc3VsdCBhIGNoYW5jZSB0byBwaWNrL2Nob29zZS9yZXVzZSBwYXJ0cyBvZiBvbGRWYWx1ZUNvcHlbMF1cbiAgICAvLyBhbmQvb3IgZW50cnkudmFsdWVbMF0gdG8gZGV0ZXJtaW5lIHRoZSBmaW5hbCBjYWNoZWQgZW50cnkudmFsdWUuXG4gICAgaWYgKG5vcm1hbGl6ZVJlc3VsdCAmJiBvbGRWYWx1ZUNvcHkgJiYgIXZhbHVlSXMob2xkVmFsdWVDb3B5LCBlbnRyeS52YWx1ZSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVudHJ5LnZhbHVlWzBdID0gbm9ybWFsaXplUmVzdWx0KGVudHJ5LnZhbHVlWzBdLCBvbGRWYWx1ZUNvcHlbMF0pO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIC8vIElmIG5vcm1hbGl6ZVJlc3VsdCB0aHJvd3MsIGp1c3QgdXNlIHRoZSBuZXdlciB2YWx1ZSwgcmF0aGVyIHRoYW5cbiAgICAgICAgLy8gc2F2aW5nIHRoZSBleGNlcHRpb24gYXMgZW50cnkudmFsdWVbMV0uXG4gICAgICB9XG4gICAgfVxuXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBJZiBlbnRyeS5mbiB0aHJvd3MsIGVudHJ5LnZhbHVlIHdpbGwgaG9sZCB0aGF0IGV4Y2VwdGlvbi5cbiAgICBlbnRyeS52YWx1ZVsxXSA9IGU7XG4gIH1cblxuICAvLyBFaXRoZXIgd2F5LCB0aGlzIGxpbmUgaXMgYWx3YXlzIHJlYWNoZWQuXG4gIGVudHJ5LnJlY29tcHV0aW5nID0gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG1pZ2h0QmVEaXJ0eShlbnRyeTogQW55RW50cnkpIHtcbiAgcmV0dXJuIGVudHJ5LmRpcnR5IHx8ICEhKGVudHJ5LmRpcnR5Q2hpbGRyZW4gJiYgZW50cnkuZGlydHlDaGlsZHJlbi5zaXplKTtcbn1cblxuZnVuY3Rpb24gc2V0Q2xlYW4oZW50cnk6IEFueUVudHJ5KSB7XG4gIGVudHJ5LmRpcnR5ID0gZmFsc2U7XG5cbiAgaWYgKG1pZ2h0QmVEaXJ0eShlbnRyeSkpIHtcbiAgICAvLyBUaGlzIEVudHJ5IG1heSBzdGlsbCBoYXZlIGRpcnR5IGNoaWxkcmVuLCBpbiB3aGljaCBjYXNlIHdlIGNhbid0XG4gICAgLy8gbGV0IG91ciBwYXJlbnRzIGtub3cgd2UncmUgY2xlYW4ganVzdCB5ZXQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVwb3J0Q2xlYW4oZW50cnkpO1xufVxuXG5mdW5jdGlvbiByZXBvcnREaXJ0eShjaGlsZDogQW55RW50cnkpIHtcbiAgZWFjaFBhcmVudChjaGlsZCwgcmVwb3J0RGlydHlDaGlsZCk7XG59XG5cbmZ1bmN0aW9uIHJlcG9ydENsZWFuKGNoaWxkOiBBbnlFbnRyeSkge1xuICBlYWNoUGFyZW50KGNoaWxkLCByZXBvcnRDbGVhbkNoaWxkKTtcbn1cblxuZnVuY3Rpb24gZWFjaFBhcmVudChcbiAgY2hpbGQ6IEFueUVudHJ5LFxuICBjYWxsYmFjazogKHBhcmVudDogQW55RW50cnksIGNoaWxkOiBBbnlFbnRyeSkgPT4gYW55LFxuKSB7XG4gIGNvbnN0IHBhcmVudENvdW50ID0gY2hpbGQucGFyZW50cy5zaXplO1xuICBpZiAocGFyZW50Q291bnQpIHtcbiAgICBjb25zdCBwYXJlbnRzID0gYXJyYXlGcm9tU2V0KGNoaWxkLnBhcmVudHMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyZW50Q291bnQ7ICsraSkge1xuICAgICAgY2FsbGJhY2socGFyZW50c1tpXSwgY2hpbGQpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBMZXQgYSBwYXJlbnQgRW50cnkga25vdyB0aGF0IG9uZSBvZiBpdHMgY2hpbGRyZW4gbWF5IGJlIGRpcnR5LlxuZnVuY3Rpb24gcmVwb3J0RGlydHlDaGlsZChwYXJlbnQ6IEFueUVudHJ5LCBjaGlsZDogQW55RW50cnkpIHtcbiAgLy8gTXVzdCBoYXZlIGNhbGxlZCByZW1lbWJlclBhcmVudChjaGlsZCkgYmVmb3JlIGNhbGxpbmdcbiAgLy8gcmVwb3J0RGlydHlDaGlsZChwYXJlbnQsIGNoaWxkKS5cbiAgYXNzZXJ0KHBhcmVudC5jaGlsZFZhbHVlcy5oYXMoY2hpbGQpKTtcbiAgYXNzZXJ0KG1pZ2h0QmVEaXJ0eShjaGlsZCkpO1xuICBjb25zdCBwYXJlbnRXYXNDbGVhbiA9ICFtaWdodEJlRGlydHkocGFyZW50KTtcblxuICBpZiAoISBwYXJlbnQuZGlydHlDaGlsZHJlbikge1xuICAgIHBhcmVudC5kaXJ0eUNoaWxkcmVuID0gZW1wdHlTZXRQb29sLnBvcCgpIHx8IG5ldyBTZXQ7XG5cbiAgfSBlbHNlIGlmIChwYXJlbnQuZGlydHlDaGlsZHJlbi5oYXMoY2hpbGQpKSB7XG4gICAgLy8gSWYgd2UgYWxyZWFkeSBrbm93IHRoaXMgY2hpbGQgaXMgZGlydHksIHRoZW4gd2UgbXVzdCBoYXZlIGFscmVhZHlcbiAgICAvLyBpbmZvcm1lZCBvdXIgb3duIHBhcmVudHMgdGhhdCB3ZSBhcmUgZGlydHksIHNvIHdlIGNhbiB0ZXJtaW5hdGVcbiAgICAvLyB0aGUgcmVjdXJzaW9uIGVhcmx5LlxuICAgIHJldHVybjtcbiAgfVxuXG4gIHBhcmVudC5kaXJ0eUNoaWxkcmVuLmFkZChjaGlsZCk7XG5cbiAgLy8gSWYgcGFyZW50IHdhcyBjbGVhbiBiZWZvcmUsIGl0IGp1c3QgYmVjYW1lIChwb3NzaWJseSkgZGlydHkgKGFjY29yZGluZyB0b1xuICAvLyBtaWdodEJlRGlydHkpLCBzaW5jZSB3ZSBqdXN0IGFkZGVkIGNoaWxkIHRvIHBhcmVudC5kaXJ0eUNoaWxkcmVuLlxuICBpZiAocGFyZW50V2FzQ2xlYW4pIHtcbiAgICByZXBvcnREaXJ0eShwYXJlbnQpO1xuICB9XG59XG5cbi8vIExldCBhIHBhcmVudCBFbnRyeSBrbm93IHRoYXQgb25lIG9mIGl0cyBjaGlsZHJlbiBpcyBubyBsb25nZXIgZGlydHkuXG5mdW5jdGlvbiByZXBvcnRDbGVhbkNoaWxkKHBhcmVudDogQW55RW50cnksIGNoaWxkOiBBbnlFbnRyeSkge1xuICAvLyBNdXN0IGhhdmUgY2FsbGVkIHJlbWVtYmVyQ2hpbGQoY2hpbGQpIGJlZm9yZSBjYWxsaW5nXG4gIC8vIHJlcG9ydENsZWFuQ2hpbGQocGFyZW50LCBjaGlsZCkuXG4gIGFzc2VydChwYXJlbnQuY2hpbGRWYWx1ZXMuaGFzKGNoaWxkKSk7XG4gIGFzc2VydCghIG1pZ2h0QmVEaXJ0eShjaGlsZCkpO1xuXG4gIGNvbnN0IGNoaWxkVmFsdWUgPSBwYXJlbnQuY2hpbGRWYWx1ZXMuZ2V0KGNoaWxkKSE7XG4gIGlmIChjaGlsZFZhbHVlLmxlbmd0aCA9PT0gMCkge1xuICAgIHBhcmVudC5jaGlsZFZhbHVlcy5zZXQoY2hpbGQsIHZhbHVlQ29weShjaGlsZC52YWx1ZSkpO1xuICB9IGVsc2UgaWYgKCEgdmFsdWVJcyhjaGlsZFZhbHVlLCBjaGlsZC52YWx1ZSkpIHtcbiAgICBwYXJlbnQuc2V0RGlydHkoKTtcbiAgfVxuXG4gIHJlbW92ZURpcnR5Q2hpbGQocGFyZW50LCBjaGlsZCk7XG5cbiAgaWYgKG1pZ2h0QmVEaXJ0eShwYXJlbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgcmVwb3J0Q2xlYW4ocGFyZW50KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRGlydHlDaGlsZChwYXJlbnQ6IEFueUVudHJ5LCBjaGlsZDogQW55RW50cnkpIHtcbiAgY29uc3QgZGMgPSBwYXJlbnQuZGlydHlDaGlsZHJlbjtcbiAgaWYgKGRjKSB7XG4gICAgZGMuZGVsZXRlKGNoaWxkKTtcbiAgICBpZiAoZGMuc2l6ZSA9PT0gMCkge1xuICAgICAgaWYgKGVtcHR5U2V0UG9vbC5sZW5ndGggPCBQT09MX1RBUkdFVF9TSVpFKSB7XG4gICAgICAgIGVtcHR5U2V0UG9vbC5wdXNoKGRjKTtcbiAgICAgIH1cbiAgICAgIHBhcmVudC5kaXJ0eUNoaWxkcmVuID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cblxuLy8gUmVtb3ZlcyBhbGwgY2hpbGRyZW4gZnJvbSB0aGlzIGVudHJ5IGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZVxuLy8gcmVtb3ZlZCBjaGlsZHJlbi5cbmZ1bmN0aW9uIGZvcmdldENoaWxkcmVuKHBhcmVudDogQW55RW50cnkpIHtcbiAgaWYgKHBhcmVudC5jaGlsZFZhbHVlcy5zaXplID4gMCkge1xuICAgIHBhcmVudC5jaGlsZFZhbHVlcy5mb3JFYWNoKChfdmFsdWUsIGNoaWxkKSA9PiB7XG4gICAgICBmb3JnZXRDaGlsZChwYXJlbnQsIGNoaWxkKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFJlbW92ZSB0aGlzIHBhcmVudCBFbnRyeSBmcm9tIGFueSBzZXRzIHRvIHdoaWNoIGl0IHdhcyBhZGRlZCBieSB0aGVcbiAgLy8gYWRkVG9TZXQgbWV0aG9kLlxuICBwYXJlbnQuZm9yZ2V0RGVwcygpO1xuXG4gIC8vIEFmdGVyIHdlIGZvcmdldCBhbGwgb3VyIGNoaWxkcmVuLCB0aGlzLmRpcnR5Q2hpbGRyZW4gbXVzdCBiZSBlbXB0eVxuICAvLyBhbmQgdGhlcmVmb3JlIG11c3QgaGF2ZSBiZWVuIHJlc2V0IHRvIG51bGwuXG4gIGFzc2VydChwYXJlbnQuZGlydHlDaGlsZHJlbiA9PT0gbnVsbCk7XG59XG5cbmZ1bmN0aW9uIGZvcmdldENoaWxkKHBhcmVudDogQW55RW50cnksIGNoaWxkOiBBbnlFbnRyeSkge1xuICBjaGlsZC5wYXJlbnRzLmRlbGV0ZShwYXJlbnQpO1xuICBwYXJlbnQuY2hpbGRWYWx1ZXMuZGVsZXRlKGNoaWxkKTtcbiAgcmVtb3ZlRGlydHlDaGlsZChwYXJlbnQsIGNoaWxkKTtcbn1cblxuZnVuY3Rpb24gbWF5YmVTdWJzY3JpYmUoZW50cnk6IEFueUVudHJ5LCBhcmdzOiBhbnlbXSkge1xuICBpZiAodHlwZW9mIGVudHJ5LnN1YnNjcmliZSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1heWJlVW5zdWJzY3JpYmUoZW50cnkpOyAvLyBQcmV2ZW50IGRvdWJsZSBzdWJzY3JpcHRpb25zLlxuICAgICAgZW50cnkudW5zdWJzY3JpYmUgPSBlbnRyeS5zdWJzY3JpYmUuYXBwbHkobnVsbCwgYXJncyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgdGhpcyBFbnRyeSBoYXMgYSBzdWJzY3JpYmUgZnVuY3Rpb24gYW5kIGl0IHRocmV3IGFuIGV4Y2VwdGlvblxuICAgICAgLy8gKG9yIGFuIHVuc3Vic2NyaWJlIGZ1bmN0aW9uIGl0IHByZXZpb3VzbHkgcmV0dXJuZWQgbm93IHRocm93cyksXG4gICAgICAvLyByZXR1cm4gZmFsc2UgdG8gaW5kaWNhdGUgdGhhdCB3ZSB3ZXJlIG5vdCBhYmxlIHRvIHN1YnNjcmliZSAob3JcbiAgICAgIC8vIHVuc3Vic2NyaWJlKSwgYW5kIHRoaXMgRW50cnkgc2hvdWxkIHJlbWFpbiBkaXJ0eS5cbiAgICAgIGVudHJ5LnNldERpcnR5KCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJuaW5nIHRydWUgaW5kaWNhdGVzIGVpdGhlciB0aGF0IHRoZXJlIHdhcyBubyBlbnRyeS5zdWJzY3JpYmVcbiAgLy8gZnVuY3Rpb24gb3IgdGhhdCBpdCBzdWNjZWVkZWQuXG4gIHJldHVybiB0cnVlO1xufVxuIl0sInhfZ29vZ2xlX2lnbm9yZUxpc3QiOlswXX0=