You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
42 KiB
202 lines
42 KiB
/*
|
|
THIS IS A GENERATED/BUNDLED FILE BY ROLLUP
|
|
if you want to view the source visit the plugins github repository
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
var obsidian = require('obsidian');
|
|
|
|
/*! *****************************************************************************
|
|
Copyright (c) Microsoft Corporation.
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
purpose with or without fee is hereby granted.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
PERFORMANCE OF THIS SOFTWARE.
|
|
***************************************************************************** */
|
|
|
|
function __awaiter(thisArg, _arguments, P, generator) {
|
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
}
|
|
|
|
function __classPrivateFieldGet(receiver, state, kind, f) {
|
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
}
|
|
|
|
function __classPrivateFieldSet(receiver, state, value, kind, f) {
|
|
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
}
|
|
|
|
const labeledRegex = /^[ \t]*(?:date:)(.+?)(?:^[ \t]*(?:title:)(.+?))?(?:^[ \t]*(?:content:)(.+?))?(?=^[ \t]*date:)/gimsu;
|
|
//it uses the EventFactory provided to parse the source into Events
|
|
const timelineLabeledHandler = (source, eventFactory) => {
|
|
source += "\ndate: ";
|
|
let sourceMatch;
|
|
while ((sourceMatch = labeledRegex.exec(source)) !== null) {
|
|
eventFactory.create(sourceMatch[1], sourceMatch[2], sourceMatch[3]);
|
|
}
|
|
};
|
|
const timelineHandler = (source, eventFactory) => {
|
|
//source to events
|
|
const sourceSplitted = source.split(/^\s*\+ ?/gm).slice(1);
|
|
//this is code is not readable
|
|
//sourceSplitted.push(...new Array(3 - (sourceSplitted.length % 3)).fill(""));
|
|
//adding 2 empty stings and 2 to sourceSplitted.length is safe and readble
|
|
sourceSplitted.push("", "");
|
|
const counter = sourceSplitted.length - (sourceSplitted.length % 3);
|
|
for (let i = 0; i < counter; i += 3) {
|
|
eventFactory.create(sourceSplitted[i], sourceSplitted[i + 1], sourceSplitted[i + 2]);
|
|
}
|
|
};
|
|
const toExport = [
|
|
{ tag: "timeline", handler: timelineHandler },
|
|
{ tag: "timeline-labeled", handler: timelineLabeledHandler },
|
|
];
|
|
|
|
var _EventFactory_root, _EventFactory_sourcePath, _EventFactory_eventCounter;
|
|
//remove first child's top margin and last child's bottom margin
|
|
const trim = (s) => {
|
|
if (s == null) {
|
|
s = "";
|
|
return;
|
|
}
|
|
s = s.trim();
|
|
if (s.length === 0)
|
|
s = "\u200B";
|
|
};
|
|
class EventFactory {
|
|
constructor(root, sourcePath) {
|
|
_EventFactory_root.set(this, void 0);
|
|
_EventFactory_sourcePath.set(this, void 0);
|
|
//#markdownRenderChild: MarkdownRenderChild;
|
|
_EventFactory_eventCounter.set(this, void 0);
|
|
this.create = (time, title, description) => {
|
|
trim(time);
|
|
trim(title);
|
|
trim(description);
|
|
let timeContainerEl = __classPrivateFieldGet(this, _EventFactory_root, "f").createDiv({ cls: "time-container" }), timeEl = timeContainerEl.createDiv({ cls: "time" }), infoEl = __classPrivateFieldGet(this, _EventFactory_root, "f").createDiv({ cls: "info" }), titleEl = infoEl.createDiv({ cls: "title" }), descriptionEl = infoEl.createDiv({ cls: "description" });
|
|
obsidian.MarkdownRenderer.renderMarkdown(time, timeEl, __classPrivateFieldGet(this, _EventFactory_sourcePath, "f"), null //this.#markdownRenderChild
|
|
);
|
|
obsidian.MarkdownRenderer.renderMarkdown(title, titleEl, __classPrivateFieldGet(this, _EventFactory_sourcePath, "f"), null //this.#markdownRenderChild
|
|
);
|
|
obsidian.MarkdownRenderer.renderMarkdown(description, descriptionEl, __classPrivateFieldGet(this, _EventFactory_sourcePath, "f"), null //this.#markdownRenderChild
|
|
);
|
|
// regulate(descriptionEl);
|
|
// regulate(timeEl);
|
|
// regulate(titleEl);
|
|
__classPrivateFieldSet(this, _EventFactory_eventCounter, +__classPrivateFieldGet(this, _EventFactory_eventCounter, "f") + 1, "f");
|
|
};
|
|
this.getEventCounter = () => __classPrivateFieldGet(this, _EventFactory_eventCounter, "f");
|
|
__classPrivateFieldSet(this, _EventFactory_root, root, "f");
|
|
__classPrivateFieldSet(this, _EventFactory_sourcePath, sourcePath, "f");
|
|
//this.#markdownRenderChild = new MarkdownRenderChild(root);
|
|
//this.markdownRenderChild.containerEl = root;
|
|
__classPrivateFieldSet(this, _EventFactory_eventCounter, 0, "f");
|
|
}
|
|
}
|
|
_EventFactory_root = new WeakMap(), _EventFactory_sourcePath = new WeakMap(), _EventFactory_eventCounter = new WeakMap();
|
|
|
|
const classRegex = /(?<=^\s*)\[.+?\]/gs;
|
|
const stringToClassArray = (input) => {
|
|
input = input.trim();
|
|
if (input[0] != "[" || input[input.length - 1] != "]")
|
|
return [];
|
|
return input
|
|
.substring(1, input.length - 1)
|
|
.trim()
|
|
.split(/\s*,\s*/);
|
|
};
|
|
class MyPlugin extends obsidian.Plugin {
|
|
constructor() {
|
|
// addLinksToCache(
|
|
// links: NodeListOf<HTMLAnchorElement>,
|
|
// sourcePath: string
|
|
// ): void {
|
|
// /* //@ts-expect-error
|
|
// this.app.metadataCache.resolveLinks(sourcePath); */
|
|
// for (let i = 0; i < links.length; i++) {
|
|
// const a = links[i];
|
|
// if (a.dataset.href) {
|
|
// let file = this.app.metadataCache.getFirstLinkpathDest(
|
|
// a.dataset.href,
|
|
// ""
|
|
// );
|
|
// let cache, path;
|
|
// if (file && file instanceof TFile) {
|
|
// cache = this.app.metadataCache.resolvedLinks;
|
|
// path = file.path;
|
|
// } else {
|
|
// cache = this.app.metadataCache.unresolvedLinks;
|
|
// path = a.dataset.href;
|
|
// }
|
|
// if (!cache[sourcePath]) {
|
|
// cache[sourcePath] = {
|
|
// [path]: 0,
|
|
// };
|
|
// }
|
|
// let resolved = cache[sourcePath];
|
|
// if (!resolved[path]) {
|
|
// resolved[path] = 0;
|
|
// }
|
|
// resolved[path] += 1;
|
|
// cache[sourcePath] = resolved;
|
|
// }
|
|
// }
|
|
// }
|
|
super(...arguments);
|
|
this.onload = () => __awaiter(this, void 0, void 0, function* () {
|
|
toExport.forEach(({ tag, handler }) => {
|
|
this.registerMarkdownCodeBlockProcessor(tag, (source, el, ctx) => {
|
|
let mainLine = el.createDiv({
|
|
cls: "main-line",
|
|
});
|
|
el.addClass("timeline");
|
|
let classMatch = source.match(classRegex);
|
|
if (classMatch !== null) {
|
|
let classes = stringToClassArray(classMatch[0]);
|
|
el.addClasses(classes);
|
|
}
|
|
let eventFactory = new EventFactory(el, ctx.sourcePath);
|
|
handler(source, eventFactory);
|
|
mainLine.style.gridRowEnd = `${eventFactory.getEventCounter() + 1}`;
|
|
// const links = el.querySelectorAll<HTMLAnchorElement>("a.internal-link");
|
|
// this.addLinksToCache(links, ctx.sourcePath);
|
|
});
|
|
// this.registerEvent(
|
|
// this.app.metadataCache.on("resolve", (file) => {
|
|
// if (this.app.workspace.getActiveFile() != file) return;
|
|
// const view = this.app.workspace.getActiveViewOfType(MarkdownView);
|
|
// if (!view || !(view instanceof MarkdownView)) return;
|
|
// const admonitionLinks =
|
|
// view.contentEl.querySelectorAll<HTMLAnchorElement>(
|
|
// "a.internal-link"
|
|
// );
|
|
// this.addLinksToCache(admonitionLinks, file.path);
|
|
// })
|
|
// );
|
|
});
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = MyPlugin;
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9jb2RlQmxvY2tIYW5kbGVyLnRzIiwic3JjL0V2ZW50RmFjdG9yeS50cyIsIm1haW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyohICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXHJcbkNvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLlxyXG5cclxuUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55XHJcbnB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC5cclxuXHJcblRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEhcclxuUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZXHJcbkFORCBGSVRORVNTLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIERJUkVDVCxcclxuSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NXHJcbkxPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SXHJcbk9USEVSIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1JcclxuUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS5cclxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi9cclxuLyogZ2xvYmFsIFJlZmxlY3QsIFByb21pc2UgKi9cclxuXHJcbnZhciBleHRlbmRTdGF0aWNzID0gZnVuY3Rpb24oZCwgYikge1xyXG4gICAgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fFxyXG4gICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHxcclxuICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYiwgcCkpIGRbcF0gPSBiW3BdOyB9O1xyXG4gICAgcmV0dXJuIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19leHRlbmRzKGQsIGIpIHtcclxuICAgIGlmICh0eXBlb2YgYiAhPT0gXCJmdW5jdGlvblwiICYmIGIgIT09IG51bGwpXHJcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNsYXNzIGV4dGVuZHMgdmFsdWUgXCIgKyBTdHJpbmcoYikgKyBcIiBpcyBub3QgYSBjb25zdHJ1Y3RvciBvciBudWxsXCIpO1xyXG4gICAgZXh0ZW5kU3RhdGljcyhkLCBiKTtcclxuICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfVxyXG4gICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpO1xyXG59XHJcblxyXG5leHBvcnQgdmFyIF9fYXNzaWduID0gZnVuY3Rpb24oKSB7XHJcbiAgICBfX2Fzc2lnbiA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gX19hc3NpZ24odCkge1xyXG4gICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykge1xyXG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xyXG4gICAgICAgICAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkpIHRbcF0gPSBzW3BdO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdDtcclxuICAgIH1cclxuICAgIHJldHVybiBfX2Fzc2lnbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19yZXN0KHMsIGUpIHtcclxuICAgIHZhciB0ID0ge307XHJcbiAgICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMClcclxuICAgICAgICB0W3BdID0gc1twXTtcclxuICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIilcclxuICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSlcclxuICAgICAgICAgICAgICAgIHRbcFtpXV0gPSBzW3BbaV1dO1xyXG4gICAgICAgIH1cclxuICAgIHJldHVybiB0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xyXG4gICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gXCJmdW5jdGlvblwiKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7XHJcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xyXG4gICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcGFyYW0ocGFyYW1JbmRleCwgZGVjb3JhdG9yKSB7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcclxuICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gUmVmbGVjdC5tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0ZXIodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XHJcbiAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH1cclxuICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xyXG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cclxuICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfVxyXG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcclxuICAgIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19nZW5lcmF0b3IodGhpc0FyZywgYm9keSkge1xyXG4gICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZztcclxuICAgIHJldHVybiBnID0geyBuZXh0OiB2ZXJiKDApLCBcInRocm93XCI6IHZlcmIoMSksIFwicmV0dXJuXCI6IHZlcmIoMikgfSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChfKSB0cnkge1xyXG4gICAgICAgICAgICBpZiAoZiA9IDEsIHkgJiYgKHQgPSBvcFswXSAmIDIgPyB5W1wicmV0dXJuXCJdIDogb3BbMF0gPyB5W1widGhyb3dcIl0gfHwgKCh0ID0geVtcInJldHVyblwiXSkgJiYgdC5jYWxsKHkpLCAwKSA6IHkubmV4dCkgJiYgISh0ID0gdC5jYWxsKHksIG9wWzFdKSkuZG9uZSkgcmV0dXJuIHQ7XHJcbiAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbb3BbMF0gJiAyLCB0LnZhbHVlXTtcclxuICAgICAgICAgICAgc3dpdGNoIChvcFswXSkge1xyXG4gICAgICAgICAgICAgICAgY2FzZSAwOiBjYXNlIDE6IHQgPSBvcDsgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDQ6IF8ubGFiZWwrKzsgcmV0dXJuIHsgdmFsdWU6IG9wWzFdLCBkb25lOiBmYWxzZSB9O1xyXG4gICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgY2FzZSA3OiBvcCA9IF8ub3BzLnBvcCgpOyBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDMgJiYgKCF0IHx8IChvcFsxXSA+IHRbMF0gJiYgb3BbMV0gPCB0WzNdKSkpIHsgXy5sYWJlbCA9IG9wWzFdOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gNiAmJiBfLmxhYmVsIDwgdFsxXSkgeyBfLmxhYmVsID0gdFsxXTsgdCA9IG9wOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH1cclxuICAgICAgICAgICAgICAgICAgICBpZiAodFsyXSkgXy5vcHMucG9wKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgXy50cnlzLnBvcCgpOyBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBvcCA9IGJvZHkuY2FsbCh0aGlzQXJnLCBfKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7IG9wID0gWzYsIGVdOyB5ID0gMDsgfSBmaW5hbGx5IHsgZiA9IHQgPSAwOyB9XHJcbiAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCB2YXIgX19jcmVhdGVCaW5kaW5nID0gT2JqZWN0LmNyZWF0ZSA/IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xyXG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9KTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKHIpIHsgci52YWx1ZSBpbnN0YW5jZW9mIF9fYXdhaXQgPyBQcm9taXNlLnJlc29sdmUoci52YWx1ZS52KS50aGVuKGZ1bGZpbGwsIHJlamVjdCkgOiBzZXR0bGUocVswXVsyXSwgcik7IH1cclxuICAgIGZ1bmN0aW9uIGZ1bGZpbGwodmFsdWUpIHsgcmVzdW1lKFwibmV4dFwiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHJlamVjdCh2YWx1ZSkgeyByZXN1bWUoXCJ0aHJvd1wiLCB2YWx1ZSk7IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShmLCB2KSB7IGlmIChmKHYpLCBxLnNoaWZ0KCksIHEubGVuZ3RoKSByZXN1bWUocVswXVswXSwgcVswXVsxXSk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXN5bmNEZWxlZ2F0b3Iobykge1xyXG4gICAgdmFyIGksIHA7XHJcbiAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKFwibmV4dFwiKSwgdmVyYihcInRocm93XCIsIGZ1bmN0aW9uIChlKSB7IHRocm93IGU7IH0pLCB2ZXJiKFwicmV0dXJuXCIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuLCBmKSB7IGlbbl0gPSBvW25dID8gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIChwID0gIXApID8geyB2YWx1ZTogX19hd2FpdChvW25dKHYpKSwgZG9uZTogbiA9PT0gXCJyZXR1cm5cIiB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG4iLCJpbXBvcnQgeyBNYXJrZG93blBvc3RQcm9jZXNzb3JDb250ZXh0LCBNYXJrZG93blJlbmRlcmVyIH0gZnJvbSBcIm9ic2lkaWFuXCI7XHJcblxyXG5pbXBvcnQgRXZlbnRGYWN0b3J5IGZyb20gXCIuL0V2ZW50RmFjdG9yeVwiO1xyXG5cclxuY29uc3QgbGFiZWxlZFJlZ2V4ID1cclxuXHQvXlsgXFx0XSooPzpkYXRlOikoLis/KSg/Ol5bIFxcdF0qKD86dGl0bGU6KSguKz8pKT8oPzpeWyBcXHRdKig/OmNvbnRlbnQ6KSguKz8pKT8oPz1eWyBcXHRdKmRhdGU6KS9naW1zdTtcclxuXHJcbi8vaXQgdXNlcyB0aGUgRXZlbnRGYWN0b3J5IHByb3ZpZGVkIHRvIHBhcnNlIHRoZSBzb3VyY2UgaW50byBFdmVudHNcclxuY29uc3QgdGltZWxpbmVMYWJlbGVkSGFuZGxlciA9IChzb3VyY2U6IHN0cmluZywgZXZlbnRGYWN0b3J5OiBFdmVudEZhY3RvcnkpID0+IHtcclxuXHRzb3VyY2UgKz0gXCJcXG5kYXRlOiBcIjtcclxuXHJcblx0bGV0IHNvdXJjZU1hdGNoO1xyXG5cclxuXHR3aGlsZSAoKHNvdXJjZU1hdGNoID0gbGFiZWxlZFJlZ2V4LmV4ZWMoc291cmNlKSkgIT09IG51bGwpIHtcclxuXHRcdGV2ZW50RmFjdG9yeS5jcmVhdGUoc291cmNlTWF0Y2hbMV0sIHNvdXJjZU1hdGNoWzJdLCBzb3VyY2VNYXRjaFszXSk7XHJcblx0fVxyXG59O1xyXG5cclxuY29uc3QgdGltZWxpbmVIYW5kbGVyID0gKHNvdXJjZTogc3RyaW5nLCBldmVudEZhY3Rvcnk6IEV2ZW50RmFjdG9yeSkgPT4ge1xyXG5cdC8vc291cmNlIHRvIGV2ZW50c1xyXG5cdGNvbnN0IHNvdXJjZVNwbGl0dGVkID0gc291cmNlLnNwbGl0KC9eXFxzKlxcKyA/L2dtKS5zbGljZSgxKTtcclxuXHJcblx0Ly90aGlzIGlzIGNvZGUgaXMgbm90IHJlYWRhYmxlXHJcblx0Ly9zb3VyY2VTcGxpdHRlZC5wdXNoKC4uLm5ldyBBcnJheSgzIC0gKHNvdXJjZVNwbGl0dGVkLmxlbmd0aCAlIDMpKS5maWxsKFwiXCIpKTtcclxuXHJcblx0Ly9hZGRpbmcgMiBlbXB0eSBzdGluZ3MgYW5kIDIgdG8gc291cmNlU3BsaXR0ZWQubGVuZ3RoIGlzIHNhZmUgYW5kIHJlYWRibGVcclxuXHRzb3VyY2VTcGxpdHRlZC5wdXNoKFwiXCIsIFwiXCIpO1xyXG5cclxuXHRjb25zdCBjb3VudGVyID0gc291cmNlU3BsaXR0ZWQubGVuZ3RoIC0gKHNvdXJjZVNwbGl0dGVkLmxlbmd0aCAlIDMpO1xyXG5cclxuXHRmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50ZXI7IGkgKz0gMykge1xyXG5cdFx0ZXZlbnRGYWN0b3J5LmNyZWF0ZShcclxuXHRcdFx0c291cmNlU3BsaXR0ZWRbaV0sXHJcblx0XHRcdHNvdXJjZVNwbGl0dGVkW2kgKyAxXSxcclxuXHRcdFx0c291cmNlU3BsaXR0ZWRbaSArIDJdXHJcblx0XHQpO1xyXG5cdH1cclxufTtcclxuXHJcbmNvbnN0IHRvRXhwb3J0ID0gW1xyXG5cdHsgdGFnOiBcInRpbWVsaW5lXCIsIGhhbmRsZXI6IHRpbWVsaW5lSGFuZGxlciB9LFxyXG5cdHsgdGFnOiBcInRpbWVsaW5lLWxhYmVsZWRcIiwgaGFuZGxlcjogdGltZWxpbmVMYWJlbGVkSGFuZGxlciB9LFxyXG5dO1xyXG5cclxuZXhwb3J0IGRlZmF1bHQgdG9FeHBvcnQ7XHJcbiIsImltcG9ydCB7IE1hcmtkb3duUmVuZGVyZXIsIE1hcmtkb3duUmVuZGVyQ2hpbGQgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuXHJcbi8vcmVtb3ZlIGZpcnN0IGNoaWxkJ3MgdG9wIG1hcmdpbiBhbmQgbGFzdCBjaGlsZCdzIGJvdHRvbSBtYXJnaW5cclxuXHJcbmNvbnN0IHRyaW0gPSAoczogc3RyaW5nKSA9PiB7XHJcblx0aWYgKHMgPT0gbnVsbCkge1xyXG5cdFx0cyA9IFwiXCI7XHJcblx0XHRyZXR1cm47XHJcblx0fVxyXG5cdHMgPSBzLnRyaW0oKTtcclxuXHRpZiAocy5sZW5ndGggPT09IDApIHMgPSBcIlxcdTIwMEJcIjtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEV2ZW50RmFjdG9yeSB7XHJcblx0I3Jvb3Q6IEhUTUxFbGVtZW50O1xyXG5cdCNzb3VyY2VQYXRoOiBzdHJpbmc7XHJcblx0Ly8jbWFya2Rvd25SZW5kZXJDaGlsZDogTWFya2Rvd25SZW5kZXJDaGlsZDtcclxuXHQjZXZlbnRDb3VudGVyOiBudW1iZXI7XHJcblxyXG5cdGNvbnN0cnVjdG9yKHJvb3Q6IEhUTUxFbGVtZW50LCBzb3VyY2VQYXRoOiBzdHJpbmcpIHtcclxuXHRcdHRoaXMuI3Jvb3QgPSByb290O1xyXG5cdFx0dGhpcy4jc291cmNlUGF0aCA9IHNvdXJjZVBhdGg7XHJcblx0XHQvL3RoaXMuI21hcmtkb3duUmVuZGVyQ2hpbGQgPSBuZXcgTWFya2Rvd25SZW5kZXJDaGlsZChyb290KTtcclxuXHRcdC8vdGhpcy5tYXJrZG93blJlbmRlckNoaWxkLmNvbnRhaW5lckVsID0gcm9vdDtcclxuXHRcdHRoaXMuI2V2ZW50Q291bnRlciA9IDA7XHJcblx0fVxyXG5cclxuXHRjcmVhdGUgPSAodGltZTogc3RyaW5nLCB0aXRsZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nKSA9PiB7XHJcblx0XHR0cmltKHRpbWUpO1xyXG5cdFx0dHJpbSh0aXRsZSk7XHJcblx0XHR0cmltKGRlc2NyaXB0aW9uKTtcclxuXHJcblx0XHRsZXQgdGltZUNvbnRhaW5lckVsID0gdGhpcy4jcm9vdC5jcmVhdGVEaXYoeyBjbHM6IFwidGltZS1jb250YWluZXJcIiB9KSxcclxuXHRcdFx0dGltZUVsID0gdGltZUNvbnRhaW5lckVsLmNyZWF0ZURpdih7IGNsczogXCJ0aW1lXCIgfSksXHJcblx0XHRcdGluZm9FbCA9IHRoaXMuI3Jvb3QuY3JlYXRlRGl2KHsgY2xzOiBcImluZm9cIiB9KSxcclxuXHRcdFx0dGl0bGVFbCA9IGluZm9FbC5jcmVhdGVEaXYoeyBjbHM6IFwidGl0bGVcIiB9KSxcclxuXHRcdFx0ZGVzY3JpcHRpb25FbCA9IGluZm9FbC5jcmVhdGVEaXYoeyBjbHM6IFwiZGVzY3JpcHRpb25cIiB9KTtcclxuXHJcblx0XHRNYXJrZG93blJlbmRlcmVyLnJlbmRlck1hcmtkb3duKFxyXG5cdFx0XHR0aW1lLFxyXG5cdFx0XHR0aW1lRWwsXHJcblx0XHRcdHRoaXMuI3NvdXJjZVBhdGgsXHJcblx0XHRcdG51bGwgLy90aGlzLiNtYXJrZG93blJlbmRlckNoaWxkXHJcblx0XHQpO1xyXG5cdFx0TWFya2Rvd25SZW5kZXJlci5yZW5kZXJNYXJrZG93bihcclxuXHRcdFx0dGl0bGUsXHJcblx0XHRcdHRpdGxlRWwsXHJcblx0XHRcdHRoaXMuI3NvdXJjZVBhdGgsXHJcblx0XHRcdG51bGwgLy90aGlzLiNtYXJrZG93blJlbmRlckNoaWxkXHJcblx0XHQpO1xyXG5cdFx0TWFya2Rvd25SZW5kZXJlci5yZW5kZXJNYXJrZG93bihcclxuXHRcdFx0ZGVzY3JpcHRpb24sXHJcblx0XHRcdGRlc2NyaXB0aW9uRWwsXHJcblx0XHRcdHRoaXMuI3NvdXJjZVBhdGgsXHJcblx0XHRcdG51bGwgLy90aGlzLiNtYXJrZG93blJlbmRlckNoaWxkXHJcblx0XHQpO1xyXG5cclxuXHRcdC8vIHJlZ3VsYXRlKGRlc2NyaXB0aW9uRWwpO1xyXG5cdFx0Ly8gcmVndWxhdGUodGltZUVsKTtcclxuXHRcdC8vIHJlZ3VsYXRlKHRpdGxlRWwpO1xyXG5cclxuXHRcdCsrdGhpcy4jZXZlbnRDb3VudGVyO1xyXG5cdH07XHJcblxyXG5cdGdldEV2ZW50Q291bnRlciA9ICgpID0+IHRoaXMuI2V2ZW50Q291bnRlcjtcclxufVxyXG4iLCJpbXBvcnQgeyBQbHVnaW4sIE1hcmtkb3duVmlldywgVEZpbGUgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuXHJcbmltcG9ydCB0aW1lbGluZUhhbmRsZXJzIGZyb20gXCIuL3NyYy9jb2RlQmxvY2tIYW5kbGVyXCI7XHJcbmltcG9ydCBFdmVudEZhY3RvcnkgZnJvbSBcIi4vc3JjL0V2ZW50RmFjdG9yeVwiO1xyXG5cclxuY29uc3QgY2xhc3NSZWdleCA9IC8oPzw9XlxccyopXFxbLis/XFxdL2dzO1xyXG5cclxuY29uc3Qgc3RyaW5nVG9DbGFzc0FycmF5ID0gKGlucHV0OiBzdHJpbmcpOiBzdHJpbmdbXSA9PiB7XHJcblx0aW5wdXQgPSBpbnB1dC50cmltKCk7XHJcblx0aWYgKGlucHV0WzBdICE9IFwiW1wiIHx8IGlucHV0W2lucHV0Lmxlbmd0aCAtIDFdICE9IFwiXVwiKSByZXR1cm4gW107XHJcblxyXG5cdHJldHVybiBpbnB1dFxyXG5cdFx0LnN1YnN0cmluZygxLCBpbnB1dC5sZW5ndGggLSAxKVxyXG5cdFx0LnRyaW0oKVxyXG5cdFx0LnNwbGl0KC9cXHMqLFxccyovKTtcclxufTtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE15UGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHQvLyBhZGRMaW5rc1RvQ2FjaGUoXHJcblx0Ly8gXHRsaW5rczogTm9kZUxpc3RPZjxIVE1MQW5jaG9yRWxlbWVudD4sXHJcblx0Ly8gXHRzb3VyY2VQYXRoOiBzdHJpbmdcclxuXHQvLyApOiB2b2lkIHtcclxuXHQvLyBcdC8qIC8vQHRzLWV4cGVjdC1lcnJvclxyXG5cdC8vICAgICB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLnJlc29sdmVMaW5rcyhzb3VyY2VQYXRoKTsgKi9cclxuXHQvLyBcdGZvciAobGV0IGkgPSAwOyBpIDwgbGlua3MubGVuZ3RoOyBpKyspIHtcclxuXHQvLyBcdFx0Y29uc3QgYSA9IGxpbmtzW2ldO1xyXG5cdC8vIFx0XHRpZiAoYS5kYXRhc2V0LmhyZWYpIHtcclxuXHQvLyBcdFx0XHRsZXQgZmlsZSA9IHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUuZ2V0Rmlyc3RMaW5rcGF0aERlc3QoXHJcblx0Ly8gXHRcdFx0XHRhLmRhdGFzZXQuaHJlZixcclxuXHQvLyBcdFx0XHRcdFwiXCJcclxuXHQvLyBcdFx0XHQpO1xyXG5cdC8vIFx0XHRcdGxldCBjYWNoZSwgcGF0aDtcclxuXHQvLyBcdFx0XHRpZiAoZmlsZSAmJiBmaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcclxuXHQvLyBcdFx0XHRcdGNhY2hlID0gdGhpcy5hcHAubWV0YWRhdGFDYWNoZS5yZXNvbHZlZExpbmtzO1xyXG5cdC8vIFx0XHRcdFx0cGF0aCA9IGZpbGUucGF0aDtcclxuXHQvLyBcdFx0XHR9IGVsc2Uge1xyXG5cdC8vIFx0XHRcdFx0Y2FjaGUgPSB0aGlzLmFwcC5tZXRhZGF0YUNhY2hlLnVucmVzb2x2ZWRMaW5rcztcclxuXHQvLyBcdFx0XHRcdHBhdGggPSBhLmRhdGFzZXQuaHJlZjtcclxuXHQvLyBcdFx0XHR9XHJcblx0Ly8gXHRcdFx0aWYgKCFjYWNoZVtzb3VyY2VQYXRoXSkge1xyXG5cdC8vIFx0XHRcdFx0Y2FjaGVbc291cmNlUGF0aF0gPSB7XHJcblx0Ly8gXHRcdFx0XHRcdFtwYXRoXTogMCxcclxuXHQvLyBcdFx0XHRcdH07XHJcblx0Ly8gXHRcdFx0fVxyXG5cdC8vIFx0XHRcdGxldCByZXNvbHZlZCA9IGNhY2hlW3NvdXJjZVBhdGhdO1xyXG5cdC8vIFx0XHRcdGlmICghcmVzb2x2ZWRbcGF0aF0pIHtcclxuXHQvLyBcdFx0XHRcdHJlc29sdmVkW3BhdGhdID0gMDtcclxuXHQvLyBcdFx0XHR9XHJcblx0Ly8gXHRcdFx0cmVzb2x2ZWRbcGF0aF0gKz0gMTtcclxuXHQvLyBcdFx0XHRjYWNoZVtzb3VyY2VQYXRoXSA9IHJlc29sdmVkO1xyXG5cdC8vIFx0XHR9XHJcblx0Ly8gXHR9XHJcblx0Ly8gfVxyXG5cclxuXHRvbmxvYWQgPSBhc3luYyAoKSA9PiB7XHJcblx0XHR0aW1lbGluZUhhbmRsZXJzLmZvckVhY2goKHsgdGFnLCBoYW5kbGVyIH0pID0+IHtcclxuXHRcdFx0dGhpcy5yZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yKHRhZywgKHNvdXJjZSwgZWwsIGN0eCkgPT4ge1xyXG5cdFx0XHRcdGxldCBtYWluTGluZSA9IGVsLmNyZWF0ZURpdih7XHJcblx0XHRcdFx0XHRjbHM6IFwibWFpbi1saW5lXCIsXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdFx0ZWwuYWRkQ2xhc3MoXCJ0aW1lbGluZVwiKTtcclxuXHRcdFx0XHRsZXQgY2xhc3NNYXRjaCA9IHNvdXJjZS5tYXRjaChjbGFzc1JlZ2V4KTtcclxuXHRcdFx0XHRpZiAoY2xhc3NNYXRjaCAhPT0gbnVsbCkge1xyXG5cdFx0XHRcdFx0bGV0IGNsYXNzZXMgPSBzdHJpbmdUb0NsYXNzQXJyYXkoY2xhc3NNYXRjaFswXSk7XHJcblx0XHRcdFx0XHRlbC5hZGRDbGFzc2VzKGNsYXNzZXMpO1xyXG5cdFx0XHRcdH1cclxuXHJcblx0XHRcdFx0bGV0IGV2ZW50RmFjdG9yeSA9IG5ldyBFdmVudEZhY3RvcnkoZWwsIGN0eC5zb3VyY2VQYXRoKTtcclxuXHRcdFx0XHRoYW5kbGVyKHNvdXJjZSwgZXZlbnRGYWN0b3J5KTtcclxuXHRcdFx0XHRtYWluTGluZS5zdHlsZS5ncmlkUm93RW5kID0gYCR7ZXZlbnRGYWN0b3J5LmdldEV2ZW50Q291bnRlcigpICsgMX1gO1xyXG5cclxuXHRcdFx0XHQvLyBjb25zdCBsaW5rcyA9IGVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEFuY2hvckVsZW1lbnQ+KFwiYS5pbnRlcm5hbC1saW5rXCIpO1xyXG5cdFx0XHRcdC8vIHRoaXMuYWRkTGlua3NUb0NhY2hlKGxpbmtzLCBjdHguc291cmNlUGF0aCk7XHJcblx0XHRcdH0pO1xyXG5cclxuXHRcdFx0Ly8gdGhpcy5yZWdpc3RlckV2ZW50KFxyXG5cdFx0XHQvLyBcdHRoaXMuYXBwLm1ldGFkYXRhQ2FjaGUub24oXCJyZXNvbHZlXCIsIChmaWxlKSA9PiB7XHJcblx0XHRcdC8vIFx0XHRpZiAodGhpcy5hcHAud29ya3NwYWNlLmdldEFjdGl2ZUZpbGUoKSAhPSBmaWxlKSByZXR1cm47XHJcblxyXG5cdFx0XHQvLyBcdFx0Y29uc3QgdmlldyA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XHJcblxyXG5cdFx0XHQvLyBcdFx0aWYgKCF2aWV3IHx8ICEodmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHJldHVybjtcclxuXHJcblx0XHRcdC8vIFx0XHRjb25zdCBhZG1vbml0aW9uTGlua3MgPVxyXG5cdFx0XHQvLyBcdFx0XHR2aWV3LmNvbnRlbnRFbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxBbmNob3JFbGVtZW50PihcclxuXHRcdFx0Ly8gXHRcdFx0XHRcImEuaW50ZXJuYWwtbGlua1wiXHJcblx0XHRcdC8vIFx0XHRcdCk7XHJcblxyXG5cdFx0XHQvLyBcdFx0dGhpcy5hZGRMaW5rc1RvQ2FjaGUoYWRtb25pdGlvbkxpbmtzLCBmaWxlLnBhdGgpO1xyXG5cdFx0XHQvLyBcdH0pXHJcblx0XHRcdC8vICk7XHJcblx0XHR9KTtcclxuXHR9O1xyXG59XHJcbiJdLCJuYW1lcyI6WyJNYXJrZG93blJlbmRlcmVyIiwiUGx1Z2luIiwidGltZWxpbmVIYW5kbGVycyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQXVEQTtBQUNPLFNBQVMsU0FBUyxDQUFDLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRTtBQUM3RCxJQUFJLFNBQVMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sS0FBSyxZQUFZLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRTtBQUNoSCxJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sQ0FBQyxFQUFFLFVBQVUsT0FBTyxFQUFFLE1BQU0sRUFBRTtBQUMvRCxRQUFRLFNBQVMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFF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
|