Greasy Fork is available in English.
A real-time comment checker, Fuck YouTube’s opaque comment censorship
// ==UserScript== // @name youtube-comment-censor-detector // @name:zh-CN YouTube发评反诈 // @name:zh-TW YouTube發評反詐 // @namespace npm/vite-plugin-monkey // @version 3.3.0 // @author freedom-introvert // @description A real-time comment checker, Fuck YouTube’s opaque comment censorship // @description:zh-CN Fuck YouTube版“阿瓦隆系统”,实时检查评论状态,防止评论被儿童偷偷误食你还被蒙在鼓里 // @description:zh-TW Fuck YouTube版“阿瓦隆系統”,即時檢查評論狀態,防止評論被兒童偷偷誤食你還被蒙在鼓裡 // @license GPL // @icon https://raw.githubusercontent.com/freedom-introvert/youtube-comment-censor-detector/refs/heads/main/logo/logo_256x256.avif // @match *://*.youtube.com/* // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.global.prod.js // @require https://unpkg.com/vue-demi@latest/lib/index.iife.js // @require data:application/javascript,window.Vue%3DVue%3B // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/index.full.min.js // @resource element-plus/dist/index.css https://cdn.jsdelivr.net/npm/[email protected]/dist/index.css // @grant GM_addStyle // @grant GM_getResourceText // @grant GM_registerMenuCommand // @grant unsafeWindow // @run-at document-start // ==/UserScript== (a=>{if(typeof GM_addStyle=="function"){GM_addStyle(a);return}const e=document.createElement("style");e.textContent=a,document.head.append(e)})(" .el-message,.is-message-box{z-index:9999!important}.comment-checker[data-v-913ed6a0]{font-size:12px}.container[data-v-913ed6a0]{width:80%;margin:0 auto}.comment-checker[data-v-913ed6a0]{padding:15px 15px 11px;border-radius:8px;transition:background-color .3s}.title[data-v-913ed6a0]{font-weight:700;margin-bottom:6px}.message[data-v-913ed6a0]{margin-bottom:10px}.el-progress[data-v-913ed6a0]{margin-bottom:4px}.buttons[data-v-913ed6a0]>[data-v-913ed6a0]{display:inline-flex;align-items:center;padding:4px 8px;margin-left:-8px;color:#4b5e9d;border-radius:4px;transition:background-color .2s,color .2s;-webkit-user-select:none;user-select:none;margin-right:10px}.buttons[data-v-913ed6a0]>[data-v-913ed6a0]:hover{background-color:#0000000d}.buttons[data-v-913ed6a0]>[data-v-913ed6a0]:active{background-color:#0000001a}.comment-checker.not-check[data-v-913ed6a0]{background-color:#00f3}.comment-checker.normal[data-v-913ed6a0]{background-color:#0f03}.comment-checker.deleted[data-v-913ed6a0]{background-color:#f003}.comment-checker.shadow-ban[data-v-913ed6a0]{background-color:#ff03}.hot-ban-checker[data-v-c5ba1027]{background-color:#007bff1a;border:1px solid rgba(0,60,136,.4);border-radius:6px;padding:1rem;margin:10px 0}.title[data-v-c5ba1027]{font-weight:700;margin-bottom:6px}.message[data-v-c5ba1027]{margin-bottom:10px}.actions[data-v-c5ba1027]{margin-top:10px}.buttons[data-v-c5ba1027]>[data-v-c5ba1027]{display:inline-flex;align-items:center;padding:4px 8px;margin-left:-8px;color:#4b5e9d;border-radius:4px;transition:background-color .2s,color .2s;-webkit-user-select:none;user-select:none;margin-right:10px}.buttons[data-v-c5ba1027]>[data-v-c5ba1027]:hover{background-color:#0000000d}.buttons[data-v-c5ba1027]>[data-v-c5ba1027]:active{background-color:#0000001a}.comment-history-container[data-v-ad8c8fe3]{height:100%;display:flex;flex-direction:column;overflow:hidden}.toolbar[data-v-ad8c8fe3]{display:flex;align-items:center;gap:12px;padding-bottom:10px;flex-shrink:0}.comment-list[data-v-ad8c8fe3]{flex:1;min-height:0}[data-v-ad8c8fe3] .comment-list .el-table__inner-wrapper,[data-v-ad8c8fe3] .comment-list .el-scrollbar{height:100%}[data-v-ad8c8fe3] .comment-list .el-scrollbar__wrap{overflow-y:auto}.load-status[data-v-ad8c8fe3]{padding:12px 0;text-align:center;color:var(--el-text-color-secondary);font-size:13px;flex-shrink:0}.detail[data-v-ad8c8fe3]{margin-left:10px}.info-table td[data-v-ad8c8fe3]:nth-child(1){white-space:nowrap;vertical-align:top}.info-table td[data-v-ad8c8fe3]:nth-child(2){padding-left:16px}.comment-content[data-v-ad8c8fe3]{white-space:break-spaces;word-break:break-word}summary[data-v-ad8c8fe3]{cursor:pointer;margin-top:2px;-webkit-user-select:none;user-select:none}.locate-link[data-v-ad8c8fe3]{width:100%}[data-v-ad8c8fe3] .locate-link>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.post-locate-link[data-v-ad8c8fe3]{font-size:10px}.youtube-comment[data-v-e03141e7]{display:flex;align-items:flex-start;padding:16px;gap:16px;font-family:Roboto,sans-serif}.avatar-container[data-v-e03141e7]{flex-shrink:0}.avatar[data-v-e03141e7]{width:40px;height:40px;border-radius:50%;object-fit:cover}.comment-content[data-v-e03141e7]{flex:1;display:flex;flex-direction:column;gap:4px}.comment-header[data-v-e03141e7]{display:flex;align-items:center;gap:8px}.author-name[data-v-e03141e7]{font-size:13px;font-weight:500;color:#000;text-decoration:none;transition:color .2s ease}.published-at[data-v-e03141e7]{font-size:12px;color:#aaa}.comment-text[data-v-e03141e7]{font-size:14px;line-height:1.5;white-space:pre-wrap;word-break:break-word;margin:0}.comment-actions[data-v-e03141e7]{display:flex;align-items:center;gap:8px;margin-top:8px}[data-v-e03141e7] .button{display:flex;align-items:center;gap:4px;background-color:transparent;border:none;cursor:pointer;color:#aaa;font-size:12px;transition:opacity .2s ease;text-decoration:none;padding:1px 6px}[data-v-e03141e7] .button:hover{opacity:.5}[data-v-e03141e7] .icon{width:16px;height:16px;fill:currentColor}[data-v-e03141e7] .action-text{line-height:100%}.collected{color:#ffc107}.hot-ban-comment-searcher[data-v-658a2b6f],.not-comment-section[data-v-658a2b6f]{height:100%}.warning[data-v-658a2b6f]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%}.search-progress[data-v-658a2b6f]{display:flex;height:100%;flex-direction:column;justify-content:center;align-items:center;gap:15px}.warning-title[data-v-658a2b6f]{margin-bottom:4px}.warning-text[data-v-658a2b6f]{text-align:center;max-width:500px}.warning-divider[data-v-658a2b6f]{max-width:800px}.el-progress[data-v-658a2b6f]{width:300px}.footer[data-v-658a2b6f]{display:flex;flex-direction:column;align-items:center}.settings-container[data-v-a3a10182]{padding:16px}.title[data-v-a3a10182]{font-size:20px;font-weight:600;margin-bottom:20px}.setting-item[data-v-a3a10182]{display:flex;justify-content:space-between;align-items:center;margin:16px 0}.setting-info[data-v-a3a10182]{max-width:80%}.setting-label[data-v-a3a10182]{font-size:16px;font-weight:500}.setting-desc[data-v-a3a10182]{font-size:13px;color:#888;margin-top:4px}.el-input[data-v-a3a10182]{margin-top:10px}.toolbar{display:flex;align-items:center;gap:12px;padding-bottom:10px;flex-shrink:0}[data-v-ffd6c60d] .dialog-body{height:calc(100% - 40px);display:flex;flex-direction:column} "); (function (vue, ElementPlus) { 'use strict'; function sleep(time) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(); }, time); }); } function urlSafeBase64ToStandard(urlSafeBase64) { let standardBase64 = urlSafeBase64.replace(/%3D/g, "=").replace(/-/g, "+").replace(/_/g, "/"); return standardBase64; } function standardBase64ToUrlSafe(standardBase64) { let urlSafeBase64 = standardBase64.replace(/=/g, "%3D").replace(/\+/g, "-").replace(/\//g, "_"); return urlSafeBase64; } function base64ToU8Array(base642, urlSafe = true) { if (urlSafe) { base642 = urlSafeBase64ToStandard(base642); } return Uint8Array.from(atob(base642), (c) => c.charCodeAt(0)); } function u8ArrayToBase64(u8Array, urlSafe = true) { let base642 = btoa(String.fromCharCode(...u8Array)); if (urlSafe) { base642 = standardBase64ToUrlSafe(base642); } return base642; } function createUrl(path) { if (path) { return new URL(new URL(window.location.href).origin + path); } return new URL(window.location.href); } function formatSecondsToMMSS(seconds) { const sec = parseInt(seconds, 10); const minutes = Math.floor(sec / 60); const remainingSeconds = sec % 60; const formattedMinutes = String(minutes).padStart(2, "0"); const formattedSeconds = String(remainingSeconds).padStart(2, "0"); return `${formattedMinutes}:${formattedSeconds}`; } function formatTimestamp(timestamp) { if (!timestamp) { return "--:--:--"; } const date = new Date(timestamp); const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, "0"); const day = String(date.getDate()).padStart(2, "0"); const hours = String(date.getHours()).padStart(2, "0"); const minutes = String(date.getMinutes()).padStart(2, "0"); const seconds = String(date.getSeconds()).padStart(2, "0"); return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`; } function translateState(state) { switch (state) { case "NORMAL": return "正常"; case "DELETED": return "已删除"; case "SHADOW_BAN": return "仅自己可见"; case "NOT_CHECK": return "还未检查"; } } function findValueInSingleEntryArray(data, key) { for (const item of data) { if (item.hasOwnProperty(key)) { return item[key]; } } return void 0; } function nowDate() { var timestamp = /* @__PURE__ */ new Date(); var year = timestamp.getFullYear(); var month = timestamp.getMonth() + 1; var day = timestamp.getDate(); var hours = timestamp.getHours(); var minutes = timestamp.getMinutes(); var seconds = timestamp.getSeconds(); var dateStr = year + "-" + (month < 10 ? "0" + month : month) + "-" + (day < 10 ? "0" + day : day) + "_" + (hours < 10 ? "0" + hours : hours) + (minutes < 10 ? "0" + minutes : minutes) + (seconds < 10 ? "0" + seconds : seconds); return dateStr; } function validateObjectKeys(obj, requiredKeys) { if (typeof obj !== "object" || obj === null || !Array.isArray(requiredKeys)) { return false; } const objKeys = Object.keys(obj); if (objKeys.length !== requiredKeys.length) { return false; } return requiredKeys.every((key) => Object.prototype.hasOwnProperty.call(obj, key)); } function copyToClipboard(text) { return new Promise((resolve, reject) => { if (navigator.clipboard) { navigator.clipboard.writeText(text).then(() => { resolve(); }).catch((err) => { reject(err); }); } else { const textArea = document.createElement("textarea"); textArea.value = commentText; document.body.appendChild(textArea); textArea.select(); try { document.execCommand("copy"); document.body.removeChild(textArea); resolve(); } catch (err) { document.body.removeChild(textArea); reject(err); } } }); } const _export_sfc = (sfc, props) => { const target = sfc.__vccOpts || sfc; for (const [key, val] of props) { target[key] = val; } return target; }; const _hoisted_1$9 = { class: "title" }; const _hoisted_2$7 = { class: "message" }; const _hoisted_3$5 = { key: 0 }; const _hoisted_4$5 = { class: "message" }; const _hoisted_5$4 = { class: "buttons" }; const maxTimeSec = 120; const _sfc_main$a = { __name: "CommentChecker", setup(__props) { const check2 = vue.inject("check"); const hotBanCheck2 = vue.inject("hotBanCheck"); const commentRecord = vue.inject("commentRecord"); const onClose = vue.inject("onClose"); const onUnblock = vue.inject("onUnblock"); const interval = vue.inject("interval"); const unsafeWindow2 = vue.inject("unsafeWindow"); const settings2 = vue.inject("settings"); const showCancelButton = vue.ref(true); const showConfirmButton = vue.ref(false); const showCloseButton = vue.ref(false); const showHotBanCheckButton = vue.ref(false); const showStopHotBanCheckButton = vue.ref(false); const showLetMeAccessButtton = vue.ref(false); const showHotBanChecker = vue.ref(false); const stateClass = vue.ref("not-check"); const title = vue.ref("等待检查中……"); const message = vue.ref(""); const messageByHotCheck = vue.ref("等待检查中……"); let completed = false; let netErr = false; let hotBanCheckerController = { isCancelled: false }; let skipHotBanCheckWait = false; const stripedFlow = vue.ref(false); const currentTimeSec = vue.ref(0); const percentage = vue.computed(() => { if (currentTimeSec.value < 0 || currentTimeSec.value > maxTimeSec) { return 100; } else { return currentTimeSec.value / maxTimeSec * 100; } }); function format() { if (currentTimeSec.value < 0) { return `--:-- / ${formatSecondsToMMSS(maxTimeSec)}`; } else { return `${formatSecondsToMMSS(currentTimeSec.value)} / ${formatSecondsToMMSS(maxTimeSec)}`; } } let shown = null; let startTime = Date.now() / 1e3; async function startCheck() { while (currentTimeSec.value < maxTimeSec || netErr) { if (!netErr) { for (let i = interval; i > 0; i--) { message.value = "等待 " + i + "s 后检查评论状态"; await sleep(1e3); currentTimeSec.value = Date.now() / 1e3 - startTime; if (completed) { onStateCheckComplete(); return; } } } else { currentTimeSec.value = Date.now() / 1e3 - startTime; if (completed) { onStateCheckComplete(); return; } } message.value = "检查评论状态中……"; stripedFlow.value = true; try { await check2(commentRecord); } catch (err) { netErr = true; title.value = "网络错误,获取当前状态失败"; showConfirmButton.value = false; showCloseButton.value = true; stripedFlow.value = false; console.error(err); continue; } netErr = false; showCancelButton.value = false; showCloseButton.value = false; stripedFlow.value = false; if (commentRecord.currentState == "NORMAL") { title.value = "当前状态:正常"; stateClass.value = "normal"; shown = commentRecord.currentState; } else if (commentRecord.currentState == "SHADOW_BAN") { title.value = "当前状态:仅自己可见"; stateClass.value = "shadow-ban"; shown = commentRecord.currentState; } else if (commentRecord.currentState == "DELETED") { title.value = "当前状态:已被删除"; stateClass.value = "deleted"; if (shown) { completed = true; message.value = `不用等了,你的评论检查到的状态先从『${shown == "NORMAL" ? "正常" : "仅自己可见"}』再到删除,系统偷偷删了无疑。如果不信,你可以尝试编辑评论或添加回复来求证`; onStateCheckComplete(); return; } } showConfirmButton.value = true; } onStateCheckComplete(); completed = true; message.value = "观察时间已足够,当前状态可信,检查完毕"; if (settings2.autoHotBanCheck) { let count = tryGetCommentCount(); if (count && count <= parseInt(settings2.hotBanCheckCountCondition)) { checkHotBan(false); } } } function onStateCheckComplete() { showConfirmButton.value = false; showCloseButton.value = true; if (commentRecord.currentState == "NORMAL") { showHotBanCheckButton.value = true; } else if (commentRecord.currentState == "DELETED") { onUnblock(commentRecord); } } startCheck(); function cancelCheck() { completed = true; onClose(commentRecord); } function confirmCurrentState() { completed = true; message.value = "您已确认当前状态,检查完毕"; } function close() { onClose(commentRecord); } async function checkHotBan(needWarning = true) { if (needWarning && commentRecord.commentId.indexOf(".") == -1) { let count = tryGetCommentCount(); if (count > parseInt(settings2.hotBanCheckCountCondition)) { try { await ElementPlus.ElMessageBox.confirm( `确认检查吗?该检查需要遍历热门评论区,请注意评论区的评论数量(总数大于3000的评论区慎重考虑)! 数量太多将导致漫长的检查过程,同时频繁调用API可能会引发不可预料的后果!(当前评论区评论数量:${count ? count : "获取失败"})`, "警告", { confirmButtonText: "确定", cancelButtonText: "取消" } ); } catch (err) { return; } } } showCloseButton.value = false; showHotBanCheckButton.value = false; showHotBanChecker.value = true; showStopHotBanCheckButton.value = true; while (currentTimeSec.value < maxTimeSec && !hotBanCheckerController.isCancelled) { messageByHotCheck.value = `为避免检查误判,检查需要等待至状态可信任时开始,剩余 ${Math.floor(maxTimeSec - currentTimeSec.value)}s`; if (!skipHotBanCheckWait && currentTimeSec.value > 50) { showLetMeAccessButtton.value = true; } if (skipHotBanCheckWait) { break; } await sleep(1e3); if (hotBanCheckerController.isCancelled) { return; } currentTimeSec.value = Date.now() / 1e3 - startTime; } showLetMeAccessButtton.value = false; messageByHotCheck.value = "正在重新检查评论状态……"; await check2(commentRecord); if (commentRecord.currentState != "NORMAL") { if (commentRecord.currentState == "SHADOW_BAN") { title.value = "当前状态:仅自己可见"; stateClass.value = "shadow-ban"; messageByHotCheck.value = "评论已被ShadowBan,热门的屏蔽的检查已取消"; } else if (commentRecord.currentState == "DELETED") { title.value = "当前状态:已被删除"; stateClass.value = "deleted"; messageByHotCheck.value = "评论已被删除,热门的屏蔽的检查已取消"; } showStopHotBanCheckButton.value = false; showCloseButton.value = true; return; } messageByHotCheck.value = "评论状态正常,准备检查中……"; let observer = { onCountChange(c, p) { messageByHotCheck.value = `正在搜索热门列表,已搜寻至:第${c}个 第${p}页`; } }; if (await hotBanCheck2(commentRecord, observer, hotBanCheckerController)) { if (commentRecord.hotBan) { messageByHotCheck.value = "⚠ 你的评论未在热门列表找到,已被热门屏蔽,检查完成"; } else { messageByHotCheck.value = "✔ 你的评论已在热门列表找到,没有被热门屏蔽,检查完成"; } } showStopHotBanCheckButton.value = false; showCloseButton.value = true; } function tryGetCommentCount() { let count = null; let nodeList = unsafeWindow2.document.querySelectorAll("#count > yt-formatted-string"); if (nodeList) { for (let node of nodeList) { let text = node.innerText; if (text != "") { count = extractNumber(text); } } } console.log("当前评论区评论数量:" + (count ? count : "获取失败")); return count; } function extractNumber(str) { return parseInt(str.replace(/\D+/g, ""), 10) || 0; } function stopHotBanCheck() { hotBanCheckerController.isCancelled = true; messageByHotCheck.value = "你已终止热门屏蔽的检查"; showStopHotBanCheckButton.value = false; showCloseButton.value = true; } function letMeAccess() { skipHotBanCheckWait = true; showLetMeAccessButtton.value = false; } return (_ctx, _cache) => { const _component_el_progress = vue.resolveComponent("el-progress"); return vue.openBlock(), vue.createElementBlock("div", { class: vue.normalizeClass(["comment-checker", stateClass.value]) }, [ vue.createElementVNode("div", _hoisted_1$9, vue.toDisplayString(title.value), 1), vue.createElementVNode("div", _hoisted_2$7, vue.toDisplayString(message.value), 1), vue.createVNode(_component_el_progress, { percentage: percentage.value, striped: "", format, "striped-flow": stripedFlow.value }, null, 8, ["percentage", "striped-flow"]), showHotBanChecker.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$5, [ _cache[0] || (_cache[0] = vue.createElementVNode("div", { class: "title" }, "热门屏蔽检查", -1)), vue.createElementVNode("div", _hoisted_4$5, vue.toDisplayString(messageByHotCheck.value), 1) ])) : vue.createCommentVNode("", true), vue.createElementVNode("div", _hoisted_5$4, [ showCancelButton.value ? (vue.openBlock(), vue.createElementBlock("span", { key: 0, onClick: cancelCheck }, "取消")) : vue.createCommentVNode("", true), showConfirmButton.value ? (vue.openBlock(), vue.createElementBlock("span", { key: 1, onClick: confirmCurrentState }, "确认当前状态")) : vue.createCommentVNode("", true), showCloseButton.value ? (vue.openBlock(), vue.createElementBlock("span", { key: 2, onClick: close }, "关闭")) : vue.createCommentVNode("", true), showHotBanCheckButton.value ? (vue.openBlock(), vue.createElementBlock("span", { key: 3, onClick: checkHotBan }, "热门屏蔽检查")) : vue.createCommentVNode("", true), showStopHotBanCheckButton.value ? (vue.openBlock(), vue.createElementBlock("span", { key: 4, onClick: stopHotBanCheck }, "终止检查")) : vue.createCommentVNode("", true), showLetMeAccessButtton.value ? (vue.openBlock(), vue.createElementBlock("span", { key: 5, onClick: letMeAccess }, "让我检查!")) : vue.createCommentVNode("", true) ]) ], 2); }; } }; const CommentChecker = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__scopeId", "data-v-913ed6a0"]]); var commonjsGlobal = typeof globalThis !== "undefined" ? globalThis : typeof window !== "undefined" ? window : typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : {}; var indexMinimal = {}; var minimal$1 = {}; var aspromise; var hasRequiredAspromise; function requireAspromise() { if (hasRequiredAspromise) return aspromise; hasRequiredAspromise = 1; aspromise = asPromise; function asPromise(fn, ctx) { var params = new Array(arguments.length - 1), offset = 0, index = 2, pending = true; while (index < arguments.length) params[offset++] = arguments[index++]; return new Promise(function executor(resolve, reject) { params[offset] = function callback(err) { if (pending) { pending = false; if (err) reject(err); else { var params2 = new Array(arguments.length - 1), offset2 = 0; while (offset2 < params2.length) params2[offset2++] = arguments[offset2]; resolve.apply(null, params2); } } }; try { fn.apply(ctx || null, params); } catch (err) { if (pending) { pending = false; reject(err); } } }); } return aspromise; } var base64 = {}; var hasRequiredBase64; function requireBase64() { if (hasRequiredBase64) return base64; hasRequiredBase64 = 1; (function(exports) { var base642 = exports; base642.length = function length(string) { var p = string.length; if (!p) return 0; var n = 0; while (--p % 4 > 1 && string.charAt(p) === "=") ++n; return Math.ceil(string.length * 3) / 4 - n; }; var b64 = new Array(64); var s64 = new Array(123); for (var i = 0; i < 64; ) s64[b64[i] = i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i - 59 | 43] = i++; base642.encode = function encode(buffer, start, end) { var parts = null, chunk = []; var i2 = 0, j = 0, t; while (start < end) { var b = buffer[start++]; switch (j) { case 0: chunk[i2++] = b64[b >> 2]; t = (b & 3) << 4; j = 1; break; case 1: chunk[i2++] = b64[t | b >> 4]; t = (b & 15) << 2; j = 2; break; case 2: chunk[i2++] = b64[t | b >> 6]; chunk[i2++] = b64[b & 63]; j = 0; break; } if (i2 > 8191) { (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk)); i2 = 0; } } if (j) { chunk[i2++] = b64[t]; chunk[i2++] = 61; if (j === 1) chunk[i2++] = 61; } if (parts) { if (i2) parts.push(String.fromCharCode.apply(String, chunk.slice(0, i2))); return parts.join(""); } return String.fromCharCode.apply(String, chunk.slice(0, i2)); }; var invalidEncoding = "invalid encoding"; base642.decode = function decode(string, buffer, offset) { var start = offset; var j = 0, t; for (var i2 = 0; i2 < string.length; ) { var c = string.charCodeAt(i2++); if (c === 61 && j > 1) break; if ((c = s64[c]) === void 0) throw Error(invalidEncoding); switch (j) { case 0: t = c; j = 1; break; case 1: buffer[offset++] = t << 2 | (c & 48) >> 4; t = c; j = 2; break; case 2: buffer[offset++] = (t & 15) << 4 | (c & 60) >> 2; t = c; j = 3; break; case 3: buffer[offset++] = (t & 3) << 6 | c; j = 0; break; } } if (j === 1) throw Error(invalidEncoding); return offset - start; }; base642.test = function test(string) { return /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(string); }; })(base64); return base64; } var eventemitter; var hasRequiredEventemitter; function requireEventemitter() { if (hasRequiredEventemitter) return eventemitter; hasRequiredEventemitter = 1; eventemitter = EventEmitter; function EventEmitter() { this._listeners = {}; } EventEmitter.prototype.on = function on(evt, fn, ctx) { (this._listeners[evt] || (this._listeners[evt] = [])).push({ fn, ctx: ctx || this }); return this; }; EventEmitter.prototype.off = function off(evt, fn) { if (evt === void 0) this._listeners = {}; else { if (fn === void 0) this._listeners[evt] = []; else { var listeners = this._listeners[evt]; for (var i = 0; i < listeners.length; ) if (listeners[i].fn === fn) listeners.splice(i, 1); else ++i; } } return this; }; EventEmitter.prototype.emit = function emit(evt) { var listeners = this._listeners[evt]; if (listeners) { var args = [], i = 1; for (; i < arguments.length; ) args.push(arguments[i++]); for (i = 0; i < listeners.length; ) listeners[i].fn.apply(listeners[i++].ctx, args); } return this; }; return eventemitter; } var float; var hasRequiredFloat; function requireFloat() { if (hasRequiredFloat) return float; hasRequiredFloat = 1; float = factory(factory); function factory(exports) { if (typeof Float32Array !== "undefined") (function() { var f32 = new Float32Array([-0]), f8b = new Uint8Array(f32.buffer), le = f8b[3] === 128; function writeFloat_f32_cpy(val, buf, pos) { f32[0] = val; buf[pos] = f8b[0]; buf[pos + 1] = f8b[1]; buf[pos + 2] = f8b[2]; buf[pos + 3] = f8b[3]; } function writeFloat_f32_rev(val, buf, pos) { f32[0] = val; buf[pos] = f8b[3]; buf[pos + 1] = f8b[2]; buf[pos + 2] = f8b[1]; buf[pos + 3] = f8b[0]; } exports.writeFloatLE = le ? writeFloat_f32_cpy : writeFloat_f32_rev; exports.writeFloatBE = le ? writeFloat_f32_rev : writeFloat_f32_cpy; function readFloat_f32_cpy(buf, pos) { f8b[0] = buf[pos]; f8b[1] = buf[pos + 1]; f8b[2] = buf[pos + 2]; f8b[3] = buf[pos + 3]; return f32[0]; } function readFloat_f32_rev(buf, pos) { f8b[3] = buf[pos]; f8b[2] = buf[pos + 1]; f8b[1] = buf[pos + 2]; f8b[0] = buf[pos + 3]; return f32[0]; } exports.readFloatLE = le ? readFloat_f32_cpy : readFloat_f32_rev; exports.readFloatBE = le ? readFloat_f32_rev : readFloat_f32_cpy; })(); else (function() { function writeFloat_ieee754(writeUint, val, buf, pos) { var sign = val < 0 ? 1 : 0; if (sign) val = -val; if (val === 0) writeUint(1 / val > 0 ? ( /* positive */ 0 ) : ( /* negative 0 */ 2147483648 ), buf, pos); else if (isNaN(val)) writeUint(2143289344, buf, pos); else if (val > 34028234663852886e22) writeUint((sign << 31 | 2139095040) >>> 0, buf, pos); else if (val < 11754943508222875e-54) writeUint((sign << 31 | Math.round(val / 1401298464324817e-60)) >>> 0, buf, pos); else { var exponent = Math.floor(Math.log(val) / Math.LN2), mantissa = Math.round(val * Math.pow(2, -exponent) * 8388608) & 8388607; writeUint((sign << 31 | exponent + 127 << 23 | mantissa) >>> 0, buf, pos); } } exports.writeFloatLE = writeFloat_ieee754.bind(null, writeUintLE); exports.writeFloatBE = writeFloat_ieee754.bind(null, writeUintBE); function readFloat_ieee754(readUint, buf, pos) { var uint = readUint(buf, pos), sign = (uint >> 31) * 2 + 1, exponent = uint >>> 23 & 255, mantissa = uint & 8388607; return exponent === 255 ? mantissa ? NaN : sign * Infinity : exponent === 0 ? sign * 1401298464324817e-60 * mantissa : sign * Math.pow(2, exponent - 150) * (mantissa + 8388608); } exports.readFloatLE = readFloat_ieee754.bind(null, readUintLE); exports.readFloatBE = readFloat_ieee754.bind(null, readUintBE); })(); if (typeof Float64Array !== "undefined") (function() { var f64 = new Float64Array([-0]), f8b = new Uint8Array(f64.buffer), le = f8b[7] === 128; function writeDouble_f64_cpy(val, buf, pos) { f64[0] = val; buf[pos] = f8b[0]; buf[pos + 1] = f8b[1]; buf[pos + 2] = f8b[2]; buf[pos + 3] = f8b[3]; buf[pos + 4] = f8b[4]; buf[pos + 5] = f8b[5]; buf[pos + 6] = f8b[6]; buf[pos + 7] = f8b[7]; } function writeDouble_f64_rev(val, buf, pos) { f64[0] = val; buf[pos] = f8b[7]; buf[pos + 1] = f8b[6]; buf[pos + 2] = f8b[5]; buf[pos + 3] = f8b[4]; buf[pos + 4] = f8b[3]; buf[pos + 5] = f8b[2]; buf[pos + 6] = f8b[1]; buf[pos + 7] = f8b[0]; } exports.writeDoubleLE = le ? writeDouble_f64_cpy : writeDouble_f64_rev; exports.writeDoubleBE = le ? writeDouble_f64_rev : writeDouble_f64_cpy; function readDouble_f64_cpy(buf, pos) { f8b[0] = buf[pos]; f8b[1] = buf[pos + 1]; f8b[2] = buf[pos + 2]; f8b[3] = buf[pos + 3]; f8b[4] = buf[pos + 4]; f8b[5] = buf[pos + 5]; f8b[6] = buf[pos + 6]; f8b[7] = buf[pos + 7]; return f64[0]; } function readDouble_f64_rev(buf, pos) { f8b[7] = buf[pos]; f8b[6] = buf[pos + 1]; f8b[5] = buf[pos + 2]; f8b[4] = buf[pos + 3]; f8b[3] = buf[pos + 4]; f8b[2] = buf[pos + 5]; f8b[1] = buf[pos + 6]; f8b[0] = buf[pos + 7]; return f64[0]; } exports.readDoubleLE = le ? readDouble_f64_cpy : readDouble_f64_rev; exports.readDoubleBE = le ? readDouble_f64_rev : readDouble_f64_cpy; })(); else (function() { function writeDouble_ieee754(writeUint, off0, off1, val, buf, pos) { var sign = val < 0 ? 1 : 0; if (sign) val = -val; if (val === 0) { writeUint(0, buf, pos + off0); writeUint(1 / val > 0 ? ( /* positive */ 0 ) : ( /* negative 0 */ 2147483648 ), buf, pos + off1); } else if (isNaN(val)) { writeUint(0, buf, pos + off0); writeUint(2146959360, buf, pos + off1); } else if (val > 17976931348623157e292) { writeUint(0, buf, pos + off0); writeUint((sign << 31 | 2146435072) >>> 0, buf, pos + off1); } else { var mantissa; if (val < 22250738585072014e-324) { mantissa = val / 5e-324; writeUint(mantissa >>> 0, buf, pos + off0); writeUint((sign << 31 | mantissa / 4294967296) >>> 0, buf, pos + off1); } else { var exponent = Math.floor(Math.log(val) / Math.LN2); if (exponent === 1024) exponent = 1023; mantissa = val * Math.pow(2, -exponent); writeUint(mantissa * 4503599627370496 >>> 0, buf, pos + off0); writeUint((sign << 31 | exponent + 1023 << 20 | mantissa * 1048576 & 1048575) >>> 0, buf, pos + off1); } } } exports.writeDoubleLE = writeDouble_ieee754.bind(null, writeUintLE, 0, 4); exports.writeDoubleBE = writeDouble_ieee754.bind(null, writeUintBE, 4, 0); function readDouble_ieee754(readUint, off0, off1, buf, pos) { var lo = readUint(buf, pos + off0), hi = readUint(buf, pos + off1); var sign = (hi >> 31) * 2 + 1, exponent = hi >>> 20 & 2047, mantissa = 4294967296 * (hi & 1048575) + lo; return exponent === 2047 ? mantissa ? NaN : sign * Infinity : exponent === 0 ? sign * 5e-324 * mantissa : sign * Math.pow(2, exponent - 1075) * (mantissa + 4503599627370496); } exports.readDoubleLE = readDouble_ieee754.bind(null, readUintLE, 0, 4); exports.readDoubleBE = readDouble_ieee754.bind(null, readUintBE, 4, 0); })(); return exports; } function writeUintLE(val, buf, pos) { buf[pos] = val & 255; buf[pos + 1] = val >>> 8 & 255; buf[pos + 2] = val >>> 16 & 255; buf[pos + 3] = val >>> 24; } function writeUintBE(val, buf, pos) { buf[pos] = val >>> 24; buf[pos + 1] = val >>> 16 & 255; buf[pos + 2] = val >>> 8 & 255; buf[pos + 3] = val & 255; } function readUintLE(buf, pos) { return (buf[pos] | buf[pos + 1] << 8 | buf[pos + 2] << 16 | buf[pos + 3] << 24) >>> 0; } function readUintBE(buf, pos) { return (buf[pos] << 24 | buf[pos + 1] << 16 | buf[pos + 2] << 8 | buf[pos + 3]) >>> 0; } return float; } var inquire_1; var hasRequiredInquire; function requireInquire() { if (hasRequiredInquire) return inquire_1; hasRequiredInquire = 1; inquire_1 = inquire; function inquire(moduleName) { try { var mod = eval("quire".replace(/^/, "re"))(moduleName); if (mod && (mod.length || Object.keys(mod).length)) return mod; } catch (e) { } return null; } return inquire_1; } var utf8 = {}; var hasRequiredUtf8; function requireUtf8() { if (hasRequiredUtf8) return utf8; hasRequiredUtf8 = 1; (function(exports) { var utf82 = exports; utf82.length = function utf8_length(string) { var len = 0, c = 0; for (var i = 0; i < string.length; ++i) { c = string.charCodeAt(i); if (c < 128) len += 1; else if (c < 2048) len += 2; else if ((c & 64512) === 55296 && (string.charCodeAt(i + 1) & 64512) === 56320) { ++i; len += 4; } else len += 3; } return len; }; utf82.read = function utf8_read(buffer, start, end) { var len = end - start; if (len < 1) return ""; var parts = null, chunk = [], i = 0, t; while (start < end) { t = buffer[start++]; if (t < 128) chunk[i++] = t; else if (t > 191 && t < 224) chunk[i++] = (t & 31) << 6 | buffer[start++] & 63; else if (t > 239 && t < 365) { t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 65536; chunk[i++] = 55296 + (t >> 10); chunk[i++] = 56320 + (t & 1023); } else chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63; if (i > 8191) { (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk)); i = 0; } } if (parts) { if (i) parts.push(String.fromCharCode.apply(String, chunk.slice(0, i))); return parts.join(""); } return String.fromCharCode.apply(String, chunk.slice(0, i)); }; utf82.write = function utf8_write(string, buffer, offset) { var start = offset, c1, c2; for (var i = 0; i < string.length; ++i) { c1 = string.charCodeAt(i); if (c1 < 128) { buffer[offset++] = c1; } else if (c1 < 2048) { buffer[offset++] = c1 >> 6 | 192; buffer[offset++] = c1 & 63 | 128; } else if ((c1 & 64512) === 55296 && ((c2 = string.charCodeAt(i + 1)) & 64512) === 56320) { c1 = 65536 + ((c1 & 1023) << 10) + (c2 & 1023); ++i; buffer[offset++] = c1 >> 18 | 240; buffer[offset++] = c1 >> 12 & 63 | 128; buffer[offset++] = c1 >> 6 & 63 | 128; buffer[offset++] = c1 & 63 | 128; } else { buffer[offset++] = c1 >> 12 | 224; buffer[offset++] = c1 >> 6 & 63 | 128; buffer[offset++] = c1 & 63 | 128; } } return offset - start; }; })(utf8); return utf8; } var pool_1; var hasRequiredPool; function requirePool() { if (hasRequiredPool) return pool_1; hasRequiredPool = 1; pool_1 = pool; function pool(alloc, slice, size) { var SIZE = size || 8192; var MAX = SIZE >>> 1; var slab = null; var offset = SIZE; return function pool_alloc(size2) { if (size2 < 1 || size2 > MAX) return alloc(size2); if (offset + size2 > SIZE) { slab = alloc(SIZE); offset = 0; } var buf = slice.call(slab, offset, offset += size2); if (offset & 7) offset = (offset | 7) + 1; return buf; }; } return pool_1; } var longbits; var hasRequiredLongbits; function requireLongbits() { if (hasRequiredLongbits) return longbits; hasRequiredLongbits = 1; longbits = LongBits; var util = requireMinimal$1(); function LongBits(lo, hi) { this.lo = lo >>> 0; this.hi = hi >>> 0; } var zero = LongBits.zero = new LongBits(0, 0); zero.toNumber = function() { return 0; }; zero.zzEncode = zero.zzDecode = function() { return this; }; zero.length = function() { return 1; }; var zeroHash = LongBits.zeroHash = "\0\0\0\0\0\0\0\0"; LongBits.fromNumber = function fromNumber(value) { if (value === 0) return zero; var sign = value < 0; if (sign) value = -value; var lo = value >>> 0, hi = (value - lo) / 4294967296 >>> 0; if (sign) { hi = ~hi >>> 0; lo = ~lo >>> 0; if (++lo > 4294967295) { lo = 0; if (++hi > 4294967295) hi = 0; } } return new LongBits(lo, hi); }; LongBits.from = function from(value) { if (typeof value === "number") return LongBits.fromNumber(value); if (util.isString(value)) { if (util.Long) value = util.Long.fromString(value); else return LongBits.fromNumber(parseInt(value, 10)); } return value.low || value.high ? new LongBits(value.low >>> 0, value.high >>> 0) : zero; }; LongBits.prototype.toNumber = function toNumber(unsigned) { if (!unsigned && this.hi >>> 31) { var lo = ~this.lo + 1 >>> 0, hi = ~this.hi >>> 0; if (!lo) hi = hi + 1 >>> 0; return -(lo + hi * 4294967296); } return this.lo + this.hi * 4294967296; }; LongBits.prototype.toLong = function toLong(unsigned) { return util.Long ? new util.Long(this.lo | 0, this.hi | 0, Boolean(unsigned)) : { low: this.lo | 0, high: this.hi | 0, unsigned: Boolean(unsigned) }; }; var charCodeAt = String.prototype.charCodeAt; LongBits.fromHash = function fromHash(hash) { if (hash === zeroHash) return zero; return new LongBits( (charCodeAt.call(hash, 0) | charCodeAt.call(hash, 1) << 8 | charCodeAt.call(hash, 2) << 16 | charCodeAt.call(hash, 3) << 24) >>> 0, (charCodeAt.call(hash, 4) | charCodeAt.call(hash, 5) << 8 | charCodeAt.call(hash, 6) << 16 | charCodeAt.call(hash, 7) << 24) >>> 0 ); }; LongBits.prototype.toHash = function toHash() { return String.fromCharCode( this.lo & 255, this.lo >>> 8 & 255, this.lo >>> 16 & 255, this.lo >>> 24, this.hi & 255, this.hi >>> 8 & 255, this.hi >>> 16 & 255, this.hi >>> 24 ); }; LongBits.prototype.zzEncode = function zzEncode() { var mask = this.hi >> 31; this.hi = ((this.hi << 1 | this.lo >>> 31) ^ mask) >>> 0; this.lo = (this.lo << 1 ^ mask) >>> 0; return this; }; LongBits.prototype.zzDecode = function zzDecode() { var mask = -(this.lo & 1); this.lo = ((this.lo >>> 1 | this.hi << 31) ^ mask) >>> 0; this.hi = (this.hi >>> 1 ^ mask) >>> 0; return this; }; LongBits.prototype.length = function length() { var part0 = this.lo, part1 = (this.lo >>> 28 | this.hi << 4) >>> 0, part2 = this.hi >>> 24; return part2 === 0 ? part1 === 0 ? part0 < 16384 ? part0 < 128 ? 1 : 2 : part0 < 2097152 ? 3 : 4 : part1 < 16384 ? part1 < 128 ? 5 : 6 : part1 < 2097152 ? 7 : 8 : part2 < 128 ? 9 : 10; }; return longbits; } var hasRequiredMinimal$1; function requireMinimal$1() { if (hasRequiredMinimal$1) return minimal$1; hasRequiredMinimal$1 = 1; (function(exports) { var util = exports; util.asPromise = requireAspromise(); util.base64 = requireBase64(); util.EventEmitter = requireEventemitter(); util.float = requireFloat(); util.inquire = requireInquire(); util.utf8 = requireUtf8(); util.pool = requirePool(); util.LongBits = requireLongbits(); util.isNode = Boolean(typeof commonjsGlobal !== "undefined" && commonjsGlobal && commonjsGlobal.process && commonjsGlobal.process.versions && commonjsGlobal.process.versions.node); util.global = util.isNode && commonjsGlobal || typeof window !== "undefined" && window || typeof self !== "undefined" && self || minimal$1; util.emptyArray = Object.freeze ? Object.freeze([]) : ( /* istanbul ignore next */ [] ); util.emptyObject = Object.freeze ? Object.freeze({}) : ( /* istanbul ignore next */ {} ); util.isInteger = Number.isInteger || /* istanbul ignore next */ function isInteger(value) { return typeof value === "number" && isFinite(value) && Math.floor(value) === value; }; util.isString = function isString(value) { return typeof value === "string" || value instanceof String; }; util.isObject = function isObject2(value) { return value && typeof value === "object"; }; util.isset = /** * Checks if a property on a message is considered to be present. * @param {Object} obj Plain object or message instance * @param {string} prop Property name * @returns {boolean} `true` if considered to be present, otherwise `false` */ util.isSet = function isSet(obj, prop) { var value = obj[prop]; if (value != null && obj.hasOwnProperty(prop)) return typeof value !== "object" || (Array.isArray(value) ? value.length : Object.keys(value).length) > 0; return false; }; util.Buffer = function() { try { var Buffer = util.inquire("buffer").Buffer; return Buffer.prototype.utf8Write ? Buffer : ( /* istanbul ignore next */ null ); } catch (e) { return null; } }(); util._Buffer_from = null; util._Buffer_allocUnsafe = null; util.newBuffer = function newBuffer(sizeOrArray) { return typeof sizeOrArray === "number" ? util.Buffer ? util._Buffer_allocUnsafe(sizeOrArray) : new util.Array(sizeOrArray) : util.Buffer ? util._Buffer_from(sizeOrArray) : typeof Uint8Array === "undefined" ? sizeOrArray : new Uint8Array(sizeOrArray); }; util.Array = typeof Uint8Array !== "undefined" ? Uint8Array : Array; util.Long = /* istanbul ignore next */ util.global.dcodeIO && /* istanbul ignore next */ util.global.dcodeIO.Long || /* istanbul ignore next */ util.global.Long || util.inquire("long"); util.key2Re = /^true|false|0|1$/; util.key32Re = /^-?(?:0|[1-9][0-9]*)$/; util.key64Re = /^(?:[\\x00-\\xff]{8}|-?(?:0|[1-9][0-9]*))$/; util.longToHash = function longToHash(value) { return value ? util.LongBits.from(value).toHash() : util.LongBits.zeroHash; }; util.longFromHash = function longFromHash(hash, unsigned) { var bits = util.LongBits.fromHash(hash); if (util.Long) return util.Long.fromBits(bits.lo, bits.hi, unsigned); return bits.toNumber(Boolean(unsigned)); }; function merge(dst, src, ifNotSet) { for (var keys = Object.keys(src), i = 0; i < keys.length; ++i) if (dst[keys[i]] === void 0 || !ifNotSet) dst[keys[i]] = src[keys[i]]; return dst; } util.merge = merge; util.lcFirst = function lcFirst(str) { return str.charAt(0).toLowerCase() + str.substring(1); }; function newError(name) { function CustomError(message, properties) { if (!(this instanceof CustomError)) return new CustomError(message, properties); Object.defineProperty(this, "message", { get: function() { return message; } }); if (Error.captureStackTrace) Error.captureStackTrace(this, CustomError); else Object.defineProperty(this, "stack", { value: new Error().stack || "" }); if (properties) merge(this, properties); } CustomError.prototype = Object.create(Error.prototype, { constructor: { value: CustomError, writable: true, enumerable: false, configurable: true }, name: { get: function get() { return name; }, set: void 0, enumerable: false, // configurable: false would accurately preserve the behavior of // the original, but I'm guessing that was not intentional. // For an actual error subclass, this property would // be configurable. configurable: true }, toString: { value: function value() { return this.name + ": " + this.message; }, writable: true, enumerable: false, configurable: true } }); return CustomError; } util.newError = newError; util.ProtocolError = newError("ProtocolError"); util.oneOfGetter = function getOneOf(fieldNames) { var fieldMap = {}; for (var i = 0; i < fieldNames.length; ++i) fieldMap[fieldNames[i]] = 1; return function() { for (var keys = Object.keys(this), i2 = keys.length - 1; i2 > -1; --i2) if (fieldMap[keys[i2]] === 1 && this[keys[i2]] !== void 0 && this[keys[i2]] !== null) return keys[i2]; }; }; util.oneOfSetter = function setOneOf(fieldNames) { return function(name) { for (var i = 0; i < fieldNames.length; ++i) if (fieldNames[i] !== name) delete this[fieldNames[i]]; }; }; util.toJSONOptions = { longs: String, enums: String, bytes: String, json: true }; util._configure = function() { var Buffer = util.Buffer; if (!Buffer) { util._Buffer_from = util._Buffer_allocUnsafe = null; return; } util._Buffer_from = Buffer.from !== Uint8Array.from && Buffer.from || /* istanbul ignore next */ function Buffer_from(value, encoding) { return new Buffer(value, encoding); }; util._Buffer_allocUnsafe = Buffer.allocUnsafe || /* istanbul ignore next */ function Buffer_allocUnsafe(size) { return new Buffer(size); }; }; })(minimal$1); return minimal$1; } var writer; var hasRequiredWriter; function requireWriter() { if (hasRequiredWriter) return writer; hasRequiredWriter = 1; writer = Writer; var util = requireMinimal$1(); var BufferWriter; var LongBits = util.LongBits, base642 = util.base64, utf82 = util.utf8; function Op(fn, len, val) { this.fn = fn; this.len = len; this.next = void 0; this.val = val; } function noop2() { } function State(writer2) { this.head = writer2.head; this.tail = writer2.tail; this.len = writer2.len; this.next = writer2.states; } function Writer() { this.len = 0; this.head = new Op(noop2, 0, 0); this.tail = this.head; this.states = null; } var create = function create2() { return util.Buffer ? function create_buffer_setup() { return (Writer.create = function create_buffer() { return new BufferWriter(); })(); } : function create_array() { return new Writer(); }; }; Writer.create = create(); Writer.alloc = function alloc(size) { return new util.Array(size); }; if (util.Array !== Array) Writer.alloc = util.pool(Writer.alloc, util.Array.prototype.subarray); Writer.prototype._push = function push(fn, len, val) { this.tail = this.tail.next = new Op(fn, len, val); this.len += len; return this; }; function writeByte(val, buf, pos) { buf[pos] = val & 255; } function writeVarint32(val, buf, pos) { while (val > 127) { buf[pos++] = val & 127 | 128; val >>>= 7; } buf[pos] = val; } function VarintOp(len, val) { this.len = len; this.next = void 0; this.val = val; } VarintOp.prototype = Object.create(Op.prototype); VarintOp.prototype.fn = writeVarint32; Writer.prototype.uint32 = function write_uint32(value) { this.len += (this.tail = this.tail.next = new VarintOp( (value = value >>> 0) < 128 ? 1 : value < 16384 ? 2 : value < 2097152 ? 3 : value < 268435456 ? 4 : 5, value )).len; return this; }; Writer.prototype.int32 = function write_int32(value) { return value < 0 ? this._push(writeVarint64, 10, LongBits.fromNumber(value)) : this.uint32(value); }; Writer.prototype.sint32 = function write_sint32(value) { return this.uint32((value << 1 ^ value >> 31) >>> 0); }; function writeVarint64(val, buf, pos) { while (val.hi) { buf[pos++] = val.lo & 127 | 128; val.lo = (val.lo >>> 7 | val.hi << 25) >>> 0; val.hi >>>= 7; } while (val.lo > 127) { buf[pos++] = val.lo & 127 | 128; val.lo = val.lo >>> 7; } buf[pos++] = val.lo; } Writer.prototype.uint64 = function write_uint64(value) { var bits = LongBits.from(value); return this._push(writeVarint64, bits.length(), bits); }; Writer.prototype.int64 = Writer.prototype.uint64; Writer.prototype.sint64 = function write_sint64(value) { var bits = LongBits.from(value).zzEncode(); return this._push(writeVarint64, bits.length(), bits); }; Writer.prototype.bool = function write_bool(value) { return this._push(writeByte, 1, value ? 1 : 0); }; function writeFixed32(val, buf, pos) { buf[pos] = val & 255; buf[pos + 1] = val >>> 8 & 255; buf[pos + 2] = val >>> 16 & 255; buf[pos + 3] = val >>> 24; } Writer.prototype.fixed32 = function write_fixed32(value) { return this._push(writeFixed32, 4, value >>> 0); }; Writer.prototype.sfixed32 = Writer.prototype.fixed32; Writer.prototype.fixed64 = function write_fixed64(value) { var bits = LongBits.from(value); return this._push(writeFixed32, 4, bits.lo)._push(writeFixed32, 4, bits.hi); }; Writer.prototype.sfixed64 = Writer.prototype.fixed64; Writer.prototype.float = function write_float(value) { return this._push(util.float.writeFloatLE, 4, value); }; Writer.prototype.double = function write_double(value) { return this._push(util.float.writeDoubleLE, 8, value); }; var writeBytes = util.Array.prototype.set ? function writeBytes_set(val, buf, pos) { buf.set(val, pos); } : function writeBytes_for(val, buf, pos) { for (var i = 0; i < val.length; ++i) buf[pos + i] = val[i]; }; Writer.prototype.bytes = function write_bytes(value) { var len = value.length >>> 0; if (!len) return this._push(writeByte, 1, 0); if (util.isString(value)) { var buf = Writer.alloc(len = base642.length(value)); base642.decode(value, buf, 0); value = buf; } return this.uint32(len)._push(writeBytes, len, value); }; Writer.prototype.string = function write_string(value) { var len = utf82.length(value); return len ? this.uint32(len)._push(utf82.write, len, value) : this._push(writeByte, 1, 0); }; Writer.prototype.fork = function fork() { this.states = new State(this); this.head = this.tail = new Op(noop2, 0, 0); this.len = 0; return this; }; Writer.prototype.reset = function reset() { if (this.states) { this.head = this.states.head; this.tail = this.states.tail; this.len = this.states.len; this.states = this.states.next; } else { this.head = this.tail = new Op(noop2, 0, 0); this.len = 0; } return this; }; Writer.prototype.ldelim = function ldelim() { var head = this.head, tail = this.tail, len = this.len; this.reset().uint32(len); if (len) { this.tail.next = head.next; this.tail = tail; this.len += len; } return this; }; Writer.prototype.finish = function finish() { var head = this.head.next, buf = this.constructor.alloc(this.len), pos = 0; while (head) { head.fn(head.val, buf, pos); pos += head.len; head = head.next; } return buf; }; Writer._configure = function(BufferWriter_) { BufferWriter = BufferWriter_; Writer.create = create(); BufferWriter._configure(); }; return writer; } var writer_buffer; var hasRequiredWriter_buffer; function requireWriter_buffer() { if (hasRequiredWriter_buffer) return writer_buffer; hasRequiredWriter_buffer = 1; writer_buffer = BufferWriter; var Writer = requireWriter(); (BufferWriter.prototype = Object.create(Writer.prototype)).constructor = BufferWriter; var util = requireMinimal$1(); function BufferWriter() { Writer.call(this); } BufferWriter._configure = function() { BufferWriter.alloc = util._Buffer_allocUnsafe; BufferWriter.writeBytesBuffer = util.Buffer && util.Buffer.prototype instanceof Uint8Array && util.Buffer.prototype.set.name === "set" ? function writeBytesBuffer_set(val, buf, pos) { buf.set(val, pos); } : function writeBytesBuffer_copy(val, buf, pos) { if (val.copy) val.copy(buf, pos, 0, val.length); else for (var i = 0; i < val.length; ) buf[pos++] = val[i++]; }; }; BufferWriter.prototype.bytes = function write_bytes_buffer(value) { if (util.isString(value)) value = util._Buffer_from(value, "base64"); var len = value.length >>> 0; this.uint32(len); if (len) this._push(BufferWriter.writeBytesBuffer, len, value); return this; }; function writeStringBuffer(val, buf, pos) { if (val.length < 40) util.utf8.write(val, buf, pos); else if (buf.utf8Write) buf.utf8Write(val, pos); else buf.write(val, pos); } BufferWriter.prototype.string = function write_string_buffer(value) { var len = util.Buffer.byteLength(value); this.uint32(len); if (len) this._push(writeStringBuffer, len, value); return this; }; BufferWriter._configure(); return writer_buffer; } var reader; var hasRequiredReader; function requireReader() { if (hasRequiredReader) return reader; hasRequiredReader = 1; reader = Reader; var util = requireMinimal$1(); var BufferReader; var LongBits = util.LongBits, utf82 = util.utf8; function indexOutOfRange(reader2, writeLength) { return RangeError("index out of range: " + reader2.pos + " + " + (writeLength || 1) + " > " + reader2.len); } function Reader(buffer) { this.buf = buffer; this.pos = 0; this.len = buffer.length; } var create_array = typeof Uint8Array !== "undefined" ? function create_typed_array(buffer) { if (buffer instanceof Uint8Array || Array.isArray(buffer)) return new Reader(buffer); throw Error("illegal buffer"); } : function create_array2(buffer) { if (Array.isArray(buffer)) return new Reader(buffer); throw Error("illegal buffer"); }; var create = function create2() { return util.Buffer ? function create_buffer_setup(buffer) { return (Reader.create = function create_buffer(buffer2) { return util.Buffer.isBuffer(buffer2) ? new BufferReader(buffer2) : create_array(buffer2); })(buffer); } : create_array; }; Reader.create = create(); Reader.prototype._slice = util.Array.prototype.subarray || /* istanbul ignore next */ util.Array.prototype.slice; Reader.prototype.uint32 = /* @__PURE__ */ function read_uint32_setup() { var value = 4294967295; return function read_uint32() { value = (this.buf[this.pos] & 127) >>> 0; if (this.buf[this.pos++] < 128) return value; value = (value | (this.buf[this.pos] & 127) << 7) >>> 0; if (this.buf[this.pos++] < 128) return value; value = (value | (this.buf[this.pos] & 127) << 14) >>> 0; if (this.buf[this.pos++] < 128) return value; value = (value | (this.buf[this.pos] & 127) << 21) >>> 0; if (this.buf[this.pos++] < 128) return value; value = (value | (this.buf[this.pos] & 15) << 28) >>> 0; if (this.buf[this.pos++] < 128) return value; if ((this.pos += 5) > this.len) { this.pos = this.len; throw indexOutOfRange(this, 10); } return value; }; }(); Reader.prototype.int32 = function read_int32() { return this.uint32() | 0; }; Reader.prototype.sint32 = function read_sint32() { var value = this.uint32(); return value >>> 1 ^ -(value & 1) | 0; }; function readLongVarint() { var bits = new LongBits(0, 0); var i = 0; if (this.len - this.pos > 4) { for (; i < 4; ++i) { bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0; if (this.buf[this.pos++] < 128) return bits; } bits.lo = (bits.lo | (this.buf[this.pos] & 127) << 28) >>> 0; bits.hi = (bits.hi | (this.buf[this.pos] & 127) >> 4) >>> 0; if (this.buf[this.pos++] < 128) return bits; i = 0; } else { for (; i < 3; ++i) { if (this.pos >= this.len) throw indexOutOfRange(this); bits.lo = (bits.lo | (this.buf[this.pos] & 127) << i * 7) >>> 0; if (this.buf[this.pos++] < 128) return bits; } bits.lo = (bits.lo | (this.buf[this.pos++] & 127) << i * 7) >>> 0; return bits; } if (this.len - this.pos > 4) { for (; i < 5; ++i) { bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0; if (this.buf[this.pos++] < 128) return bits; } } else { for (; i < 5; ++i) { if (this.pos >= this.len) throw indexOutOfRange(this); bits.hi = (bits.hi | (this.buf[this.pos] & 127) << i * 7 + 3) >>> 0; if (this.buf[this.pos++] < 128) return bits; } } throw Error("invalid varint encoding"); } Reader.prototype.bool = function read_bool() { return this.uint32() !== 0; }; function readFixed32_end(buf, end) { return (buf[end - 4] | buf[end - 3] << 8 | buf[end - 2] << 16 | buf[end - 1] << 24) >>> 0; } Reader.prototype.fixed32 = function read_fixed32() { if (this.pos + 4 > this.len) throw indexOutOfRange(this, 4); return readFixed32_end(this.buf, this.pos += 4); }; Reader.prototype.sfixed32 = function read_sfixed32() { if (this.pos + 4 > this.len) throw indexOutOfRange(this, 4); return readFixed32_end(this.buf, this.pos += 4) | 0; }; function readFixed64() { if (this.pos + 8 > this.len) throw indexOutOfRange(this, 8); return new LongBits(readFixed32_end(this.buf, this.pos += 4), readFixed32_end(this.buf, this.pos += 4)); } Reader.prototype.float = function read_float() { if (this.pos + 4 > this.len) throw indexOutOfRange(this, 4); var value = util.float.readFloatLE(this.buf, this.pos); this.pos += 4; return value; }; Reader.prototype.double = function read_double() { if (this.pos + 8 > this.len) throw indexOutOfRange(this, 4); var value = util.float.readDoubleLE(this.buf, this.pos); this.pos += 8; return value; }; Reader.prototype.bytes = function read_bytes() { var length = this.uint32(), start = this.pos, end = this.pos + length; if (end > this.len) throw indexOutOfRange(this, length); this.pos += length; if (Array.isArray(this.buf)) return this.buf.slice(start, end); if (start === end) { var nativeBuffer = util.Buffer; return nativeBuffer ? nativeBuffer.alloc(0) : new this.buf.constructor(0); } return this._slice.call(this.buf, start, end); }; Reader.prototype.string = function read_string() { var bytes = this.bytes(); return utf82.read(bytes, 0, bytes.length); }; Reader.prototype.skip = function skip(length) { if (typeof length === "number") { if (this.pos + length > this.len) throw indexOutOfRange(this, length); this.pos += length; } else { do { if (this.pos >= this.len) throw indexOutOfRange(this); } while (this.buf[this.pos++] & 128); } return this; }; Reader.prototype.skipType = function(wireType) { switch (wireType) { case 0: this.skip(); break; case 1: this.skip(8); break; case 2: this.skip(this.uint32()); break; case 3: while ((wireType = this.uint32() & 7) !== 4) { this.skipType(wireType); } break; case 5: this.skip(4); break; /* istanbul ignore next */ default: throw Error("invalid wire type " + wireType + " at offset " + this.pos); } return this; }; Reader._configure = function(BufferReader_) { BufferReader = BufferReader_; Reader.create = create(); BufferReader._configure(); var fn = util.Long ? "toLong" : ( /* istanbul ignore next */ "toNumber" ); util.merge(Reader.prototype, { int64: function read_int64() { return readLongVarint.call(this)[fn](false); }, uint64: function read_uint64() { return readLongVarint.call(this)[fn](true); }, sint64: function read_sint64() { return readLongVarint.call(this).zzDecode()[fn](false); }, fixed64: function read_fixed64() { return readFixed64.call(this)[fn](true); }, sfixed64: function read_sfixed64() { return readFixed64.call(this)[fn](false); } }); }; return reader; } var reader_buffer; var hasRequiredReader_buffer; function requireReader_buffer() { if (hasRequiredReader_buffer) return reader_buffer; hasRequiredReader_buffer = 1; reader_buffer = BufferReader; var Reader = requireReader(); (BufferReader.prototype = Object.create(Reader.prototype)).constructor = BufferReader; var util = requireMinimal$1(); function BufferReader(buffer) { Reader.call(this, buffer); } BufferReader._configure = function() { if (util.Buffer) BufferReader.prototype._slice = util.Buffer.prototype.slice; }; BufferReader.prototype.string = function read_string_buffer() { var len = this.uint32(); return this.buf.utf8Slice ? this.buf.utf8Slice(this.pos, this.pos = Math.min(this.pos + len, this.len)) : this.buf.toString("utf-8", this.pos, this.pos = Math.min(this.pos + len, this.len)); }; BufferReader._configure(); return reader_buffer; } var rpc = {}; var service; var hasRequiredService; function requireService() { if (hasRequiredService) return service; hasRequiredService = 1; service = Service; var util = requireMinimal$1(); (Service.prototype = Object.create(util.EventEmitter.prototype)).constructor = Service; function Service(rpcImpl, requestDelimited, responseDelimited) { if (typeof rpcImpl !== "function") throw TypeError("rpcImpl must be a function"); util.EventEmitter.call(this); this.rpcImpl = rpcImpl; this.requestDelimited = Boolean(requestDelimited); this.responseDelimited = Boolean(responseDelimited); } Service.prototype.rpcCall = function rpcCall(method, requestCtor, responseCtor, request, callback) { if (!request) throw TypeError("request must be specified"); var self2 = this; if (!callback) return util.asPromise(rpcCall, self2, method, requestCtor, responseCtor, request); if (!self2.rpcImpl) { setTimeout(function() { callback(Error("already ended")); }, 0); return void 0; } try { return self2.rpcImpl( method, requestCtor[self2.requestDelimited ? "encodeDelimited" : "encode"](request).finish(), function rpcCallback(err, response) { if (err) { self2.emit("error", err, method); return callback(err); } if (response === null) { self2.end( /* endedByRPC */ true ); return void 0; } if (!(response instanceof responseCtor)) { try { response = responseCtor[self2.responseDelimited ? "decodeDelimited" : "decode"](response); } catch (err2) { self2.emit("error", err2, method); return callback(err2); } } self2.emit("data", response, method); return callback(null, response); } ); } catch (err) { self2.emit("error", err, method); setTimeout(function() { callback(err); }, 0); return void 0; } }; Service.prototype.end = function end(endedByRPC) { if (this.rpcImpl) { if (!endedByRPC) this.rpcImpl(null, null, null); this.rpcImpl = null; this.emit("end").off(); } return this; }; return service; } var hasRequiredRpc; function requireRpc() { if (hasRequiredRpc) return rpc; hasRequiredRpc = 1; (function(exports) { var rpc2 = exports; rpc2.Service = requireService(); })(rpc); return rpc; } var roots; var hasRequiredRoots; function requireRoots() { if (hasRequiredRoots) return roots; hasRequiredRoots = 1; roots = {}; return roots; } var hasRequiredIndexMinimal; function requireIndexMinimal() { if (hasRequiredIndexMinimal) return indexMinimal; hasRequiredIndexMinimal = 1; (function(exports) { var protobuf = exports; protobuf.build = "minimal"; protobuf.Writer = requireWriter(); protobuf.BufferWriter = requireWriter_buffer(); protobuf.Reader = requireReader(); protobuf.BufferReader = requireReader_buffer(); protobuf.util = requireMinimal$1(); protobuf.rpc = requireRpc(); protobuf.roots = requireRoots(); protobuf.configure = configure; function configure() { protobuf.util._configure(); protobuf.Writer._configure(protobuf.BufferWriter); protobuf.Reader._configure(protobuf.BufferReader); } configure(); })(indexMinimal); return indexMinimal; } var minimal; var hasRequiredMinimal; function requireMinimal() { if (hasRequiredMinimal) return minimal; hasRequiredMinimal = 1; minimal = requireIndexMinimal(); return minimal; } var minimalExports = requireMinimal(); const $Reader$2 = minimalExports.Reader, $Writer$1 = minimalExports.Writer; const $root$3 = minimalExports.roots["default"] || (minimalExports.roots["default"] = {}); const NextContinuation = $root$3.NextContinuation = (() => { function NextContinuation2(p) { if (p) { for (var ks = Object.keys(p), i = 0; i < ks.length; ++i) if (p[ks[i]] != null) this[ks[i]] = p[ks[i]]; } } NextContinuation2.prototype.commentAreaWrapper = null; NextContinuation2.prototype.uField3 = 0; NextContinuation2.prototype.mainCommentRequest = null; NextContinuation2.encode = function encode(m, w) { if (!w) w = $Writer$1.create(); if (m.commentAreaWrapper != null && Object.hasOwnProperty.call(m, "commentAreaWrapper")) $root$3.CommentAreaWrapper.encode(m.commentAreaWrapper, w.uint32(18).fork()).ldelim(); if (m.uField3 != null && Object.hasOwnProperty.call(m, "uField3")) w.uint32(24).int32(m.uField3); if (m.mainCommentRequest != null && Object.hasOwnProperty.call(m, "mainCommentRequest")) $root$3.MainCommentRequest.encode(m.mainCommentRequest, w.uint32(50).fork()).ldelim(); return w; }; NextContinuation2.decode = function decode(r, l, e) { if (!(r instanceof $Reader$2)) r = $Reader$2.create(r); var c = l === void 0 ? r.len : r.pos + l, m = new $root$3.NextContinuation(); while (r.pos < c) { var t = r.uint32(); if (t === e) break; switch (t >>> 3) { case 2: { m.commentAreaWrapper = $root$3.CommentAreaWrapper.decode(r, r.uint32()); break; } case 3: { m.uField3 = r.int32(); break; } case 6: { m.mainCommentRequest = $root$3.MainCommentRequest.decode(r, r.uint32()); break; } default: r.skipType(t & 7); break; } } return m; }; return NextContinuation2; })(); $root$3.CommentAreaWrapper = (() => { function CommentAreaWrapper(p) { if (p) { for (var ks = Object.keys(p), i = 0; i < ks.length; ++i) if (p[ks[i]] != null) this[ks[i]] = p[ks[i]]; } } CommentAreaWrapper.prototype.videoId = ""; CommentAreaWrapper.encode = function encode(m, w) { if (!w) w = $Writer$1.create(); if (m.videoId != null && Object.hasOwnProperty.call(m, "videoId")) w.uint32(18).string(m.videoId); return w; }; CommentAreaWrapper.decode = function decode(r, l, e) { if (!(r instanceof $Reader$2)) r = $Reader$2.create(r); var c = l === void 0 ? r.len : r.pos + l, m = new $root$3.CommentAreaWrapper(); while (r.pos < c) { var t = r.uint32(); if (t === e) break; switch (t >>> 3) { case 2: { m.videoId = r.string(); break; } default: r.skipType(t & 7); break; } } return m; }; return CommentAreaWrapper; })(); $root$3.MainCommentRequest = (() => { function MainCommentRequest(p) { if (p) { for (var ks = Object.keys(p), i = 0; i < ks.length; ++i) if (p[ks[i]] != null) this[ks[i]] = p[ks[i]]; } } MainCommentRequest.prototype.commentParameters = null; MainCommentRequest.prototype.commentReplyParameters = null; MainCommentRequest.prototype.sectionIdentifier = ""; MainCommentRequest.encode = function encode(m, w) { if (!w) w = $Writer$1.create(); if (m.commentReplyParameters != null && Object.hasOwnProperty.call(m, "commentReplyParameters")) $root$3.CommentReplyParameters.encode(m.commentReplyParameters, w.uint32(26).fork()).ldelim(); if (m.commentParameters != null && Object.hasOwnProperty.call(m, "commentParameters")) $root$3.CommentParameters.encode(m.commentParameters, w.uint32(34).fork()).ldelim(); if (m.sectionIdentifier != null && Object.hasOwnProperty.call(m, "sectionIdentifier")) w.uint32(66).string(m.sectionIdentifier); return w; }; MainCommentRequest.decode = function decode(r, l, e) { if (!(r instanceof $Reader$2)) r = $Reader$2.create(r); var c = l === void 0 ? r.len : r.pos + l, m = new $root$3.MainCommentRequest(); while (r.pos < c) { var t = r.uint32(); if (t === e) break; switch (t >>> 3) { case 4: { m.commentParameters = $root$3.CommentParameters.decode(r, r.uint32()); break; } case 3: { m.commentReplyParameters = $root$3.CommentReplyParameters.decode(r, r.uint32()); break; } case 8: { m.sectionIdentifier = r.string(); break; } default: r.skipType(t & 7); break; } } return m; }; return MainCommentRequest; })(); $root$3.CommentParameters = (() => { function CommentParameters(p) { if (p) { for (var ks = Object.keys(p), i = 0; i < ks.length; ++i) if (p[ks[i]] != null) this[ks[i]] = p[ks[i]]; } } CommentParameters.prototype.videoId = ""; CommentParameters.prototype.postId = ""; CommentParameters.prototype.channelId = ""; CommentParameters.prototype.sortType = 0; CommentParameters.prototype.targetCommentId = ""; CommentParameters.encode = function encode(m, w) { if (!w) w = $Writer$1.create(); if (m.videoId != null && Object.hasOwnProperty.call(m, "videoId")) w.uint32(34).string(m.videoId); if (m.sortType != null && Object.hasOwnProperty.call(m, "sortType")) w.uint32(48).int32(m.sortType); if (m.targetCommentId != null && Object.hasOwnProperty.call(m, "targetCommentId")) w.uint32(130).string(m.targetCommentId); if (m.postId != null && Object.hasOwnProperty.call(m, "postId")) w.uint32(234).string(m.postId); if (m.channelId != null && Object.hasOwnProperty.call(m, "channelId")) w.uint32(242).string(m.channelId); return w; }; CommentParameters.decode = function decode(r, l, e) { if (!(r instanceof $Reader$2)) r = $Reader$2.create(r); var c = l === void 0 ? r.len : r.pos + l, m = new $root$3.CommentParameters(); while (r.pos < c) { var t = r.uint32(); if (t === e) break; switch (t >>> 3) { case 4: { m.videoId = r.string(); break; } case 29: { m.postId = r.string(); break; } case 30: { m.channelId = r.string(); break; } case 6: { m.sortType = r.int32(); break; } case 16: { m.targetCommentId = r.string(); break; } default: r.skipType(t & 7); break; } } return m; }; CommentParameters.SortType = function() { const valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "HOT"] = 0; values[valuesById[1] = "LATEST"] = 1; return values; }(); return CommentParameters; })(); $root$3.CommentReplyParameters = (() => { function CommentReplyParameters(p) { if (p) { for (var ks = Object.keys(p), i = 0; i < ks.length; ++i) if (p[ks[i]] != null) this[ks[i]] = p[ks[i]]; } } CommentReplyParameters.prototype.rootCommentId = ""; CommentReplyParameters.prototype.channelId = ""; CommentReplyParameters.prototype.videoId = ""; CommentReplyParameters.prototype.postId = ""; CommentReplyParameters.prototype.pageSize = 0; CommentReplyParameters.prototype.sortParam = null; CommentReplyParameters.encode = function encode(m, w) { if (!w) w = $Writer$1.create(); if (m.rootCommentId != null && Object.hasOwnProperty.call(m, "rootCommentId")) w.uint32(18).string(m.rootCommentId); if (m.channelId != null && Object.hasOwnProperty.call(m, "channelId")) w.uint32(42).string(m.channelId); if (m.videoId != null && Object.hasOwnProperty.call(m, "videoId")) w.uint32(50).string(m.videoId); if (m.pageSize != null && Object.hasOwnProperty.call(m, "pageSize")) w.uint32(72).int32(m.pageSize); if (m.postId != null && Object.hasOwnProperty.call(m, "postId")) w.uint32(122).string(m.postId); if (m.sortParam != null && Object.hasOwnProperty.call(m, "sortParam")) $root$3.CommentReplyParameters.SortParam.encode(m.sortParam, w.uint32(130).fork()).ldelim(); return w; }; CommentReplyParameters.decode = function decode(r, l, e) { if (!(r instanceof $Reader$2)) r = $Reader$2.create(r); var c = l === void 0 ? r.len : r.pos + l, m = new $root$3.CommentReplyParameters(); while (r.pos < c) { var t = r.uint32(); if (t === e) break; switch (t >>> 3) { case 2: { m.rootCommentId = r.string(); break; } case 5: { m.channelId = r.string(); break; } case 6: { m.videoId = r.string(); break; } case 15: { m.postId = r.string(); break; } case 9: { m.pageSize = r.int32(); break; } case 16: { m.sortParam = $root$3.CommentReplyParameters.SortParam.decode(r, r.uint32()); break; } default: r.skipType(t & 7); break; } } return m; }; CommentReplyParameters.SortParam = function() { function SortParam(p) { if (p) { for (var ks = Object.keys(p), i = 0; i < ks.length; ++i) if (p[ks[i]] != null) this[ks[i]] = p[ks[i]]; } } SortParam.prototype.sortType = 0; SortParam.encode = function encode(m, w) { if (!w) w = $Writer$1.create(); if (m.sortType != null && Object.hasOwnProperty.call(m, "sortType")) w.uint32(8).int32(m.sortType); return w; }; SortParam.decode = function decode(r, l, e) { if (!(r instanceof $Reader$2)) r = $Reader$2.create(r); var c = l === void 0 ? r.len : r.pos + l, m = new $root$3.CommentReplyParameters.SortParam(); while (r.pos < c) { var t = r.uint32(); if (t === e) break; switch (t >>> 3) { case 1: { m.sortType = r.int32(); break; } default: r.skipType(t & 7); break; } } return m; }; SortParam.SortType = function() { const valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "DEFAULT"] = 0; values[valuesById[1] = "HOT"] = 1; values[valuesById[2] = "LATEST"] = 2; return values; }(); return SortParam; }(); return CommentReplyParameters; })(); const BrowserContinuation = $root$3.BrowserContinuation = (() => { function BrowserContinuation2(p) { if (p) { for (var ks = Object.keys(p), i = 0; i < ks.length; ++i) if (p[ks[i]] != null) this[ks[i]] = p[ks[i]]; } } BrowserContinuation2.prototype.request = null; BrowserContinuation2.encode = function encode(m, w) { if (!w) w = $Writer$1.create(); if (m.request != null && Object.hasOwnProperty.call(m, "request")) $root$3.BrowserContinuation.Request.encode(m.request, w.uint32(641815778).fork()).ldelim(); return w; }; BrowserContinuation2.decode = function decode(r, l, e) { if (!(r instanceof $Reader$2)) r = $Reader$2.create(r); var c = l === void 0 ? r.len : r.pos + l, m = new $root$3.BrowserContinuation(); while (r.pos < c) { var t = r.uint32(); if (t === e) break; switch (t >>> 3) { case 80226972: { m.request = $root$3.BrowserContinuation.Request.decode(r, r.uint32()); break; } default: r.skipType(t & 7); break; } } return m; }; BrowserContinuation2.Request = function() { function Request2(p) { if (p) { for (var ks = Object.keys(p), i = 0; i < ks.length; ++i) if (p[ks[i]] != null) this[ks[i]] = p[ks[i]]; } } Request2.prototype.description = ""; Request2.prototype.continuationBase64 = ""; Request2.encode = function encode(m, w) { if (!w) w = $Writer$1.create(); if (m.description != null && Object.hasOwnProperty.call(m, "description")) w.uint32(18).string(m.description); if (m.continuationBase64 != null && Object.hasOwnProperty.call(m, "continuationBase64")) w.uint32(26).string(m.continuationBase64); return w; }; Request2.decode = function decode(r, l, e) { if (!(r instanceof $Reader$2)) r = $Reader$2.create(r); var c = l === void 0 ? r.len : r.pos + l, m = new $root$3.BrowserContinuation.Request(); while (r.pos < c) { var t = r.uint32(); if (t === e) break; switch (t >>> 3) { case 2: { m.description = r.string(); break; } case 3: { m.continuationBase64 = r.string(); break; } default: r.skipType(t & 7); break; } } return m; }; return Request2; }(); return BrowserContinuation2; })(); const BrowserCommentListContinuation = $root$3.BrowserCommentListContinuation = (() => { function BrowserCommentListContinuation2(p) { if (p) { for (var ks = Object.keys(p), i = 0; i < ks.length; ++i) if (p[ks[i]] != null) this[ks[i]] = p[ks[i]]; } } BrowserCommentListContinuation2.prototype.description = ""; BrowserCommentListContinuation2.prototype.mainCommentRequest = null; BrowserCommentListContinuation2.encode = function encode(m, w) { if (!w) w = $Writer$1.create(); if (m.description != null && Object.hasOwnProperty.call(m, "description")) w.uint32(18).string(m.description); if (m.mainCommentRequest != null && Object.hasOwnProperty.call(m, "mainCommentRequest")) $root$3.MainCommentRequest.encode(m.mainCommentRequest, w.uint32(426).fork()).ldelim(); return w; }; BrowserCommentListContinuation2.decode = function decode(r, l, e) { if (!(r instanceof $Reader$2)) r = $Reader$2.create(r); var c = l === void 0 ? r.len : r.pos + l, m = new $root$3.BrowserCommentListContinuation(); while (r.pos < c) { var t = r.uint32(); if (t === e) break; switch (t >>> 3) { case 2: { m.description = r.string(); break; } case 53: { m.mainCommentRequest = $root$3.MainCommentRequest.decode(r, r.uint32()); break; } default: r.skipType(t & 7); break; } } return m; }; return BrowserCommentListContinuation2; })(); const $Reader$1 = minimalExports.Reader; const $root$2 = minimalExports.roots["default"] || (minimalExports.roots["default"] = {}); const CommentAction = $root$2.CommentAction = (() => { function CommentAction2(p) { if (p) { for (var ks = Object.keys(p), i = 0; i < ks.length; ++i) if (p[ks[i]] != null) this[ks[i]] = p[ks[i]]; } } CommentAction2.prototype.action = 0; CommentAction2.prototype.commentId = ""; CommentAction2.decode = function decode(r, l, e) { if (!(r instanceof $Reader$1)) r = $Reader$1.create(r); var c = l === void 0 ? r.len : r.pos + l, m = new $root$2.CommentAction(); while (r.pos < c) { var t = r.uint32(); if (t === e) break; switch (t >>> 3) { case 1: { m.action = r.int32(); break; } case 3: { m.commentId = r.string(); break; } default: r.skipType(t & 7); break; } } return m; }; return CommentAction2; })(); $root$2.Action = (() => { const valuesById = {}, values = Object.create(valuesById); values[valuesById[0] = "DEFAULT"] = 0; values[valuesById[5] = "LIKE"] = 5; values[valuesById[6] = "DELETE"] = 6; return values; })(); const $Writer = minimalExports.Writer; const $root$1 = minimalExports.roots["default"] || (minimalExports.roots["default"] = {}); const GetPanelRequest = $root$1.GetPanelRequest = (() => { function GetPanelRequest2(p) { if (p) { for (var ks = Object.keys(p), i = 0; i < ks.length; ++i) if (p[ks[i]] != null) this[ks[i]] = p[ks[i]]; } } GetPanelRequest2.prototype.params = null; GetPanelRequest2.encode = function encode(m, w) { if (!w) w = $Writer.create(); if (m.params != null && Object.hasOwnProperty.call(m, "params")) $root$1.Params.encode(m.params, w.uint32(890).fork()).ldelim(); return w; }; return GetPanelRequest2; })(); $root$1.Params = (() => { function Params(p) { if (p) { for (var ks = Object.keys(p), i = 0; i < ks.length; ++i) if (p[ks[i]] != null) this[ks[i]] = p[ks[i]]; } } Params.prototype.videoId = ""; Params.prototype.uField5 = 0; Params.encode = function encode(m, w) { if (!w) w = $Writer.create(); if (m.videoId != null && Object.hasOwnProperty.call(m, "videoId")) w.uint32(10).string(m.videoId); if (m.uField5 != null && Object.hasOwnProperty.call(m, "uField5")) w.uint32(40).int32(m.uField5); return w; }; return Params; })(); const $Reader = minimalExports.Reader; const $root = minimalExports.roots["default"] || (minimalExports.roots["default"] = {}); const UpdateCommentParams = $root.UpdateCommentParams = (() => { function UpdateCommentParams2(p) { if (p) { for (var ks = Object.keys(p), i = 0; i < ks.length; ++i) if (p[ks[i]] != null) this[ks[i]] = p[ks[i]]; } } UpdateCommentParams2.prototype.commentId = ""; UpdateCommentParams2.decode = function decode(r, l, e) { if (!(r instanceof $Reader)) r = $Reader.create(r); var c = l === void 0 ? r.len : r.pos + l, m = new $root.UpdateCommentParams(); while (r.pos < c) { var t = r.uint32(); if (t === e) break; switch (t >>> 3) { case 1: { m.commentId = r.string(); break; } default: r.skipType(t & 7); break; } } return m; }; return UpdateCommentParams2; })(); var _GM_registerMenuCommand = /* @__PURE__ */ (() => typeof GM_registerMenuCommand != "undefined" ? GM_registerMenuCommand : void 0)(); var _unsafeWindow = /* @__PURE__ */ (() => typeof unsafeWindow != "undefined" ? unsafeWindow : void 0)(); var zh_cn_default = { name: "zh-cn", el: { breadcrumb: { label: "面包屑" }, colorpicker: { confirm: "确定", clear: "清空", defaultLabel: "颜色选择器", description: "当前颜色 {color},按 Enter 键选择新颜色", alphaLabel: "选择透明度的值", alphaDescription: "透明度 {alpha}, 当前颜色 {color}", hueLabel: "选择色相值", hueDescription: "色相 {hue}, 当前颜色 {color}", svLabel: "选择饱和度与明度的值", svDescription: "饱和度 {saturation}, 明度 {brightness}, 当前颜色 {color}", predefineDescription: "选择 {value} 作为颜色" }, datepicker: { now: "此刻", today: "今天", cancel: "取消", clear: "清空", confirm: "确定", dateTablePrompt: "使用方向键与 Enter 键可选择日期", monthTablePrompt: "使用方向键与 Enter 键可选择月份", yearTablePrompt: "使用方向键与 Enter 键可选择年份", selectedDate: "已选日期", selectDate: "选择日期", selectTime: "选择时间", startDate: "开始日期", startTime: "开始时间", endDate: "结束日期", endTime: "结束时间", prevYear: "前一年", nextYear: "后一年", prevMonth: "上个月", nextMonth: "下个月", year: "年", month1: "1 月", month2: "2 月", month3: "3 月", month4: "4 月", month5: "5 月", month6: "6 月", month7: "7 月", month8: "8 月", month9: "9 月", month10: "10 月", month11: "11 月", month12: "12 月", weeks: { sun: "日", mon: "一", tue: "二", wed: "三", thu: "四", fri: "五", sat: "六" }, weeksFull: { sun: "星期日", mon: "星期一", tue: "星期二", wed: "星期三", thu: "星期四", fri: "星期五", sat: "星期六" }, months: { jan: "一月", feb: "二月", mar: "三月", apr: "四月", may: "五月", jun: "六月", jul: "七月", aug: "八月", sep: "九月", oct: "十月", nov: "十一月", dec: "十二月" } }, inputNumber: { decrease: "减少数值", increase: "增加数值" }, select: { loading: "加载中", noMatch: "无匹配数据", noData: "无数据", placeholder: "请选择" }, mention: { loading: "加载中" }, dropdown: { toggleDropdown: "切换下拉选项" }, cascader: { noMatch: "无匹配数据", loading: "加载中", placeholder: "请选择", noData: "暂无数据" }, pagination: { goto: "前往", pagesize: "条/页", total: "共 {total} 条", pageClassifier: "页", page: "页", prev: "上一页", next: "下一页", currentPage: "第 {pager} 页", prevPages: "向前 {pager} 页", nextPages: "向后 {pager} 页", deprecationWarning: "你使用了一些已被废弃的用法,请参考 el-pagination 的官方文档" }, dialog: { close: "关闭此对话框" }, drawer: { close: "关闭此对话框" }, messagebox: { title: "提示", confirm: "确定", cancel: "取消", error: "输入的数据不合法!", close: "关闭此对话框" }, upload: { deleteTip: "按 Delete 键可删除", delete: "删除", preview: "查看图片", continue: "继续上传" }, slider: { defaultLabel: "滑块介于 {min} 至 {max}", defaultRangeStartLabel: "选择起始值", defaultRangeEndLabel: "选择结束值" }, table: { emptyText: "暂无数据", confirmFilter: "筛选", resetFilter: "重置", clearFilter: "全部", sumText: "合计", selectAllLabel: "选择所有行", selectRowLabel: "选择当前行", expandRowLabel: "展开当前行", collapseRowLabel: "收起当前行", sortLabel: "按 {column} 排序", filterLabel: "按 {column} 过滤" }, tag: { close: "关闭此标签" }, tour: { next: "下一步", previous: "上一步", finish: "结束导览", close: "关闭此对话框" }, tree: { emptyText: "暂无数据" }, transfer: { noMatch: "无匹配数据", noData: "无数据", titles: ["列表 1", "列表 2"], filterPlaceholder: "请输入搜索内容", noCheckedFormat: "共 {total} 项", hasCheckedFormat: "已选 {checked}/{total} 项" }, image: { error: "加载失败" }, pageHeader: { title: "返回" }, popconfirm: { confirmButtonText: "确定", cancelButtonText: "取消" }, carousel: { leftArrow: "上一张幻灯片", rightArrow: "下一张幻灯片", indicator: "幻灯片切换至索引 {index}" }, inputOTP: { groupLabel: "一次性密码输入框", defaultLabel: "请输入第 {index} 位 OTP 字符" } } }; const cssLoader = (e) => { const t = GM_getResourceText(e); return GM_addStyle(t), t; }; cssLoader("element-plus/dist/index.css"); const _hoisted_1$8 = { key: 0, class: "hot-ban-checker" }; const _hoisted_2$6 = { class: "message" }; const _hoisted_3$4 = { class: "buttons" }; const _hoisted_4$4 = { class: "actions" }; const _sfc_main$9 = { __name: "CommentActions", props: ["comment"], emits: ["delete", "checkHotBan"], setup(__props, { emit: __emit }) { const props = __props; const emit = __emit; const comment = props.comment; const check2 = vue.inject("check"); const hotBanCheck2 = vue.inject("hotBanCheck"); const updating = vue.ref(false); const showHotBanChecker = vue.ref(false); const hotBanCheckerMessage = vue.ref("等待检查中……"); let hotBanCheckerController = vue.reactive({ isCancelled: false }); function updateState() { updating.value = true; check2(comment).then(() => { updating.value = false; ElementPlus.ElMessage({ type: comment.currentState == "NORMAL" ? "success" : "warning", message: "更新成功,当前状态:" + translateState(comment.currentState) }); }).catch((err) => { updating.value = false; let msg = err.message; if (msg == "COMMENT_AREA_CLOSED") { msg = "评论区已关闭"; } ElementPlus.ElMessage.error("更新失败,因为:" + msg); }); } function copyComment(commentText2) { copyToClipboard(commentText2).then(() => { ElementPlus.ElMessage({ message: "评论已复制到剪贴板", type: "success" }); }).catch((err) => { ElementPlus.ElMessage.error("无法复制文本,因为: " + err); }); } function askDelete() { ElementPlus.ElMessageBox.confirm("确定要删除这条记录吗(这不会删除你在YouTube上发布的评论)?删除操作无法撤销!").then(() => { emit("delete"); }).catch(() => { }); } async function toHotBanCheck() { if (Date.now() - comment.recordedTime < 120 * 1e3) { ElementPlus.ElMessage.warning(`当前时间距评论记录时间不足2分钟,状态不可信,请到 ${formatTimestamp(comment.recordedTime + 120 * 1e3)} 来检查`); return; } if (comment.commentId.indexOf(".") == -1) { try { await ElementPlus.ElMessageBox.confirm( "确认检查吗?该检查需要遍历热门评论区,请注意评论区的评论数量(总数大于3000的评论区慎重考虑)!数量太多将导致漫长的检查过程,同时频繁调用API可能会引发不可预料的后果!", "警告", { confirmButtonText: "确定", cancelButtonText: "取消" } ); } catch (err) { return; } } hotBanCheckerMessage.value = "正在重新检查评论状态……"; hotBanCheckerController.isCancelled = false; showHotBanChecker.value = true; try { await check2(comment); if (comment.currentState != "NORMAL") { ElementPlus.ElMessage.error(`评论状态重新检查后为${translateState(comment.currentState)},无法继续进行检查`); showHotBanChecker.value = false; return; } } catch (err) { let msg = err.message; if (msg == "COMMENT_AREA_CLOSED") { msg = "评论区已关闭"; } console.log("状态检查失败", err); ElementPlus.ElMessage.error("状态检查失败,因为:" + msg); showHotBanChecker.value = false; return; } let observer = { onCountChange(c, p) { hotBanCheckerMessage.value = `正在搜索热门列表,已搜寻至:第${c}个 第${p}页`; } }; let notCancelled; try { notCancelled = await hotBanCheck2(comment, observer, hotBanCheckerController); } catch (err) { showHotBanChecker.value = false; console.log("热门屏蔽检查失败", err); ElementPlus.ElMessage.error("热门屏蔽检查失败,因为:" + err.message); return; } if (notCancelled) { if (comment.hotBan) { ElementPlus.ElMessage.warning("你的评论未在热门列表找到,已被热门屏蔽,检查完成"); } else { ElementPlus.ElMessage.success("你的评论已在热门列表找到,没有被热门屏蔽,检查完成"); } } showHotBanChecker.value = false; } return (_ctx, _cache) => { const _component_el_button = vue.resolveComponent("el-button"); return vue.openBlock(), vue.createElementBlock("div", null, [ showHotBanChecker.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$8, [ _cache[2] || (_cache[2] = vue.createElementVNode("div", { class: "title" }, "热门屏蔽检查", -1)), vue.createElementVNode("div", _hoisted_2$6, vue.toDisplayString(hotBanCheckerMessage.value), 1), vue.createElementVNode("div", _hoisted_3$4, [ vue.createElementVNode("span", { onClick: _cache[0] || (_cache[0] = ($event) => vue.unref(hotBanCheckerController).isCancelled = true) }, "终止检查") ]) ])) : vue.createCommentVNode("", true), vue.createElementVNode("div", _hoisted_4$4, [ vue.unref(comment).isUserDelete == false ? (vue.openBlock(), vue.createBlock(_component_el_button, { key: 0, type: "primary", plain: "", onClick: updateState, loading: updating.value }, { default: vue.withCtx(() => _cache[3] || (_cache[3] = [ vue.createTextVNode("更新状态") ])), _: 1, __: [3] }, 8, ["loading"])) : vue.createCommentVNode("", true), vue.unref(comment).currentState == "NORMAL" ? (vue.openBlock(), vue.createBlock(_component_el_button, { key: 1, type: "primary", plain: "", onClick: toHotBanCheck }, { default: vue.withCtx(() => _cache[4] || (_cache[4] = [ vue.createTextVNode("热门屏蔽检查") ])), _: 1, __: [4] })) : vue.createCommentVNode("", true), vue.createVNode(_component_el_button, { type: "primary", plain: "", onClick: _cache[1] || (_cache[1] = ($event) => copyComment(vue.unref(comment).content)) }, { default: vue.withCtx(() => _cache[5] || (_cache[5] = [ vue.createTextVNode("复制") ])), _: 1, __: [5] }), vue.createVNode(_component_el_button, { type: "danger", plain: "", onClick: askDelete }, { default: vue.withCtx(() => _cache[6] || (_cache[6] = [ vue.createTextVNode("删除记录") ])), _: 1, __: [6] }) ]) ]); }; } }; const CommentActions = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["__scopeId", "data-v-c5ba1027"]]); /*! Element Plus Icons Vue v2.3.2 */ var _sfc_main91 = /* @__PURE__ */ vue.defineComponent({ name: "Download", __name: "download", setup(__props) { return (_ctx, _cache) => (vue.openBlock(), vue.createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [ vue.createElementVNode("path", { fill: "currentColor", d: "M160 832h704a32 32 0 1 1 0 64H160a32 32 0 1 1 0-64m384-253.696 236.288-236.352 45.248 45.248L508.8 704 192 387.2l45.248-45.248L480 584.704V128h64z" }) ])); } }), download_default = _sfc_main91; var _sfc_main275 = /* @__PURE__ */ vue.defineComponent({ name: "Upload", __name: "upload", setup(__props) { return (_ctx, _cache) => (vue.openBlock(), vue.createElementBlock("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 1024 1024" }, [ vue.createElementVNode("path", { fill: "currentColor", d: "M160 832h704a32 32 0 1 1 0 64H160a32 32 0 1 1 0-64m384-578.304V704h-64V247.296L237.248 490.048 192 444.8 508.8 128l316.8 316.8-45.312 45.248z" }) ])); } }), upload_default = _sfc_main275; const _hoisted_1$7 = { class: "export-container" }; const _sfc_main$8 = { __name: "Export", props: { fetchDataFn: { type: Function, required: true }, getFilenameFn: { type: Function, default: () => `export_${(/* @__PURE__ */ new Date()).getTime()}` } }, setup(__props) { const props = __props; const loading = vue.ref(false); const handleExport = async () => { if (loading.value) return; loading.value = true; try { const data = await props.fetchDataFn(); const jsonString = JSON.stringify(data, null, 2); const blob = new Blob([jsonString], { type: "application/json" }); const filename = typeof props.getFilenameFn === "function" ? props.getFilenameFn() : props.getFilenameFn; const link = document.createElement("a"); link.href = URL.createObjectURL(blob); link.download = `${filename}.json`; link.click(); URL.revokeObjectURL(link.href); ElementPlus.ElMessage.success("导出成功"); } catch (error) { console.error("Export failed:", error); ElementPlus.ElMessage.error("导出失败"); } finally { loading.value = false; } }; return (_ctx, _cache) => { const _component_el_button = vue.resolveComponent("el-button"); return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$7, [ vue.createVNode(_component_el_button, { type: "primary", icon: vue.unref(upload_default), loading: loading.value, onClick: handleExport }, { default: vue.withCtx(() => [ vue.renderSlot(_ctx.$slots, "default", {}, () => [ _cache[0] || (_cache[0] = vue.createTextVNode("导出数据")) ]) ]), _: 3 }, 8, ["icon", "loading"]) ]); }; } }; const _hoisted_1$6 = { class: "import-container" }; const _sfc_main$7 = { __name: "Import", emits: ["success"], setup(__props, { emit: __emit }) { const emit = __emit; const fileInput = vue.ref(null); const triggerFileInput = () => { if (fileInput.value) { fileInput.value.click(); } }; const handleFileChange = (event) => { const file = event.target.files[0]; if (!file) return; const reader2 = new FileReader(); reader2.onload = (e) => { try { const json = JSON.parse(e.target.result); emit("success", json); } catch (error) { console.error("JSON 解析失败:", error); ElementPlus.ElMessage.error("文件解析失败,请检查文件格式是否正确"); } finally { if (fileInput.value) { fileInput.value.value = ""; } } }; reader2.onerror = (error) => { console.error("文件读取失败:", error); ElementPlus.ElMessage.error("文件读取失败"); if (fileInput.value) { fileInput.value.value = ""; } }; reader2.readAsText(file); }; return (_ctx, _cache) => { const _component_el_button = vue.resolveComponent("el-button"); return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$6, [ vue.createElementVNode("input", { type: "file", ref_key: "fileInput", ref: fileInput, accept: ".json", style: { "display": "none" }, onChange: handleFileChange }, null, 544), vue.createVNode(_component_el_button, { type: "primary", icon: vue.unref(download_default), onClick: triggerFileInput }, { default: vue.withCtx(() => [ vue.renderSlot(_ctx.$slots, "default", {}, () => [ _cache[0] || (_cache[0] = vue.createTextVNode("导入 JSON 文件")) ]) ]), _: 3 }, 8, ["icon"]) ]); }; } }; const _hoisted_1$5 = { class: "comment-history-container" }; const _hoisted_2$5 = { class: "toolbar" }; const _hoisted_3$3 = { class: "detail" }; const _hoisted_4$3 = { class: "info-table" }; const _hoisted_5$3 = { class: "comment-content" }; const _hoisted_6$2 = { key: 0 }; const _hoisted_7$2 = { key: 3 }; const _hoisted_8$1 = { class: "comment-content" }; const pageSize$1 = 20; const _sfc_main$6 = { __name: "CommentHistories", setup(__props) { const commentObjectKeys = [ "commentId", "displayName", "channelId", "content", "webPageType", "url", "commentAreaInfo", "currentState", "hotBan", "histories", "likeCount", "replyCount", "recordedTime", "updatedTime", "isUserDelete" ]; const deleteComment2 = vue.inject("deleteComment"); const insertComment2 = vue.inject("insertComment"); const updateComment2 = vue.inject("updateComment"); const db2 = vue.inject("db"); const comments = vue.reactive([]); const keyword = vue.ref(""); const selectedTime = vue.ref(null); const loadingComments = vue.ref(false); const finished = vue.ref(false); let timeCursor = null; function reloadComments() { if (loadingComments.value) { return; } finished.value = false; comments.length = 0; if (selectedTime.value) { timeCursor = selectedTime.value.getTime(); } else { timeCursor = null; } loadComments(); } async function loadComments() { if (loadingComments.value || finished.value) { return; } loadingComments.value = true; selectedTime.value; await loadCommentPage(); loadingComments.value = false; } function loadCommentPage() { return new Promise((resolve, reject) => { let transaction = db2.transaction("comments").objectStore("comments").index("recordedTime").openCursor(timeCursor ? IDBKeyRange.upperBound(timeCursor) : null, "prev"); let count = 0; transaction.onsuccess = (event) => { var cursor = event.target.result; if (cursor) { if (count < pageSize$1) { let value = cursor.value; let textSearch = keyword.value; if (textSearch == "" || value.content.indexOf(textSearch) != -1) { comments.push(value); count++; } cursor.continue(); } else { timeCursor = cursor.value.recordedTime; resolve(); } } else { timeCursor = null; finished.value = true; resolve(); } }; transaction.onerror = (event) => { reject(event); }; }); } function getComment(commentId) { return new Promise((resolve, reject) => { let req = db2.transaction("comments", "readonly").objectStore("comments").get(commentId); req.onsuccess = () => { resolve(req.result); }; req.onerror = () => reject(req.error); }); } function formatStateDesc(comment) { switch (comment.currentState) { case "NORMAL": if (comment.hotBan === true) return "热门屏蔽"; if (comment.hotBan === false) return "完全正常"; return "正常"; case "DELETED": return comment.isUserDelete ? "用户删除" : "已删除"; case "SHADOW_BAN": return "仅自己可见"; case "NOT_CHECK": return "还未检查"; } } function formatCommentArea(comment, needEmojiHead) { const info = comment.commentAreaInfo; switch (comment.webPageType) { case "WEB_PAGE_TYPE_WATCH": return "📺 " + info.videoId; case "WEB_PAGE_TYPE_BROWSE": return "📰 " + info.postId; } } function formatHotBan(hotBan) { if (hotBan == null) { return "未检查"; } return hotBan ? "是" : "否"; } function deleteCommentItem(comment) { deleteComment2(comment.commentId).then(() => { const index = comments.findIndex( (item) => item.commentId === comment.commentId ); if (index !== -1) { comments.splice(index, 1); } ElementPlus.ElMessage.success("评论记录删除成功"); }).catch((err) => { console.error(err); if (err instanceof Error) { if (err.message == "checking-now") { ElementPlus.ElMessage.error("评论正在检查中,禁止删除评论记录!"); return; } } ElementPlus.ElMessage.error("评论记录删除失败"); }); } async function handleImportData(data) { if (!data || !data instanceof Array) { ElementPlus.ElMessage.error("非法数据"); return; } let successCount = 0; let skippedCount = 0; let invalidCount = 0; let failedCount = 0; for (let item of data) { if (validateObjectKeys(item, commentObjectKeys)) { try { let comment = await getComment(item.commentId); if (comment) { if (comment.updatedTime < item.updatedTime) { await updateComment2(item); successCount++; console.log("已更新评论数据", item); } else { skippedCount++; console.log("已跳过评论数据", item); } } else { await insertComment2(item); successCount++; console.log("已插入评论数据", item); } } catch (error) { failedCount++; console.error("评论导入时出错", error); } } else { invalidCount++; console.error("非法的评论数据", item); } } reloadComments(); ElementPlus.ElMessage.success(`已导入 成功${successCount}条 失败${failedCount}条 跳过${skippedCount}条 无效${invalidCount}条`); } function generateName() { return "comments-export_" + nowDate(); } function getDataToExport() { return new Promise((resolve, reject) => { let transaction = db2.transaction("comments").objectStore("comments").index("recordedTime").openCursor(null, "prev"); let localComments = []; transaction.onsuccess = (event) => { var cursor = event.target.result; if (cursor) { cursor.continue(); localComments.push(cursor.value); } else { resolve(localComments); } }; transaction.onerror = (event) => { reject(event); }; }); } return (_ctx, _cache) => { const _component_el_date_picker = vue.resolveComponent("el-date-picker"); const _component_el_button = vue.resolveComponent("el-button"); const _component_el_input = vue.resolveComponent("el-input"); const _component_el_table_column = vue.resolveComponent("el-table-column"); const _component_el_link = vue.resolveComponent("el-link"); const _component_el_table = vue.resolveComponent("el-table"); const _directive_el_table_infinite_scroll = vue.resolveDirective("el-table-infinite-scroll"); return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$5, [ vue.createElementVNode("div", _hoisted_2$5, [ vue.createVNode(_component_el_date_picker, { modelValue: selectedTime.value, "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => selectedTime.value = $event), type: "datetime", placeholder: "从指定时间开始", clearable: "", style: { "width": "220px" }, onChange: reloadComments }, null, 8, ["modelValue"]), vue.createVNode(_component_el_input, { modelValue: keyword.value, "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => keyword.value = $event), placeholder: "搜索评论内容", clearable: "", style: { "width": "260px" }, onKeyup: vue.withKeys(reloadComments, ["enter"]), onClear: reloadComments }, { append: vue.withCtx(() => [ vue.createVNode(_component_el_button, { onClick: reloadComments }, { default: vue.withCtx(() => _cache[2] || (_cache[2] = [ vue.createTextVNode(" 搜索 ") ])), _: 1, __: [2] }) ]), _: 1 }, 8, ["modelValue"]), vue.createVNode(_sfc_main$8, { getFilenameFn: generateName, fetchDataFn: getDataToExport }, { default: vue.withCtx(() => _cache[3] || (_cache[3] = [ vue.createTextVNode("导出") ])), _: 1, __: [3] }), vue.createVNode(_sfc_main$7, { onSuccess: handleImportData }, { default: vue.withCtx(() => _cache[4] || (_cache[4] = [ vue.createTextVNode("导入") ])), _: 1, __: [4] }) ]), vue.withDirectives((vue.openBlock(), vue.createBlock(_component_el_table, { data: comments, "row-key": "commentId", class: "comment-list", height: "100%" }, { default: vue.withCtx(() => [ vue.createVNode(_component_el_table_column, { prop: "content", label: "评论内容", align: "left", "show-overflow-tooltip": "" }), vue.createVNode(_component_el_table_column, { prop: "state", label: "当前状态", align: "center", width: "136", formatter: formatStateDesc }), vue.createVNode(_component_el_table_column, { prop: "recordedTime", label: "记录时间", align: "center", width: "160", formatter: (comment) => vue.unref(formatTimestamp)(comment.recordedTime) }, null, 8, ["formatter"]), vue.createVNode(_component_el_table_column, { prop: "area", label: "所在评论区", align: "center", width: "240" }, { default: vue.withCtx(({ row }) => [ vue.createElementVNode("div", null, [ vue.createVNode(_component_el_link, { type: "primary", href: row.url, class: vue.normalizeClass(["locate-link", { "post-locate-link": row.webPageType === "WEB_PAGE_TYPE_BROWSE" }]) }, { default: vue.withCtx(() => [ vue.createTextVNode(vue.toDisplayString(formatCommentArea(row)), 1) ]), _: 2 }, 1032, ["href", "class"]) ]) ]), _: 1 }), vue.createVNode(_component_el_table_column, { type: "expand" }, { default: vue.withCtx(({ row }) => [ vue.createElementVNode("div", _hoisted_3$3, [ vue.createElementVNode("table", _hoisted_4$3, [ vue.createElementVNode("tbody", null, [ vue.createElementVNode("tr", null, [ _cache[5] || (_cache[5] = vue.createElementVNode("td", null, "评论内容", -1)), vue.createElementVNode("td", _hoisted_5$3, vue.toDisplayString(row.content), 1) ]), vue.createElementVNode("tr", null, [ _cache[6] || (_cache[6] = vue.createElementVNode("td", null, "当前状态", -1)), vue.createElementVNode("td", null, vue.toDisplayString(vue.unref(translateState)(row.currentState)), 1) ]), row.currentState == "DELETED" ? (vue.openBlock(), vue.createElementBlock("tr", _hoisted_6$2, [ _cache[7] || (_cache[7] = vue.createElementVNode("td", null, "用户删除", -1)), vue.createElementVNode("td", null, vue.toDisplayString(row.isUserDelete ? "是" : "否"), 1) ])) : vue.createCommentVNode("", true), vue.createElementVNode("tr", null, [ _cache[8] || (_cache[8] = vue.createElementVNode("td", null, "热门屏蔽", -1)), vue.createElementVNode("td", null, vue.toDisplayString(formatHotBan(row.hotBan)), 1) ]), vue.createElementVNode("tr", null, [ _cache[9] || (_cache[9] = vue.createElementVNode("td", null, "发送者", -1)), vue.createElementVNode("td", null, vue.toDisplayString(row.displayName), 1) ]), vue.createElementVNode("tr", null, [ _cache[10] || (_cache[10] = vue.createElementVNode("td", null, "评论ID", -1)), vue.createElementVNode("td", null, vue.toDisplayString(row.commentId), 1) ]), row.webPageType == "WEB_PAGE_TYPE_WATCH" ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 1 }, [ _cache[12] || (_cache[12] = vue.createElementVNode("tr", null, [ vue.createElementVNode("td", null, "评论区类型"), vue.createElementVNode("td", null, "视频") ], -1)), vue.createElementVNode("tr", null, [ _cache[11] || (_cache[11] = vue.createElementVNode("td", null, "视频ID", -1)), vue.createElementVNode("td", null, vue.toDisplayString(row.commentAreaInfo.videoId), 1) ]) ], 64)) : row.webPageType == "WEB_PAGE_TYPE_BROWSE" ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 2 }, [ _cache[15] || (_cache[15] = vue.createElementVNode("tr", null, [ vue.createElementVNode("td", null, "评论区类型"), vue.createElementVNode("td", null, "帖子") ], -1)), vue.createElementVNode("tr", null, [ _cache[13] || (_cache[13] = vue.createElementVNode("td", null, "帖子所属频道ID", -1)), vue.createElementVNode("td", null, vue.toDisplayString(row.commentAreaInfo.channelId), 1) ]), vue.createElementVNode("tr", null, [ _cache[14] || (_cache[14] = vue.createElementVNode("td", null, "帖子ID", -1)), vue.createElementVNode("td", null, vue.toDisplayString(row.commentAreaInfo.postId), 1) ]) ], 64)) : vue.createCommentVNode("", true), vue.createElementVNode("tr", null, [ _cache[16] || (_cache[16] = vue.createElementVNode("td", null, "点赞数", -1)), vue.createElementVNode("td", null, vue.toDisplayString(row.likeCount), 1) ]), row.commentId.indexOf(".") == -1 ? (vue.openBlock(), vue.createElementBlock("tr", _hoisted_7$2, [ _cache[17] || (_cache[17] = vue.createElementVNode("td", null, "回复数", -1)), vue.createElementVNode("td", null, vue.toDisplayString(row.replyCount), 1) ])) : vue.createCommentVNode("", true), vue.createElementVNode("tr", null, [ _cache[18] || (_cache[18] = vue.createElementVNode("td", null, "记录时间", -1)), vue.createElementVNode("td", null, vue.toDisplayString(vue.unref(formatTimestamp)(row.recordedTime)), 1) ]), vue.createElementVNode("tr", null, [ _cache[19] || (_cache[19] = vue.createElementVNode("td", null, "更新时间", -1)), vue.createElementVNode("td", null, vue.toDisplayString(vue.unref(formatTimestamp)(row.updatedTime)), 1) ]) ]) ]), vue.createElementVNode("details", null, [ _cache[20] || (_cache[20] = vue.createElementVNode("summary", null, "历史检查记录", -1)), vue.createVNode(_component_el_table, { data: row.histories, style: { "width": "100%" } }, { default: vue.withCtx(() => [ vue.createVNode(_component_el_table_column, { prop: "time", label: "时间戳", width: "160", formatter: (history) => vue.unref(formatTimestamp)(history.time) }, null, 8, ["formatter"]), vue.createVNode(_component_el_table_column, { prop: "state", label: "状态", width: "136", formatter: (history) => vue.unref(translateState)(history.state) }, null, 8, ["formatter"]), vue.createVNode(_component_el_table_column, { prop: "hotBan", label: "热门屏蔽", width: "120", formatter: (history) => formatHotBan(history.hotBan) }, null, 8, ["formatter"]), vue.createVNode(_component_el_table_column, { prop: "content", label: "评论内容", "show-overflow-tooltip": "" }), vue.createVNode(_component_el_table_column, { type: "expand" }, { default: vue.withCtx(({ row: row2 }) => [ vue.createElementVNode("div", _hoisted_8$1, vue.toDisplayString(row2.content), 1) ]), _: 2 }, 1024) ]), _: 2 }, 1032, ["data"]) ]), vue.createVNode(CommentActions, { comment: row, onDelete: ($event) => deleteCommentItem(row) }, null, 8, ["comment", "onDelete"]) ]) ]), _: 1 }) ]), _: 1 }, 8, ["data"])), [ [_directive_el_table_infinite_scroll, loadComments] ]) ]); }; } }; const CommentHistories = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-ad8c8fe3"]]); function createVideoRootCommentListContinuation(channelId, videoId, isLatestSort) { let payload = { uField3: 6, commentAreaWrapper: { videoId }, mainCommentRequest: { sectionIdentifier: "comments-section", commentParameters: { videoId, sortType: isLatestSort ? 1 : 0 } } }; return u8ArrayToBase64(NextContinuation.encode(payload).finish()); } function createVideoReplyCommentListContinuation(channelId, videoId, rootCommentId, isLatestSort) { let payload = { uField3: 6, commentAreaWrapper: { videoId }, mainCommentRequest: { sectionIdentifier: `comment-replies-item-${rootCommentId}`, commentReplyParameters: { rootCommentId, channelId, videoId, pageSize: 10, sortParam: { sortType: 1 } } } }; return u8ArrayToBase64(NextContinuation.encode(payload).finish()); } function createPostRootCommentListContinuation(channelId, postId, isLatestSort) { let payload = { description: "community", mainCommentRequest: { sectionIdentifier: "comments-section", commentParameters: { channelId, postId, sortType: isLatestSort ? 1 : 0 } } }; let continuation = u8ArrayToBase64(BrowserCommentListContinuation.encode(payload).finish()); payload = { request: { description: "FEcomment_post_detail_page_web_top_level", continuationBase64: continuation } }; return u8ArrayToBase64(BrowserContinuation.encode(payload).finish()); } function createPostReplyCommentListContinuation(channelId, postId, rootCommentId, isLatestSort) { let payload = { description: "community", mainCommentRequest: { sectionIdentifier: `comment-replies-item-${rootCommentId}`, commentReplyParameters: { rootCommentId, channelId, postId, pageSize: 10, sortParam: { sortType: 1 } } } }; let continuation = u8ArrayToBase64(BrowserCommentListContinuation.encode(payload).finish()); payload = { request: { description: "FEcomment_post_detail_page_web_replies_page", continuationBase64: continuation } }; return u8ArrayToBase64(BrowserContinuation.encode(payload).finish()); } function findNextContinuation(data) { var _a, _b, _c, _d; let continuation = null; for (const endpoint of data.onResponseReceivedEndpoints) { const items = ((_a = endpoint.appendContinuationItemsAction) == null ? void 0 : _a.continuationItems) || ((_b = endpoint.reloadContinuationItemsCommand) == null ? void 0 : _b.continuationItems); if (!items) continue; for (const item of items) { const continuationItemRenderer = item.continuationItemRenderer; if (!continuationItemRenderer) continue; const token = (_d = (_c = continuationItemRenderer == null ? void 0 : continuationItemRenderer.continuationEndpoint) == null ? void 0 : _c.continuationCommand) == null ? void 0 : _d.token; if (!token) { continuation = continuationItemRenderer == null ? void 0 : continuationItemRenderer.button.buttonRenderer.command.continuationCommand.token; } if (token) { continuation = token; break; } } if (continuation) break; } return continuation; } const _hoisted_1$4 = { class: "youtube-comment" }; const _hoisted_2$4 = { class: "avatar-container" }; const _hoisted_3$2 = ["href"]; const _hoisted_4$2 = ["src", "alt"]; const _hoisted_5$2 = { class: "comment-content" }; const _hoisted_6$1 = { class: "comment-header" }; const _hoisted_7$1 = ["href"]; const _hoisted_8 = { class: "published-at" }; const _hoisted_9 = { class: "comment-text" }; const _hoisted_10 = { class: "comment-actions" }; const _hoisted_11 = { class: "action-text" }; const _hoisted_12 = { class: "action-text" }; const _hoisted_13 = ["href"]; const _sfc_main$5 = { __name: "YouTubeComment", props: ["comment", "publishedAtFormatter"], setup(__props) { const props = __props; const comment = props.comment; const publishedAtFormatter = props.publishedAtFormatter; function getPublishedAtText() { if (publishedAtFormatter) { return publishedAtFormatter(comment); } return comment.publishedTime; } function copyComment(commentText2) { copyToClipboard(commentText2).then(() => { ElementPlus.ElMessage({ message: "评论已复制到剪贴板", type: "success" }); }).catch((err) => { ElementPlus.ElMessage.error("无法复制文本,因为: " + err); }); } return (_ctx, _cache) => { return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$4, [ vue.createElementVNode("div", _hoisted_2$4, [ vue.createElementVNode("a", { href: "https://www.youtube.com/" + vue.unref(comment).userDisplayName, target: "_blank", rel: "noopener noreferrer" }, [ vue.createElementVNode("img", { src: vue.unref(comment).userProfileImageUrl, alt: vue.unref(comment).authorDisplayName, class: "avatar" }, null, 8, _hoisted_4$2) ], 8, _hoisted_3$2) ]), vue.createElementVNode("div", _hoisted_5$2, [ vue.createElementVNode("div", _hoisted_6$1, [ vue.createElementVNode("a", { href: "https://www.youtube.com/" + vue.unref(comment).userDisplayName, target: "_blank", rel: "noopener noreferrer", class: "author-name" }, vue.toDisplayString(vue.unref(comment).userDisplayName), 9, _hoisted_7$1), vue.createElementVNode("span", _hoisted_8, vue.toDisplayString(getPublishedAtText()), 1) ]), vue.createElementVNode("p", _hoisted_9, vue.toDisplayString(vue.unref(comment).contentText), 1), vue.createElementVNode("div", _hoisted_10, [ vue.createElementVNode("button", { class: "button", onClick: _cache[0] || (_cache[0] = ($event) => vue.unref(ElementPlus.ElMessage).info("需要点赞评论请定位至评论")) }, [ _cache[3] || (_cache[3] = vue.createElementVNode("svg", { class: "icon", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24" }, [ vue.createElementVNode("path", { d: "M16.5 3c-1.74 0-3.41.81-4.5 2.09C10.91 3.81 9.24 3 7.5 3 4.42 3 2 5.42 2 8.5c0 3.78 3.4 6.86 8.55 11.54L12 21.35l1.45-1.31C18.6 15.36 22 12.28 22 8.5 22 5.42 19.58 3 16.5 3z" }) ], -1)), vue.createElementVNode("span", _hoisted_11, vue.toDisplayString(vue.unref(comment).likeCount), 1) ]), vue.createElementVNode("button", { class: "button", onClick: _cache[1] || (_cache[1] = ($event) => vue.unref(ElementPlus.ElMessage).info("需要查看回复请定位评论查看")) }, [ _cache[4] || (_cache[4] = vue.createElementVNode("svg", { class: "icon", viewBox: "0 0 1024 1024", version: "1.1", xmlns: "http://www.w3.org/2000/svg", "p-id": "5216", width: "200", height: "200" }, [ vue.createElementVNode("path", { d: "M1024 640l-3.5 41.6c-6.5 78.1-27.7 154-62.2 223.9-7.5 15.2-30.4 10-30.4-7V800c0-61.9-25.1-117.9-65.6-158.4C821.9 601.1 765.9 576 704 576H552c-4.4 0-8 3.6-8 8v179.6c0 13.9-16.5 21.2-26.8 11.8L160 447.9 516.5 76.7c10-10.4 27.5-3.3 27.5 11.1V280c0 4.4 3.6 8 8 8h120c97.2 0 185.2 39.4 248.9 103.1S1024 542.8 1024 640z", "p-id": "5217" }), vue.createElementVNode("path", { d: "M356.7 95.1L0 453.1l357.3 326.1c10.3 9.4 26.8 2.1 26.8-11.8 0-32.1-13.5-62.7-37.2-84.4L92.5 450.9l258.2-259.1c21.3-21.4 33.3-50.4 33.3-80.6v-4.8c0-14.3-17.3-21.4-27.3-11.3z", "p-id": "5218" }) ], -1)), vue.createElementVNode("span", _hoisted_12, vue.toDisplayString(vue.unref(comment).replyCount), 1) ]), vue.createElementVNode("a", { class: "button", href: vue.unref(comment).url, target: "_blank" }, _cache[5] || (_cache[5] = [ vue.createElementVNode("svg", { class: "icon", viewBox: "0 0 1024 1024", version: "1.1", xmlns: "http://www.w3.org/2000/svg", "p-id": "7302", width: "200", height: "200" }, [ vue.createElementVNode("path", { d: "M511.36599 512.177066m-201.557982 0a201.557983 201.557983 0 1 0 403.115965 0 201.557983 201.557983 0 1 0-403.115965 0Z", "p-id": "7303" }), vue.createElementVNode("path", { d: "M990.163299 477.654949h-78.434431a34.350763 34.350763 0 0 0-5.883154 0.514062c-16.278629-191.288167-168.532358-343.770368-359.706288-360.357433a33.619652 33.619652 0 0 0 0.376979-5.060655V34.270797a34.270797 34.270797 0 0 0-68.541595 0v78.434432a35.059026 35.059026 0 0 0 0.354132 4.923571c-191.790805 15.844532-344.798492 168.372427-361.385558 359.957608a34.556387 34.556387 0 0 0-4.226732-0.274167H34.270797a34.270797 34.270797 0 1 0 0 68.541595h78.445855a32.762882 32.762882 0 0 0 4.12392-0.262743c16.02731 192.076395 169.217774 345.17547 361.328439 361.134239a34.853401 34.853401 0 0 0-0.308437 4.569439v78.434432a34.270797 34.270797 0 0 0 68.541595 0v-78.480126a34.670623 34.670623 0 0 0-0.319861-4.649405c191.368132-16.621337 343.747521-169.377704 359.843372-360.905766a35.001908 35.001908 0 0 0 5.837459 0.502638h78.434431a34.270797 34.270797 0 0 0 34.270798-34.270797 34.270797 34.270797 0 0 0-34.305069-34.270798z m-177.065786 161.940941a328.656946 328.656946 0 1 1 25.703098-127.418824 326.440768 326.440768 0 0 1-25.748792 127.418824z", "p-id": "7304" }) ], -1), vue.createElementVNode("span", { class: "action-text" }, "定位", -1) ]), 8, _hoisted_13), vue.createElementVNode("button", { class: "button", onClick: _cache[2] || (_cache[2] = ($event) => copyComment(vue.unref(comment).contentText)) }, _cache[6] || (_cache[6] = [ vue.createElementVNode("svg", { class: "icon", viewBox: "0 0 1024 1024", version: "1.1", xmlns: "http://www.w3.org/2000/svg", "p-id": "6662", width: "200", height: "200" }, [ vue.createElementVNode("path", { d: "M706.5 188.4H190.2c-29.8 0-54 24.2-54 54v662.9c0 29.8 24.2 54 54 54h516.3c29.8 0 54-24.2 54-54V242.4c0-29.8-24.2-54-54-54z m-18 698.9H208.2V260.4h480.3v626.9z", "p-id": "6663" }), vue.createElementVNode("path", { d: "M313.7 512.2h275.2c19.9 0 36-16.1 36-36s-16.1-36-36-36H313.7c-19.9 0-36 16.1-36 36s16.1 36 36 36zM313.7 715.2h201.6c19.9 0 36-16.1 36-36s-16.1-36-36-36H313.7c-19.9 0-36 16.1-36 36s16.1 36 36 36z", "p-id": "6664" }), vue.createElementVNode("path", { d: "M837.2 64.7H302.9c-19.9 0-36 16.1-36 36s16.1 36 36 36h516.3v662.9c0 19.9 16.1 36 36 36s36-16.1 36-36V118.7c0-29.8-24.2-54-54-54z", "p-id": "6665" }) ], -1), vue.createElementVNode("span", { class: "action-text" }, "复制", -1) ])), vue.renderSlot(_ctx.$slots, "default", {}, void 0, true) ]) ]) ]); }; } }; const YouTubeComment = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-e03141e7"]]); const _hoisted_1$3 = ["disabled"]; const _hoisted_2$3 = { class: "action-text" }; const _sfc_main$4 = { __name: "HotBanCommentCollector", props: ["comment"], setup(__props) { const props = __props; const collected = vue.ref(false); const loading = vue.ref(true); const db2 = vue.inject("db"); async function collectComment(comment) { if (loading.value) { return; } loading.value = true; if (collected.value) { try { await deleteComment2(comment.commentId); collected.value = false; ElementPlus.ElMessage.success("评论收藏已删除"); } catch (error) { console.error(error); ElementPlus.ElMessage.error("评论收藏删除失败"); } } else { try { let nowComment = vue.toRaw(comment); nowComment.recordedTime = Date.now(); await insert(nowComment); collected.value = true; ElementPlus.ElMessage.success("评论已保存,你可以到热门屏蔽评论收藏列表查看"); } catch (error) { console.error(error); ElementPlus.ElMessage.error("评论保存失败"); } } loading.value = false; } loadCollect(); async function loadCollect() { try { collected.value = await isCollected(props.comment.commentId); loading.value = false; } catch (error) { console.log(error); } } function isCollected(id) { return new Promise((resolve, reject) => { let req = db2.transaction("hotBanCommentCollect", "readonly").objectStore("hotBanCommentCollect").get(id); req.onsuccess = () => { resolve(req.result !== void 0); }; req.onerror = () => reject(req.error); }); } function insert(comment) { return new Promise((resolve, reject) => { let req = db2.transaction("hotBanCommentCollect", "readwrite").objectStore("hotBanCommentCollect").add(comment); req.onsuccess = (event) => { resolve(event); }; req.onerror = (event) => { reject(event); }; }); } function deleteComment2(commentId) { return new Promise((resolve, reject) => { let request = db2.transaction("hotBanCommentCollect", "readwrite").objectStore("hotBanCommentCollect").delete(commentId); request.onsuccess = (event) => { resolve(request.result); }; request.onerror = (event) => { reject(event); }; }); } return (_ctx, _cache) => { return vue.openBlock(), vue.createElementBlock("button", { class: "button", onClick: _cache[0] || (_cache[0] = ($event) => collectComment(__props.comment)), disabled: loading.value }, [ (vue.openBlock(), vue.createElementBlock("svg", { class: vue.normalizeClass(["icon", { collected: collected.value }]), viewBox: "0 0 1426 1024", version: "1.1", xmlns: "http://www.w3.org/2000/svg", "p-id": "1830", width: "200", height: "200" }, _cache[1] || (_cache[1] = [ vue.createElementVNode("path", { d: "M985.6 1022.976c-14.848 0-31.744-4.096-47.104-12.288L716.288 899.584l-223.744 111.104c-14.336 7.68-30.208 11.776-47.104 11.776-21.504 0-42.496-6.656-59.392-19.456-31.232-23.552-47.104-64-39.936-101.376l45.568-237.056-175.616-163.328c-27.136-27.648-37.376-67.072-27.136-104.448l0.512-1.024c12.8-38.4 44.544-65.024 82.944-70.144l243.712-44.544L625.152 58.88C642.56 23.552 678.4 1.024 716.288 1.024c39.424 0 76.288 23.552 91.648 58.368l109.056 221.696 243.712 42.496c38.4 5.632 70.656 33.28 81.408 71.168 12.288 36.864 2.048 77.312-25.6 104.96l-0.512 0.512-174.592 164.864 44.032 237.568c7.168 37.888-8.192 76.288-39.424 100.352-17.92 12.8-38.912 19.968-60.416 19.968z", "p-id": "1831" }, null, -1) ]), 2)), vue.createElementVNode("span", _hoisted_2$3, vue.toDisplayString(collected.value ? "移除收藏" : "收藏"), 1) ], 8, _hoisted_1$3); }; } }; const _hoisted_1$2 = { class: "hot-ban-comment-searcher" }; const _hoisted_2$2 = { key: 1, class: "warning" }; const _hoisted_3$1 = { key: 2, class: "search-progress" }; const _hoisted_4$1 = { class: "footer" }; const _hoisted_5$1 = { key: 1 }; const _sfc_main$3 = { __name: "HotBanCommentSearcher", setup(__props) { const originalFetch2 = vue.inject("originalFetch"); const getAuthorization2 = vue.inject("getAuthorization"); const getContext2 = vue.inject("getContext"); const showNcs = vue.ref(true); const showWarning = vue.ref(false); const showSearchProgress = vue.ref(false); const showResults = vue.ref(false); const progressMsg = vue.ref("加载中..."); const comments = vue.reactive([]); const hasNext = vue.ref(true); const loading = vue.ref(false); const progStatus = vue.ref(""); let nextContinuation; let cancelled = false; let hotCommentIdSet2 = /* @__PURE__ */ new Set(); let url = createUrl(); let api; let channelId; let TYPE = null; if (url.searchParams.has("v")) { TYPE = "WEB_PAGE_TYPE_WATCH"; api = "https://www.youtube.com/youtubei/v1/next?prettyPrint=false"; } else if (url.pathname.split("/").includes("post")) { TYPE = "WEB_PAGE_TYPE_BROWSE"; api = "https://www.youtube.com/youtubei/v1/browse?prettyPrint=false"; } if (TYPE) { showNcs.value = false; showWarning.value = true; } async function onSearch() { var _a, _b; showWarning.value = false; showSearchProgress.value = true; let continuation = null; if (TYPE === "WEB_PAGE_TYPE_WATCH") { continuation = createVideoRootCommentListContinuation(null, url.searchParams.get("v"), false); nextContinuation = createVideoRootCommentListContinuation(null, url.searchParams.get("v"), true); } else if (TYPE === "WEB_PAGE_TYPE_BROWSE") { channelId = (_b = (_a = ytInitialData.metadata) == null ? void 0 : _a.channelMetadataRenderer) == null ? void 0 : _b.externalId; if (!channelId) { progressMsg.value = "无法获取频道ID,请尝试刷新页面后重试!"; } continuation = createPostRootCommentListContinuation(channelId, url.pathname.split("/")[2], false); nextContinuation = createPostRootCommentListContinuation(channelId, url.pathname.split("/")[2], true); } let count = 0; while (continuation) { let data = { context: getContext2(), continuation }; let options = { method: "POST", body: JSON.stringify(data), headers: { //因为我搜索的是别人的热门屏蔽评论,所以带上认证信息也没啥(还能减轻风控?) authorization: getAuthorization2() } }; if (cancelled) { return; } let response; try { response = await (await originalFetch2(api, options)).json(); } catch (err) { progressMsg.value = "获取热门列表失败,您可以关闭后重试!"; return; } let mutations = response.frameworkUpdates.entityBatchUpdate.mutations; for (let mutation of mutations) { if (mutation.payload.commentEntityPayload) { hotCommentIdSet2.add(mutation.payload.commentEntityPayload.properties.commentId); count++; progressMsg.value = `正在获取热门评论(已获取 ${count} 个)……`; } } continuation = findNextContinuation(response); } next(); } function onEndReached(direction) { if (direction == "bottom") { next(); } } async function next() { var _a, _b, _c, _d, _e; if (!hasNext.value || loading.value || cancelled) { return; } loading.value = true; showSearchProgress.value = false; showResults.value = true; let count = 0; while (count < 20) { let data = { context: getContext2(), continuation: nextContinuation }; let options = { method: "POST", body: JSON.stringify(data), headers: { authorization: getAuthorization2() } }; if (cancelled) { return; } let response; try { response = await (await originalFetch2(api, options)).json(); } catch (err) { progStatus.value = "exception"; return; } nextContinuation = null; for (const endpoint of response.onResponseReceivedEndpoints) { const items = ((_a = endpoint.appendContinuationItemsAction) == null ? void 0 : _a.continuationItems) || ((_b = endpoint.reloadContinuationItemsCommand) == null ? void 0 : _b.continuationItems); if (!items) continue; for (const item of items) { const token = (_e = (_d = (_c = item.continuationItemRenderer) == null ? void 0 : _c.continuationEndpoint) == null ? void 0 : _d.continuationCommand) == null ? void 0 : _e.token; if (token) { nextContinuation = token; break; } } if (nextContinuation) break; } let mutations = response.frameworkUpdates.entityBatchUpdate.mutations; for (let i = 0; i < mutations.length; i++) { let mutation = mutations[i]; if (mutation.payload.commentEntityPayload) { let entity = mutation.payload.commentEntityPayload; let commentId = entity.properties.commentId; if (!hotCommentIdSet2.has(commentId)) { let likeCount = parseInt(entity.toolbar.likeCountNotliked); likeCount = likeCount ? likeCount : 0; let replyCount = parseInt(entity.toolbar.replyCount); replyCount = replyCount ? replyCount : 0; let url2 = mutations[i + 1].payload.commentSurfaceEntityPayload.publishedTimeCommand.innertubeCommand.commandMetadata.webCommandMetadata.url; count++; comments.push({ commentId, url: url2, userDisplayName: entity.author.displayName, userProfileImageUrl: entity.avatar.image.sources[0].url, likeCount, replyCount, publishedTime: entity.properties.publishedTime, contentText: entity.properties.content.content }); } } } if (!nextContinuation) { hasNext.value = false; break; } } loading.value = false; } vue.onUnmounted(() => { cancelled = true; }); return (_ctx, _cache) => { const _component_el_empty = vue.resolveComponent("el-empty"); const _component_el_divider = vue.resolveComponent("el-divider"); const _component_el_button = vue.resolveComponent("el-button"); const _component_el_progress = vue.resolveComponent("el-progress"); const _component_el_scrollbar = vue.resolveComponent("el-scrollbar"); return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$2, [ showNcs.value ? (vue.openBlock(), vue.createBlock(_component_el_empty, { key: 0, description: "请在有评论区(视频、帖子)的页面使用此功能", class: "not-comment-section" })) : vue.createCommentVNode("", true), showWarning.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$2, [ _cache[1] || (_cache[1] = vue.createElementVNode("svg", { class: "warn-icon", viewBox: "0 0 1024 1024", version: "1.1", xmlns: "http://www.w3.org/2000/svg", "p-id": "4518", width: "64", height: "64" }, [ vue.createElementVNode("path", { d: "M1001.661867 796.544c48.896 84.906667 7.68 157.013333-87.552 157.013333H110.781867c-97.834667 0-139.050667-69.504-90.112-157.013333l401.664-666.88c48.896-87.552 128.725333-87.552 177.664 0l401.664 666.88zM479.165867 296.533333v341.333334a32 32 0 1 0 64 0v-341.333334a32 32 0 1 0-64 0z m0 469.333334v42.666666a32 32 0 1 0 64 0v-42.666666a32 32 0 1 0-64 0z", fill: "#FAAD14", "p-id": "4519" }) ], -1)), _cache[2] || (_cache[2] = vue.createElementVNode("h2", { class: "warning-title" }, "警告", -1)), _cache[3] || (_cache[3] = vue.createElementVNode("p", { class: "warning-text" }, [ vue.createTextVNode("将会获取所有热门评论,之后懒加载按时间评论"), vue.createElementVNode("br"), vue.createTextVNode(" 评论区数量过多(例如超过 5000 条),获取热门评论的过程将非常漫长,且过多的API调用可能导致不可预料的后果,请酌情使用! ") ], -1)), vue.createVNode(_component_el_divider, { class: "warning-divider" }), vue.createVNode(_component_el_button, { type: "primary", onClick: onSearch }, { default: vue.withCtx(() => _cache[0] || (_cache[0] = [ vue.createTextVNode("搜索") ])), _: 1, __: [0] }) ])) : vue.createCommentVNode("", true), showSearchProgress.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3$1, [ vue.createElementVNode("p", null, vue.toDisplayString(progressMsg.value), 1), vue.createVNode(_component_el_progress, { percentage: 50, indeterminate: true, "show-text": false }) ])) : vue.createCommentVNode("", true), showResults.value ? (vue.openBlock(), vue.createBlock(_component_el_scrollbar, { key: 3, class: "search-results" }, { default: vue.withCtx(() => [ vue.createElementVNode("div", { onEndReached, distance: 500 }, [ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(comments, (comment) => { return vue.openBlock(), vue.createBlock(YouTubeComment, { key: comment.commentId, comment }, { default: vue.withCtx(() => [ vue.createVNode(_sfc_main$4, { comment }, null, 8, ["comment"]) ]), _: 2 }, 1032, ["comment"]); }), 128)), vue.createElementVNode("div", _hoisted_4$1, [ loading.value ? (vue.openBlock(), vue.createBlock(_component_el_progress, { key: 0, percentage: 50, indeterminate: true, "show-text": false, status: progStatus.value, duration: 1 }, null, 8, ["status"])) : vue.createCommentVNode("", true), !hasNext.value ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_5$1, "- PAGE END -")) : vue.createCommentVNode("", true) ]) ], 32) ]), _: 1 })) : vue.createCommentVNode("", true) ]); }; } }; const HotBanCommentSearcher = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__scopeId", "data-v-658a2b6f"]]); /*! * pinia v3.0.3 * (c) 2025 Eduardo San Martin Morote * @license MIT */ let activePinia; const setActivePinia = (pinia2) => activePinia = pinia2; const piniaSymbol = ( /* istanbul ignore next */ Symbol() ); function isPlainObject(o) { return o && typeof o === "object" && Object.prototype.toString.call(o) === "[object Object]" && typeof o.toJSON !== "function"; } var MutationType; (function(MutationType2) { MutationType2["direct"] = "direct"; MutationType2["patchObject"] = "patch object"; MutationType2["patchFunction"] = "patch function"; })(MutationType || (MutationType = {})); function createPinia() { const scope = vue.effectScope(true); const state = scope.run(() => vue.ref({})); let _p = []; let toBeInstalled = []; const pinia2 = vue.markRaw({ install(app) { setActivePinia(pinia2); pinia2._a = app; app.provide(piniaSymbol, pinia2); app.config.globalProperties.$pinia = pinia2; toBeInstalled.forEach((plugin) => _p.push(plugin)); toBeInstalled = []; }, use(plugin) { if (!this._a) { toBeInstalled.push(plugin); } else { _p.push(plugin); } return this; }, _p, // it's actually undefined here // @ts-expect-error _a: null, _e: scope, _s: /* @__PURE__ */ new Map(), state }); return pinia2; } const noop = () => { }; function addSubscription(subscriptions, callback, detached, onCleanup = noop) { subscriptions.push(callback); const removeSubscription = () => { const idx = subscriptions.indexOf(callback); if (idx > -1) { subscriptions.splice(idx, 1); onCleanup(); } }; if (!detached && vue.getCurrentScope()) { vue.onScopeDispose(removeSubscription); } return removeSubscription; } function triggerSubscriptions(subscriptions, ...args) { subscriptions.slice().forEach((callback) => { callback(...args); }); } const fallbackRunWithContext = (fn) => fn(); const ACTION_MARKER = Symbol(); const ACTION_NAME = Symbol(); function mergeReactiveObjects(target, patchToApply) { if (target instanceof Map && patchToApply instanceof Map) { patchToApply.forEach((value, key) => target.set(key, value)); } else if (target instanceof Set && patchToApply instanceof Set) { patchToApply.forEach(target.add, target); } for (const key in patchToApply) { if (!patchToApply.hasOwnProperty(key)) continue; const subPatch = patchToApply[key]; const targetValue = target[key]; if (isPlainObject(targetValue) && isPlainObject(subPatch) && target.hasOwnProperty(key) && !vue.isRef(subPatch) && !vue.isReactive(subPatch)) { target[key] = mergeReactiveObjects(targetValue, subPatch); } else { target[key] = subPatch; } } return target; } const skipHydrateSymbol = ( /* istanbul ignore next */ Symbol() ); function shouldHydrate(obj) { return !isPlainObject(obj) || !Object.prototype.hasOwnProperty.call(obj, skipHydrateSymbol); } const { assign } = Object; function isComputed(o) { return !!(vue.isRef(o) && o.effect); } function createOptionsStore(id, options, pinia2, hot) { const { state, actions, getters } = options; const initialState = pinia2.state.value[id]; let store; function setup() { if (!initialState && true) { pinia2.state.value[id] = state ? state() : {}; } const localState = vue.toRefs(pinia2.state.value[id]); return assign(localState, actions, Object.keys(getters || {}).reduce((computedGetters, name) => { computedGetters[name] = vue.markRaw(vue.computed(() => { setActivePinia(pinia2); const store2 = pinia2._s.get(id); return getters[name].call(store2, store2); })); return computedGetters; }, {})); } store = createSetupStore(id, setup, options, pinia2, hot, true); return store; } function createSetupStore($id, setup, options = {}, pinia2, hot, isOptionsStore) { let scope; const optionsForPlugin = assign({ actions: {} }, options); const $subscribeOptions = { deep: true }; let isListening; let isSyncListening; let subscriptions = []; let actionSubscriptions = []; let debuggerEvents; const initialState = pinia2.state.value[$id]; if (!isOptionsStore && !initialState && true) { pinia2.state.value[$id] = {}; } vue.ref({}); let activeListener; function $patch(partialStateOrMutator) { let subscriptionMutation; isListening = isSyncListening = false; if (typeof partialStateOrMutator === "function") { partialStateOrMutator(pinia2.state.value[$id]); subscriptionMutation = { type: MutationType.patchFunction, storeId: $id, events: debuggerEvents }; } else { mergeReactiveObjects(pinia2.state.value[$id], partialStateOrMutator); subscriptionMutation = { type: MutationType.patchObject, payload: partialStateOrMutator, storeId: $id, events: debuggerEvents }; } const myListenerId = activeListener = Symbol(); vue.nextTick().then(() => { if (activeListener === myListenerId) { isListening = true; } }); isSyncListening = true; triggerSubscriptions(subscriptions, subscriptionMutation, pinia2.state.value[$id]); } const $reset = isOptionsStore ? function $reset2() { const { state } = options; const newState = state ? state() : {}; this.$patch(($state) => { assign($state, newState); }); } : ( /* istanbul ignore next */ noop ); function $dispose() { scope.stop(); subscriptions = []; actionSubscriptions = []; pinia2._s.delete($id); } const action = (fn, name = "") => { if (ACTION_MARKER in fn) { fn[ACTION_NAME] = name; return fn; } const wrappedAction = function() { setActivePinia(pinia2); const args = Array.from(arguments); const afterCallbackList = []; const onErrorCallbackList = []; function after(callback) { afterCallbackList.push(callback); } function onError(callback) { onErrorCallbackList.push(callback); } triggerSubscriptions(actionSubscriptions, { args, name: wrappedAction[ACTION_NAME], store, after, onError }); let ret; try { ret = fn.apply(this && this.$id === $id ? this : store, args); } catch (error) { triggerSubscriptions(onErrorCallbackList, error); throw error; } if (ret instanceof Promise) { return ret.then((value) => { triggerSubscriptions(afterCallbackList, value); return value; }).catch((error) => { triggerSubscriptions(onErrorCallbackList, error); return Promise.reject(error); }); } triggerSubscriptions(afterCallbackList, ret); return ret; }; wrappedAction[ACTION_MARKER] = true; wrappedAction[ACTION_NAME] = name; return wrappedAction; }; const partialStore = { _p: pinia2, // _s: scope, $id, $onAction: addSubscription.bind(null, actionSubscriptions), $patch, $reset, $subscribe(callback, options2 = {}) { const removeSubscription = addSubscription(subscriptions, callback, options2.detached, () => stopWatcher()); const stopWatcher = scope.run(() => vue.watch(() => pinia2.state.value[$id], (state) => { if (options2.flush === "sync" ? isSyncListening : isListening) { callback({ storeId: $id, type: MutationType.direct, events: debuggerEvents }, state); } }, assign({}, $subscribeOptions, options2))); return removeSubscription; }, $dispose }; const store = vue.reactive(partialStore); pinia2._s.set($id, store); const runWithContext = pinia2._a && pinia2._a.runWithContext || fallbackRunWithContext; const setupStore = runWithContext(() => pinia2._e.run(() => (scope = vue.effectScope()).run(() => setup({ action })))); for (const key in setupStore) { const prop = setupStore[key]; if (vue.isRef(prop) && !isComputed(prop) || vue.isReactive(prop)) { if (!isOptionsStore) { if (initialState && shouldHydrate(prop)) { if (vue.isRef(prop)) { prop.value = initialState[key]; } else { mergeReactiveObjects(prop, initialState[key]); } } pinia2.state.value[$id][key] = prop; } } else if (typeof prop === "function") { const actionValue = action(prop, key); setupStore[key] = actionValue; optionsForPlugin.actions[key] = prop; } else ; } assign(store, setupStore); assign(vue.toRaw(store), setupStore); Object.defineProperty(store, "$state", { get: () => pinia2.state.value[$id], set: (state) => { $patch(($state) => { assign($state, state); }); } }); pinia2._p.forEach((extender) => { { assign(store, scope.run(() => extender({ store, app: pinia2._a, pinia: pinia2, options: optionsForPlugin }))); } }); if (initialState && isOptionsStore && options.hydrate) { options.hydrate(store.$state, initialState); } isListening = true; isSyncListening = true; return store; } /*! #__NO_SIDE_EFFECTS__ */ // @__NO_SIDE_EFFECTS__ function defineStore(id, setup, setupOptions) { let options; const isSetupStore = typeof setup === "function"; options = isSetupStore ? setupOptions : setup; function useStore(pinia2, hot) { const hasContext = vue.hasInjectionContext(); pinia2 = // in test mode, ignore the argument provided as we can always retrieve a // pinia instance with getActivePinia() pinia2 || (hasContext ? vue.inject(piniaSymbol, null) : null); if (pinia2) setActivePinia(pinia2); pinia2 = activePinia; if (!pinia2._s.has(id)) { if (isSetupStore) { createSetupStore(id, setup, options, pinia2); } else { createOptionsStore(id, options, pinia2); } } const store = pinia2._s.get(id); return store; } useStore.$id = id; return useStore; } const useSettingsStore = /* @__PURE__ */ defineStore("settings", { state: () => { let defaultSetting = { forceTimeSort: false, showBlockedHotComments: false, unlockKidsVideoSaveButton: true, hotBanCheckCountCondition: "1000", autoHotBanCheck: true }; let local = JSON.parse(localStorage.getItem("yt-ccd-settings")); if (local) { return Object.assign(defaultSetting, local); } else { return defaultSetting; } } }); const _hoisted_1$1 = { class: "settings-container" }; const _hoisted_2$1 = { class: "setting-item" }; const _hoisted_3 = { class: "setting-item" }; const _hoisted_4 = { class: "setting-item" }; const _hoisted_5 = { class: "setting-info" }; const _hoisted_6 = { class: "setting-item" }; const _hoisted_7 = { class: "setting-item" }; const _sfc_main$2 = { __name: "Settings", setup(__props) { const settings2 = useSettingsStore(); vue.watch(() => settings2.$state, (newState) => { console.log(newState); localStorage.setItem("yt-ccd-settings", JSON.stringify(newState)); }, { deep: true }); return (_ctx, _cache) => { const _component_el_switch = vue.resolveComponent("el-switch"); const _component_el_divider = vue.resolveComponent("el-divider"); const _component_el_input = vue.resolveComponent("el-input"); return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$1, [ _cache[11] || (_cache[11] = vue.createElementVNode("h2", { class: "title" }, "二级评论(回复/楼中楼)", -1)), vue.createElementVNode("div", _hoisted_2$1, [ _cache[5] || (_cache[5] = vue.createElementVNode("div", { class: "setting-info" }, [ vue.createElementVNode("span", { class: "setting-label" }, "二级评论列表强制最新排序"), vue.createElementVNode("p", { class: "setting-desc" }, "无论评论区的排序方式如何,二级评论始终按最新排序") ], -1)), vue.createVNode(_component_el_switch, { modelValue: vue.unref(settings2).forceTimeSort, "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => vue.unref(settings2).forceTimeSort = $event) }, null, 8, ["modelValue"]) ]), vue.createVNode(_component_el_divider), vue.createElementVNode("div", _hoisted_3, [ _cache[6] || (_cache[6] = vue.createElementVNode("div", { class: "setting-info" }, [ vue.createElementVNode("span", { class: "setting-label" }, "搜索并显示被热门屏蔽的二级评论"), vue.createElementVNode("p", { class: "setting-desc" }, "在前者的基础上,先获取一次所有的热门评论,最新排序的评论若热门列表没有,则标注“(热门屏蔽的)”") ], -1)), vue.createVNode(_component_el_switch, { modelValue: vue.unref(settings2).showBlockedHotComments, "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => vue.unref(settings2).showBlockedHotComments = $event), disabled: !vue.unref(settings2).forceTimeSort }, null, 8, ["modelValue", "disabled"]) ]), vue.createVNode(_component_el_divider), _cache[12] || (_cache[12] = vue.createElementVNode("h2", { class: "title" }, "热门屏蔽检查", -1)), vue.createElementVNode("div", _hoisted_4, [ vue.createElementVNode("div", _hoisted_5, [ _cache[7] || (_cache[7] = vue.createElementVNode("span", { class: "setting-label" }, "数量条件", -1)), _cache[8] || (_cache[8] = vue.createElementVNode("p", { class: "setting-desc" }, "当评论区评论数量小于多少时不检查不弹窗警告", -1)), vue.createVNode(_component_el_input, { type: "number", modelValue: vue.unref(settings2).hotBanCheckCountCondition, "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => vue.unref(settings2).hotBanCheckCountCondition = $event), style: { "width": "240px" } }, null, 8, ["modelValue"]) ]) ]), vue.createVNode(_component_el_divider), vue.createElementVNode("div", _hoisted_6, [ _cache[9] || (_cache[9] = vue.createElementVNode("div", { class: "setting-info" }, [ vue.createElementVNode("span", { class: "setting-label" }, "自动检查热门屏蔽"), vue.createElementVNode("p", { class: "setting-desc" }, "在检查流程完毕后,若评论区评论数量小于设定的数量条件时,自动检查是否热门屏蔽") ], -1)), vue.createVNode(_component_el_switch, { modelValue: vue.unref(settings2).autoHotBanCheck, "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => vue.unref(settings2).autoHotBanCheck = $event) }, null, 8, ["modelValue"]) ]), vue.createVNode(_component_el_divider), _cache[13] || (_cache[13] = vue.createElementVNode("h2", { class: "title" }, "爱童TV(面向儿童的视频)", -1)), vue.createElementVNode("div", _hoisted_7, [ _cache[10] || (_cache[10] = vue.createElementVNode("div", { class: "setting-info" }, [ vue.createElementVNode("span", { class: "setting-label" }, "解锁保存(收藏)按钮"), vue.createElementVNode("p", { class: "setting-desc" }, [ vue.createTextVNode("禁止儿童收藏视频还能保护儿童的隐私?白左们神一样的脑回路😅! "), vue.createElementVNode("br"), vue.createTextVNode("幸好开发者也只做了前端限制应付一下,此选项可恢复收藏按钮 ") ]), vue.createCommentVNode(" \r\n打着“保护儿童”的名义,对YouTube处以1.7亿美元罚款,最终却导致平台对儿童内容作出许多无法理解的功能阉割。\r\n不去约束平台的数据机制与透明性,却在模糊的儿童隐私边界上施加高压监管。\r\n\r\nCOPPA通过高罚款与模糊边界,迫使平台采取“一刀切”策略,对儿童内容施加一系列不可理喻的限制,连目标保护的儿童用户都难以接受\r\n立法者们根本不是为了儿童着想,而是为了敛财罢了\r\n "), vue.createCommentVNode(" So legislators of COPPA, fuck you! "), vue.createCommentVNode(" \r\n....................../´¯/) \r\n....................,/¯../ \r\n.................../..../ \r\n............./´¯/'...'/´¯¯`·¸ \r\n........../'/.../..../......./¨¯\\ \r\n........('(...´...´.... ¯~/'...') \r\n.........\\.................'...../ \r\n..........''...\\.......... _.·´ \r\n............\\..............( \r\n..............\\.............\\... \r\n ") ], -1)), vue.createVNode(_component_el_switch, { modelValue: vue.unref(settings2).unlockKidsVideoSaveButton, "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => vue.unref(settings2).unlockKidsVideoSaveButton = $event) }, null, 8, ["modelValue"]) ]) ]); }; } }; const Settings = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-a3a10182"]]); const _hoisted_1 = { class: "toolbar" }; const _hoisted_2 = ["onClick"]; const pageSize = 20; const _sfc_main$1 = { __name: "HotBanCommentCollect", setup(__props) { const db2 = vue.inject("db"); const selectedTime = vue.ref(null); const keyword = vue.ref(""); const comments = vue.reactive([]); const commentObjectKeys = [ "commentId", "url", "userDisplayName", "userProfileImageUrl", "likeCount", "replyCount", "publishedTime", "contentText", "recordedTime" ]; const loadingComments = vue.ref(false); const finished = vue.ref(false); let timeCursor = null; function publishedAtFormatter(comment) { return "收藏于:" + formatTimestamp(comment.recordedTime); } function reloadComments() { if (loadingComments.value) { return; } finished.value = false; comments.length = 0; if (selectedTime.value) { timeCursor = selectedTime.value.getTime(); } else { timeCursor = null; } loadComments(); } function onEndReached(direction) { if (direction == "bottom") { loadComments(); } } async function loadComments() { if (loadingComments.value || finished.value) { return; } loadingComments.value = true; selectedTime.value; await loadCommentPage(); loadingComments.value = false; } function loadCommentPage() { return new Promise((resolve, reject) => { let transaction = db2.transaction("hotBanCommentCollect").objectStore("hotBanCommentCollect").index("recordedTime").openCursor(timeCursor ? IDBKeyRange.upperBound(timeCursor) : null, "prev"); let count = 0; transaction.onsuccess = (event) => { var cursor = event.target.result; if (cursor) { if (count < pageSize) { let value = cursor.value; let textSearch = keyword.value; if (textSearch == "" || value.contentText.indexOf(textSearch) != -1) { comments.push(value); count++; } cursor.continue(); } else { timeCursor = cursor.value.recordedTime; resolve(); } } else { timeCursor = null; finished.value = true; resolve(); } }; transaction.onerror = (event) => { reject(event); }; }); } async function onDeleteComment(comment) { try { await ElementPlus.ElMessageBox.confirm( "确认要删除评论吗?", "警告", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning" } ); } catch (error) { return; } try { await deleteComment2(comment.commentId); const index = comments.findIndex((item) => item.commentId === comment.commentId); if (index !== -1) { comments.splice(index, 1); } ElementPlus.ElMessage.success("删除成功"); } catch (error) { console.error(error); ElementPlus.ElMessage.error("删除失败"); } } function deleteComment2(commentId) { return new Promise((resolve, reject) => { let request = db2.transaction("hotBanCommentCollect", "readwrite").objectStore("hotBanCommentCollect").delete(commentId); request.onsuccess = (event) => { resolve(request.result); }; request.onerror = (event) => { reject(event); }; }); } loadComments(); function getComment(commentId) { return new Promise((resolve, reject) => { let req = db2.transaction("hotBanCommentCollect", "readonly").objectStore("hotBanCommentCollect").get(commentId); req.onsuccess = () => { resolve(req.result); }; req.onerror = () => reject(req.error); }); } function insertComment2(comment) { return new Promise((resolve, reject) => { let request = db2.transaction("hotBanCommentCollect", "readwrite").objectStore("hotBanCommentCollect").add(comment); request.onsuccess = (event) => { resolve(event); }; request.onerror = (event) => { reject(event.target.error); }; }); } function generateName() { return "collect-hotban-comments-export_" + nowDate(); } function getDataToExport() { return new Promise((resolve, reject) => { let transaction = db2.transaction("hotBanCommentCollect").objectStore("hotBanCommentCollect").index("recordedTime").openCursor(null, "prev"); let localComments = []; transaction.onsuccess = (event) => { var cursor = event.target.result; if (cursor) { cursor.continue(); localComments.push(cursor.value); } else { resolve(localComments); } }; transaction.onerror = (event) => { reject(event); }; }); } async function handleImportData(data) { if (!data || !data instanceof Array) { ElementPlus.ElMessage.error("非法数据"); return; } let successCount = 0; let skippedCount = 0; let invalidCount = 0; let failedCount = 0; for (let item of data) { if (validateObjectKeys(item, commentObjectKeys)) { try { let comment = await getComment(item.commentId); if (comment) { skippedCount++; console.log("已跳过评论数据", item); } else { await insertComment2(item); successCount++; console.log("已插入评论数据", item); } } catch (error) { failedCount++; console.error("评论导入时出错", error); } } else { invalidCount++; console.error("非法的评论数据", item); } } reloadComments(); ElementPlus.ElMessage.success(`已导入 成功${successCount}条 失败${failedCount}条 跳过${skippedCount}条 无效${invalidCount}条`); } return (_ctx, _cache) => { const _component_el_date_picker = vue.resolveComponent("el-date-picker"); const _component_el_button = vue.resolveComponent("el-button"); const _component_el_input = vue.resolveComponent("el-input"); const _component_el_scrollbar = vue.resolveComponent("el-scrollbar"); return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [ vue.createElementVNode("div", _hoisted_1, [ vue.createVNode(_component_el_date_picker, { modelValue: selectedTime.value, "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => selectedTime.value = $event), type: "datetime", placeholder: "从指定收藏时间开始", clearable: "", style: { "width": "220px" }, onChange: reloadComments }, null, 8, ["modelValue"]), vue.createVNode(_component_el_input, { modelValue: keyword.value, "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => keyword.value = $event), placeholder: "搜索评论内容", clearable: "", style: { "width": "260px" }, onKeyup: vue.withKeys(reloadComments, ["enter"]), onClear: reloadComments }, { append: vue.withCtx(() => [ vue.createVNode(_component_el_button, { onClick: reloadComments }, { default: vue.withCtx(() => _cache[2] || (_cache[2] = [ vue.createTextVNode(" 搜索 ") ])), _: 1, __: [2] }) ]), _: 1 }, 8, ["modelValue"]), vue.createVNode(_sfc_main$8, { getFilenameFn: generateName, fetchDataFn: getDataToExport }, { default: vue.withCtx(() => _cache[3] || (_cache[3] = [ vue.createTextVNode("导出") ])), _: 1, __: [3] }), vue.createVNode(_sfc_main$7, { onSuccess: handleImportData }, { default: vue.withCtx(() => _cache[4] || (_cache[4] = [ vue.createTextVNode("导入") ])), _: 1, __: [4] }) ]), vue.createVNode(_component_el_scrollbar, { height: "100%", onEndReached }, { default: vue.withCtx(() => [ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(comments, (comment) => { return vue.openBlock(), vue.createBlock(YouTubeComment, { comment, publishedAtFormatter, key: comment.commentId }, { default: vue.withCtx(() => [ vue.createElementVNode("button", { class: "button", onClick: ($event) => onDeleteComment(comment) }, _cache[5] || (_cache[5] = [ vue.createElementVNode("svg", { class: "icon", viewBox: "0 0 1024 1024", version: "1.1", xmlns: "http://www.w3.org/2000/svg", "p-id": "7925", width: "200", height: "200" }, [ vue.createElementVNode("path", { d: "M799.2 874.4c0 34.4-28.001 62.4-62.4 62.4H287.2c-34.4 0-62.4-28-62.4-62.4V212h574.4v662.4zM349.6 100c0-7.2 5.6-12.8 12.8-12.8h300c7.2 0 12.8 5.6 12.8 12.8v37.6H349.6V100z m636.8 37.6H749.6V100c0-48.001-39.2-87.2-87.2-87.2h-300c-48 0-87.2 39.199-87.2 87.2v37.6H37.6C16.8 137.6 0 154.4 0 175.2s16.8 37.6 37.6 37.6h112v661.6c0 76 61.6 137.6 137.6 137.6h449.6c76 0 137.6-61.6 137.6-137.6V212h112c20.8 0 37.6-16.8 37.6-37.6s-16.8-36.8-37.6-36.8zM512 824c20.8 0 37.6-16.8 37.6-37.6v-400c0-20.8-16.8-37.6-37.6-37.6s-37.6 16.8-37.6 37.6v400c0 20.8 16.8 37.6 37.6 37.6m-175.2 0c20.8 0 37.6-16.8 37.6-37.6v-400c0-20.8-16.8-37.6-37.6-37.6s-37.6 16.8-37.6 37.6v400c0.8 20.8 17.6 37.6 37.6 37.6m350.4 0c20.8 0 37.6-16.8 37.6-37.6v-400c0-20.8-16.8-37.6-37.6-37.6s-37.6 16.8-37.6 37.6v400c0 20.8 16.8 37.6 37.6 37.6", "p-id": "7926" }) ], -1), vue.createElementVNode("span", { class: "action-text" }, "删除收藏", -1) ]), 8, _hoisted_2) ]), _: 2 }, 1032, ["comment"]); }), 128)) ]), _: 1 }) ], 64); }; } }; const _sfc_main = { __name: "App", setup(__props) { let historiesVisible = vue.ref(false); let searchHotBanVisible = vue.ref(false); let settingsVisible = vue.ref(false); let collectedHotBanCommentVisible = vue.ref(false); const menuListener = vue.inject("menuListener"); menuListener.onOpenHistory = () => { historiesVisible.value = true; }; menuListener.onSearchHotBan = () => { searchHotBanVisible.value = true; }; menuListener.onOpenSettings = () => { settingsVisible.value = true; }; menuListener.onOpenHotBanCollect = () => { collectedHotBanCommentVisible.value = true; }; return (_ctx, _cache) => { const _component_el_dialog = vue.resolveComponent("el-dialog"); const _component_el_scrollbar = vue.resolveComponent("el-scrollbar"); return vue.openBlock(), vue.createElementBlock("div", null, [ vue.createVNode(_component_el_dialog, { modelValue: vue.unref(historiesVisible), "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => vue.isRef(historiesVisible) ? historiesVisible.value = $event : historiesVisible = $event), title: "历史评论列表", width: "80%", style: { "height": "92vh" }, "body-class": "dialog-body", "align-center": "", "destroy-on-close": "" }, { default: vue.withCtx(() => [ vue.createVNode(CommentHistories) ]), _: 1 }, 8, ["modelValue"]), vue.createVNode(_component_el_dialog, { modelValue: vue.unref(searchHotBanVisible), "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => vue.isRef(searchHotBanVisible) ? searchHotBanVisible.value = $event : searchHotBanVisible = $event), title: "热门屏蔽评论搜索", width: "80%", style: { "height": "92vh" }, "body-class": "dialog-body", "align-center": "", "destroy-on-close": "" }, { default: vue.withCtx(() => [ vue.createVNode(HotBanCommentSearcher) ]), _: 1 }, 8, ["modelValue"]), vue.createVNode(_component_el_dialog, { modelValue: vue.unref(settingsVisible), "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => vue.isRef(settingsVisible) ? settingsVisible.value = $event : settingsVisible = $event), title: "设置", width: "60%", style: { "height": "92vh" }, "body-class": "dialog-body", "align-center": "", "destroy-on-close": "" }, { default: vue.withCtx(() => [ vue.createVNode(_component_el_scrollbar, null, { default: vue.withCtx(() => [ vue.createVNode(Settings) ]), _: 1 }) ]), _: 1 }, 8, ["modelValue"]), vue.createVNode(_component_el_dialog, { modelValue: vue.unref(collectedHotBanCommentVisible), "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => vue.isRef(collectedHotBanCommentVisible) ? collectedHotBanCommentVisible.value = $event : collectedHotBanCommentVisible = $event), title: "热门屏蔽评论收藏", width: "80%", style: { "height": "92vh" }, "body-class": "dialog-body", "align-center": "", "destroy-on-close": "" }, { default: vue.withCtx(() => [ vue.createVNode(_sfc_main$1) ]), _: 1 }, 8, ["modelValue"]) ]); }; } }; const App = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-ffd6c60d"]]); var es_array_concat = {}; var globalThis_1; var hasRequiredGlobalThis; function requireGlobalThis() { if (hasRequiredGlobalThis) return globalThis_1; hasRequiredGlobalThis = 1; var check2 = function(it) { return it && it.Math === Math && it; }; globalThis_1 = // eslint-disable-next-line es/no-global-this -- safe check2(typeof globalThis == "object" && globalThis) || check2(typeof window == "object" && window) || // eslint-disable-next-line no-restricted-globals -- safe check2(typeof self == "object" && self) || check2(typeof commonjsGlobal == "object" && commonjsGlobal) || check2(typeof globalThis_1 == "object" && globalThis_1) || // eslint-disable-next-line no-new-func -- fallback /* @__PURE__ */ function() { return this; }() || Function("return this")(); return globalThis_1; } var objectGetOwnPropertyDescriptor = {}; var fails; var hasRequiredFails; function requireFails() { if (hasRequiredFails) return fails; hasRequiredFails = 1; fails = function(exec) { try { return !!exec(); } catch (error) { return true; } }; return fails; } var descriptors; var hasRequiredDescriptors; function requireDescriptors() { if (hasRequiredDescriptors) return descriptors; hasRequiredDescriptors = 1; var fails2 = requireFails(); descriptors = !fails2(function() { return Object.defineProperty({}, 1, { get: function() { return 7; } })[1] !== 7; }); return descriptors; } var functionBindNative; var hasRequiredFunctionBindNative; function requireFunctionBindNative() { if (hasRequiredFunctionBindNative) return functionBindNative; hasRequiredFunctionBindNative = 1; var fails2 = requireFails(); functionBindNative = !fails2(function() { var test = (function() { }).bind(); return typeof test != "function" || test.hasOwnProperty("prototype"); }); return functionBindNative; } var functionCall; var hasRequiredFunctionCall; function requireFunctionCall() { if (hasRequiredFunctionCall) return functionCall; hasRequiredFunctionCall = 1; var NATIVE_BIND = requireFunctionBindNative(); var call = Function.prototype.call; functionCall = NATIVE_BIND ? call.bind(call) : function() { return call.apply(call, arguments); }; return functionCall; } var objectPropertyIsEnumerable = {}; var hasRequiredObjectPropertyIsEnumerable; function requireObjectPropertyIsEnumerable() { if (hasRequiredObjectPropertyIsEnumerable) return objectPropertyIsEnumerable; hasRequiredObjectPropertyIsEnumerable = 1; var $propertyIsEnumerable = {}.propertyIsEnumerable; var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; var NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1); objectPropertyIsEnumerable.f = NASHORN_BUG ? function propertyIsEnumerable(V) { var descriptor = getOwnPropertyDescriptor(this, V); return !!descriptor && descriptor.enumerable; } : $propertyIsEnumerable; return objectPropertyIsEnumerable; } var createPropertyDescriptor; var hasRequiredCreatePropertyDescriptor; function requireCreatePropertyDescriptor() { if (hasRequiredCreatePropertyDescriptor) return createPropertyDescriptor; hasRequiredCreatePropertyDescriptor = 1; createPropertyDescriptor = function(bitmap, value) { return { enumerable: !(bitmap & 1), configurable: !(bitmap & 2), writable: !(bitmap & 4), value }; }; return createPropertyDescriptor; } var functionUncurryThis; var hasRequiredFunctionUncurryThis; function requireFunctionUncurryThis() { if (hasRequiredFunctionUncurryThis) return functionUncurryThis; hasRequiredFunctionUncurryThis = 1; var NATIVE_BIND = requireFunctionBindNative(); var FunctionPrototype = Function.prototype; var call = FunctionPrototype.call; var uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call); functionUncurryThis = NATIVE_BIND ? uncurryThisWithBind : function(fn) { return function() { return call.apply(fn, arguments); }; }; return functionUncurryThis; } var classofRaw; var hasRequiredClassofRaw; function requireClassofRaw() { if (hasRequiredClassofRaw) return classofRaw; hasRequiredClassofRaw = 1; var uncurryThis = requireFunctionUncurryThis(); var toString2 = uncurryThis({}.toString); var stringSlice = uncurryThis("".slice); classofRaw = function(it) { return stringSlice(toString2(it), 8, -1); }; return classofRaw; } var indexedObject; var hasRequiredIndexedObject; function requireIndexedObject() { if (hasRequiredIndexedObject) return indexedObject; hasRequiredIndexedObject = 1; var uncurryThis = requireFunctionUncurryThis(); var fails2 = requireFails(); var classof2 = requireClassofRaw(); var $Object = Object; var split = uncurryThis("".split); indexedObject = fails2(function() { return !$Object("z").propertyIsEnumerable(0); }) ? function(it) { return classof2(it) === "String" ? split(it, "") : $Object(it); } : $Object; return indexedObject; } var isNullOrUndefined; var hasRequiredIsNullOrUndefined; function requireIsNullOrUndefined() { if (hasRequiredIsNullOrUndefined) return isNullOrUndefined; hasRequiredIsNullOrUndefined = 1; isNullOrUndefined = function(it) { return it === null || it === void 0; }; return isNullOrUndefined; } var requireObjectCoercible; var hasRequiredRequireObjectCoercible; function requireRequireObjectCoercible() { if (hasRequiredRequireObjectCoercible) return requireObjectCoercible; hasRequiredRequireObjectCoercible = 1; var isNullOrUndefined2 = requireIsNullOrUndefined(); var $TypeError = TypeError; requireObjectCoercible = function(it) { if (isNullOrUndefined2(it)) throw new $TypeError("Can't call method on " + it); return it; }; return requireObjectCoercible; } var toIndexedObject; var hasRequiredToIndexedObject; function requireToIndexedObject() { if (hasRequiredToIndexedObject) return toIndexedObject; hasRequiredToIndexedObject = 1; var IndexedObject = requireIndexedObject(); var requireObjectCoercible2 = requireRequireObjectCoercible(); toIndexedObject = function(it) { return IndexedObject(requireObjectCoercible2(it)); }; return toIndexedObject; } var isCallable; var hasRequiredIsCallable; function requireIsCallable() { if (hasRequiredIsCallable) return isCallable; hasRequiredIsCallable = 1; var documentAll = typeof document == "object" && document.all; isCallable = typeof documentAll == "undefined" && documentAll !== void 0 ? function(argument) { return typeof argument == "function" || argument === documentAll; } : function(argument) { return typeof argument == "function"; }; return isCallable; } var isObject; var hasRequiredIsObject; function requireIsObject() { if (hasRequiredIsObject) return isObject; hasRequiredIsObject = 1; var isCallable2 = requireIsCallable(); isObject = function(it) { return typeof it == "object" ? it !== null : isCallable2(it); }; return isObject; } var getBuiltIn; var hasRequiredGetBuiltIn; function requireGetBuiltIn() { if (hasRequiredGetBuiltIn) return getBuiltIn; hasRequiredGetBuiltIn = 1; var globalThis2 = requireGlobalThis(); var isCallable2 = requireIsCallable(); var aFunction = function(argument) { return isCallable2(argument) ? argument : void 0; }; getBuiltIn = function(namespace, method) { return arguments.length < 2 ? aFunction(globalThis2[namespace]) : globalThis2[namespace] && globalThis2[namespace][method]; }; return getBuiltIn; } var objectIsPrototypeOf; var hasRequiredObjectIsPrototypeOf; function requireObjectIsPrototypeOf() { if (hasRequiredObjectIsPrototypeOf) return objectIsPrototypeOf; hasRequiredObjectIsPrototypeOf = 1; var uncurryThis = requireFunctionUncurryThis(); objectIsPrototypeOf = uncurryThis({}.isPrototypeOf); return objectIsPrototypeOf; } var environmentUserAgent; var hasRequiredEnvironmentUserAgent; function requireEnvironmentUserAgent() { if (hasRequiredEnvironmentUserAgent) return environmentUserAgent; hasRequiredEnvironmentUserAgent = 1; var globalThis2 = requireGlobalThis(); var navigator2 = globalThis2.navigator; var userAgent = navigator2 && navigator2.userAgent; environmentUserAgent = userAgent ? String(userAgent) : ""; return environmentUserAgent; } var environmentV8Version; var hasRequiredEnvironmentV8Version; function requireEnvironmentV8Version() { if (hasRequiredEnvironmentV8Version) return environmentV8Version; hasRequiredEnvironmentV8Version = 1; var globalThis2 = requireGlobalThis(); var userAgent = requireEnvironmentUserAgent(); var process = globalThis2.process; var Deno = globalThis2.Deno; var versions = process && process.versions || Deno && Deno.version; var v8 = versions && versions.v8; var match, version; if (v8) { match = v8.split("."); version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]); } if (!version && userAgent) { match = userAgent.match(/Edge\/(\d+)/); if (!match || match[1] >= 74) { match = userAgent.match(/Chrome\/(\d+)/); if (match) version = +match[1]; } } environmentV8Version = version; return environmentV8Version; } var symbolConstructorDetection; var hasRequiredSymbolConstructorDetection; function requireSymbolConstructorDetection() { if (hasRequiredSymbolConstructorDetection) return symbolConstructorDetection; hasRequiredSymbolConstructorDetection = 1; var V8_VERSION = requireEnvironmentV8Version(); var fails2 = requireFails(); var globalThis2 = requireGlobalThis(); var $String = globalThis2.String; symbolConstructorDetection = !!Object.getOwnPropertySymbols && !fails2(function() { var symbol = Symbol("symbol detection"); return !$String(symbol) || !(Object(symbol) instanceof Symbol) || // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances !Symbol.sham && V8_VERSION && V8_VERSION < 41; }); return symbolConstructorDetection; } var useSymbolAsUid; var hasRequiredUseSymbolAsUid; function requireUseSymbolAsUid() { if (hasRequiredUseSymbolAsUid) return useSymbolAsUid; hasRequiredUseSymbolAsUid = 1; var NATIVE_SYMBOL = requireSymbolConstructorDetection(); useSymbolAsUid = NATIVE_SYMBOL && !Symbol.sham && typeof Symbol.iterator == "symbol"; return useSymbolAsUid; } var isSymbol; var hasRequiredIsSymbol; function requireIsSymbol() { if (hasRequiredIsSymbol) return isSymbol; hasRequiredIsSymbol = 1; var getBuiltIn2 = requireGetBuiltIn(); var isCallable2 = requireIsCallable(); var isPrototypeOf = requireObjectIsPrototypeOf(); var USE_SYMBOL_AS_UID = requireUseSymbolAsUid(); var $Object = Object; isSymbol = USE_SYMBOL_AS_UID ? function(it) { return typeof it == "symbol"; } : function(it) { var $Symbol = getBuiltIn2("Symbol"); return isCallable2($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it)); }; return isSymbol; } var tryToString; var hasRequiredTryToString; function requireTryToString() { if (hasRequiredTryToString) return tryToString; hasRequiredTryToString = 1; var $String = String; tryToString = function(argument) { try { return $String(argument); } catch (error) { return "Object"; } }; return tryToString; } var aCallable; var hasRequiredACallable; function requireACallable() { if (hasRequiredACallable) return aCallable; hasRequiredACallable = 1; var isCallable2 = requireIsCallable(); var tryToString2 = requireTryToString(); var $TypeError = TypeError; aCallable = function(argument) { if (isCallable2(argument)) return argument; throw new $TypeError(tryToString2(argument) + " is not a function"); }; return aCallable; } var getMethod; var hasRequiredGetMethod; function requireGetMethod() { if (hasRequiredGetMethod) return getMethod; hasRequiredGetMethod = 1; var aCallable2 = requireACallable(); var isNullOrUndefined2 = requireIsNullOrUndefined(); getMethod = function(V, P) { var func = V[P]; return isNullOrUndefined2(func) ? void 0 : aCallable2(func); }; return getMethod; } var ordinaryToPrimitive; var hasRequiredOrdinaryToPrimitive; function requireOrdinaryToPrimitive() { if (hasRequiredOrdinaryToPrimitive) return ordinaryToPrimitive; hasRequiredOrdinaryToPrimitive = 1; var call = requireFunctionCall(); var isCallable2 = requireIsCallable(); var isObject2 = requireIsObject(); var $TypeError = TypeError; ordinaryToPrimitive = function(input, pref) { var fn, val; if (pref === "string" && isCallable2(fn = input.toString) && !isObject2(val = call(fn, input))) return val; if (isCallable2(fn = input.valueOf) && !isObject2(val = call(fn, input))) return val; if (pref !== "string" && isCallable2(fn = input.toString) && !isObject2(val = call(fn, input))) return val; throw new $TypeError("Can't convert object to primitive value"); }; return ordinaryToPrimitive; } var sharedStore = { exports: {} }; var isPure; var hasRequiredIsPure; function requireIsPure() { if (hasRequiredIsPure) return isPure; hasRequiredIsPure = 1; isPure = false; return isPure; } var defineGlobalProperty; var hasRequiredDefineGlobalProperty; function requireDefineGlobalProperty() { if (hasRequiredDefineGlobalProperty) return defineGlobalProperty; hasRequiredDefineGlobalProperty = 1; var globalThis2 = requireGlobalThis(); var defineProperty = Object.defineProperty; defineGlobalProperty = function(key, value) { try { defineProperty(globalThis2, key, { value, configurable: true, writable: true }); } catch (error) { globalThis2[key] = value; } return value; }; return defineGlobalProperty; } var hasRequiredSharedStore; function requireSharedStore() { if (hasRequiredSharedStore) return sharedStore.exports; hasRequiredSharedStore = 1; var IS_PURE = requireIsPure(); var globalThis2 = requireGlobalThis(); var defineGlobalProperty2 = requireDefineGlobalProperty(); var SHARED = "__core-js_shared__"; var store = sharedStore.exports = globalThis2[SHARED] || defineGlobalProperty2(SHARED, {}); (store.versions || (store.versions = [])).push({ version: "3.49.0", mode: IS_PURE ? "pure" : "global", copyright: "© 2013–2025 Denis Pushkarev (zloirock.ru), 2025–2026 CoreJS Company (core-js.io). All rights reserved.", license: "https://github.com/zloirock/core-js/blob/v3.49.0/LICENSE", source: "https://github.com/zloirock/core-js" }); return sharedStore.exports; } var shared; var hasRequiredShared; function requireShared() { if (hasRequiredShared) return shared; hasRequiredShared = 1; var store = requireSharedStore(); shared = function(key, value) { return store[key] || (store[key] = value || {}); }; return shared; } var toObject; var hasRequiredToObject; function requireToObject() { if (hasRequiredToObject) return toObject; hasRequiredToObject = 1; var requireObjectCoercible2 = requireRequireObjectCoercible(); var $Object = Object; toObject = function(argument) { return $Object(requireObjectCoercible2(argument)); }; return toObject; } var hasOwnProperty_1; var hasRequiredHasOwnProperty; function requireHasOwnProperty() { if (hasRequiredHasOwnProperty) return hasOwnProperty_1; hasRequiredHasOwnProperty = 1; var uncurryThis = requireFunctionUncurryThis(); var toObject2 = requireToObject(); var hasOwnProperty = uncurryThis({}.hasOwnProperty); hasOwnProperty_1 = Object.hasOwn || function hasOwn(it, key) { return hasOwnProperty(toObject2(it), key); }; return hasOwnProperty_1; } var uid; var hasRequiredUid; function requireUid() { if (hasRequiredUid) return uid; hasRequiredUid = 1; var uncurryThis = requireFunctionUncurryThis(); var id = 0; var postfix = Math.random(); var toString2 = uncurryThis(1.1.toString); uid = function(key) { return "Symbol(" + (key === void 0 ? "" : key) + ")_" + toString2(++id + postfix, 36); }; return uid; } var wellKnownSymbol; var hasRequiredWellKnownSymbol; function requireWellKnownSymbol() { if (hasRequiredWellKnownSymbol) return wellKnownSymbol; hasRequiredWellKnownSymbol = 1; var globalThis2 = requireGlobalThis(); var shared2 = requireShared(); var hasOwn = requireHasOwnProperty(); var uid2 = requireUid(); var NATIVE_SYMBOL = requireSymbolConstructorDetection(); var USE_SYMBOL_AS_UID = requireUseSymbolAsUid(); var Symbol2 = globalThis2.Symbol; var WellKnownSymbolsStore = shared2("wks"); var createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol2["for"] || Symbol2 : Symbol2 && Symbol2.withoutSetter || uid2; wellKnownSymbol = function(name) { if (!hasOwn(WellKnownSymbolsStore, name)) { WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol2, name) ? Symbol2[name] : createWellKnownSymbol("Symbol." + name); } return WellKnownSymbolsStore[name]; }; return wellKnownSymbol; } var toPrimitive; var hasRequiredToPrimitive; function requireToPrimitive() { if (hasRequiredToPrimitive) return toPrimitive; hasRequiredToPrimitive = 1; var call = requireFunctionCall(); var isObject2 = requireIsObject(); var isSymbol2 = requireIsSymbol(); var getMethod2 = requireGetMethod(); var ordinaryToPrimitive2 = requireOrdinaryToPrimitive(); var wellKnownSymbol2 = requireWellKnownSymbol(); var $TypeError = TypeError; var TO_PRIMITIVE = wellKnownSymbol2("toPrimitive"); toPrimitive = function(input, pref) { if (!isObject2(input) || isSymbol2(input)) return input; var exoticToPrim = getMethod2(input, TO_PRIMITIVE); var result; if (exoticToPrim) { if (pref === void 0) pref = "default"; result = call(exoticToPrim, input, pref); if (!isObject2(result) || isSymbol2(result)) return result; throw new $TypeError("Can't convert object to primitive value"); } if (pref === void 0) pref = "number"; return ordinaryToPrimitive2(input, pref); }; return toPrimitive; } var toPropertyKey; var hasRequiredToPropertyKey; function requireToPropertyKey() { if (hasRequiredToPropertyKey) return toPropertyKey; hasRequiredToPropertyKey = 1; var toPrimitive2 = requireToPrimitive(); var isSymbol2 = requireIsSymbol(); toPropertyKey = function(argument) { var key = toPrimitive2(argument, "string"); return isSymbol2(key) ? key : key + ""; }; return toPropertyKey; } var documentCreateElement; var hasRequiredDocumentCreateElement; function requireDocumentCreateElement() { if (hasRequiredDocumentCreateElement) return documentCreateElement; hasRequiredDocumentCreateElement = 1; var globalThis2 = requireGlobalThis(); var isObject2 = requireIsObject(); var document2 = globalThis2.document; var EXISTS = isObject2(document2) && isObject2(document2.createElement); documentCreateElement = function(it) { return EXISTS ? document2.createElement(it) : {}; }; return documentCreateElement; } var ie8DomDefine; var hasRequiredIe8DomDefine; function requireIe8DomDefine() { if (hasRequiredIe8DomDefine) return ie8DomDefine; hasRequiredIe8DomDefine = 1; var DESCRIPTORS = requireDescriptors(); var fails2 = requireFails(); var createElement = requireDocumentCreateElement(); ie8DomDefine = !DESCRIPTORS && !fails2(function() { return Object.defineProperty(createElement("div"), "a", { get: function() { return 7; } }).a !== 7; }); return ie8DomDefine; } var hasRequiredObjectGetOwnPropertyDescriptor; function requireObjectGetOwnPropertyDescriptor() { if (hasRequiredObjectGetOwnPropertyDescriptor) return objectGetOwnPropertyDescriptor; hasRequiredObjectGetOwnPropertyDescriptor = 1; var DESCRIPTORS = requireDescriptors(); var call = requireFunctionCall(); var propertyIsEnumerableModule = requireObjectPropertyIsEnumerable(); var createPropertyDescriptor2 = requireCreatePropertyDescriptor(); var toIndexedObject2 = requireToIndexedObject(); var toPropertyKey2 = requireToPropertyKey(); var hasOwn = requireHasOwnProperty(); var IE8_DOM_DEFINE = requireIe8DomDefine(); var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; objectGetOwnPropertyDescriptor.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) { O = toIndexedObject2(O); P = toPropertyKey2(P); if (IE8_DOM_DEFINE) try { return $getOwnPropertyDescriptor(O, P); } catch (error) { } if (hasOwn(O, P)) return createPropertyDescriptor2(!call(propertyIsEnumerableModule.f, O, P), O[P]); }; return objectGetOwnPropertyDescriptor; } var objectDefineProperty = {}; var v8PrototypeDefineBug; var hasRequiredV8PrototypeDefineBug; function requireV8PrototypeDefineBug() { if (hasRequiredV8PrototypeDefineBug) return v8PrototypeDefineBug; hasRequiredV8PrototypeDefineBug = 1; var DESCRIPTORS = requireDescriptors(); var fails2 = requireFails(); v8PrototypeDefineBug = DESCRIPTORS && fails2(function() { return Object.defineProperty(function() { }, "prototype", { value: 42, writable: false }).prototype !== 42; }); return v8PrototypeDefineBug; } var anObject; var hasRequiredAnObject; function requireAnObject() { if (hasRequiredAnObject) return anObject; hasRequiredAnObject = 1; var isObject2 = requireIsObject(); var $String = String; var $TypeError = TypeError; anObject = function(argument) { if (isObject2(argument)) return argument; throw new $TypeError($String(argument) + " is not an object"); }; return anObject; } var hasRequiredObjectDefineProperty; function requireObjectDefineProperty() { if (hasRequiredObjectDefineProperty) return objectDefineProperty; hasRequiredObjectDefineProperty = 1; var DESCRIPTORS = requireDescriptors(); var IE8_DOM_DEFINE = requireIe8DomDefine(); var V8_PROTOTYPE_DEFINE_BUG = requireV8PrototypeDefineBug(); var anObject2 = requireAnObject(); var toPropertyKey2 = requireToPropertyKey(); var $TypeError = TypeError; var $defineProperty = Object.defineProperty; var $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; var ENUMERABLE = "enumerable"; var CONFIGURABLE = "configurable"; var WRITABLE = "writable"; objectDefineProperty.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) { anObject2(O); P = toPropertyKey2(P); anObject2(Attributes); if (typeof O === "function" && P === "prototype" && "value" in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) { var current = $getOwnPropertyDescriptor(O, P); if (current && current[WRITABLE]) { O[P] = Attributes.value; Attributes = { configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE], enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE], writable: false }; } } return $defineProperty(O, P, Attributes); } : $defineProperty : function defineProperty(O, P, Attributes) { anObject2(O); P = toPropertyKey2(P); anObject2(Attributes); if (IE8_DOM_DEFINE) try { return $defineProperty(O, P, Attributes); } catch (error) { } if ("get" in Attributes || "set" in Attributes) throw new $TypeError("Accessors not supported"); if ("value" in Attributes) O[P] = Attributes.value; return O; }; return objectDefineProperty; } var createNonEnumerableProperty; var hasRequiredCreateNonEnumerableProperty; function requireCreateNonEnumerableProperty() { if (hasRequiredCreateNonEnumerableProperty) return createNonEnumerableProperty; hasRequiredCreateNonEnumerableProperty = 1; var DESCRIPTORS = requireDescriptors(); var definePropertyModule = requireObjectDefineProperty(); var createPropertyDescriptor2 = requireCreatePropertyDescriptor(); createNonEnumerableProperty = DESCRIPTORS ? function(object, key, value) { return definePropertyModule.f(object, key, createPropertyDescriptor2(1, value)); } : function(object, key, value) { object[key] = value; return object; }; return createNonEnumerableProperty; } var makeBuiltIn = { exports: {} }; var functionName; var hasRequiredFunctionName; function requireFunctionName() { if (hasRequiredFunctionName) return functionName; hasRequiredFunctionName = 1; var DESCRIPTORS = requireDescriptors(); var hasOwn = requireHasOwnProperty(); var FunctionPrototype = Function.prototype; var getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor; var EXISTS = hasOwn(FunctionPrototype, "name"); var PROPER = EXISTS && (function something() { }).name === "something"; var CONFIGURABLE = EXISTS && (!DESCRIPTORS || DESCRIPTORS && getDescriptor(FunctionPrototype, "name").configurable); functionName = { EXISTS, PROPER, CONFIGURABLE }; return functionName; } var inspectSource; var hasRequiredInspectSource; function requireInspectSource() { if (hasRequiredInspectSource) return inspectSource; hasRequiredInspectSource = 1; var uncurryThis = requireFunctionUncurryThis(); var isCallable2 = requireIsCallable(); var store = requireSharedStore(); var functionToString = uncurryThis(Function.toString); if (!isCallable2(store.inspectSource)) { store.inspectSource = function(it) { return functionToString(it); }; } inspectSource = store.inspectSource; return inspectSource; } var weakMapBasicDetection; var hasRequiredWeakMapBasicDetection; function requireWeakMapBasicDetection() { if (hasRequiredWeakMapBasicDetection) return weakMapBasicDetection; hasRequiredWeakMapBasicDetection = 1; var globalThis2 = requireGlobalThis(); var isCallable2 = requireIsCallable(); var WeakMap = globalThis2.WeakMap; weakMapBasicDetection = isCallable2(WeakMap) && /native code/.test(String(WeakMap)); return weakMapBasicDetection; } var sharedKey; var hasRequiredSharedKey; function requireSharedKey() { if (hasRequiredSharedKey) return sharedKey; hasRequiredSharedKey = 1; var shared2 = requireShared(); var uid2 = requireUid(); var keys = shared2("keys"); sharedKey = function(key) { return keys[key] || (keys[key] = uid2(key)); }; return sharedKey; } var hiddenKeys; var hasRequiredHiddenKeys; function requireHiddenKeys() { if (hasRequiredHiddenKeys) return hiddenKeys; hasRequiredHiddenKeys = 1; hiddenKeys = {}; return hiddenKeys; } var internalState; var hasRequiredInternalState; function requireInternalState() { if (hasRequiredInternalState) return internalState; hasRequiredInternalState = 1; var NATIVE_WEAK_MAP = requireWeakMapBasicDetection(); var globalThis2 = requireGlobalThis(); var isObject2 = requireIsObject(); var createNonEnumerableProperty2 = requireCreateNonEnumerableProperty(); var hasOwn = requireHasOwnProperty(); var shared2 = requireSharedStore(); var sharedKey2 = requireSharedKey(); var hiddenKeys2 = requireHiddenKeys(); var OBJECT_ALREADY_INITIALIZED = "Object already initialized"; var TypeError2 = globalThis2.TypeError; var WeakMap = globalThis2.WeakMap; var set, get, has; var enforce = function(it) { return has(it) ? get(it) : set(it, {}); }; var getterFor = function(TYPE) { return function(it) { var state; if (!isObject2(it) || (state = get(it)).type !== TYPE) { throw new TypeError2("Incompatible receiver, " + TYPE + " required"); } return state; }; }; if (NATIVE_WEAK_MAP || shared2.state) { var store = shared2.state || (shared2.state = new WeakMap()); store.get = store.get; store.has = store.has; store.set = store.set; set = function(it, metadata) { if (store.has(it)) throw new TypeError2(OBJECT_ALREADY_INITIALIZED); metadata.facade = it; store.set(it, metadata); return metadata; }; get = function(it) { return store.get(it) || {}; }; has = function(it) { return store.has(it); }; } else { var STATE = sharedKey2("state"); hiddenKeys2[STATE] = true; set = function(it, metadata) { if (hasOwn(it, STATE)) throw new TypeError2(OBJECT_ALREADY_INITIALIZED); metadata.facade = it; createNonEnumerableProperty2(it, STATE, metadata); return metadata; }; get = function(it) { return hasOwn(it, STATE) ? it[STATE] : {}; }; has = function(it) { return hasOwn(it, STATE); }; } internalState = { set, get, has, enforce, getterFor }; return internalState; } var hasRequiredMakeBuiltIn; function requireMakeBuiltIn() { if (hasRequiredMakeBuiltIn) return makeBuiltIn.exports; hasRequiredMakeBuiltIn = 1; var uncurryThis = requireFunctionUncurryThis(); var fails2 = requireFails(); var isCallable2 = requireIsCallable(); var hasOwn = requireHasOwnProperty(); var DESCRIPTORS = requireDescriptors(); var CONFIGURABLE_FUNCTION_NAME = requireFunctionName().CONFIGURABLE; var inspectSource2 = requireInspectSource(); var InternalStateModule = requireInternalState(); var enforceInternalState = InternalStateModule.enforce; var getInternalState = InternalStateModule.get; var $String = String; var defineProperty = Object.defineProperty; var stringSlice = uncurryThis("".slice); var replace = uncurryThis("".replace); var join = uncurryThis([].join); var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails2(function() { return defineProperty(function() { }, "length", { value: 8 }).length !== 8; }); var TEMPLATE = String(String).split("String"); var makeBuiltIn$1 = makeBuiltIn.exports = function(value, name, options) { if (stringSlice($String(name), 0, 7) === "Symbol(") { name = "[" + replace($String(name), /^Symbol\(([^)]*)\).*$/, "$1") + "]"; } if (options && options.getter) name = "get " + name; if (options && options.setter) name = "set " + name; if (!hasOwn(value, "name") || CONFIGURABLE_FUNCTION_NAME && value.name !== name) { if (DESCRIPTORS) defineProperty(value, "name", { value: name, configurable: true }); else value.name = name; } if (CONFIGURABLE_LENGTH && options && hasOwn(options, "arity") && value.length !== options.arity) { defineProperty(value, "length", { value: options.arity }); } try { if (options && hasOwn(options, "constructor") && options.constructor) { if (DESCRIPTORS) defineProperty(value, "prototype", { writable: false }); } else if (value.prototype) value.prototype = void 0; } catch (error) { } var state = enforceInternalState(value); if (!hasOwn(state, "source")) { state.source = join(TEMPLATE, typeof name == "string" ? name : ""); } return value; }; Function.prototype.toString = makeBuiltIn$1(function toString2() { return isCallable2(this) && getInternalState(this).source || inspectSource2(this); }, "toString"); return makeBuiltIn.exports; } var defineBuiltIn; var hasRequiredDefineBuiltIn; function requireDefineBuiltIn() { if (hasRequiredDefineBuiltIn) return defineBuiltIn; hasRequiredDefineBuiltIn = 1; var isCallable2 = requireIsCallable(); var definePropertyModule = requireObjectDefineProperty(); var makeBuiltIn2 = requireMakeBuiltIn(); var defineGlobalProperty2 = requireDefineGlobalProperty(); defineBuiltIn = function(O, key, value, options) { if (!options) options = {}; var simple = options.enumerable; var name = options.name !== void 0 ? options.name : key; if (isCallable2(value)) makeBuiltIn2(value, name, options); if (options.global) { if (simple) O[key] = value; else defineGlobalProperty2(key, value); } else { try { if (!options.unsafe) delete O[key]; else if (O[key]) simple = true; } catch (error) { } if (simple) O[key] = value; else definePropertyModule.f(O, key, { value, enumerable: false, configurable: !options.nonConfigurable, writable: !options.nonWritable }); } return O; }; return defineBuiltIn; } var objectGetOwnPropertyNames = {}; var mathTrunc; var hasRequiredMathTrunc; function requireMathTrunc() { if (hasRequiredMathTrunc) return mathTrunc; hasRequiredMathTrunc = 1; var ceil = Math.ceil; var floor = Math.floor; mathTrunc = Math.trunc || function trunc(x) { var n = +x; return (n > 0 ? floor : ceil)(n); }; return mathTrunc; } var toIntegerOrInfinity; var hasRequiredToIntegerOrInfinity; function requireToIntegerOrInfinity() { if (hasRequiredToIntegerOrInfinity) return toIntegerOrInfinity; hasRequiredToIntegerOrInfinity = 1; var trunc = requireMathTrunc(); toIntegerOrInfinity = function(argument) { var number = +argument; return number !== number || number === 0 ? 0 : trunc(number); }; return toIntegerOrInfinity; } var toAbsoluteIndex; var hasRequiredToAbsoluteIndex; function requireToAbsoluteIndex() { if (hasRequiredToAbsoluteIndex) return toAbsoluteIndex; hasRequiredToAbsoluteIndex = 1; var toIntegerOrInfinity2 = requireToIntegerOrInfinity(); var max = Math.max; var min = Math.min; toAbsoluteIndex = function(index, length) { var integer = toIntegerOrInfinity2(index); return integer < 0 ? max(integer + length, 0) : min(integer, length); }; return toAbsoluteIndex; } var toLength; var hasRequiredToLength; function requireToLength() { if (hasRequiredToLength) return toLength; hasRequiredToLength = 1; var toIntegerOrInfinity2 = requireToIntegerOrInfinity(); var min = Math.min; toLength = function(argument) { var len = toIntegerOrInfinity2(argument); return len > 0 ? min(len, 9007199254740991) : 0; }; return toLength; } var lengthOfArrayLike; var hasRequiredLengthOfArrayLike; function requireLengthOfArrayLike() { if (hasRequiredLengthOfArrayLike) return lengthOfArrayLike; hasRequiredLengthOfArrayLike = 1; var toLength2 = requireToLength(); lengthOfArrayLike = function(obj) { return toLength2(obj.length); }; return lengthOfArrayLike; } var arrayIncludes; var hasRequiredArrayIncludes; function requireArrayIncludes() { if (hasRequiredArrayIncludes) return arrayIncludes; hasRequiredArrayIncludes = 1; var toIndexedObject2 = requireToIndexedObject(); var toAbsoluteIndex2 = requireToAbsoluteIndex(); var lengthOfArrayLike2 = requireLengthOfArrayLike(); var createMethod = function(IS_INCLUDES) { return function($this, el, fromIndex) { var O = toIndexedObject2($this); var length = lengthOfArrayLike2(O); if (length === 0) return !IS_INCLUDES && -1; var index = toAbsoluteIndex2(fromIndex, length); var value; if (IS_INCLUDES && el !== el) while (length > index) { value = O[index++]; if (value !== value) return true; } else for (; length > index; index++) { if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0; } return !IS_INCLUDES && -1; }; }; arrayIncludes = { // `Array.prototype.includes` method // https://tc39.es/ecma262/#sec-array.prototype.includes includes: createMethod(true), // `Array.prototype.indexOf` method // https://tc39.es/ecma262/#sec-array.prototype.indexof indexOf: createMethod(false) }; return arrayIncludes; } var objectKeysInternal; var hasRequiredObjectKeysInternal; function requireObjectKeysInternal() { if (hasRequiredObjectKeysInternal) return objectKeysInternal; hasRequiredObjectKeysInternal = 1; var uncurryThis = requireFunctionUncurryThis(); var hasOwn = requireHasOwnProperty(); var toIndexedObject2 = requireToIndexedObject(); var indexOf = requireArrayIncludes().indexOf; var hiddenKeys2 = requireHiddenKeys(); var push = uncurryThis([].push); objectKeysInternal = function(object, names) { var O = toIndexedObject2(object); var i = 0; var result = []; var key; for (key in O) !hasOwn(hiddenKeys2, key) && hasOwn(O, key) && push(result, key); while (names.length > i) if (hasOwn(O, key = names[i++])) { ~indexOf(result, key) || push(result, key); } return result; }; return objectKeysInternal; } var enumBugKeys; var hasRequiredEnumBugKeys; function requireEnumBugKeys() { if (hasRequiredEnumBugKeys) return enumBugKeys; hasRequiredEnumBugKeys = 1; enumBugKeys = [ "constructor", "hasOwnProperty", "isPrototypeOf", "propertyIsEnumerable", "toLocaleString", "toString", "valueOf" ]; return enumBugKeys; } var hasRequiredObjectGetOwnPropertyNames; function requireObjectGetOwnPropertyNames() { if (hasRequiredObjectGetOwnPropertyNames) return objectGetOwnPropertyNames; hasRequiredObjectGetOwnPropertyNames = 1; var internalObjectKeys = requireObjectKeysInternal(); var enumBugKeys2 = requireEnumBugKeys(); var hiddenKeys2 = enumBugKeys2.concat("length", "prototype"); objectGetOwnPropertyNames.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { return internalObjectKeys(O, hiddenKeys2); }; return objectGetOwnPropertyNames; } var objectGetOwnPropertySymbols = {}; var hasRequiredObjectGetOwnPropertySymbols; function requireObjectGetOwnPropertySymbols() { if (hasRequiredObjectGetOwnPropertySymbols) return objectGetOwnPropertySymbols; hasRequiredObjectGetOwnPropertySymbols = 1; objectGetOwnPropertySymbols.f = Object.getOwnPropertySymbols; return objectGetOwnPropertySymbols; } var ownKeys; var hasRequiredOwnKeys; function requireOwnKeys() { if (hasRequiredOwnKeys) return ownKeys; hasRequiredOwnKeys = 1; var getBuiltIn2 = requireGetBuiltIn(); var uncurryThis = requireFunctionUncurryThis(); var getOwnPropertyNamesModule = requireObjectGetOwnPropertyNames(); var getOwnPropertySymbolsModule = requireObjectGetOwnPropertySymbols(); var anObject2 = requireAnObject(); var concat = uncurryThis([].concat); ownKeys = getBuiltIn2("Reflect", "ownKeys") || function ownKeys2(it) { var keys = getOwnPropertyNamesModule.f(anObject2(it)); var getOwnPropertySymbols = getOwnPropertySymbolsModule.f; return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys; }; return ownKeys; } var copyConstructorProperties; var hasRequiredCopyConstructorProperties; function requireCopyConstructorProperties() { if (hasRequiredCopyConstructorProperties) return copyConstructorProperties; hasRequiredCopyConstructorProperties = 1; var hasOwn = requireHasOwnProperty(); var ownKeys2 = requireOwnKeys(); var getOwnPropertyDescriptorModule = requireObjectGetOwnPropertyDescriptor(); var definePropertyModule = requireObjectDefineProperty(); copyConstructorProperties = function(target, source, exceptions) { var keys = ownKeys2(source); var defineProperty = definePropertyModule.f; var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f; for (var i = 0; i < keys.length; i++) { var key = keys[i]; if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) { defineProperty(target, key, getOwnPropertyDescriptor(source, key)); } } }; return copyConstructorProperties; } var isForced_1; var hasRequiredIsForced; function requireIsForced() { if (hasRequiredIsForced) return isForced_1; hasRequiredIsForced = 1; var fails2 = requireFails(); var isCallable2 = requireIsCallable(); var replacement = /#|\.prototype\./; var isForced = function(feature, detection) { var value = data[normalize(feature)]; return value === POLYFILL ? true : value === NATIVE ? false : isCallable2(detection) ? fails2(detection) : !!detection; }; var normalize = isForced.normalize = function(string) { return String(string).replace(replacement, ".").toLowerCase(); }; var data = isForced.data = {}; var NATIVE = isForced.NATIVE = "N"; var POLYFILL = isForced.POLYFILL = "P"; isForced_1 = isForced; return isForced_1; } var _export; var hasRequired_export; function require_export() { if (hasRequired_export) return _export; hasRequired_export = 1; var globalThis2 = requireGlobalThis(); var getOwnPropertyDescriptor = requireObjectGetOwnPropertyDescriptor().f; var createNonEnumerableProperty2 = requireCreateNonEnumerableProperty(); var defineBuiltIn2 = requireDefineBuiltIn(); var defineGlobalProperty2 = requireDefineGlobalProperty(); var copyConstructorProperties2 = requireCopyConstructorProperties(); var isForced = requireIsForced(); _export = function(options, source) { var TARGET = options.target; var GLOBAL = options.global; var STATIC = options.stat; var FORCED, target, key, targetProperty, sourceProperty, descriptor; if (GLOBAL) { target = globalThis2; } else if (STATIC) { target = globalThis2[TARGET] || defineGlobalProperty2(TARGET, {}); } else { target = globalThis2[TARGET] && globalThis2[TARGET].prototype; } if (target) for (key in source) { sourceProperty = source[key]; if (options.dontCallGetSet) { descriptor = getOwnPropertyDescriptor(target, key); targetProperty = descriptor && descriptor.value; } else targetProperty = target[key]; FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? "." : "#") + key, options.forced); if (!FORCED && targetProperty !== void 0) { if (typeof sourceProperty == typeof targetProperty) continue; copyConstructorProperties2(sourceProperty, targetProperty); } if (options.sham || targetProperty && targetProperty.sham) { createNonEnumerableProperty2(sourceProperty, "sham", true); } defineBuiltIn2(target, key, sourceProperty, options); } }; return _export; } var isArray; var hasRequiredIsArray; function requireIsArray() { if (hasRequiredIsArray) return isArray; hasRequiredIsArray = 1; var classof2 = requireClassofRaw(); isArray = Array.isArray || function isArray2(argument) { return classof2(argument) === "Array"; }; return isArray; } var doesNotExceedSafeInteger; var hasRequiredDoesNotExceedSafeInteger; function requireDoesNotExceedSafeInteger() { if (hasRequiredDoesNotExceedSafeInteger) return doesNotExceedSafeInteger; hasRequiredDoesNotExceedSafeInteger = 1; var $TypeError = TypeError; var MAX_SAFE_INTEGER = 9007199254740991; doesNotExceedSafeInteger = function(it) { if (it > MAX_SAFE_INTEGER) throw new $TypeError("Maximum allowed index exceeded"); return it; }; return doesNotExceedSafeInteger; } var createProperty; var hasRequiredCreateProperty; function requireCreateProperty() { if (hasRequiredCreateProperty) return createProperty; hasRequiredCreateProperty = 1; var DESCRIPTORS = requireDescriptors(); var definePropertyModule = requireObjectDefineProperty(); var createPropertyDescriptor2 = requireCreatePropertyDescriptor(); createProperty = function(object, key, value) { if (DESCRIPTORS) definePropertyModule.f(object, key, createPropertyDescriptor2(0, value)); else object[key] = value; }; return createProperty; } var arraySetLength; var hasRequiredArraySetLength; function requireArraySetLength() { if (hasRequiredArraySetLength) return arraySetLength; hasRequiredArraySetLength = 1; var DESCRIPTORS = requireDescriptors(); var isArray2 = requireIsArray(); var $TypeError = TypeError; var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; var SILENT_ON_NON_WRITABLE_LENGTH_SET = DESCRIPTORS && !function() { if (this !== void 0) return true; try { Object.defineProperty([], "length", { writable: false }).length = 1; } catch (error) { return error instanceof TypeError; } }(); arraySetLength = SILENT_ON_NON_WRITABLE_LENGTH_SET ? function(O, length) { if (isArray2(O) && !getOwnPropertyDescriptor(O, "length").writable) { throw new $TypeError("Cannot set read only .length"); } return O.length = length; } : function(O, length) { return O.length = length; }; return arraySetLength; } var toStringTagSupport; var hasRequiredToStringTagSupport; function requireToStringTagSupport() { if (hasRequiredToStringTagSupport) return toStringTagSupport; hasRequiredToStringTagSupport = 1; var wellKnownSymbol2 = requireWellKnownSymbol(); var TO_STRING_TAG = wellKnownSymbol2("toStringTag"); var test = {}; test[TO_STRING_TAG] = "z"; toStringTagSupport = String(test) === "[object z]"; return toStringTagSupport; } var classof; var hasRequiredClassof; function requireClassof() { if (hasRequiredClassof) return classof; hasRequiredClassof = 1; var TO_STRING_TAG_SUPPORT = requireToStringTagSupport(); var isCallable2 = requireIsCallable(); var classofRaw2 = requireClassofRaw(); var wellKnownSymbol2 = requireWellKnownSymbol(); var TO_STRING_TAG = wellKnownSymbol2("toStringTag"); var $Object = Object; var CORRECT_ARGUMENTS = classofRaw2(/* @__PURE__ */ function() { return arguments; }()) === "Arguments"; var tryGet = function(it, key) { try { return it[key]; } catch (error) { } }; classof = TO_STRING_TAG_SUPPORT ? classofRaw2 : function(it) { var O, tag, result; return it === void 0 ? "Undefined" : it === null ? "Null" : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == "string" ? tag : CORRECT_ARGUMENTS ? classofRaw2(O) : (result = classofRaw2(O)) === "Object" && isCallable2(O.callee) ? "Arguments" : result; }; return classof; } var isConstructor; var hasRequiredIsConstructor; function requireIsConstructor() { if (hasRequiredIsConstructor) return isConstructor; hasRequiredIsConstructor = 1; var uncurryThis = requireFunctionUncurryThis(); var fails2 = requireFails(); var isCallable2 = requireIsCallable(); var classof2 = requireClassof(); var getBuiltIn2 = requireGetBuiltIn(); var inspectSource2 = requireInspectSource(); var noop2 = function() { }; var construct = getBuiltIn2("Reflect", "construct"); var constructorRegExp = /^\s*(?:class|function)\b/; var exec = uncurryThis(constructorRegExp.exec); var INCORRECT_TO_STRING = !constructorRegExp.test(noop2); var isConstructorModern = function isConstructor2(argument) { if (!isCallable2(argument)) return false; try { construct(noop2, [], argument); return true; } catch (error) { return false; } }; var isConstructorLegacy = function isConstructor2(argument) { if (!isCallable2(argument)) return false; switch (classof2(argument)) { case "AsyncFunction": case "GeneratorFunction": case "AsyncGeneratorFunction": return false; } try { return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource2(argument)); } catch (error) { return true; } }; isConstructorLegacy.sham = true; isConstructor = !construct || fails2(function() { var called; return isConstructorModern(isConstructorModern.call) || !isConstructorModern(Object) || !isConstructorModern(function() { called = true; }) || called; }) ? isConstructorLegacy : isConstructorModern; return isConstructor; } var arraySpeciesConstructor; var hasRequiredArraySpeciesConstructor; function requireArraySpeciesConstructor() { if (hasRequiredArraySpeciesConstructor) return arraySpeciesConstructor; hasRequiredArraySpeciesConstructor = 1; var isArray2 = requireIsArray(); var isConstructor2 = requireIsConstructor(); var isObject2 = requireIsObject(); var wellKnownSymbol2 = requireWellKnownSymbol(); var SPECIES = wellKnownSymbol2("species"); var $Array = Array; arraySpeciesConstructor = function(originalArray) { var C; if (isArray2(originalArray)) { C = originalArray.constructor; if (isConstructor2(C) && (C === $Array || isArray2(C.prototype))) C = void 0; else if (isObject2(C)) { C = C[SPECIES]; if (C === null) C = void 0; } } return C === void 0 ? $Array : C; }; return arraySpeciesConstructor; } var arraySpeciesCreate; var hasRequiredArraySpeciesCreate; function requireArraySpeciesCreate() { if (hasRequiredArraySpeciesCreate) return arraySpeciesCreate; hasRequiredArraySpeciesCreate = 1; var arraySpeciesConstructor2 = requireArraySpeciesConstructor(); arraySpeciesCreate = function(originalArray, length) { return new (arraySpeciesConstructor2(originalArray))(length === 0 ? 0 : length); }; return arraySpeciesCreate; } var arrayMethodHasSpeciesSupport; var hasRequiredArrayMethodHasSpeciesSupport; function requireArrayMethodHasSpeciesSupport() { if (hasRequiredArrayMethodHasSpeciesSupport) return arrayMethodHasSpeciesSupport; hasRequiredArrayMethodHasSpeciesSupport = 1; var fails2 = requireFails(); var wellKnownSymbol2 = requireWellKnownSymbol(); var V8_VERSION = requireEnvironmentV8Version(); var SPECIES = wellKnownSymbol2("species"); arrayMethodHasSpeciesSupport = function(METHOD_NAME) { return V8_VERSION >= 51 || !fails2(function() { var array = []; var constructor = array.constructor = {}; constructor[SPECIES] = function() { return { foo: 1 }; }; return array[METHOD_NAME](Boolean).foo !== 1; }); }; return arrayMethodHasSpeciesSupport; } var hasRequiredEs_array_concat; function requireEs_array_concat() { if (hasRequiredEs_array_concat) return es_array_concat; hasRequiredEs_array_concat = 1; var $ = require_export(); var fails2 = requireFails(); var isArray2 = requireIsArray(); var isObject2 = requireIsObject(); var toObject2 = requireToObject(); var lengthOfArrayLike2 = requireLengthOfArrayLike(); var doesNotExceedSafeInteger2 = requireDoesNotExceedSafeInteger(); var createProperty2 = requireCreateProperty(); var setArrayLength = requireArraySetLength(); var arraySpeciesCreate2 = requireArraySpeciesCreate(); var arrayMethodHasSpeciesSupport2 = requireArrayMethodHasSpeciesSupport(); var wellKnownSymbol2 = requireWellKnownSymbol(); var V8_VERSION = requireEnvironmentV8Version(); var IS_CONCAT_SPREADABLE = wellKnownSymbol2("isConcatSpreadable"); var IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails2(function() { var array = []; array[IS_CONCAT_SPREADABLE] = false; return array.concat()[0] !== array; }); var isConcatSpreadable = function(O) { if (!isObject2(O)) return false; var spreadable = O[IS_CONCAT_SPREADABLE]; return spreadable !== void 0 ? !!spreadable : isArray2(O); }; var FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !arrayMethodHasSpeciesSupport2("concat"); $({ target: "Array", proto: true, arity: 1, forced: FORCED }, { // eslint-disable-next-line no-unused-vars -- required for `.length` concat: function concat(arg) { var O = toObject2(this); var A = arraySpeciesCreate2(O, 0); var n = 0; var i, k, length, len, E; for (i = -1, length = arguments.length; i < length; i++) { E = i === -1 ? O : arguments[i]; if (isConcatSpreadable(E)) { len = lengthOfArrayLike2(E); doesNotExceedSafeInteger2(n + len); for (k = 0; k < len; k++, n++) if (k in E) createProperty2(A, n, E[k]); } else { doesNotExceedSafeInteger2(n + 1); createProperty2(A, n++, E); } } setArrayLength(A, n); return A; } }); return es_array_concat; } requireEs_array_concat(); var es_error_cause = {}; var functionApply; var hasRequiredFunctionApply; function requireFunctionApply() { if (hasRequiredFunctionApply) return functionApply; hasRequiredFunctionApply = 1; var NATIVE_BIND = requireFunctionBindNative(); var FunctionPrototype = Function.prototype; var apply = FunctionPrototype.apply; var call = FunctionPrototype.call; functionApply = typeof Reflect == "object" && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function() { return call.apply(apply, arguments); }); return functionApply; } var functionUncurryThisAccessor; var hasRequiredFunctionUncurryThisAccessor; function requireFunctionUncurryThisAccessor() { if (hasRequiredFunctionUncurryThisAccessor) return functionUncurryThisAccessor; hasRequiredFunctionUncurryThisAccessor = 1; var uncurryThis = requireFunctionUncurryThis(); var aCallable2 = requireACallable(); functionUncurryThisAccessor = function(object, key, method) { try { return uncurryThis(aCallable2(Object.getOwnPropertyDescriptor(object, key)[method])); } catch (error) { } }; return functionUncurryThisAccessor; } var isPossiblePrototype; var hasRequiredIsPossiblePrototype; function requireIsPossiblePrototype() { if (hasRequiredIsPossiblePrototype) return isPossiblePrototype; hasRequiredIsPossiblePrototype = 1; var isObject2 = requireIsObject(); isPossiblePrototype = function(argument) { return isObject2(argument) || argument === null; }; return isPossiblePrototype; } var aPossiblePrototype; var hasRequiredAPossiblePrototype; function requireAPossiblePrototype() { if (hasRequiredAPossiblePrototype) return aPossiblePrototype; hasRequiredAPossiblePrototype = 1; var isPossiblePrototype2 = requireIsPossiblePrototype(); var $String = String; var $TypeError = TypeError; aPossiblePrototype = function(argument) { if (isPossiblePrototype2(argument)) return argument; throw new $TypeError("Can't set " + $String(argument) + " as a prototype"); }; return aPossiblePrototype; } var objectSetPrototypeOf; var hasRequiredObjectSetPrototypeOf; function requireObjectSetPrototypeOf() { if (hasRequiredObjectSetPrototypeOf) return objectSetPrototypeOf; hasRequiredObjectSetPrototypeOf = 1; var uncurryThisAccessor = requireFunctionUncurryThisAccessor(); var isObject2 = requireIsObject(); var requireObjectCoercible2 = requireRequireObjectCoercible(); var aPossiblePrototype2 = requireAPossiblePrototype(); objectSetPrototypeOf = Object.setPrototypeOf || ("__proto__" in {} ? function() { var CORRECT_SETTER = false; var test = {}; var setter; try { setter = uncurryThisAccessor(Object.prototype, "__proto__", "set"); setter(test, []); CORRECT_SETTER = test instanceof Array; } catch (error) { } return function setPrototypeOf(O, proto) { requireObjectCoercible2(O); aPossiblePrototype2(proto); if (!isObject2(O)) return O; if (CORRECT_SETTER) setter(O, proto); else O.__proto__ = proto; return O; }; }() : void 0); return objectSetPrototypeOf; } var proxyAccessor; var hasRequiredProxyAccessor; function requireProxyAccessor() { if (hasRequiredProxyAccessor) return proxyAccessor; hasRequiredProxyAccessor = 1; var defineProperty = requireObjectDefineProperty().f; proxyAccessor = function(Target, Source, key) { key in Target || defineProperty(Target, key, { configurable: true, get: function() { return Source[key]; }, set: function(it) { Source[key] = it; } }); }; return proxyAccessor; } var inheritIfRequired; var hasRequiredInheritIfRequired; function requireInheritIfRequired() { if (hasRequiredInheritIfRequired) return inheritIfRequired; hasRequiredInheritIfRequired = 1; var isCallable2 = requireIsCallable(); var isObject2 = requireIsObject(); var setPrototypeOf = requireObjectSetPrototypeOf(); inheritIfRequired = function($this, dummy, Wrapper) { var NewTarget, NewTargetPrototype; if ( // it can work only with native `setPrototypeOf` setPrototypeOf && // we haven't completely correct pre-ES6 way for getting `new.target`, so use this isCallable2(NewTarget = dummy.constructor) && NewTarget !== Wrapper && isObject2(NewTargetPrototype = NewTarget.prototype) && NewTargetPrototype !== Wrapper.prototype ) setPrototypeOf($this, NewTargetPrototype); return $this; }; return inheritIfRequired; } var toString; var hasRequiredToString; function requireToString() { if (hasRequiredToString) return toString; hasRequiredToString = 1; var classof2 = requireClassof(); var $String = String; toString = function(argument) { if (classof2(argument) === "Symbol") throw new TypeError("Cannot convert a Symbol value to a string"); return $String(argument); }; return toString; } var normalizeStringArgument; var hasRequiredNormalizeStringArgument; function requireNormalizeStringArgument() { if (hasRequiredNormalizeStringArgument) return normalizeStringArgument; hasRequiredNormalizeStringArgument = 1; var toString2 = requireToString(); normalizeStringArgument = function(argument, $default) { return argument === void 0 ? arguments.length < 2 ? "" : $default : toString2(argument); }; return normalizeStringArgument; } var installErrorCause; var hasRequiredInstallErrorCause; function requireInstallErrorCause() { if (hasRequiredInstallErrorCause) return installErrorCause; hasRequiredInstallErrorCause = 1; var isObject2 = requireIsObject(); var createNonEnumerableProperty2 = requireCreateNonEnumerableProperty(); installErrorCause = function(O, options) { if (isObject2(options) && "cause" in options) { createNonEnumerableProperty2(O, "cause", options.cause); } }; return installErrorCause; } var errorStackClear; var hasRequiredErrorStackClear; function requireErrorStackClear() { if (hasRequiredErrorStackClear) return errorStackClear; hasRequiredErrorStackClear = 1; var uncurryThis = requireFunctionUncurryThis(); var $Error = Error; var replace = uncurryThis("".replace); var TEST = function(arg) { return String(new $Error(arg).stack); }("zxcasd"); var V8_OR_CHAKRA_STACK_ENTRY = /\n\s*at [^:]*:[^\n]*/; var IS_V8_OR_CHAKRA_STACK = V8_OR_CHAKRA_STACK_ENTRY.test(TEST); errorStackClear = function(stack, dropEntries) { if (IS_V8_OR_CHAKRA_STACK && typeof stack == "string" && !$Error.prepareStackTrace) { while (dropEntries--) stack = replace(stack, V8_OR_CHAKRA_STACK_ENTRY, ""); } return stack; }; return errorStackClear; } var errorStackInstallable; var hasRequiredErrorStackInstallable; function requireErrorStackInstallable() { if (hasRequiredErrorStackInstallable) return errorStackInstallable; hasRequiredErrorStackInstallable = 1; var fails2 = requireFails(); var createPropertyDescriptor2 = requireCreatePropertyDescriptor(); errorStackInstallable = !fails2(function() { var error = new Error("a"); if (!("stack" in error)) return true; Object.defineProperty(error, "stack", createPropertyDescriptor2(1, 7)); return error.stack !== 7; }); return errorStackInstallable; } var errorStackInstall; var hasRequiredErrorStackInstall; function requireErrorStackInstall() { if (hasRequiredErrorStackInstall) return errorStackInstall; hasRequiredErrorStackInstall = 1; var createNonEnumerableProperty2 = requireCreateNonEnumerableProperty(); var clearErrorStack = requireErrorStackClear(); var ERROR_STACK_INSTALLABLE = requireErrorStackInstallable(); var captureStackTrace = Error.captureStackTrace; errorStackInstall = function(error, C, stack, dropEntries) { if (ERROR_STACK_INSTALLABLE) { if (captureStackTrace) captureStackTrace(error, C); else createNonEnumerableProperty2(error, "stack", clearErrorStack(stack, dropEntries)); } }; return errorStackInstall; } var wrapErrorConstructorWithCause; var hasRequiredWrapErrorConstructorWithCause; function requireWrapErrorConstructorWithCause() { if (hasRequiredWrapErrorConstructorWithCause) return wrapErrorConstructorWithCause; hasRequiredWrapErrorConstructorWithCause = 1; var getBuiltIn2 = requireGetBuiltIn(); var hasOwn = requireHasOwnProperty(); var createNonEnumerableProperty2 = requireCreateNonEnumerableProperty(); var isPrototypeOf = requireObjectIsPrototypeOf(); var setPrototypeOf = requireObjectSetPrototypeOf(); var copyConstructorProperties2 = requireCopyConstructorProperties(); var proxyAccessor2 = requireProxyAccessor(); var inheritIfRequired2 = requireInheritIfRequired(); var normalizeStringArgument2 = requireNormalizeStringArgument(); var installErrorCause2 = requireInstallErrorCause(); var installErrorStack = requireErrorStackInstall(); var DESCRIPTORS = requireDescriptors(); var IS_PURE = requireIsPure(); wrapErrorConstructorWithCause = function(FULL_NAME, wrapper, FORCED, IS_AGGREGATE_ERROR) { var STACK_TRACE_LIMIT = "stackTraceLimit"; var OPTIONS_POSITION = IS_AGGREGATE_ERROR ? 2 : 1; var path = FULL_NAME.split("."); var ERROR_NAME = path[path.length - 1]; var OriginalError = getBuiltIn2.apply(null, path); if (!OriginalError) return; var OriginalErrorPrototype = OriginalError.prototype; if (!IS_PURE && hasOwn(OriginalErrorPrototype, "cause")) delete OriginalErrorPrototype.cause; if (!FORCED) return OriginalError; var BaseError = getBuiltIn2("Error"); var WrappedError = wrapper(function(a, b) { var message = normalizeStringArgument2(IS_AGGREGATE_ERROR ? b : a, void 0); var result = IS_AGGREGATE_ERROR ? new OriginalError(a) : new OriginalError(); if (message !== void 0) createNonEnumerableProperty2(result, "message", message); installErrorStack(result, WrappedError, result.stack, 2); if (this && isPrototypeOf(OriginalErrorPrototype, this)) inheritIfRequired2(result, this, WrappedError); if (arguments.length > OPTIONS_POSITION) installErrorCause2(result, arguments[OPTIONS_POSITION]); return result; }); WrappedError.prototype = OriginalErrorPrototype; if (ERROR_NAME !== "Error") { if (setPrototypeOf) setPrototypeOf(WrappedError, BaseError); else copyConstructorProperties2(WrappedError, BaseError, { name: true }); } else if (DESCRIPTORS && STACK_TRACE_LIMIT in OriginalError) { proxyAccessor2(WrappedError, OriginalError, STACK_TRACE_LIMIT); proxyAccessor2(WrappedError, OriginalError, "prepareStackTrace"); } copyConstructorProperties2(WrappedError, OriginalError); if (!IS_PURE) try { if (OriginalErrorPrototype.name !== ERROR_NAME) { createNonEnumerableProperty2(OriginalErrorPrototype, "name", ERROR_NAME); } OriginalErrorPrototype.constructor = WrappedError; } catch (error) { } return WrappedError; }; return wrapErrorConstructorWithCause; } var hasRequiredEs_error_cause; function requireEs_error_cause() { if (hasRequiredEs_error_cause) return es_error_cause; hasRequiredEs_error_cause = 1; var $ = require_export(); var globalThis2 = requireGlobalThis(); var apply = requireFunctionApply(); var wrapErrorConstructorWithCause2 = requireWrapErrorConstructorWithCause(); var WEB_ASSEMBLY = "WebAssembly"; var WebAssembly = globalThis2[WEB_ASSEMBLY]; var FORCED = new Error("e", { cause: 7 }).cause !== 7; var exportGlobalErrorCauseWrapper = function(ERROR_NAME, wrapper) { var O = {}; O[ERROR_NAME] = wrapErrorConstructorWithCause2(ERROR_NAME, wrapper, FORCED); $({ global: true, constructor: true, arity: 1, forced: FORCED }, O); }; var exportWebAssemblyErrorCauseWrapper = function(ERROR_NAME, wrapper) { if (WebAssembly && WebAssembly[ERROR_NAME]) { var O = {}; O[ERROR_NAME] = wrapErrorConstructorWithCause2(WEB_ASSEMBLY + "." + ERROR_NAME, wrapper, FORCED); $({ target: WEB_ASSEMBLY, stat: true, constructor: true, arity: 1, forced: FORCED }, O); } }; exportGlobalErrorCauseWrapper("Error", function(init2) { return function Error2(message) { return apply(init2, this, arguments); }; }); exportGlobalErrorCauseWrapper("EvalError", function(init2) { return function EvalError(message) { return apply(init2, this, arguments); }; }); exportGlobalErrorCauseWrapper("RangeError", function(init2) { return function RangeError2(message) { return apply(init2, this, arguments); }; }); exportGlobalErrorCauseWrapper("ReferenceError", function(init2) { return function ReferenceError(message) { return apply(init2, this, arguments); }; }); exportGlobalErrorCauseWrapper("SyntaxError", function(init2) { return function SyntaxError(message) { return apply(init2, this, arguments); }; }); exportGlobalErrorCauseWrapper("TypeError", function(init2) { return function TypeError2(message) { return apply(init2, this, arguments); }; }); exportGlobalErrorCauseWrapper("URIError", function(init2) { return function URIError(message) { return apply(init2, this, arguments); }; }); exportWebAssemblyErrorCauseWrapper("CompileError", function(init2) { return function CompileError(message) { return apply(init2, this, arguments); }; }); exportWebAssemblyErrorCauseWrapper("LinkError", function(init2) { return function LinkError(message) { return apply(init2, this, arguments); }; }); exportWebAssemblyErrorCauseWrapper("RuntimeError", function(init2) { return function RuntimeError(message) { return apply(init2, this, arguments); }; }); return es_error_cause; } requireEs_error_cause(); var es_object_toString = {}; var objectToString; var hasRequiredObjectToString; function requireObjectToString() { if (hasRequiredObjectToString) return objectToString; hasRequiredObjectToString = 1; var TO_STRING_TAG_SUPPORT = requireToStringTagSupport(); var classof2 = requireClassof(); objectToString = TO_STRING_TAG_SUPPORT ? {}.toString : function toString2() { return "[object " + classof2(this) + "]"; }; return objectToString; } var hasRequiredEs_object_toString; function requireEs_object_toString() { if (hasRequiredEs_object_toString) return es_object_toString; hasRequiredEs_object_toString = 1; var TO_STRING_TAG_SUPPORT = requireToStringTagSupport(); var defineBuiltIn2 = requireDefineBuiltIn(); var toString2 = requireObjectToString(); if (!TO_STRING_TAG_SUPPORT) { defineBuiltIn2(Object.prototype, "toString", toString2, { unsafe: true }); } return es_object_toString; } requireEs_object_toString(); var web_domCollections_forEach = {}; var domIterables; var hasRequiredDomIterables; function requireDomIterables() { if (hasRequiredDomIterables) return domIterables; hasRequiredDomIterables = 1; domIterables = { CSSRuleList: 0, CSSStyleDeclaration: 0, CSSValueList: 0, ClientRectList: 0, DOMRectList: 0, DOMStringList: 0, DOMTokenList: 1, DataTransferItemList: 0, FileList: 0, HTMLAllCollection: 0, HTMLCollection: 0, HTMLFormElement: 0, HTMLSelectElement: 0, MediaList: 0, MimeTypeArray: 0, NamedNodeMap: 0, NodeList: 1, PaintRequestList: 0, Plugin: 0, PluginArray: 0, SVGLengthList: 0, SVGNumberList: 0, SVGPathSegList: 0, SVGPointList: 0, SVGStringList: 0, SVGTransformList: 0, SourceBufferList: 0, StyleSheetList: 0, TextTrackCueList: 0, TextTrackList: 0, TouchList: 0 }; return domIterables; } var domTokenListPrototype; var hasRequiredDomTokenListPrototype; function requireDomTokenListPrototype() { if (hasRequiredDomTokenListPrototype) return domTokenListPrototype; hasRequiredDomTokenListPrototype = 1; var documentCreateElement2 = requireDocumentCreateElement(); var classList = documentCreateElement2("span").classList; var DOMTokenListPrototype = classList && classList.constructor && classList.constructor.prototype; domTokenListPrototype = DOMTokenListPrototype === Object.prototype ? void 0 : DOMTokenListPrototype; return domTokenListPrototype; } var functionUncurryThisClause; var hasRequiredFunctionUncurryThisClause; function requireFunctionUncurryThisClause() { if (hasRequiredFunctionUncurryThisClause) return functionUncurryThisClause; hasRequiredFunctionUncurryThisClause = 1; var classofRaw2 = requireClassofRaw(); var uncurryThis = requireFunctionUncurryThis(); functionUncurryThisClause = function(fn) { if (classofRaw2(fn) === "Function") return uncurryThis(fn); }; return functionUncurryThisClause; } var functionBindContext; var hasRequiredFunctionBindContext; function requireFunctionBindContext() { if (hasRequiredFunctionBindContext) return functionBindContext; hasRequiredFunctionBindContext = 1; var uncurryThis = requireFunctionUncurryThisClause(); var aCallable2 = requireACallable(); var NATIVE_BIND = requireFunctionBindNative(); var bind = uncurryThis(uncurryThis.bind); functionBindContext = function(fn, that) { aCallable2(fn); return that === void 0 ? fn : NATIVE_BIND ? bind(fn, that) : function() { return fn.apply(that, arguments); }; }; return functionBindContext; } var arrayIteration; var hasRequiredArrayIteration; function requireArrayIteration() { if (hasRequiredArrayIteration) return arrayIteration; hasRequiredArrayIteration = 1; var bind = requireFunctionBindContext(); var IndexedObject = requireIndexedObject(); var toObject2 = requireToObject(); var lengthOfArrayLike2 = requireLengthOfArrayLike(); var arraySpeciesCreate2 = requireArraySpeciesCreate(); var createProperty2 = requireCreateProperty(); var createMethod = function(TYPE) { var IS_MAP = TYPE === 1; var IS_FILTER = TYPE === 2; var IS_SOME = TYPE === 3; var IS_EVERY = TYPE === 4; var IS_FIND_INDEX = TYPE === 6; var IS_FILTER_REJECT = TYPE === 7; var NO_HOLES = TYPE === 5 || IS_FIND_INDEX; return function($this, callbackfn, that) { var O = toObject2($this); var self2 = IndexedObject(O); var length = lengthOfArrayLike2(self2); var boundFunction = bind(callbackfn, that); var index = 0; var resIndex = 0; var target = IS_MAP ? arraySpeciesCreate2($this, length) : IS_FILTER || IS_FILTER_REJECT ? arraySpeciesCreate2($this, 0) : void 0; var value, result; for (; length > index; index++) if (NO_HOLES || index in self2) { value = self2[index]; result = boundFunction(value, index, O); if (TYPE) { if (IS_MAP) createProperty2(target, index, result); else if (result) switch (TYPE) { case 3: return true; // some case 5: return value; // find case 6: return index; // findIndex case 2: createProperty2(target, resIndex++, value); } else switch (TYPE) { case 4: return false; // every case 7: createProperty2(target, resIndex++, value); } } } return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target; }; }; arrayIteration = { // `Array.prototype.forEach` method // https://tc39.es/ecma262/#sec-array.prototype.foreach forEach: createMethod(0), // `Array.prototype.map` method // https://tc39.es/ecma262/#sec-array.prototype.map map: createMethod(1), // `Array.prototype.filter` method // https://tc39.es/ecma262/#sec-array.prototype.filter filter: createMethod(2), // `Array.prototype.some` method // https://tc39.es/ecma262/#sec-array.prototype.some some: createMethod(3), // `Array.prototype.every` method // https://tc39.es/ecma262/#sec-array.prototype.every every: createMethod(4), // `Array.prototype.find` method // https://tc39.es/ecma262/#sec-array.prototype.find find: createMethod(5), // `Array.prototype.findIndex` method // https://tc39.es/ecma262/#sec-array.prototype.findIndex findIndex: createMethod(6), // `Array.prototype.filterReject` method // https://github.com/tc39/proposal-array-filtering filterReject: createMethod(7) }; return arrayIteration; } var arrayMethodIsStrict; var hasRequiredArrayMethodIsStrict; function requireArrayMethodIsStrict() { if (hasRequiredArrayMethodIsStrict) return arrayMethodIsStrict; hasRequiredArrayMethodIsStrict = 1; var fails2 = requireFails(); arrayMethodIsStrict = function(METHOD_NAME, argument) { var method = [][METHOD_NAME]; return !!method && fails2(function() { method.call(null, argument || function() { return 1; }, 1); }); }; return arrayMethodIsStrict; } var arrayForEach; var hasRequiredArrayForEach; function requireArrayForEach() { if (hasRequiredArrayForEach) return arrayForEach; hasRequiredArrayForEach = 1; var $forEach = requireArrayIteration().forEach; var arrayMethodIsStrict2 = requireArrayMethodIsStrict(); var STRICT_METHOD = arrayMethodIsStrict2("forEach"); arrayForEach = !STRICT_METHOD ? function forEach(callbackfn) { return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : void 0); } : [].forEach; return arrayForEach; } var hasRequiredWeb_domCollections_forEach; function requireWeb_domCollections_forEach() { if (hasRequiredWeb_domCollections_forEach) return web_domCollections_forEach; hasRequiredWeb_domCollections_forEach = 1; var globalThis2 = requireGlobalThis(); var DOMIterables = requireDomIterables(); var DOMTokenListPrototype = requireDomTokenListPrototype(); var forEach = requireArrayForEach(); var createNonEnumerableProperty2 = requireCreateNonEnumerableProperty(); var handlePrototype = function(CollectionPrototype) { if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try { createNonEnumerableProperty2(CollectionPrototype, "forEach", forEach); } catch (error) { CollectionPrototype.forEach = forEach; } }; for (var COLLECTION_NAME in DOMIterables) { if (DOMIterables[COLLECTION_NAME]) { handlePrototype(globalThis2[COLLECTION_NAME] && globalThis2[COLLECTION_NAME].prototype); } } handlePrototype(DOMTokenListPrototype); return web_domCollections_forEach; } requireWeb_domCollections_forEach(); /*! * el-table-infinite-scroll v3.0.8 * (c) 2019-2025 yujinpan */ function syncAttrs(sourceElem, targetElem, attrsKeys) { var value; attrsKeys.forEach(function(name) { value = sourceElem.getAttribute(name); if (value !== null) { targetElem.setAttribute(name, value); } else { targetElem.removeAttribute(name); } }); } /*! * el-table-infinite-scroll v3.0.8 * (c) 2019-2025 yujinpan */ var msgTitle = "[el-table-infinite-scroll]: "; var ElTableInfiniteScroll$1 = { mounted: function mounted(el, binding, VNode, oldVNode) { var _useScrollElem = useScrollElem(el), scrollElem = _useScrollElem.scrollElem; scrollElem.style.overflowY = "auto"; setTimeout(function() { if (!el.style.height) { scrollElem.style.height = "400px"; console.warn("".concat(msgTitle, "el-table height required, otherwise will set scrollbar default height: 400px")); } syncOptions(el, scrollElem); ElementPlus.ElInfiniteScroll.mounted(scrollElem, binding, VNode, oldVNode); }, 0); }, updated: function updated(el) { var _useScrollElem2 = useScrollElem(el), scrollElem = _useScrollElem2.scrollElem; syncOptions(el, scrollElem); }, unmounted: function unmounted(el) { var _useScrollElem3 = useScrollElem(el), scrollElem = _useScrollElem3.scrollElem; for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { args[_key - 1] = arguments[_key]; } ElementPlus.ElInfiniteScroll.unmounted.apply(ElementPlus.ElInfiniteScroll, [scrollElem].concat(args)); } }; function useScrollElem(el) { var _config$value; var config = ElementPlus.useGlobalConfig(); var elTableScrollWrapperClass = ".".concat(((_config$value = config.value) === null || _config$value === void 0 ? void 0 : _config$value.namespace) || "el", "-scrollbar__wrap"); var scrollElem = el.querySelector(elTableScrollWrapperClass); if (!scrollElem) { throw new Error("".concat(msgTitle).concat(elTableScrollWrapperClass, " element not found.")); } return { scrollElem }; } function syncOptions(sourceElem, targetElem) { syncAttrs(sourceElem, targetElem, ["infinite-scroll-disabled", "infinite-scroll-delay", "infinite-scroll-immediate", "infinite-scroll-distance"]); var name = "infinite-scroll-distance"; var value = +(sourceElem.getAttribute(name) || 0); targetElem.setAttribute(name, (value < 1 ? 1 : value) + ""); } /*! * el-table-infinite-scroll v3.0.8 * (c) 2019-2025 yujinpan */ var ElTableInfiniteScroll = Object.assign(ElTableInfiniteScroll$1, { install: function install(vue) { vue.directive("el-table-infinite-scroll", ElTableInfiniteScroll); } }); const pinia = createPinia(); const settings = useSettingsStore(pinia); const originalFetch = _unsafeWindow.fetch; var authorizationCache = null; var contextCache = null; var trueLoaded = false; var db = null; const checkingCommentIdSet = /* @__PURE__ */ new Set(); const continuationWhitelist = /* @__PURE__ */ new Set(); const hotCommentIdSet = /* @__PURE__ */ new Set(); function getAuthorization() { return authorizationCache; } function getContext() { return contextCache; } function waitForElement(observeSelector, targetSelector) { return new Promise((resolve) => { const parent = document.querySelector(observeSelector); if (!parent) return; const found = parent.querySelector(targetSelector); if (found) { resolve(found); return; } const observer = new MutationObserver(() => { const el = parent.querySelector(targetSelector); if (el) { observer.disconnect(); resolve(el); } }); observer.observe(parent, { childList: true, subtree: true }); }); } async function findComment(commentRecord, isLogin = true) { let continuation; let requestUrl; if (commentRecord.webPageType == "WEB_PAGE_TYPE_WATCH") { let payload = { uField3: 6, commentAreaWrapper: { videoId: commentRecord.commentAreaInfo.videoId }, mainCommentRequest: { sectionIdentifier: "comments-section", commentParameters: { videoId: commentRecord.commentAreaInfo.videoId, targetCommentId: commentRecord.commentId } } }; let encoded = NextContinuation.encode(payload); continuation = u8ArrayToBase64(encoded.finish()); requestUrl = "https://www.youtube.com/youtubei/v1/next?prettyPrint=false"; } else if (commentRecord.webPageType == "WEB_PAGE_TYPE_BROWSE") { let payload = { description: "community", mainCommentRequest: { sectionIdentifier: "comments-section", commentParameters: { channelId: commentRecord.commentAreaInfo.channelId, postId: commentRecord.commentAreaInfo.postId, targetCommentId: commentRecord.commentId } } }; let encoded = BrowserCommentListContinuation.encode(payload); let buffer = encoded.finish(); continuation = u8ArrayToBase64(buffer); payload = { request: { description: "FEcomment_post_detail_page_web_top_level", continuationBase64: continuation } }; encoded = BrowserContinuation.encode(payload); buffer = encoded.finish(); continuation = u8ArrayToBase64(buffer); requestUrl = "https://www.youtube.com/youtubei/v1/browse?prettyPrint=false"; } else { throw new Error("Unsupported webPageType : " + commentRecord.webPageType); } let data = { context: contextCache, continuation }; let headers = {}; if (isLogin) { headers.authorization = authorizationCache; } let options = { method: "POST", body: JSON.stringify(data), headers }; let response = await (await originalFetch(requestUrl, options)).json(); let loggedOut = response.responseContext.mainAppWebResponseContext.loggedOut; if (loggedOut == isLogin) { console.warn("登录状态不符,需要的:" + isLogin + " API返回的:" + !loggedOut); } if (!response.frameworkUpdates) { throw new Error("COMMENT_AREA_CLOSED"); } let mutations = response.frameworkUpdates.entityBatchUpdate.mutations; for (let i = 0; i < mutations.length; i++) { let mutation = mutations[i]; if (mutation.payload.commentEntityPayload) { let entity = mutation.payload.commentEntityPayload; let commentId = entity.properties.commentId; if (commentId == commentRecord.commentId) { let likeCount = parseInt(entity.toolbar.likeCountNotliked); likeCount = likeCount ? likeCount : 0; let replyCount = parseInt(entity.toolbar.replyCount); replyCount = replyCount ? replyCount : 0; return { content: entity.properties.content.content, commentId, likeCount, replyCount }; } } } } async function insertComment() { } async function updateComment() { } async function selectComment() { } async function deleteComment() { } function appendHistory(commentRecord) { let histories = commentRecord.histories; let needPush = false; if (histories.length == 0) { needPush = true; } else { let lastHistory = histories[histories.length - 1]; needPush = lastHistory.state != commentRecord.currentState || lastHistory.content != commentRecord.content || lastHistory.hotBan != commentRecord.hotBan; } if (needPush) { histories.push({ time: commentRecord.updatedTime, content: commentRecord.content, state: commentRecord.currentState, hotBan: commentRecord.hotBan }); } } function updateRecord(commentRecord, state, result) { commentRecord.updatedTime = Date.now(); if (state) { commentRecord.currentState = state; } if (result) { commentRecord.likeCount = result.likeCount; commentRecord.replyCount = result.replyCount; commentRecord.content = result.content; } appendHistory(commentRecord); updateComment(commentRecord); } async function check(commentRecord) { let loggedOutResult = await findComment(commentRecord, false); if (loggedOutResult) { updateRecord(commentRecord, "NORMAL", loggedOutResult); return; } let loggedInResult = await findComment(commentRecord, true); if (loggedInResult) { updateRecord(commentRecord, "SHADOW_BAN", loggedInResult); } else { updateRecord(commentRecord, "DELETED"); } } async function toCheck(commentRecord) { checkingCommentIdSet.add(commentRecord.commentId); let selector; let pathname = window.location.pathname; if (pathname.startsWith("/post") || pathname.startsWith("/channel")) { selector = "ytd-item-section-renderer#sections"; } else { selector = "#comments"; } let element = (await waitForElement(selector, `a[href='${commentRecord.url}']`)).parentNode.parentNode.parentNode.parentNode; let div = document.createElement("div"); div.style.marginTop = "8px"; div.id = "checker"; element.append(div); let app = vue.createApp(CommentChecker); app.use(ElementPlus); app.provide("check", check); app.provide("hotBanCheck", hotBanCheck); app.provide("commentRecord", commentRecord); app.provide("interval", 5); app.provide("unsafeWindow", _unsafeWindow); app.provide("settings", settings); app.provide("onUnblock", (commentRecord2) => { checkingCommentIdSet.delete(commentRecord2.commentId); }); app.provide("onClose", (commentRecord2) => { checkingCommentIdSet.delete(commentRecord2.commentId); console.log("评论检查完成", commentRecord2); div.remove(); }); app.mount(div); } function createCommentListRequest(commentRecord, isLatestSort) { let api; let continuation; let isReply = false; if (commentRecord.webPageType == "WEB_PAGE_TYPE_WATCH") { api = "https://www.youtube.com/youtubei/v1/next?prettyPrint=false"; if (commentRecord.commentId.indexOf(".") != -1) { isReply = true; let rootCommentId = commentRecord.commentId.split(".")[0]; continuation = createVideoReplyCommentListContinuation( commentRecord.commentAreaInfo.channelId, commentRecord.commentAreaInfo.videoId, rootCommentId ); } else { continuation = createVideoRootCommentListContinuation( commentRecord.commentAreaInfo.channelId, commentRecord.commentAreaInfo.videoId, isLatestSort ); } } else if (commentRecord.webPageType == "WEB_PAGE_TYPE_BROWSE") { api = "https://www.youtube.com/youtubei/v1/browse?prettyPrint=false"; if (commentRecord.commentId.indexOf(".") != -1) { isReply = true; let rootCommentId = commentRecord.commentId.split(".")[0]; continuation = createPostReplyCommentListContinuation( commentRecord.commentAreaInfo.channelId, commentRecord.commentAreaInfo.postId, rootCommentId ); } else { continuation = createPostRootCommentListContinuation( commentRecord.commentAreaInfo.channelId, commentRecord.commentAreaInfo.postId, isLatestSort ); } } return { api, continuation, isReply }; } async function loadSubTreeMutations(api, mutations, onResponseReceivedEndpoints) { var _a; if (!onResponseReceivedEndpoints) return; for (const endpoint of onResponseReceivedEndpoints) { const items = (_a = endpoint.appendContinuationItemsAction) == null ? void 0 : _a.continuationItems; if (!items) continue; for (let item of items) { let replies = item.commentThreadRenderer.replies; if (!replies) continue; for (let th of replies.commentRepliesRenderer.subThreads) { for (let thh of th.commentThreadRenderer.replies.commentRepliesRenderer.subThreads) { let token = thh.continuationItemRenderer.button.buttonRenderer.command.continuationCommand.token; while (token) { let options = { method: "POST", body: JSON.stringify({ context: contextCache, continuation: token }) }; let response = await (await originalFetch(api, options)).json(); if (response.frameworkUpdates) { mutations.push(...response.frameworkUpdates.entityBatchUpdate.mutations); } await loadSubTreeMutations(api, mutations, response.onResponseReceivedEndpoints); token = findNextContinuation(response); } } } } } } async function hotBanCheck(commentRecord, observer, controller) { if (!observer) { observer = { onCountChange(c, p) { } }; } if (!controller) { controller = { isCancelled: false }; } let pageCpunt = 0; let commentCount = 0; let { api, continuation, isReply } = createCommentListRequest(commentRecord); while (continuation) { if (controller.isCancelled) { return false; } let data = { context: contextCache, continuation }; let options = { method: "POST", body: JSON.stringify(data) }; let response = await (await originalFetch(api, options)).json(); pageCpunt++; if (!response.frameworkUpdates) { commentRecord.hotBan = true; updateRecord(commentRecord); return true; } let mutations = response.frameworkUpdates.entityBatchUpdate.mutations; if (isReply) { await loadSubTreeMutations(api, mutations, response.onResponseReceivedEndpoints); } for (let mutation of response.frameworkUpdates.entityBatchUpdate.mutations) { let entity = mutation.payload.commentEntityPayload; if (entity) { let commentId = entity.properties.commentId; commentCount++; observer.onCountChange(commentCount, pageCpunt); if (commentId == commentRecord.commentId) { commentRecord.hotBan = false; updateRecord(commentRecord); return true; } } } continuation = findNextContinuation(response); } commentRecord.hotBan = true; updateRecord(commentRecord); return true; } async function handlerYoutubei(request) { var _a; let requsetClone = await autoDecompressRequest(request.clone()); let requestBody = await requsetClone.json(); if (requestBody && requestBody.context) { contextCache = requestBody.context; if (!trueLoaded) { console.log("fetch已成功劫持"); _GM_registerMenuCommand("✅ 脚本已完全加载"); trueLoaded = true; } } if (request.url.startsWith("https://www.youtube.com/youtubei/v1/get_watch")) { let response = await originalFetch(request); if (response.status != 200) { return response; } let json = await response.clone().json(); let btnUnlocked = false; try { btnUnlocked = fuckCoppa(json[1].watchNextResponse.contents.twoColumnWatchNextResults.results.results.contents[0].videoPrimaryInfoRenderer.videoActions.menuRenderer.flexibleItems); } catch (e) { console.error("解锁爱童TV收藏按钮失败", e); } if (btnUnlocked) { return new Response(JSON.stringify(json), { status: response.status, headers: response.headers }); } return response; } else if (request.url.startsWith("https://www.youtube.com/youtubei/v1/comment/create_comment")) { let response = await originalFetch(request); if (response.status != 200) { return response; } let responseClone = response.clone(); try { let json = await responseClone.json(); if (json.frameworkUpdates.entityBatchUpdate.mutations.length == 1) { return response; } let entity = json.frameworkUpdates.entityBatchUpdate.mutations[0].payload.commentEntityPayload; let innertubeCommand = json.frameworkUpdates.entityBatchUpdate.mutations[1].payload.commentSurfaceEntityPayload.publishedTimeCommand.innertubeCommand; let webCommandMetadata = innertubeCommand.commandMetadata.webCommandMetadata; let webPageType = webCommandMetadata.webPageType; let url = webCommandMetadata.url; let commentAreaInfo = {}; commentAreaInfo.channelId = findValueInSingleEntryArray(json.actions[0].runAttestationCommand.ids, "externalChannelId"); if (webPageType == "WEB_PAGE_TYPE_WATCH") { commentAreaInfo.videoId = innertubeCommand.watchEndpoint.videoId; } else if (webPageType == "WEB_PAGE_TYPE_BROWSE") { commentAreaInfo.postId = createUrl(url).pathname.split("/")[2]; } let author = entity.author; let properties = entity.properties; let content = properties.content.content; let recordedTime = Date.now(); let commentRecord = { //评论ID commentId: properties.commentId, //@发送者 displayName: author.displayName, //频道ID,类似UID channelId: author.channelId, //评论内容 content, //webPageType 评论区类型 视频 or 帖子 webPageType, //URL 点击可跳转“所要查看的评论” 例如 /watch?v=${视频ID}&lc=${评论ID} url, //评论区信息,视频{视频ID},帖子{频道ID,帖子ID} commentAreaInfo, //当前状态 默认从SHADOW_BAN开始,到NORMAL或DELETED currentState: "NOT_CHECK", //是否在热门排序中被禁止显示(搜索整个热门评论区来检查),前提条件currentState = "NORMAL",值:null | false | true //此状态不会因为修改评论内容而解除,但会因为修改评论内容而赋予 hotBan: null, //历史记录,时间 内容 状态 是否热门屏蔽 histories: [], //{ time: recordedTime, state: "SHADOW_BAN", content, hotBan: null } //点赞与回复数,不记录历史 likeCount: 0, replyCount: 0, //记录的时间,用的是系统当前时间,约等于评论的发布时间,API里的publishedTime距离发布时间戳多久的Shit不是时间戳(PS:YouTube开放API可查询具体发布时间戳) recordedTime, //更新时间 updatedTime: recordedTime, //是否是用户自己执行的删除?用于区分是被系统删的还是自己删除。state为"DELETED"时该属性为才有意义。(劫持删除评论请求时记录) isUserDelete: false }; console.log(commentRecord); insertComment(commentRecord); console.log(createUrl(url).href); toCheck(commentRecord); } catch (err) { console.error(err); throw err; } return response; } else if (request.url.startsWith("https://www.youtube.com/youtubei/v1/comment/perform_comment_action")) { let actionInfo = CommentAction.decode(base64ToU8Array(requestBody.actions[0])); if (actionInfo.action == 6) { if (checkingCommentIdSet.has(actionInfo.commentId)) { alert("现在不能删除该评论,因为评论还未完成检查,请先完成检查!"); const responseBody = { "error": { "code": 403, "message": "Can't delete comment now", "errors": [ { "message": "Can't delete comment now", "domain": "global", "reason": "forbidden" } ], "status": "FORBIDDEN" } }; return new Response(JSON.stringify(responseBody), { status: 403, headers: { "Content-Type": "application/json" } }); } else { let response = await originalFetch(request); let responseBody = await response.clone().json(); if (responseBody.actions && responseBody.actions[0].removeCommentAction.actionResult.status == "STATUS_SUCCEEDED") { let commentRecord = await selectComment(actionInfo.commentId); if (commentRecord) { commentRecord.isUserDelete = true; updateRecord(commentRecord, "DELETED"); } } return response; } } } else if (request.url.startsWith("https://www.youtube.com/youtubei/v1/comment/update_comment")) { let updateCommentParams = requestBody.updateCommentParams; let decodedParams = UpdateCommentParams.decode(base64ToU8Array(updateCommentParams)); if (checkingCommentIdSet.has(decodedParams.commentId)) { alert("现在不能修改该评论,因为评论还未完成检查,请先完成检查!"); const responseBody2 = { "error": { "code": 403, "message": "Can't edit comment now", "errors": [ { "message": "Can't edit comment now", "domain": "global", "reason": "forbidden" } ], "status": "FORBIDDEN" } }; return new Response(JSON.stringify(responseBody2), { status: 403, headers: { "Content-Type": "application/json" } }); } let response = await originalFetch(request); let responseBody = await response.clone().json(); if (responseBody.actions && responseBody.actions[0].updateCommentAction.actionResult.status == "STATUS_SUCCEEDED") { let commentRecord = await selectComment(decodedParams.commentId); if (commentRecord) { commentRecord.content = requestBody.commentText; commentRecord.currentState = "NOT_CHECK"; commentRecord.hotBan = null; updateRecord(commentRecord); } } return response; } else if (request.url.startsWith("https://www.youtube.com/youtubei/v1/next") || request.url.startsWith("https://www.youtube.com/youtubei/v1/browse")) { let apiUrl = request.url; if (!settings.forceTimeSort) { return await originalFetch(request); } let continuation = requestBody.continuation; if (!continuation) { return await originalFetch(request); } let response; let hotSearchContinuation; if (!continuationWhitelist.has(requestBody.continuation)) { if (apiUrl.startsWith("https://www.youtube.com/youtubei/v1/next")) { let decodedNextContinuation = NextContinuation.decode(base64ToU8Array(continuation)); if (!((_a = decodedNextContinuation.mainCommentRequest) == null ? void 0 : _a.commentReplyParameters)) { return await originalFetch(request); } requestBody.continuation = generateVideoAreaReqContinuation(decodedNextContinuation, 2); hotSearchContinuation = generateVideoAreaReqContinuation(decodedNextContinuation, 1); } else { let decodedBrowserContinuation = BrowserContinuation.decode(base64ToU8Array(continuation)); if (decodedBrowserContinuation.request.description != "FEcomment_post_detail_page_web_replies_page") { return await originalFetch(request); } requestBody.continuation = generatePostAreaReqContinuation(decodedBrowserContinuation, 2); hotSearchContinuation = generatePostAreaReqContinuation(decodedBrowserContinuation, 1); } request = new Request(request.url, { method: request.method, headers: request.headers, body: JSON.stringify(requestBody) }); response = await originalFetch(request); if (response.ok) { let responseJson = await response.clone().json(); let nextContinuation = findNextContinuation(responseJson); if (nextContinuation) { continuationWhitelist.add(nextContinuation); } if (settings.showBlockedHotComments) { await loadAllHotReplyId(hotSearchContinuation, apiUrl); addHotBannedTip(responseJson); response = changeResponseBody(response, responseJson); } } } else { continuationWhitelist.delete(requestBody.continuation); response = await originalFetch(request); let responseJson = await response.clone().json(); let nextContinuation = findNextContinuation(responseJson); if (nextContinuation) { continuationWhitelist.add(nextContinuation); } if (settings.showBlockedHotComments) { addHotBannedTip(responseJson); response = changeResponseBody(response, responseJson); } } return response; } return await originalFetch(request); } function generateVideoAreaReqContinuation(decodedNextContinuation, sortType) { decodedNextContinuation.mainCommentRequest.commentReplyParameters.sortParam.sortType = sortType; return u8ArrayToBase64(NextContinuation.encode(decodedNextContinuation).finish()); } function generatePostAreaReqContinuation(decodedBrowserContinuation, sortType) { let decodedBrowserCommentListContinuation = BrowserCommentListContinuation.decode(base64ToU8Array(decodedBrowserContinuation.request.continuationBase64)); decodedBrowserCommentListContinuation.mainCommentRequest.commentReplyParameters.sortParam.sortType = sortType; decodedBrowserContinuation.request.continuationBase64 = u8ArrayToBase64( BrowserCommentListContinuation.encode(decodedBrowserCommentListContinuation).finish() ); return u8ArrayToBase64(BrowserContinuation.encode(decodedBrowserContinuation).finish()); } async function loadAllHotReplyId(continuation, api) { let count = 0; while (continuation) { let data = { context: contextCache, continuation }; let options = { method: "POST", body: JSON.stringify(data), headers: { authorization: authorizationCache } }; let response; try { response = await (await originalFetch(api, options)).json(); } catch (err) { return; } let mutations = response.frameworkUpdates.entityBatchUpdate.mutations; loadSubTreeMutations(api, mutations, response.onResponseReceivedEndpoints); for (let mutation of mutations) { if (mutation.payload.commentEntityPayload) { hotCommentIdSet.add(mutation.payload.commentEntityPayload.properties.commentId); count++; } } continuation = findNextContinuation(response); } console.log(`已获取 ${count} 个热门回复评论……`); } function addHotBannedTip(response) { if (!response.frameworkUpdates) { return; } for (let mutation of response.frameworkUpdates.entityBatchUpdate.mutations) { let entity = mutation.payload.commentEntityPayload; if (entity) { let properties = entity.properties; if (!hotCommentIdSet.has(properties.commentId)) { properties.publishedTime = properties.publishedTime + "(热门屏蔽的)"; } } } } function changeResponseBody(originalResponse, bodyJson) { return new Response(JSON.stringify(bodyJson), { status: originalResponse.status, headers: originalResponse.headers }); } const fetchProxy = function(resource, options) { if (typeof resource == "string") { return originalFetch(resource, options); } if (!resource.url.startsWith("https://www.youtube.com/youtubei/")) { return originalFetch(resource, options); } let auth = resource.headers.get("Authorization"); if (auth) { authorizationCache = auth; if (resource.method != "POST") { return originalFetch(resource); } else { return handlerYoutubeiReq(resource); } } return originalFetch(resource, options); }; async function handlerYoutubeiReq(resource) { try { return handlerYoutubei(resource); } catch (error) { console.error(error); throw error; } } try { _unsafeWindow.fetch = fetchProxy; } catch (err) { console.warn("替换 unsafeWindow.fetch 失败!相关信息:", err, Object.getOwnPropertyDescriptor(_unsafeWindow, "fetch")); if (confirm("fetch已被提前锁定,替换失败,YouTube发评反诈可能无法正常工作。\n你可以安装本项目的 Define property blocker 插件来反制锁定。\n\n点击“确定”前往项目地址,点击“取消”忽略。")) { window.location.href = "https://github.com/freedom-introvert/youtube-comment-censor-detector"; } } const _createElement = Document.prototype.createElement; Document.prototype.createElement = function(tagName, ...args) { const el = _createElement.call(this, tagName, ...args); if (tagName.toLowerCase() === "iframe") { el.addEventListener("load", () => { var _a; try { const fetchFromIframe = (_a = el.contentWindow) == null ? void 0 : _a.fetch; if (fetchFromIframe) { el.contentWindow.fetch = fetchProxy; console.log("已替换iframe window的fetch", el); } } catch (e) { console.log("未替换该iframe的fetch", el, e); } }); } return el; }; function openDB() { return new Promise((resolve, reject) => { let request = indexedDB.open("YT-CCD", 2); request.onerror = (event) => { reject(event); }; request.onsuccess = (event) => { console.log(event.target.result); resolve(event.target.result); }; request.onupgradeneeded = (event) => { debugger; let db2 = event.target.result; let oldVersion = event.oldVersion; if (oldVersion == 0) { let comments = db2.createObjectStore("comments", { keyPath: "commentId" }); comments.createIndex("recordedTime", "recordedTime", { unique: false }); let hotBanCommentCollect = db2.createObjectStore("hotBanCommentCollect", { keyPath: "commentId" }); hotBanCommentCollect.createIndex("recordedTime", "recordedTime", { unique: false }); } switch (oldVersion) { case 1: { let hotBanCommentCollect = db2.createObjectStore("hotBanCommentCollect", { keyPath: "commentId" }); hotBanCommentCollect.createIndex("recordedTime", "recordedTime", { unique: false }); } } }; }); } async function init() { try { db = await openDB(); insertComment = function(comment) { return new Promise((resolve, reject) => { let request = db.transaction("comments", "readwrite").objectStore("comments").add(comment); request.onsuccess = (event) => { resolve(event); }; request.onerror = (event) => { reject(event.target.error); }; }); }; updateComment = function(comment) { return new Promise((resolve, reject) => { let request = db.transaction("comments", "readwrite").objectStore("comments").put(vue.toRaw(comment)); request.onsuccess = (event) => { resolve(event); }; request.onerror = (event) => { reject(event.target); }; }); }; selectComment = function(commentId) { return new Promise((resolve, reject) => { let request = db.transaction("comments").objectStore("comments").get(commentId); request.onsuccess = (event) => { resolve(request.result); }; request.onerror = (event) => { reject(event); }; }); }; deleteComment = function(commentId) { return new Promise((resolve, reject) => { if (checkingCommentIdSet.has(commentId)) { reject(new Error("checking-now")); return; } let request = db.transaction("comments", "readwrite").objectStore("comments").delete(commentId); request.onsuccess = (event) => { resolve(request.result); }; request.onerror = (event) => { reject(event.target.error); }; }); }; } catch (err) { console.log("indexedDB数据库打开失败,评论历史记录相关功能已禁用,错误信息:", err); } const menuListener = { onOpenHistory: () => { alert("脚本正在初始化,请稍后……"); } }; _GM_registerMenuCommand("🧾 历史评论记录", () => { menuListener.onOpenHistory(); }); _GM_registerMenuCommand("🔍 搜索热门屏蔽评论", () => { menuListener.onSearchHotBan(); }); _GM_registerMenuCommand("⭐ 热门屏蔽评论收藏", () => { menuListener.onOpenHotBanCollect(); }); _GM_registerMenuCommand("⚙️ 设置", () => { menuListener.onOpenSettings(); }); const div = document.createElement("div"); div.id = "yt-ccd"; div.style.position = "absolute"; document.body.append(div); let app = vue.createApp(App); app.use(ElementPlus, { zIndex: 3e3, locale: zh_cn_default }); app.use(ElTableInfiniteScroll); app.use(pinia); app.provide("menuListener", menuListener); app.provide("db", db); app.provide("check", check); app.provide("hotBanCheck", hotBanCheck); app.provide("deleteComment", deleteComment); app.provide("insertComment", insertComment); app.provide("updateComment", updateComment); app.provide("getAuthorization", getAuthorization); app.provide("getContext", getContext); app.provide("originalFetch", originalFetch); app.mount(div); } window.addEventListener("load", () => { init().then(() => { console.log("YouTube反诈加载完成"); }).catch((err) => { console.error("YouTube反诈加载失败", err); }); }); async function autoDecompressRequest(request) { if (!["POST", "PUT", "PATCH"].includes(request.method) || !request.body) { return request; } try { const contentEncoding = request.headers.get("content-encoding"); const isGzipHeader = contentEncoding && contentEncoding.toLowerCase().includes("gzip"); const reader2 = request.clone().body.getReader(); const { value } = await reader2.read(); reader2.releaseLock(); const isGzipMagic = value && value[0] === 31 && value[1] === 139; if (isGzipHeader || isGzipMagic) { const fullBuffer = await request.clone().arrayBuffer(); const ds = new DecompressionStream("gzip"); const decompressedStream = new Blob([fullBuffer]).stream().pipeThrough(ds); const decompressedText = await new Response(decompressedStream).text(); const newHeaders = new Headers(request.headers); newHeaders.delete("Content-Encoding"); newHeaders.delete("Content-Length"); return new Request(request.url, { method: request.method, headers: newHeaders, body: decompressedText, // 继承原请求的所有关键属性 referrer: request.referrer, referrerPolicy: request.referrerPolicy, mode: request.mode, credentials: request.credentials, cache: request.cache, redirect: request.redirect, integrity: request.integrity, keepalive: request.keepalive, signal: request.signal }); } } catch (err) { console.warn("自动解压判断逻辑出错(可能是流已关闭或非压缩数据):", err); } return request; } let ytInitialData_; Object.defineProperty(_unsafeWindow, "ytInitialData", { configurable: true, enumerable: true, set(v) { try { if ("/watch" == createUrl().pathname) { fuckCoppa(v.contents.twoColumnWatchNextResults.results.results.contents[0].videoPrimaryInfoRenderer.videoActions.menuRenderer.flexibleItems); } } catch (e) { console.error("解锁爱童TV收藏按钮失败", e); } ytInitialData_ = v; }, get() { return ytInitialData_; } }); function fuckCoppa(flexibleItems) { if (!settings.unlockKidsVideoSaveButton) { return false; } let targetRenderer = null; for (let item of flexibleItems) { if (item.menuFlexibleItemRenderer.topLevelButton.buttonViewModel.iconName == "PLAYLIST_ADD") { targetRenderer = item.menuFlexibleItemRenderer; break; } } if (!targetRenderer) return false; if (targetRenderer.topLevelButton.buttonViewModel.onDisabledTap) { let buttonViewModel = targetRenderer.topLevelButton.buttonViewModel; delete buttonViewModel.state; delete buttonViewModel.onDisabledTap; let innertubeCommand; for (let command of buttonViewModel.onTap.serialCommand.commands) { if (command.innertubeCommand) { innertubeCommand = command.innertubeCommand; break; } } let encoded = GetPanelRequest.encode({ params: { videoId: createUrl().searchParams.get("v"), uField5: 2 } }); let params = u8ArrayToBase64(encoded.finish()); let showSheetCommand = { panelLoadingStrategy: { requestTemplate: { panelId: "PAadd_to_playlist", params }, screenVe: 264491 }, contextualSheetPresentationConfig: { expandToFullWidth: true } }; innertubeCommand.showSheetCommand = showSheetCommand; let serviceEndpoint = targetRenderer.menuItem.menuServiceItemRenderer.serviceEndpoint; delete serviceEndpoint.signalServiceEndpoint; serviceEndpoint.showSheetCommand = showSheetCommand; console.log("已解锁爱童TV的收藏按钮"); return true; } } })(Vue, ElementPlus);