From a5e4c90174378c5a053b9413170a5f667deea281 Mon Sep 17 00:00:00 2001 From: Jean Ouina Date: Thu, 21 May 2020 23:05:52 +0200 Subject: [PATCH] Fixed transparency and fixed verified plugin/theme --- BetterDiscordApp/js/main.js | 2 +- .../src/modules/pluginCertifier.js | 91 +++++++++++++++++-- .../core/app/applicationMenu/darwin.js | 4 - .../core/app/applicationMenu/linux.js | 4 - .../core/app/applicationMenu/win32.js | 4 - .../core/app/mainScreen.js | 7 +- 6 files changed, 86 insertions(+), 26 deletions(-) diff --git a/BetterDiscordApp/js/main.js b/BetterDiscordApp/js/main.js index 0a8d058..c5502f4 100644 --- a/BetterDiscordApp/js/main.js +++ b/BetterDiscordApp/js/main.js @@ -275,7 +275,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) * /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return PluginCertifier; });\n/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! node-fetch */ \"node-fetch\");\n/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! electron */ \"electron\");\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! crypto */ \"crypto\");\n/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v2 */ \"./src/modules/v2.js\");\n/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ui/tooltipWrap */ \"./src/ui/tooltipWrap.js\");\n\n\n\n\n\nconst debug = false;\nconst cache = {};\nconst cache2 = {};\nconst PinnedModule = BDModules.get(e => e.default && e.default.getPinnedMessages)[0].default;\nconst ChannelModule = BDModules.get(e => e.default && e.default.getChannelId)[0].default;\nconst fetchMessagesModule = BDModules.get(e => e.default && e.default.fetchMessages)[0].default;\nconst fetchMessagesModule2 = BDModules.get(e => e.default && e.default.fetchMessages)[1].default;\nconst getMessagesModule = BDModules.get(e => e.default && e.default.getMessages)[0].default;\nclass PluginCertifier {\n constructor() {}\n\n start() {\n const dispatcher = window.Lightcord.DiscordModules.dispatcher;\n const constants = window.Lightcord.DiscordModules.constants;\n const originalFetchMessages = fetchMessagesModule.fetchMessages;\n\n fetchMessagesModule.fetchMessages = function () {\n const returnValue = originalFetchMessages.apply(this, arguments);\n\n if (returnValue instanceof Promise) {\n returnValue.then(() => {\n const ev = getMessagesModule.getMessages(ChannelModule.getChannelId());\n process.nextTick(() => {\n for (const message of ev._array) {\n const attachments = message.attachments || [];\n if (attachments.length === 0) continue; // no attachments\n\n attachments.forEach(attachment => {\n processAttachment(attachment);\n });\n }\n });\n });\n }\n\n return returnValue;\n };\n\n const originalFetchMessages2 = fetchMessagesModule2.fetchMessages;\n\n fetchMessagesModule2.fetchMessages = function () {\n const returnValue = originalFetchMessages2.apply(this, arguments);\n\n if (returnValue instanceof Promise) {\n returnValue.then(() => {\n const ev = getMessagesModule.getMessages(ChannelModule.getChannelId());\n process.nextTick(() => {\n for (const message of ev._array) {\n const attachments = message.attachments || [];\n if (attachments.length === 0) continue; // no attachments\n\n attachments.forEach(attachment => {\n processAttachment(attachment);\n });\n }\n });\n });\n }\n\n return returnValue;\n };\n\n const alreadyUsed = {};\n const originalGetPinnedMessages = PinnedModule.getPinnedMessages.bind(PinnedModule);\n\n PinnedModule.getPinnedMessages = function () {\n const pinned = originalGetPinnedMessages(...arguments);\n if (!pinned || alreadyUsed[pinned.id]) return pinned;\n alreadyUsed[pinned.id] = true;\n setTimeout(() => {\n delete alreadyUsed[pinned.id];\n\n for (const message of pinned.messages) {\n const attachments = message.attachments || [];\n if (attachments.length === 0) continue; // no attachments\n\n attachments.forEach(attachment => {\n processAttachment(attachment);\n });\n }\n }, 50);\n return pinned;\n };\n\n dispatcher.subscribe(constants.ActionTypes.MESSAGE_CREATE, ev => {\n const message = ev.message;\n if (message.channel_id !== ChannelModule.getChannelId()) return;\n process.nextTick(() => {\n const attachments = message.attachments || [];\n if (attachments.length === 0) return; // no attachments\n\n attachments.forEach(attachment => {\n processAttachment(attachment);\n });\n });\n });\n }\n\n}\n\nfunction processAttachment(attachment) {\n if (!attachment.url.startsWith(\"https://cdn.discordapp.com/\")) return;\n if (!attachment.filename.endsWith(\".plugin.js\") && !attachment.filename.endsWith(\".theme.css\")) return;\n\n let nextHash = hash => {\n if (!cache[hash]) {\n node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(\"https://raw.githubusercontent.com/Lightcord/filehashes/master/hashes/\" + hash, {\n headers: {\n \"User-Agent\": electron__WEBPACK_IMPORTED_MODULE_1__[\"remote\"].getCurrentWebContents().userAgent\n }\n }).then(async res => {\n if (res.status !== 200) return;\n const result = await res.json();\n debug && console.log(`Hash valid:`, result);\n cache[hash] = result;\n let elements = Array.from(document.querySelectorAll(`a[href=\"${attachment.url}\"]`)).filter(e => !e.classList.contains(\"da-fileNameLink\")).map(e => e.parentElement);\n renderToElements(elements, result, attachment.filename);\n }).catch(() => {});\n } else {\n const result = cache[hash];\n debug && console.log(`Hash valid:`, result);\n let elements = Array.from(document.querySelectorAll(`a[href=\"${attachment.url}\"]`)).filter(e => !e.classList.contains(\"da-fileNameLink\")).map(e => e.parentElement);\n renderToElements(elements, result, attachment.filename);\n }\n };\n\n if (cache2[attachment.url]) return nextHash(cache2[attachment.url]);\n node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(attachment.url, {\n headers: {\n \"User-Agent\": electron__WEBPACK_IMPORTED_MODULE_1__[\"remote\"].getCurrentWebContents().userAgent\n }\n }).then(res => {\n if (res.status !== 200) throw new Error(\"File doesn't exist.\");\n const hash = crypto__WEBPACK_IMPORTED_MODULE_2__[\"createHash\"](\"sha256\");\n res.body.pipe(hash);\n res.body.on(\"end\", () => {\n const hashResult = hash.digest(\"hex\");\n debug && console.log(`Calculated hash for file ${attachment.filename}: ${hashResult}`);\n cache2[attachment.url] = hashResult;\n nextHash(hashResult);\n });\n }).catch(() => {});\n}\n\nconst flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0];\nconst childModule = BDModules.get(e => e.childContainer)[0];\n/**\r\n * \r\n * @param {HTMLDivElement[]} elements \r\n * @param {{type: \"Theme\"|\"Plugin\", name: string}} result\r\n */\n\nfunction renderToElements(elements, result, filename) {\n elements.forEach(e => {\n if (e.childNodes.length > 3) return;\n const div = document.createElement(\"div\");\n e.appendChild(div);\n\n if (!result.official) {\n _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n text: result.type + \" \" + result.name + \" is certified by Lightcord.\"\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"div\", {\n className: flowerStarModule.flowerStarContainer,\n style: {\n width: \"16px\",\n height: \"16px\"\n }\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"svg\", {\n className: flowerStarModule.flowerStar,\n \"aria-hidden\": \"false\",\n width: \"16px\",\n height: \"16px\",\n viewBox: \"0 0 16 15.2\"\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"path\", {\n fill: \"#4f545c\",\n \"fill-rule\": \"evenodd\",\n d: \"m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z\"\n })), _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"div\", {\n className: childModule.childContainer\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"svg\", {\n \"aria-hidden\": \"false\",\n width: \"16px\",\n height: \"16px\",\n viewBox: \"0 0 16 15.2\"\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"path\", {\n fill: \"#ffffff\",\n d: \"M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z\"\n }))))), div);\n } else {\n _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n text: result.type + \" \" + result.name + \" was made by the developers of Lightcord.\",\n style: \"brand\"\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"div\", {\n className: flowerStarModule.flowerStarContainer,\n style: {\n width: \"16px\",\n height: \"16px\"\n }\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"svg\", {\n className: flowerStarModule.flowerStar,\n \"aria-hidden\": \"false\",\n width: \"16px\",\n height: \"16px\",\n viewBox: \"0 0 16 15.2\",\n stroke: \"#36393f\",\n style: {\n color: \"#4087ed\"\n }\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"path\", {\n fill: \"currentColor\",\n \"fill-rule\": \"evenodd\",\n d: \"m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z\"\n })), _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"div\", {\n className: childModule.childContainer\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"svg\", {\n \"aria-hidden\": \"false\",\n width: \"16px\",\n height: \"16px\",\n viewBox: \"0 0 16 15.2\"\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"path\", {\n fill: \"#ffffff\",\n d: \"M10.7,5.28a2.9,2.9,0,0,0-2.11.86.11.11,0,0,0,0,.16l1.05.94a.11.11,0,0,0,.15,0,1.27,1.27,0,0,1,.9-.33c.65,0,.65.73.65.73a.64.64,0,0,1-.65.65,1.73,1.73,0,0,1-1.18-.54c-.31-.26-.36-.32-.73-.66S7.06,5.28,5.65,5.28A2.26,2.26,0,0,0,3.37,7.56,2.59,2.59,0,0,0,3.82,9a2.18,2.18,0,0,0,1.83.89,2.94,2.94,0,0,0,2.1-.81.11.11,0,0,0,0-.16L6.74,8A.11.11,0,0,0,6.6,8a1.58,1.58,0,0,1-.94.29h0A.71.71,0,0,1,5,7.56H5a.63.63,0,0,1,.65-.64c.71,0,1.42.75,1.94,1.27.75.76,1.66,1.79,3.11,1.74A2.28,2.28,0,0,0,13,7.64a2.59,2.59,0,0,0-.45-1.47A2.14,2.14,0,0,0,10.7,5.28Z\"\n }))))), div);\n }\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbW9kdWxlcy9wbHVnaW5DZXJ0aWZpZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyLmpzPzQyODMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG5vZGVGZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiO1xuaW1wb3J0ICogYXMgZWxlY3Ryb24gZnJvbSBcImVsZWN0cm9uXCI7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcbmltcG9ydCB0b29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIjtcbmNvbnN0IGRlYnVnID0gZmFsc2U7XG5jb25zdCBjYWNoZSA9IHt9O1xuY29uc3QgY2FjaGUyID0ge307XG5jb25zdCBQaW5uZWRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRQaW5uZWRNZXNzYWdlcylbMF0uZGVmYXVsdDtcbmNvbnN0IENoYW5uZWxNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRDaGFubmVsSWQpWzBdLmRlZmF1bHQ7XG5jb25zdCBmZXRjaE1lc3NhZ2VzTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZmV0Y2hNZXNzYWdlcylbMF0uZGVmYXVsdDtcbmNvbnN0IGZldGNoTWVzc2FnZXNNb2R1bGUyID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZmV0Y2hNZXNzYWdlcylbMV0uZGVmYXVsdDtcbmNvbnN0IGdldE1lc3NhZ2VzTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZGVmYXVsdCAmJiBlLmRlZmF1bHQuZ2V0TWVzc2FnZXMpWzBdLmRlZmF1bHQ7XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQbHVnaW5DZXJ0aWZpZXIge1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgc3RhcnQoKSB7XG4gICAgY29uc3QgZGlzcGF0Y2hlciA9IHdpbmRvdy5MaWdodGNvcmQuRGlzY29yZE1vZHVsZXMuZGlzcGF0Y2hlcjtcbiAgICBjb25zdCBjb25zdGFudHMgPSB3aW5kb3cuTGlnaHRjb3JkLkRpc2NvcmRNb2R1bGVzLmNvbnN0YW50cztcbiAgICBjb25zdCBvcmlnaW5hbEZldGNoTWVzc2FnZXMgPSBmZXRjaE1lc3NhZ2VzTW9kdWxlLmZldGNoTWVzc2FnZXM7XG5cbiAgICBmZXRjaE1lc3NhZ2VzTW9kdWxlLmZldGNoTWVzc2FnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCByZXR1cm5WYWx1ZSA9IG9yaWdpbmFsRmV0Y2hNZXNzYWdlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICBpZiAocmV0dXJuVmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIHJldHVyblZhbHVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGV2ID0gZ2V0TWVzc2FnZXNNb2R1bGUuZ2V0TWVzc2FnZXMoQ2hhbm5lbE1vZHVsZS5nZXRDaGFubmVsSWQoKSk7XG4gICAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgZXYuX2FycmF5KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gbWVzc2FnZS5hdHRhY2htZW50cyB8fCBbXTtcbiAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkgY29udGludWU7IC8vIG5vIGF0dGFjaG1lbnRzXG5cbiAgICAgICAgICAgICAgYXR0YWNobWVudHMuZm9yRWFjaChhdHRhY2htZW50ID0+IHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzQXR0YWNobWVudChhdHRhY2htZW50KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfTtcblxuICAgIGNvbnN0IG9yaWdpbmFsRmV0Y2hNZXNzYWdlczIgPSBmZXRjaE1lc3NhZ2VzTW9kdWxlMi5mZXRjaE1lc3NhZ2VzO1xuXG4gICAgZmV0Y2hNZXNzYWdlc01vZHVsZTIuZmV0Y2hNZXNzYWdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gb3JpZ2luYWxGZXRjaE1lc3NhZ2VzMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICBpZiAocmV0dXJuVmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIHJldHVyblZhbHVlLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGV2ID0gZ2V0TWVzc2FnZXNNb2R1bGUuZ2V0TWVzc2FnZXMoQ2hhbm5lbE1vZHVsZS5nZXRDaGFubmVsSWQoKSk7XG4gICAgICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgZXYuX2FycmF5KSB7XG4gICAgICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gbWVzc2FnZS5hdHRhY2htZW50cyB8fCBbXTtcbiAgICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkgY29udGludWU7IC8vIG5vIGF0dGFjaG1lbnRzXG5cbiAgICAgICAgICAgICAgYXR0YWNobWVudHMuZm9yRWFjaChhdHRhY2htZW50ID0+IHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzQXR0YWNobWVudChhdHRhY2htZW50KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmV0dXJuVmFsdWU7XG4gICAgfTtcblxuICAgIGNvbnN0IGFscmVhZHlVc2VkID0ge307XG4gICAgY29uc3Qgb3JpZ2luYWxHZXRQaW5uZWRNZXNzYWdlcyA9IFBpbm5lZE1vZHVsZS5nZXRQaW5uZWRNZXNzYWdlcy5iaW5kKFBpbm5lZE1vZHVsZSk7XG5cbiAgICBQaW5uZWRNb2R1bGUuZ2V0UGlubmVkTWVzc2FnZXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwaW5uZWQgPSBvcmlnaW5hbEdldFBpbm5lZE1lc3NhZ2VzKC4uLmFyZ3VtZW50cyk7XG4gICAgICBpZiAoIXBpbm5lZCB8fCBhbHJlYWR5VXNlZFtwaW5uZWQuaWRdKSByZXR1cm4gcGlubmVkO1xuICAgICAgYWxyZWFkeVVzZWRbcGlubmVkLmlkXSA9IHRydWU7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgZGVsZXRlIGFscmVhZHlVc2VkW3Bpbm5lZC5pZF07XG5cbiAgICAgICAgZm9yIChjb25zdCBtZXNzYWdlIG9mIHBpbm5lZC5tZXNzYWdlcykge1xuICAgICAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gbWVzc2FnZS5hdHRhY2htZW50cyB8fCBbXTtcbiAgICAgICAgICBpZiAoYXR0YWNobWVudHMubGVuZ3RoID09PSAwKSBjb250aW51ZTsgLy8gbm8gYXR0YWNobWVudHNcblxuICAgICAgICAgIGF0dGFjaG1lbnRzLmZvckVhY2goYXR0YWNobWVudCA9PiB7XG4gICAgICAgICAgICBwcm9jZXNzQXR0YWNobWVudChhdHRhY2htZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSwgNTApO1xuICAgICAgcmV0dXJuIHBpbm5lZDtcbiAgICB9O1xuXG4gICAgZGlzcGF0Y2hlci5zdWJzY3JpYmUoY29uc3RhbnRzLkFjdGlvblR5cGVzLk1FU1NBR0VfQ1JFQVRFLCBldiA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZXYubWVzc2FnZTtcbiAgICAgIGlmIChtZXNzYWdlLmNoYW5uZWxfaWQgIT09IENoYW5uZWxNb2R1bGUuZ2V0Q2hhbm5lbElkKCkpIHJldHVybjtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soKCkgPT4ge1xuICAgICAgICBjb25zdCBhdHRhY2htZW50cyA9IG1lc3NhZ2UuYXR0YWNobWVudHMgfHwgW107XG4gICAgICAgIGlmIChhdHRhY2htZW50cy5sZW5ndGggPT09IDApIHJldHVybjsgLy8gbm8gYXR0YWNobWVudHNcblxuICAgICAgICBhdHRhY2htZW50cy5mb3JFYWNoKGF0dGFjaG1lbnQgPT4ge1xuICAgICAgICAgIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbn1cblxuZnVuY3Rpb24gcHJvY2Vzc0F0dGFjaG1lbnQoYXR0YWNobWVudCkge1xuICBpZiAoIWF0dGFjaG1lbnQudXJsLnN0YXJ0c1dpdGgoXCJodHRwczovL2Nkbi5kaXNjb3JkYXBwLmNvbS9cIikpIHJldHVybjtcbiAgaWYgKCFhdHRhY2htZW50LmZpbGVuYW1lLmVuZHNXaXRoKFwiLnBsdWdpbi5qc1wiKSAmJiAhYXR0YWNobWVudC5maWxlbmFtZS5lbmRzV2l0aChcIi50aGVtZS5jc3NcIikpIHJldHVybjtcblxuICBsZXQgbmV4dEhhc2ggPSBoYXNoID0+IHtcbiAgICBpZiAoIWNhY2hlW2hhc2hdKSB7XG4gICAgICBub2RlRmV0Y2goXCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vTGlnaHRjb3JkL2ZpbGVoYXNoZXMvbWFzdGVyL2hhc2hlcy9cIiArIGhhc2gsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiVXNlci1BZ2VudFwiOiBlbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkudXNlckFnZW50XG4gICAgICAgIH1cbiAgICAgIH0pLnRoZW4oYXN5bmMgcmVzID0+IHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgcmV0dXJuO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgICBkZWJ1ZyAmJiBjb25zb2xlLmxvZyhgSGFzaCB2YWxpZDpgLCByZXN1bHQpO1xuICAgICAgICBjYWNoZVtoYXNoXSA9IHJlc3VsdDtcbiAgICAgICAgbGV0IGVsZW1lbnRzID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKGBhW2hyZWY9XCIke2F0dGFjaG1lbnQudXJsfVwiXWApKS5maWx0ZXIoZSA9PiAhZS5jbGFzc0xpc3QuY29udGFpbnMoXCJkYS1maWxlTmFtZUxpbmtcIikpLm1hcChlID0+IGUucGFyZW50RWxlbWVudCk7XG4gICAgICAgIHJlbmRlclRvRWxlbWVudHMoZWxlbWVudHMsIHJlc3VsdCwgYXR0YWNobWVudC5maWxlbmFtZSk7XG4gICAgICB9KS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNhY2hlW2hhc2hdO1xuICAgICAgZGVidWcgJiYgY29uc29sZS5sb2coYEhhc2ggdmFsaWQ6YCwgcmVzdWx0KTtcbiAgICAgIGxldCBlbGVtZW50cyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgYVtocmVmPVwiJHthdHRhY2htZW50LnVybH1cIl1gKSkuZmlsdGVyKGUgPT4gIWUuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZGEtZmlsZU5hbWVMaW5rXCIpKS5tYXAoZSA9PiBlLnBhcmVudEVsZW1lbnQpO1xuICAgICAgcmVuZGVyVG9FbGVtZW50cyhlbGVtZW50cywgcmVzdWx0LCBhdHRhY2htZW50LmZpbGVuYW1lKTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKGNhY2hlMlthdHRhY2htZW50LnVybF0pIHJldHVybiBuZXh0SGFzaChjYWNoZTJbYXR0YWNobWVudC51cmxdKTtcbiAgbm9kZUZldGNoKGF0dGFjaG1lbnQudXJsLCB7XG4gICAgaGVhZGVyczoge1xuICAgICAgXCJVc2VyLUFnZW50XCI6IGVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS51c2VyQWdlbnRcbiAgICB9XG4gIH0pLnRoZW4ocmVzID0+IHtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoXCJGaWxlIGRvZXNuJ3QgZXhpc3QuXCIpO1xuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKTtcbiAgICByZXMuYm9keS5waXBlKGhhc2gpO1xuICAgIHJlcy5ib2R5Lm9uKFwiZW5kXCIsICgpID0+IHtcbiAgICAgIGNvbnN0IGhhc2hSZXN1bHQgPSBoYXNoLmRpZ2VzdChcImhleFwiKTtcbiAgICAgIGRlYnVnICYmIGNvbnNvbGUubG9nKGBDYWxjdWxhdGVkIGhhc2ggZm9yIGZpbGUgJHthdHRhY2htZW50LmZpbGVuYW1lfTogJHtoYXNoUmVzdWx0fWApO1xuICAgICAgY2FjaGUyW2F0dGFjaG1lbnQudXJsXSA9IGhhc2hSZXN1bHQ7XG4gICAgICBuZXh0SGFzaChoYXNoUmVzdWx0KTtcbiAgICB9KTtcbiAgfSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG5jb25zdCBmbG93ZXJTdGFyTW9kdWxlID0gQkRNb2R1bGVzLmdldChlID0+IGUuZmxvd2VyU3RhckNvbnRhaW5lcilbMF07XG5jb25zdCBjaGlsZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmNoaWxkQ29udGFpbmVyKVswXTtcbi8qKlxyXG4gKiBcclxuICogQHBhcmFtIHtIVE1MRGl2RWxlbWVudFtdfSBlbGVtZW50cyBcclxuICogQHBhcmFtIHt7dHlwZTogXCJUaGVtZVwifFwiUGx1Z2luXCIsIG5hbWU6IHN0cmluZ319IHJlc3VsdFxyXG4gKi9cblxuZnVuY3Rpb24gcmVuZGVyVG9FbGVtZW50cyhlbGVtZW50cywgcmVzdWx0LCBmaWxlbmFtZSkge1xuICBlbGVtZW50cy5mb3JFYWNoKGUgPT4ge1xuICAgIGlmIChlLmNoaWxkTm9kZXMubGVuZ3RoID4gMykgcmV0dXJuO1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZS5hcHBlbmRDaGlsZChkaXYpO1xuXG4gICAgaWYgKCFyZXN1bHQub2ZmaWNpYWwpIHtcbiAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge1xuICAgICAgICB0ZXh0OiByZXN1bHQudHlwZSArIFwiIFwiICsgcmVzdWx0Lm5hbWUgKyBcIiBpcyBjZXJ0aWZpZWQgYnkgTGlnaHRjb3JkLlwiXG4gICAgICB9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lcixcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICB3aWR0aDogXCIxNnB4XCIsXG4gICAgICAgICAgaGVpZ2h0OiBcIjE2cHhcIlxuICAgICAgICB9XG4gICAgICB9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhcixcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcImZhbHNlXCIsXG4gICAgICAgIHdpZHRoOiBcIjE2cHhcIixcbiAgICAgICAgaGVpZ2h0OiBcIjE2cHhcIixcbiAgICAgICAgdmlld0JveDogXCIwIDAgMTYgMTUuMlwiXG4gICAgICB9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICAgICAgZmlsbDogXCIjNGY1NDVjXCIsXG4gICAgICAgIFwiZmlsbC1ydWxlXCI6IFwiZXZlbm9kZFwiLFxuICAgICAgICBkOiBcIm0xNiA3LjZjMCAuNzktMS4yOCAxLjM4LTEuNTIgMi4wOXMuNDQgMiAwIDIuNTktMS44NC4zNS0yLjQ2LjgtLjc5IDEuODQtMS41NCAyLjA5LTEuNjctLjgtMi40Ny0uOC0xLjc1IDEtMi40Ny44LS45Mi0xLjY0LTEuNTQtMi4wOS0yLS4xOC0yLjQ2LS44LjIzLTEuODQgMC0yLjU5LTEuNTQtMS4zLTEuNTQtMi4wOSAxLjI4LTEuMzggMS41Mi0yLjA5LS40NC0yIDAtMi41OSAxLjg1LS4zNSAyLjQ4LS44Ljc4LTEuODQgMS41My0yLjEyIDEuNjcuODMgMi40Ny44MyAxLjc1LTEgMi40Ny0uOC45MSAxLjY0IDEuNTMgMi4wOSAyIC4xOCAyLjQ2LjgtLjIzIDEuODQgMCAyLjU5IDEuNTQgMS4zIDEuNTQgMi4wOXpcIlxuICAgICAgfSkpLCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGNoaWxkTW9kdWxlLmNoaWxkQ29udGFpbmVyXG4gICAgICB9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IFwiZmFsc2VcIixcbiAgICAgICAgd2lkdGg6IFwiMTZweFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMTZweFwiLFxuICAgICAgICB2aWV3Qm94OiBcIjAgMCAxNiAxNS4yXCJcbiAgICAgIH0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgICAgICBmaWxsOiBcIiNmZmZmZmZcIixcbiAgICAgICAgZDogXCJNNy40LDExLjE3LDQsOC42Miw1LDcuMjZsMiwxLjUzTDEwLjY0LDRsMS4zNiwxWlwiXG4gICAgICB9KSkpKSksIGRpdik7XG4gICAgfSBlbHNlIHtcbiAgICAgIEJEVjIucmVhY3REb20ucmVuZGVyKEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudCh0b29sdGlwV3JhcCwge1xuICAgICAgICB0ZXh0OiByZXN1bHQudHlwZSArIFwiIFwiICsgcmVzdWx0Lm5hbWUgKyBcIiB3YXMgbWFkZSBieSB0aGUgZGV2ZWxvcGVycyBvZiBMaWdodGNvcmQuXCIsXG4gICAgICAgIHN0eWxlOiBcImJyYW5kXCJcbiAgICAgIH0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyQ29udGFpbmVyLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIHdpZHRoOiBcIjE2cHhcIixcbiAgICAgICAgICBoZWlnaHQ6IFwiMTZweFwiXG4gICAgICAgIH1cbiAgICAgIH0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogZmxvd2VyU3Rhck1vZHVsZS5mbG93ZXJTdGFyLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IFwiZmFsc2VcIixcbiAgICAgICAgd2lkdGg6IFwiMTZweFwiLFxuICAgICAgICBoZWlnaHQ6IFwiMTZweFwiLFxuICAgICAgICB2aWV3Qm94OiBcIjAgMCAxNiAxNS4yXCIsXG4gICAgICAgIHN0cm9rZTogXCIjMzYzOTNmXCIsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgY29sb3I6IFwiIzQwODdlZFwiXG4gICAgICAgIH1cbiAgICAgIH0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInBhdGhcIiwge1xuICAgICAgICBmaWxsOiBcImN1cnJlbnRDb2xvclwiLFxuICAgICAgICBcImZpbGwtcnVsZVwiOiBcImV2ZW5vZGRcIixcbiAgICAgICAgZDogXCJtMTYgNy42YzAgLjc5LTEuMjggMS4zOC0xLjUyIDIuMDlzLjQ0IDIgMCAyLjU5LTEuODQuMzUtMi40Ni44LS43OSAxLjg0LTEuNTQgMi4wOS0xLjY3LS44LTIuNDctLjgtMS43NSAxLTIuNDcuOC0uOTItMS42NC0xLjU0LTIuMDktMi0uMTgtMi40Ni0uOC4yMy0xLjg0IDAtMi41OS0xLjU0LTEuMy0xLjU0LTIuMDkgMS4yOC0xLjM4IDEuNTItMi4wOS0uNDQtMiAwLTIuNTkgMS44NS0uMzUgMi40OC0uOC43OC0xLjg0IDEuNTMtMi4xMiAxLjY3LjgzIDIuNDcuODMgMS43NS0xIDIuNDctLjguOTEgMS42NCAxLjUzIDIuMDkgMiAuMTggMi40Ni44LS4yMyAxLjg0IDAgMi41OSAxLjU0IDEuMyAxLjU0IDIuMDl6XCJcbiAgICAgIH0pKSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjaGlsZE1vZHVsZS5jaGlsZENvbnRhaW5lclxuICAgICAgfSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcImZhbHNlXCIsXG4gICAgICAgIHdpZHRoOiBcIjE2cHhcIixcbiAgICAgICAgaGVpZ2h0OiBcIjE2cHhcIixcbiAgICAgICAgdmlld0JveDogXCIwIDAgMTYgMTUuMlwiXG4gICAgICB9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICAgICAgZmlsbDogXCIjZmZmZmZmXCIsXG4gICAgICAgIGQ6IFwiTTEwLjcsNS4yOGEyLjksMi45LDAsMCwwLTIuMTEuODYuMTEuMTEsMCwwLDAsMCwuMTZsMS4wNS45NGEuMTEuMTEsMCwwLDAsLjE1LDAsMS4yNywxLjI3LDAsMCwxLC45LS4zM2MuNjUsMCwuNjUuNzMuNjUuNzNhLjY0LjY0LDAsMCwxLS42NS42NSwxLjczLDEuNzMsMCwwLDEtMS4xOC0uNTRjLS4zMS0uMjYtLjM2LS4zMi0uNzMtLjY2UzcuMDYsNS4yOCw1LjY1LDUuMjhBMi4yNiwyLjI2LDAsMCwwLDMuMzcsNy41NiwyLjU5LDIuNTksMCwwLDAsMy44Miw5YTIuMTgsMi4xOCwwLDAsMCwxLjgzLjg5LDIuOTQsMi45NCwwLDAsMCwyLjEtLjgxLjExLjExLDAsMCwwLDAtLjE2TDYuNzQsOEEuMTEuMTEsMCwwLDAsNi42LDhhMS41OCwxLjU4LDAsMCwxLS45NC4yOWgwQS43MS43MSwwLDAsMSw1LDcuNTZINWEuNjMuNjMsMCwwLDEsLjY1LS42NGMuNzEsMCwxLjQyLjc1LDEuOTQsMS4yNy43NS43NiwxLjY2LDEuNzksMy4xMSwxLjc0QTIuMjgsMi4yOCwwLDAsMCwxMyw3LjY0YTIuNTksMi41OSwwLDAsMC0uNDUtMS40N0EyLjE0LDIuMTQsMCwwLDAsMTAuNyw1LjI4WlwiXG4gICAgICB9KSkpKSksIGRpdik7XG4gICAgfVxuICB9KTtcbn0iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/modules/pluginCertifier.js\n"); +eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, \"default\", function() { return PluginCertifier; });\n/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! node-fetch */ \"node-fetch\");\n/* harmony import */ var node_fetch__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(node_fetch__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! electron */ \"electron\");\n/* harmony import */ var electron__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(electron__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! crypto */ \"crypto\");\n/* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _v2__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v2 */ \"./src/modules/v2.js\");\n/* harmony import */ var _ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../ui/tooltipWrap */ \"./src/ui/tooltipWrap.js\");\n\n\n\n\n\nconst debug = true;\nconst cache = {};\nconst cache2 = {};\nconst PinnedModule = BDModules.get(e => e.default && e.default.getPinnedMessages)[0].default;\nconst ChannelModule = BDModules.get(e => e.default && e.default.getChannelId)[0].default;\nconst fetchMessagesModule = BDModules.get(e => e.default && e.default.fetchMessages)[0].default;\nconst fetchMessagesModule2 = BDModules.get(e => e.default && e.default.fetchMessages)[1].default;\nconst getMessagesModule = BDModules.get(e => e.default && e.default.getMessages)[0].default;\nclass PluginCertifier {\n constructor() {}\n\n start() {\n const dispatcher = window.Lightcord.DiscordModules.dispatcher;\n const constants = window.Lightcord.DiscordModules.constants;\n const originalFetchMessages = fetchMessagesModule.fetchMessages;\n\n fetchMessagesModule.fetchMessages = function () {\n const returnValue = originalFetchMessages.apply(this, arguments);\n\n if (returnValue instanceof Promise) {\n returnValue.then(() => {\n const ev = getMessagesModule.getMessages(ChannelModule.getChannelId());\n process.nextTick(() => {\n for (const message of ev._array) {\n const attachments = message.attachments || [];\n if (attachments.length === 0) continue; // no attachments\n\n attachments.forEach(attachment => {\n processAttachment(attachment);\n });\n }\n });\n });\n }\n\n return returnValue;\n };\n\n const originalFetchMessages2 = fetchMessagesModule2.fetchMessages;\n\n fetchMessagesModule2.fetchMessages = function () {\n const returnValue = originalFetchMessages2.apply(this, arguments);\n\n if (returnValue instanceof Promise) {\n returnValue.then(() => {\n const ev = getMessagesModule.getMessages(ChannelModule.getChannelId());\n process.nextTick(() => {\n for (const message of ev._array) {\n const attachments = message.attachments || [];\n if (attachments.length === 0) continue; // no attachments\n\n attachments.forEach(attachment => {\n processAttachment(attachment);\n });\n }\n });\n });\n }\n\n return returnValue;\n };\n\n const alreadyUsed = {};\n const originalGetPinnedMessages = PinnedModule.getPinnedMessages.bind(PinnedModule);\n\n PinnedModule.getPinnedMessages = function () {\n const pinned = originalGetPinnedMessages(...arguments);\n if (!pinned || alreadyUsed[pinned.id]) return pinned;\n alreadyUsed[pinned.id] = true;\n setTimeout(() => {\n delete alreadyUsed[pinned.id];\n\n for (const message of pinned.messages) {\n const attachments = message.attachments || [];\n if (attachments.length === 0) continue; // no attachments\n\n attachments.forEach(attachment => {\n processAttachment(attachment);\n });\n }\n }, 50);\n return pinned;\n };\n\n dispatcher.subscribe(constants.ActionTypes.MESSAGE_CREATE, ev => {\n const message = ev.message;\n if (message.channel_id !== ChannelModule.getChannelId()) return;\n process.nextTick(() => {\n const attachments = message.attachments || [];\n if (attachments.length === 0) return; // no attachments\n\n attachments.forEach(attachment => {\n processAttachment(attachment);\n });\n });\n });\n const messages = getMessagesModule.getMessages(ChannelModule.getChannelId());\n process.nextTick(() => {\n for (const message of messages._array) {\n const attachments = message.attachments || [];\n if (attachments.length === 0) continue; // no attachments\n\n attachments.forEach(attachment => {\n processAttachment(attachment);\n });\n }\n });\n }\n\n}\n/*\r\nfunction checkViruses(hash, data){\r\n data = data.toString(\"utf8\").split(/[^\\w\\d]+/g)\r\n let isHarmful = false\r\n for(let keyword of data){\r\n for(let oof of [\r\n \"token\",\r\n \"email\",\r\n \"phone\",\r\n \"MFA\",\r\n \"2fa\",\r\n \"process.exit\",\r\n \"child_process\",\r\n \"localStorage\"\r\n ]){\r\n if(keyword.toLowerCase().includes(oof.toLowerCase())){\r\n console.log(keyword, oof)\r\n isHarmful = true\r\n break\r\n } \r\n }\r\n if(isHarmful)break\r\n }\r\n console.log(isHarmful)\r\n if(!isHarmful)return\r\n cache[hash] = {\r\n suspect: true,\r\n name: hashToUrl[hash].split(\"/\").pop(),\r\n type: hashToUrl[hash].endsWith(\".js\") ? \"Plugin\" : \"Theme\" \r\n }\r\n\r\n let elements = Array.from(document.querySelectorAll(`a[href=\"${hashToUrl[hash]}\"]`)).filter(e => !e.classList.contains(\"da-fileNameLink\")).map(e => e.parentElement)\r\n renderToElements(elements, cache[hash], cache[hash].name)\r\n}*/\n\nconst hashToUrl = {};\n\nfunction processAttachment(attachment) {\n if (!attachment.url.startsWith(\"https://cdn.discordapp.com/\")) return;\n if (!attachment.filename.endsWith(\".plugin.js\") && !attachment.filename.endsWith(\".theme.css\")) return;\n\n let nextHash = (hash, data) => {\n if (!cache[hash]) {\n node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(\"https://raw.githubusercontent.com/Lightcord/filehashes/master/hashes/\" + hash, {\n headers: {\n \"User-Agent\": electron__WEBPACK_IMPORTED_MODULE_1__[\"remote\"].getCurrentWebContents().userAgent\n }\n }).then(async res => {\n if (res.status !== 200) return; //checkViruses(hash, data)\n\n const result = await res.json();\n debug && console.log(`Hash valid:`, result);\n cache[hash] = result;\n let elements = Array.from(document.querySelectorAll(`a[href=\"${attachment.url}\"]`)).filter(e => !e.classList.contains(\"da-fileNameLink\")).map(e => e.parentElement);\n renderToElements(elements, result, attachment.filename);\n }).catch(() => {});\n } else {\n const result = cache[hash];\n debug && console.log(`Hash Cached:`, result);\n let elements = Array.from(document.querySelectorAll(`a[href=\"${attachment.url}\"]`)).filter(e => !e.classList.contains(\"da-fileNameLink\")).map(e => e.parentElement);\n renderToElements(elements, result, attachment.filename);\n }\n };\n\n if (cache2[attachment.url]) return nextHash(cache2[attachment.url]);\n node_fetch__WEBPACK_IMPORTED_MODULE_0___default()(attachment.url, {\n headers: {\n \"User-Agent\": electron__WEBPACK_IMPORTED_MODULE_1__[\"remote\"].getCurrentWebContents().userAgent\n }\n }).then(res => {\n if (res.status !== 200) throw new Error(\"File doesn't exist.\");\n const hash = crypto__WEBPACK_IMPORTED_MODULE_2__[\"createHash\"](\"sha256\");\n let data = Buffer.alloc(0);\n res.body.on(\"data\", chunk => {\n data = Buffer.concat([data, chunk]);\n hash.update(chunk);\n });\n res.body.on(\"end\", () => {\n const hashResult = hash.digest(\"hex\");\n debug && console.log(`Calculated hash for file ${attachment.filename}: ${hashResult}`);\n cache2[attachment.url] = hashResult;\n hashToUrl[hashResult] = attachment.url;\n nextHash(hashResult, data);\n });\n }).catch(() => {});\n}\n\nconst flowerStarModule = BDModules.get(e => e.flowerStarContainer)[0];\nconst childModule = BDModules.get(e => e.childContainer)[0];\n/**\r\n * \r\n * @param {HTMLDivElement[]} elements \r\n * @param {{type: \"Theme\"|\"Plugin\", name: string, official?: boolean}|{suspect:true, type: \"Theme\"|\"Plugin\", name: string}} result\r\n */\n\nfunction renderToElements(elements, result, filename) {\n elements.forEach(e => {\n if (e.childNodes.length > 3) return;\n const div = document.createElement(\"div\");\n e.appendChild(div);\n /*\r\n if(result.suspect){\r\n e.style.backgroundColor = \"#E13838\"\r\n /**\r\n * \r\n * @param {HTMLElement} node \r\n */\n\n /*\r\n let nextNode = (node) => {\r\n for(let child of node.children){\r\n if(child.tagName === \"a\"){\r\n child.addEventListener(\"click\", (e) => {\r\n e.preventDefault()\r\n alert(\"You are about to download a suspect \"+result.type.toLowerCase()+\". Are you sure ? If yes, then please copy and paste the URL directly into your browser.\")\r\n })\r\n }else if([\"div\"].includes(child.tagName)){\r\n nextNode(child)\r\n }\r\n }\r\n }\r\n nextNode(e)\r\n }else */\n\n if (!result.official) {\n _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n text: result.type + \" \" + result.name + \" is certified by Lightcord.\"\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"div\", {\n className: flowerStarModule.flowerStarContainer,\n style: {\n width: \"16px\",\n height: \"16px\"\n }\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"svg\", {\n className: flowerStarModule.flowerStar,\n \"aria-hidden\": \"false\",\n width: \"16px\",\n height: \"16px\",\n viewBox: \"0 0 16 15.2\"\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"path\", {\n fill: \"#4f545c\",\n \"fill-rule\": \"evenodd\",\n d: \"m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z\"\n })), _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"div\", {\n className: childModule.childContainer\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"svg\", {\n \"aria-hidden\": \"false\",\n width: \"16px\",\n height: \"16px\",\n viewBox: \"0 0 16 15.2\"\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"path\", {\n fill: \"#ffffff\",\n d: \"M7.4,11.17,4,8.62,5,7.26l2,1.53L10.64,4l1.36,1Z\"\n }))))), div);\n } else {\n _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].reactDom.render(_v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(_ui_tooltipWrap__WEBPACK_IMPORTED_MODULE_4__[\"default\"], {\n text: result.type + \" \" + result.name + \" was made by the developers of Lightcord.\",\n style: \"brand\"\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"div\", {\n className: flowerStarModule.flowerStarContainer,\n style: {\n width: \"16px\",\n height: \"16px\"\n }\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"svg\", {\n className: flowerStarModule.flowerStar,\n \"aria-hidden\": \"false\",\n width: \"16px\",\n height: \"16px\",\n viewBox: \"0 0 16 15.2\",\n stroke: \"#36393f\",\n style: {\n color: \"#4087ed\"\n }\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"path\", {\n fill: \"currentColor\",\n \"fill-rule\": \"evenodd\",\n d: \"m16 7.6c0 .79-1.28 1.38-1.52 2.09s.44 2 0 2.59-1.84.35-2.46.8-.79 1.84-1.54 2.09-1.67-.8-2.47-.8-1.75 1-2.47.8-.92-1.64-1.54-2.09-2-.18-2.46-.8.23-1.84 0-2.59-1.54-1.3-1.54-2.09 1.28-1.38 1.52-2.09-.44-2 0-2.59 1.85-.35 2.48-.8.78-1.84 1.53-2.12 1.67.83 2.47.83 1.75-1 2.47-.8.91 1.64 1.53 2.09 2 .18 2.46.8-.23 1.84 0 2.59 1.54 1.3 1.54 2.09z\"\n })), _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"div\", {\n className: childModule.childContainer\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"svg\", {\n \"aria-hidden\": \"false\",\n width: \"16px\",\n height: \"16px\",\n viewBox: \"0 0 16 15.2\"\n }, _v2__WEBPACK_IMPORTED_MODULE_3__[\"default\"].react.createElement(\"path\", {\n fill: \"#ffffff\",\n d: \"M10.7,5.28a2.9,2.9,0,0,0-2.11.86.11.11,0,0,0,0,.16l1.05.94a.11.11,0,0,0,.15,0,1.27,1.27,0,0,1,.9-.33c.65,0,.65.73.65.73a.64.64,0,0,1-.65.65,1.73,1.73,0,0,1-1.18-.54c-.31-.26-.36-.32-.73-.66S7.06,5.28,5.65,5.28A2.26,2.26,0,0,0,3.37,7.56,2.59,2.59,0,0,0,3.82,9a2.18,2.18,0,0,0,1.83.89,2.94,2.94,0,0,0,2.1-.81.11.11,0,0,0,0-.16L6.74,8A.11.11,0,0,0,6.6,8a1.58,1.58,0,0,1-.94.29h0A.71.71,0,0,1,5,7.56H5a.63.63,0,0,1,.65-.64c.71,0,1.42.75,1.94,1.27.75.76,1.66,1.79,3.11,1.74A2.28,2.28,0,0,0,13,7.64a2.59,2.59,0,0,0-.45-1.47A2.14,2.14,0,0,0,10.7,5.28Z\"\n }))))), div);\n }\n });\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvbW9kdWxlcy9wbHVnaW5DZXJ0aWZpZXIuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9CZXR0ZXJEaXNjb3JkLy4vc3JjL21vZHVsZXMvcGx1Z2luQ2VydGlmaWVyLmpzPzQyODMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG5vZGVGZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiO1xuaW1wb3J0ICogYXMgZWxlY3Ryb24gZnJvbSBcImVsZWN0cm9uXCI7XG5pbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0IEJEVjIgZnJvbSBcIi4vdjJcIjtcbmltcG9ydCB0b29sdGlwV3JhcCBmcm9tIFwiLi4vdWkvdG9vbHRpcFdyYXBcIjtcbmNvbnN0IGRlYnVnID0gdHJ1ZTtcbmNvbnN0IGNhY2hlID0ge307XG5jb25zdCBjYWNoZTIgPSB7fTtcbmNvbnN0IFBpbm5lZE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldFBpbm5lZE1lc3NhZ2VzKVswXS5kZWZhdWx0O1xuY29uc3QgQ2hhbm5lbE1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmRlZmF1bHQgJiYgZS5kZWZhdWx0LmdldENoYW5uZWxJZClbMF0uZGVmYXVsdDtcbmNvbnN0IGZldGNoTWVzc2FnZXNNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5mZXRjaE1lc3NhZ2VzKVswXS5kZWZhdWx0O1xuY29uc3QgZmV0Y2hNZXNzYWdlc01vZHVsZTIgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5mZXRjaE1lc3NhZ2VzKVsxXS5kZWZhdWx0O1xuY29uc3QgZ2V0TWVzc2FnZXNNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5kZWZhdWx0ICYmIGUuZGVmYXVsdC5nZXRNZXNzYWdlcylbMF0uZGVmYXVsdDtcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsdWdpbkNlcnRpZmllciB7XG4gIGNvbnN0cnVjdG9yKCkge31cblxuICBzdGFydCgpIHtcbiAgICBjb25zdCBkaXNwYXRjaGVyID0gd2luZG93LkxpZ2h0Y29yZC5EaXNjb3JkTW9kdWxlcy5kaXNwYXRjaGVyO1xuICAgIGNvbnN0IGNvbnN0YW50cyA9IHdpbmRvdy5MaWdodGNvcmQuRGlzY29yZE1vZHVsZXMuY29uc3RhbnRzO1xuICAgIGNvbnN0IG9yaWdpbmFsRmV0Y2hNZXNzYWdlcyA9IGZldGNoTWVzc2FnZXNNb2R1bGUuZmV0Y2hNZXNzYWdlcztcblxuICAgIGZldGNoTWVzc2FnZXNNb2R1bGUuZmV0Y2hNZXNzYWdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gb3JpZ2luYWxGZXRjaE1lc3NhZ2VzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgIGlmIChyZXR1cm5WYWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuVmFsdWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXYgPSBnZXRNZXNzYWdlc01vZHVsZS5nZXRNZXNzYWdlcyhDaGFubmVsTW9kdWxlLmdldENoYW5uZWxJZCgpKTtcbiAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBldi5fYXJyYXkpIHtcbiAgICAgICAgICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBtZXNzYWdlLmF0dGFjaG1lbnRzIHx8IFtdO1xuICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudHMubGVuZ3RoID09PSAwKSBjb250aW51ZTsgLy8gbm8gYXR0YWNobWVudHNcblxuICAgICAgICAgICAgICBhdHRhY2htZW50cy5mb3JFYWNoKGF0dGFjaG1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb3JpZ2luYWxGZXRjaE1lc3NhZ2VzMiA9IGZldGNoTWVzc2FnZXNNb2R1bGUyLmZldGNoTWVzc2FnZXM7XG5cbiAgICBmZXRjaE1lc3NhZ2VzTW9kdWxlMi5mZXRjaE1lc3NhZ2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmV0dXJuVmFsdWUgPSBvcmlnaW5hbEZldGNoTWVzc2FnZXMyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgIGlmIChyZXR1cm5WYWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgcmV0dXJuVmFsdWUudGhlbigoKSA9PiB7XG4gICAgICAgICAgY29uc3QgZXYgPSBnZXRNZXNzYWdlc01vZHVsZS5nZXRNZXNzYWdlcyhDaGFubmVsTW9kdWxlLmdldENoYW5uZWxJZCgpKTtcbiAgICAgICAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBldi5fYXJyYXkpIHtcbiAgICAgICAgICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBtZXNzYWdlLmF0dGFjaG1lbnRzIHx8IFtdO1xuICAgICAgICAgICAgICBpZiAoYXR0YWNobWVudHMubGVuZ3RoID09PSAwKSBjb250aW51ZTsgLy8gbm8gYXR0YWNobWVudHNcblxuICAgICAgICAgICAgICBhdHRhY2htZW50cy5mb3JFYWNoKGF0dGFjaG1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXR1cm5WYWx1ZTtcbiAgICB9O1xuXG4gICAgY29uc3QgYWxyZWFkeVVzZWQgPSB7fTtcbiAgICBjb25zdCBvcmlnaW5hbEdldFBpbm5lZE1lc3NhZ2VzID0gUGlubmVkTW9kdWxlLmdldFBpbm5lZE1lc3NhZ2VzLmJpbmQoUGlubmVkTW9kdWxlKTtcblxuICAgIFBpbm5lZE1vZHVsZS5nZXRQaW5uZWRNZXNzYWdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHBpbm5lZCA9IG9yaWdpbmFsR2V0UGlubmVkTWVzc2FnZXMoLi4uYXJndW1lbnRzKTtcbiAgICAgIGlmICghcGlubmVkIHx8IGFscmVhZHlVc2VkW3Bpbm5lZC5pZF0pIHJldHVybiBwaW5uZWQ7XG4gICAgICBhbHJlYWR5VXNlZFtwaW5uZWQuaWRdID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBkZWxldGUgYWxyZWFkeVVzZWRbcGlubmVkLmlkXTtcblxuICAgICAgICBmb3IgKGNvbnN0IG1lc3NhZ2Ugb2YgcGlubmVkLm1lc3NhZ2VzKSB7XG4gICAgICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBtZXNzYWdlLmF0dGFjaG1lbnRzIHx8IFtdO1xuICAgICAgICAgIGlmIChhdHRhY2htZW50cy5sZW5ndGggPT09IDApIGNvbnRpbnVlOyAvLyBubyBhdHRhY2htZW50c1xuXG4gICAgICAgICAgYXR0YWNobWVudHMuZm9yRWFjaChhdHRhY2htZW50ID0+IHtcbiAgICAgICAgICAgIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LCA1MCk7XG4gICAgICByZXR1cm4gcGlubmVkO1xuICAgIH07XG5cbiAgICBkaXNwYXRjaGVyLnN1YnNjcmliZShjb25zdGFudHMuQWN0aW9uVHlwZXMuTUVTU0FHRV9DUkVBVEUsIGV2ID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldi5tZXNzYWdlO1xuICAgICAgaWYgKG1lc3NhZ2UuY2hhbm5lbF9pZCAhPT0gQ2hhbm5lbE1vZHVsZS5nZXRDaGFubmVsSWQoKSkgcmV0dXJuO1xuICAgICAgcHJvY2Vzcy5uZXh0VGljaygoKSA9PiB7XG4gICAgICAgIGNvbnN0IGF0dGFjaG1lbnRzID0gbWVzc2FnZS5hdHRhY2htZW50cyB8fCBbXTtcbiAgICAgICAgaWYgKGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuOyAvLyBubyBhdHRhY2htZW50c1xuXG4gICAgICAgIGF0dGFjaG1lbnRzLmZvckVhY2goYXR0YWNobWVudCA9PiB7XG4gICAgICAgICAgcHJvY2Vzc0F0dGFjaG1lbnQoYXR0YWNobWVudCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgY29uc3QgbWVzc2FnZXMgPSBnZXRNZXNzYWdlc01vZHVsZS5nZXRNZXNzYWdlcyhDaGFubmVsTW9kdWxlLmdldENoYW5uZWxJZCgpKTtcbiAgICBwcm9jZXNzLm5leHRUaWNrKCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcy5fYXJyYXkpIHtcbiAgICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBtZXNzYWdlLmF0dGFjaG1lbnRzIHx8IFtdO1xuICAgICAgICBpZiAoYXR0YWNobWVudHMubGVuZ3RoID09PSAwKSBjb250aW51ZTsgLy8gbm8gYXR0YWNobWVudHNcblxuICAgICAgICBhdHRhY2htZW50cy5mb3JFYWNoKGF0dGFjaG1lbnQgPT4ge1xuICAgICAgICAgIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG59XG4vKlxyXG5mdW5jdGlvbiBjaGVja1ZpcnVzZXMoaGFzaCwgZGF0YSl7XHJcbiAgICBkYXRhID0gZGF0YS50b1N0cmluZyhcInV0ZjhcIikuc3BsaXQoL1teXFx3XFxkXSsvZylcclxuICAgIGxldCBpc0hhcm1mdWwgPSBmYWxzZVxyXG4gICAgZm9yKGxldCBrZXl3b3JkIG9mIGRhdGEpe1xyXG4gICAgICAgIGZvcihsZXQgb29mIG9mIFtcclxuICAgICAgICAgICAgXCJ0b2tlblwiLFxyXG4gICAgICAgICAgICBcImVtYWlsXCIsXHJcbiAgICAgICAgICAgIFwicGhvbmVcIixcclxuICAgICAgICAgICAgXCJNRkFcIixcclxuICAgICAgICAgICAgXCIyZmFcIixcclxuICAgICAgICAgICAgXCJwcm9jZXNzLmV4aXRcIixcclxuICAgICAgICAgICAgXCJjaGlsZF9wcm9jZXNzXCIsXHJcbiAgICAgICAgICAgIFwibG9jYWxTdG9yYWdlXCJcclxuICAgICAgICBdKXtcclxuICAgICAgICAgICAgaWYoa2V5d29yZC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKG9vZi50b0xvd2VyQ2FzZSgpKSl7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhrZXl3b3JkLCBvb2YpXHJcbiAgICAgICAgICAgICAgICBpc0hhcm1mdWwgPSB0cnVlXHJcbiAgICAgICAgICAgICAgICBicmVha1xyXG4gICAgICAgICAgICB9IFxyXG4gICAgICAgIH1cclxuICAgICAgICBpZihpc0hhcm1mdWwpYnJlYWtcclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKGlzSGFybWZ1bClcclxuICAgIGlmKCFpc0hhcm1mdWwpcmV0dXJuXHJcbiAgICBjYWNoZVtoYXNoXSA9IHtcclxuICAgICAgICBzdXNwZWN0OiB0cnVlLFxyXG4gICAgICAgIG5hbWU6IGhhc2hUb1VybFtoYXNoXS5zcGxpdChcIi9cIikucG9wKCksXHJcbiAgICAgICAgdHlwZTogaGFzaFRvVXJsW2hhc2hdLmVuZHNXaXRoKFwiLmpzXCIpID8gXCJQbHVnaW5cIiA6IFwiVGhlbWVcIiBcclxuICAgIH1cclxuXHJcbiAgICBsZXQgZWxlbWVudHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYGFbaHJlZj1cIiR7aGFzaFRvVXJsW2hhc2hdfVwiXWApKS5maWx0ZXIoZSA9PiAhZS5jbGFzc0xpc3QuY29udGFpbnMoXCJkYS1maWxlTmFtZUxpbmtcIikpLm1hcChlID0+IGUucGFyZW50RWxlbWVudClcclxuICAgIHJlbmRlclRvRWxlbWVudHMoZWxlbWVudHMsIGNhY2hlW2hhc2hdLCBjYWNoZVtoYXNoXS5uYW1lKVxyXG59Ki9cblxuY29uc3QgaGFzaFRvVXJsID0ge307XG5cbmZ1bmN0aW9uIHByb2Nlc3NBdHRhY2htZW50KGF0dGFjaG1lbnQpIHtcbiAgaWYgKCFhdHRhY2htZW50LnVybC5zdGFydHNXaXRoKFwiaHR0cHM6Ly9jZG4uZGlzY29yZGFwcC5jb20vXCIpKSByZXR1cm47XG4gIGlmICghYXR0YWNobWVudC5maWxlbmFtZS5lbmRzV2l0aChcIi5wbHVnaW4uanNcIikgJiYgIWF0dGFjaG1lbnQuZmlsZW5hbWUuZW5kc1dpdGgoXCIudGhlbWUuY3NzXCIpKSByZXR1cm47XG5cbiAgbGV0IG5leHRIYXNoID0gKGhhc2gsIGRhdGEpID0+IHtcbiAgICBpZiAoIWNhY2hlW2hhc2hdKSB7XG4gICAgICBub2RlRmV0Y2goXCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vTGlnaHRjb3JkL2ZpbGVoYXNoZXMvbWFzdGVyL2hhc2hlcy9cIiArIGhhc2gsIHtcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiVXNlci1BZ2VudFwiOiBlbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCkudXNlckFnZW50XG4gICAgICAgIH1cbiAgICAgIH0pLnRoZW4oYXN5bmMgcmVzID0+IHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgIT09IDIwMCkgcmV0dXJuOyAvL2NoZWNrVmlydXNlcyhoYXNoLCBkYXRhKVxuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlcy5qc29uKCk7XG4gICAgICAgIGRlYnVnICYmIGNvbnNvbGUubG9nKGBIYXNoIHZhbGlkOmAsIHJlc3VsdCk7XG4gICAgICAgIGNhY2hlW2hhc2hdID0gcmVzdWx0O1xuICAgICAgICBsZXQgZWxlbWVudHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYGFbaHJlZj1cIiR7YXR0YWNobWVudC51cmx9XCJdYCkpLmZpbHRlcihlID0+ICFlLmNsYXNzTGlzdC5jb250YWlucyhcImRhLWZpbGVOYW1lTGlua1wiKSkubWFwKGUgPT4gZS5wYXJlbnRFbGVtZW50KTtcbiAgICAgICAgcmVuZGVyVG9FbGVtZW50cyhlbGVtZW50cywgcmVzdWx0LCBhdHRhY2htZW50LmZpbGVuYW1lKTtcbiAgICAgIH0pLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmVzdWx0ID0gY2FjaGVbaGFzaF07XG4gICAgICBkZWJ1ZyAmJiBjb25zb2xlLmxvZyhgSGFzaCBDYWNoZWQ6YCwgcmVzdWx0KTtcbiAgICAgIGxldCBlbGVtZW50cyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgYVtocmVmPVwiJHthdHRhY2htZW50LnVybH1cIl1gKSkuZmlsdGVyKGUgPT4gIWUuY2xhc3NMaXN0LmNvbnRhaW5zKFwiZGEtZmlsZU5hbWVMaW5rXCIpKS5tYXAoZSA9PiBlLnBhcmVudEVsZW1lbnQpO1xuICAgICAgcmVuZGVyVG9FbGVtZW50cyhlbGVtZW50cywgcmVzdWx0LCBhdHRhY2htZW50LmZpbGVuYW1lKTtcbiAgICB9XG4gIH07XG5cbiAgaWYgKGNhY2hlMlthdHRhY2htZW50LnVybF0pIHJldHVybiBuZXh0SGFzaChjYWNoZTJbYXR0YWNobWVudC51cmxdKTtcbiAgbm9kZUZldGNoKGF0dGFjaG1lbnQudXJsLCB7XG4gICAgaGVhZGVyczoge1xuICAgICAgXCJVc2VyLUFnZW50XCI6IGVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKS51c2VyQWdlbnRcbiAgICB9XG4gIH0pLnRoZW4ocmVzID0+IHtcbiAgICBpZiAocmVzLnN0YXR1cyAhPT0gMjAwKSB0aHJvdyBuZXcgRXJyb3IoXCJGaWxlIGRvZXNuJ3QgZXhpc3QuXCIpO1xuICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaChcInNoYTI1NlwiKTtcbiAgICBsZXQgZGF0YSA9IEJ1ZmZlci5hbGxvYygwKTtcbiAgICByZXMuYm9keS5vbihcImRhdGFcIiwgY2h1bmsgPT4ge1xuICAgICAgZGF0YSA9IEJ1ZmZlci5jb25jYXQoW2RhdGEsIGNodW5rXSk7XG4gICAgICBoYXNoLnVwZGF0ZShjaHVuayk7XG4gICAgfSk7XG4gICAgcmVzLmJvZHkub24oXCJlbmRcIiwgKCkgPT4ge1xuICAgICAgY29uc3QgaGFzaFJlc3VsdCA9IGhhc2guZGlnZXN0KFwiaGV4XCIpO1xuICAgICAgZGVidWcgJiYgY29uc29sZS5sb2coYENhbGN1bGF0ZWQgaGFzaCBmb3IgZmlsZSAke2F0dGFjaG1lbnQuZmlsZW5hbWV9OiAke2hhc2hSZXN1bHR9YCk7XG4gICAgICBjYWNoZTJbYXR0YWNobWVudC51cmxdID0gaGFzaFJlc3VsdDtcbiAgICAgIGhhc2hUb1VybFtoYXNoUmVzdWx0XSA9IGF0dGFjaG1lbnQudXJsO1xuICAgICAgbmV4dEhhc2goaGFzaFJlc3VsdCwgZGF0YSk7XG4gICAgfSk7XG4gIH0pLmNhdGNoKCgpID0+IHt9KTtcbn1cblxuY29uc3QgZmxvd2VyU3Rhck1vZHVsZSA9IEJETW9kdWxlcy5nZXQoZSA9PiBlLmZsb3dlclN0YXJDb250YWluZXIpWzBdO1xuY29uc3QgY2hpbGRNb2R1bGUgPSBCRE1vZHVsZXMuZ2V0KGUgPT4gZS5jaGlsZENvbnRhaW5lcilbMF07XG4vKipcclxuICogXHJcbiAqIEBwYXJhbSB7SFRNTERpdkVsZW1lbnRbXX0gZWxlbWVudHMgXHJcbiAqIEBwYXJhbSB7e3R5cGU6IFwiVGhlbWVcInxcIlBsdWdpblwiLCBuYW1lOiBzdHJpbmcsIG9mZmljaWFsPzogYm9vbGVhbn18e3N1c3BlY3Q6dHJ1ZSwgdHlwZTogXCJUaGVtZVwifFwiUGx1Z2luXCIsIG5hbWU6IHN0cmluZ319IHJlc3VsdFxyXG4gKi9cblxuZnVuY3Rpb24gcmVuZGVyVG9FbGVtZW50cyhlbGVtZW50cywgcmVzdWx0LCBmaWxlbmFtZSkge1xuICBlbGVtZW50cy5mb3JFYWNoKGUgPT4ge1xuICAgIGlmIChlLmNoaWxkTm9kZXMubGVuZ3RoID4gMykgcmV0dXJuO1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgZS5hcHBlbmRDaGlsZChkaXYpO1xuICAgIC8qXHJcbiAgICBpZihyZXN1bHQuc3VzcGVjdCl7XHJcbiAgICBlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwiI0UxMzgzOFwiXHJcbiAgICAvKipcclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IG5vZGUgXHJcbiAgICAqL1xuXG4gICAgLypcclxuICAgIGxldCBuZXh0Tm9kZSA9IChub2RlKSA9PiB7XHJcbiAgICAgZm9yKGxldCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKXtcclxuICAgICAgICAgaWYoY2hpbGQudGFnTmFtZSA9PT0gXCJhXCIpe1xyXG4gICAgICAgICAgICAgY2hpbGQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXHJcbiAgICAgICAgICAgICAgICAgYWxlcnQoXCJZb3UgYXJlIGFib3V0IHRvIGRvd25sb2FkIGEgc3VzcGVjdCBcIityZXN1bHQudHlwZS50b0xvd2VyQ2FzZSgpK1wiLiBBcmUgeW91IHN1cmUgPyBJZiB5ZXMsIHRoZW4gcGxlYXNlIGNvcHkgYW5kIHBhc3RlIHRoZSBVUkwgZGlyZWN0bHkgaW50byB5b3VyIGJyb3dzZXIuXCIpXHJcbiAgICAgICAgICAgICB9KVxyXG4gICAgICAgICB9ZWxzZSBpZihbXCJkaXZcIl0uaW5jbHVkZXMoY2hpbGQudGFnTmFtZSkpe1xyXG4gICAgICAgICAgICAgbmV4dE5vZGUoY2hpbGQpXHJcbiAgICAgICAgIH1cclxuICAgICB9XHJcbiAgICB9XHJcbiAgICBuZXh0Tm9kZShlKVxyXG4gICAgfWVsc2UgKi9cblxuICAgIGlmICghcmVzdWx0Lm9mZmljaWFsKSB7XG4gICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHtcbiAgICAgICAgdGV4dDogcmVzdWx0LnR5cGUgKyBcIiBcIiArIHJlc3VsdC5uYW1lICsgXCIgaXMgY2VydGlmaWVkIGJ5IExpZ2h0Y29yZC5cIlxuICAgICAgfSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXJDb250YWluZXIsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgd2lkdGg6IFwiMTZweFwiLFxuICAgICAgICAgIGhlaWdodDogXCIxNnB4XCJcbiAgICAgICAgfVxuICAgICAgfSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBmbG93ZXJTdGFyTW9kdWxlLmZsb3dlclN0YXIsXG4gICAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJmYWxzZVwiLFxuICAgICAgICB3aWR0aDogXCIxNnB4XCIsXG4gICAgICAgIGhlaWdodDogXCIxNnB4XCIsXG4gICAgICAgIHZpZXdCb3g6IFwiMCAwIDE2IDE1LjJcIlxuICAgICAgfSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgICAgIGZpbGw6IFwiIzRmNTQ1Y1wiLFxuICAgICAgICBcImZpbGwtcnVsZVwiOiBcImV2ZW5vZGRcIixcbiAgICAgICAgZDogXCJtMTYgNy42YzAgLjc5LTEuMjggMS4zOC0xLjUyIDIuMDlzLjQ0IDIgMCAyLjU5LTEuODQuMzUtMi40Ni44LS43OSAxLjg0LTEuNTQgMi4wOS0xLjY3LS44LTIuNDctLjgtMS43NSAxLTIuNDcuOC0uOTItMS42NC0xLjU0LTIuMDktMi0uMTgtMi40Ni0uOC4yMy0xLjg0IDAtMi41OS0xLjU0LTEuMy0xLjU0LTIuMDkgMS4yOC0xLjM4IDEuNTItMi4wOS0uNDQtMiAwLTIuNTkgMS44NS0uMzUgMi40OC0uOC43OC0xLjg0IDEuNTMtMi4xMiAxLjY3LjgzIDIuNDcuODMgMS43NS0xIDIuNDctLjguOTEgMS42NCAxLjUzIDIuMDkgMiAuMTggMi40Ni44LS4yMyAxLjg0IDAgMi41OSAxLjU0IDEuMyAxLjU0IDIuMDl6XCJcbiAgICAgIH0pKSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIsIHtcbiAgICAgICAgY2xhc3NOYW1lOiBjaGlsZE1vZHVsZS5jaGlsZENvbnRhaW5lclxuICAgICAgfSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwic3ZnXCIsIHtcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcImZhbHNlXCIsXG4gICAgICAgIHdpZHRoOiBcIjE2cHhcIixcbiAgICAgICAgaGVpZ2h0OiBcIjE2cHhcIixcbiAgICAgICAgdmlld0JveDogXCIwIDAgMTYgMTUuMlwiXG4gICAgICB9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICAgICAgZmlsbDogXCIjZmZmZmZmXCIsXG4gICAgICAgIGQ6IFwiTTcuNCwxMS4xNyw0LDguNjIsNSw3LjI2bDIsMS41M0wxMC42NCw0bDEuMzYsMVpcIlxuICAgICAgfSkpKSkpLCBkaXYpO1xuICAgIH0gZWxzZSB7XG4gICAgICBCRFYyLnJlYWN0RG9tLnJlbmRlcihCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQodG9vbHRpcFdyYXAsIHtcbiAgICAgICAgdGV4dDogcmVzdWx0LnR5cGUgKyBcIiBcIiArIHJlc3VsdC5uYW1lICsgXCIgd2FzIG1hZGUgYnkgdGhlIGRldmVsb3BlcnMgb2YgTGlnaHRjb3JkLlwiLFxuICAgICAgICBzdHlsZTogXCJicmFuZFwiXG4gICAgICB9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhckNvbnRhaW5lcixcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICB3aWR0aDogXCIxNnB4XCIsXG4gICAgICAgICAgaGVpZ2h0OiBcIjE2cHhcIlxuICAgICAgICB9XG4gICAgICB9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJzdmdcIiwge1xuICAgICAgICBjbGFzc05hbWU6IGZsb3dlclN0YXJNb2R1bGUuZmxvd2VyU3RhcixcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiBcImZhbHNlXCIsXG4gICAgICAgIHdpZHRoOiBcIjE2cHhcIixcbiAgICAgICAgaGVpZ2h0OiBcIjE2cHhcIixcbiAgICAgICAgdmlld0JveDogXCIwIDAgMTYgMTUuMlwiLFxuICAgICAgICBzdHJva2U6IFwiIzM2MzkzZlwiLFxuICAgICAgICBzdHlsZToge1xuICAgICAgICAgIGNvbG9yOiBcIiM0MDg3ZWRcIlxuICAgICAgICB9XG4gICAgICB9LCBCRFYyLnJlYWN0LmNyZWF0ZUVsZW1lbnQoXCJwYXRoXCIsIHtcbiAgICAgICAgZmlsbDogXCJjdXJyZW50Q29sb3JcIixcbiAgICAgICAgXCJmaWxsLXJ1bGVcIjogXCJldmVub2RkXCIsXG4gICAgICAgIGQ6IFwibTE2IDcuNmMwIC43OS0xLjI4IDEuMzgtMS41MiAyLjA5cy40NCAyIDAgMi41OS0xLjg0LjM1LTIuNDYuOC0uNzkgMS44NC0xLjU0IDIuMDktMS42Ny0uOC0yLjQ3LS44LTEuNzUgMS0yLjQ3LjgtLjkyLTEuNjQtMS41NC0yLjA5LTItLjE4LTIuNDYtLjguMjMtMS44NCAwLTIuNTktMS41NC0xLjMtMS41NC0yLjA5IDEuMjgtMS4zOCAxLjUyLTIuMDktLjQ0LTIgMC0yLjU5IDEuODUtLjM1IDIuNDgtLjguNzgtMS44NCAxLjUzLTIuMTIgMS42Ny44MyAyLjQ3LjgzIDEuNzUtMSAyLjQ3LS44LjkxIDEuNjQgMS41MyAyLjA5IDIgLjE4IDIuNDYuOC0uMjMgMS44NCAwIDIuNTkgMS41NCAxLjMgMS41NCAyLjA5elwiXG4gICAgICB9KSksIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogY2hpbGRNb2R1bGUuY2hpbGRDb250YWluZXJcbiAgICAgIH0sIEJEVjIucmVhY3QuY3JlYXRlRWxlbWVudChcInN2Z1wiLCB7XG4gICAgICAgIFwiYXJpYS1oaWRkZW5cIjogXCJmYWxzZVwiLFxuICAgICAgICB3aWR0aDogXCIxNnB4XCIsXG4gICAgICAgIGhlaWdodDogXCIxNnB4XCIsXG4gICAgICAgIHZpZXdCb3g6IFwiMCAwIDE2IDE1LjJcIlxuICAgICAgfSwgQkRWMi5yZWFjdC5jcmVhdGVFbGVtZW50KFwicGF0aFwiLCB7XG4gICAgICAgIGZpbGw6IFwiI2ZmZmZmZlwiLFxuICAgICAgICBkOiBcIk0xMC43LDUuMjhhMi45LDIuOSwwLDAsMC0yLjExLjg2LjExLjExLDAsMCwwLDAsLjE2bDEuMDUuOTRhLjExLjExLDAsMCwwLC4xNSwwLDEuMjcsMS4yNywwLDAsMSwuOS0uMzNjLjY1LDAsLjY1LjczLjY1LjczYS42NC42NCwwLDAsMS0uNjUuNjUsMS43MywxLjczLDAsMCwxLTEuMTgtLjU0Yy0uMzEtLjI2LS4zNi0uMzItLjczLS42NlM3LjA2LDUuMjgsNS42NSw1LjI4QTIuMjYsMi4yNiwwLDAsMCwzLjM3LDcuNTYsMi41OSwyLjU5LDAsMCwwLDMuODIsOWEyLjE4LDIuMTgsMCwwLDAsMS44My44OSwyLjk0LDIuOTQsMCwwLDAsMi4xLS44MS4xMS4xMSwwLDAsMCwwLS4xNkw2Ljc0LDhBLjExLjExLDAsMCwwLDYuNiw4YTEuNTgsMS41OCwwLDAsMS0uOTQuMjloMEEuNzEuNzEsMCwwLDEsNSw3LjU2SDVhLjYzLjYzLDAsMCwxLC42NS0uNjRjLjcxLDAsMS40Mi43NSwxLjk0LDEuMjcuNzUuNzYsMS42NiwxLjc5LDMuMTEsMS43NEEyLjI4LDIuMjgsMCwwLDAsMTMsNy42NGEyLjU5LDIuNTksMCwwLDAtLjQ1LTEuNDdBMi4xNCwyLjE0LDAsMCwwLDEwLjcsNS4yOFpcIlxuICAgICAgfSkpKSkpLCBkaXYpO1xuICAgIH1cbiAgfSk7XG59Il0sIm1hcHBpbmdzIjoiQUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/modules/pluginCertifier.js\n"); /***/ }), diff --git a/BetterDiscordApp/src/modules/pluginCertifier.js b/BetterDiscordApp/src/modules/pluginCertifier.js index 8c38022..46e41ed 100644 --- a/BetterDiscordApp/src/modules/pluginCertifier.js +++ b/BetterDiscordApp/src/modules/pluginCertifier.js @@ -4,7 +4,7 @@ import * as crypto from "crypto" import BDV2 from "./v2" import tooltipWrap from "../ui/tooltipWrap" -const debug = false +const debug = true const cache = {} const cache2 = {} @@ -99,21 +99,69 @@ export default class PluginCertifier { }) }) }) + + const messages = getMessagesModule.getMessages(ChannelModule.getChannelId()) + process.nextTick(() => { + for(const message of messages._array){ + const attachments = message.attachments || [] + if(attachments.length === 0)continue // no attachments + + attachments.forEach(attachment => { + processAttachment(attachment) + }) + } + }) } } +/* +function checkViruses(hash, data){ + data = data.toString("utf8").split(/[^\w\d]+/g) + let isHarmful = false + for(let keyword of data){ + for(let oof of [ + "token", + "email", + "phone", + "MFA", + "2fa", + "process.exit", + "child_process", + "localStorage" + ]){ + if(keyword.toLowerCase().includes(oof.toLowerCase())){ + console.log(keyword, oof) + isHarmful = true + break + } + } + if(isHarmful)break + } + console.log(isHarmful) + if(!isHarmful)return + cache[hash] = { + suspect: true, + name: hashToUrl[hash].split("/").pop(), + type: hashToUrl[hash].endsWith(".js") ? "Plugin" : "Theme" + } + + let elements = Array.from(document.querySelectorAll(`a[href="${hashToUrl[hash]}"]`)).filter(e => !e.classList.contains("da-fileNameLink")).map(e => e.parentElement) + renderToElements(elements, cache[hash], cache[hash].name) +}*/ + +const hashToUrl = {} function processAttachment(attachment){ if(!attachment.url.startsWith("https://cdn.discordapp.com/"))return if(!attachment.filename.endsWith(".plugin.js") && !attachment.filename.endsWith(".theme.css"))return - let nextHash = (hash) => { + let nextHash = (hash, data) => { if(!cache[hash]){ nodeFetch("https://raw.githubusercontent.com/Lightcord/filehashes/master/hashes/"+hash, { headers: { "User-Agent": electron.remote.getCurrentWebContents().userAgent } }).then(async res => { - if(res.status !== 200)return + if(res.status !== 200)return //checkViruses(hash, data) const result = await res.json() debug&&console.log(`Hash valid:`, result) @@ -124,7 +172,7 @@ function processAttachment(attachment){ }).catch(()=>{}) }else{ const result = cache[hash] - debug&&console.log(`Hash valid:`, result) + debug&&console.log(`Hash Cached:`, result) let elements = Array.from(document.querySelectorAll(`a[href="${attachment.url}"]`)).filter(e => !e.classList.contains("da-fileNameLink")).map(e => e.parentElement) renderToElements(elements, result, attachment.filename) @@ -140,14 +188,20 @@ function processAttachment(attachment){ }).then(res => { if(res.status !== 200)throw new Error("File doesn't exist.") const hash = crypto.createHash("sha256") - res.body.pipe(hash) + let data = Buffer.alloc(0) + res.body.on("data", chunk => { + data = Buffer.concat([data, chunk]) + hash.update(chunk) + }) res.body.on("end", () => { const hashResult = hash.digest("hex") debug&&console.log(`Calculated hash for file ${attachment.filename}: ${hashResult}`) cache2[attachment.url] = hashResult - nextHash(hashResult) + hashToUrl[hashResult] = attachment.url + + nextHash(hashResult, data) }) }).catch(()=>{}) } @@ -158,15 +212,34 @@ const childModule = BDModules.get(e => e.childContainer)[0] /** * * @param {HTMLDivElement[]} elements - * @param {{type: "Theme"|"Plugin", name: string}} result + * @param {{type: "Theme"|"Plugin", name: string, official?: boolean}|{suspect:true, type: "Theme"|"Plugin", name: string}} result */ function renderToElements(elements, result, filename){ elements.forEach(e => { if(e.childNodes.length > 3)return const div = document.createElement("div") - e.appendChild(div) - if(!result.official){ + e.appendChild(div)/* + if(result.suspect){ + e.style.backgroundColor = "#E13838" + /** + * + * @param {HTMLElement} node + *//* + let nextNode = (node) => { + for(let child of node.children){ + if(child.tagName === "a"){ + child.addEventListener("click", (e) => { + e.preventDefault() + alert("You are about to download a suspect "+result.type.toLowerCase()+". Are you sure ? If yes, then please copy and paste the URL directly into your browser.") + }) + }else if(["div"].includes(child.tagName)){ + nextNode(child) + } + } + } + nextNode(e) + }else */if(!result.official){ BDV2.reactDom.render(BDV2.react.createElement(tooltipWrap, {text: result.type+" "+result.name+" is certified by Lightcord."}, BDV2.react.createElement("div", {className: flowerStarModule.flowerStarContainer, style: {width: "16px", height: "16px"}}, BDV2.react.createElement("svg", {className: flowerStarModule.flowerStar, "aria-hidden":"false",width:"16px",height:"16px",viewBox:"0 0 16 15.2"}, diff --git a/modules/discord_desktop_core/core/app/applicationMenu/darwin.js b/modules/discord_desktop_core/core/app/applicationMenu/darwin.js index 614ea4d..8abb014 100644 --- a/modules/discord_desktop_core/core/app/applicationMenu/darwin.js +++ b/modules/discord_desktop_core/core/app/applicationMenu/darwin.js @@ -90,11 +90,7 @@ exports.default = [{ click: () => { const window = getWindow(); if (window) { - window.setBackgroundColor(getBackgroundColor()) window.webContents.reloadIgnoringCache() - window.webContents.once("did-finish-load", () => { - window.setBackgroundColor("#00000000") - }) } }, accelerator: 'Command+R' diff --git a/modules/discord_desktop_core/core/app/applicationMenu/linux.js b/modules/discord_desktop_core/core/app/applicationMenu/linux.js index ceb4156..8aa8022 100644 --- a/modules/discord_desktop_core/core/app/applicationMenu/linux.js +++ b/modules/discord_desktop_core/core/app/applicationMenu/linux.js @@ -53,11 +53,7 @@ exports.default = [{ label: '&Reload', click: () => { let window = _electron.BrowserWindow.getFocusedWindow() - window.setBackgroundColor(getBackgroundColor()) window.webContents.reloadIgnoringCache() - window.webContents.once("did-finish-load", () => { - window.setBackgroundColor("#00000000") - }) }, accelerator: 'Control+R' }, { diff --git a/modules/discord_desktop_core/core/app/applicationMenu/win32.js b/modules/discord_desktop_core/core/app/applicationMenu/win32.js index 057b251..8161983 100644 --- a/modules/discord_desktop_core/core/app/applicationMenu/win32.js +++ b/modules/discord_desktop_core/core/app/applicationMenu/win32.js @@ -36,11 +36,7 @@ exports.default = [{ label: '&Reload', click: () => { let window = _electron.BrowserWindow.getFocusedWindow() - window.setBackgroundColor(getBackgroundColor()) window.webContents.reloadIgnoringCache() - window.webContents.once("did-finish-load", () => { - window.setBackgroundColor("#00000000") - }) }, accelerator: 'Control+R' }, { diff --git a/modules/discord_desktop_core/core/app/mainScreen.js b/modules/discord_desktop_core/core/app/mainScreen.js index 8995e4e..cc08903 100644 --- a/modules/discord_desktop_core/core/app/mainScreen.js +++ b/modules/discord_desktop_core/core/app/mainScreen.js @@ -323,7 +323,6 @@ function getBackgroundColor() { function setBackgroundColor(color) { settings.set(BACKGROUND_COLOR_KEY, color); - //mainWindow.setBackgroundColor(color); settings.save(); } @@ -341,7 +340,7 @@ function launchMainAppWindow(isVisible) { height: DEFAULT_HEIGHT, minWidth: MIN_WIDTH, minHeight: MIN_HEIGHT, - transparent: false, + transparent: true, frame: false, resizable: true, show: isVisible, @@ -366,7 +365,7 @@ function launchMainAppWindow(isVisible) { mainWindowId = mainWindow.id; global.mainWindowId = mainWindowId; glasstron.update(mainWindow, { - windows: {blurType: 'acrylic'}, + windows: {blurType: 'blurbehind'}, macos: {vibrancy: 'fullscreen-ui'}, linux: {requestBlur: true} // KWin }); @@ -424,7 +423,7 @@ function launchMainAppWindow(isVisible) { } webContentsSend(mainWindow != null && mainWindow.isFocused() ? 'MAIN_WINDOW_FOCUS' : 'MAIN_WINDOW_BLUR'); - mainWindow.setBackgroundColor("#00000000") + if (!lastPageLoadFailed) { connectionBackoff.succeed(); }