{"version":3,"file":"index-690fd172.js","sources":["../../../vite/modulepreload-polyfill","../../../vite/preload-helper","../../../src/components/AppLink.vue","../../../src/core/PageInfo.js","../../../src/core/pages.js","../../../src/assets/images/404.png","../../../src/assets/images/bg-side.png","../../../src/assets/images/feed-comment-bg.jpg","../../../src/assets/images/hand.png","../../../src/assets/images/ico-face.png","../../../src/assets/images/ico-link.png","../../../src/assets/images/loading.gif","../../../src/assets/images/logo.png","../../../src/assets/img/bg-game.png","../../../src/assets/img/btn-xz.png","../../../src/assets/img/ico-active.png","../../../src/assets/img/img-260x360.jpg","../../../src/assets/img/img-260x360a.jpg","../../../src/assets/img/img-50x50.jpg","../../../src/assets/img/img-603x1069.jpg","../../../src/core/util.js","../../../src/api/instance.js","../../../src/api/APIResponse.js","../../../src/api/index.js","../../../src/store/defineStore.js","../../../src/store/defineListStore.js","../../../src/store/defineRvListStore.js","../../../src/core/dataGenerator.js","../../../src/models/richContent.js","../../../src/models/thread.js","../../../src/store/stores.js","../../../src/components/toast/index.js","../../../src/core/passport.js","../../../src/directives/bi.js","../../../src/components/AppMenu.vue","../../../src/App.vue","../../../plugin-vue:export-helper","../../../src/components/ListLoader.vue","../../../src/components/swiper-feed/user/UserThreadItem.vue","../../../src/components/swiper-feed/user/CollectionList.vue","../../../src/hooks/useBumpUp.js","../../../src/components/swiper-feed/user/OpusList.vue","../../../src/components/UserFollowBtn.vue","../../../src/components/swiper-feed/user/SFUser.vue","../../../src/plugins/editor.js","../../../src/components/Editor.vue","../../../src/components/swiper-feed/comment/CommentForm.vue","../../../src/components/ParagraphText.vue","../../../src/components/swiper-feed/comment/CommentItem.vue","../../../src/store/comment.js","../../../src/components/swiper-feed/comment/CommentList.vue","../../../src/hooks/useCommentChanged.js","../../../src/components/swiper-feed/comment/SFComment.vue","../../../src/components/swiper-feed/player-lang.js","../../../src/constants/constants.js","../../../src/components/swiper-feed/AdFloat.vue","../../../src/components/swiper-feed/shared.js","../../../src/components/swiper-feed/useBgAd.js","../../../src/components/swiper-feed/SFPlayer.vue","../../../src/hooks/useThreadRecommends.js","../../../src/components/swiper-feed/user/useUserThreadList.js","../../../src/components/swiper-feed/user/useCollectionList.js","../../../src/components/swiper-feed/SwiperFeed.vue","../../../src/components/ThreadItem.vue","../../../src/hooks/useTidLand.js","../../../src/pages/home/Home.vue","../../../src/pages/404.vue","../../../src/pages/Channel.vue","../../../src/pages/hashtag.vue","../../../src/pages/playerIframe.vue","../../../src/pages/index.js","../../../src/routes.js","../../../src/main.js"],"sourcesContent":["const p = function polyfill() {\n const relList = document.createElement('link').relList;\n if (relList && relList.supports && relList.supports('modulepreload')) {\n return;\n }\n for (const link of document.querySelectorAll('link[rel=\"modulepreload\"]')) {\n processPreload(link);\n }\n new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type !== 'childList') {\n continue;\n }\n for (const node of mutation.addedNodes) {\n if (node.tagName === 'LINK' && node.rel === 'modulepreload')\n processPreload(node);\n }\n }\n }).observe(document, { childList: true, subtree: true });\n function getFetchOpts(script) {\n const fetchOpts = {};\n if (script.integrity)\n fetchOpts.integrity = script.integrity;\n if (script.referrerpolicy)\n fetchOpts.referrerPolicy = script.referrerpolicy;\n if (script.crossorigin === 'use-credentials')\n fetchOpts.credentials = 'include';\n else if (script.crossorigin === 'anonymous')\n fetchOpts.credentials = 'omit';\n else\n fetchOpts.credentials = 'same-origin';\n return fetchOpts;\n }\n function processPreload(link) {\n if (link.ep)\n // ep marker = processed\n return;\n link.ep = true;\n // prepopulate the load record\n const fetchOpts = getFetchOpts(link);\n fetch(link.href, fetchOpts);\n }\n};__VITE_IS_MODERN__&&p();","const scriptRel = 'modulepreload';const seen = {};const base = 'https://ue.17173cdn.com/a/gtv/index/v2-0-2/';export const __vitePreload = function preload(baseModule, deps) {\n // @ts-ignore\n if (!__VITE_IS_MODERN__ || !deps || deps.length === 0) {\n return baseModule();\n }\n return Promise.all(deps.map((dep) => {\n // @ts-ignore\n dep = `${base}${dep}`;\n // @ts-ignore\n if (dep in seen)\n return;\n // @ts-ignore\n seen[dep] = true;\n const isCss = dep.endsWith('.css');\n const cssSelector = isCss ? '[rel=\"stylesheet\"]' : '';\n // @ts-ignore check if the file is already preloaded by SSR markup\n if (document.querySelector(`link[href=\"${dep}\"]${cssSelector}`)) {\n return;\n }\n // @ts-ignore\n const link = document.createElement('link');\n // @ts-ignore\n link.rel = isCss ? 'stylesheet' : scriptRel;\n if (!isCss) {\n link.as = 'script';\n link.crossOrigin = '';\n }\n link.href = dep;\n // @ts-ignore\n document.head.appendChild(link);\n if (isCss) {\n return new Promise((res, rej) => {\n link.addEventListener('load', res);\n link.addEventListener('error', rej);\n });\n }\n })).then(() => baseModule());\n}","\n \n \n\n\n\n","import qs from 'qs'\n\nexport default class PageInfo {\n constructor(config) {\n // 页面标题\n this.title = config.title\n // 页面地址\n this.path = config.path\n\n this.name = config.name\n // // 页面组件实例\n // this.component = config.component\n // 父页面\n this.parent = config.parent\n this.needAuth = config.needAuth === true\n this.meta = config.meta\n }\n\n // 路由配置信息\n get routeInfo() {\n return { path: this.path }\n }\n\n // 返回指定参数后的完整跳转链接\n toLink(params, query) {\n let href = this.path\n href = href.replace(/\\?/g, '')\n if (params) {\n Object.keys(params).forEach((key) => {\n href = href.replace(`:${key}`, params[key])\n })\n }\n\n // 移除未传值的参数\n href = href.replace(/\\/:[a-z]*/g, '')\n if (query) {\n if (typeof query === 'string' && query.indexOf('#') > -1) {\n href += query\n } else {\n href += `?${qs.stringify(query)}`\n }\n }\n return href\n }\n\n // 跳转\n to(params) {\n const href = this.toLink(params)\n window.location.href = href\n }\n}\n","import PageInfo from './PageInfo'\n/*\n社区主页\nhttp://dev.club.17173.com/group/index\n圈子主页\nhttp://dev.club.17173.com/group/info\n圈子列表\nhttp://dev.club.17173.com/group/list\n\n贴子详情\nhttp://dev.club.17173.com/thread/info\n发布贴子\nhttp://dev.club.17173.com/thread/issue\n\n用户主页\nhttp://dev.club.17173.com/user/space\n*/\n\n/*\nexport的变量名称要与pages/index.js下保持一致.\n没有直接饮用pages/index.js是为了防止循环import\n */\n\nconst keywords =\n '搞视,囧图集,AI小姐姐,绅士社,造物煮,歪果人少系列,动物撕界,整活大师,变态任务'\nconst description =\n '欢迎来到搞视频道,这里放送各种来自国内外的欢乐、搞笑和猎奇的精彩趣味视频,为您提供一站式的解压放松体验!在这里,您将欣赏到最新AI技术创造处的AI小姐姐,涵盖海量沙雕时刻的囧图集,挑战人类极限的变态任务,聚集各种奇葩恶搞操作的整活大师,记录萌宠爆笑瞬间的动物撕届,汇聚老外硬核作死行为的歪果仁少系列。。。关注搞视,尽情畅享精彩视频,享受无限的轻松与快乐!'\n\nexport const home = new PageInfo({\n title: '搞视',\n path: '/',\n name: 'home',\n meta: {\n keywords,\n description,\n },\n})\nexport const channel = new PageInfo({\n title: '搞视',\n path: '/channel/:id',\n name: 'channel',\n meta: {\n keywords,\n description,\n },\n})\n\nexport const playerIframe = new PageInfo({\n title: '搞视',\n path: '/player_iframe/',\n name: 'playerIframe',\n meta: {\n keywords,\n description,\n },\n})\n\nexport const playerinline = new PageInfo({\n title: '搞视',\n path: '/playerinline/:id',\n name: 'playerinline',\n meta: {\n keywords,\n description,\n },\n})\n\nexport const hashtag = new PageInfo({\n title: '话题',\n path: '/hashtag',\n name: 'hashtag',\n meta: {\n keywords,\n description,\n },\n})\n\nexport const error = new PageInfo({\n title: '404',\n path: '/404',\n meta: {\n keywords,\n description,\n },\n})\n\n// export const sample = new PageInfo({\n// title: '功能示例',\n// path: '/sample/:id/:cc',\n// needAuth: true,\n// })\n","export default \"__VITE_ASSET__d14b9540__\"","export default \"__VITE_ASSET__8ed5fd50__\"","export default \"__VITE_ASSET__a9a69519__\"","export default \"__VITE_ASSET__53e87a11__\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkI4NTZBQ0UxQkM4RTExRURCMjhEQzlDNjUzNzNDQjUxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkI4NTZBQ0UyQkM4RTExRURCMjhEQzlDNjUzNzNDQjUxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6Qjg1NkFDREZCQzhFMTFFREIyOERDOUM2NTM3M0NCNTEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6Qjg1NkFDRTBCQzhFMTFFREIyOERDOUM2NTM3M0NCNTEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz40gp2/AAACP0lEQVR42qyWTUhUURTH37xiTEh3hVEowUBZ0qbQtatWRil9L1qFiyANmibaR42k4seyZTX5RR/QNluXQYGCCzEdFMFalVJZqf8jvyevx52XY3Pgx5u559z/8V3PPWcSucFXXoxVi0uiURwRe8QvMSdmxRsxID4VEtgZI3xfnBM7Ir4ycRhOirskuS3yUSHfIX5KjIuL4o8Y5C0OIl4halkbEr+JneAZ+wZtoovEz8QtMRWJWRGTkBMpkRXN4rGoEt2uNziPY01k2DDl/dsspoU9q6ITrb8S2Jk/FAlxR3R4xVsHexNoVYcT3BO7xfA2xcNJhtHKBglqxAXO9ob3/9aOllVgjY+4T0XMRYKtBL/x9Lbom6fyNrR9LpHZc4fITV73epG+QKvREtTx5Z0j8IFYFr1F+sZ41iXUKn5wgXaJn15pLInWih9ZLLlZgi983ldC3UDrs08PMTtWwgQneI5bgtd8Oe0ILKeMKx2+SnzlDl+gNerTaq2HnBUHIoFXaGhv6U0V0Mxajpiw7UfLNAcswQwXI0knDdsL8UEcEiPiK4yw9pGYsHVTlaY5E1SRdcIlMqdDwQuiges/Rt0v89nW6okJLI3GEpqb88Am0VXxhMb3XfSH+n8PxNk19q6hlY/Og6c0O2u3fXTF1BYqJkUf60cvjZZzovUwwB8xRJrYbNPtPY0s+EceF2c4kiTH0sopxA79l/SnLC33MhSyVf7ijGvoF/pVkWeAZ0I/W46KvfgXuaCjVMt0oezrAgwAexWOcBFHBpgAAAAASUVORK5CYII=\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACEAAAAhCAYAAABX5MJvAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA25pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDoyMTc2YTRkOC02NzdkLWJkNDItYjRhYy0wNWUxYmVlMTNjNTciIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OTZEN0IzNzlBNjgwMTFFQzkyRjc5RDVFRjAwRkIyMUMiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OTZEN0IzNzhBNjgwMTFFQzkyRjc5RDVFRjAwRkIyMUMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QkY5QUEwQ0FBNjdFMTFFQ0JBMTQ5MDEyNjA3RkIyQzQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QkY5QUEwQ0JBNjdFMTFFQ0JBMTQ5MDEyNjA3RkIyQzQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz496QsQAAAD7klEQVR42qyYeUhVURDG9bmVtmiLbZpBFEFEK23YYhqVWRRhGLT+oUWBf1RmUVFkC4ZBYVRUtmJGRVGSEUUhQgW22F4mEWlZFiYuSfnMvoHvxnS59y3qwA89x/Pemzdn5pu5+uZduO7TDhYAuoOxYBjoCerAF/AYvAS1Vi9MSoz38fdpH5sJ5oEhoBcIAb9APfgMHoGToNTqxW11Qj50D5gCwmzODAXTwSJwCuwGv/UBRxscmAVuMALaAYnAT9AImtR+FNgKzoEe7RGJueAoQ2/YW5APboNPIIiRmg1iQTi/9ALQESwEDa11IgEcUQ40cb0dVJvOSi7kgjFgH5jM/XiwA6xrzXVMZAT6cO0EG0CqhQPaHvKb31J7KSD6/MUCX2+ckLPzlQPNYC3Y7+Hrv/KDK7nuBFaC/t440QKK1Fq+fbaXkfwAToA/XI8CM7x1QpRtEBgMDrkp3d42fzvLChLrJ1fizolg4KfWcgVl4J0L5cwEJWS4xZlSiphYZxDhyolpFJedINRD6d7FRA1i9UTbRLRO5VmYXYlKCR1XSVgMLrtJ2gyQpvbegJs2Z0OVQ/UOGx04phwQHahyEwWR4nS1fgWW8uqsZDyYv9fI1fpbNKIcqpuRA+vBfRcO7DVFQDrmMgqVlaXwuoxquaMjIRl/WDngpAPZdMbKMnnGsBdguQsHpNUnAl+uH4iAOdQ9SUgHqAhsBAd4b2bzowNp6g0lAiuojlYWSWEz5L6S7b3KwTeMAzEqWQ5S61tsqiCDVWA48NoDB86ACWpP+k0xhpoWByci6Wzd+McyRsXHJgLbwCZTEi5hBVmZtPDTYKraO8Ny/tfKRzJjjSjku6gG6ZSbTUm4mMJkZSG8ghi1J/PEap1nEokRKhmlHAtt3lAisEWtn7lxQKwLGK/WuWxaDVbC0UElZKXFm4WbdOApy7DEjX5849WJw1lglZLs/yYrp+pqvsohbSKz5WCgKsMSD6TcSem/xmnbaTfolqtx3J96UWQ618iZchK4Cz66CH84Z4c6tV/tblAp5kxoOJFgc/Y9s9zOgQiQxw6bo6TZo2lJBtR76kriTNnsiUWw7OK5TnTxCGDpRCOVq1yNXVlKPd1ZJLM+xiRE1d44IdpQQZVsUWOXhHa0B4PvFTVFG2WYzi/nsROGSaO6pNZS3wXsH+NAIKsnkPIr88ZVk6OGDtR6c5f+picno83O4QeGc6BN5qNbA1UwyFTKzbzSVG8iYPcYKENGEjtkudqXJ6auoC9/agcqqKbJrXHA7gmskSonObGG4Y7ihwdQ2n9wIClmOT5py1O1q8fA52xYsRSpSDpSQwcKKVzf2/p/hb8CDAC9uO20ew7vbgAAAABJRU5ErkJggg==\"","export default \"__VITE_ASSET__5149d0b6__\"","export default \"__VITE_ASSET__daf70e48__\"","export default \"__VITE_ASSET__ef25f836__\"","export default \"__VITE_ASSET__46afcd83__\"","export default \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAMCAYAAAC9QufkAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTggKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjk4QUFGNzdCQzBCNDExRUVCMzUwQzU2QUYxREFENzIwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjk4QUFGNzdDQzBCNDExRUVCMzUwQzU2QUYxREFENzIwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6OThBQUY3NzlDMEI0MTFFRUIzNTBDNTZBRjFEQUQ3MjAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6OThBQUY3N0FDMEI0MTFFRUIzNTBDNTZBRjFEQUQ3MjAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7KJti0AAAAmElEQVR42mL8v4+BHMAJxN+ZyNBoBcS3gdiWhQyN24CYH4hjmMjUuBSIs0CamYE4BUoTqzEeiP+CNE8H4tlAPAeHAVg1giRAmhcD8VcgTsBiAE6NMM2HgdgTiwF4NYIAI1I82wLxdiDmBuItUD5OjeiaYQaAbOOB8nFqhDkbGYC84AXEX4B4GT6N2GyGAR0gvo5PIwgABBgANbYtm7IFd+AAAAAASUVORK5CYII=\"","export default \"__VITE_ASSET__fed1dbab__\"","export default \"__VITE_ASSET__248de873__\"","export default \"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAABZAAD/4QMvaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjYtYzE0MiA3OS4xNjA5MjQsIDIwMTcvMDcvMTMtMDE6MDY6MzkgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE4IChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpEMzY4NjZERkUxQjkxMUVEQUI5RkRGMkZGMTk2RDkwNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpEMzY4NjZFMEUxQjkxMUVEQUI5RkRGMkZGMTk2RDkwNiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkQzNjg2NkRERTFCOTExRURBQjlGREYyRkYxOTZEOTA2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkQzNjg2NkRFRTFCOTExRURBQjlGREYyRkYxOTZEOTA2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+/+4ADkFkb2JlAGTAAAAAAf/bAIQAAQEBAQEBAQEBAQIBAQEC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\"","export default \"__VITE_ASSET__0dd37de2__\"","/*\n * 引入assets下的静态资源\n * @param {name} 静态资源地址(assets下路径+文件名, 如: 'images/logo.png')\n * @example\n * getAssets('images/logo.png')\n */\nimport debounce from 'lodash.debounce'\n\nexport const getAssets = (name) => {\n const path = `../assets/${name}`\n const modules = import.meta.globEager('../assets/*/*')\n return modules[path].default\n}\n\nexport const getType = (o) => {\n const s = Object.prototype.toString.call(o)\n return s.match(/\\[object (.*?)\\]/)[1].toLowerCase()\n}\n\nexport const emptyFn = () => {}\n\nexport const durationFormat = (val) => {\n const h = Math.floor(val / 3600) > 0 ? Math.floor(val / 3600) : ''\n const m =\n Math.floor((val / 60) % 60) > 0\n ? `${Math.floor((val / 60) % 60)\n .toString()\n .padStart(2, '0')}:`\n : '00:'\n\n const s = Math.floor(val % 60)\n .toString()\n .padStart(2, '0')\n\n return h + m + s\n}\n\nexport const dateFormatNormal = (val, isYearOnly = false) => {\n const date = new Date(val.length > 10 ? val : val * 1000)\n const y = date.getFullYear()\n const m =\n date.getMonth() + 1 < 10 ? `0${date.getMonth() + 1}` : date.getMonth() + 1\n const d = date.getDate() < 10 ? `0${date.getDate()}` : date.getDate()\n const hh = date.getHours() < 10 ? `0${date.getHours()}` : date.getHours()\n const mm =\n date.getMinutes() < 10 ? `0${date.getMinutes()}` : date.getMinutes()\n\n return isYearOnly ? `${y}-${m}-${d}` : `${y}-${m}-${d} ${hh}:${mm}`\n}\n\nexport const dateFormat = (val) => {\n const time = val.length > 10 ? val : val * 1000\n\n const diff = new Date().getTime() - time\n let text = ''\n\n if (diff < 0) {\n return dateFormatNormal(time)\n }\n\n const m = 60 * 1000\n const h = m * 60\n const d = h * 24\n\n const diffM = Math.floor(diff / m)\n const diffH = Math.floor(diff / h)\n const diffD = Math.floor(diff / d)\n\n if (diffD >= 7) {\n text = '7天前'\n } else if (diffH >= 24) {\n text = `${diffD}天前`\n } else if (diffH >= 1) {\n text = `${diffH}小时前`\n } else if (diffM > 5) {\n text = `${diffM}分钟前`\n } else {\n text = '刚刚'\n }\n\n return `${text}`\n}\n\nexport const numberFormat = (val) => {\n if (val >= 10000) {\n return `${Math.round(val / 1000) / 10}万`\n }\n\n return val\n}\n\nexport const sticky = (parent, el, time = 200) => {\n window.addEventListener(\n 'scroll',\n debounce(() => {\n const top = document.documentElement.scrollTop || document.body.scrollTop\n\n const $parent = document.querySelector(parent)\n const $el = document.querySelector(el)\n if (top >= $parent.offsetTop) {\n if (!$el.classList.contains('fixed')) {\n $el.style.width = `${$parent.clientWidth}px`\n $el.classList.add('fixed')\n $el.style.top = document.querySelector('body').style.paddingTop || 0\n }\n } else if ($el.classList.contains('fixed')) {\n $el.classList.remove('fixed')\n $el.style.top = 'auto'\n }\n }, time)\n )\n}\n\nexport const emoList = [\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/01.png',\n title: 'GD01',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/02.png',\n title: 'GD02',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/03.png',\n title: 'GD03',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/04.png',\n title: 'GD04',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/05.png',\n title: 'GD05',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/06.png',\n title: 'GD06',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/07.png',\n title: 'GD07',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/08.png',\n title: 'GD08',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/09.png',\n title: 'GD09',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/10.png',\n title: 'GD10',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/11.png',\n title: 'GD11',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/12.png',\n title: 'GD12',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/13.png',\n title: 'GD13',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/14.png',\n title: 'GD14',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/15.png',\n title: 'GD15',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/51.png',\n title: 'GD51',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/52.png',\n title: 'GD52',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/90.png',\n title: 'GD90',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/91.png',\n title: 'GD91',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/92.png',\n title: 'GD92',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/93.png',\n title: 'GD93',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/94.png',\n title: 'GD94',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/95.png',\n title: 'GD95',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/96.png',\n title: 'GD96',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/97.png',\n title: 'GD97',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/98.png',\n title: 'GD98',\n },\n {\n url: 'https://ue.17173cdn.com/a/lib/v4/1.3.24/comment/assets/img/attitude/99.png',\n title: 'GD99',\n },\n]\n\nfunction findEmoByCode(t) {\n return emoList.find((it) => it.title === t)\n}\nexport const formatParagraph = (t) => {\n return t.replace(/\\[(GD[0-9]{2})\\]/g, (_, code) => {\n const found = findEmoByCode(code)\n return found ? `` : ''\n })\n}\n\n// 获取 location.search 中的参数\nexport const getLocationQuery = (name) => {\n const reg = new RegExp(`(^|&)${name}=([^&]*)(&|$)`, 'i')\n const r = window.location.search.slice(1).match(reg)\n if (r != null) {\n return decodeURIComponent(r[2])\n }\n return ''\n}\n","import axios from 'axios'\nimport qs from 'qs'\nimport md5 from 'md5'\n\nconst getToken = (url) => {\n const appkey = '50d85cf01cf70d6ec430105437d28568'\n const uri = url.replace('https', 'http')\n const timestamp = Math.floor(Date.now() / 1000)\n const accessToken = md5(appkey + uri + timestamp)\n return { timestamp, access_token: accessToken }\n}\n\nlet gtvBaseUrl = import.meta.env.VITE_GTV_API_HOST\nlet clubBaseUrl = import.meta.env.VITE_CLUB_API_HOST\n\n// 兼容内网地址\nif (gtvBaseUrl.indexOf('internal') !== -1) {\n gtvBaseUrl = 'https://club.internal.17173.com/'\n}\nif (clubBaseUrl.indexOf('internal') !== -1) {\n clubBaseUrl = 'https://club.internal.17173.com/'\n}\n\nexport const instance = axios.create({\n // baseURL: '/api',\n baseURL: gtvBaseUrl,\n timeout: 60000,\n paramsSerializer(params) {\n return qs.stringify(params)\n },\n data: {\n a: 1,\n },\n})\nexport const instance2 = axios.create({\n // baseURL: '/api',\n baseURL: clubBaseUrl,\n timeout: 60000,\n paramsSerializer(params) {\n return qs.stringify(params)\n },\n data: {\n a: 1,\n },\n})\nfunction instanceInit(myInstance) {\n myInstance.interceptors.request.use(\n (config) => {\n const isProd = import.meta.env.MODE === 'prod'\n const tokens = isProd\n ? getToken(`https://gtv.17173.com/api/gtv/v1${config.url}`)\n : getToken(config.baseURL + config.url)\n const cfg = {\n ...config,\n\n params: { ...config.params, platform: 'web', ...tokens },\n }\n\n return { ...cfg, withCredentials: true }\n },\n (error) => {\n console.error(error)\n return null\n }\n )\n myInstance.interceptors.response.use(\n (response) => response,\n (error) => {\n console.error(error)\n return null\n }\n )\n}\n\ninstanceInit(instance)\ninstanceInit(instance2)\n","class APIResponse {\n constructor(axiosResPromise, config) {\n this.config = config\n this.axiosResPromise = axiosResPromise\n this.res = null\n }\n\n async check() {\n const res = await this.getRes()\n return {\n success: res?.status === 200 && res.data?.code === 200,\n status: res?.status,\n code: res?.data && res.data.code,\n data: res?.data && res.data.data,\n msg: res?.data && res.data.messages ? res.data.messages[0] : '',\n }\n }\n\n async getRes() {\n this.res = this.res || (await this.axiosResPromise)\n return this.res\n }\n\n async data() {\n const res = await this.getRes()\n let data = null\n if (\n res !== null &&\n res.status === 200 &&\n res.data.code === 200 &&\n res.data.data\n ) {\n data = res.data.data\n }\n return data\n }\n}\n\nexport default APIResponse\n","import { instance, instance2 } from './instance'\nimport APIResponse from './APIResponse'\n\n// gtv 接口\nexport const gtvAPI = {\n getList(params) {\n const axiosRes = instance.get('/thread/list', { params })\n return new APIResponse(axiosRes)\n },\n /**\n * 新广告接口\n * @param {u} params\n * @returns\n */\n getAdList(params) {\n const axiosRes = instance.get('/app/ad', { params })\n return new APIResponse(axiosRes)\n },\n getSubList() {\n const axiosRes = instance.get('/thread/sub')\n return new APIResponse(axiosRes)\n },\n queryHashtagList(params) {\n const axiosRes = instance.get('/thread/search', { params })\n return new APIResponse(axiosRes)\n },\n // 评论列表\n getCommentList(params) {\n const axiosRes = instance.get('/thread/post-list', { params })\n return new APIResponse(axiosRes)\n },\n // 评论的回复列表\n getReplyList(params) {\n const axiosRes = instance.get('/thread/reply-list', { params })\n return new APIResponse(axiosRes)\n },\n // 发表回帖/回复\n postComment(params) {\n const data = new FormData()\n data.append('tid', params.tid)\n data.append('message', params.message)\n if (params.pid) data.append('pid', params.pid)\n if (params.aid) data.append('attachQuote', params.aid)\n const axiosRes = instance.post('/thread/reply', data)\n return new APIResponse(axiosRes)\n },\n // 播放页请求一次给七条\n getRvList(params) {\n const axiosRes = instance.get('/thread/rv', { params })\n return new APIResponse(axiosRes)\n },\n getCollection(params) {\n const axiosRes = instance.get('/thread/collection', { params })\n return new APIResponse(axiosRes)\n },\n}\n\n// 统计\nexport const statisticsAPI = {\n // sendPV(params) {\n // const axiosRes = instance.get('/vs/pv', { params })\n // return new APIResponse(axiosRes)\n // },\n /**\n * 旧版统计接口\n * @param {*} params\n * @deprecated\n * @returns\n */\n sendPS(params) {\n const axiosRes = instance.get('/vs/ps', { params })\n return new APIResponse(axiosRes)\n },\n\n /**\n * 通用上报数据\n * @param {Object} params\n * - tid 必填 贴子id\n * - guid 非必填 游客ID(浏览器生唯一ID)\n * - rt 上报类型 视频播放:video_stay 广告视频关闭按钮点击:ad_close 广告视频链接点击:ad_click\n * - rv 上报数据\n * video_stay 类型有效值 3 or 70%\n * ad_close 不填\n * ad_click 不填\n * @returns\n */\n reportStats(params) {\n const axiosRes = instance.get('/vs/report', { params })\n return new APIResponse(axiosRes)\n },\n}\n\n// 帖子相关接口\nexport const threadAPI = {\n submitSupportThread(id) {\n const axiosRes = instance2.get('/thread/support', { params: { tid: id } })\n return new APIResponse(axiosRes)\n },\n\n getUserReplyList(params) {\n const axiosRes = instance.get('/home/post', { params })\n return new APIResponse(axiosRes)\n },\n\n getThreadInfo(params) {\n const axiosRes = instance.get('/thread/info', { params })\n return new APIResponse(axiosRes)\n },\n\n getCollectionInfo(params) {\n const axiosRes = instance.get('/thread/collection-info', { params })\n return new APIResponse(axiosRes)\n },\n\n // 发帖&编辑帖子\n postThread(params) {\n const data = new FormData()\n data.append('gid', params.gid)\n data.append('subId', params.sid)\n data.append('subject', params.title)\n data.append('message', params.content)\n if (params.id) data.append('tid', params.id)\n const axiosRes = instance.post('/thread/issue', data)\n return new APIResponse(axiosRes)\n },\n supportComment(id) {\n const axiosRes = instance2.get('/thread/post-support', {\n params: { pid: id },\n })\n return new APIResponse(axiosRes)\n },\n}\n\n// 使用club接口,编辑器相关\nexport const editorAPI = {\n getLinkInfo(href) {\n const axiosRes = instance2.get('/app/get-title-by-url', {\n params: { url: href },\n })\n return new APIResponse(axiosRes)\n },\n get17173VideoInfo(href) {\n const axiosRes = instance2.get('/app/get-video-info-by-url', {\n params: { vurl: href },\n })\n return new APIResponse(axiosRes)\n },\n async upLoadImage(file, name) {\n const data = new FormData()\n data.append('pic[0]', file, name)\n\n const axiosRes = instance2.post('/upload/image', data, {\n headers: { 'Content-Type': 'multipart/form-data' },\n })\n return new APIResponse(axiosRes)\n },\n getQiniuToken() {\n const axiosRes = instance2.get('/upload/get-video-token')\n return new APIResponse(axiosRes)\n },\n qiniuUploadReceipt(params) {\n const axiosRes = instance2.get('/upload/confirm-video-info', {\n params,\n })\n return new APIResponse(axiosRes)\n },\n}\n\n// 使用club接口,登录、登出、用户状态、关注/取关\nexport const userAPI = {\n login() {\n const axiosRes = instance2.get('/my/login')\n return new APIResponse(axiosRes)\n },\n logout() {\n const axiosRes = instance2.get('/my/logout')\n return new APIResponse(axiosRes)\n },\n getAccountStatus() {\n const axiosRes = instance2.get('/my/get-status')\n return new APIResponse(axiosRes)\n },\n submitFollowUser(id) {\n const axiosRes = instance2.get('/follow/user', { params: { uid: id } })\n return new APIResponse(axiosRes)\n },\n cancelFollowUser(id) {\n const axiosRes = instance2.get('/follow/user-cancel', {\n params: { uid: id },\n })\n return new APIResponse(axiosRes)\n },\n getMyInfo() {\n const axiosRes = instance.get('/my/info')\n return new APIResponse(axiosRes)\n },\n getMyThreadList(params) {\n const axiosRes = instance.get('/my/thread', {\n params,\n })\n return new APIResponse(axiosRes)\n },\n getUserInfo(id) {\n const axiosRes = instance.get('/home/info', {\n params: { uuid: id },\n })\n return new APIResponse(axiosRes)\n },\n getUserThreadList(params) {\n const axiosRes = instance.get('/home/thread', {\n params,\n })\n return new APIResponse(axiosRes)\n },\n}\n","const storeCache = {}\n\n// debug\nwindow.storeCache = storeCache\n\n/*\n * 定义一个store函数,如果调用该函数时传入id字符串,则会以该id缓存store, 下次执行该函数会返回上一次缓存的结果.\n */\nfunction defineStore(creater) {\n return (config) => {\n let storeInstance\n if (config !== undefined && config.id !== undefined) {\n if (!storeCache[config.id]) {\n storeCache[config.id] = creater(config)\n }\n storeInstance = storeCache[config.id]\n } else {\n storeInstance = creater(config)\n }\n return storeInstance\n }\n}\nexport { defineStore }\n","import { isArray } from '@vue/shared'\nimport { defineStore } from './defineStore'\n/*\n *定义列表store\n * @param {config.pageSize} 分页大小\n * @param {config.getMethod} /src/api/index.js 下定义的接口方法, 如: threadAPI.plazaList\n */\nexport default function defineListStore(config) {\n return defineStore(() => {\n const items = ref([])\n\n const pageIndex = ref(0)\n\n const pageSize = ref(config.pageSize || 10)\n const empty = ref(false)\n const loading = ref(false)\n const finished = ref(false)\n const totalCount = ref(-1)\n const isLoaded = ref(false)\n\n async function load(params, option = {}) {\n const targetOption = {\n ...option,\n ...{\n limitTime: 1000,\n },\n }\n\n // 如果已经加载完毕,则不再加载\n // if (\n // totalCount.value > 0 &&\n // totalCount.value <= pageSize.value * pageIndex.value\n // )\n // return\n if (finished.value) return\n if (loading.value) return\n\n loading.value = true\n pageIndex.value += 1 // 因为服务端接口页数是从 1开始的,所以这里即使首次加载也+1\n\n const beginTime = Date.now() * 1\n const data = await config\n .getMethod({\n pageSize: pageSize.value,\n page: pageIndex.value,\n ...params,\n })\n .data()\n\n if (data !== null) {\n if (isArray(data)) {\n const dataSet =\n typeof config.dataParser === 'function'\n ? config.dataParser(data || [])\n : data || []\n pageIndex.value = 1\n totalCount.value = dataSet.length\n items.value = dataSet\n empty.value = !items.value.length\n finished.value = true\n isLoaded.value = true\n } else {\n if (!data.dataSet) {\n finished.value = true\n isLoaded.value = true\n return\n }\n const dataSet =\n typeof config.dataParser === 'function'\n ? config.dataParser(data.dataSet || [])\n : data.dataSet || []\n pageIndex.value = data.page\n totalCount.value = data.totalCount\n items.value = [...items.value, ...dataSet]\n empty.value = !items.value.length\n // totalCount 数据不准,无法用做判断\n // finished.value = items.value.length >= totalCount.value\n isLoaded.value = true\n }\n }\n const duration = Date.now() * 1 - beginTime\n const delay =\n duration > targetOption.limitTime\n ? 0\n : targetOption.limitTime - duration\n\n if (delay > 0) {\n setTimeout(() => {\n loading.value = false\n }, delay)\n } else {\n loading.value = false\n }\n }\n\n function reset() {\n pageIndex.value = 0\n items.value = []\n loading.value = false\n finished.value = false\n empty.value = false\n totalCount.value = -1\n isLoaded.value = false\n }\n\n function resume(_items, index, size) {\n pageIndex.value = index\n pageSize.value = size\n items.value = [..._items]\n totalCount.value = items.length\n empty.value = !items.length\n finished.value = false\n isLoaded.value = true\n }\n\n return {\n items,\n pageIndex,\n pageSize,\n totalCount,\n states: reactive({\n loading,\n finished,\n empty,\n isLoaded,\n }),\n actions: {\n load,\n reset,\n resume,\n },\n }\n })\n}\n","import { useCookies } from '@vueuse/integrations/useCookies'\nimport { defineStore } from './defineStore'\n/*\n *定义列表store\n * @param {config.getMethod} /src/api/index.js 下定义的接口方法, 如: threadAPI.plazaList\n */\nexport default function defineRvListStore(config) {\n return defineStore(() => {\n const items = ref([])\n const empty = ref(false)\n const loading = ref(false)\n const finished = ref(false)\n const isLoaded = ref(false)\n const cookies = useCookies(['gsuuid'])\n async function load(params, option = {}) {\n const targetOption = {\n ...option,\n ...{\n limitTime: 1000,\n },\n }\n\n // 如果已经加载完毕,则不再加载\n // return\n if (finished.value) return\n if (loading.value) return\n\n loading.value = true\n\n const beginTime = Date.now() * 1\n // 如果没有guid生成guid,存进localstorage\n const uuid = () => {\n const s = []\n const hexDigits = '0123456789abcdef'\n for (let i = 0; i < 36; i++) {\n s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1)\n }\n s[14] = '4' // bits 12-15 of the time_hi_and_version field to 0010\n s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1) // bits 6-7 of the clock_seq_hi_and_reserved to 01\n s[8] = s[13] = s[18] = s[23] = '-'\n\n const uuid = s.join('')\n return uuid\n }\n let getUuid = localStorage.getItem('gsuuid')\n if (Passport.isLoggedIn()) {\n getUuid = Passport.data('uid')\n } else if (!getUuid) {\n getUuid = uuid()\n }\n localStorage.setItem('gsuuid', getUuid)\n cookies.set('gsuuid', getUuid)\n // if ((getUuid && getUuid.length === 9) || !getUuid) {\n // getUuid = uuid()\n // localStorage.setItem('gsuuid', getUuid)\n // cookies.set('gsuuid', getUuid)\n // }\n\n const data = await config\n .getMethod({\n guid: getUuid,\n ...params,\n })\n .data()\n\n if (!data) {\n finished.value = true\n isLoaded.value = true\n return\n }\n const value =\n typeof config.dataParser === 'function'\n ? config.dataParser(data || [])\n : data || []\n items.value = [...items.value, ...value]\n empty.value = !items.value.length\n isLoaded.value = true\n\n const duration = Date.now() * 1 - beginTime\n const delay =\n duration > targetOption.limitTime\n ? 0\n : targetOption.limitTime - duration\n\n if (delay > 0) {\n setTimeout(() => {\n loading.value = false\n }, delay)\n } else {\n loading.value = false\n }\n }\n\n function reset() {\n items.value = []\n loading.value = false\n finished.value = false\n empty.value = false\n isLoaded.value = false\n }\n\n function resume(_items) {\n items.value = [_items]\n empty.value = !items.length\n finished.value = false\n isLoaded.value = true\n }\n\n return {\n items,\n states: reactive({\n loading,\n finished,\n empty,\n isLoaded,\n }),\n actions: {\n load,\n reset,\n resume,\n },\n }\n })\n}\n","export function gString(value) {\n return value ? value.toString() : ''\n}\n\nexport function gNum(value) {\n return value || 0\n}\n\n// 服务端接口 1= true, 0=false\nexport function gBool(value) {\n if (typeof value === 'boolean') {\n return value\n }\n if (value * 1 === 1) {\n return true\n }\n return false\n}\n\nexport function gList(value) {\n return value || []\n}\n","import * as d from '@/core/dataGenerator'\n\nexport default class RichContentModel {\n static fromJson(data) {\n const model = new RichContentModel()\n model.type = d.gString(data.type)\n model.value = model.isImage\n ? `${data.value}!a-3-640x${data.value.substr(\n data.value.lastIndexOf('.')\n )}`\n : data.value\n\n if (data.childs) model.childs = data.childs\n\n model.attr = data.attr ? JSON.parse(data.attr) : {}\n\n if (model.attr.needComment === 'true') {\n model.needCommentClass =\n model.value.length > 0\n ? 'show-need-comment-con'\n : 'hide-need-comment-con'\n }\n\n if (data.aid) {\n model.aid = d.gString(data.aid)\n }\n return model\n }\n\n get isImage() {\n return this.type === 'image'\n }\n\n get isText() {\n return this.type === 'text'\n }\n\n get isLink() {\n return this.type === 'link'\n }\n\n get isVideo() {\n return this.type === 'video'\n }\n\n get isIframe() {\n return this.type === 'iframe'\n }\n\n get isBlockText() {\n return this.attr.h || this.value === '\\n'\n }\n}\n","import * as d from '@/core/dataGenerator'\nimport RichContentModel from './richContent'\n\nexport default class ThreadModel {\n static fromJson(data) {\n const model = new ThreadModel()\n // 如果是回帖&回复则id取的是pid, 如果是帖子则取得是tid\n model.id = d.gString(data.pid || data.tid)\n\n // 圈子id\n model.gid = d.gString(data.gid)\n\n // 子板块id\n model.subId = d.gString(data.subId)\n\n // 标题\n model.title = d.gString(data.subject)\n\n // 作者昵称\n model.author = d.gString(data.author)\n\n // 用户认证组名称\n model.authorTitle = d.gString(data.authorTitle)\n\n // 作者uid\n model.authorUid = d.gString(data.authorid)\n\n // 内容\n model.content = JSON.parse(d.gString(data.message))\n\n // 点赞数\n model.supports = d.gNum(data.support)\n\n // 当前用户是否已点赞\n model.hasSupported = d.gBool(data.supportState)\n\n // 回复数量(如果是帖子,则是所有评论)\n model.replies = d.gNum(data.replies)\n\n // 浏览数量\n model.views = d.gNum(data.views)\n\n // 回复的帖子用户uid\n model.puid = d.gString(data.puid)\n\n // 回复的帖子用户昵称\n model.pname = d.gString(data.pname)\n\n // 创建时间\n model.createDate = d.gNum(data.threadDate || data.postDate)\n // model.updateDate = d.gNum(data.threadEditDate || data.postEditDate)\n\n // 关联游戏\n model.newGameCode = d.gString(data.newGameCode)\n model.gameName = d.gString(data.gameName)\n model.gameCode = d.gString(data.gameCode)\n\n // 圈子名称\n model.groupName = d.gString(data.groupName)\n\n // 精华帖\n model.digest = d.gBool(data.digest)\n\n // 回复关联的回复id(对回复的回复)\n model.rpid = d.gString(data.rpid)\n\n // 回复关联的回帖id(对回帖的回复)\n model.ppid = d.gString(data.ppid)\n\n // 回帖/回复关联的帖子id\n model.tid = d.gString(data.tid)\n\n // 是否隐藏\n model.isHide = d.gNum(data.displayState) === 3\n\n // 是否广告\n // \n const subId = window.location.host.indexOf('test') > -1 ? '73' : '57'\n model.isAd = model.subId === subId\n\n // 发布平台platform(1: app 2: web)\n model.platform = d.gNum(data.platform || 0)\n\n // 回复列表\n model.replys = []\n if (data.reply) {\n data.reply.forEach((t) => {\n model.replys.push(ThreadModel.fromJson(t))\n })\n }\n\n // 【回帖】数,含子评论\n model.posts = d.gNum(data.totalPostTotal)\n\n // 回帖列表新增字段\n // 主贴的字段\n model.orginThreadTitle = d.gString(data.threadSubject)\n model.orginThreadContent = d.gString(data.threadMessage)\n // 回帖的评论的字段\n model.orginReplyAuthor = d.gString(data.atAuthor)\n model.orginReplyAuthorUid = d.gString(data.atAuthorid)\n model.orginReplyContent = d.gString(data.postMessage)\n model.orginExist = model.orginThreadContent || model.orginReplyContent\n\n // 表情引用\n model.attachQuote = data.attachQuote ? data.attachQuote : null\n\n // 内容:文本\n // model.text = model.getText\n\n // 内容:图片\n // model.images = model.getImages\n\n // 内容:视频\n // model.videos = model.getVideos\n\n // ui state\n // 列表里面删帖\n model.$visible = true\n\n model.hashtags = data.searchKeywords || []\n\n model.collection = Array.isArray(data.collection)\n ? data.collection[0]\n : data.collection\n\n model.collectionCount = data.collectionCount\n return model\n }\n\n // 内容:文本\n get text() {\n return this.richContents.filter((t) => t.isText)\n }\n\n // 内容:图片\n get images() {\n return this.richContents.filter((t) => t.isImage)\n }\n\n // 内容:视频\n get videos() {\n return this.richContents.filter((t) => t.isVideo)\n }\n\n // 内容:视频\n get iframe() {\n return this.richContents.filter((t) => t.isIframe)\n }\n\n // 内容:鏈接\n get link() {\n return this.richContents.filter((t) => t.isLink)\n }\n\n // content转成RichContentModel列表\n get richContents() {\n const list = []\n // const c = JSON.parse(\n // '[{\"type\":\"video\",\"value\":\"40026153\",\"attr\":\"{\\\\\"videoid\\\\\":\\\\\"40026153\\\\\"}\",\"aid\":\"0\"},{\"type\":\"text\",\"value\":\"了个文件管理\\\\n\",\"attr\":\"{}\"},{\"type\":\"image\",\"value\":\"https://i.17173cdn.com/2fhnvk/YWxqaGBf/cms3/xydDJRbpqqxtDrt.jpg!a-3-480x.jpg\",\"attr\":\"{\\\\\"height\\\\\":\\\\\"300\\\\\",\\\\\"width\\\\\":\\\\\"400\\\\\"}\",\"aid\":0},{\"type\":\"text\",\"value\":\"\\\\n\",\"attr\":\"{}\"},{\"type\":\"link\",\"value\":\"https://www.17173.com\",\"attr\":\"{\\\\\"title\\\\\":\\\\\"17173网络游戏门户站\\\\\"}\"},{\"type\":\"text\",\"value\":\"\\\\n\",\"attr\":\"{}\"},{\"type\":\"iframe\",\"value\":\"https://player.bilibili.com/player.html?aid=717833773&bvid=BV12Q4y1C7wh&cid=402195847&page=1\",\"attr\":\"{}\"},{\"type\":\"text\",\"value\":\"\\\\n\",\"attr\":\"{}\"}]'\n // )\n // this.content = [\n // { type: 'text', value: '11111', attr: '{}', aid: 0 },\n // { type: 'text', value: '2222', attr: '{\"bold\":true}', aid: 0 },\n // { type: 'text', value: '3333\\n', attr: '{}', aid: 0 },\n // { type: 'text', value: '4444', attr: '{\"h\":2}', aid: 0 },\n // { type: 'text', value: '\\n5555\\n6666\\n', attr: '{}', aid: 0 },\n // ]\n let textPara = []\n // 拆分换行\n const splitContents = []\n this.content.forEach((t) => {\n if (t.type === 'text') {\n const values = t.value.split(/(\\n)/g).filter((value) => value !== '')\n values.forEach((value) => {\n splitContents.push({ ...t, value })\n })\n } else {\n splitContents.push(t)\n }\n })\n for (let i = 0; i < splitContents.length; i += 1) {\n const t = splitContents[i]\n const richModel = RichContentModel.fromJson(t)\n if (richModel.type === 'text' && !richModel.isBlockText) {\n textPara.push(richModel)\n }\n // 最后一行,或者当前行不是文本,并且已经有暂存的文本组,则将文本组加入内容列表\n if (\n textPara.length &&\n (richModel.type !== 'text' ||\n i === splitContents.length - 1 ||\n richModel.isBlockText)\n ) {\n let text = ''\n textPara.forEach((tt) => {\n text += tt.value\n })\n const textParaContent = RichContentModel.fromJson({\n type: 'text',\n value: text,\n childs: [...textPara],\n })\n textPara = []\n list.push(textParaContent)\n // console.log(textParaContent, 1)\n }\n\n if (\n (richModel.type !== 'text' || richModel.isBlockText) &&\n (typeof richModel.value !== 'string' ||\n richModel.attr.needComment ||\n richModel.value)\n ) {\n list.push(richModel)\n }\n }\n // console.log(list, 11)\n return list\n }\n}\n","import { threadAPI, gtvAPI } from '@/api'\nimport defineListStore from './defineListStore'\nimport defineRvListStore from './defineRvListStore'\n\nimport defineDetailStore from './defineDetailStore'\nimport ThreadModel from '@/models/thread'\nimport { defineStore } from './defineStore'\n\nexport const filterInvalidateVideo = (item) => !!item.videos?.[0]?.value?.url\n\nexport const threadInfoStore = defineDetailStore({\n getMethod: threadAPI.getThreadInfo,\n dataParser: (data) => {\n const json = { ...data.threadInfo, ...data.groupInfo }\n const threadModel = ThreadModel.fromJson(json)\n return threadModel\n },\n})\n\n// 推荐列表\nexport const threadListStore = defineListStore({\n getMethod: gtvAPI.getList,\n dataParser: (items) => {\n return (\n items\n .map((item) => {\n const threadModel = ThreadModel.fromJson(item)\n try {\n return threadModel\n } catch (e) {\n console.error(e)\n }\n return item\n })\n // 过滤掉没有视频的帖子\n .filter(filterInvalidateVideo)\n )\n },\n})\n\nexport const hashtagListStore = defineListStore({\n getMethod: gtvAPI.queryHashtagList,\n dataParser: (items) => {\n return (\n items\n .map((item) => {\n const threadModel = ThreadModel.fromJson(item)\n try {\n return threadModel\n } catch (e) {\n console.error(e)\n }\n return item\n })\n // 过滤掉没有视频的帖子\n .filter(filterInvalidateVideo)\n )\n },\n})\n\n// 推荐7条列表\n// const quchong = []\n\nexport const threadRvStore = defineRvListStore({\n getMethod: gtvAPI.getRvList,\n dataParser: (items) => {\n // items = items.filter((v) => !quchong.find((vv) => vv === v.tid))\n // quchong.push(...items)\n return (\n items\n .map((item) => {\n const threadModel = ThreadModel.fromJson(item)\n try {\n return threadModel\n } catch (e) {\n console.error(e)\n }\n return item\n })\n // 过滤掉没有视频的帖子\n .filter(filterInvalidateVideo)\n )\n },\n})\n\nexport const channelStore = defineStore(() => {\n const loading = ref(false)\n const items = ref([])\n\n async function init() {\n items.value = await gtvAPI.getSubList().data()\n\n loading.value = false\n }\n\n return {\n loading,\n items,\n init,\n }\n})({ id: 'channel' })\n\n/**\n * 获取推荐广告列表\n */\nexport const recommendListStore = defineStore(() => {\n const loading = ref(false)\n const loaded = ref(false)\n const items = ref([])\n async function loadAd() {\n // \n const data = await gtvAPI\n .getAdList({\n subId: window.location.host.indexOf('test') > -1 ? 73 : 57,\n })\n .data()\n if (data) {\n return data.map((g) => {\n const m = ThreadModel.fromJson(g)\n m.isAd = true\n return m\n })\n }\n return []\n }\n\n async function getAd() {\n if (!items.value.length) {\n items.value = await loadAd()\n }\n console.log('getAd items:', [...items.value])\n return items.value.splice(0, 1)[0]\n }\n\n return {\n loading,\n loaded,\n getAd,\n items,\n }\n})({ id: 'recommendList' })\n\n/**\n * @typedef {'click'|'touch'|'auto'|''|'scroll'|'keypress'} ISwitchPlayMode\n * @description\n * 1. click: 点击模式\n * 2. touch: 触摸模式\n * 3. auto: 自动模式\n * 4. scroll: 滚动模式\n * 5. keypress: 键盘模式\n */\n\n/**\n * 播放器store\n */\nexport const playerStore = defineStore(() => {\n /**\n * 是否外部列表点进来的\n */\n const fromOutside = ref(true)\n\n /**\n * 播放切换模式\n * @type {Ref}\n */\n const switchPlayMode = ref('')\n /**\n * 存储当前播放的帖子id,用于如有切换频道,当关闭播放器时,恢复当前帖子\n */\n const threadInfo = ref(null)\n\n const hashtagInfo = ref(null)\n\n function setFromOutside(v) {\n fromOutside.value = v\n }\n\n function setThreadInfo(v) {\n threadInfo.value = v\n }\n\n function setHashtagInfo(v) {\n hashtagInfo.value = v\n }\n\n /**\n * 设置播放切换模式\n * @param {ISwitchPlayMode} v\n */\n function setSwitchPlayMode(v) {\n switchPlayMode.value = v\n // 有进入播放时,就认为不是外部进入\n console.log('setSwitchPlayMode', v, !!v)\n fromOutside.value = !v\n }\n\n return {\n fromOutside,\n threadInfo,\n hashtagInfo,\n setHashtagInfo,\n switchPlayMode,\n setFromOutside,\n setThreadInfo,\n setSwitchPlayMode,\n }\n})({ id: 'player' })\n","import { createVNode, render } from 'vue'\nimport ToastTemplate from './ToastTemplate.vue'\n\nconst defaultOption = {\n duration: 3000,\n parent: document.querySelector('body'),\n}\n\nexport function toast(msg, option) {\n const container = document.createElement('div')\n const opt = { ...defaultOption, ...option, msg }\n const vm = createVNode(ToastTemplate, opt)\n render(vm, container)\n opt.parent.appendChild(container)\n // document.body.appendChild(container)\n // 销毁弹窗, 如果duration设置为0,需要调用者手动销毁\n const dispose = () => {\n if (vm.el.querySelector('.toast-msg')) {\n // 淡入淡出效果\n vm.el.querySelector('.toast-msg').classList.add('reomve') // 销毁时添加淡入淡出效果\n const t = setTimeout(() => {\n render(null, container)\n clearTimeout(t)\n opt.parent.removeChild(container)\n }, 400)\n }\n }\n if (opt.duration) {\n const timer = setTimeout(() => {\n dispose()\n clearTimeout(timer)\n }, opt.duration)\n }\n return {\n dispose,\n }\n}\n","import md5 from 'md5'\nimport { toast } from '@/components/toast'\nimport { userAPI } from '@/api/index'\n\n// 当前用户uid\nexport const getUid = () => {\n return Passport.data('uid')\n}\n\nexport const getUname = () => {\n return Passport.data('nickname')\n}\n\nexport const getName = () => {\n return Passport.data('username')\n}\n\nexport const isBindPhone = async () => {\n return new Promise((resolve) => {\n Passport.getMobileStatus((o) => {\n resolve(o)\n })\n })\n}\n\nexport const isSockpuppet = async () => {\n const data = await userAPI.getAccountStatus().data()\n return data.identity ? data.identity === 2 : false\n}\n\n// 通过Uid获取用户头像, 不传uid则返回当前用户头像\nexport const getAvatar = (uid) => {\n const userId = (uid || getUid()).toString()\n let avator = 'https://ue.17173cdn.com/a/hao/app/images/avatar.png'\n if (userId) {\n const md5Str = md5(userId)\n avator = `https://i.17173cdn.com/avatar/YWxqaGBf/${md5Str.slice(\n 0,\n 2\n )}/${md5Str.slice(2, 4)}/${md5Str.slice(\n 4,\n 6\n )}/${userId}/hd.jpg?t=${Math.floor(Math.random() * 10000)}`\n }\n\n return avator\n}\n// 当前用户是否已登录\nexport const isLoggedIn = () => {\n return Passport.isLoggedIn()\n}\n\n// 当前用户是否禁言\nexport const isMuted = () => {\n return false\n}\n\n// 传入的uid是否当前用户\nexport const isCurrent = (uid) => {\n return uid === getUid()\n}\n\n// 当前用户是否被ban\nexport const isBaned = () => {\n return false\n}\n\n// 当前用户是否可以发言\nexport const canComment = () => {\n return !isBaned() && !isMuted()\n}\n\nconst isMobile = /android|iphone|ipad|ipod|Windows Phone|SymbianOS/gi.test(\n navigator.userAgent\n)\n\nexport const login = () => {\n if (!isLoggedIn()) {\n if (isMobile) {\n window.location.href = `https://passport.17173.com/wap?return_url=${encodeURIComponent(\n window.location.href\n )}`\n } else {\n Passport.Dialog.show()\n }\n }\n}\n\nexport const postAuthCheck = (fn) => {\n if (!isLoggedIn()) {\n if (isMobile) {\n login()\n } else {\n // eslint-disable-next-line no-restricted-globals\n const result = confirm('您尚未登录,是否跳转到登录页?')\n if (result) login()\n }\n return\n }\n\n if (canComment()) {\n fn()\n } else {\n toast('被禁言')\n }\n}\n","import { getUid, isLoggedIn } from '@/core/passport'\nimport { getLocationQuery } from '@/core/util'\n/**\n * 绑定模块统计\n * 在html元素上配置属性: v-track-module=\"'模块统计代码'\"\n */\nexport const trackModule = {\n mounted: (el, binding) => {\n if (binding.value) {\n // eslint-disable-next-line\n _jc_ping.push(['_trackModule', el, binding.value])\n }\n },\n}\n\n/**\n * 绑定点击统计\n * 在html元素上配置属性: v-track-click=\"'点击统计代码'\"\n */\nexport const trackClick = {\n mounted: (el, binding) => {\n if (binding.value) {\n el.addEventListener('click', () => {\n // console.log(el, binding.value)\n // eslint-disable-next-line\n _jc_ping.push(['_trackBlockClick', binding.value])\n })\n }\n },\n}\n\nconst isMobile =\n /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(\n navigator.userAgent\n )\n\n/**\n * @typedef {Object} trackClick3Params\n * @property {string} type\n * @property {string} channel\n * @property {string} tid\n * @property {string} platform\n * @property {string} page_url\n * @property {string} uid\n * @property {string} eventName\n * @property {string} reffer\n * @property {string} name\n */\n\n/**\n * 最新统计 bi\n * @param {trackClick3Params} params\n * @param {string} adkey\n */\nexport const trackClick3 = (params, adkey = 'IvyeIb') => {\n const config = {\n type: '',\n channel: '',\n tid: '',\n platform: isMobile ? 'h5' : 'web',\n page_url: window.location.href,\n uid: isLoggedIn() ? getUid() : ued?.pingjs?.get('ssid'),\n eventName: 'custom',\n reffer: document.referrer,\n ...params,\n }\n if (config.tid) {\n if (isMobile) {\n config.page_url = window.location.href\n } else if (window.location.pathname.indexOf('hashtag') > -1) {\n const keyword = getLocationQuery('keyword')\n config.page_url = `//${window.location.host}/hashtag?keyword=${keyword}&tid=${config.tid}`\n } else {\n config.page_url = `//${window.location.host}/channel/${config.channel}?tid=${config.tid}`\n }\n }\n\n console.log('trackClick3 config:', config)\n window.dsm.call('track', window.dsm.E.custom, config)\n // eslint-disable-next-line\n _jc_ping.push(['_trackBlockClick', adkey, JSON.stringify(config)])\n}\n","\n \n \n \n \n \n \n \n 为你推荐\n \n el.id)\"\n :key=\"index\"\n swiper-slide\n class=\"item\"\n :class=\"{\n active:\n route.name === 'channel' && route.params.id === String(item.id),\n }\"\n @click=\"handleMenuClick(item.id)\"\n >\n {{\n item.name\n }}\n \n \n \n \n\n \n \n 反馈\n \n \n 加入群聊\n \n \n \n\n\n\n","\n \n \n \n \n \n \n\n\n\n\n\n","\nexport default (sfc, props) => {\n for (const [key, val] of props) {\n sfc[key] = val\n }\n return sfc\n}\n","\n \n\n {{ error }}\n 没有更多了\n 没有更多了\n \n\n \n\n\n\n\n","\n onItemClick(item, index)\"\n >\n \n \n \n \n \n \n 播放中\n \n \n el.type === 'video')[0].value.picUrl\n \"\n alt=\"\"\n />\n \n bump(item))\">\n {{ item.supports > 0 ? numberFormat(item.supports) : '' }}\n \n \n\n\n\n","\n \n \n onItemClick(item, index)\">\n \n \n\n\n\n","import { inject, ref } from 'vue'\nimport { threadAPI } from '@/api'\nimport { toast } from '@/components/toast'\n\nexport function useBumpUp(namespace) {\n const eventBus = inject('event-bus')\n\n const saving = ref(false)\n\n async function request(data) {\n if (saving.value) return\n saving.value = true\n\n const res = threadAPI.submitSupportThread(data.id)\n const status = await res.check()\n\n if (status.success) {\n const d = await res.data()\n // eslint-disable-next-line no-param-reassign\n data.supports = d.totalCount\n\n // eslint-disable-next-line no-param-reassign\n data.hasSupported = d.supportState === 1\n\n const e = {\n __from: namespace,\n __target: data,\n uid: data.authorUid,\n tid: data.id,\n supports: data.supports,\n hasSupported: data.hasSupported,\n }\n\n eventBus.emit('bump:change', e)\n } else {\n toast(status.msg)\n }\n\n saving.value = false\n }\n\n let threadItemsGetter = null\n function registerThreadItemsForBumpUpChangeHandler(_threadItemsGetter) {\n threadItemsGetter = _threadItemsGetter\n }\n\n function onBumpChangeBoradcast(e) {\n if (!threadItemsGetter) return\n\n const targets = threadItemsGetter()\n\n targets.forEach((t) => {\n // eslint-disable-next-line no-underscore-dangle\n if (e.__target === t) return\n\n if (t.id === e.tid) {\n // eslint-disable-next-line no-param-reassign\n t.supports = e.supports\n // eslint-disable-next-line no-param-reassign\n t.hasSupported = e.hasSupported\n }\n })\n }\n\n eventBus.on('bump:change', onBumpChangeBoradcast)\n\n onUnmounted(() => {\n eventBus.off('bump:change', onBumpChangeBoradcast)\n })\n\n return {\n triggerBumpUp: request,\n registerThreadItemsForBumpUpChangeHandler,\n }\n}\n","\n \n \n onItemClick(item, index)\">\n \n \n\n\n\n","\n {{ followState ? '已关注' : '关注' }}\n \n\n\n\n","\n \n \n \n \n \n \n {{ isMyself ? '我' : 'TA' }}的作品\n \n \n 合集\n \n \n \n {{ collectionInfo.collectionName }}\n 更新到第{{ collectionInfo.collectionCount }}集\n \n \n \n \n {{ userInfo.nickname }}\n \n \n {{ userInfo.location }}\n \n \n \n \n 关注{{ numberFormat(userInfo.followNum) }}\n \n \n 粉丝{{ numberFormat(userInfo.fansNum) }}\n \n \n 获赞{{ numberFormat(userInfo.supportNum) }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n\n","import { editorAPI } from '@/api'\nimport { getAssets } from '@/core/util'\n\nconst linkIcon = getAssets('images/ico-link.png')\n\nconst defaultOptions = {\n theme: 'snow',\n modules: { toolbar: false },\n formats: [\n 'EmbedLink',\n 'EmbedIframe',\n 'EmbedImage',\n 'EmbedVideo',\n 'EmbedText',\n 'needComment',\n 'commentwrapper',\n ],\n imageDesc: false,\n}\n\nclass Editor {\n constructor(options) {\n const opt = { ...defaultOptions, ...options }\n this.ueditor = new UEditor(options.container, opt)\n if (opt.onChange) {\n this.ueditor.quill.on('text-change', () => {\n opt.onChange()\n })\n }\n }\n\n // 插入空行\n insertEmptyParagraph() {\n this.ueditor.insertText('\\n', '')\n }\n\n // 插入表情\n insertEmo(val) {\n this.ueditor.focus()\n this.ueditor.insertText(val, '')\n }\n\n /**\n * @returns 插入图片\n */\n insertImage(src, aid, width, height) {\n this.ueditor.focus()\n this.insertEmptyParagraph()\n this.ueditor.insertImage(src, aid, width, height)\n this.insertEmptyParagraph()\n }\n\n async insertVideo(videoid, aid) {\n if (videoid && aid) {\n this.ueditor.focus()\n this.ueditor.insertVideo(videoid, aid)\n } else {\n const src = prompt('请输入173视频页面地址或者B站视频嵌入代码')\n this.ueditor.focus()\n // https://v.17173.com/v_1_1/NDAwMjYxNTM.html\n // ueditor.insertIframe('https://player.bilibili.com/player.html?aid=717833773&bvid=BV12Q4y1C7wh&cid=402195847&page=1')\n if (!src) return\n if (src.indexOf('v.17173.com') !== -1) {\n const videoInfo = await editorAPI.get17173VideoInfo(src).data()\n this.ueditor.insertVideo(videoInfo.id, videoInfo.aid || 0)\n } else if (src.indexOf('player.bilibili.com') !== -1) {\n this.ueditor.insertIframe(src)\n } else {\n alert('视频格式错误,B站视频请填入视频地址,不要填页面地址')\n }\n }\n this.insertEmptyParagraph()\n }\n\n /**\n * @returns 弹出插入链接窗口\n */\n async insertLink() {\n const href = window.prompt('请输入链接')\n if (href) {\n const linkInfo = await editorAPI.getLinkInfo(href).data()\n const title = linkInfo ? linkInfo.title : href\n this.ueditor.focus()\n this.ueditor.insertLink(href, title, linkIcon)\n this.insertEmptyParagraph()\n }\n }\n\n toggleNeedComment() {\n this.ueditor.toggleNeedComment()\n }\n\n onToggleHeading() {\n this.ueditor.heading()\n }\n\n onToggleBold() {\n this.ueditor.bold()\n }\n\n clearFormat() {\n this.ueditor.clearFormat()\n }\n\n loadContents(contents) {\n this.ueditor.loadContents(contents)\n }\n\n get contents() {\n return JSON.stringify(this.ueditor.contents)\n }\n\n get length() {\n return this.ueditor.quill.getText().length\n }\n\n focus() {\n this.ueditor.quill.focus()\n }\n}\nexport default Editor\n","\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n onSelectEmo(item.title))\"\n >\n \n \n \n \n \n \n \n \n 图片上传中,请耐心等待...\n \n\n\n\n","\n \n \n \n \n 草稿已保存\n \n maxLength }\">{{\n contentCount\n }}/{{ maxLength }}\n \n \n 发表\n \n \n\n\n\n","\n \n \n \n \n \n \n \n \n \n \n \n \n\n\n","\n \n \n \n 回复: {{ data.pname }}\n {{ dateFormat(data.createDate) }}\n \n \n \n \n 引用{{ data.attachQuote.author }}图片:\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n {{ replyNum > 0 ? numberFormat(replyNum) : '' }}\n {{ data.supports > 0 ? numberFormat(data.supports) : '' }}\n \n \n\n \n \n \n \n \n 草稿已保存\n \n maxLength }\">{{\n contentCount\n }}/{{ maxLength }}\n \n \n 发表\n \n \n \n \n 0\" class=\"comment-reply\">\n \n \n 上一页\n {{ i }}\n = totalPage)\"\n class=\"next\"\n @click=\"loadReply(currentPage + 1)\"\n >下一页\n \n \n \n \n\n\n","import { gtvAPI } from '@/api'\nimport defineListStore from './defineListStore'\nimport ThreadModel from '@/models/thread'\n\n// 评论列表\nexport const commentListStore = defineListStore({\n getMethod: gtvAPI.getCommentList,\n dataParser: (items) => {\n return items.map((item) => {\n const threadModel = ThreadModel.fromJson(item)\n try {\n return threadModel\n } catch (e) {\n console.error(e)\n }\n return item\n })\n },\n})\n","\n \n \n \n 全部评论({{ commentsTotal }})\n \n \n \n \n \n \n \n \n \n\n\n\n\n","export function useCommentChanged(namespace) {\n const eventBus = inject('event-bus')\n\n function emit(data) {\n const e = {\n __from: namespace,\n __target: data,\n uid: data.authorUid,\n tid: data.id,\n replies: data.replies,\n }\n\n eventBus.emit('comment:change', e)\n }\n\n let threadItemsGetter = null\n function registerThreadItemsForCommentChangeHandler(_threadItemsGetter) {\n threadItemsGetter = _threadItemsGetter\n }\n\n function handler(e) {\n if (!threadItemsGetter) return\n\n const targets = threadItemsGetter()\n\n targets.forEach((t) => {\n // eslint-disable-next-line no-underscore-dangle\n if (e.__target === t) return\n\n if (t.id === e.tid) {\n // eslint-disable-next-line no-param-reassign\n t.replies = e.replies\n // eslint-disable-next-line no-param-reassign\n t.hasSupported = e.hasSupported\n }\n })\n }\n\n eventBus.on('comment:change', handler)\n\n onUnmounted(() => {\n eventBus.off('comment:change', handler)\n })\n\n return {\n emit,\n registerThreadItemsForCommentChangeHandler,\n }\n}\n","\n \n \n \n \n \n \n \n \n \n \n\n\n\n","import videojs from 'video.js'\n\nvideojs.addLanguage('zh-CN', {\n Play: '播放',\n Pause: '暂停',\n 'Current Time': '当前时间',\n Duration: '时长',\n 'Remaining Time': '剩余时间',\n 'Stream Type': '媒体流类型',\n LIVE: '直播',\n Loaded: '加载完成',\n Progress: '进度',\n Fullscreen: '全屏',\n 'Exit Fullscreen': '退出全屏',\n 'Picture-in-Picture': '画中画',\n 'Exit Picture-in-Picture': '退出画中画',\n Mute: '静音',\n Unmute: '开启音效',\n 'Playback Rate': '播放速度',\n Subtitles: '字幕',\n 'subtitles off': '关闭字幕',\n Captions: '内嵌字幕',\n 'captions off': '关闭内嵌字幕',\n Chapters: '节目段落',\n 'Close Modal Dialog': '关闭弹窗',\n Descriptions: '描述',\n 'descriptions off': '关闭描述',\n 'Audio Track': '音轨',\n 'You aborted the media playback': '视频播放被终止',\n 'A network error caused the media download to fail part-way.':\n '网络错误导致视频下载中途失败。',\n 'The media could not be loaded, either because the server or network failed or because the format is not supported.':\n '视频因格式不支持或者服务器或网络的问题无法加载。',\n 'The media playback was aborted due to a corruption problem or because the media used features your browser did not support.':\n '由于视频文件损坏或是该视频使用了你的浏览器不支持的功能,播放终止。',\n 'No compatible source was found for this media.': '无法找到此视频兼容的源。',\n 'The media is encrypted and we do not have the keys to decrypt it.':\n '视频已加密,无法解密。',\n 'Play Video': '播放视频',\n Close: '关闭',\n 'Modal Window': '弹窗',\n 'This is a modal window': '这是一个弹窗',\n 'This modal can be closed by pressing the Escape key or activating the close button.':\n '可以按ESC按键或启用关闭按钮来关闭此弹窗。',\n ', opens captions settings dialog': ', 开启标题设置弹窗',\n ', opens subtitles settings dialog': ', 开启字幕设置弹窗',\n ', opens descriptions settings dialog': ', 开启描述设置弹窗',\n ', selected': ', 选择',\n 'captions settings': '字幕设定',\n 'Audio Player': '音频播放器',\n 'Video Player': '视频播放器',\n Replay: '重新播放',\n 'Progress Bar': '进度条',\n 'Volume Level': '音量',\n 'subtitles settings': '字幕设定',\n 'descriptions settings': '描述设定',\n Text: '文字',\n White: '白',\n Black: '黑',\n Red: '红',\n Green: '绿',\n Blue: '蓝',\n Yellow: '黄',\n Magenta: '紫红',\n Cyan: '青',\n Background: '背景',\n Window: '窗口',\n Transparent: '透明',\n 'Semi-Transparent': '半透明',\n Opaque: '不透明',\n 'Font Size': '字体尺寸',\n 'Text Edge Style': '字体边缘样式',\n None: '无',\n Raised: '浮雕',\n Depressed: '压低',\n Uniform: '均匀',\n Dropshadow: '下阴影',\n 'Font Family': '字体库',\n 'Proportional Sans-Serif': '比例无细体',\n 'Monospace Sans-Serif': '单间隔无细体',\n 'Proportional Serif': '比例细体',\n 'Monospace Serif': '单间隔细体',\n Casual: '舒适',\n Script: '手写体',\n 'Small Caps': '小型大写字体',\n Reset: '重置',\n 'restore all settings to the default values': '恢复全部设定至预设值',\n Done: '完成',\n 'Caption Settings Dialog': '字幕设定窗口',\n 'Beginning of dialog window. Escape will cancel and close the window.':\n '打开对话窗口。Escape键将取消并关闭对话窗口',\n 'End of dialog window.': '结束对话窗口',\n 'Seek to live, currently behind live': '尝试直播,当前为延时播放',\n 'Seek to live, currently playing live': '尝试直播,当前为实时播放',\n 'progress bar timing: currentTime={1} duration={2}': '{1}/{2}',\n '{1} is loading.': '正在加载 {1}。',\n 'No content': '无内容',\n Color: '颜色',\n Opacity: '不透明度',\n 'Text Background': '文本背景',\n 'Caption Area Background': '字幕区域背景',\n 'Skip forward {1} seconds': '快进 {1} 秒',\n 'Skip backward {1} seconds': '快退 {1} 秒',\n})\n","export const T = {\n 视频详情: {\n name: '视频播放页',\n types: {\n 地址栏直接打开: '地址栏直接打开',\n 点击打开: '点击打开',\n 滚动切换: '滚动切换',\n 个人页滚动切换: '个人页滚动切换',\n 点击个人中心列表: '点击个人中心列表',\n },\n },\n video: {\n name: '视频播放页',\n types: {\n click: '点击切换',\n auto: '自动切换',\n touch: '滚动切换',\n scroll: '滚动切换',\n keypress: '键盘切换',\n play3s: '播放3s',\n play70p: '播放70%',\n collectionClick: '点击合集列表',\n collectionSwitch: '合集点击切换',\n collectionAuto: '合集自动切换',\n collectionScroll: '合集滚动切换',\n },\n },\n ad: {\n name: '广告',\n types: {\n display: '展示广告',\n play3s: '广告播放3s',\n play70p: '广告播放70%',\n click: '点击广告',\n close: '关闭广告',\n },\n },\n hotAd: {\n name: '热门广告',\n types: {\n display: '展示热门广告',\n click: '点击热门广告',\n close: '关闭热门广告',\n },\n },\n bgAd: {\n name: '背景广告',\n types: {\n display: '展示背景广告',\n click: '点击背景广告',\n },\n },\n asideAd: {\n name: '右侧大广告',\n types: {\n display: '展示右侧大广告',\n clickTop: '点击上方按钮右侧大广告',\n clickBottom: '点击下方按钮右侧大广告',\n close: '关闭右侧大广告',\n },\n },\n urc: {\n name: 'H5用研视频',\n types: {\n play5s: '播放5S',\n clickDownload: '点击下载',\n },\n },\n notFoundCode: 400,\n}\n\nexport const LS_URC_PHONE = 'LS_URC_PHONE'\n\nexport const URC_MUTE = 'URC_MUTE'\n\nexport const URC_VOL = 'URC_VOL'\n","\n \n \n \n \n \n \n \n \n\n\n\n","import { toast } from '../toast'\n\nexport function openNotVideoToast(id) {\n console.log('openNotVideoToast:', id)\n toast('暂时没有更多视频啦~请休息一会儿,再刷新试试。❛‿˂̵✧', {\n parent: document.querySelector(`#video_${id}`),\n })\n}\n","import { ref, onMounted, onUnmounted } from 'vue'\nimport { trackClick3 } from '@/directives/bi'\nimport { T } from '@/constants/constants'\n/**\n * 背景广告\n * @fileoverview useBgAd hook\n */\nexport default function useBgAd(emits) {\n const bgAdInfo = ref(null)\n const bodyWidth = ref(0)\n const resizeTimer = ref(null)\n const currTid = ref(null)\n const currChannel = ref(null)\n const MIN_WIDTH = 1300\n const flagDisplay = ref(false)\n /**\n * 获取 tid 对应的背景广告信息\n * @param {*} tid\n */\n const findBgAd = (tid) => {\n if (window.gtvad_Bg) {\n return window.gtvad_Bg.find((item) => {\n if (Array.isArray(item.tid)) {\n return item.tid.includes(Number(tid))\n }\n return item.tid === tid\n })\n }\n return null\n }\n\n const dispatchBiDisplay = () => {\n if (flagDisplay.value === false && bgAdInfo.value) {\n trackClick3({\n channel: currChannel.value,\n tid: currChannel.value.tid,\n name: T.bgAd.name,\n type: T.bgAd.types.display,\n })\n flagDisplay.value = true\n }\n }\n\n const dispatchBiClick = () => {\n trackClick3({\n channel: currChannel.value,\n tid: currChannel.value.tid,\n name: T.bgAd.name,\n type: T.bgAd.types.click,\n })\n }\n\n const clearFlag = () => {\n flagDisplay.value = false\n bgAdInfo.value = null\n currTid.value = null\n }\n\n const updateBgAdInfo = () => {\n console.log('updateBgAdInfo', bodyWidth.value, MIN_WIDTH)\n if (bodyWidth.value >= MIN_WIDTH) {\n bgAdInfo.value = findBgAd(currTid.value)\n } else {\n bgAdInfo.value = null\n }\n dispatchBiDisplay()\n emits('showBgAd', !!bgAdInfo.value)\n }\n\n const updateBodyWidth = () => {\n bodyWidth.value = document.querySelector('.swiper-feed').clientWidth\n }\n\n const resizeHandler = () => {\n clearTimeout(resizeTimer.value)\n resizeTimer.value = setTimeout(() => {\n updateBodyWidth()\n console.log('resizeHandler', bodyWidth.value)\n updateBgAdInfo()\n }, 100)\n }\n\n const setTheadInfo = (channel, tid) => {\n if (tid !== currTid.value) {\n console.log('setTheadInfo', channel, tid, currTid.value)\n currTid.value = tid\n currChannel.value = channel\n updateBgAdInfo()\n }\n }\n\n onMounted(() => {\n updateBodyWidth()\n window.addEventListener('resize', resizeHandler, false)\n })\n onUnmounted(() => {\n clearTimeout(resizeTimer.value)\n window.removeEventListener('resize', resizeHandler, false)\n })\n\n return {\n bgAdInfo,\n setTheadInfo,\n dispatchBiDisplay,\n dispatchBiClick,\n clearFlag,\n }\n}\n","\n \n \n \n \n \n \n \n \n \n {\n handleMounted(e, index)\n }\n \"\n @unmounted=\"() => handleUnmounted(index)\"\n @ended=\"() => handleEnded(index)\"\n @timeupdate=\"\n () => handleTimeupdate(index, silde.id, silde.subId)\n \"\n />\n \n \n 视频审核未通过\n \n 视频审核中\n \n \n \n\n \n el.type === 'link').length\n ? silde.content.filter((el) => el.type === 'link')[0].value\n : ''\n \"\n :pic=\"\n silde.content.filter((el) => el.type === 'image').length\n ? silde.content.filter((el) => el.type === 'image')[0].value\n : ''\n \"\n @close=\"\n () => {\n onCloseRecommend(silde.id, silde.subId)\n }\n \"\n @click=\"\n () => {\n onRecommendClick(silde.id, silde.subId)\n }\n \"\n />\n {\n handleCloseAd(silde.id, silde.subId)\n }\n \"\n @click=\"\n () => {\n handleClickAd(silde.id, silde.subId)\n }\n \"\n />\n \n \n \n 进入搞视,观看更高清 >\n \n \n \n \n \n \n \n \n \n \n \n \n \n {{ silde.gameName }}{{ silde.gameName }}\n \n \n #{{ tag.searchKeyword }}\n \n \n \n el.type === 'link').length\n ? silde.content.filter((el) => el.type === 'link')[0]\n .value + '?utm_source=gtv'\n : ''\n \"\n :target=\"'_blank'\"\n @click=\"\n () => {\n onRecommendClick(silde.id)\n }\n \"\n >\n {{ item.value }}\n 广告\n {{ item.value }}\n 广告\n \n \n \n {{ silde.collection.collectionName\n }}|更新到第{{\n silde.collectionCount || collectionInfo?.collectionCount\n }}集\n \n \n \n \n \n \n \n \n\n \n \n {{ silde.supports > 0 ? numberFormat(silde.supports) : '' }}\n \n\n \n \n \n {{ silde.replies > 0 ? numberFormat(silde.replies) : '' }}\n \n\n \n \n 加入群聊\n \n \n \n \n \n \n \n \n {\n handlePlayerMuteState(false)\n }\n \"\n >\n 打开声音\n \n {\n handlePlayerMuteState(true)\n }\n \"\n >\n 静音观看\n \n \n \n \n\n\n\n","// import { watch } from 'vue'\nimport { recommendListStore } from '@/store/stores'\n\nlet overBool = false\nexport function useThreadRecommends(list, fromIndex) {\n // eslint-disable-next-line no-unused-vars\n const { items, states } = list\n // const itemCopy = [...items.value]\n\n // eslint-disable-next-line no-unused-vars\n const { getAd } = recommendListStore\n\n /**\n * 从 recommendItems.value 随机获取两个推荐帖子\n * @returns {Array}\n */\n // function getRandomItems() {\n // const rc = recommendItems.value\n // const shuffledItems = [...rc]\n\n // const randomIndices = new Set()\n // while (randomIndices.size < 2) {\n // const randomNumber = Math.floor(Math.random() * rc.length)\n // randomIndices.add(randomNumber)\n // }\n\n // const randomItems = Array.from(randomIndices).map(\n // (index) => shuffledItems[index]\n // )\n\n // return randomItems\n // }\n\n // function hasPushed() {\n // return items.value.some((item) => item.isAd)\n // }\n\n function printItems() {\n // console.table(\n // items.value.map((it) => {\n // const index = it.content.findIndex((e) => e.type === 'text')\n // return { id: it?.id, title: it?.content[index]?.value, isAd: it?.isAd }\n // })\n // )\n }\n\n async function pushRecommendsInto() {\n console.log('pushRecommendItemsInto start overBool=', overBool)\n if (!items.value || !items.value.length || overBool) {\n return\n }\n\n // if (hasPushed(items)) {\n // // find ad items\n // const adItems = items.value.filter((item) => item.isAd)\n\n // // replace ad item with r1 , r2 , r3 , r4\n // if (adItems[0] && r1) itemCopy.splice(itemCopy.indexOf(adItems[0]), 1, r1)\n // if (adItems[1] && r2) itemCopy.splice(itemCopy.indexOf(adItems[1]), 1, r2)\n // // if (adItems[2] && r3)\n // // items.value.splice(items.value.indexOf(adItems[2]), 1, r3)\n // // if (adItems[3] && r4)\n // // items.value.splice(items.value.indexOf(adItems[3]), 1, r4)\n\n // console.log('replaceRecommendItemsInto items DONE')\n // printItems()\n // } else {\n // const base = fromIndex ? fromIndex.value : 0\n // 初次进来的时候\n let value\n if (items.value.length <= 7) {\n value = items.value.length\n } else {\n value = (items.value.length - 1) % 9\n }\n\n const base = items.value.length - value\n console.log('pushRecommendItemsInto value:', value)\n // console.log('pushRecommendItemsInto base', base)\n // inset r1 to items at index 2\n\n if (value >= 2) {\n const r1 = await getAd()\n items.value.splice(base + 2, 0, r1)\n }\n if (value === 7) {\n const r2 = await getAd()\n items.value.push(r2)\n }\n\n if (value < 7) {\n overBool = true\n }\n\n // inset r3 to items at index 11\n // if (r3) items.value.splice(base + 11, 0, r3)\n // // inset r4 to items at index 17\n // if (r4) items.value.splice(base + 17, 0, r4)\n\n console.log('pushRecommendItemsInto items DONE', items.value)\n printItems()\n // }\n }\n\n function getOriginIndex(index) {\n // 0|1|2|3|4|5|6\n // 0|1|A|2|3|B|4\n const base = fromIndex ? fromIndex.value : 0\n if (index < base + 2) return index\n if (index < base + 5) return index - 1\n return index - 2\n }\n\n pushRecommendsInto()\n\n // watch(\n // // 每次 items, recommendItems 变化时,都检查\n // () => [items.value, recommendItems.value],\n // () => {\n // pushRecommendsInto()\n // },\n // {\n // immediate: true,\n // }\n // )\n\n // 记录已关闭的广告信息\n // Consume by SFPlayer\n const setOfClosedAdInfo = ref(new Set())\n provide('setOfClosedAdInfo', setOfClosedAdInfo)\n\n return { getOriginIndex }\n}\n","import { ref } from 'vue'\nimport { getUid } from '@/core/passport'\nimport { userAPI } from '@/api'\nimport defineListStore from '@/store/defineListStore'\nimport ThreadModel from '@/models/thread'\nimport { filterInvalidateVideo } from '@/store/stores'\n\nexport function useUserThreadList() {\n const lsParams = ref()\n\n function setParams({ uid, tid }) {\n lsParams.value = { uid, tid }\n // console.log('useUserThreadList setParams', uid, tid)\n }\n\n const isMyself = computed(() => lsParams.value?.uid === getUid())\n\n const userThreadListStore = defineListStore({\n getMethod: (params) =>\n isMyself.value\n ? userAPI.getMyThreadList(params)\n : userAPI.getUserThreadList(params),\n dataParser: (items) => {\n return items\n .map((item) => {\n const threadModel = ThreadModel.fromJson(item)\n try {\n return threadModel\n } catch (e) {\n console.error(e)\n }\n return item\n })\n .filter(filterInvalidateVideo)\n },\n })\n\n const {\n items: originItems,\n states,\n actions,\n pageSize,\n } = userThreadListStore()\n pageSize.value = 30\n\n const items = ref([])\n watch(originItems, () => {\n items.value = originItems.value.map((item) => {\n // eslint-disable-next-line no-param-reassign\n item.authorUid = lsParams.value?.uid\n return item\n })\n })\n\n async function load() {\n await actions.load({\n // tid: lsParams.value?.tid,\n uuid: lsParams.value?.uid,\n })\n }\n\n return {\n items,\n states,\n actions: {\n ...actions,\n load,\n setParams,\n },\n }\n}\n","import { ref } from 'vue'\nimport { getUid } from '@/core/passport'\nimport { gtvAPI, userAPI } from '@/api'\nimport defineListStore from '@/store/defineListStore'\nimport ThreadModel from '@/models/thread'\nimport { filterInvalidateVideo } from '@/store/stores'\n\nexport function useCollectionList() {\n const collectionListStore = defineListStore({\n getMethod: gtvAPI.getCollection,\n dataParser: (items) => {\n return items\n .map((item) => {\n const threadModel = ThreadModel.fromJson(item)\n try {\n return threadModel\n } catch (e) {\n console.error(e)\n }\n return item\n })\n .filter(filterInvalidateVideo)\n },\n })\n\n const {\n items,\n states,\n actions,\n pageSize,\n } = collectionListStore()\n pageSize.value = 30\n\n return {\n items,\n states,\n actions,\n }\n}\n","\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n 按下 「键盘下键」或滑动「鼠标滚轮」查看更多视频\n 同时支持点击屏幕上的「上下按钮」切换视频\n \n \n \n \n {\n collectionPlayerVisible = false\n isShowUserInfo = false\n }\n \"\n >退出TA的合集\n {\n userSFPlayerVisible = false\n isShowUserInfo = false\n }\n \"\n >退出TA的作品\n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n handleSwitch(-1)\">\n handleSwitch(1)\">\n \n \n\n\n\n","\n \n {\n showFeed(index)\n }\n \"\n >\n \n \n \n {{ data.gameName }}\n {{ durationFormat(videoInfo.duration) }}\n 合集\n \n {\n showFeed(index)\n }\n \"\n >\n 24 ? item + '...' : item\"\n >\n \n \n \n {{ data.author }}\n \n \n {{ data.supports > 0 ? numberFormat(data.supports) : '' }}\n \n \n \n\n\n\n","import { threadAPI } from '@/api'\nimport ThreadModel from '@/models/thread'\nimport { T } from '@/constants/constants'\n\n/**\n * 处理地址栏直接打开帖子\n * 1. 如果帖子不存在,返回 400,外部处理跳转到首页\n * 2. 如果帖子不在 items 中, 加载帖子,插入到 items 第一条中\n * @param {*} tid\n * @returns\n */\nexport function useTidLand(tid) {\n // eslint-disable-next-line consistent-return\n async function init(items) {\n // 加载 tid 对应的帖子\n const thread = await threadAPI\n .getThreadInfo({ tid: tid.value })\n .check()\n .then((res) => {\n if (res.success) {\n return res.data\n }\n if (res.code === T.notFoundCode) {\n // eslint-disable-next-line consistent-return\n return T.notFoundCode\n }\n return null\n })\n if (thread === T.notFoundCode) {\n // eslint-disable-next-line consistent-return\n return T.notFoundCode\n }\n if (!thread) {\n // eslint-disable-next-line consistent-return\n return\n }\n\n // eslint-disable-next-line no-underscore-dangle\n let _items = items.value\n\n const threadModel = ThreadModel.fromJson(thread)\n\n // 检查列表中是否已经存在当前帖子\n const hasCurrentThread = items.value.some(\n (item) => item.id === threadModel.id\n )\n\n if (hasCurrentThread) {\n // 删除列表中的重复帖子\n // eslint-disable-next-line no-param-reassign\n _items = items.value.filter((item) => item.id !== threadModel.id)\n }\n\n // eslint-disable-next-line no-param-reassign\n items.value = [threadModel, ..._items]\n }\n\n return { init }\n}\n","\n \n \n \n el.type === 'video').length > 0\n ? item.content.filter((el) => el.type === 'video')[0].value\n : null\n \"\n :index=\"index\"\n @showSwiperFeed=\"onShowSwiperFeed\"\n >\n \n \n \n \n\n\n\n","\n \n \n Sorry,您要访问的页面不见了!\n 返回首页\n \n\n\n\n\n\n","\n \n \n \n el.type === 'video').length > 0\n ? item.content.filter((el) => el.type === 'video')[0].value\n : null\n \"\n :index=\"index\"\n @showSwiperFeed=\"onShowSwiperFeed\"\n >\n \n \n\n\n\n","\n \n #{{ keyword }}\n \n {{ totalCount }}作品\n \n \n \n \n el.type === 'video').length > 0\n ? item.content.filter((el) => el.type === 'video')[0].value\n : null\n \"\n :index=\"index\"\n @showSwiperFeed=\"onShowSwiperFeed\"\n >\n \n \n\n\n\n","\n \n \n \n\n\n\n","import home from './home/Home.vue'\nimport error from './404.vue'\nimport channel from './Channel.vue'\nimport hashtag from './hashtag.vue'\nimport playerIframe from './playerIframe.vue'\n\nexport default {\n home,\n error,\n channel,\n hashtag,\n playerIframe,\n}\n","import {\n createRouter,\n createWebHistory,\n // createWebHashHistory,\n} from 'vue-router'\nimport { isLoggedIn, login } from './core/passport'\nimport * as pages from './core/pages'\nimport templates from '@/pages/index'\n\nconst routes = []\n\nObject.keys(pages).forEach((key) => {\n const routeInfo = pages[key]\n routeInfo.component = templates[key]\n routeInfo.meta = {\n title: routeInfo.title,\n ...routeInfo.meta,\n ...{\n needAuth: routeInfo.needAuth,\n },\n }\n routes.push(routeInfo)\n})\n// 所有未定义的路由跳转到404页面\nroutes.push({\n path: '/:pathMatch(.*)*',\n redirect: '/404',\n})\n\n// 上线时使用history模式\nconst router = createRouter({\n history: createWebHistory(),\n routes,\n})\n// const router = createRouter({\n// history: createWebHashHistory(),\n// routes,\n// })\n\nrouter.beforeEach((to) => {\n // 需要登录的页面,直接调用登录方法\n if (to.meta.needAuth === true && !isLoggedIn()) {\n login()\n }\n if (to.meta.title) {\n document.title = to.meta.title\n }\n if (to.meta.keywords) {\n document\n .querySelector('meta[name=\"keywords\"]')\n .setAttribute('content', to.meta.keywords)\n }\n if (to.meta.description) {\n document\n .querySelector('meta[name=\"description\"]')\n .setAttribute('content', to.meta.description)\n }\n})\n\nexport default router\n","import mitt from 'mitt'\nimport App from './App.vue'\nimport routes from './routes'\nimport svgIcon from './components/SvgIcon.vue'\nimport pages from './pages'\nimport { trackModule, trackClick } from './directives/bi'\n\nconst app = createApp(App)\n\n// plugins\napp.use(routes)\n\n// provides\napp.provide('pages', pages)\nconst eventBus = mitt()\neventBus.on('*', (...args) => console.debug(args))\napp.provide('event-bus', eventBus)\n\n// components\napp.component('SvgIcon', svgIcon)\napp.directive('trackModule', trackModule)\napp.directive('trackClick', trackClick)\n\napp.mount('#app')\n"],"names":["qs","hashtag","debounce","d.gString","d.gNum","d.gBool","ToastTemplate","isMobile","SwiperCore","toast","home","error","channel","playerIframe","pages","templates","App","routes","svgIcon"],"mappings":"w5BAAA,KAAM,IAAI,UAAoB,CAC1B,KAAM,GAAU,SAAS,cAAc,QAAQ,QAC/C,GAAI,GAAW,EAAQ,UAAY,EAAQ,SAAS,iBAChD,OAEJ,SAAW,KAAQ,UAAS,iBAAiB,6BACzC,EAAe,GAEnB,GAAI,kBAAiB,AAAC,GAAc,CAChC,SAAW,KAAY,GACnB,GAAI,EAAS,OAAS,YAGtB,SAAW,KAAQ,GAAS,WACxB,AAAI,EAAK,UAAY,QAAU,EAAK,MAAQ,iBACxC,EAAe,KAG5B,QAAQ,SAAU,CAAE,UAAW,GAAM,QAAS,KACjD,WAAsB,EAAQ,CAC1B,KAAM,GAAY,GAClB,MAAI,GAAO,WACP,GAAU,UAAY,EAAO,WAC7B,EAAO,gBACP,GAAU,eAAiB,EAAO,gBACtC,AAAI,EAAO,cAAgB,kBACvB,EAAU,YAAc,UACvB,AAAI,EAAO,cAAgB,YAC5B,EAAU,YAAc,OAExB,EAAU,YAAc,cACrB,EAEX,WAAwB,EAAM,CAC1B,GAAI,EAAK,GAEL,OACJ,EAAK,GAAK,GAEV,KAAM,GAAY,EAAa,GAC/B,MAAM,EAAK,KAAM,KAEvB,AAAoB,KC1CtB,KAAM,IAAY,gBAAsB,GAAO,GAAS,GAAO,8CAA2D,GAAgB,SAAiB,EAAY,EAAM,CAEzK,MAAI,AAAuB,CAAC,GAAQ,EAAK,SAAW,EACzC,IAEJ,QAAQ,IAAI,EAAK,IAAI,AAAC,GAAQ,CAIjC,GAFA,EAAM,GAAG,KAAO,IAEZ,IAAO,IACP,OAEJ,GAAK,GAAO,GACZ,KAAM,GAAQ,EAAI,SAAS,QACrB,EAAc,EAAQ,qBAAuB,GAEnD,GAAI,SAAS,cAAc,cAAc,MAAQ,KAC7C,OAGJ,KAAM,GAAO,SAAS,cAAc,QAUpC,GARA,EAAK,IAAM,EAAQ,aAAe,GAC7B,GACD,GAAK,GAAK,SACV,EAAK,YAAc,IAEvB,EAAK,KAAO,EAEZ,SAAS,KAAK,YAAY,GACtB,EACA,MAAO,IAAI,SAAQ,CAAC,EAAK,IAAQ,CAC7B,EAAK,iBAAiB,OAAQ,GAC9B,EAAK,iBAAiB,QAAS,QAGvC,KAAK,IAAM,yIChBnB,sRClBe,QAAe,CAC5B,YAAY,EAAQ,CAElB,KAAK,MAAQ,EAAO,MAEpB,KAAK,KAAO,EAAO,KAEnB,KAAK,KAAO,EAAO,KAInB,KAAK,OAAS,EAAO,OACrB,KAAK,SAAW,EAAO,WAAa,GACpC,KAAK,KAAO,EAAO,QAIjB,YAAY,CACd,MAAO,CAAE,KAAM,KAAK,MAItB,OAAO,EAAQ,EAAO,CACpB,GAAI,GAAO,KAAK,KAChB,SAAO,EAAK,QAAQ,MAAO,IACvB,GACF,OAAO,KAAK,GAAQ,QAAQ,AAAC,GAAQ,CACnC,EAAO,EAAK,QAAQ,IAAI,IAAO,EAAO,MAK1C,EAAO,EAAK,QAAQ,aAAc,IAC9B,GACF,CAAI,MAAO,IAAU,UAAY,EAAM,QAAQ,KAAO,GACpD,GAAQ,EAER,GAAQ,IAAIA,GAAG,UAAU,MAGtB,EAIT,GAAG,EAAQ,CACT,KAAM,GAAO,KAAK,OAAO,GACzB,OAAO,SAAS,KAAO,GCzB3B,KAAM,IACJ,6MACI,GACJ,qhCAEW,GAAO,GAAI,IAAS,CAC/B,MAAO,eACP,KAAM,IACN,KAAM,OACN,KAAM,CACJ,YACA,kBAGS,GAAU,GAAI,IAAS,CAClC,MAAO,eACP,KAAM,eACN,KAAM,UACN,KAAM,CACJ,YACA,kBAIS,GAAe,GAAI,IAAS,CACvC,MAAO,eACP,KAAM,kBACN,KAAM,eACN,KAAM,CACJ,YACA,kBAIS,GAAe,GAAI,IAAS,CACvC,MAAO,eACP,KAAM,oBACN,KAAM,eACN,KAAM,CACJ,YACA,kBAISC,GAAU,GAAI,IAAS,CAClC,MAAO,eACP,KAAM,WACN,KAAM,UACN,KAAM,CACJ,YACA,kBAIS,GAAQ,GAAI,IAAS,CAChC,MAAO,MACP,KAAM,OACN,KAAM,CACJ,YACA,ghXClFW,iJCAA,qJCAA,6JCAA,kJCAA,wiECAA,wsFCAA,qJCAA,kJCAA,qJCAA,oJCAA,o/CCAA,yJCAA,0JCAA,qlJCAA,uJCQR,KAAM,IAAY,AAAC,GAAS,CACjC,KAAM,GAAO,aAAa,IAE1B,MAAO,AADS,qvBACD,GAAM,SAUV,GAAiB,AAAC,GAAQ,CACrC,KAAM,GAAI,KAAK,MAAM,EAAM,MAAQ,EAAI,KAAK,MAAM,EAAM,MAAQ,GAC1D,EACJ,KAAK,MAAO,EAAM,GAAM,IAAM,EAC1B,GAAG,KAAK,MAAO,EAAM,GAAM,IACxB,WACA,SAAS,EAAG,QACf,MAEA,EAAI,KAAK,MAAM,EAAM,IACxB,WACA,SAAS,EAAG,KAEf,MAAO,GAAI,EAAI,GAGJ,GAAmB,CAAC,EAAK,EAAa,KAAU,CAC3D,KAAM,GAAO,GAAI,MAAK,EAAI,OAAS,GAAK,EAAM,EAAM,KAC9C,EAAI,EAAK,cACT,EACJ,EAAK,WAAa,EAAI,GAAK,IAAI,EAAK,WAAa,IAAM,EAAK,WAAa,EACrE,EAAI,EAAK,UAAY,GAAK,IAAI,EAAK,YAAc,EAAK,UACtD,EAAK,EAAK,WAAa,GAAK,IAAI,EAAK,aAAe,EAAK,WACzD,EACJ,EAAK,aAAe,GAAK,IAAI,EAAK,eAAiB,EAAK,aAE1D,MAAO,GAAa,GAAG,KAAK,KAAK,IAAM,GAAG,KAAK,KAAK,KAAK,KAAM,KAGpD,GAAa,AAAC,GAAQ,CACjC,KAAM,GAAO,EAAI,OAAS,GAAK,EAAM,EAAM,IAErC,EAAO,GAAI,QAAO,UAAY,EACpC,GAAI,GAAO,GAEX,GAAI,EAAO,EACT,MAAO,IAAiB,GAG1B,KAAM,GAAI,GAAK,IACT,EAAI,EAAI,GACR,EAAI,EAAI,GAER,EAAQ,KAAK,MAAM,EAAO,GAC1B,EAAQ,KAAK,MAAM,EAAO,GAC1B,EAAQ,KAAK,MAAM,EAAO,GAEhC,MAAI,IAAS,EACX,EAAO,gBACF,AAAI,GAAS,GAClB,EAAO,GAAG,gBACL,AAAI,GAAS,EAClB,EAAO,GAAG,sBACL,AAAI,EAAQ,EACjB,EAAO,GAAG,sBAEV,EAAO,eAGF,GAAG,KAGC,GAAe,AAAC,GACvB,GAAO,IACF,GAAG,KAAK,MAAM,EAAM,KAAQ,WAG9B,EAGI,GAAS,CAAC,EAAQ,EAAI,EAAO,MAAQ,CAChD,OAAO,iBACL,SACAC,GAAS,IAAM,CACb,KAAM,GAAM,SAAS,gBAAgB,WAAa,SAAS,KAAK,UAE1D,EAAU,SAAS,cAAc,GACjC,EAAM,SAAS,cAAc,GACnC,AAAI,GAAO,EAAQ,UACZ,EAAI,UAAU,SAAS,UAC1B,GAAI,MAAM,MAAQ,GAAG,EAAQ,gBAC7B,EAAI,UAAU,IAAI,SAClB,EAAI,MAAM,IAAM,SAAS,cAAc,QAAQ,MAAM,YAAc,GAE5D,EAAI,UAAU,SAAS,UAChC,GAAI,UAAU,OAAO,SACrB,EAAI,MAAM,IAAM,SAEjB,KAIM,GAAU,CACrB,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,QAET,CACE,IAAK,6EACL,MAAO,SAIX,YAAuB,EAAG,CACxB,MAAO,IAAQ,KAAK,AAAC,GAAO,EAAG,QAAU,GAEpC,KAAM,IAAkB,AAAC,GACvB,EAAE,QAAQ,oBAAqB,CAAC,EAAG,IAAS,CACjD,KAAM,GAAQ,GAAc,GAC5B,MAAO,GAAQ,YAAY,EAAM,uBAAyB,KAKjD,GAAmB,AAAC,GAAS,CACxC,KAAM,GAAM,GAAI,QAAO,QAAQ,iBAAqB,KAC9C,EAAI,OAAO,SAAS,OAAO,MAAM,GAAG,MAAM,GAChD,MAAI,IAAK,KACA,mBAAmB,EAAE,IAEvB,IC7OH,GAAW,AAAC,GAAQ,CACxB,KAAM,GAAS,mCACT,EAAM,EAAI,QAAQ,QAAS,QAC3B,EAAY,KAAK,MAAM,KAAK,MAAQ,KACpC,EAAc,GAAI,EAAS,EAAM,GACvC,MAAO,CAAE,YAAW,aAAc,IAGpC,GAAI,IAAa,mCACb,GAAc,+BAGlB,AAAI,GAAW,QAAQ,cAAgB,IACrC,IAAa,oCAEf,AAAI,GAAY,QAAQ,cAAgB,IACtC,IAAc,oCAGT,KAAM,IAAW,GAAM,OAAO,CAEnC,QAAS,GACT,QAAS,IACT,iBAAiB,EAAQ,CACvB,MAAOF,IAAG,UAAU,IAEtB,KAAM,CACJ,EAAG,KAGM,GAAY,GAAM,OAAO,CAEpC,QAAS,GACT,QAAS,IACT,iBAAiB,EAAQ,CACvB,MAAOA,IAAG,UAAU,IAEtB,KAAM,CACJ,EAAG,KAGP,YAAsB,EAAY,CAChC,EAAW,aAAa,QAAQ,IAC9B,AAAC,GAAW,CAEV,KAAM,GAEF,GAAS,EAAO,QAAU,EAAO,KAC/B,EAAM,SACP,GADO,CAGV,OAAQ,YAAK,EAAO,QAAZ,CAAoB,SAAU,QAAU,KAGlD,MAAO,UAAK,GAAL,CAAU,gBAAiB,MAEpC,AAAC,GACC,SAAQ,MAAM,GACP,OAGX,EAAW,aAAa,SAAS,IAC/B,AAAC,GAAa,EACd,AAAC,GACC,SAAQ,MAAM,GACP,OAKb,GAAa,IACb,GAAa,IC3Eb,OAAkB,CAChB,YAAY,EAAiB,EAAQ,CACnC,KAAK,OAAS,EACd,KAAK,gBAAkB,EACvB,KAAK,IAAM,UAGP,QAAQ,OACZ,KAAM,GAAM,KAAM,MAAK,SACvB,MAAO,CACL,QAAS,kBAAK,UAAW,KAAO,MAAI,OAAJ,cAAU,QAAS,IACnD,OAAQ,iBAAK,OACb,KAAM,kBAAK,OAAQ,EAAI,KAAK,KAC5B,KAAM,kBAAK,OAAQ,EAAI,KAAK,KAC5B,IAAK,kBAAK,OAAQ,EAAI,KAAK,SAAW,EAAI,KAAK,SAAS,GAAK,SAI3D,SAAS,CACb,YAAK,IAAM,KAAK,KAAQ,KAAM,MAAK,gBAC5B,KAAK,SAGR,OAAO,CACX,KAAM,GAAM,KAAM,MAAK,SACvB,GAAI,GAAO,KACX,MACE,KAAQ,MACR,EAAI,SAAW,KACf,EAAI,KAAK,OAAS,KAClB,EAAI,KAAK,MAET,GAAO,EAAI,KAAK,MAEX,GC9BJ,KAAM,IAAS,CACpB,QAAQ,EAAQ,CACd,KAAM,GAAW,GAAS,IAAI,eAAgB,CAAE,WAChD,MAAO,IAAI,GAAY,IAOzB,UAAU,EAAQ,CAChB,KAAM,GAAW,GAAS,IAAI,UAAW,CAAE,WAC3C,MAAO,IAAI,GAAY,IAEzB,YAAa,CACX,KAAM,GAAW,GAAS,IAAI,eAC9B,MAAO,IAAI,GAAY,IAEzB,iBAAiB,EAAQ,CACvB,KAAM,GAAW,GAAS,IAAI,iBAAkB,CAAE,WAClD,MAAO,IAAI,GAAY,IAGzB,eAAe,EAAQ,CACrB,KAAM,GAAW,GAAS,IAAI,oBAAqB,CAAE,WACrD,MAAO,IAAI,GAAY,IAGzB,aAAa,EAAQ,CACnB,KAAM,GAAW,GAAS,IAAI,qBAAsB,CAAE,WACtD,MAAO,IAAI,GAAY,IAGzB,YAAY,EAAQ,CAClB,KAAM,GAAO,GAAI,UACjB,EAAK,OAAO,MAAO,EAAO,KAC1B,EAAK,OAAO,UAAW,EAAO,SAC1B,EAAO,KAAK,EAAK,OAAO,MAAO,EAAO,KACtC,EAAO,KAAK,EAAK,OAAO,cAAe,EAAO,KAClD,KAAM,GAAW,GAAS,KAAK,gBAAiB,GAChD,MAAO,IAAI,GAAY,IAGzB,UAAU,EAAQ,CAChB,KAAM,GAAW,GAAS,IAAI,aAAc,CAAE,WAC9C,MAAO,IAAI,GAAY,IAEzB,cAAc,EAAQ,CACpB,KAAM,GAAW,GAAS,IAAI,qBAAsB,CAAE,WACtD,MAAO,IAAI,GAAY,KAKd,GAAgB,CAW3B,OAAO,EAAQ,CACb,KAAM,GAAW,GAAS,IAAI,SAAU,CAAE,WAC1C,MAAO,IAAI,GAAY,IAezB,YAAY,EAAQ,CAClB,KAAM,GAAW,GAAS,IAAI,aAAc,CAAE,WAC9C,MAAO,IAAI,GAAY,KAKd,GAAY,CACvB,oBAAoB,EAAI,CACtB,KAAM,GAAW,GAAU,IAAI,kBAAmB,CAAE,OAAQ,CAAE,IAAK,KACnE,MAAO,IAAI,GAAY,IAGzB,iBAAiB,EAAQ,CACvB,KAAM,GAAW,GAAS,IAAI,aAAc,CAAE,WAC9C,MAAO,IAAI,GAAY,IAGzB,cAAc,EAAQ,CACpB,KAAM,GAAW,GAAS,IAAI,eAAgB,CAAE,WAChD,MAAO,IAAI,GAAY,IAGzB,kBAAkB,EAAQ,CACxB,KAAM,GAAW,GAAS,IAAI,0BAA2B,CAAE,WAC3D,MAAO,IAAI,GAAY,IAIzB,WAAW,EAAQ,CACjB,KAAM,GAAO,GAAI,UACjB,EAAK,OAAO,MAAO,EAAO,KAC1B,EAAK,OAAO,QAAS,EAAO,KAC5B,EAAK,OAAO,UAAW,EAAO,OAC9B,EAAK,OAAO,UAAW,EAAO,SAC1B,EAAO,IAAI,EAAK,OAAO,MAAO,EAAO,IACzC,KAAM,GAAW,GAAS,KAAK,gBAAiB,GAChD,MAAO,IAAI,GAAY,IAEzB,eAAe,EAAI,CACjB,KAAM,GAAW,GAAU,IAAI,uBAAwB,CACrD,OAAQ,CAAE,IAAK,KAEjB,MAAO,IAAI,GAAY,KAKd,GAAY,CACvB,YAAY,EAAM,CAChB,KAAM,GAAW,GAAU,IAAI,wBAAyB,CACtD,OAAQ,CAAE,IAAK,KAEjB,MAAO,IAAI,GAAY,IAEzB,kBAAkB,EAAM,CACtB,KAAM,GAAW,GAAU,IAAI,6BAA8B,CAC3D,OAAQ,CAAE,KAAM,KAElB,MAAO,IAAI,GAAY,SAEnB,aAAY,EAAM,EAAM,CAC5B,KAAM,GAAO,GAAI,UACjB,EAAK,OAAO,SAAU,EAAM,GAE5B,KAAM,GAAW,GAAU,KAAK,gBAAiB,EAAM,CACrD,QAAS,CAAE,eAAgB,yBAE7B,MAAO,IAAI,GAAY,IAEzB,eAAgB,CACd,KAAM,GAAW,GAAU,IAAI,2BAC/B,MAAO,IAAI,GAAY,IAEzB,mBAAmB,EAAQ,CACzB,KAAM,GAAW,GAAU,IAAI,6BAA8B,CAC3D,WAEF,MAAO,IAAI,GAAY,KAKd,GAAU,CACrB,OAAQ,CACN,KAAM,GAAW,GAAU,IAAI,aAC/B,MAAO,IAAI,GAAY,IAEzB,QAAS,CACP,KAAM,GAAW,GAAU,IAAI,cAC/B,MAAO,IAAI,GAAY,IAEzB,kBAAmB,CACjB,KAAM,GAAW,GAAU,IAAI,kBAC/B,MAAO,IAAI,GAAY,IAEzB,iBAAiB,EAAI,CACnB,KAAM,GAAW,GAAU,IAAI,eAAgB,CAAE,OAAQ,CAAE,IAAK,KAChE,MAAO,IAAI,GAAY,IAEzB,iBAAiB,EAAI,CACnB,KAAM,GAAW,GAAU,IAAI,sBAAuB,CACpD,OAAQ,CAAE,IAAK,KAEjB,MAAO,IAAI,GAAY,IAEzB,WAAY,CACV,KAAM,GAAW,GAAS,IAAI,YAC9B,MAAO,IAAI,GAAY,IAEzB,gBAAgB,EAAQ,CACtB,KAAM,GAAW,GAAS,IAAI,aAAc,CAC1C,WAEF,MAAO,IAAI,GAAY,IAEzB,YAAY,EAAI,CACd,KAAM,GAAW,GAAS,IAAI,aAAc,CAC1C,OAAQ,CAAE,KAAM,KAElB,MAAO,IAAI,GAAY,IAEzB,kBAAkB,EAAQ,CACxB,KAAM,GAAW,GAAS,IAAI,eAAgB,CAC5C,WAEF,MAAO,IAAI,GAAY,KCpNrB,GAAa,GAGnB,OAAO,WAAa,GAKpB,YAAqB,EAAS,CAC5B,MAAO,AAAC,IAAW,CACjB,GAAI,GACJ,MAAI,KAAW,QAAa,EAAO,KAAO,OACnC,IAAW,EAAO,KACrB,IAAW,EAAO,IAAM,EAAQ,IAElC,EAAgB,GAAW,EAAO,KAElC,EAAgB,EAAQ,GAEnB,GCZI,YAAyB,EAAQ,CAC9C,MAAO,IAAY,IAAM,CACvB,KAAM,GAAQ,EAAI,IAEZ,EAAY,EAAI,GAEhB,EAAW,EAAI,EAAO,UAAY,IAClC,EAAQ,EAAI,IACZ,EAAU,EAAI,IACd,EAAW,EAAI,IACf,EAAa,EAAI,IACjB,EAAW,EAAI,IAErB,iBAAoB,EAAQ,EAAS,GAAI,CACvC,KAAM,GAAe,SAChB,GADgB,CAGjB,UAAW,MAWf,GADI,EAAS,OACT,EAAQ,MAAO,OAEnB,EAAQ,MAAQ,GAChB,EAAU,OAAS,EAEnB,KAAM,GAAY,KAAK,MAAQ,EACzB,EAAO,KAAM,GAChB,UAAU,IACT,SAAU,EAAS,MACnB,KAAM,EAAU,OACb,IAEJ,OAEH,GAAI,IAAS,KACX,GAAI,GAAQ,GAAO,CACjB,KAAM,GACJ,MAAO,GAAO,YAAe,WACzB,EAAO,WAAW,GAAQ,IAC1B,GAAQ,GACd,EAAU,MAAQ,EAClB,EAAW,MAAQ,EAAQ,OAC3B,EAAM,MAAQ,EACd,EAAM,MAAQ,CAAC,EAAM,MAAM,OAC3B,EAAS,MAAQ,GACjB,EAAS,MAAQ,OACZ,CACL,GAAI,CAAC,EAAK,QAAS,CACjB,EAAS,MAAQ,GACjB,EAAS,MAAQ,GACjB,OAEF,KAAM,GACJ,MAAO,GAAO,YAAe,WACzB,EAAO,WAAW,EAAK,SAAW,IAClC,EAAK,SAAW,GACtB,EAAU,MAAQ,EAAK,KACvB,EAAW,MAAQ,EAAK,WACxB,EAAM,MAAQ,CAAC,GAAG,EAAM,MAAO,GAAG,GAClC,EAAM,MAAQ,CAAC,EAAM,MAAM,OAG3B,EAAS,MAAQ,GAGrB,KAAM,GAAW,KAAK,MAAQ,EAAI,EAC5B,EACJ,EAAW,EAAa,UACpB,EACA,EAAa,UAAY,EAE/B,AAAI,EAAQ,EACV,WAAW,IAAM,CACf,EAAQ,MAAQ,IACf,GAEH,EAAQ,MAAQ,GAIpB,YAAiB,CACf,EAAU,MAAQ,EAClB,EAAM,MAAQ,GACd,EAAQ,MAAQ,GAChB,EAAS,MAAQ,GACjB,EAAM,MAAQ,GACd,EAAW,MAAQ,GACnB,EAAS,MAAQ,GAGnB,WAAgB,EAAQ,EAAO,EAAM,CACnC,EAAU,MAAQ,EAClB,EAAS,MAAQ,EACjB,EAAM,MAAQ,CAAC,GAAG,GAClB,EAAW,MAAQ,EAAM,OACzB,EAAM,MAAQ,CAAC,EAAM,OACrB,EAAS,MAAQ,GACjB,EAAS,MAAQ,GAGnB,MAAO,CACL,QACA,YACA,WACA,aACA,OAAQ,GAAS,CACf,UACA,WACA,QACA,aAEF,QAAS,CACP,OACA,QACA,aC3HO,YAA2B,EAAQ,CAChD,MAAO,IAAY,IAAM,CACvB,KAAM,GAAQ,EAAI,IACZ,EAAQ,EAAI,IACZ,EAAU,EAAI,IACd,EAAW,EAAI,IACf,EAAW,EAAI,IACf,EAAU,GAAW,CAAC,WAC5B,iBAAoB,EAAQ,EAAS,GAAI,CACvC,KAAM,GAAe,SAChB,GADgB,CAGjB,UAAW,MAOf,GADI,EAAS,OACT,EAAQ,MAAO,OAEnB,EAAQ,MAAQ,GAEhB,KAAM,GAAY,KAAK,MAAQ,EAEzB,EAAO,IAAM,CACjB,KAAM,GAAI,GACJ,EAAY,mBAClB,OAAS,GAAI,EAAG,EAAI,GAAI,IACtB,EAAE,GAAK,EAAU,OAAO,KAAK,MAAM,KAAK,SAAW,IAAO,GAE5D,SAAE,IAAM,IACR,EAAE,IAAM,EAAU,OAAQ,EAAE,IAAM,EAAO,EAAK,GAC9C,EAAE,GAAK,EAAE,IAAM,EAAE,IAAM,EAAE,IAAM,IAElB,EAAE,KAAK,KAGtB,GAAI,GAAU,aAAa,QAAQ,UACnC,AAAI,SAAS,aACX,EAAU,SAAS,KAAK,OACd,GACV,GAAU,KAEZ,aAAa,QAAQ,SAAU,GAC/B,EAAQ,IAAI,SAAU,GAOtB,KAAM,GAAO,KAAM,GAChB,UAAU,IACT,KAAM,GACH,IAEJ,OAEH,GAAI,CAAC,EAAM,CACT,EAAS,MAAQ,GACjB,EAAS,MAAQ,GACjB,OAEF,KAAM,GACJ,MAAO,GAAO,YAAe,WACzB,EAAO,WAAW,GAAQ,IAC1B,GAAQ,GACd,EAAM,MAAQ,CAAC,GAAG,EAAM,MAAO,GAAG,GAClC,EAAM,MAAQ,CAAC,EAAM,MAAM,OAC3B,EAAS,MAAQ,GAEjB,KAAM,GAAW,KAAK,MAAQ,EAAI,EAC5B,EACJ,EAAW,EAAa,UACpB,EACA,EAAa,UAAY,EAE/B,AAAI,EAAQ,EACV,WAAW,IAAM,CACf,EAAQ,MAAQ,IACf,GAEH,EAAQ,MAAQ,GAIpB,YAAiB,CACf,EAAM,MAAQ,GACd,EAAQ,MAAQ,GAChB,EAAS,MAAQ,GACjB,EAAM,MAAQ,GACd,EAAS,MAAQ,GAGnB,WAAgB,EAAQ,CACtB,EAAM,MAAQ,CAAC,GACf,EAAM,MAAQ,CAAC,EAAM,OACrB,EAAS,MAAQ,GACjB,EAAS,MAAQ,GAGnB,MAAO,CACL,QACA,OAAQ,GAAS,CACf,UACA,WACA,QACA,aAEF,QAAS,CACP,OACA,QACA,aCvHD,YAAiB,EAAO,CAC7B,MAAO,GAAQ,EAAM,WAAa,GAG7B,YAAc,EAAO,CAC1B,MAAO,IAAS,EAIX,YAAe,EAAO,CAC3B,MAAI,OAAO,IAAU,UACZ,EAEL,EAAQ,GAAM,ECXL,QAAuB,OAC7B,UAAS,EAAM,CACpB,KAAM,GAAQ,GAAI,IAClB,SAAM,KAAOG,GAAU,EAAK,MAC5B,EAAM,MAAQ,EAAM,QAChB,GAAG,EAAK,iBAAiB,EAAK,MAAM,OAClC,EAAK,MAAM,YAAY,QAEzB,EAAK,MAEL,EAAK,QAAQ,GAAM,OAAS,EAAK,QAErC,EAAM,KAAO,EAAK,KAAO,KAAK,MAAM,EAAK,MAAQ,GAE7C,EAAM,KAAK,cAAgB,QAC7B,GAAM,iBACJ,EAAM,MAAM,OAAS,EACjB,wBACA,yBAGJ,EAAK,KACP,GAAM,IAAMA,GAAU,EAAK,MAEtB,KAGL,UAAU,CACZ,MAAO,MAAK,OAAS,WAGnB,SAAS,CACX,MAAO,MAAK,OAAS,UAGnB,SAAS,CACX,MAAO,MAAK,OAAS,UAGnB,UAAU,CACZ,MAAO,MAAK,OAAS,WAGnB,WAAW,CACb,MAAO,MAAK,OAAS,YAGnB,cAAc,CAChB,MAAO,MAAK,KAAK,GAAK,KAAK,QAAU;AAAA,GC/C1B,QAAkB,OACxB,UAAS,EAAM,CACpB,KAAM,GAAQ,GAAI,IAElB,EAAM,GAAKA,GAAU,EAAK,KAAO,EAAK,KAGtC,EAAM,IAAMA,GAAU,EAAK,KAG3B,EAAM,MAAQA,GAAU,EAAK,OAG7B,EAAM,MAAQA,GAAU,EAAK,SAG7B,EAAM,OAASA,GAAU,EAAK,QAG9B,EAAM,YAAcA,GAAU,EAAK,aAGnC,EAAM,UAAYA,GAAU,EAAK,UAGjC,EAAM,QAAU,KAAK,MAAMA,GAAU,EAAK,UAG1C,EAAM,SAAWC,GAAO,EAAK,SAG7B,EAAM,aAAeC,GAAQ,EAAK,cAGlC,EAAM,QAAUD,GAAO,EAAK,SAG5B,EAAM,MAAQA,GAAO,EAAK,OAG1B,EAAM,KAAOD,GAAU,EAAK,MAG5B,EAAM,MAAQA,GAAU,EAAK,OAG7B,EAAM,WAAaC,GAAO,EAAK,YAAc,EAAK,UAIlD,EAAM,YAAcD,GAAU,EAAK,aACnC,EAAM,SAAWA,GAAU,EAAK,UAChC,EAAM,SAAWA,GAAU,EAAK,UAGhC,EAAM,UAAYA,GAAU,EAAK,WAGjC,EAAM,OAASE,GAAQ,EAAK,QAG5B,EAAM,KAAOF,GAAU,EAAK,MAG5B,EAAM,KAAOA,GAAU,EAAK,MAG5B,EAAM,IAAMA,GAAU,EAAK,KAG3B,EAAM,OAASC,GAAO,EAAK,gBAAkB,EAI7C,KAAM,GAAQ,OAAO,SAAS,KAAK,QAAQ,QAAU,GAAK,KAAO,KACjE,SAAM,KAAO,EAAM,QAAU,EAG7B,EAAM,SAAWA,GAAO,EAAK,UAAY,GAGzC,EAAM,OAAS,GACX,EAAK,OACP,EAAK,MAAM,QAAQ,AAAC,GAAM,CACxB,EAAM,OAAO,KAAK,GAAY,SAAS,MAK3C,EAAM,MAAQA,GAAO,EAAK,gBAI1B,EAAM,iBAAmBD,GAAU,EAAK,eACxC,EAAM,mBAAqBA,GAAU,EAAK,eAE1C,EAAM,iBAAmBA,GAAU,EAAK,UACxC,EAAM,oBAAsBA,GAAU,EAAK,YAC3C,EAAM,kBAAoBA,GAAU,EAAK,aACzC,EAAM,WAAa,EAAM,oBAAsB,EAAM,kBAGrD,EAAM,YAAc,EAAK,YAAc,EAAK,YAAc,KAa1D,EAAM,SAAW,GAEjB,EAAM,SAAW,EAAK,gBAAkB,GAExC,EAAM,WAAa,MAAM,QAAQ,EAAK,YAClC,EAAK,WAAW,GAChB,EAAK,WAET,EAAM,gBAAkB,EAAK,gBACtB,KAIL,OAAO,CACT,MAAO,MAAK,aAAa,OAAO,AAAC,GAAM,EAAE,WAIvC,SAAS,CACX,MAAO,MAAK,aAAa,OAAO,AAAC,GAAM,EAAE,YAIvC,SAAS,CACX,MAAO,MAAK,aAAa,OAAO,AAAC,GAAM,EAAE,YAIvC,SAAS,CACX,MAAO,MAAK,aAAa,OAAO,AAAC,GAAM,EAAE,aAIvC,OAAO,CACT,MAAO,MAAK,aAAa,OAAO,AAAC,GAAM,EAAE,WAIvC,eAAe,CACjB,KAAM,GAAO,GAWb,GAAI,GAAW,GAEf,KAAM,GAAgB,GACtB,KAAK,QAAQ,QAAQ,AAAC,GAAM,CAC1B,AAAI,EAAE,OAAS,OAEb,AADe,EAAE,MAAM,MAAM,SAAS,OAAO,AAAC,GAAU,IAAU,IAC3D,QAAQ,AAAC,GAAU,CACxB,EAAc,KAAK,SAAK,GAAL,CAAQ,aAG7B,EAAc,KAAK,KAGvB,OAAS,GAAI,EAAG,EAAI,EAAc,OAAQ,GAAK,EAAG,CAChD,KAAM,GAAI,EAAc,GAClB,EAAY,GAAiB,SAAS,GAK5C,GAJI,EAAU,OAAS,QAAU,CAAC,EAAU,aAC1C,EAAS,KAAK,GAId,EAAS,QACR,GAAU,OAAS,QAClB,IAAM,EAAc,OAAS,GAC7B,EAAU,aACZ,CACA,GAAI,GAAO,GACX,EAAS,QAAQ,AAAC,GAAO,CACvB,GAAQ,EAAG,QAEb,KAAM,GAAkB,GAAiB,SAAS,CAChD,KAAM,OACN,MAAO,EACP,OAAQ,CAAC,GAAG,KAEd,EAAW,GACX,EAAK,KAAK,GAIZ,AACG,GAAU,OAAS,QAAU,EAAU,cACvC,OAAO,GAAU,OAAU,UAC1B,EAAU,KAAK,aACf,EAAU,QAEZ,EAAK,KAAK,GAId,MAAO,IClNJ,KAAM,IAAwB,AAAC,cAAS,OAAC,CAAC,YAAK,SAAL,cAAc,KAAd,cAAkB,QAAlB,cAAyB,MAY7D,GAAkB,GAAgB,CAC7C,UAAW,GAAO,QAClB,WAAY,AAAC,GAET,EACG,IAAI,AAAC,GAAS,CACb,KAAM,GAAc,GAAY,SAAS,GACzC,GAAI,CACF,MAAO,SACA,EAAP,CACA,QAAQ,MAAM,GAEhB,MAAO,KAGR,OAAO,MAKH,GAAmB,GAAgB,CAC9C,UAAW,GAAO,iBAClB,WAAY,AAAC,GAET,EACG,IAAI,AAAC,GAAS,CACb,KAAM,GAAc,GAAY,SAAS,GACzC,GAAI,CACF,MAAO,SACA,EAAP,CACA,QAAQ,MAAM,GAEhB,MAAO,KAGR,OAAO,MAQH,GAAgB,GAAkB,CAC7C,UAAW,GAAO,UAClB,WAAY,AAAC,GAIT,EACG,IAAI,AAAC,GAAS,CACb,KAAM,GAAc,GAAY,SAAS,GACzC,GAAI,CACF,MAAO,SACA,EAAP,CACA,QAAQ,MAAM,GAEhB,MAAO,KAGR,OAAO,MAKH,GAAe,GAAY,IAAM,CAC5C,KAAM,GAAU,EAAI,IACd,EAAQ,EAAI,IAElB,kBAAsB,CACpB,EAAM,MAAQ,KAAM,IAAO,aAAa,OAExC,EAAQ,MAAQ,GAGlB,MAAO,CACL,UACA,QACA,UAED,CAAE,GAAI,YAKI,GAAqB,GAAY,IAAM,CAClD,KAAM,GAAU,EAAI,IACd,EAAS,EAAI,IACb,EAAQ,EAAI,IAClB,kBAAwB,CAEtB,KAAM,GAAO,KAAM,IAChB,UAAU,CACT,MAAO,OAAO,SAAS,KAAK,QAAQ,QAAU,GAAK,GAAK,KAEzD,OACH,MAAI,GACK,EAAK,IAAI,AAAC,GAAM,CACrB,KAAM,GAAI,GAAY,SAAS,GAC/B,SAAE,KAAO,GACF,IAGJ,GAGT,kBAAuB,CACrB,MAAK,GAAM,MAAM,QACf,GAAM,MAAQ,KAAM,MAEtB,QAAQ,IAAI,eAAgB,CAAC,GAAG,EAAM,QAC/B,EAAM,MAAM,OAAO,EAAG,GAAG,GAGlC,MAAO,CACL,UACA,SACA,QACA,WAED,CAAE,GAAI,kBAeI,GAAc,GAAY,IAAM,CAI3C,KAAM,GAAc,EAAI,IAMlB,EAAiB,EAAI,IAIrB,EAAa,EAAI,MAEjB,EAAc,EAAI,MAExB,WAAwB,EAAG,CACzB,EAAY,MAAQ,EAGtB,WAAuB,EAAG,CACxB,EAAW,MAAQ,EAGrB,WAAwB,EAAG,CACzB,EAAY,MAAQ,EAOtB,WAA2B,EAAG,CAC5B,EAAe,MAAQ,EAEvB,QAAQ,IAAI,oBAAqB,EAAG,CAAC,CAAC,GACtC,EAAY,MAAQ,CAAC,EAGvB,MAAO,CACL,cACA,aACA,cACA,iBACA,iBACA,iBACA,gBACA,uBAED,CAAE,GAAI,+MC3MH,GAAgB,CACpB,SAAU,IACV,OAAQ,SAAS,cAAc,SAG1B,YAAe,EAAK,EAAQ,CACjC,KAAM,GAAY,SAAS,cAAc,OACnC,EAAM,YAAK,IAAkB,GAAvB,CAA+B,QACrC,EAAK,EAAYG,GAAe,GACtC,GAAO,EAAI,GACX,EAAI,OAAO,YAAY,GAGvB,KAAM,GAAU,IAAM,CACpB,GAAI,EAAG,GAAG,cAAc,cAAe,CAErC,EAAG,GAAG,cAAc,cAAc,UAAU,IAAI,UAChD,KAAM,GAAI,WAAW,IAAM,CACzB,GAAO,KAAM,GACb,aAAa,GACb,EAAI,OAAO,YAAY,IACtB,OAGP,GAAI,EAAI,SAAU,CAChB,KAAM,GAAQ,WAAW,IAAM,CAC7B,IACA,aAAa,IACZ,EAAI,UAET,MAAO,CACL,WC7BG,KAAM,IAAS,IACb,SAAS,KAAK,OAWV,GAAc,SAClB,GAAI,SAAQ,AAAC,GAAY,CAC9B,SAAS,gBAAgB,AAAC,GAAM,CAC9B,EAAQ,OAKD,GAAe,SAAY,CACtC,KAAM,GAAO,KAAM,IAAQ,mBAAmB,OAC9C,MAAO,GAAK,SAAW,EAAK,WAAa,EAAI,IAIlC,GAAY,AAAC,GAAQ,CAChC,KAAM,GAAU,IAAO,MAAU,WACjC,GAAI,GAAS,sDACb,GAAI,EAAQ,CACV,KAAM,GAAS,GAAI,GACnB,EAAS,0CAA0C,EAAO,MACxD,EACA,MACG,EAAO,MAAM,EAAG,MAAM,EAAO,MAChC,EACA,MACG,cAAmB,KAAK,MAAM,KAAK,SAAW,OAGrD,MAAO,IAGI,GAAa,IACjB,SAAS,aAIL,GAAU,IACd,GAcI,GAAa,IACH,CAAC,KAGlBC,GAAW,qDAAqD,KACpE,UAAU,WAGC,GAAQ,IAAM,CACzB,AAAK,MACH,CAAIA,GACF,OAAO,SAAS,KAAO,6CAA6C,mBAClE,OAAO,SAAS,QAGlB,SAAS,OAAO,SAKT,GAAgB,AAAC,GAAO,CACnC,GAAI,CAAC,KAAc,CACjB,AAAIA,KAIa,QAAQ,sFACX,KAEd,OAIA,KC/FS,GAAc,CACzB,QAAS,CAAC,EAAI,IAAY,CACxB,AAAI,EAAQ,OAEV,SAAS,KAAK,CAAC,eAAgB,EAAI,EAAQ,UASpC,GAAa,CACxB,QAAS,CAAC,EAAI,IAAY,CACxB,AAAI,EAAQ,OACV,EAAG,iBAAiB,QAAS,IAAM,CAGjC,SAAS,KAAK,CAAC,mBAAoB,EAAQ,YAM7C,GACJ,iEAAiE,KAC/D,UAAU,WAqBD,GAAc,CAAC,EAAQ,EAAQ,WAAa,OACvD,KAAM,GAAS,IACb,KAAM,GACN,QAAS,GACT,IAAK,GACL,SAAU,GAAW,KAAO,MAC5B,SAAU,OAAO,SAAS,KAC1B,IAAK,KAAe,KAAW,wBAAK,SAAL,cAAa,IAAI,QAChD,UAAW,SACX,OAAQ,SAAS,UACd,GAEL,GAAI,EAAO,IACT,GAAI,GACF,EAAO,SAAW,OAAO,SAAS,aACzB,OAAO,SAAS,SAAS,QAAQ,WAAa,GAAI,CAC3D,KAAM,GAAU,GAAiB,WACjC,EAAO,SAAW,KAAK,OAAO,SAAS,wBAAwB,SAAe,EAAO,UAErF,GAAO,SAAW,KAAK,OAAO,SAAS,gBAAgB,EAAO,eAAe,EAAO,MAIxF,QAAQ,IAAI,sBAAuB,GACnC,OAAO,IAAI,KAAK,QAAS,OAAO,IAAI,EAAE,OAAQ,GAE9C,SAAS,KAAK,CAAC,mBAAoB,EAAO,KAAK,UAAU,8mBCI3D,6EAOA,yEAMAC,wiCCjFA,cACA,oDAUA,uJAKA,0GAKA,6GAOA,oCAEA,kCACA,wSAiBA,wEASA,WAeA,8MCvFA,OAAe,CAAC,EAAK,IAAU,CAC7B,SAAW,CAAC,EAAK,IAAQ,GACvB,EAAI,GAAO,EAEb,MAAO,ICOT,81DCoCA,y6BCMA,0DAOA,qCAIA,qBAKA,wVClEO,YAAmB,EAAW,CACnC,KAAM,GAAW,GAAO,aAElB,EAAS,EAAI,IAEnB,iBAAuB,EAAM,CAC3B,GAAI,EAAO,MAAO,OAClB,EAAO,MAAQ,GAEf,KAAM,GAAM,GAAU,oBAAoB,EAAK,IACzC,EAAS,KAAM,GAAI,QAEzB,GAAI,EAAO,QAAS,CAClB,KAAM,GAAI,KAAM,GAAI,OAEpB,EAAK,SAAW,EAAE,WAGlB,EAAK,aAAe,EAAE,eAAiB,EAEvC,KAAM,GAAI,CACR,OAAQ,EACR,SAAU,EACV,IAAK,EAAK,UACV,IAAK,EAAK,GACV,SAAU,EAAK,SACf,aAAc,EAAK,cAGrB,EAAS,KAAK,cAAe,OAE7BC,IAAM,EAAO,KAGf,EAAO,MAAQ,GAGjB,GAAI,GAAoB,KACxB,WAAmD,EAAoB,CACrE,EAAoB,EAGtB,WAA+B,EAAG,CAChC,GAAI,CAAC,EAAmB,OAIxB,AAFgB,IAER,QAAQ,AAAC,GAAM,CAErB,AAAI,EAAE,WAAa,GAEf,EAAE,KAAO,EAAE,KAEb,GAAE,SAAW,EAAE,SAEf,EAAE,aAAe,EAAE,gBAKzB,SAAS,GAAG,cAAe,GAE3B,GAAY,IAAM,CAChB,EAAS,IAAI,cAAe,KAGvB,CACL,cAAe,EACf,ubCjBJ,gCAKA,qCAOA,iFAMA,sBAEA,cAKA,scCvDA,+JAwBA,wBAEA,m3CCqEA,oCAIA,kKAmBA,4KAeA,mCAIA,MAKA,uCAIA,6CAIA,kkDC5KM,GAAW,GAAU,uBAErB,GAAiB,CACrB,MAAO,OACP,QAAS,CAAE,QAAS,IACpB,QAAS,CACP,YACA,cACA,aACA,aACA,YACA,cACA,kBAEF,UAAW,IAGb,QAAa,CACX,YAAY,EAAS,CACnB,KAAM,GAAM,SAAK,IAAmB,GACpC,KAAK,QAAU,GAAI,SAAQ,EAAQ,UAAW,GAC1C,EAAI,UACN,KAAK,QAAQ,MAAM,GAAG,cAAe,IAAM,CACzC,EAAI,aAMV,sBAAuB,CACrB,KAAK,QAAQ,WAAW;AAAA,EAAM,IAIhC,UAAU,EAAK,CACb,KAAK,QAAQ,QACb,KAAK,QAAQ,WAAW,EAAK,IAM/B,YAAY,EAAK,EAAK,EAAO,EAAQ,CACnC,KAAK,QAAQ,QACb,KAAK,uBACL,KAAK,QAAQ,YAAY,EAAK,EAAK,EAAO,GAC1C,KAAK,4BAGD,aAAY,EAAS,EAAK,CAC9B,GAAI,GAAW,EACb,KAAK,QAAQ,QACb,KAAK,QAAQ,YAAY,EAAS,OAC7B,CACL,KAAM,GAAM,OAAO,oHAInB,GAHA,KAAK,QAAQ,QAGT,CAAC,EAAK,OACV,GAAI,EAAI,QAAQ,iBAAmB,GAAI,CACrC,KAAM,GAAY,KAAM,IAAU,kBAAkB,GAAK,OACzD,KAAK,QAAQ,YAAY,EAAU,GAAI,EAAU,KAAO,OACnD,AAAI,GAAI,QAAQ,yBAA2B,GAChD,KAAK,QAAQ,aAAa,GAE1B,MAAM,iJAGV,KAAK,4BAMD,aAAa,CACjB,KAAM,GAAO,OAAO,OAAO,kCAC3B,GAAI,EAAM,CACR,KAAM,GAAW,KAAM,IAAU,YAAY,GAAM,OAC7C,EAAQ,EAAW,EAAS,MAAQ,EAC1C,KAAK,QAAQ,QACb,KAAK,QAAQ,WAAW,EAAM,EAAO,IACrC,KAAK,wBAIT,mBAAoB,CAClB,KAAK,QAAQ,oBAGf,iBAAkB,CAChB,KAAK,QAAQ,UAGf,cAAe,CACb,KAAK,QAAQ,OAGf,aAAc,CACZ,KAAK,QAAQ,cAGf,aAAa,EAAU,CACrB,KAAK,QAAQ,aAAa,MAGxB,WAAW,CACb,MAAO,MAAK,UAAU,KAAK,QAAQ,aAGjC,SAAS,CACX,MAAO,MAAK,QAAQ,MAAM,UAAU,OAGtC,OAAQ,CACN,KAAK,QAAQ,MAAM,ygBCwCvB,MACA,gEAUA,iMA2BA,2XAuCA,gyDAqMA,0HAeA,iBAEA,8zFC5XA,YAEA,aAEA,+DASA,0dAyDA,2JAWA,wtBChGA;+3FCmGA,YAEA,6HAmBA,8BAIA,8ZAwCA,6OAqBA,6EAQA,SACA,ycA4CA,0QAoBA,wBAGA,uCACA,+tECtTa,GAAmB,GAAgB,CAC9C,UAAW,GAAO,eAClB,WAAY,AAAC,GACJ,EAAM,IAAI,AAAC,GAAS,CACzB,KAAM,GAAc,GAAY,SAAS,GACzC,GAAI,CACF,MAAO,SACA,EAAP,CACA,QAAQ,MAAM,GAEhB,MAAO,oTC4Bb,wDAIA,mBAEA,yCAGA,wZCpDiD,YAA2B,EAAW,CACrF,KAAM,GAAW,GAAO,aAExB,WAAc,EAAM,CAClB,KAAM,GAAI,CACR,OAAQ,EACR,SAAU,EACV,IAAK,EAAK,UACV,IAAK,EAAK,GACV,QAAS,EAAK,SAGhB,EAAS,KAAK,iBAAkB,GAGlC,GAAI,GAAoB,KACxB,WAAoD,EAAoB,CACtE,EAAoB,EAGtB,WAAiB,EAAG,CAClB,GAAI,CAAC,EAAmB,OAIxB,AAFgB,IAER,QAAQ,AAAC,GAAM,CAErB,AAAI,EAAE,WAAa,GAEf,EAAE,KAAO,EAAE,KAEb,GAAE,QAAU,EAAE,QAEd,EAAE,aAAe,EAAE,gBAKzB,SAAS,GAAG,iBAAkB,GAE9B,GAAY,IAAM,CAChB,EAAS,IAAI,iBAAkB,KAG1B,CACL,OACA,iXCCJ,oCAIA,mBAEA,oDASA,0dC5DA,GAAQ,YAAY,QAAS,CAC3B,KAAM,eACN,MAAO,eACP,eAAgB,2BAChB,SAAU,eACV,iBAAkB,2BAClB,cAAe,iCACf,KAAM,eACN,OAAQ,2BACR,SAAU,eACV,WAAY,eACZ,kBAAmB,2BACnB,qBAAsB,qBACtB,0BAA2B,iCAC3B,KAAM,eACN,OAAQ,2BACR,gBAAiB,2BACjB,UAAW,eACX,gBAAiB,2BACjB,SAAU,2BACV,eAAgB,uCAChB,SAAU,2BACV,qBAAsB,2BACtB,aAAc,eACd,mBAAoB,2BACpB,cAAe,eACf,iCAAkC,6CAClC,8DACE,6FACF,qHACE,mJACF,8HACE,yMACF,iDAAkD,2EAClD,oEACE,qEACF,aAAc,2BACd,MAAO,eACP,eAAgB,eAChB,yBAA0B,uCAC1B,sFACE,wHACF,mCAAoC,qDACpC,oCAAqC,qDACrC,uCAAwC,qDACxC,aAAc,iBACd,oBAAqB,2BACrB,eAAgB,iCAChB,eAAgB,iCAChB,OAAQ,2BACR,eAAgB,qBAChB,eAAgB,eAChB,qBAAsB,2BACtB,wBAAyB,2BACzB,KAAM,eACN,MAAO,SACP,MAAO,SACP,IAAK,SACL,MAAO,SACP,KAAM,SACN,OAAQ,SACR,QAAS,eACT,KAAM,SACN,WAAY,eACZ,OAAQ,eACR,YAAa,eACb,mBAAoB,qBACpB,OAAQ,qBACR,YAAa,2BACb,kBAAmB,uCACnB,KAAM,SACN,OAAQ,eACR,UAAW,eACX,QAAS,eACT,WAAY,qBACZ,cAAe,qBACf,0BAA2B,iCAC3B,uBAAwB,uCACxB,qBAAsB,2BACtB,kBAAmB,iCACnB,OAAQ,eACR,OAAQ,qBACR,aAAc,uCACd,MAAO,eACP,6CAA8C,+DAC9C,KAAM,eACN,0BAA2B,uCAC3B,uEACE,qHACF,wBAAyB,uCACzB,sCAAuC,2EACvC,uCAAwC,2EACxC,oDAAqD,UACrD,kBAAmB,qCACnB,aAAc,qBACd,MAAO,eACP,QAAS,2BACT,kBAAmB,2BACnB,0BAA2B,uCAC3B,2BAA4B,0BAC5B,4BAA6B,4BCtGxB,KAAM,GAAI,CACf,yBAAM,CACJ,KAAM,iCACN,MAAO,CACL,2CAAS,6CACT,yBAAM,2BACN,yBAAM,2BACN,2CAAS,6CACT,iDAAU,qDAGd,MAAO,CACL,KAAM,iCACN,MAAO,CACL,MAAO,2BACP,KAAM,2BACN,MAAO,2BACP,OAAQ,2BACR,SAAU,2BACV,OAAQ,iBACR,QAAS,kBACT,gBAAiB,uCACjB,iBAAkB,uCAClB,eAAgB,uCAChB,iBAAkB,yCAGtB,GAAI,CACF,KAAM,eACN,MAAO,CACL,QAAS,2BACT,OAAQ,6BACR,QAAS,8BACT,MAAO,2BACP,MAAO,6BAGX,MAAO,CACL,KAAM,2BACN,MAAO,CACL,QAAS,uCACT,MAAO,uCACP,MAAO,yCAGX,KAAM,CACJ,KAAM,2BACN,MAAO,CACL,QAAS,uCACT,MAAO,yCAGX,QAAS,CACP,KAAM,iCACN,MAAO,CACL,QAAS,6CACT,SAAU,qEACV,YAAa,qEACb,MAAO,+CAGX,IAAK,CACH,KAAM,6BACN,MAAO,CACL,OAAQ,iBACR,cAAe,6BAGnB,aAAc,6KCvChB,oTC3BO,YAA2B,EAAI,CACpC,QAAQ,IAAI,qBAAsB,GAClCA,GAAM,sKAAgC,CACpC,OAAQ,SAAS,cAAc,UAAU,OCE9B,YAAiB,EAAO,CACrC,KAAM,GAAW,EAAI,MACf,EAAY,EAAI,GAChB,EAAc,EAAI,MAClB,EAAU,EAAI,MACd,EAAc,EAAI,MAClB,EAAY,KACZ,EAAc,EAAI,IAKlB,EAAW,AAAC,GACZ,OAAO,SACF,OAAO,SAAS,KAAK,AAAC,GACvB,MAAM,QAAQ,EAAK,KACd,EAAK,IAAI,SAAS,OAAO,IAE3B,EAAK,MAAQ,GAGjB,KAGH,EAAoB,IAAM,CAC9B,AAAI,EAAY,QAAU,IAAS,EAAS,OAC1C,IAAY,CACV,QAAS,EAAY,MACrB,IAAK,EAAY,MAAM,IACvB,KAAM,EAAE,KAAK,KACb,KAAM,EAAE,KAAK,MAAM,UAErB,EAAY,MAAQ,KAIlB,EAAkB,IAAM,CAC5B,GAAY,CACV,QAAS,EAAY,MACrB,IAAK,EAAY,MAAM,IACvB,KAAM,EAAE,KAAK,KACb,KAAM,EAAE,KAAK,MAAM,SAIjB,EAAY,IAAM,CACtB,EAAY,MAAQ,GACpB,EAAS,MAAQ,KACjB,EAAQ,MAAQ,MAGZ,EAAiB,IAAM,CAC3B,QAAQ,IAAI,iBAAkB,EAAU,MAAO,GAC/C,AAAI,EAAU,OAAS,EACrB,EAAS,MAAQ,EAAS,EAAQ,OAElC,EAAS,MAAQ,KAEnB,IACA,EAAM,WAAY,CAAC,CAAC,EAAS,QAGzB,EAAkB,IAAM,CAC5B,EAAU,MAAQ,SAAS,cAAc,gBAAgB,aAGrD,EAAgB,IAAM,CAC1B,aAAa,EAAY,OACzB,EAAY,MAAQ,WAAW,IAAM,CACnC,IACA,QAAQ,IAAI,gBAAiB,EAAU,OACvC,KACC,MAGC,EAAe,CAAC,EAAS,IAAQ,CACrC,AAAI,IAAQ,EAAQ,OAClB,SAAQ,IAAI,eAAgB,EAAS,EAAK,EAAQ,OAClD,EAAQ,MAAQ,EAChB,EAAY,MAAQ,EACpB,MAIJ,UAAU,IAAM,CACd,IACA,OAAO,iBAAiB,SAAU,EAAe,MAEnD,GAAY,IAAM,CAChB,aAAa,EAAY,OACzB,OAAO,oBAAoB,SAAU,EAAe,MAG/C,CACL,WACA,eACA,oBACA,kBACA,+3CC6OJD,mBAmCA,iLAeA,WAEA,gpBA+CA,uIAUA,ySAmBA,wDAOA,kbA2CA,iDAaA,mCAQA,+EAYA,4IA2CA,sFAQA,umBA6FA,gCAOA,0DAaA,iFAOA,2BAIA,2BAIA,yDAIA,uXAgCA,yBAIA,oHAiBA,oBASA,wPAwBA,s1CA4IA,wGAQA,4HAMA,qTAwBA,mFAEA,qCAGA,cAKA,qEAEA,eAIA,gKAiBA,sJAiBA,wnLCvhCA,GAAI,IAAW,GACR,YAA6B,EAAM,EAAW,CAEnD,KAAM,CAAE,QAAO,UAAW,EAIpB,CAAE,SAAU,GAoClB,kBAAoC,CAElC,GADA,QAAQ,IAAI,yCAA0C,IAClD,CAAC,EAAM,OAAS,CAAC,EAAM,MAAM,QAAU,GACzC,OAoBF,GAAI,GACJ,AAAI,EAAM,MAAM,QAAU,EACxB,EAAQ,EAAM,MAAM,OAEpB,EAAS,GAAM,MAAM,OAAS,GAAK,EAGrC,KAAM,GAAO,EAAM,MAAM,OAAS,EAKlC,GAJA,QAAQ,IAAI,gCAAiC,GAIzC,GAAS,EAAG,CACd,KAAM,GAAK,KAAM,KACjB,EAAM,MAAM,OAAO,EAAO,EAAG,EAAG,GAElC,GAAI,IAAU,EAAG,CACf,KAAM,GAAK,KAAM,KACjB,EAAM,MAAM,KAAK,GAGnB,AAAI,EAAQ,GACV,IAAW,IAQb,QAAQ,IAAI,oCAAqC,EAAM,OAKzD,WAAwB,EAAO,CAG7B,KAAM,GAAO,EAAY,EAAU,MAAQ,EAC3C,MAAI,GAAQ,EAAO,EAAU,EACzB,EAAQ,EAAO,EAAU,EAAQ,EAC9B,EAAQ,EAGjB,IAeA,KAAM,GAAoB,EAAI,GAAI,MAClC,UAAQ,oBAAqB,GAEtB,CAAE,kBC5HJ,aAA6B,CAClC,KAAM,GAAW,IAEjB,WAAmB,CAAE,MAAK,OAAO,CAC/B,EAAS,MAAQ,CAAE,MAAK,OAI1B,KAAM,GAAW,GAAS,WAAM,YAAS,QAAT,cAAgB,OAAQ,OAElD,EAAsB,GAAgB,CAC1C,UAAW,AAAC,GACV,EAAS,MACL,GAAQ,gBAAgB,GACxB,GAAQ,kBAAkB,GAChC,WAAY,AAAC,GACJ,EACJ,IAAI,AAAC,GAAS,CACb,KAAM,GAAc,GAAY,SAAS,GACzC,GAAI,CACF,MAAO,SACA,EAAP,CACA,QAAQ,MAAM,GAEhB,MAAO,KAER,OAAO,MAIR,CACJ,MAAO,EACP,SACA,UACA,YACE,IACJ,EAAS,MAAQ,GAEjB,KAAM,GAAQ,EAAI,IAClB,EAAM,EAAa,IAAM,CACvB,EAAM,MAAQ,EAAY,MAAM,IAAI,AAAC,GAAS,OAE5C,SAAK,UAAY,KAAS,QAAT,cAAgB,IAC1B,MAIX,kBAAsB,OACpB,KAAM,GAAQ,KAAK,CAEjB,KAAM,KAAS,QAAT,cAAgB,MAI1B,MAAO,CACL,QACA,SACA,QAAS,SACJ,GADI,CAEP,OACA,eC5DC,aAA6B,CAClC,KAAM,GAAsB,GAAgB,CAC1C,UAAW,GAAO,cAClB,WAAY,AAAC,GACJ,EACJ,IAAI,AAAC,GAAS,CACb,KAAM,GAAc,GAAY,SAAS,GACzC,GAAI,CACF,MAAO,SACA,EAAP,CACA,QAAQ,MAAM,GAEhB,MAAO,KAER,OAAO,MAIR,CACJ,QACA,SACA,UACA,YACE,IACJ,SAAS,MAAQ,GAEV,CACL,QACA,SACA,2/CC6MJ,gCACA,wBAKA,sEAUA,uBACA,gCAGA,mCAGA,wDAMA,0HAmBA,iDAIA,yBAIA,yBAIA,mRA0BA,2kBA4EA,+EAUA,skBAyEA,yEAOA,mVAgCA,yHAeA,gDAaA,+CAMA,gDAMA,wFAYA,+IAUA,uIASA,0IAYA,oCAEA,6FAQA,YAEA,uBAEA,uHAWA,0DAiBA,qCAMA,yDAWA,qIAoBA,6/GC5lBA,4GAUA,yCACA,6lCCnFO,YAAoB,EAAK,CAE9B,iBAAoB,EAAO,CAEzB,KAAM,GAAS,KAAM,IAClB,cAAc,CAAE,IAAK,EAAI,QACzB,QACA,KAAK,AAAC,GACD,EAAI,QACC,EAAI,KAET,EAAI,OAAS,EAAE,aAEV,EAAE,aAEJ,MAEX,GAAI,IAAW,EAAE,aAEf,MAAO,GAAE,aAEX,GAAI,CAAC,EAEH,OAIF,GAAI,GAAS,EAAM,MAEnB,KAAM,GAAc,GAAY,SAAS,GAOzC,AAAI,AAJqB,EAAM,MAAM,KACnC,AAAC,GAAS,EAAK,KAAO,EAAY,KAMlC,GAAS,EAAM,MAAM,OAAO,AAAC,GAAS,EAAK,KAAO,EAAY,KAIhE,EAAM,MAAQ,CAAC,EAAa,GAAG,GAGjC,MAAO,CAAE,6CCvBX,iEAIA,WAMA,kCAIA,8JAqBA,sCASA,sCAIA,muCCpEA,0PCmBA,qIAOA,WAGA,kCAIA,0KAqBA,qKAmBA,qBAKA,sCAIA,kmCCpDA,4HAUA,WAGA,kCAIA,0LAsBA,sEAiBA,sCAIA,2vCCrFA,wDAUA,yHAkBA,sCASA,sCAIA,0nBCtDA,OAAe,MACbE,SACAC,WACAC,WACAX,gBACAY,ICFF,KAAM,IAAS,GAEf,OAAO,KAAKC,IAAO,QAAQ,AAAC,GAAQ,CAClC,KAAM,GAAYA,GAAM,GACxB,EAAU,UAAYC,GAAU,GAChC,EAAU,KAAO,OACf,MAAO,EAAU,OACd,EAAU,MAFE,CAIb,SAAU,EAAU,WAGxB,GAAO,KAAK,KAGd,GAAO,KAAK,CACV,KAAM,mBACN,SAAU,SAIZ,KAAM,IAAS,GAAa,CAC1B,QAAS,KACT,YAOF,GAAO,WAAW,AAAC,GAAO,CAExB,AAAI,EAAG,KAAK,WAAa,IAAQ,CAAC,MAChC,KAEE,EAAG,KAAK,OACV,UAAS,MAAQ,EAAG,KAAK,OAEvB,EAAG,KAAK,UACV,SACG,cAAc,yBACd,aAAa,UAAW,EAAG,KAAK,UAEjC,EAAG,KAAK,aACV,SACG,cAAc,4BACd,aAAa,UAAW,EAAG,KAAK,eChDvC,KAAM,IAAM,GAAUC,IAGtB,GAAI,IAAIC,IAGR,GAAI,QAAQ,QAAS,IACrB,KAAM,IAAW,KACjB,GAAS,GAAG,IAAK,IAAI,IAAS,QAAQ,MAAM,IAC5C,GAAI,QAAQ,YAAa,IAGzB,GAAI,UAAU,UAAWC,IACzB,GAAI,UAAU,cAAe,IAC7B,GAAI,UAAU,aAAc,IAE5B,GAAI,MAAM"}
{{ collectionInfo.collectionName }}
更新到第{{ collectionInfo.collectionCount }}集
\n maxLength }\">{{\n contentCount\n }}/{{ maxLength }}\n
\n \n \n
回复: {{ data.pname }}
Sorry,您要访问的页面不见了!
回复: {{ data.pname }}
\n