mirror of
https://github.com/flyer1b/LightRead-master.git
synced 2026-07-22 09:00:26 +00:00
222 lines
28 KiB
JavaScript
222 lines
28 KiB
JavaScript
/*
|
|
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: () => SyncReadPlugin
|
|
});
|
|
module.exports = __toCommonJS(main_exports);
|
|
var import_obsidian = require("obsidian");
|
|
var DEFAULT_SETTINGS = {
|
|
email: "",
|
|
password: "",
|
|
token: "",
|
|
time: "2020-01-01 00:00:00",
|
|
noteTime: "2024-03-09T10:37:49",
|
|
apiKey: ""
|
|
};
|
|
var isWriting = false;
|
|
var SyncReadPlugin = class extends import_obsidian.Plugin {
|
|
async onload() {
|
|
await this.loadSettings();
|
|
const ribbonIconEl = this.addRibbonIcon("sync", "SyncRead", async (evt) => {
|
|
await writeAllArticles(this.app, this);
|
|
writeAllNote(this.app, this);
|
|
});
|
|
this.addSettingTab(new SyncReadSettingTab(this.app, this));
|
|
}
|
|
onunload() {
|
|
}
|
|
async loadSettings() {
|
|
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
|
|
}
|
|
async saveSettings() {
|
|
await this.saveData(this.settings);
|
|
}
|
|
};
|
|
var SyncReadSettingTab = class extends import_obsidian.PluginSettingTab {
|
|
constructor(app, plugin) {
|
|
super(app, plugin);
|
|
this.plugin = plugin;
|
|
}
|
|
display() {
|
|
const { containerEl } = this;
|
|
containerEl.empty();
|
|
new import_obsidian.Setting(containerEl).setName("api key").addText((text) => text.setPlaceholder("\u8BF7\u8F93\u5165api key").setValue(this.plugin.settings.apiKey).onChange(async (value) => {
|
|
this.plugin.settings.apiKey = value;
|
|
await this.plugin.saveSettings();
|
|
}));
|
|
}
|
|
};
|
|
async function fetchArticle(settings, time, page) {
|
|
try {
|
|
const apiKey = settings.apiKey;
|
|
let res;
|
|
if (apiKey === "") {
|
|
new import_obsidian.Notice("\u8BF7\u586B\u5199api key");
|
|
} else {
|
|
res = await (0, import_obsidian.requestUrl)(
|
|
{
|
|
url: `http://43.138.149.38:5050/get_synced_articles_by_key?time=${time}&page_number=${page}&page_size=50`,
|
|
method: "GET",
|
|
headers: {
|
|
"api_key": apiKey
|
|
}
|
|
}
|
|
);
|
|
if (res.status !== 200) {
|
|
new import_obsidian.Notice("\u540C\u6B65\u6587\u7AE0\u5931\u8D25");
|
|
isWriting = false;
|
|
return;
|
|
}
|
|
const data = await res.json;
|
|
return data.data;
|
|
}
|
|
} catch (error) {
|
|
new import_obsidian.Notice("\u540C\u6B65\u5931\u8D25: " + error.message);
|
|
isWriting = false;
|
|
return;
|
|
}
|
|
}
|
|
async function fetchNote(settings, time, page) {
|
|
try {
|
|
const apiKey = settings.apiKey;
|
|
let res;
|
|
if (apiKey === "") {
|
|
new import_obsidian.Notice("\u8BF7\u586B\u5199api key");
|
|
} else {
|
|
res = await (0, import_obsidian.requestUrl)(
|
|
{
|
|
url: `http://43.138.149.38:5050/get_notes_by_key?time=${time}&page_number=${page}&page_size=50`,
|
|
method: "GET",
|
|
headers: {
|
|
"api_key": apiKey
|
|
}
|
|
}
|
|
);
|
|
if (res.status !== 200) {
|
|
new import_obsidian.Notice("\u540C\u6B65\u6807\u6CE8\u5931\u8D25");
|
|
isWriting = false;
|
|
return;
|
|
}
|
|
const data = await res.json;
|
|
if (data.code === 0) {
|
|
return data.data;
|
|
} else {
|
|
new import_obsidian.Notice(data.message);
|
|
isWriting = false;
|
|
return;
|
|
}
|
|
}
|
|
} catch (error) {
|
|
new import_obsidian.Notice("\u540C\u6B65\u5931\u8D25: " + error.message);
|
|
isWriting = false;
|
|
return;
|
|
}
|
|
}
|
|
async function writeArticle(vault, fileManager, article) {
|
|
var folder = vault.getAbstractFileByPath("SyncRead\u540C\u6B65\u6587\u4EF6\u5939");
|
|
if (!folder)
|
|
folder = await vault.createFolder("SyncRead\u540C\u6B65\u6587\u4EF6\u5939");
|
|
let file = await vault.create(folder.path + "/" + filterIllegalChars((0, import_obsidian.normalizePath)(article.title)) + ".md", article.content);
|
|
return fileManager.processFrontMatter(file, (frontMatter) => {
|
|
frontMatter["created_at"] = new Date().toISOString();
|
|
frontMatter["url"] = article.site;
|
|
});
|
|
}
|
|
async function writeNote(vault, fileManager, note) {
|
|
var folder = vault.getAbstractFileByPath("SyncRead\u540C\u6B65\u6587\u4EF6\u5939");
|
|
if (!folder)
|
|
folder = await vault.createFolder("SyncRead\u540C\u6B65\u6587\u4EF6\u5939");
|
|
var noteFolder = vault.getAbstractFileByPath(folder.path + "/\u6807\u6CE8");
|
|
if (!noteFolder)
|
|
noteFolder = await vault.createFolder(folder.path + "/\u6807\u6CE8");
|
|
let noteFile = vault.getAbstractFileByPath(noteFolder.path + "/[\u6807\u6CE8]" + filterIllegalChars((0, import_obsidian.normalizePath)(note.articleTitle)) + ".md");
|
|
if (!noteFile) {
|
|
noteFile = await vault.create(noteFolder.path + "/[\u6807\u6CE8]" + filterIllegalChars((0, import_obsidian.normalizePath)(note.articleTitle)) + ".md", "\n");
|
|
fileManager.processFrontMatter(noteFile, (frontMatter) => {
|
|
frontMatter["originArticle"] = `[[${filterIllegalChars((0, import_obsidian.normalizePath)(note.articleTitle))}]]`;
|
|
});
|
|
}
|
|
let noteText = note.text.replace(/\n+$/, "");
|
|
let noteTextWithQuotes = "\n\n\n>" + noteText.replace(/\n/g, "\n>");
|
|
return vault.append(noteFile, noteTextWithQuotes + "\n\n" + (note.annotation !== null ? note.annotation : ""));
|
|
}
|
|
async function writeAllNote(app, plugin) {
|
|
let vault = app.vault;
|
|
let fileManager = app.fileManager;
|
|
if (isWriting)
|
|
return;
|
|
isWriting = true;
|
|
var time = plugin.settings.noteTime;
|
|
var page = 1;
|
|
do {
|
|
const notes = await fetchNote(plugin.settings, time, page);
|
|
if (notes.length === 0) {
|
|
isWriting = false;
|
|
new import_obsidian.Notice("\u540C\u6B65\u6807\u6CE8\u5B8C\u6210");
|
|
break;
|
|
}
|
|
try {
|
|
await Promise.all(notes.map((note) => writeNote(vault, fileManager, note)));
|
|
} catch (error) {
|
|
}
|
|
plugin.settings.noteTime = notes[notes.length - 1].update_at;
|
|
plugin.saveSettings();
|
|
page++;
|
|
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
} while (true);
|
|
}
|
|
async function writeAllArticles(app, plugin) {
|
|
let vault = app.vault;
|
|
let fileManager = app.fileManager;
|
|
new import_obsidian.Notice(isWriting ? "\u6B63\u5728\u540C\u6B65" : "\u5F00\u59CB\u540C\u6B65");
|
|
if (isWriting)
|
|
return;
|
|
isWriting = true;
|
|
var time = plugin.settings.time;
|
|
var page = 1;
|
|
do {
|
|
const articles = await fetchArticle(plugin.settings, time, page);
|
|
if (articles.length === 0) {
|
|
isWriting = false;
|
|
new import_obsidian.Notice("\u540C\u6B65\u6587\u7AE0\u5B8C\u6210");
|
|
break;
|
|
}
|
|
try {
|
|
await Promise.all(articles.map((article) => writeArticle(vault, fileManager, article)));
|
|
} catch (error) {
|
|
}
|
|
plugin.settings.time = articles[articles.length - 1].created_at;
|
|
plugin.saveSettings();
|
|
page++;
|
|
await new Promise((resolve) => setTimeout(resolve, 1e3));
|
|
} while (true);
|
|
}
|
|
function filterIllegalChars(title) {
|
|
const illegalChars = /[\\/:*?"<>|]/g;
|
|
const filteredTitle = title.replace(illegalChars, "");
|
|
return filteredTitle;
|
|
}
|
|
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgQXBwLCBOb3RpY2UsIFBsdWdpbiwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZyxWYXVsdCxURmlsZSwgbm9ybWFsaXplUGF0aCwgcmVxdWVzdFVybCwgRmlsZU1hbmFnZXIgfSBmcm9tICdvYnNpZGlhbic7XG5cbi8vIFJlbWVtYmVyIHRvIHJlbmFtZSB0aGVzZSBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzIVxuXG5pbnRlcmZhY2UgU3luY1JlYWRQbHVnaW5TZXR0aW5ncyB7XG5cdGVtYWlsOiBzdHJpbmc7XG5cdHBhc3N3b3JkOiBzdHJpbmc7XG5cdHRva2VuOiBzdHJpbmc7XG5cdHRpbWU6IHN0cmluZztcblx0bm90ZVRpbWU6IHN0cmluZztcblx0YXBpS2V5OiBzdHJpbmc7XG59XG5cbmNvbnN0IERFRkFVTFRfU0VUVElOR1M6IFN5bmNSZWFkUGx1Z2luU2V0dGluZ3MgPSB7XG5cdGVtYWlsOiAnJyxcblx0cGFzc3dvcmQ6ICcnLFxuXHR0b2tlbjogJycsXG5cdHRpbWU6ICcyMDIwLTAxLTAxIDAwOjAwOjAwJyxcblx0bm90ZVRpbWU6ICcyMDI0LTAzLTA5VDEwOjM3OjQ5Jyxcblx0YXBpS2V5OiAnJ1xufVxuXG52YXIgaXNXcml0aW5nID0gZmFsc2U7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN5bmNSZWFkUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHtcblx0c2V0dGluZ3M6IFN5bmNSZWFkUGx1Z2luU2V0dGluZ3M7XG5cblx0YXN5bmMgb25sb2FkKCkge1xuXHRcdGF3YWl0IHRoaXMubG9hZFNldHRpbmdzKCk7XG5cblx0XHQvLyBUaGlzIGNyZWF0ZXMgYW4gaWNvbiBpbiB0aGUgbGVmdCByaWJib24uXG5cdFx0Y29uc3QgcmliYm9uSWNvbkVsID0gdGhpcy5hZGRSaWJib25JY29uKCdzeW5jJywgJ1N5bmNSZWFkJyxhc3luYyAoZXZ0OiBNb3VzZUV2ZW50KSAgPT4ge1xuXHRcdFx0Ly8gQ2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIHRoZSBpY29uLlxuXHRcdFx0Ly8gbmV3IE5vdGljZSgnVGhpcyBpcyBhIG5vdGljZSEnKTtcblx0XHRcdC8vIG5ldyBOb3RpY2UoYHBhdGg6ICR7dGhpcy5hcHAudmF1bHQuZ2V0Um9vdCgpLnBhdGh9YCk7XG5cdFx0XHQvLyBjcmFldGVGaWxlKHRoaXMuYXBwLnZhdWx0KTtcblx0XHRcdC8vIG5ldyBOb3RpY2UoYHRva2VuOiAke3RoaXMuc2V0dGluZ3MudG9rZW59YCk7XG5cdFx0IFx0YXdhaXQgd3JpdGVBbGxBcnRpY2xlcyh0aGlzLmFwcCx0aGlzKTtcblx0XHRcdHdyaXRlQWxsTm90ZSh0aGlzLmFwcCx0aGlzKTtcblx0XHR9KTsgXG5cdFx0XG5cblx0XHQvLyBUaGlzIGFkZHMgYSBzZXR0aW5ncyB0YWIgc28gdGhlIHVzZXIgY2FuIGNvbmZpZ3VyZSB2YXJpb3VzIGFzcGVjdHMgb2YgdGhlIHBsdWdpblxuXHRcdC8vIGlmKHRoaXMuc2V0dGluZ3MudG9rZW4gIT09ICcnKXtcblx0XHQvLyBcdHRoaXMuYWRkU2V0dGluZ1RhYihuZXcgU2V0dGluZ3NUYWIodGhpcy5hcHAsIHRoaXMpKTtcblx0XHQvLyB9ZWxzZXtcblx0XHQvLyB9XG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBTeW5jUmVhZFNldHRpbmdUYWIodGhpcy5hcHAsIHRoaXMpKTtcblxuXHR9XG5cblx0b251bmxvYWQoKSB7XG5cdH1cblxuXHRhc3luYyBsb2FkU2V0dGluZ3MoKSB7XG5cdFx0dGhpcy5zZXR0aW5ncyA9IE9iamVjdC5hc3NpZ24oe30sIERFRkFVTFRfU0VUVElOR1MsIGF3YWl0IHRoaXMubG9hZERhdGEoKSk7XG5cdFx0Ly8gdGhpcy5zZXR0aW5ncy50aW1lID0gJzIwMjAtMDEtMDEgMDA6MDA6MDAnO1xuXHR9XG5cblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG5cdH1cbn1cblxuXG5jbGFzcyBTeW5jUmVhZFNldHRpbmdUYWIgZXh0ZW5kcyBQbHVnaW5TZXR0aW5nVGFiIHtcblx0cGx1Z2luOiBTeW5jUmVhZFBsdWdpbjtcblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgcGx1Z2luOiBTeW5jUmVhZFBsdWdpbikge1xuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0XHRcblx0fVxuXG5cdGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3Qge2NvbnRhaW5lckVsfSA9IHRoaXM7XG5cblx0XHRjb250YWluZXJFbC5lbXB0eSgpO1xuXG5cdFx0Ly8gbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0Ly8gXHQuc2V0TmFtZSgnXHU3NTI4XHU2MjM3XHU1NDBEJylcblx0XHQvLyBcdC5zZXREZXNjKCdcdThGOTNcdTUxNjVcdTRGNjBcdTU3MjhTeW5jUmVhZFx1NkNFOFx1NTE4Q1x1NzY4NFx1OTBBRVx1N0JCMScpXG5cdFx0Ly8gXHQuYWRkVGV4dCh0ZXh0ID0+IHRleHRcblx0XHQvLyBcdFx0LnNldFBsYWNlaG9sZGVyKCdcdThCRjdcdThGOTNcdTUxNjVcdTkwQUVcdTdCQjEnKVxuXHRcdC8vIFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuZW1haWwpXG5cdFx0Ly8gXHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHQvLyBcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5lbWFpbCA9IHZhbHVlO1xuXHRcdC8vIFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdC8vIFx0XHR9KSk7XG5cdFx0Ly8gbmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0Ly8gXHQuc2V0TmFtZSgnXHU1QkM2XHU3ODAxJylcblx0XHQvLyBcdC5zZXREZXNjKCcnKVxuXHRcdC8vIFx0LmFkZFRleHQodGV4dCA9PiB0ZXh0XG5cdFx0Ly8gXHRcdC5zZXRQbGFjZWhvbGRlcignXHU4QkY3XHU4RjkzXHU1MTY1XHU1QkM2XHU3ODAxJylcblx0XHQvLyBcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLnBhc3N3b3JkKVxuXHRcdC8vIFx0XHQub25DaGFuZ2UoYXN5bmMgKHZhbHVlKSA9PiB7XG5cdFx0Ly8gXHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucGFzc3dvcmQgPSB2YWx1ZTtcblx0XHQvLyBcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHQvLyBcdFx0fSkpO1xuXHRcdC8vIG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdC8vIFx0LmFkZEJ1dHRvbihidXR0b24gPT4ge1xuXHRcdC8vIFx0XHRidXR0b25cblx0XHQvLyBcdFx0XHQuc2V0QnV0dG9uVGV4dCgnXHU3NjdCXHU1RjU1Jylcblx0XHQvLyBcdFx0XHQub25DbGljayhhc3luYyAoKSA9PiB7XG5cdFx0Ly8gXHRcdFx0XHRidXR0b24uZGlzYWJsZWQgPSB0cnVlO1xuXHRcdC8vIFx0XHRcdFx0YnV0dG9uLnNldEJ1dHRvblRleHQoJ1x1NzY3Qlx1NUY1NVx1NEUyRC4uLicpO1xuXHRcdC8vIFx0XHRcdFx0Y29uc3Qge2VtYWlsLCBwYXNzd29yZH0gPSB0aGlzLnBsdWdpbi5zZXR0aW5ncztcblx0XHQvLyBcdFx0XHRcdC8vIG5ldyBOb3RpY2UoYGVtYWlsOiAke2VtYWlsfWApO1xuXHRcdC8vIFx0XHRcdFx0dHJ5e1xuXHRcdC8vIFx0XHRcdFx0Y29uc3QgcmVzID0gYXdhaXQgcmVxdWVzdFVybCh7XG5cdFx0Ly8gXHRcdFx0XHRcdHVybDonaHR0cDovLzQzLjEzOC4xNDkuMzg6NTA1MC9sb2dpbi8nLFxuXHRcdC8vIFx0XHRcdFx0XHRtZXRob2Q6ICdQT1NUJyxcblx0XHQvLyBcdFx0XHRcdFx0Y29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uJyxcblx0XHQvLyBcdFx0XHRcdFx0Ym9keTogSlNPTi5zdHJpbmdpZnkoe1xuXHRcdC8vIFx0XHRcdFx0XHRcdFx0J3VzZXJuYW1lJzplbWFpbCxcblx0XHQvLyBcdFx0XHRcdFx0XHRcdCdwYXNzd29yZCc6cGFzc3dvcmRcblx0XHRcdFx0XHRcdFx0XG5cdFx0Ly8gXHRcdFx0XHR9KX0pO1xuXHRcdC8vIFx0XHRcdFx0aWYgKHJlcy5zdGF0dXMgIT09IDIwMCkge1xuXHRcdC8vIFx0XHRcdFx0XHRuZXcgTm90aWNlKCdcdTc2N0JcdTVGNTVcdTU5MzFcdThEMjUnKTtcblx0XHQvLyBcdFx0XHRcdFx0YnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG5cdFx0Ly8gXHRcdFx0XHRcdGJ1dHRvbi5zZXRCdXR0b25UZXh0KCdcdTc2N0JcdTVGNTUnKTtcblx0XHQvLyBcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdC8vIFx0XHRcdFx0fVxuXHRcdC8vIFx0XHRcdFx0Y29uc3QgZGF0YSA9IGF3YWl0IHJlcy5qc29uO1xuXHRcdC8vIFx0XHRcdFx0Ly8gbmV3IE5vdGljZShgcmVzOiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfWApO1xuXHRcdC8vIFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MudG9rZW4gPSBkYXRhLmRhdGEudG9rZW47XG5cdFx0Ly8gXHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHQvLyBcdFx0XHRcdG5ldyBOb3RpY2UoJ1x1NzY3Qlx1NUY1NVx1NjIxMFx1NTI5RicpO1xuXHRcdC8vIFx0XHRcdFx0YnV0dG9uLnNldEJ1dHRvblRleHQoJ1x1NzY3Qlx1NUY1NVx1NjIxMFx1NTI5RicpO1xuXHRcdC8vIFx0XHRcdFx0YnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG5cdFx0Ly8gXHRcdFx0fWNhdGNoKGVycm9yKXtcblx0XHQvLyBcdFx0XHRcdG5ldyBOb3RpY2UoJ1x1NzY3Qlx1NUY1NVx1NTkzMVx1OEQyNTogJyArIGVycm9yLm1lc3NhZ2UpO1xuXHRcdC8vIFx0XHRcdFx0YnV0dG9uLmRpc2FibGVkID0gZmFsc2U7XG5cdFx0Ly8gXHRcdFx0XHRidXR0b24uc2V0QnV0dG9uVGV4dCgnXHU3NjdCXHU1RjU1Jyk7XG5cdFx0Ly8gXHRcdFx0XHRyZXR1cm47XG5cdFx0Ly8gXHRcdFx0fVxuXHRcdC8vIFx0XHRcdH0pO1xuXHRcdC8vIFx0fSlcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ2FwaSBrZXknKVxuXHRcdFx0LmFkZFRleHQodGV4dCA9PiB0ZXh0XG5cdFx0XHRcdC5zZXRQbGFjZWhvbGRlcignXHU4QkY3XHU4RjkzXHU1MTY1YXBpIGtleScpXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5hcGlLZXkpXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5hcGlLZXkgPSB2YWx1ZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSkpO1xuXHR9XG59XG5cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBcnRpY2xlKHNldHRpbmdzOiBTeW5jUmVhZFBsdWdpblNldHRpbmdzLHRpbWU6IHN0cmluZyxwYWdlOiBudW1iZXIpe1xuXG5cdHRyeSB7XG5cblx0Y29uc3QgYXBpS2V5ID0gc2V0dGluZ3MuYXBpS2V5O1xuXHRsZXQgcmVzO1xuXHRpZihhcGlLZXkgPT09ICcnKXtcblx0XHRcblx0XHRuZXcgTm90aWNlKCdcdThCRjdcdTU4NkJcdTUxOTlhcGkga2V5Jyk7XG5cdH1lbHNle1xuXHRcdHJlcyA9IGF3YWl0IHJlcXVlc3RVcmwoXG5cdFx0XHR7XG5cdFx0XHRcdHVybDpgaHR0cDovLzQzLjEzOC4xNDkuMzg6NTA1MC9nZXRfc3luY2VkX2FydGljbGVzX2J5X2tleT90aW1lPSR7dGltZX0mcGFnZV9udW1iZXI9JHtwYWdlfSZwYWdlX3NpemU9NTBgLCBcblx0XHRcdFx0bWV0aG9kOiAnR0VUJyxcblx0XHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRcdCdhcGlfa2V5JzogIGFwaUtleVxuXHRcdFx0XHR9LFxuXHRcdFx0fVxuXHRcdFx0KTtcblx0XHRcdGlmIChyZXMuc3RhdHVzICE9PSAyMDApIHtcblx0XHRcdFx0bmV3IE5vdGljZSgnXHU1NDBDXHU2QjY1XHU2NTg3XHU3QUUwXHU1OTMxXHU4RDI1Jyk7XG5cdFx0XHRcdGlzV3JpdGluZyA9IGZhbHNlO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBkYXRhID0gYXdhaXQgcmVzLmpzb247XG5cdFx0XHQvLyBuZXcgTm90aWNlKGByZXM6ICR7ZGF0YS5kYXRhLmxlbmd0aH1gKTtcblx0XHRcdHJldHVybiBkYXRhLmRhdGE7XG5cdH1cblx0Ly8gbmV3IE5vdGljZShgdG9rZW46ICR7c2V0dGluZ3MudG9rZW59YCk7XG5cdFxufSBjYXRjaCAoZXJyb3IpIHtcblx0bmV3IE5vdGljZSgnXHU1NDBDXHU2QjY1XHU1OTMxXHU4RDI1OiAnICsgZXJyb3IubWVzc2FnZSk7XG5cdGlzV3JpdGluZyA9IGZhbHNlO1xuXHRyZXR1cm47XG59XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZldGNoTm90ZShzZXR0aW5nczogU3luY1JlYWRQbHVnaW5TZXR0aW5ncyx0aW1lOiBzdHJpbmcscGFnZTogbnVtYmVyKXtcblx0XG5cdHRyeSB7XG5cblx0Y29uc3QgYXBpS2V5ID0gc2V0dGluZ3MuYXBpS2V5O1xuXHRsZXQgcmVzO1xuXHRpZihhcGlLZXkgPT09ICcnKXtcblx0XHRcblx0XHRuZXcgTm90aWNlKCdcdThCRjdcdTU4NkJcdTUxOTlhcGkga2V5Jyk7XG5cdH1lbHNle1xuXHRcdHJlcyA9IGF3YWl0IHJlcXVlc3RVcmwoXG5cdFx0XHR7XG5cdFx0XHRcdHVybDpgaHR0cDovLzQzLjEzOC4xNDkuMzg6NTA1MC9nZXRfbm90ZXNfYnlfa2V5P3RpbWU9JHt0aW1lfSZwYWdlX251bWJlcj0ke3BhZ2V9JnBhZ2Vfc2l6ZT01MGAsIFxuXHRcdFx0XHRtZXRob2Q6ICdHRVQnLFxuXHRcdFx0XHRoZWFkZXJzOiB7XG5cdFx0XHRcdFx0J2FwaV9rZXknOiAgYXBpS2V5XG5cdFx0XHRcdH0sXG5cdFx0XHR9XG5cdFx0XHQpO1xuXHRcdFx0aWYgKHJlcy5zdGF0dXMgIT09IDIwMCkge1xuXHRcdFx0XHRuZXcgTm90aWNlKCdcdTU0MENcdTZCNjVcdTY4MDdcdTZDRThcdTU5MzFcdThEMjUnKTtcblx0XHRcdFx0aXNXcml0aW5nID0gZmFsc2U7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IGRhdGEgPSBhd2FpdCByZXMuanNvbjtcblx0XHRcdC8vIG5ldyBOb3RpY2UoYHJlczogJHtkYXRhLmRhdGEubGVuZ3RofWApO1xuXHRcdFx0aWYoZGF0YS5jb2RlPT09MCl7XG5cdFx0XHRcdHJldHVybiBkYXRhLmRhdGE7XG5cdFx0XHR9ZWxzZXtcblx0XHRcdFx0bmV3IE5vdGljZShkYXRhLm1lc3NhZ2UpO1xuXHRcdFx0XHRpc1dyaXRpbmcgPSBmYWxzZTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XG5cdFx0XHR9XG5cdH1cbn0gY2F0Y2ggKGVycm9yKSB7XG5cdG5ldyBOb3RpY2UoJ1x1NTQwQ1x1NkI2NVx1NTkzMVx1OEQyNTogJyArIGVycm9yLm1lc3NhZ2UpO1xuXHRpc1dyaXRpbmcgPSBmYWxzZTtcblx0cmV0dXJuO1xufVxufVxuXG5hc3luYyBmdW5jdGlvbiB3cml0ZUFydGljbGUodmF1bHQ6IFZhdWx0LGZpbGVNYW5hZ2VyOkZpbGVNYW5hZ2VyLCBhcnRpY2xlOiB7IHRpdGxlOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyAsc2l0ZTpzdHJpbmd9KTogUHJvbWlzZTx2b2lkPiB7XG5cdHZhciBmb2xkZXIgPSB2YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoJ1N5bmNSZWFkXHU1NDBDXHU2QjY1XHU2NTg3XHU0RUY2XHU1OTM5Jyk7XG5cdGlmKCFmb2xkZXIpIGZvbGRlciA9IGF3YWl0IHZhdWx0LmNyZWF0ZUZvbGRlcignU3luY1JlYWRcdTU0MENcdTZCNjVcdTY1ODdcdTRFRjZcdTU5MzknKTtcblx0Ly8gbmV3IE5vdGljZSgndXJsOiAnICsgYXJ0aWNsZS5zaXRlKTtcblx0bGV0IGZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUoZm9sZGVyLnBhdGgrJy8nK2ZpbHRlcklsbGVnYWxDaGFycyhub3JtYWxpemVQYXRoKGFydGljbGUudGl0bGUpKSArIFwiLm1kXCIsIGFydGljbGUuY29udGVudCk7XG5cdHJldHVybiBmaWxlTWFuYWdlci5wcm9jZXNzRnJvbnRNYXR0ZXIoZmlsZSwoZnJvbnRNYXR0ZXIpID0+IHtcblx0XHRmcm9udE1hdHRlclsnY3JlYXRlZF9hdCddID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpO1xuXHRcdGZyb250TWF0dGVyWyd1cmwnXSA9IGFydGljbGUuc2l0ZTtcblx0fSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlTm90ZSh2YXVsdDogVmF1bHQsZmlsZU1hbmFnZXI6RmlsZU1hbmFnZXIsIG5vdGU6IHtpZDpzdHJpbmc7IHRleHQ6IHN0cmluZzsgYW5ub3RhdGlvbjogc3RyaW5nO2FydGljbGVUaXRsZTpzdHJpbmc7dXBkYXRlX2F0OnN0cmluZyB9KTogUHJvbWlzZTx2b2lkPiB7XG5cdHZhciBmb2xkZXIgPSB2YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoJ1N5bmNSZWFkXHU1NDBDXHU2QjY1XHU2NTg3XHU0RUY2XHU1OTM5Jyk7XG5cdGlmKCFmb2xkZXIpIGZvbGRlciA9IGF3YWl0IHZhdWx0LmNyZWF0ZUZvbGRlcignU3luY1JlYWRcdTU0MENcdTZCNjVcdTY1ODdcdTRFRjZcdTU5MzknKTtcblx0dmFyIG5vdGVGb2xkZXIgPSB2YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoZm9sZGVyLnBhdGgrJy9cdTY4MDdcdTZDRTgnKVxuXHRpZighbm90ZUZvbGRlcikgbm90ZUZvbGRlciA9IGF3YWl0IHZhdWx0LmNyZWF0ZUZvbGRlcihmb2xkZXIucGF0aCsnL1x1NjgwN1x1NkNFOCcpO1xuXHRsZXQgbm90ZUZpbGUgPSB2YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgobm90ZUZvbGRlci5wYXRoKycvW1x1NjgwN1x1NkNFOF0nK2ZpbHRlcklsbGVnYWxDaGFycyhub3JtYWxpemVQYXRoKG5vdGUuYXJ0aWNsZVRpdGxlKSkgKyBcIi5tZFwiKTtcblx0aWYoIW5vdGVGaWxlKSB7XG5cdFx0bm90ZUZpbGUgPSBhd2FpdCB2YXVsdC5jcmVhdGUobm90ZUZvbGRlci5wYXRoKycvW1x1NjgwN1x1NkNFOF0nK2ZpbHRlcklsbGVnYWxDaGFycyhub3JtYWxpemVQYXRoKG5vdGUuYXJ0aWNsZVRpdGxlKSkgKyBcIi5tZFwiLCBcIlxcblwiKTtcblx0XHRmaWxlTWFuYWdlci5wcm9jZXNzRnJvbnRNYXR0ZXIobm90ZUZpbGUgYXMgVEZpbGUsKGZyb250TWF0dGVyKSA9PiB7XG5cdFx0XHRmcm9udE1hdHRlclsnb3JpZ2luQXJ0aWNsZSddID0gYFtbJHtmaWx0ZXJJbGxlZ2FsQ2hhcnMobm9ybWFsaXplUGF0aChub3RlLmFydGljbGVUaXRsZSkpfV1dYDtcblx0XHR9KTtcblx0fVxuXHRsZXQgbm90ZVRleHQgPSBub3RlLnRleHQucmVwbGFjZSgvXFxuKyQvLCBcIlwiKTsgIC8vIFJlbW92ZSB0cmFpbGluZyBuZXdsaW5lc1xuXG5cdGxldCBub3RlVGV4dFdpdGhRdW90ZXMgPSBcIlxcblxcblxcbj5cIiArIG5vdGVUZXh0LnJlcGxhY2UoL1xcbi9nLCBcIlxcbj5cIik7XG5cdC8vIG5ldyBOb3RpY2Uobm90ZVRleHRXaXRoUXVvdGVzKTtcblx0cmV0dXJuIHZhdWx0LmFwcGVuZChub3RlRmlsZSBhcyBURmlsZSxub3RlVGV4dFdpdGhRdW90ZXMrXCJcXG5cXG5cIisobm90ZS5hbm5vdGF0aW9uIT09bnVsbD9ub3RlLmFubm90YXRpb246XCJcIikpO1xuXHRcbn1cblxuYXN5bmMgZnVuY3Rpb24gd3JpdGVBbGxOb3RlKGFwcDogQXBwLHBsdWdpbjogU3luY1JlYWRQbHVnaW4pe1xuXHRsZXQgdmF1bHQgPSBhcHAudmF1bHQ7XG5cdGxldCBmaWxlTWFuYWdlciA9IGFwcC5maWxlTWFuYWdlcjtcblx0aWYoaXNXcml0aW5nKSByZXR1cm47XG5cdFx0aXNXcml0aW5nID0gdHJ1ZTtcblx0dmFyIHRpbWUgPSBwbHVnaW4uc2V0dGluZ3Mubm90ZVRpbWU7XG5cdHZhciBwYWdlID0gMTtcblx0ZG97XG5cdFx0XG5cdFx0Y29uc3Qgbm90ZXMgPSBhd2FpdCBmZXRjaE5vdGUocGx1Z2luLnNldHRpbmdzLHRpbWUscGFnZSk7XG5cdFx0aWYgKG5vdGVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0aXNXcml0aW5nID0gZmFsc2U7XG5cdFx0XHRuZXcgTm90aWNlKCdcdTU0MENcdTZCNjVcdTY4MDdcdTZDRThcdTVCOENcdTYyMTAnKTtcblx0XHRcdGJyZWFrO1x0XG5cdFx0fVxuXHRcdHRyeXtcblx0XHRcdGF3YWl0IFByb21pc2UuYWxsKG5vdGVzLm1hcCgobm90ZToge2lkOnN0cmluZzsgdGV4dDogc3RyaW5nOyBhbm5vdGF0aW9uOiBzdHJpbmc7YXJ0aWNsZVRpdGxlOnN0cmluZzt1cGRhdGVfYXQ6c3RyaW5nIH0pID0+IHdyaXRlTm90ZSh2YXVsdCwgZmlsZU1hbmFnZXIsbm90ZSkpKTtcblx0XHR9Y2F0Y2goZXJyb3Ipe1xuXHRcdFx0Ly8gbmV3IE5vdGljZShlcnJvci5tZXNzYWdlKTtcblx0XHRcdC8vIGlzV3JpdGluZyA9IGZhbHNlO1xuXHRcdFx0Ly8gcmV0dXJuO1xuXHRcdH1cblx0XHQvLyBuZXcgTm90aWNlKGBwYWdlOiAke3BhZ2V9YCk7XG5cdFx0cGx1Z2luLnNldHRpbmdzLm5vdGVUaW1lID0gbm90ZXNbbm90ZXMubGVuZ3RoLTFdLnVwZGF0ZV9hdDtcblx0XHRwbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0cGFnZSsrO1xuXHRcdGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIDEwMDApKTtcblx0XHQvLyBuZXcgTm90aWNlKGBwYWdlOiAke3BhZ2V9YCk7XG5cdH13aGlsZSh0cnVlKTtcbn1cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlQWxsQXJ0aWNsZXMoYXBwOiBBcHAscGx1Z2luOiBTeW5jUmVhZFBsdWdpbil7XG5cblx0bGV0IHZhdWx0ID0gYXBwLnZhdWx0O1xuXHRsZXQgZmlsZU1hbmFnZXIgPSBhcHAuZmlsZU1hbmFnZXI7XG5cdG5ldyBOb3RpY2UoaXNXcml0aW5nID8gJ1x1NkI2M1x1NTcyOFx1NTQwQ1x1NkI2NScgOiAnXHU1RjAwXHU1OUNCXHU1NDBDXHU2QjY1Jyk7XG5cdGlmKGlzV3JpdGluZykgcmV0dXJuO1xuXHRcdGlzV3JpdGluZyA9IHRydWU7XG5cdHZhciB0aW1lID0gcGx1Z2luLnNldHRpbmdzLnRpbWU7XG5cdHZhciBwYWdlID0gMTtcblx0Ly8gbmV3IE5vdGljZShgdGltZTogJHt0aW1lfWApO1xuXHRkb3tcblx0XHRcblx0XHRjb25zdCBhcnRpY2xlcyA9IGF3YWl0IGZldGNoQXJ0aWNsZShwbHVnaW4uc2V0dGluZ3MsdGltZSxwYWdlKTtcblx0XHRpZiAoYXJ0aWNsZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRpc1dyaXRpbmcgPSBmYWxzZTtcblx0XHRcdG5ldyBOb3RpY2UoJ1x1NTQwQ1x1NkI2NVx1NjU4N1x1N0FFMFx1NUI4Q1x1NjIxMCcpO1xuXHRcdFx0YnJlYWs7XHRcblx0XHR9XG5cdFx0dHJ5e1xuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoYXJ0aWNsZXMubWFwKChhcnRpY2xlOiB7IHRpdGxlOiBzdHJpbmc7IGNvbnRlbnQ6IHN0cmluZztzaXRlOnN0cmluZyB9KSA9PiB3cml0ZUFydGljbGUodmF1bHQsIGZpbGVNYW5hZ2VyLGFydGljbGUpKSk7XG5cdFx0fWNhdGNoKGVycm9yKXtcblx0XHRcdC8vIG5ldyBOb3RpY2UoZXJyb3IubWVzc2FnZSk7XG5cdFx0XHQvLyBpc1dyaXRpbmcgPSBmYWxzZTtcblx0XHRcdC8vIHJldHVybjtcblx0XHR9XG5cdFx0Ly8gbmV3IE5vdGljZShgcGFnZTogJHtwYWdlfWApO1xuXHRcdHBsdWdpbi5zZXR0aW5ncy50aW1lID0gYXJ0aWNsZXNbYXJ0aWNsZXMubGVuZ3RoLTFdLmNyZWF0ZWRfYXQ7XG5cdFx0cGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdHBhZ2UrKztcblx0XHRhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAxMDAwKSk7XG5cdFx0Ly8gbmV3IE5vdGljZShgcGFnZTogJHtwYWdlfWApO1xuXHR9d2hpbGUodHJ1ZSk7XG5cbn1cblxuZnVuY3Rpb24gZmlsdGVySWxsZWdhbENoYXJzKHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIFx1NUI5QVx1NEU0OVx1OTc1RVx1NkNENVx1NUI1N1x1N0IyNlxuICAgIGNvbnN0IGlsbGVnYWxDaGFycyA9IC9bXFxcXC86Kj9cIjw+fF0vZztcbiAgICAvLyBcdTRGN0ZcdTc1MjhcdTZCNjNcdTUyMTlcdTg4NjhcdThGQkVcdTVGMEZcdTY2RkZcdTYzNjJcdTk3NUVcdTZDRDVcdTVCNTdcdTdCMjZcbiAgICBjb25zdCBmaWx0ZXJlZFRpdGxlID0gdGl0bGUucmVwbGFjZShpbGxlZ2FsQ2hhcnMsIFwiXCIpO1xuICAgIHJldHVybiBmaWx0ZXJlZFRpdGxlO1xufSJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxzQkFBbUg7QUFhbkgsSUFBTSxtQkFBMkM7QUFBQSxFQUNoRCxPQUFPO0FBQUEsRUFDUCxVQUFVO0FBQUEsRUFDVixPQUFPO0FBQUEsRUFDUCxNQUFNO0FBQUEsRUFDTixVQUFVO0FBQUEsRUFDVixRQUFRO0FBQ1Q7QUFFQSxJQUFJLFlBQVk7QUFFaEIsSUFBcUIsaUJBQXJCLGNBQTRDLHVCQUFPO0FBQUEsRUFHbEQsTUFBTSxTQUFTO0FBQ2QsVUFBTSxLQUFLLGFBQWE7QUFHeEIsVUFBTSxlQUFlLEtBQUssY0FBYyxRQUFRLFlBQVcsT0FBTyxRQUFxQjtBQU1yRixZQUFNLGlCQUFpQixLQUFLLEtBQUksSUFBSTtBQUNyQyxtQkFBYSxLQUFL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
|