论坛tampermonkey

论坛tampermonkey版本

// ==UserScript==
// @name         论坛tampermonkey
// @namespace    npm/vite-plugin-monkey
// @version      3.08
// @author       gsonhub
// @description  论坛tampermonkey版本
// @license      MIT
// @icon         https://vitejs.dev/logo.svg
// @match        https://jsonp.gitee.io/404.html*
// @match        http://192.168.88.3:5173/dev/index.html*
// @match        http://192.168.101.188:5173/dev/index.html*
// @require      https://cdn.jsdelivr.net/npm/vue@3.3.4/dist/vue.global.prod.js
// @require      https://cdn.jsdelivr.net/npm/jquery@3.7.0/dist/jquery.min.js
// @connect      cunhua.pics
// @connect      www.cunhua.pics
// @connect      cunhua.moe
// @connect      www.cunhua.moe
// @grant        GM_xmlhttpRequest
// @grant        unsafeWindow
// @run-at       document-end
// ==/UserScript==

(t=>{const a=document.createElement("style");a.dataset.source="vite-plugin-monkey",a.textContent=t,document.head.append(a)})(' @charset "UTF-8";:root{--vt-c-white: #ffffff;--vt-c-white-soft: #f8f8f8;--vt-c-white-mute: #f2f2f2;--vt-c-black: #181818;--vt-c-black-soft: #222222;--vt-c-black-mute: #282828;--vt-c-indigo: #2c3e50;--vt-c-divider-light-1: rgba(60, 60, 60, .29);--vt-c-divider-light-2: rgba(60, 60, 60, .12);--vt-c-divider-dark-1: rgba(84, 84, 84, .65);--vt-c-divider-dark-2: rgba(84, 84, 84, .48);--vt-c-text-light-1: var(--vt-c-indigo);--vt-c-text-light-2: rgba(60, 60, 60, .66);--vt-c-text-dark-1: var(--vt-c-white);--vt-c-text-dark-2: rgba(235, 235, 235, .64)}:root{--color-background: var(--vt-c-white);--color-background-soft: var(--vt-c-white-soft);--color-background-mute: var(--vt-c-white-mute);--color-border: var(--vt-c-divider-light-2);--color-border-hover: var(--vt-c-divider-light-1);--color-heading: var(--vt-c-text-light-1);--color-text: var(--vt-c-text-light-1);--section-gap: 160px}@media (prefers-color-scheme: dark){:root{--color-background: var(--vt-c-black);--color-background-soft: var(--vt-c-black-soft);--color-background-mute: var(--vt-c-black-mute);--color-border: var(--vt-c-divider-dark-2);--color-border-hover: var(--vt-c-divider-dark-1);--color-heading: var(--vt-c-text-dark-1);--color-text: var(--vt-c-text-dark-2)}}*,*:before,*:after{box-sizing:border-box;margin:0;font-weight:400}body{min-height:100vh;color:var(--color-text);background:var(--color-background);transition:color .5s,background-color .5s;line-height:1.6;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;font-size:15px;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{background-color:#3a3c40}#app{margin:0;padding:0;font-weight:400;min-height:100vh}.left-bar[data-v-e340e55d]{width:125px;height:100vh;display:flex;background-color:#191919;position:relative;padding-top:100px}.left-bar .logo[data-v-e340e55d]{position:absolute;top:5px;left:5px}.left-bar .logo img[data-v-e340e55d]{height:40px}.left-bar .bar[data-v-e340e55d]{width:2px;height:14px;margin-left:20px;margin-top:4px;background-color:#fd8d29;transition:transform .1s}.left-bar .cate[data-v-e340e55d]{flex:1;display:flex;flex-direction:column;cursor:pointer}.left-bar .cate a.item[data-v-e340e55d]{display:block;text-decoration:none;height:55px;color:#fff;font-size:14px;margin-left:10px}.left-bar .cate a.item.active[data-v-e340e55d]{color:#fd8d29}.top-bar[data-v-0a5dfa4f]{position:fixed;top:0;left:0;z-index:999;width:100%;height:50px;background:#3a3c40;display:flex}.top-bar .logo[data-v-0a5dfa4f]{flex:1;padding-left:0}.top-bar .logo img[data-v-0a5dfa4f]{height:50px;display:block;padding:10px}.top-bar .search-bar[data-v-0a5dfa4f]{width:500px;padding-left:10px}.top-bar .search-bar .bar[data-v-0a5dfa4f]{width:490px;margin:8px 0;padding-left:17px;border-radius:17px;background-color:#2b2c2f;display:flex}.top-bar .search-bar .bar .input[data-v-0a5dfa4f]{flex:1}.top-bar .search-bar .bar .input input[data-v-0a5dfa4f]{width:100%;background-color:#2b2c2f;height:34px;outline:none;border:none;color:#fff}.top-bar .search-bar .bar button[data-v-0a5dfa4f]{display:flex;justify-content:center;align-items:center;width:100px;height:30px;margin:2px;border:none;font-size:12px;outline:none;border-radius:15px;cursor:pointer;background-color:#4a4b4e;color:#fff}.top-bar .search-bar .bar button[data-v-0a5dfa4f]:active{background:#3a3c3f}.top-bar .search-bar .bar button .icon[data-v-0a5dfa4f]{display:inline-block;scale:.6}.top-bar .tool[data-v-0a5dfa4f]{flex:1;display:flex;flex-direction:row-reverse;align-items:center;margin-right:20px}.top-bar .tool .icon[data-v-0a5dfa4f]{margin-left:15px;color:#eee;scale:.9}@media (max-width: 768px){.top-bar .search-bar[data-v-0a5dfa4f]{width:300px}.top-bar .search-bar .bar[data-v-0a5dfa4f]{width:290px}.top-bar .tool[data-v-0a5dfa4f]{display:none}}.cate-bar[data-v-5b69aa69]{width:100%;height:50px;position:fixed;display:flex;align-items:end;padding-left:20px;background:#3a3c40;z-index:999}.cate-bar a.cate[data-v-5b69aa69]{display:block;text-decoration:none;margin:10px;color:#fff;font-size:14px}.cate-bar a.cate span[data-v-5b69aa69]{padding-bottom:6px}.cate-bar a.cate.active span[data-v-5b69aa69]{border-bottom:2px solid #fd8d29;color:#fd8d29}.vo-item{text-decoration:none;display:block;border-radius:5px;overflow:hidden}.vo-item .img img{display:block;width:100%;opacity:1}.vo-item .text p{color:#fff;opacity:1}@keyframes rotate{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.element{animation:rotate 1s linear infinite;color:#fff;position:fixed;bottom:0;left:50%;width:36px;height:36px;z-index:999}.list-bar{top:50px}@media (max-width: 768px){.list-bar{top:100px}}.container[data-v-856190d9]{display:flex}.container .left[data-v-856190d9]{width:125px;position:fixed;z-index:9999;left:0}.container .right[data-v-856190d9]{width:100%;padding-left:125px}.container .right .cate-bar[data-v-856190d9]{display:none}@media (max-width: 768px){.container .left[data-v-856190d9]{display:none}.container .right[data-v-856190d9]{padding-left:0}.container .right .cate-bar[data-v-856190d9]{display:flex;top:50px}} ');

