/* THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // main.ts var main_exports = {}; __export(main_exports, { default: () => CanvasLinksPlugin }); module.exports = __toCommonJS(main_exports); var import_obsidian = require("obsidian"); var VIEW_TYPE = "canvas-links"; var CanvasLinksPlugin = class extends import_obsidian.Plugin { async onload() { this.registerView(VIEW_TYPE, (leaf) => new CanvasLinksView(leaf)); this.addCommand({ id: "canvas-links-open", name: "Open", callback: async () => { let leaf; [leaf] = this.app.workspace.getLeavesOfType( VIEW_TYPE ); if (!leaf) { leaf = this.app.workspace.getRightLeaf(false); await (leaf == null ? void 0 : leaf.setViewState({ type: VIEW_TYPE })); } if (leaf) { this.app.workspace.revealLeaf(leaf); } } }); } }; var CanvasLinksView = class extends import_obsidian.ItemView { constructor(leaf) { super(leaf); this.selectedNodeId = null; this.canvasNode = /* @__PURE__ */ new Map(); } getViewType() { return VIEW_TYPE; } getDisplayText() { return "Canvas Links"; } async onOpen() { this.icon = "align-center-horizontal"; this.containerEl.empty(); const element = this.renderPane(); const view = this.app.workspace.getLeaf().view; if (view.file != null) { this.render(element, view); } this.registerEvent(this.app.vault.on("modify", (file) => { var _a; if ("canvas" != file.extension) { return; } const view2 = this.app.workspace.getLeaf().view; const filePath = file.path; const previousNodeIds = (_a = this.canvasNode.get(filePath)) != null ? _a : []; const canvas = view2.canvas; let currentNodeIds = []; for (const [key, value] of canvas.nodes) { if (value.file != null) { currentNodeIds.push(key); } } if (currentNodeIds.length != previousNodeIds.length) { this.canvasNode.set(filePath, currentNodeIds); this.render(element, view2); } })); this.registerEvent(this.app.workspace.on("active-leaf-change", (leaf) => { const afterChangeView = leaf.view; if (afterChangeView.file == null) { if ("empty" === afterChangeView.getViewType()) { element.empty(); } } else { if ("canvas" === afterChangeView.getViewType() && this.selectedNodeId != null) { const canvas = afterChangeView.canvas; for (const [key, value] of canvas.nodes) { if (key === this.selectedNodeId) { focus(canvas, value); this.selectedNodeId = null; break; } } } this.render(element, afterChangeView); } })); } renderPane() { return this.containerEl.createDiv({ cls: "outgoing-link-pane node-insert-event", attr: { "style": "position: relative;" } }); } render(body, view) { body.empty(); if ("canvas" === view.getViewType()) { this.renderFiles(body, view.file, view.canvas.nodes); this.renderCanvases(body, view.file); } else { this.renderCanvases(body, view.file); } } renderFiles(body, currentFile, nodes) { const header = body.createDiv({ cls: "tree-item-self is-clickable", attr: { "aria-label": "Click to collapse", "aria-label-position": "right" } }); header.createSpan({ cls: "tree-item-icon collapse-icon" }); header.createDiv({ cls: "tree-item-inner", text: "FILE CONTAIN" }); const files = this.getFiles(currentFile, nodes); header.createDiv({ cls: "tree-item-flair-outer" }, (el) => { el.createSpan({ cls: "tree-item-flair", text: files.length.toString() }); }); if (isEmpty(files)) { return; } const content = body.createDiv({ cls: "search-result-container" }); content.createDiv({ attr: { "style": "width: 1px; height: 0.1px; margin-bottom: 0px;" } }); for (const file of files) { content.createDiv({ cls: "tree-item-self is-clickable outgoing-link-item", attr: { "draggable": true } }, (el) => { el.createSpan({ cls: "tree-item-icon" }, (el2) => { if ("md" === file.extension) { (0, import_obsidian.setIcon)(el2, "file-text"); } else { (0, import_obsidian.setIcon)(el2, "file-image"); } }); el.createDiv({ cls: "tree-item-inner", text: file.name.substring(0, file.name.lastIndexOf(".")) // don't show path, like link view }); }).addEventListener("click", () => { this.app.workspace.openLinkText("", file.path); }); ; } } async renderCanvases(body, currentFile) { const header = body.createDiv({ cls: "tree-item-self is-clickable", attr: { "aria-label": "Click to collapse", "aria-label-position": "right" } }); header.createSpan({ cls: "tree-item-icon collapse-icon" }); header.createDiv({ cls: "tree-item-inner", text: "CANVAS CONTAINED" }); const canvases = await this.getCanvas(currentFile); header.createDiv({ cls: "tree-item-flair-outer" }, (el) => { el.createSpan({ cls: "tree-item-flair", text: canvases.length.toString() }); }); if (isEmpty(canvases)) { return; } const content = body.createDiv({ cls: "search-result-container" }); content.createDiv({ attr: { "style": "width: 1px; height: 0.1px; margin-bottom: 0px;" } }); for (const canvas of canvases) { content.createDiv({ cls: "tree-item-self is-clickable outgoing-link-item", attr: { "draggable": true } }, (el) => { el.createSpan({ cls: "tree-item-icon" }, (el2) => { (0, import_obsidian.setIcon)(el2, "layout-dashboard"); }); el.createDiv({ cls: "tree-item-inner", text: canvas.name.substring(0, canvas.name.lastIndexOf(".")) // don't show path, like link view }); }).addEventListener("click", () => { this.app.workspace.openLinkText("", canvas.path); this.selectedNodeId = canvas.selectedNodeId; }); ; } } async getCanvas(currentFile) { const canvases = []; const files = this.app.vault.getFiles(); for (const file of files) { if ("canvas" != file.extension) { continue; } const content = await this.app.vault.cachedRead(file); if (isEmpty(content)) { continue; } const nodes = JSON.parse(content).nodes; if (nodes == null) { continue; } for (const node of nodes) { if ("file" === node.type && currentFile.path === node.file) { const canvas = file; canvas.selectedNodeId = node.id; canvases.push(canvas); break; } } } canvases.sort((a, b) => asc(a.basename.toLowerCase(), b.basename.toLowerCase())); return canvases; } getFiles(currentFile, nodes) { const files = []; let nodeIds = []; for (const [key, value] of nodes) { if (value.file != null) { nodeIds.push(key); files.push(value.file); } } this.canvasNode.set(currentFile.path, nodeIds); files.sort((a, b) => asc(a.basename.toLowerCase(), b.basename.toLowerCase())); return files; } }; function focus(canvas, node) { canvas.select(node); canvas.zoomToSelection(); } function isEmpty(value) { if (typeof value === "string") { if (value && value.length > 0) { return false; } else { return true; } } else if (value instanceof Array) { if (value && value.length > 0) { return false; } else { return true; } } return true; } function asc(a, b) { if (a < b) { return -1; } if (a > b) { return 1; } return 0; } //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgSXRlbVZpZXcsIFBsdWdpbiwgVEZpbGUsIFdvcmtzcGFjZUxlYWYsIHNldEljb24gfSBmcm9tIFwib2JzaWRpYW5cIjtcbmltcG9ydCB7IENhbnZhc05vZGVEYXRhIH0gZnJvbSBcIm9ic2lkaWFuL2NhbnZhc1wiO1xuXG5jb25zdCBWSUVXX1RZUEU6IHN0cmluZyA9IFwiY2FudmFzLWxpbmtzXCI7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhbnZhc0xpbmtzUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcbiAgICBhc3luYyBvbmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJWaWV3KFZJRVdfVFlQRSwgKGxlYWYpID0+IG5ldyBDYW52YXNMaW5rc1ZpZXcobGVhZikpO1xuXG4gICAgICAgIHRoaXMuYWRkQ29tbWFuZCh7XG4gICAgICAgICAgICBpZDogJ2NhbnZhcy1saW5rcy1vcGVuJyxcbiAgICAgICAgICAgIG5hbWU6ICdPcGVuJyxcbiAgICAgICAgICAgIGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGxlYWY6IFdvcmtzcGFjZUxlYWYgfCBudWxsO1xuICAgICAgICAgICAgICAgIFtsZWFmXSA9IHRoaXMuYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoXG4gICAgICAgICAgICAgICAgICAgIFZJRVdfVFlQRSxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICghbGVhZikge1xuICAgICAgICAgICAgICAgICAgICBsZWFmID0gdGhpcy5hcHAud29ya3NwYWNlLmdldFJpZ2h0TGVhZihmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGxlYWY/LnNldFZpZXdTdGF0ZSh7IHR5cGU6IFZJRVdfVFlQRSB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAobGVhZikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2UucmV2ZWFsTGVhZihsZWFmKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbmNsYXNzIENhbnZhc0xpbmtzVmlldyBleHRlbmRzIEl0ZW1WaWV3IHtcblxuICAgIHByaXZhdGUgc2VsZWN0ZWROb2RlSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgY2FudmFzTm9kZTogTWFwPHN0cmluZywgc3RyaW5nW10+ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXG4gICAgY29uc3RydWN0b3IobGVhZjogV29ya3NwYWNlTGVhZikge1xuICAgICAgICBzdXBlcihsZWFmKTtcbiAgICB9XG5cbiAgICBnZXRWaWV3VHlwZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gVklFV19UWVBFO1xuICAgIH1cblxuICAgIGdldERpc3BsYXlUZXh0KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBcIkNhbnZhcyBMaW5rc1wiO1xuICAgIH1cblxuICAgIGFzeW5jIG9uT3BlbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdGhpcy5pY29uID0gXCJhbGlnbi1jZW50ZXItaG9yaXpvbnRhbFwiXG5cbiAgICAgICAgdGhpcy5jb250YWluZXJFbC5lbXB0eSgpO1xuXG4gICAgICAgIGNvbnN0IGVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5yZW5kZXJQYW5lKCk7XG5cbiAgICAgICAgY29uc3QgdmlldzogYW55ID0gdGhpcy5hcHAud29ya3NwYWNlLmdldExlYWYoKS52aWV3O1xuICAgICAgICBpZiAodmlldy5maWxlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyKGVsZW1lbnQsIHZpZXcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gYWRkL2RlbGV0ZSB0ZXh0L25vZGVcbiAgICAgICAgLy8gbW92ZSB0aGVpciBwb3NpdGlvblxuICAgICAgICAvLyBjYWNoZVJlYWQgY2FuIGdldCBuZXdlc3QgY29udGVudCBpbW1pZGlhdGVseSB3aGVuIG1vZGlmeSBldmVudCB0cmlnZ2VyXG4gICAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbihcIm1vZGlmeVwiLCAoZmlsZTogVEZpbGUpID0+IHtcbiAgICAgICAgICAgIGlmIChcImNhbnZhc1wiICE9IGZpbGUuZXh0ZW5zaW9uKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB2aWV3OiBhbnkgPSB0aGlzLmFwcC53b3Jrc3BhY2UuZ2V0TGVhZigpLnZpZXc7XG5cbiAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoOiBzdHJpbmcgPSBmaWxlLnBhdGg7XG5cbiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzTm9kZUlkczogc3RyaW5nW10gfCB1bmRlZmluZWQgPSB0aGlzLmNhbnZhc05vZGUuZ2V0KGZpbGVQYXRoKSA/PyBbXTtcblxuICAgICAgICAgICAgY29uc3QgY2FudmFzID0gdmlldy5jYW52YXM7XG4gICAgICAgICAgICBsZXQgY3VycmVudE5vZGVJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBjYW52YXMubm9kZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUuZmlsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlSWRzLnB1c2goa2V5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VycmVudE5vZGVJZHMubGVuZ3RoICE9IHByZXZpb3VzTm9kZUlkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbnZhc05vZGUuc2V0KGZpbGVQYXRoLCBjdXJyZW50Tm9kZUlkcyk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoZWxlbWVudCwgdmlldyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcblxuICAgICAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKFwiYWN0aXZlLWxlYWYtY2hhbmdlXCIsIChsZWFmOiBXb3Jrc3BhY2VMZWFmKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhZnRlckNoYW5nZVZpZXc6IGFueSA9IGxlYWYudmlldztcbiAgICAgICAgICAgIGlmIChhZnRlckNoYW5nZVZpZXcuZmlsZSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKFwiZW1wdHlcIiA9PT0gYWZ0ZXJDaGFuZ2VWaWV3LmdldFZpZXdUeXBlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5lbXB0eSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKFwiY2FudmFzXCIgPT09IGFmdGVyQ2hhbmdlVmlldy5nZXRWaWV3VHlwZSgpICYmIHRoaXMuc2VsZWN0ZWROb2RlSWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBqdW1wIGZyb20gY2FudmFzLWxpbmsgbmVlZCBmb2N1c1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW52YXMgPSBhZnRlckNoYW5nZVZpZXcuY2FudmFzO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBjYW52YXMubm9kZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IHRoaXMuc2VsZWN0ZWROb2RlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2N1cyhjYW52YXMsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZUlkID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcihlbGVtZW50LCBhZnRlckNoYW5nZVZpZXcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICByZW5kZXJQYW5lKCk6IEhUTUxEaXZFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29udGFpbmVyRWwuY3JlYXRlRGl2KHtcbiAgICAgICAgICAgIGNsczogXCJvdXRnb2luZy1saW5rLXBhbmUgbm9kZS1pbnNlcnQtZXZlbnRcIixcbiAgICAgICAgICAgIGF0dHI6IHsgXCJzdHlsZVwiOiBcInBvc2l0aW9uOiByZWxhdGl2ZTtcIiB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW5kZXIoYm9keTogSFRNTERpdkVsZW1lbnQsIHZpZXc6IGFueSkge1xuICAgICAgICBib2R5LmVtcHR5KCk7XG4gICAgICAgIGlmIChcImNhbnZhc1wiID09PSB2aWV3LmdldFZpZXdUeXBlKCkpIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyRmlsZXMoYm9keSwgdmlldy5maWxlIGFzIFRGaWxlLCB2aWV3LmNhbnZhcy5ub2Rlcyk7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckNhbnZhc2VzKGJvZHksIHZpZXcuZmlsZSBhcyBURmlsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlckNhbnZhc2VzKGJvZHksIHZpZXcuZmlsZSBhcyBURmlsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJGaWxlcyhib2R5OiBIVE1MRGl2RWxlbWVudCwgY3VycmVudEZpbGU6IFRGaWxlLCBub2RlczogTWFwPHN0cmluZywgQ2FudmFzTm9kZURhdGE+KSB7XG4gICAgICAgIGNvbnN0IGhlYWRlcjogSFRNTERpdkVsZW1lbnQgPSBib2R5LmNyZWF0ZURpdih7XG4gICAgICAgICAgICBjbHM6IFwidHJlZS1pdGVtLXNlbGYgaXMtY2xpY2thYmxlXCIsXG4gICAgICAgICAgICBhdHRyOiB7XG4gICAgICAgICAgICAgICAgXCJhcmlhLWxhYmVsXCI6IFwiQ2xpY2sgdG8gY29sbGFwc2VcIixcbiAgICAgICAgICAgICAgICBcImFyaWEtbGFiZWwtcG9zaXRpb25cIjogXCJyaWdodFwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBoZWFkZXIuY3JlYXRlU3Bhbih7IGNsczogXCJ0cmVlLWl0ZW0taWNvbiBjb2xsYXBzZS1pY29uXCIgfSk7XG4gICAgICAgIGhlYWRlci5jcmVhdGVEaXYoe1xuICAgICAgICAgICAgY2xzOiBcInRyZWUtaXRlbS1pbm5lclwiLFxuICAgICAgICAgICAgdGV4dDogXCJGSUxFIENPTlRBSU5cIlxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBmaWxlczogVEZpbGVbXSA9IHRoaXMuZ2V0RmlsZXMoY3VycmVudEZpbGUsIG5vZGVzKTtcbiAgICAgICAgaGVhZGVyLmNyZWF0ZURpdih7IGNsczogXCJ0cmVlLWl0ZW0tZmxhaXItb3V0ZXJcIiB9LCAoZWwpID0+IHtcbiAgICAgICAgICAgIGVsLmNyZWF0ZVNwYW4oe1xuICAgICAgICAgICAgICAgIGNsczogXCJ0cmVlLWl0ZW0tZmxhaXJcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBmaWxlcy5sZW5ndGgudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGlzRW1wdHkoZmlsZXMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udGVudDogSFRNTERpdkVsZW1lbnQgPSBib2R5LmNyZWF0ZURpdih7IGNsczogXCJzZWFyY2gtcmVzdWx0LWNvbnRhaW5lclwiIH0pO1xuICAgICAgICBjb250ZW50LmNyZWF0ZURpdih7XG4gICAgICAgICAgICBhdHRyOiB7XG4gICAgICAgICAgICAgICAgXCJzdHlsZVwiOiBcIndpZHRoOiAxcHg7IGhlaWdodDogMC4xcHg7IG1hcmdpbi1ib3R0b206IDBweDtcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgICAgICBjb250ZW50LmNyZWF0ZURpdih7XG4gICAgICAgICAgICAgICAgY2xzOiBcInRyZWUtaXRlbS1zZWxmIGlzLWNsaWNrYWJsZSBvdXRnb2luZy1saW5rLWl0ZW1cIixcbiAgICAgICAgICAgICAgICBhdHRyOiB7IFwiZHJhZ2dhYmxlXCI6IHRydWUgfVxuICAgICAgICAgICAgfSwgKGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgZWwuY3JlYXRlU3Bhbih7IGNsczogXCJ0cmVlLWl0ZW0taWNvblwiIH0sIChlbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXCJtZFwiID09PSBmaWxlLmV4dGVuc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0SWNvbihlbCwgXCJmaWxlLXRleHRcIik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRJY29uKGVsLCBcImZpbGUtaW1hZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlbC5jcmVhdGVEaXYoe1xuICAgICAgICAgICAgICAgICAgICBjbHM6IFwidHJlZS1pdGVtLWlubmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGZpbGUubmFtZS5zdWJzdHJpbmcoMCwgZmlsZS5uYW1lLmxhc3RJbmRleE9mKFwiLlwiKSkgLy8gZG9uJ3Qgc2hvdyBwYXRoLCBsaWtlIGxpbmsgdmlld1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9KS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuYXBwLndvcmtzcGFjZS5vcGVuTGlua1RleHQoXCJcIiwgZmlsZS5wYXRoKTtcbiAgICAgICAgICAgIH0pOztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHJlbmRlckNhbnZhc2VzKGJvZHk6IEhUTUxEaXZFbGVtZW50LCBjdXJyZW50RmlsZTogVEZpbGUpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyOiBIVE1MRGl2RWxlbWVudCA9IGJvZHkuY3JlYXRlRGl2KHtcbiAgICAgICAgICAgIGNsczogXCJ0cmVlLWl0ZW0tc2VsZiBpcy1jbGlja2FibGVcIixcbiAgICAgICAgICAgIGF0dHI6IHtcbiAgICAgICAgICAgICAgICBcImFyaWEtbGFiZWxcIjogXCJDbGljayB0byBjb2xsYXBzZVwiLFxuICAgICAgICAgICAgICAgIFwiYXJpYS1sYWJlbC1wb3NpdGlvblwiOiBcInJpZ2h0XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGhlYWRlci5jcmVhdGVTcGFuKHsgY2xzOiBcInRyZWUtaXRlbS1pY29uIGNvbGxhcHNlLWljb25cIiB9KTtcbiAgICAgICAgaGVhZGVyLmNyZWF0ZURpdih7XG4gICAgICAgICAgICBjbHM6IFwidHJlZS1pdGVtLWlubmVyXCIsXG4gICAgICAgICAgICB0ZXh0OiBcIkNBTlZBUyBDT05UQUlORURcIlxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBjYW52YXNlczogVEZpbGVbXSA9IGF3YWl0IHRoaXMuZ2V0Q2FudmFzKGN1cnJlbnRGaWxlKTtcbiAgICAgICAgaGVhZGVyLmNyZWF0ZURpdih7IGNsczogXCJ0cmVlLWl0ZW0tZmxhaXItb3V0ZXJcIiB9LCAoZWwpID0+IHtcbiAgICAgICAgICAgIGVsLmNyZWF0ZVNwYW4oe1xuICAgICAgICAgICAgICAgIGNsczogXCJ0cmVlLWl0ZW0tZmxhaXJcIixcbiAgICAgICAgICAgICAgICB0ZXh0OiBjYW52YXNlcy5sZW5ndGgudG9TdHJpbmcoKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGlzRW1wdHkoY2FudmFzZXMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29udGVudDogSFRNTERpdkVsZW1lbnQgPSBib2R5LmNyZWF0ZURpdih7IGNsczogXCJzZWFyY2gtcmVzdWx0LWNvbnRhaW5lclwiIH0pO1xuICAgICAgICBjb250ZW50LmNyZWF0ZURpdih7XG4gICAgICAgICAgICBhdHRyOiB7XG4gICAgICAgICAgICAgICAgXCJzdHlsZVwiOiBcIndpZHRoOiAxcHg7IGhlaWdodDogMC4xcHg7IG1hcmdpbi1ib3R0b206IDBweDtcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgZm9yIChjb25zdCBjYW52YXMgb2YgY2FudmFzZXMpIHtcbiAgICAgICAgICAgIGNvbnRlbnQuY3JlYXRlRGl2KHtcbiAgICAgICAgICAgICAgICBjbHM6IFwidHJlZS1pdGVtLXNlbGYgaXMtY2xpY2thYmxlIG91dGdvaW5nLWxpbmstaXRlbVwiLFxuICAgICAgICAgICAgICAgIGF0dHI6IHsgXCJkcmFnZ2FibGVcIjogdHJ1ZSB9XG4gICAgICAgICAgICB9LCAoZWwpID0+IHtcbiAgICAgICAgICAgICAgICBlbC5jcmVhdGVTcGFuKHsgY2xzOiBcInRyZWUtaXRlbS1pY29uXCIgfSwgKGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldEljb24oZWwsIFwibGF5b3V0LWRhc2hib2FyZFwiKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBlbC5jcmVhdGVEaXYoe1xuICAgICAgICAgICAgICAgICAgICBjbHM6IFwidHJlZS1pdGVtLWlubmVyXCIsXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IGNhbnZhcy5uYW1lLnN1YnN0cmluZygwLCBjYW52YXMubmFtZS5sYXN0SW5kZXhPZihcIi5cIikpIC8vIGRvbid0IHNob3cgcGF0aCwgbGlrZSBsaW5rIHZpZXdcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSkuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub3BlbkxpbmtUZXh0KFwiXCIsIGNhbnZhcy5wYXRoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkTm9kZUlkID0gKGNhbnZhcyBhcyBDYW52YXMpLnNlbGVjdGVkTm9kZUlkO1xuICAgICAgICAgICAgfSk7O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgZ2V0Q2FudmFzKGN1cnJlbnRGaWxlOiBURmlsZSk6IFByb21pc2U8VEZpbGVbXT4ge1xuICAgICAgICBjb25zdCBjYW52YXNlczogQ2FudmFzW10gPSBbXTtcblxuICAgICAgICBjb25zdCBmaWxlczogVEZpbGVbXSA9IHRoaXMuYXBwLnZhdWx0LmdldEZpbGVzKCk7XG4gICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgICAgICAgICAgaWYgKFwiY2FudmFzXCIgIT0gZmlsZS5leHRlbnNpb24pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29udGVudDogc3RyaW5nID0gYXdhaXQgdGhpcy5hcHAudmF1bHQuY2FjaGVkUmVhZChmaWxlKTtcbiAgICAgICAgICAgIGlmIChpc0VtcHR5KGNvbnRlbnQpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5vZGVzOiBDYW52YXNOb2RlRGF0YVtdID0gSlNPTi5wYXJzZShjb250ZW50KS5ub2RlcztcbiAgICAgICAgICAgIGlmIChub2RlcyA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBub2Rlcykge1xuICAgICAgICAgICAgICAgIGlmIChcImZpbGVcIiA9PT0gbm9kZS50eXBlICYmIGN1cnJlbnRGaWxlLnBhdGggPT09IG5vZGUuZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW52YXMgPSBmaWxlIGFzIENhbnZhcztcbiAgICAgICAgICAgICAgICAgICAgY2FudmFzLnNlbGVjdGVkTm9kZUlkID0gbm9kZS5pZDtcbiAgICAgICAgICAgICAgICAgICAgY2FudmFzZXMucHVzaChjYW52YXMpO1xuICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gb25seSBwdXNoIGNhbnZhcyBvbmx5IG9uY2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjYW52YXNlcy5zb3J0KChhLCBiKSA9PlxuICAgICAgICAgICAgYXNjKGEuYmFzZW5hbWUudG9Mb3dlckNhc2UoKSwgYi5iYXNlbmFtZS50b0xvd2VyQ2FzZSgpKSk7XG4gICAgICAgIHJldHVybiBjYW52YXNlcztcbiAgICB9XG5cbiAgICBnZXRGaWxlcyhjdXJyZW50RmlsZTogVEZpbGUsIG5vZGVzOiBNYXA8c3RyaW5nLCBDYW52YXNOb2RlRGF0YT4pOiBURmlsZVtdIHtcbiAgICAgICAgY29uc3QgZmlsZXM6IFRGaWxlW10gPSBbXTtcbiAgICAgICAgbGV0IG5vZGVJZHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIG5vZGVzKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUuZmlsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbm9kZUlkcy5wdXNoKGtleSk7XG4gICAgICAgICAgICAgICAgZmlsZXMucHVzaCh2YWx1ZS5maWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNhbnZhc05vZGUuc2V0KGN1cnJlbnRGaWxlLnBhdGgsIG5vZGVJZHMpO1xuXG4gICAgICAgIGZpbGVzLnNvcnQoKGEsIGIpID0+XG4gICAgICAgICAgICBhc2MoYS5iYXNlbmFtZS50b0xvd2VyQ2FzZSgpLCBiLmJhc2VuYW1lLnRvTG93ZXJDYXNlKCkpKTtcbiAgICAgICAgcmV0dXJuIGZpbGVzO1xuICAgIH1cbn1cblxuaW50ZXJmYWNlIENhbnZhcyBleHRlbmRzIFRGaWxlIHtcbiAgICBzZWxlY3RlZE5vZGVJZDogc3RyaW5nXG59XG5cbmZ1bmN0aW9uIGZvY3VzKGNhbnZhczogYW55LCBub2RlOiBhbnkpIHtcbiAgICBjYW52YXMuc2VsZWN0KG5vZGUpO1xuICAgIGNhbnZhcy56b29tVG9TZWxlY3Rpb24oKVxufVxuXG5mdW5jdGlvbiBpc0VtcHR5PFQ+KHZhbHVlOiBUKTogYm9vbGVhbiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBhc2M8VD4oYTogVCwgYjogVCk6IG51bWJlciB7XG4gICAgaWYgKGEgPCBiKSB7XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgaWYgKGEgPiBiKSB7XG4gICAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn0iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FB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LFlBQU0sUUFBMEIsS0FBSyxNQUFNLE9BQU8sRUFBRTtBQUNwRCxVQUFJLFNBQVMsTUFBTTtBQUNmO0FBQUEsTUFDSjtBQUVBLGlCQUFXLFFBQVEsT0FBTztBQUN0QixZQUFJLFdBQVcsS0FBSyxRQUFRLFlBQVksU0FBUyxLQUFLLE1BQU07QUFDeEQsZ0JBQU0sU0FBUztBQUNmLGlCQUFPLGlCQUFpQixLQUFLO0FBQzdCLG1CQUFTLEtBQUssTUFBTTtBQUNwQjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUVBLGFBQVMsS0FBSyxDQUFDLEdBQUcsTUFDZCxJQUFJLEVBQUUsU0FBUyxZQUFZLEdBQUcsRUFBRSxTQUFTLFlBQVksQ0FBQyxDQUFDO0FBQzNELFdBQU87QUFBQSxFQUNYO0FBQUEsRUFFQSxTQUFTLGFBQW9CLE9BQTZDO0FBQ3RFLFVBQU0sUUFBaUIsQ0FBQztBQUN4QixRQUFJLFVBQW9CLENBQUM7QUFDekIsZUFBVyxDQUFDLEtBQUssS0FBSyxLQUFLLE9BQU87QUFDOUIsVUFBSSxNQUFNLFFBQVEsTUFBTTtBQUNwQixnQkFBUSxLQUFLLEdBQUc7QUFDaEIsY0FBTSxLQUFLLE1BQU0sSUFBSTtBQUFBLE1BQ3pCO0FBQUEsSUFDSjtBQUNBLFNBQUssV0FBVyxJQUFJLFlBQVksTUFBTSxPQUFPO0FBRTdDLFVBQU0sS0FBSyxDQUFDLEdBQUcsTUFDWCxJQUFJLEVBQUUsU0FBUyxZQUFZLEdBQUcsRUFBRSxTQUFTLFlBQVksQ0FBQyxDQUFDO0FBQzNELFdBQU87QUFBQSxFQUNYO0FBQ0o7QUFNQSxTQUFTLE1BQU0sUUFBYSxNQUFXO0FBQ25DLFNBQU8sT0FBTyxJQUFJO0FBQ2xCLFNBQU8sZ0JBQWdCO0FBQzNCO0FBRUEsU0FBUyxRQUFXLE9BQW1CO0FBQ25DLE1BQUksT0FBTyxVQUFVLFVBQVU7QUFDM0IsUUFBSSxTQUFTLE1BQU0sU0FBUyxHQUFHO0FBQzNCLGFBQU87QUFBQSxJQUNYLE9BQU87QUFDSCxhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0osV0FBVyxpQkFBaUIsT0FBTztBQUMvQixRQUFJLFNBQVMsTUFBTSxTQUFTLEdBQUc7QUFDM0IsYUFBTztBQUFBLElBQ1gsT0FBTztBQUNILGFBQU87QUFBQSxJQUNYO0FBQUEsRUFDSjtBQUNBLFNBQU87QUFDWDtBQUVBLFNBQVMsSUFBTyxHQUFNLEdBQWM7QUFDaEMsTUFBSSxJQUFJLEdBQUc7QUFDUCxXQUFPO0FBQUEsRUFDWDtBQUNBLE1BQUksSUFBSSxHQUFHO0FBQ1AsV0FBTztBQUFBLEVBQ1g7QUFDQSxTQUFPO0FBQ1g7IiwKICAibmFtZXMiOiBbInZpZXciLCAiZWwiXQp9Cg==