/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ var __create = Object.create; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __getProtoOf = Object.getPrototypeOf; var __hasOwnProp = Object.prototype.hasOwnProperty; var __markAsModule = (target) => __defProp(target, "__esModule", { value: true }); var __export = (target, all) => { __markAsModule(target); for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __reExport = (target, module2, desc) => { if (module2 && typeof module2 === "object" || typeof module2 === "function") { for (let key of __getOwnPropNames(module2)) if (!__hasOwnProp.call(target, key) && key !== "default") __defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable }); } return target; }; var __toModule = (module2) => { return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2); }; var __async = (__this, __arguments, generator) => { return new Promise((resolve, reject) => { var fulfilled = (value) => { try { step(generator.next(value)); } catch (e) { reject(e); } }; var rejected = (value) => { try { step(generator.throw(value)); } catch (e) { reject(e); } }; var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected); step((generator = generator.apply(__this, __arguments)).next()); }); }; // src/main.ts __export(exports, { default: () => SimpleTimeTrackerPlugin }); var import_obsidian3 = __toModule(require("obsidian")); // src/settings.ts var defaultSettings = {}; // src/settings-tab.ts var import_obsidian = __toModule(require("obsidian")); var SimpleTimeTrackerSettingsTab = class extends import_obsidian.PluginSettingTab { constructor(app, plugin) { super(app, plugin); this.plugin = plugin; } display() { this.containerEl.empty(); this.containerEl.createEl("h2", { text: "Simple Time Tracker Settings" }); this.containerEl.createEl("hr"); this.containerEl.createEl("p", { text: "If you like this plugin and want to support its development, you can do so through my website by clicking this fancy image!" }); this.containerEl.createEl("a", { href: "https://ellpeck.de/support" }).createEl("img", { attr: { src: "https://ellpeck.de/res/generalsupport.png" }, cls: "simple-time-tracker-support" }); } }; // src/tracker.ts var import_obsidian2 = __toModule(require("obsidian")); function startEntry(tracker, name) { if (!name) name = `Segment ${tracker.entries.length + 1}`; let entry = { name, startTime: (0, import_obsidian2.moment)().unix(), endTime: null }; tracker.entries.push(entry); } function endEntry(tracker) { let last = tracker.entries.last(); last.endTime = (0, import_obsidian2.moment)().unix(); } function isRunning(tracker) { let last = tracker.entries.last(); return last != null && !last.endTime; } function saveTracker(tracker, app, section) { return __async(this, null, function* () { let file = app.workspace.getActiveFile(); let content = yield app.vault.cachedRead(file); let lines = content.split("\n"); let prev = lines.filter((_, i) => i <= section.lineStart).join("\n"); let next = lines.filter((_, i) => i >= section.lineEnd).join("\n"); content = `${prev} ${JSON.stringify(tracker)} ${next}`; yield app.vault.modify(file, content); }); } function loadTracker(json) { if (json) { try { return JSON.parse(json); } catch (e) { console.log(`Failed to parse Tracker from ${json}`); } } return { entries: [] }; } function displayTracker(tracker, element, getSectionInfo) { let running = isRunning(tracker); let btn = new import_obsidian2.ButtonComponent(element).setButtonText(running ? "End" : "Start").onClick(() => __async(this, null, function* () { if (running) { endEntry(tracker); } else { startEntry(tracker, name.getValue()); } yield saveTracker(tracker, this.app, getSectionInfo()); })); btn.buttonEl.addClass("simple-time-tracker-btn"); let name = new import_obsidian2.TextComponent(element).setPlaceholder("Segment name").setDisabled(running); name.inputEl.addClass("simple-time-tracker-txt"); let timer = element.createDiv({ cls: "simple-time-tracker-timers" }); let currentDiv = timer.createEl("div", { cls: "simple-time-tracker-timer" }); let current = currentDiv.createEl("span", { cls: "simple-time-tracker-timer-time" }); currentDiv.createEl("span", { text: "Current" }); let totalDiv = timer.createEl("div", { cls: "simple-time-tracker-timer" }); let total = totalDiv.createEl("span", { cls: "simple-time-tracker-timer-time" }); totalDiv.createEl("span", { text: "Total" }); let table = element.createEl("table", { cls: "simple-time-tracker-table" }); table.createEl("tr").append(createEl("th", { text: "Segment" }), createEl("th", { text: "Start time" }), createEl("th", { text: "End time" }), createEl("th", { text: "Total" })); for (let entry of tracker.entries) { let row = table.createEl("tr"); row.createEl("td", { text: entry.name }); row.createEl("td", { text: import_obsidian2.moment.unix(entry.startTime).format("YY-MM-DD hh:mm:ss") }); if (entry.endTime) { row.createEl("td", { text: import_obsidian2.moment.unix(entry.endTime).format("YY-MM-DD hh:mm:ss") }); let duration = import_obsidian2.moment.unix(entry.endTime).diff(import_obsidian2.moment.unix(entry.startTime)); row.createEl("td", { text: getCountdownDisplay(import_obsidian2.moment.duration(duration)) }); } } setCountdownValues(tracker, current, total, currentDiv); let intervalId = window.setInterval(() => { if (!element.isConnected) { window.clearInterval(intervalId); return; } setCountdownValues(tracker, current, total, currentDiv); }, 1e3); } function getCountdownDisplay(duration) { let ret = ""; if (duration.hours() > 0) ret += duration.hours() + "h "; if (duration.minutes() > 0) ret += duration.minutes() + "m "; ret += duration.seconds() + "s"; return ret; } function setCountdownValues(tracker, current, total, currentDiv) { let currEntry = tracker.entries.last(); if (currEntry) { let currDuration = (0, import_obsidian2.moment)().diff(import_obsidian2.moment.unix(currEntry.startTime)); if (!currEntry.endTime) current.setText(getCountdownDisplay(import_obsidian2.moment.duration(currDuration))); let totalDuration = 0; for (let entry of tracker.entries) { if (entry == currEntry && !currEntry.endTime) { totalDuration += currDuration; } else { totalDuration += import_obsidian2.moment.unix(entry.endTime).diff(import_obsidian2.moment.unix(entry.startTime)); } } total.setText(getCountdownDisplay(import_obsidian2.moment.duration(totalDuration))); } currentDiv.hidden = !currEntry || !!currEntry.endTime; } // src/main.ts var SimpleTimeTrackerPlugin = class extends import_obsidian3.Plugin { onload() { return __async(this, null, function* () { yield this.loadSettings(); this.addSettingTab(new SimpleTimeTrackerSettingsTab(this.app, this)); this.registerMarkdownCodeBlockProcessor("simple-time-tracker", (s, e, i) => { let tracker = loadTracker(s); e.empty(); displayTracker(tracker, e, () => i.getSectionInfo(e)); }); }); } loadSettings() { return __async(this, null, function* () { this.settings = Object.assign({}, defaultSettings, yield this.loadData()); }); } saveSettings() { return __async(this, null, function* () { yield this.saveData(this.settings); }); } }; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL21haW4udHMiLCAic3JjL3NldHRpbmdzLnRzIiwgInNyYy9zZXR0aW5ncy10YWIudHMiLCAic3JjL3RyYWNrZXIudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7IFBsdWdpbiB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgeyBkZWZhdWx0U2V0dGluZ3MsIFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3MgfSBmcm9tIFwiLi9zZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzVGFiIH0gZnJvbSBcIi4vc2V0dGluZ3MtdGFiXCI7XHJcbmltcG9ydCB7IGRpc3BsYXlUcmFja2VyLCBsb2FkVHJhY2tlciB9IGZyb20gXCIuL3RyYWNrZXJcIjtcclxuXHJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcclxuXHJcblx0c2V0dGluZ3M6IFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3M7XHJcblxyXG5cdGFzeW5jIG9ubG9hZCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XHJcblxyXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzVGFiKHRoaXMuYXBwLCB0aGlzKSk7XHJcblxyXG5cdFx0dGhpcy5yZWdpc3Rlck1hcmtkb3duQ29kZUJsb2NrUHJvY2Vzc29yKFwic2ltcGxlLXRpbWUtdHJhY2tlclwiLCAocywgZSwgaSkgPT4ge1xyXG5cdFx0XHRsZXQgdHJhY2tlciA9IGxvYWRUcmFja2VyKHMpO1xyXG5cdFx0XHRlLmVtcHR5KCk7XHJcblx0XHRcdGRpc3BsYXlUcmFja2VyKHRyYWNrZXIsIGUsICgpID0+IGkuZ2V0U2VjdGlvbkluZm8oZSkpO1xyXG5cdFx0fSk7XHJcblx0fVxyXG5cclxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XHJcblx0XHR0aGlzLnNldHRpbmdzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFNldHRpbmdzLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xyXG5cdH1cclxuXHJcblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xyXG5cdFx0YXdhaXQgdGhpcy5zYXZlRGF0YSh0aGlzLnNldHRpbmdzKTtcclxuXHR9XHJcbn1cclxuIiwgImV4cG9ydCBjb25zdCBkZWZhdWx0U2V0dGluZ3M6IFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3MgPSB7XHJcblxyXG59O1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBTaW1wbGVUaW1lVHJhY2tlclNldHRpbmdzIHtcclxuXHJcbn1cclxuIiwgImltcG9ydCB7IEFwcCwgUGx1Z2luU2V0dGluZ1RhYiB9IGZyb20gXCJvYnNpZGlhblwiO1xyXG5pbXBvcnQgU2ltcGxlVGltZVRyYWNrZXJQbHVnaW4gZnJvbSBcIi4vbWFpblwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFNpbXBsZVRpbWVUcmFja2VyU2V0dGluZ3NUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcclxuXHJcbiAgICBwbHVnaW46IFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFNpbXBsZVRpbWVUcmFja2VyUGx1Z2luKSB7XHJcbiAgICAgICAgc3VwZXIoYXBwLCBwbHVnaW4pO1xyXG4gICAgICAgIHRoaXMucGx1Z2luID0gcGx1Z2luO1xyXG4gICAgfVxyXG5cclxuICAgIGRpc3BsYXkoKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJoMlwiLCB7IHRleHQ6IFwiU2ltcGxlIFRpbWUgVHJhY2tlciBTZXR0aW5nc1wiIH0pO1xyXG5cclxuICAgICAgICAvLyBUT0RPIHNldHRpbmdzIGdvIGhlcmVcclxuXHJcbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5jcmVhdGVFbChcImhyXCIpO1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRWwoXCJwXCIsIHsgdGV4dDogXCJJZiB5b3UgbGlrZSB0aGlzIHBsdWdpbiBhbmQgd2FudCB0byBzdXBwb3J0IGl0cyBkZXZlbG9wbWVudCwgeW91IGNhbiBkbyBzbyB0aHJvdWdoIG15IHdlYnNpdGUgYnkgY2xpY2tpbmcgdGhpcyBmYW5jeSBpbWFnZSFcIiB9KTtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lckVsLmNyZWF0ZUVsKFwiYVwiLCB7IGhyZWY6IFwiaHR0cHM6Ly9lbGxwZWNrLmRlL3N1cHBvcnRcIiB9KVxyXG4gICAgICAgICAgICAuY3JlYXRlRWwoXCJpbWdcIiwgeyBhdHRyOiB7IHNyYzogXCJodHRwczovL2VsbHBlY2suZGUvcmVzL2dlbmVyYWxzdXBwb3J0LnBuZ1wiIH0sIGNsczogXCJzaW1wbGUtdGltZS10cmFja2VyLXN1cHBvcnRcIiB9KTtcclxuICAgIH1cclxufVxyXG4iLCAiaW1wb3J0IHsgbW9tZW50LCBBcHAsIE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uLCBCdXR0b25Db21wb25lbnQsIFRleHRDb21wb25lbnQgfSBmcm9tIFwib2JzaWRpYW5cIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBUcmFja2VyIHtcclxuICAgIGVudHJpZXM6IEVudHJ5W107XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRW50cnkge1xyXG4gICAgbmFtZTogc3RyaW5nO1xyXG4gICAgc3RhcnRUaW1lOiBudW1iZXI7XHJcbiAgICBlbmRUaW1lOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBzdGFydEVudHJ5KHRyYWNrZXI6IFRyYWNrZXIsIG5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKCFuYW1lKVxyXG4gICAgICAgIG5hbWUgPSBgU2VnbWVudCAke3RyYWNrZXIuZW50cmllcy5sZW5ndGggKyAxfWA7XHJcbiAgICBsZXQgZW50cnk6IEVudHJ5ID0geyBuYW1lOiBuYW1lLCBzdGFydFRpbWU6IG1vbWVudCgpLnVuaXgoKSwgZW5kVGltZTogbnVsbCB9O1xyXG4gICAgdHJhY2tlci5lbnRyaWVzLnB1c2goZW50cnkpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGVuZEVudHJ5KHRyYWNrZXI6IFRyYWNrZXIpOiB2b2lkIHtcclxuICAgIGxldCBsYXN0ID0gdHJhY2tlci5lbnRyaWVzLmxhc3QoKTtcclxuICAgIGxhc3QuZW5kVGltZSA9IG1vbWVudCgpLnVuaXgoKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGlzUnVubmluZyh0cmFja2VyOiBUcmFja2VyKTogYm9vbGVhbiB7XHJcbiAgICBsZXQgbGFzdCA9IHRyYWNrZXIuZW50cmllcy5sYXN0KCk7XHJcbiAgICByZXR1cm4gbGFzdCAhPSBudWxsICYmICFsYXN0LmVuZFRpbWU7XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzYXZlVHJhY2tlcih0cmFja2VyOiBUcmFja2VyLCBhcHA6IEFwcCwgc2VjdGlvbjogTWFya2Rvd25TZWN0aW9uSW5mb3JtYXRpb24pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBmaWxlID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVGaWxlKCk7XHJcbiAgICBsZXQgY29udGVudCA9IGF3YWl0IGFwcC52YXVsdC5jYWNoZWRSZWFkKGZpbGUpO1xyXG5cclxuICAgIC8vIGZpZ3VyZSBvdXQgd2hhdCBwYXJ0IG9mIHRoZSBjb250ZW50IHdlIGhhdmUgdG8gZWRpdFxyXG4gICAgbGV0IGxpbmVzID0gY29udGVudC5zcGxpdChcIlxcblwiKTtcclxuICAgIGxldCBwcmV2ID0gbGluZXMuZmlsdGVyKChfLCBpKSA9PiBpIDw9IHNlY3Rpb24ubGluZVN0YXJ0KS5qb2luKFwiXFxuXCIpO1xyXG4gICAgbGV0IG5leHQgPSBsaW5lcy5maWx0ZXIoKF8sIGkpID0+IGkgPj0gc2VjdGlvbi5saW5lRW5kKS5qb2luKFwiXFxuXCIpO1xyXG4gICAgLy8gZWRpdCBvbmx5IHRoZSBjb2RlIGJsb2NrIGNvbnRlbnQsIGxlYXZlIHRoZSByZXN0IHVudG91Y2hlZFxyXG4gICAgY29udGVudCA9IGAke3ByZXZ9XFxuJHtKU09OLnN0cmluZ2lmeSh0cmFja2VyKX1cXG4ke25leHR9YDtcclxuXHJcbiAgICBhd2FpdCBhcHAudmF1bHQubW9kaWZ5KGZpbGUsIGNvbnRlbnQpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbG9hZFRyYWNrZXIoanNvbjogc3RyaW5nKTogVHJhY2tlciB7XHJcbiAgICBpZiAoanNvbikge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGpzb24pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYEZhaWxlZCB0byBwYXJzZSBUcmFja2VyIGZyb20gJHtqc29ufWApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB7IGVudHJpZXM6IFtdIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBkaXNwbGF5VHJhY2tlcih0cmFja2VyOiBUcmFja2VyLCBlbGVtZW50OiBIVE1MRWxlbWVudCwgZ2V0U2VjdGlvbkluZm86ICgpID0+IE1hcmtkb3duU2VjdGlvbkluZm9ybWF0aW9uKTogdm9pZCB7XHJcbiAgICAvLyBhZGQgc3RhcnQvc3RvcCBjb250cm9sc1xyXG4gICAgbGV0IHJ1bm5pbmcgPSBpc1J1bm5pbmcodHJhY2tlcik7XHJcbiAgICBsZXQgYnRuID0gbmV3IEJ1dHRvbkNvbXBvbmVudChlbGVtZW50KVxyXG4gICAgICAgIC5zZXRCdXR0b25UZXh0KHJ1bm5pbmcgPyBcIkVuZFwiIDogXCJTdGFydFwiKVxyXG4gICAgICAgIC5vbkNsaWNrKGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHtcclxuICAgICAgICAgICAgICAgIGVuZEVudHJ5KHRyYWNrZXIpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc3RhcnRFbnRyeSh0cmFja2VyLCBuYW1lLmdldFZhbHVlKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGF3YWl0IHNhdmVUcmFja2VyKHRyYWNrZXIsIHRoaXMuYXBwLCBnZXRTZWN0aW9uSW5mbygpKTtcclxuICAgICAgICB9KTtcclxuICAgIGJ0bi5idXR0b25FbC5hZGRDbGFzcyhcInNpbXBsZS10aW1lLXRyYWNrZXItYnRuXCIpO1xyXG4gICAgbGV0IG5hbWUgPSBuZXcgVGV4dENvbXBvbmVudChlbGVtZW50KVxyXG4gICAgICAgIC5zZXRQbGFjZWhvbGRlcihcIlNlZ21lbnQgbmFtZVwiKVxyXG4gICAgICAgIC5zZXREaXNhYmxlZChydW5uaW5nKTtcclxuICAgIG5hbWUuaW5wdXRFbC5hZGRDbGFzcyhcInNpbXBsZS10aW1lLXRyYWNrZXItdHh0XCIpO1xyXG5cclxuICAgIC8vIGFkZCB0aW1lcnNcclxuICAgIGxldCB0aW1lciA9IGVsZW1lbnQuY3JlYXRlRGl2KHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGltZXJzXCIgfSk7XHJcbiAgICBsZXQgY3VycmVudERpdiA9IHRpbWVyLmNyZWF0ZUVsKFwiZGl2XCIsIHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGltZXJcIiB9KTtcclxuICAgIGxldCBjdXJyZW50ID0gY3VycmVudERpdi5jcmVhdGVFbChcInNwYW5cIiwgeyBjbHM6IFwic2ltcGxlLXRpbWUtdHJhY2tlci10aW1lci10aW1lXCIgfSk7XHJcbiAgICBjdXJyZW50RGl2LmNyZWF0ZUVsKFwic3BhblwiLCB7IHRleHQ6IFwiQ3VycmVudFwiIH0pO1xyXG4gICAgbGV0IHRvdGFsRGl2ID0gdGltZXIuY3JlYXRlRWwoXCJkaXZcIiwgeyBjbHM6IFwic2ltcGxlLXRpbWUtdHJhY2tlci10aW1lclwiIH0pO1xyXG4gICAgbGV0IHRvdGFsID0gdG90YWxEaXYuY3JlYXRlRWwoXCJzcGFuXCIsIHsgY2xzOiBcInNpbXBsZS10aW1lLXRyYWNrZXItdGltZXItdGltZVwiIH0pO1xyXG4gICAgdG90YWxEaXYuY3JlYXRlRWwoXCJzcGFuXCIsIHsgdGV4dDogXCJUb3RhbFwiIH0pO1xyXG5cclxuICAgIC8vIGFkZCBsaXN0XHJcbiAgICBsZXQgdGFibGUgPSBlbGVtZW50LmNyZWF0ZUVsKFwidGFibGVcIiwgeyBjbHM6IFwic2ltcGxlLXRpbWUtdHJhY2tlci10YWJsZVwiIH0pO1xyXG4gICAgdGFibGUuY3JlYXRlRWwoXCJ0clwiKS5hcHBlbmQoXHJcbiAgICAgICAgY3JlYXRlRWwoXCJ0aFwiLCB7IHRleHQ6IFwiU2VnbWVudFwiIH0pLFxyXG4gICAgICAgIGNyZWF0ZUVsKFwidGhcIiwgeyB0ZXh0OiBcIlN0YXJ0IHRpbWVcIiB9KSxcclxuICAgICAgICBjcmVhdGVFbChcInRoXCIsIHsgdGV4dDogXCJFbmQgdGltZVwiIH0pLFxyXG4gICAgICAgIGNyZWF0ZUVsKFwidGhcIiwgeyB0ZXh0OiBcIlRvdGFsXCIgfSkpO1xyXG5cclxuICAgIGZvciAobGV0IGVudHJ5IG9mIHRyYWNrZXIuZW50cmllcykge1xyXG4gICAgICAgIGxldCByb3cgPSB0YWJsZS5jcmVhdGVFbChcInRyXCIpO1xyXG4gICAgICAgIHJvdy5jcmVhdGVFbChcInRkXCIsIHsgdGV4dDogZW50cnkubmFtZSB9KTtcclxuICAgICAgICByb3cuY3JlYXRlRWwoXCJ0ZFwiLCB7IHRleHQ6IG1vbWVudC51bml4KGVudHJ5LnN0YXJ0VGltZSkuZm9ybWF0KFwiWVktTU0tREQgaGg6bW06c3NcIikgfSk7XHJcbiAgICAgICAgaWYgKGVudHJ5LmVuZFRpbWUpIHtcclxuICAgICAgICAgICAgcm93LmNyZWF0ZUVsKFwidGRcIiwgeyB0ZXh0OiBtb21lbnQudW5peChlbnRyeS5lbmRUaW1lKS5mb3JtYXQoXCJZWS1NTS1ERCBoaDptbTpzc1wiKSB9KTtcclxuICAgICAgICAgICAgbGV0IGR1cmF0aW9uID0gbW9tZW50LnVuaXgoZW50cnkuZW5kVGltZSkuZGlmZihtb21lbnQudW5peChlbnRyeS5zdGFydFRpbWUpKTtcclxuICAgICAgICAgICAgcm93LmNyZWF0ZUVsKFwidGRcIiwgeyB0ZXh0OiBnZXRDb3VudGRvd25EaXNwbGF5KG1vbWVudC5kdXJhdGlvbihkdXJhdGlvbikpIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZXRDb3VudGRvd25WYWx1ZXModHJhY2tlciwgY3VycmVudCwgdG90YWwsIGN1cnJlbnREaXYpO1xyXG4gICAgbGV0IGludGVydmFsSWQgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xyXG4gICAgICAgIC8vIHdlIGRlbGV0ZSB0aGUgaW50ZXJ2YWwgdGltZXIgd2hlbiB0aGUgZWxlbWVudCBpcyByZW1vdmVkXHJcbiAgICAgICAgaWYgKCFlbGVtZW50LmlzQ29ubmVjdGVkKSB7XHJcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKGludGVydmFsSWQpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNldENvdW50ZG93blZhbHVlcyh0cmFja2VyLCBjdXJyZW50LCB0b3RhbCwgY3VycmVudERpdik7XHJcbiAgICB9LCAxMDAwKTtcclxuXHJcbn07XHJcblxyXG5mdW5jdGlvbiBnZXRDb3VudGRvd25EaXNwbGF5KGR1cmF0aW9uOiBtb21lbnQuRHVyYXRpb24pOiBzdHJpbmcge1xyXG4gICAgbGV0IHJldCA9IFwiXCI7XHJcbiAgICBpZiAoZHVyYXRpb24uaG91cnMoKSA+IDApXHJcbiAgICAgICAgcmV0ICs9IGR1cmF0aW9uLmhvdXJzKCkgKyBcImggXCI7XHJcbiAgICBpZiAoZHVyYXRpb24ubWludXRlcygpID4gMClcclxuICAgICAgICByZXQgKz0gZHVyYXRpb24ubWludXRlcygpICsgXCJtIFwiO1xyXG4gICAgcmV0ICs9IGR1cmF0aW9uLnNlY29uZHMoKSArIFwic1wiO1xyXG4gICAgcmV0dXJuIHJldDtcclxufVxyXG5cclxuZnVuY3Rpb24gc2V0Q291bnRkb3duVmFsdWVzKHRyYWNrZXI6IFRyYWNrZXIsIGN1cnJlbnQ6IEhUTUxFbGVtZW50LCB0b3RhbDogSFRNTEVsZW1lbnQsIGN1cnJlbnREaXY6IEhUTUxEaXZFbGVtZW50KSB7XHJcbiAgICBsZXQgY3VyckVudHJ5ID0gdHJhY2tlci5lbnRyaWVzLmxhc3QoKTtcclxuICAgIGlmIChjdXJyRW50cnkpIHtcclxuICAgICAgICBsZXQgY3VyckR1cmF0aW9uID0gbW9tZW50KCkuZGlmZihtb21lbnQudW5peChjdXJyRW50cnkuc3RhcnRUaW1lKSk7XHJcbiAgICAgICAgaWYgKCFjdXJyRW50cnkuZW5kVGltZSlcclxuICAgICAgICAgICAgY3VycmVudC5zZXRUZXh0KGdldENvdW50ZG93bkRpc3BsYXkobW9tZW50LmR1cmF0aW9uKGN1cnJEdXJhdGlvbikpKTtcclxuXHJcbiAgICAgICAgbGV0IHRvdGFsRHVyYXRpb24gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGVudHJ5IG9mIHRyYWNrZXIuZW50cmllcykge1xyXG4gICAgICAgICAgICBpZiAoZW50cnkgPT0gY3VyckVudHJ5ICYmICFjdXJyRW50cnkuZW5kVGltZSkge1xyXG4gICAgICAgICAgICAgICAgdG90YWxEdXJhdGlvbiArPSBjdXJyRHVyYXRpb247XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0b3RhbER1cmF0aW9uICs9IG1vbWVudC51bml4KGVudHJ5LmVuZFRpbWUpLmRpZmYobW9tZW50LnVuaXgoZW50cnkuc3RhcnRUaW1lKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdG90YWwuc2V0VGV4dChnZXRDb3VudGRvd25EaXNwbGF5KG1vbWVudC5kdXJhdGlvbih0b3RhbER1cmF0aW9uKSkpO1xyXG4gICAgfVxyXG4gICAgY3VycmVudERpdi5oaWRkZW4gPSAhY3VyckVudHJ5IHx8ICEhY3VyckVudHJ5LmVuZFRp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