(function (vue, jQuery) {
  'use strict';

  var __defProp = Object.defineProperty;
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
  var __publicField = (obj, key, value) => {
    __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
    return value;
  };
  let config = {
    app_name: "论坛tampermonkey",
    version: "3.08",
    debug: false,
    host: "cunhua.pics"
  };
  var _GM_xmlhttpRequest = /* @__PURE__ */ (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0)();
  var _unsafeWindow = /* @__PURE__ */ (() => typeof unsafeWindow != "undefined" ? unsafeWindow : void 0)();
  const _Logger = class {
    static config(option) {
      const { appName = "", debug = true } = option;
      _Logger.appName = appName;
      _Logger.debug = debug;
    }
    static traceCall() {
      const error = new Error();
      if (error.stack) {
        const stackLines = error.stack.split("\n");
        if (stackLines[3]) {
          return stackLines[3];
        }
      }
      return "";
    }
    static log(...info) {
      const trace = _Logger.traceCall();
      info = [...info, trace];
      if (_Logger.debug)
        console.log(_Logger.appName, (/* @__PURE__ */ new Date()).toLocaleString(), ...info);
    }
    static info(...info) {
      const trace = _Logger.traceCall();
      info = [...info, trace];
      if (_Logger.debug)
        console.info(_Logger.appName, (/* @__PURE__ */ new Date()).toLocaleString(), ...info);
    }
    static error(...info) {
      console.error(_Logger.appName, (/* @__PURE__ */ new Date()).toLocaleString(), ...info);
    }
    static warn(...info) {
      const trace = _Logger.traceCall();
      info = [...info, trace];
      if (_Logger.debug)
        console.warn(_Logger.appName, (/* @__PURE__ */ new Date()).toLocaleString(), ...info);
    }
  };
  let Logger = _Logger;
  __publicField(Logger, "appName");
  __publicField(Logger, "debug");
  class Response {
    constructor(text, header) {
      __publicField(this, "str");
      __publicField(this, "header");
      this.str = text;
      this.header = header;
    }
    json() {
      let arr;
      try {
        if (this.str) {
          arr = JSON.parse(this.str);
        } else {
          throw new Error("数据为空");
        }
      } catch (error) {
        throw new Error("数据格式错误,解析成json失败:" + JSON.stringify(error));
      }
      return arr;
    }
    text() {
      return this.str;
    }
    toString() {
      return "" + this.str;
    }
  }
  class Http {
    static fetch(url, option = {}) {
      return new Promise((resolve, reject) => {
        const { method = "GET", headers = {}, body = "", timeout = 1e4 } = option;
        const requestOptions = {
          method,
          headers,
          data: "",
          url,
          timeout,
          onload: (response) => {
            if (response.status >= 200 && response.status < 400) {
              resolve(new Response(response.responseText, response.responseHeaders));
            } else {
              Logger.error(response);
              reject(new Error("Http status error:" + response.status));
            }
          },
          onerror: (err) => {
            Logger.error(err);
            reject(new Error("Http response on error"));
          },
          ontimeout: () => {
            Logger.error("Http response on timeout");
            reject(new Error("Http response on timeout"));
          }
        };
        if (method.toUpperCase() === "POST" || method.toUpperCase() === "PUT") {
          requestOptions.data = body;
        }
        _GM_xmlhttpRequest(requestOptions);
      });
    }
  }
  const _Img = class {
    static load(image_link, func = (is_load, rate) => {
    }) {
      return new Promise((resolve, reject) => {
        const image_link_key = encodeURIComponent(image_link);
        const cache_image = _Img.imgObjList[image_link_key];
        if (cache_image) {
          return resolve(cache_image);
        }
        let is_timeout = false;
        let img = new Image();
        img.src = image_link;
        let timer = setTimeout(() => {
          is_timeout = true;
          resolve({ status: "timeout", rate: Discuz.ImgLoadRate });
          Logger.error("load image " + image_link + " failed on timeout 5s");
        }, 5e3);
        img.onload = async () => {
          if (is_timeout)
            func.call(this, true, img.width / img.height);
          const imgobj = {
            status: 200,
            rate: img.width / img.height,
            width: img.width,
            height: img.height
          };
          _Img.imgObjList[image_link_key] = imgobj;
          clearTimeout(timer);
          resolve(imgobj);
        };
        img.onerror = () => {
          if (is_timeout)
            func.call(this, false, Discuz.Img404Rate);
          clearTimeout(timer);
          resolve({ status: 404, rate: Discuz.Img404Rate });
          Logger.error("load image " + image_link + " failed onerror");
        };
      });
    }
  };
  let Img = _Img;
  __publicField(Img, "imgObjList", {});
  const _Discuz = class {
    static getCateList() {
      let list = [
        {
          name: "国产资源",
          id: 38
        },
        {
          name: "直播资源",
          id: 39
        },
        {
          name: "亚洲无码",
          id: 40
        },
        {
          name: "亚洲有码",
          id: 41
        }
      ];
      return list;
    }
    static async getListByCate(page = 1, fid = 39) {
      const mobileOpt = {
        headers: {
          "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 Edg/113.0.0.0"
        },
        timeout: 3e4
      };
      let htmlString = await Http.fetch(`${_Discuz.BaseUrl}forum.php?mod=forumdisplay&fid=${fid}&mobile=2&page=${page}`, mobileOpt);
      let html = htmlString.text().replace(/<img([^>]*)>/g, (m, match) => {
        return `<v-img${match}>`;
      });
      const objs = jQuery(html).find(".byg_threadlist_pic .byg_pic_img a").map(function() {
        let img_link = jQuery(this).find("v-img").attr("src") || "";
        img_link = img_link.includes("http") ? img_link : _Discuz.BaseUrl + img_link;
        let href = _Discuz.BaseUrl + (jQuery(this).attr("href") || "");
        href = href.replace("&mobile=2", "");
        return {
          title: jQuery(this).attr("title") || "",
          href,
          image_link: img_link,
          pre_image_link: "",
          img_rate: _Discuz.ImgLoadRate
        };
      }).get();
      return objs;
    }
    static async init() {
      _Discuz.initFormHash().then();
      const img404 = await Img.load(_Discuz.Img404Link);
      _Discuz.Img404Rate = img404.rate ?? _Discuz.DefaultRate;
      const imgLoad = await Img.load(_Discuz.ImgLoadingLink);
      _Discuz.ImgLoadRate = imgLoad.rate ?? _Discuz.DefaultRate;
    }
    static async initFormHash() {
      if (_Discuz.searchFormHash)
        return;
      const _url = _Discuz.BaseUrl + "search.php?mod=forum&mobile=2";
      const res = await Http.fetch(_url);
      let hash = jQuery(res.text()).find('input[name="formhash"]').val();
      Logger.log("searchFormHash:" + hash);
      _Discuz.searchFormHash = hash;
    }
    static async search(key, page = 1) {
      await _Discuz.initFormHash();
      const first_url = _Discuz.BaseUrl + "search.php?mod=forum&mobile=2";
      const _dkey = decodeURIComponent(key);
      const _key = encodeURIComponent(key);
      const search_id = _Discuz.searchIdObj[_key] ? _Discuz.searchIdObj[_key] : 0;
      const keyid_url = `https://cunhua.click/search.php?mod=forum&searchid=${search_id}&orderby=lastpost&ascdesc=desc&searchsubmit=yes&page=${page}&mobile=2`;
      let _url = search_id ? keyid_url : first_url;
      let htmlString = await Http.fetch(_url, {
        method: "POST",
        headers: {
          "content-type": "application/x-www-form-urlencoded",
          "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 Edg/113.0.0.0"
        },
        timeout: 1e4,
        body: `formhash=${_Discuz.searchFormHash}&srchtxt=${_dkey}&searchsubmit=yes`
      });
      let html = htmlString.text().replace(/<img([^>]*)>/g, (m, match) => {
        return `<v-img${match}>`;
      });
      let hash = jQuery(html).find('input[name="formhash"]').val();
      _Discuz.searchFormHash = hash;
      let res = /searchid=(\d+)/.exec(html) ?? [];
      if (res && res[1]) {
        _Discuz.searchIdObj[_key] = +res[1];
      } else {
        Logger.error("can not fetch searchid");
        throw new Error("can not fetch searchid");
      }
      Logger.log({ _dkey, "searchId": res[1] });
      let promise_list = jQuery(html).find("h2.thread_tit + ul").find("li a").map(async function() {
        let url = _Discuz.BaseUrl + (jQuery(this).attr("href") || "");
        let image_link = _Discuz.Img404Link;
        url = store.is_mobile ? url : url.replace("&mobile=2", "");
        return {
          title: jQuery(this).text(),
          href: url,
          image_link,
          pre_image_link: "",
          img_rate: _Discuz.ImgLoadRate
        };
      }).get();
      let list = await Promise.all(promise_list);
      Logger.log("search list", { list });
      return list;
    }
    static async getImage(url) {
      const mobileOpt = {
        headers: { "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 Edg/113.0.0.0" },
        timeout: 15e3
      };
      const pcOpt = { timeout: 15e3 };
      const opt = store.is_mobile ? mobileOpt : pcOpt;
      let resp;
      try {
        resp = await Http.fetch(url, opt);
      } catch (error) {
        Logger.error("getImage", error);
        return _Discuz.Img404Link;
      }
      let html = resp.text().replace(/<img([^>]*)>/g, (m, match) => {
        return `<v-img${match}>`;
      });
      let img_list = jQuery(html).find('[id^="aimg_"]').map(function() {
        let src = jQuery(this).attr("src") || "";
        let zoomfile = jQuery(this).attr("zoomfile") || "";
        return zoomfile ? zoomfile : src;
      }).get();
      if (img_list && img_list.length > 0) {
        const image_link = img_list[Math.floor(Math.random() * img_list.length)];
        return /^https?/.test(image_link) ? image_link : _Discuz.BaseUrl + image_link;
      } else {
        return _Discuz.Img404Link;
      }
    }
    static async fetchRealUrl(url) {
      const mobileOpt = { timeout: 1e4, headers: { "user-agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1 Edg/113.0.0.0" } };
      const resp = await Http.fetch(url, store.is_mobile ? mobileOpt : { timeout: 1e4 });
      const html = resp.text();
      if (/<head>/.test(html))
        return url;
      let [, jsStr] = /<script.*?>([\s\S]*?)<\/script>/gm.exec(html) ?? [];
      const temp = `
        MuURL='';
        MuObj={
            href:'',replace:function(abc){MuURL=abc},
            assign:function(abc){MuURL=abc},
        };`;
      jsStr = temp + jsStr.replaceAll("location", "MuObj");
      let func = new Function(jsStr);
      func.call(this);
      MuURL = MuURL ? MuURL : MuObj.href || MuObj;
      let [, _dsign] = /_dsign=(.*)/gm.exec(MuURL) ?? [];
      const sign = url.includes("?") ? "&" : "?";
      const _url = `${url}${sign}_dsign=${_dsign}`;
      return _url;
    }
  };
  let Discuz = _Discuz;
  __publicField(Discuz, "Img404Link", "https://jsonp.gitee.io/video/img/404.png");
  __publicField(Discuz, "Img404Rate");
  __publicField(Discuz, "ImgLoadingLink", "https://jsonp.gitee.io/video/img/load.gif");
  __publicField(Discuz, "ImgLoadRate");
  __publicField(Discuz, "Host", config.host);
  __publicField(Discuz, "DefaultRate", 0.72);
  __publicField(Discuz, "BaseUrl", `https://${config.host}/`);
  __publicField(Discuz, "searchIdObj", {});
  __publicField(Discuz, "searchFormHash", "");
  __publicField(Discuz, "defaultCid", 38);
  const store = vue.reactive({
    cate_list: [],
    cate_index: 0,
    cid: Discuz.defaultCid,
    is_mobile: /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent),
    route: "cate",
    key: "",
    initCate: () => {
      let [, cid] = /^#id=(\d+)$/.exec(location.hash) ?? [];
      if (cid) {
        store.cid = +cid;
        store.route = "cate";
      }
      let [, key] = /^#key=(.*?)_=\d+$/.exec(location.hash) ?? [];
      if (key) {
        store.key = key;
        store.route = "search";
      } else {
        store.key = "";
      }
      let list = Discuz.getCateList();
      store.cate_list = list.map((vo) => {
        return { ...vo, ...{ active: store.cid == vo.id && store.route == "cate" } };
      });
      store.cate_index = store.cate_list.findIndex((vo) => vo.active);
    }
  });
  const _withScopeId$1 = (n) => (vue.pushScopeId("data-v-e340e55d"), n = n(), vue.popScopeId(), n);
  const _hoisted_1$a = { class: "left-bar" };
  const _hoisted_2$8 = /* @__PURE__ */ _withScopeId$1(() => /* @__PURE__ */ vue.createElementVNode("div", { class: "logo" }, [
    /* @__PURE__ */ vue.createElementVNode("img", {
      alt: "Vue logo",
      class: "logo",
      src: "https://www.cunhua.click/template/bygsjw/image/logo.png"
    })
  ], -1));
  const _hoisted_3$6 = { class: "cate" };
  const _hoisted_4$3 = ["href"];
  const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
    __name: "LeftBar",
    setup(__props) {
      return (_ctx, _cache) => {
        return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$a, [
          _hoisted_2$8,
          vue.createElementVNode("div", {
            class: "bar",
            style: vue.normalizeStyle({ transform: "translateY(" + (vue.unref(store).cate_index >= 0 ? 55 * vue.unref(store).cate_index : -1e3) + "px)" })
          }, null, 4),
          vue.createElementVNode("div", _hoisted_3$6, [
            (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(vue.unref(store).cate_list, (vo, index) => {
              return vue.openBlock(), vue.createElementBlock("a", {
                href: "#id=" + vo.id,
                class: vue.normalizeClass(["item", { active: vo.active }]),
                key: index
              }, vue.toDisplayString(vo.name), 11, _hoisted_4$3);
            }), 128))
          ])
        ]);
      };
    }
  });
  const _export_sfc = (sfc, props) => {
    const target = sfc.__vccOpts || sfc;
    for (const [key, val] of props) {
      target[key] = val;
    }
    return target;
  };
  const LeftBar = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__scopeId", "data-v-e340e55d"]]);
  const _sfc_main$9 = {};
  const _hoisted_1$9 = {
    xmlns: "http://www.w3.org/2000/svg",
    "xmlns:xlink": "http://www.w3.org/1999/xlink",
    "aria-hidden": "true",
    role: "img",
    class: "iconify iconify--mdi",
    width: "24",
    height: "24",
    preserveAspectRatio: "xMidYMid meet",
    viewBox: "0 0 24 24"
  };
  const _hoisted_2$7 = /* @__PURE__ */ vue.createElementVNode("path", {
    d: "M20 18v-4h-3v1h-2v-1H9v1H7v-1H4v4h16M6.33 8l-1.74 4H7v-1h2v1h6v-1h2v1h2.41l-1.74-4H6.33M9 5v1h6V5H9m12.84 7.61c.1.22.16.48.16.8V18c0 .53-.21 1-.6 1.41c-.4.4-.85.59-1.4.59H4c-.55 0-1-.19-1.4-.59C2.21 19 2 18.53 2 18v-4.59c0-.32.06-.58.16-.8L4.5 7.22C4.84 6.41 5.45 6 6.33 6H7V5c0-.55.18-1 .57-1.41C7.96 3.2 8.44 3 9 3h6c.56 0 1.04.2 1.43.59c.39.41.57.86.57 1.41v1h.67c.88 0 1.49.41 1.83 1.22l2.34 5.39z",
    fill: "currentColor"
  }, null, -1);
  const _hoisted_3$5 = [
    _hoisted_2$7
  ];
  function _sfc_render$4(_ctx, _cache) {
    return vue.openBlock(), vue.createElementBlock("svg", _hoisted_1$9, _hoisted_3$5);
  }
  const ToolingIcon = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["render", _sfc_render$4]]);
  const _sfc_main$8 = {};
  const _hoisted_1$8 = {
    xmlns: "http://www.w3.org/2000/svg",
    width: "18",
    height: "20",
    fill: "currentColor"
  };
  const _hoisted_2$6 = /* @__PURE__ */ vue.createElementVNode("path", { d: "M11.447 8.894a1 1 0 1 0-.894-1.789l.894 1.789zm-2.894-.789a1 1 0 1 0 .894 1.789l-.894-1.789zm0 1.789a1 1 0 1 0 .894-1.789l-.894 1.789zM7.447 7.106a1 1 0 1 0-.894 1.789l.894-1.789zM10 9a1 1 0 1 0-2 0h2zm-2 2.5a1 1 0 1 0 2 0H8zm9.447-5.606a1 1 0 1 0-.894-1.789l.894 1.789zm-2.894-.789a1 1 0 1 0 .894 1.789l-.894-1.789zm2 .789a1 1 0 1 0 .894-1.789l-.894 1.789zm-1.106-2.789a1 1 0 1 0-.894 1.789l.894-1.789zM18 5a1 1 0 1 0-2 0h2zm-2 2.5a1 1 0 1 0 2 0h-2zm-5.447-4.606a1 1 0 1 0 .894-1.789l-.894 1.789zM9 1l.447-.894a1 1 0 0 0-.894 0L9 1zm-2.447.106a1 1 0 1 0 .894 1.789l-.894-1.789zm-6 3a1 1 0 1 0 .894 1.789L.553 4.106zm2.894.789a1 1 0 1 0-.894-1.789l.894 1.789zm-2-.789a1 1 0 1 0-.894 1.789l.894-1.789zm1.106 2.789a1 1 0 1 0 .894-1.789l-.894 1.789zM2 5a1 1 0 1 0-2 0h2zM0 7.5a1 1 0 1 0 2 0H0zm8.553 12.394a1 1 0 1 0 .894-1.789l-.894 1.789zm-1.106-2.789a1 1 0 1 0-.894 1.789l.894-1.789zm1.106 1a1 1 0 1 0 .894 1.789l-.894-1.789zm2.894.789a1 1 0 1 0-.894-1.789l.894 1.789zM8 19a1 1 0 1 0 2 0H8zm2-2.5a1 1 0 1 0-2 0h2zm-7.447.394a1 1 0 1 0 .894-1.789l-.894 1.789zM1 15H0a1 1 0 0 0 .553.894L1 15zm1-2.5a1 1 0 1 0-2 0h2zm12.553 2.606a1 1 0 1 0 .894 1.789l-.894-1.789zM17 15l.447.894A1 1 0 0 0 18 15h-1zm1-2.5a1 1 0 1 0-2 0h2zm-7.447-5.394l-2 1 .894 1.789 2-1-.894-1.789zm-1.106 1l-2-1-.894 1.789 2 1 .894-1.789zM8 9v2.5h2V9H8zm8.553-4.894l-2 1 .894 1.789 2-1-.894-1.789zm.894 0l-2-1-.894 1.789 2 1 .894-1.789zM16 5v2.5h2V5h-2zm-4.553-3.894l-2-1-.894 1.789 2 1 .894-1.789zm-2.894-1l-2 1 .894 1.789 2-1L8.553.106zM1.447 5.894l2-1-.894-1.789-2 1 .894 1.789zm-.894 0l2 1 .894-1.789-2-1-.894 1.789zM0 5v2.5h2V5H0zm9.447 13.106l-2-1-.894 1.789 2 1 .894-1.789zm0 1.789l2-1-.894-1.789-2 1 .894 1.789zM10 19v-2.5H8V19h2zm-6.553-3.894l-2-1-.894 1.789 2 1 .894-1.789zM2 15v-2.5H0V15h2zm13.447 1.894l2-1-.894-1.789-2 1 .894 1.789zM18 15v-2.5h-2V15h2z" }, null, -1);
  const _hoisted_3$4 = [
    _hoisted_2$6
  ];
  function _sfc_render$3(_ctx, _cache) {
    return vue.openBlock(), vue.createElementBlock("svg", _hoisted_1$8, _hoisted_3$4);
  }
  const EcosystemIcon = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["render", _sfc_render$3]]);
  const _sfc_main$7 = {};
  const _hoisted_1$7 = {
    xmlns: "http://www.w3.org/2000/svg",
    width: "20",
    height: "20",
    fill: "currentColor"
  };
  const _hoisted_2$5 = /* @__PURE__ */ vue.createElementVNode("path", { d: "M15 4a1 1 0 1 0 0 2V4zm0 11v-1a1 1 0 0 0-1 1h1zm0 4l-.707.707A1 1 0 0 0 16 19h-1zm-4-4l.707-.707A1 1 0 0 0 11 14v1zm-4.707-1.293a1 1 0 0 0-1.414 1.414l1.414-1.414zm-.707.707l-.707-.707.707.707zM9 11v-1a1 1 0 0 0-.707.293L9 11zm-4 0h1a1 1 0 0 0-1-1v1zm0 4H4a1 1 0 0 0 1.707.707L5 15zm10-9h2V4h-2v2zm2 0a1 1 0 0 1 1 1h2a3 3 0 0 0-3-3v2zm1 1v6h2V7h-2zm0 6a1 1 0 0 1-1 1v2a3 3 0 0 0 3-3h-2zm-1 1h-2v2h2v-2zm-3 1v4h2v-4h-2zm1.707 3.293l-4-4-1.414 1.414 4 4 1.414-1.414zM11 14H7v2h4v-2zm-4 0c-.276 0-.525-.111-.707-.293l-1.414 1.414C5.42 15.663 6.172 16 7 16v-2zm-.707 1.121l3.414-3.414-1.414-1.414-3.414 3.414 1.414 1.414zM9 12h4v-2H9v2zm4 0a3 3 0 0 0 3-3h-2a1 1 0 0 1-1 1v2zm3-3V3h-2v6h2zm0-6a3 3 0 0 0-3-3v2a1 1 0 0 1 1 1h2zm-3-3H3v2h10V0zM3 0a3 3 0 0 0-3 3h2a1 1 0 0 1 1-1V0zM0 3v6h2V3H0zm0 6a3 3 0 0 0 3 3v-2a1 1 0 0 1-1-1H0zm3 3h2v-2H3v2zm1-1v4h2v-4H4zm1.707 4.707l.586-.586-1.414-1.414-.586.586 1.414 1.414z" }, null, -1);
  const _hoisted_3$3 = [
    _hoisted_2$5
  ];
  function _sfc_render$2(_ctx, _cache) {
    return vue.openBlock(), vue.createElementBlock("svg", _hoisted_1$7, _hoisted_3$3);
  }
  const CommunityIcon = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["render", _sfc_render$2]]);
  const _sfc_main$6 = {};
  const _hoisted_1$6 = {
    xmlns: "http://www.w3.org/2000/svg",
    width: "20",
    height: "20",
    fill: "currentColor"
  };
  const _hoisted_2$4 = /* @__PURE__ */ vue.createElementVNode("path", { d: "M10 3.22l-.61-.6a5.5 5.5 0 0 0-7.666.105 5.5 5.5 0 0 0-.114 7.665L10 18.78l8.39-8.4a5.5 5.5 0 0 0-.114-7.665 5.5 5.5 0 0 0-7.666-.105l-.61.61z" }, null, -1);
  const _hoisted_3$2 = [
    _hoisted_2$4
  ];
  function _sfc_render$1(_ctx, _cache) {
    return vue.openBlock(), vue.createElementBlock("svg", _hoisted_1$6, _hoisted_3$2);
  }
  const SupportIcon = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["render", _sfc_render$1]]);
  const _withScopeId = (n) => (vue.pushScopeId("data-v-0a5dfa4f"), n = n(), vue.popScopeId(), n);
  const _hoisted_1$5 = { class: "top-bar" };
  const _hoisted_2$3 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ vue.createElementVNode("div", { class: "logo" }, [
    /* @__PURE__ */ vue.createElementVNode("img", {
      alt: "Vue logo",
      class: "logo",
      src: "https://www.cunhua.click/template/bygsjw/image/logo.png"
    })
  ], -1));
  const _hoisted_3$1 = { class: "search-bar" };
  const _hoisted_4$2 = { class: "bar" };
  const _hoisted_5 = { class: "input" };
  const _hoisted_6 = { class: "tool" };
  const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
    __name: "TopBar",
    setup(__props) {
      let key = vue.ref("");
      function doSearch() {
        const t = +/* @__PURE__ */ new Date();
        location.hash = `key=${key.value}_=${t}`;
      }
      vue.onMounted(() => {
        key.value = decodeURIComponent(store.key);
      });
      vue.watch(store, () => {
        key.value = decodeURIComponent(store.key);
      });
      return (_ctx, _cache) => {
        return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$5, [
          _hoisted_2$3,
          vue.createElementVNode("div", _hoisted_3$1, [
            vue.createElementVNode("div", _hoisted_4$2, [
              vue.createElementVNode("div", _hoisted_5, [
                vue.withDirectives(vue.createElementVNode("input", {
                  type: "search",
                  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => vue.isRef(key) ? key.value = $event : key = $event),
                  onKeyup: _cache[1] || (_cache[1] = vue.withKeys(($event) => doSearch(), ["enter"])),
                  placeholder: "请输入关键词搜索。。。"
                }, null, 544), [
                  [vue.vModelText, vue.unref(key)]
                ])
              ]),
              vue.createElementVNode("button", {
                onClick: _cache[2] || (_cache[2] = ($event) => doSearch())
              }, [
                vue.createVNode(SupportIcon, { class: "icon" }),
                vue.createTextVNode(" 搜索帖子 ")
              ])
            ])
          ]),
          vue.createElementVNode("div", _hoisted_6, [
            vue.createVNode(ToolingIcon, { class: "icon" }),
            vue.createVNode(SupportIcon, { class: "icon" }),
            vue.createVNode(CommunityIcon, { class: "icon" }),
            vue.createVNode(EcosystemIcon, { class: "icon" })
          ])
        ]);
      };
    }
  });
  const TopBar = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-0a5dfa4f"]]);
  const _hoisted_1$4 = { class: "cate-bar" };
  const _hoisted_2$2 = ["href"];
  const _sfc_main$4 = /* @__PURE__ */ vue.defineComponent({
    __name: "CateBar",
    setup(__props) {
      return (_ctx, _cache) => {
        return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$4, [
          (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(vue.unref(store).cate_list, (vo, index) => {
            return vue.openBlock(), vue.createElementBlock("a", {
              href: "#id=" + vo.id,
              class: vue.normalizeClass(["cate", { active: vo.active }]),
              key: index
            }, [
              vue.createElementVNode("span", null, vue.toDisplayString(vo.name), 1)
            ], 10, _hoisted_2$2);
          }), 128))
        ]);
      };
    }
  });
  const CateBar = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-5b69aa69"]]);
  const _hoisted_1$3 = ["href", "target"];
  const _hoisted_2$1 = { class: "img" };
  const _hoisted_3 = ["id", "src"];
  const _hoisted_4$1 = ["id"];
  const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
    __name: "Item",
    props: {
      width: {},
      title: {},
      image_link: {},
      pre_image_link: {},
      img_rate: {},
      href: {},
      loaded: { type: Boolean },
      index: {}
    },
    setup(__props) {
      return (_ctx, _cache) => {
        return vue.openBlock(), vue.createElementBlock("a", {
          class: "vo-item",
          href: _ctx.href,
          target: vue.unref(store).is_mobile ? "_self" : "_blank"
        }, [
          vue.createElementVNode("div", _hoisted_2$1, [
            vue.createElementVNode("img", {
              id: "vo-item-img-" + _ctx.index,
              src: _ctx.pre_image_link,
              alt: "",
              style: vue.normalizeStyle({ height: (_ctx.width || 150) / _ctx.img_rate + "px" })
            }, null, 12, _hoisted_3)
          ]),
          vue.createElementVNode("div", {
            class: "text",
            id: "vo-item-p-" + _ctx.index
          }, [
            vue.createElementVNode("p", null, vue.toDisplayString(_ctx.title), 1)
          ], 8, _hoisted_4$1)
        ], 8, _hoisted_1$3);
      };
    }
  });
  const _sfc_main$2 = {};
  const _hoisted_1$2 = {
    xmlns: "http://www.w3.org/2000/svg",
    width: "36",
    height: "36",
    viewBox: "0 0 24 24",
    class: "element"
  };
  const _hoisted_2 = /* @__PURE__ */ vue.createStaticVNode('<defs><linearGradient id="mingcuteLoadingFill0" x1="50%" x2="50%" y1="5.271%" y2="91.793%"><stop offset="0%" stop-color="currentColor"></stop><stop offset="100%" stop-color="currentColor" stop-opacity=".55"></stop></linearGradient><linearGradient id="mingcuteLoadingFill1" x1="50%" x2="50%" y1="15.24%" y2="87.15%"><stop offset="0%" stop-color="currentColor" stop-opacity="0"></stop><stop offset="100%" stop-color="currentColor" stop-opacity=".55"></stop></linearGradient></defs><g fill="none"><path d="M24 0v24H0V0h24ZM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035c-.01-.004-.019-.001-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427c-.002-.01-.009-.017-.017-.018Zm.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093c.012.004.023 0 .029-.008l.004-.014l-.034-.614c-.003-.012-.01-.02-.02-.022Zm-.715.002a.023.023 0 0 0-.027.006l-.006.014l-.034.614c0 .012.007.02.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01l-.184-.092Z"></path><path fill="url(#mingcuteLoadingFill0)" d="M8.749.021a1.5 1.5 0 0 1 .497 2.958A7.502 7.502 0 0 0 3 10.375a7.5 7.5 0 0 0 7.5 7.5v3c-5.799 0-10.5-4.7-10.5-10.5C0 5.23 3.726.865 8.749.021Z" transform="translate(1.5 1.625)"></path><path fill="url(#mingcuteLoadingFill1)" d="M15.392 2.673a1.5 1.5 0 0 1 2.119-.115A10.475 10.475 0 0 1 21 10.375c0 5.8-4.701 10.5-10.5 10.5v-3a7.5 7.5 0 0 0 5.007-13.084a1.5 1.5 0 0 1-.115-2.118Z" transform="translate(1.5 1.625)"></path></g>', 2);
  const _hoisted_4 = [
    _hoisted_2
  ];
  function _sfc_render(_ctx, _cache) {
    return vue.openBlock(), vue.createElementBlock("svg", _hoisted_1$2, _hoisted_4);
  }
  const IconLoading = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["render", _sfc_render]]);
  const _hoisted_1$1 = {
    class: "list-bar",
    id: "list-bar"
  };
  const loading_img_link = "https://jsonp.gitee.io/video/img/load.gif";
  const offset = 10;
  const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
    __name: "ListBar",
    setup(__props) {
      let item_list = vue.ref([]);
      let is_loading_data = vue.ref(false);
      let is_loading_img = vue.ref(false);
      let page_num = vue.ref(1);
      const item_width = window.innerWidth < 550 ? Math.floor((window.innerWidth - 20) / 2) : 250;
      let h_arr = [];
      async function load_article_img(vo, index) {
        if (store.route == "cate") {
          const img = await Img.load(vo.image_link, (is_load, rate) => {
            Logger.log("callback", { is_load }, vo.image_link);
            const dom = document.getElementById(`vo-item-img-${index}`);
            vo.pre_image_link = is_load ? vo.image_link : Discuz.Img404Link;
            dom.setAttribute("src", vo.pre_image_link);
            dom.style.height = item_width / rate + "px";
            item_list.value[index] = vo;
          });
          vo.loaded = img.status == 200;
          vo.img_rate = img.rate;
          if (img.status == 200) {
            vo.pre_image_link = vo.image_link;
          } else if (img.status == 404) {
            vo.pre_image_link = Discuz.Img404Link;
          }
        } else if (store.route == "search") {
          load_search_img(vo).then(async (v) => {
            const dom = document.getElementById(`vo-item-img-${index}`);
            dom.setAttribute("src", v.image_link);
            dom.style.height = item_width / v.img.rate + "px";
          }).catch((err) => {
            Logger.error("end", "搜索页加载图片失败" + index, JSON.stringify(err));
          });
        }
        return vo;
      }
      async function load_search_img(vo, index) {
        let href = await Discuz.fetchRealUrl(vo.href);
        let image_link = await Discuz.getImage(href);
        const img = await Img.load(image_link);
        return { href, image_link, img };
      }
      async function load_more(page) {
        if (is_loading_data.value || is_loading_img.value) {
          return false;
        } else {
          page_num.value = page;
          is_loading_data.value = true;
          is_loading_img.value = true;
        }
        Logger.log("load page start", { route: store.route });
        let list = [];
        try {
          list = await get_data(page);
        } catch (error) {
          let msg = "加载失败,请检查网络状况:";
          if (error instanceof Error) {
            msg += error.message;
          } else if (typeof error === "string") {
            msg += error;
          } else {
            msg += JSON.stringify(error);
          }
          alert(msg);
        }
        Logger.log({ route: store.route, list });
        let arr = list.map((vo) => {
          return {
            image_link: vo.image_link,
            img_rate: Discuz.ImgLoadRate,
            pre_image_link: loading_img_link,
            title: vo.title,
            href: vo.href,
            position: "absolute",
            left: -item_width * 2,
            top: -item_width * 2,
            width: item_width
          };
        });
        let index = item_list.value.length;
        let start_item_list = item_list.value;
        item_list.value = [...start_item_list, ...arr];
        is_loading_data.value = false;
        await vue.nextTick();
        await update_list(index, true);
        let load_num = 0;
        for (let i = 0; i < arr.length; i++) {
          load_article_img(arr[i], i + index).then((vo) => {
            item_list.value[i + index] = vo;
            load_num++;
          });
        }
        while (load_num < arr.length) {
          await new Promise((resolve) => setTimeout(resolve, 100));
        }
        await vue.nextTick();
        await update_list(index);
        is_loading_img.value = false;
        Logger.log("load page finished", store.route, { page, load_num });
      }
      function init_water() {
        const container = document.getElementById("list-bar");
        container.style.position = "relative";
        const win_width = container.getBoundingClientRect().width;
        const row_count = Math.floor((win_width + offset) / (item_width + offset));
        const inner_w = (row_count - 1) * offset + row_count * item_width;
        container.style.width = inner_w + "px";
        container.style.margin = "0 auto";
        h_arr = Array.from({ length: row_count }, () => 0);
      }
      async function update_list(index = 0, is_try = false) {
        let last_h_arr = [...h_arr];
        let i = index;
        let lenght = item_list.value.length;
        while (i < lenght) {
          let vo = item_list.value[i];
          const h_i = h_arr.indexOf(Math.min(...h_arr));
          vo.top = h_arr[h_i];
          vo.left = h_i * (offset + item_width);
          const dom = document.getElementById(`vo-item-p-${i}`);
          const _height = item_width / vo.img_rate + dom.getBoundingClientRect().height + offset;
          h_arr[h_i] += _height;
          i++;
        }
        if (is_try)
          h_arr = last_h_arr;
      }
      async function get_data(page) {
        if (store.route == "search") {
          Logger.log("serach page", { page, key: store.key });
          let res = await Discuz.search(store.key, page);
          return res;
        } else {
          Logger.log("cate page", { page, cid: store.cid });
          let res = await Discuz.getListByCate(page, store.cid);
          return res;
        }
      }
      vue.onMounted(async () => {
        init_water();
        await load_more(page_num.value);
      });
      let win = location.port ? window : _unsafeWindow;
      win.addEventListener("hashchange", async () => {
        init_water();
        page_num.value = 1;
        item_list.value = [];
        await load_more(page_num.value);
      });
      win.onscroll = async () => {
        let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
        let windowHeight = document.documentElement.clientHeight || document.body.clientHeight;
        let scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight;
        if (scrollTop + windowHeight + 25 >= scrollHeight) {
          await load_more(page_num.value + 1);
        }
      };
      return (_ctx, _cache) => {
        return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [
          vue.createElementVNode("div", _hoisted_1$1, [
            (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(vue.unref(item_list), (item, index) => {
              return vue.openBlock(), vue.createBlock(_sfc_main$3, {
                width: item.width,
                index,
                img_rate: item.img_rate,
                title: item.title,
                image_link: item.image_link,
                pre_image_link: item.pre_image_link,
                href: item.href,
                class: "li",
                key: index,
                id: "vo-item-" + index,
                style: vue.normalizeStyle({
                  width: item.width + "px",
                  height: item.height + "px",
                  left: item.left + "px",
                  top: item.top + "px",
                  position: item.position
                })
              }, {
                default: vue.withCtx(() => [
                  vue.createTextVNode(vue.toDisplayString(item.title), 1)
                ]),
                _: 2
              }, 1032, ["width", "index", "img_rate", "title", "image_link", "pre_image_link", "href", "id", "style"]);
            }), 128))
          ]),
          vue.unref(is_loading_data) ? (vue.openBlock(), vue.createBlock(IconLoading, { key: 0 })) : vue.createCommentVNode("", true)
        ], 64);
      };
    }
  });
  const _hoisted_1 = { class: "right" };
  const _sfc_main = /* @__PURE__ */ vue.defineComponent({
    __name: "App",
    setup(__props) {
      let port = vue.ref(location.port ? true : false);
      let win = port.value ? window : _unsafeWindow;
      win.addEventListener("hashchange", async () => {
        store.initCate();
      });
      vue.onBeforeMount(() => {
        store.initCate();
      });
      vue.onMounted(async () => {
        await Discuz.init();
      });
      return (_ctx, _cache) => {
        return vue.openBlock(), vue.createElementBlock("div", {
          class: "container",
          style: vue.normalizeStyle({ opacity: vue.unref(port) ? 0.2 : 1 })
        }, [
          vue.createVNode(LeftBar, { class: "left" }),
          vue.createElementVNode("div", _hoisted_1, [
            vue.createVNode(TopBar),
            vue.createVNode(CateBar, { class: "cate-bar" }),
            vue.createVNode(_sfc_main$1)
          ])
        ], 4);
      };
    }
  });
  const App = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-856190d9"]]);
  function initHead() {
    var _a;
    let metaElements = document.getElementsByTagName("meta");
    for (let i = metaElements.length - 1; i >= 0; i--) {
      let metaElement = metaElements[i];
      (_a = metaElement.parentNode) == null ? void 0 : _a.removeChild(metaElement);
    }
    let charsetMeta = document.createElement("meta");
    charsetMeta.setAttribute("charset", "UTF-8");
    document.head.appendChild(charsetMeta);
    let viewportMeta = document.createElement("meta");
    viewportMeta.setAttribute("name", "viewport");
    viewportMeta.setAttribute("content", "width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no");
    document.head.appendChild(viewportMeta);
    document.title = config.app_name;
    document.body.innerHTML = "";
  }
  Logger.config({ debug: config.debug });
  initHead();
  vue.createApp(App).mount(
    (() => {
      const app = document.createElement("div");
      app.id = "app";
      document.body.append(app);
      return app;
    })()
  );

})(Vue, jQuery);