Greasy Fork

Greasy Fork is available in English.

✨超星学习通全能增强小帮手,自动化操作小帮手,题库查询,让学习更轻松高效

💻提供超星/学习通多项功能支持,全面增强💻。通提供以下内容:1、章节视频 2、课程作业 3、章节测验 4、智能题库对接。🔥简单高效,持续更新。

当前为 2025-10-13 提交的版本,查看 最新版本

在您安装前,Greasy Fork 希望您知道此脚本声明其包含了一些负面功能。这些功能也许会使脚本作者获利,而不能给您带来任何直接的金钱收益。

此脚本会在您访问的网站中插入广告

您只有在付费后才能使用脚本的全部功能。Greasy Fork 未参与到支付的流程,因此无法验证您是否获得了有价值的东西,亦无法帮助您申请退款。

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         ✨超星学习通全能增强小帮手,自动化操作小帮手,题库查询,让学习更轻松高效
// @namespace    Aaron
// @version      1.0.1
// @author       Aaron
// @description  💻提供超星/学习通多项功能支持,全面增强💻。通提供以下内容:1、章节视频 2、课程作业 3、章节测验 4、智能题库对接。🔥简单高效,持续更新。
// @icon         data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNzU3MDcxNDYxMDkyIiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjI3NTMiIGlkPSJteF9uXzE3NTcwNzE0NjEwOTMiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PHBhdGggZD0iTTUxMiAwQzIyOS4yMDYgMCAwLjAyIDIyOS4yMjYgMC4wMiA1MTIuMDIgMC4wMiA3OTQuNzc1IDIyOS4yMDcgMTAyNCA1MTIgMTAyNHM1MTEuOTgtMjI5LjIyNiA1MTEuOTgtNTExLjk4QzEwMjMuOTggMjI5LjIyNyA3OTQuNzkzIDAgNTEyIDB6IG0zMDMuMzcyIDMxOC45NUw0NjguNzIgNzgwLjE1NGMtMTAuODMgMTQuMzctMjcuMzI2IDIzLjQxLTQ1LjI4IDI0Ljc0M2E1OC44OSA1OC44OSAwIDAgMS00LjY2NCAwLjE2NmMtMTYuMzMgMC0zMi4wNzUtNi4zNzMtNDMuNzgtMTcuOTExTDE4Mi4wOTQgNTk3LjcwNWMtMjQuNjE4LTI0LjIwMi0yNC45OTMtNjMuNzMyLTAuNzkxLTg4LjM1IDI0LjIwMS0yNC42NiA2My43MzEtMjQuOTUxIDg4LjM1LTAuODMzbDE0Mi4wNDIgMTM5LjUwMiAzMDMuNzg5LTQwNC4yMThjMjAuNzQ0LTI3LjU3NiA1OS45LTMzLjExNiA4Ny41MTYtMTIuNDE0IDI3LjUzNCAyMC44MjggMzMuMTE2IDU5Ljk4MyAxMi4zNzIgODcuNTU5eiIgcC1pZD0iMjc1NCIgZmlsbD0iIzEyOTZkYiI+PC9wYXRoPjwvc3ZnPg==
// @match        *://*.chaoxing.com/*
// @match        *://*.edu.cn/*
// @match        *://*.nbdlib.cn/*
// @match         *://*.hnsyu.net/*
// @match        *://*.gdhkmooc.com/*
// @match        *://*.zhihuishu.com/*
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/vue.global.prod.js
// @require      data:application/javascript,%3Bwindow.Vue%3DVue%3B
// @require      https://unpkg.com/dayjs/dayjs.min.js
// @require      https://unpkg.com/dayjs/plugin/customParseFormat.js
// @require      https://unpkg.com/dayjs/plugin/weekday.js
// @require      https://unpkg.com/dayjs/plugin/localeData.js
// @require      https://unpkg.com/dayjs/plugin/weekOfYear.js
// @require      https://unpkg.com/dayjs/plugin/weekYear.js
// @require      https://unpkg.com/dayjs/plugin/advancedFormat.js
// @require      https://unpkg.com/dayjs/plugin/quarterOfYear.js
// @require      https://unpkg.com/[email protected]/dist/antd.min.js
// @require      https://unpkg.com/[email protected]/dist/pinia.iife.prod.js
// @require      https://unpkg.com/[email protected]/js/md5.min.js
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/system.min.js
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/extras/named-register.min.js
// @require      data:application/javascript,%3B(typeof%20System!%3D'undefined')%26%26(System%3Dnew%20System.constructor())%3B
// @resource     AntdStyle  https://unpkg.com/[email protected]/dist/antd.min.css
// @resource     ttf        https://www.forestpolice.org/ttf/2.0/table.json
// @connect      cx.icodef.com
// @connect      www.aiask.site
// @connect      ocsjs.com
// @grant        GM_addStyle
// @grant        GM_getResourceText
// @grant        GM_getValue
// @grant        GM_setValue
// @grant        GM_xmlhttpRequest
// @grant        unsafeWindow
// @run-at       document-end
// @antifeature  ads
// @antifeature  payment
// ==/UserScript==

(t=>{if(typeof GM_addStyle=="function"){GM_addStyle(t);return}const e=document.createElement("style");e.textContent=t,document.head.append(e)})(" .log-item[data-v-657dd456]{padding:2px 5px}.floating-modal[data-v-0fae829c]{position:fixed;z-index:1000} ");

System.addImportMap({ imports: {"vue":"user:vue","pinia":"user:pinia","ant-design-vue":"user:ant-design-vue","blueimp-md5":"user:blueimp-md5"} });
System.set("user:vue", (()=>{const _=Vue;('default' in _)||(_.default=_);return _})());
System.set("user:pinia", (()=>{const _=Pinia;('default' in _)||(_.default=_);return _})());
System.set("user:ant-design-vue", (()=>{const _=antd;('default' in _)||(_.default=_);return _})());
System.set("user:blueimp-md5", (()=>{const _=md5;('default' in _)||(_.default=_);return _})());

System.register("./__entry.js", ['./__monkey.entry-CnOo8JLR.js'], (function (exports, module) {
	'use strict';
	return {
		setters: [null],
		execute: (function () {



		})
	};
}));

System.register("./__monkey.entry-CnOo8JLR.js", ['vue', 'pinia', 'ant-design-vue'], (function (exports, module) {
  'use strict';
  var defineComponent, reactive, ref, toRefs$1, onMounted, watch, watchEffect, computed, createApp, getCurrentInstance, nextTick, createVNode, toValue, onUnmounted, createElementBlock, openBlock, createElementVNode, createBlock, createCommentVNode, inject, Fragment, renderList, toDisplayString, normalizeClass, isRef, customRef, h, getCurrentScope, onScopeDispose, resolveComponent, withCtx, normalizeStyle, resolveDynamicComponent, unref, pushScopeId, popScopeId, createTextVNode, defineStore, createPinia, Antd;
  return {
    setters: [module => {
      defineComponent = module.defineComponent;
      reactive = module.reactive;
      ref = module.ref;
      toRefs$1 = module.toRefs;
      onMounted = module.onMounted;
      watch = module.watch;
      watchEffect = module.watchEffect;
      computed = module.computed;
      createApp = module.createApp;
      getCurrentInstance = module.getCurrentInstance;
      nextTick = module.nextTick;
      createVNode = module.createVNode;
      toValue = module.toValue;
      onUnmounted = module.onUnmounted;
      createElementBlock = module.createElementBlock;
      openBlock = module.openBlock;
      createElementVNode = module.createElementVNode;
      createBlock = module.createBlock;
      createCommentVNode = module.createCommentVNode;
      inject = module.inject;
      Fragment = module.Fragment;
      renderList = module.renderList;
      toDisplayString = module.toDisplayString;
      normalizeClass = module.normalizeClass;
      isRef = module.isRef;
      customRef = module.customRef;
      h = module.h;
      getCurrentScope = module.getCurrentScope;
      onScopeDispose = module.onScopeDispose;
      resolveComponent = module.resolveComponent;
      withCtx = module.withCtx;
      normalizeStyle = module.normalizeStyle;
      resolveDynamicComponent = module.resolveDynamicComponent;
      unref = module.unref;
      pushScopeId = module.pushScopeId;
      popScopeId = module.popScopeId;
      createTextVNode = module.createTextVNode;
    }, module => {
      defineStore = module.defineStore;
      createPinia = module.createPinia;
    }, module => {
      Antd = module.default;
    }],
    execute: (function () {

      function tryOnScopeDispose(fn) {
        if (getCurrentScope()) {
          onScopeDispose(fn);
          return true;
        }
        return false;
      }
      const isClient = typeof window !== "undefined" && typeof document !== "undefined";
      typeof WorkerGlobalScope !== "undefined" && globalThis instanceof WorkerGlobalScope;
      const toString = Object.prototype.toString;
      const isObject = (val) => toString.call(val) === "[object Object]";
      function toArray(value) {
        return Array.isArray(value) ? value : [value];
      }
      function toRefs(objectRef, options = {}) {
        if (!isRef(objectRef))
          return toRefs$1(objectRef);
        const result = Array.isArray(objectRef.value) ? Array.from({ length: objectRef.value.length }) : {};
        for (const key in objectRef.value) {
          result[key] = customRef(() => ({
            get() {
              return objectRef.value[key];
            },
            set(v) {
              var _a;
              const replaceRef = (_a = toValue(options.replaceRef)) != null ? _a : true;
              if (replaceRef) {
                if (Array.isArray(objectRef.value)) {
                  const copy = [...objectRef.value];
                  copy[key] = v;
                  objectRef.value = copy;
                } else {
                  const newObject = { ...objectRef.value, [key]: v };
                  Object.setPrototypeOf(newObject, Object.getPrototypeOf(objectRef.value));
                  objectRef.value = newObject;
                }
              } else {
                objectRef.value[key] = v;
              }
            }
          }));
        }
        return result;
      }
      function watchImmediate(source, cb, options) {
        return watch(
          source,
          cb,
          {
            ...options,
            immediate: true
          }
        );
      }
      const defaultWindow = isClient ? window : void 0;
      function unrefElement(elRef) {
        var _a;
        const plain = toValue(elRef);
        return (_a = plain == null ? void 0 : plain.$el) != null ? _a : plain;
      }
      function useEventListener(...args) {
        const cleanups = [];
        const cleanup = () => {
          cleanups.forEach((fn) => fn());
          cleanups.length = 0;
        };
        const register = (el, event, listener, options) => {
          el.addEventListener(event, listener, options);
          return () => el.removeEventListener(event, listener, options);
        };
        const firstParamTargets = computed(() => {
          const test = toArray(toValue(args[0])).filter((e) => e != null);
          return test.every((e) => typeof e !== "string") ? test : void 0;
        });
        const stopWatch = watchImmediate(
          () => {
            var _a, _b;
            return [
              (_b = (_a = firstParamTargets.value) == null ? void 0 : _a.map((e) => unrefElement(e))) != null ? _b : [defaultWindow].filter((e) => e != null),
              toArray(toValue(firstParamTargets.value ? args[1] : args[0])),
              toArray(unref(firstParamTargets.value ? args[2] : args[1])),
              // @ts-expect-error - TypeScript gets the correct types, but somehow still complains
              toValue(firstParamTargets.value ? args[3] : args[2])
            ];
          },
          ([raw_targets, raw_events, raw_listeners, raw_options]) => {
            cleanup();
            if (!(raw_targets == null ? void 0 : raw_targets.length) || !(raw_events == null ? void 0 : raw_events.length) || !(raw_listeners == null ? void 0 : raw_listeners.length))
              return;
            const optionsClone = isObject(raw_options) ? { ...raw_options } : raw_options;
            cleanups.push(
              ...raw_targets.flatMap(
                (el) => raw_events.flatMap(
                  (event) => raw_listeners.map((listener) => register(el, event, listener, optionsClone))
                )
              )
            );
          },
          { flush: "post" }
        );
        const stop = () => {
          stopWatch();
          cleanup();
        };
        tryOnScopeDispose(cleanup);
        return stop;
      }
      function useDraggable(target, options = {}) {
        var _a;
        const {
          pointerTypes,
          preventDefault: preventDefault2,
          stopPropagation,
          exact,
          onMove,
          onEnd,
          onStart,
          initialValue,
          axis = "both",
          draggingElement = defaultWindow,
          containerElement,
          handle: draggingHandle = target,
          buttons = [0]
        } = options;
        const position = ref(
          (_a = toValue(initialValue)) != null ? _a : { x: 0, y: 0 }
        );
        const pressedDelta = ref();
        const filterEvent = (e) => {
          if (pointerTypes)
            return pointerTypes.includes(e.pointerType);
          return true;
        };
        const handleEvent = (e) => {
          if (toValue(preventDefault2))
            e.preventDefault();
          if (toValue(stopPropagation))
            e.stopPropagation();
        };
        const start = (e) => {
          var _a2;
          if (!toValue(buttons).includes(e.button))
            return;
          if (toValue(options.disabled) || !filterEvent(e))
            return;
          if (toValue(exact) && e.target !== toValue(target))
            return;
          const container = toValue(containerElement);
          const containerRect = (_a2 = container == null ? void 0 : container.getBoundingClientRect) == null ? void 0 : _a2.call(container);
          const targetRect = toValue(target).getBoundingClientRect();
          const pos = {
            x: e.clientX - (container ? targetRect.left - containerRect.left + container.scrollLeft : targetRect.left),
            y: e.clientY - (container ? targetRect.top - containerRect.top + container.scrollTop : targetRect.top)
          };
          if ((onStart == null ? void 0 : onStart(pos, e)) === false)
            return;
          pressedDelta.value = pos;
          handleEvent(e);
        };
        const move = (e) => {
          if (toValue(options.disabled) || !filterEvent(e))
            return;
          if (!pressedDelta.value)
            return;
          const container = toValue(containerElement);
          const targetRect = toValue(target).getBoundingClientRect();
          let { x, y } = position.value;
          if (axis === "x" || axis === "both") {
            x = e.clientX - pressedDelta.value.x;
            if (container)
              x = Math.min(Math.max(0, x), container.scrollWidth - targetRect.width);
          }
          if (axis === "y" || axis === "both") {
            y = e.clientY - pressedDelta.value.y;
            if (container)
              y = Math.min(Math.max(0, y), container.scrollHeight - targetRect.height);
          }
          position.value = {
            x,
            y
          };
          onMove == null ? void 0 : onMove(position.value, e);
          handleEvent(e);
        };
        const end = (e) => {
          if (toValue(options.disabled) || !filterEvent(e))
            return;
          if (!pressedDelta.value)
            return;
          pressedDelta.value = void 0;
          onEnd == null ? void 0 : onEnd(position.value, e);
          handleEvent(e);
        };
        if (isClient) {
          const config = () => {
            var _a2;
            return {
              capture: (_a2 = options.capture) != null ? _a2 : true,
              passive: !toValue(preventDefault2)
            };
          };
          useEventListener(draggingHandle, "pointerdown", start, config);
          useEventListener(draggingElement, "pointermove", move, config);
          useEventListener(draggingElement, "pointerup", end, config);
        }
        return {
          ...toRefs(position),
          position,
          isDragging: computed(() => !!pressedDelta.value),
          style: computed(
            () => `left:${position.value.x}px;top:${position.value.y}px;`
          )
        };
      }
      const LOG_TYPES = {
        INFO: "info",
        // ℹ️ 普通信息
        SUCCESS: "success",
        // ✅ 成功
        ERROR: "error",
        // ❌ 错误
        WARNING: "warning"
        // ⚠️ 警告
      };
      const useLogStore = defineStore("log", {
        state: () => ({
          logs: [],
          maxLogs: 100
          // 最大日志数量,防止内存占用过多
        }),
        actions: {
          addLog(message, type = LOG_TYPES.INFO) {
            const log = {
              id: Date.now(),
              message,
              type,
              timestamp: (/* @__PURE__ */ new Date()).toLocaleTimeString()
            };
            this.logs.push(log);
            if (this.logs.length > this.maxLogs) {
              this.logs.shift();
            }
            console.log(`${type || ""} ${message}`);
          },
          clearLogs() {
            this.logs = [];
          },
          // 按类型获取日志
          getLogsByType(type) {
            return this.logs.filter((log) => log.type === type);
          }
        },
        getters: {
          // 获取最新的n条日志
          getLogs: (state) => {
            return state.logs;
          },
          // 获取错误日志
          errorLogs: (state) => {
            return state.logs.filter((log) => log.type === "error");
          },
          // 获取成功日志
          successLogs: (state) => {
            return state.logs.filter((log) => log.type === "success");
          },
          // 获取日志总数
          totalLogs: (state) => {
            return state.logs.length;
          }
        }
      });
      const _export_sfc = (sfc, props) => {
        const target = sfc.__vccOpts || sfc;
        for (const [key, val] of props) {
          target[key] = val;
        }
        return target;
      };
      const _sfc_main$4 = defineComponent({
        setup() {
          const logStore2 = useLogStore();
          const getTypeIcon = (type) => {
            switch (type) {
              case LOG_TYPES.SUCCESS:
                return "✅";
              case LOG_TYPES.ERROR:
                return "❌";
              case LOG_TYPES.WARNING:
                return "⚠️";
              case LOG_TYPES.INFO:
              default:
                return "ℹ️";
            }
          };
          return {
            logStore: logStore2,
            getTypeIcon
          };
        }
      });
      const _hoisted_1$4 = {
        class: "log-viewer",
        style: { "max-height": "300px", "overflow": "hidden", "overflow-y": "auto" }
      };
      const _hoisted_2$4 = { class: "log-content" };
      const _hoisted_3$3 = {
        class: "log-time",
        style: { "margin-right": "10px" }
      };
      const _hoisted_4$3 = {
        class: "log-icon",
        style: { "margin-right": "5px" }
      };
      const _hoisted_5$3 = { class: "log-message" };
      function _sfc_render$3(_ctx, _cache, $props, $setup, $data, $options) {
        return openBlock(), createElementBlock("div", _hoisted_1$4, [
          createElementVNode("div", _hoisted_2$4, [
            (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.logStore.getLogs, (log, index) => {
              return openBlock(), createElementBlock("div", {
                key: index,
                class: normalizeClass(["log-item", log.type]),
                style: { "margin-bottom": "1px" }
              }, [
                createElementVNode("span", _hoisted_3$3, toDisplayString(log.timestamp), 1),
                createElementVNode("span", _hoisted_4$3, toDisplayString(_ctx.getTypeIcon(log.type)), 1),
                createElementVNode("span", _hoisted_5$3, toDisplayString(log.message), 1)
              ], 2);
            }), 128))
          ])
        ]);
      }
      const LogViewer = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["render", _sfc_render$3], ["__scopeId", "data-v-657dd456"]]);
      const useAnswerStore = defineStore("answer", {
        state: () => ({
          answers: [],
          maxAnswers: 100
          // 最大答题记录数量
        }),
        actions: {
          // 添加一个答题记录
          addAnswer(question, answer, type) {
            const answerRecord = {
              id: Date.now(),
              question,
              answer,
              type,
              timestamp: (/* @__PURE__ */ new Date()).toLocaleTimeString()
            };
            this.answers.push(answerRecord);
            if (this.answers.length > this.maxAnswers) {
              this.answers.shift();
            }
          },
          // 清空所有答题记录
          clearAnswers() {
            this.answers = [];
          }
        },
        getters: {
          // 获取所有答题记录
          getAnswers: (state) => {
            return state.answers;
          },
          // 获取特定类型的答题记录
          getAnswersByType: (state) => (type) => {
            return state.answers.filter((answer) => answer.type === type);
          },
          // 获取答题记录总数
          totalAnswers: (state) => {
            return state.answers.length;
          }
        }
      });
      const _sfc_main$3 = defineComponent({
        setup() {
          const answerStore2 = useAnswerStore();
          const formatAnswer = (answer) => {
            if (Array.isArray(answer)) {
              return answer.join("、");
            } else if (answer === "true") {
              return "✓ 正确";
            } else if (answer === "false") {
              return "✗ 错误";
            }
            return answer;
          };
          return {
            answerStore: answerStore2,
            formatAnswer
          };
        }
      });
      const _hoisted_1$3 = {
        class: "answer-viewer",
        style: { "max-height": "300px", "overflow": "hidden", "overflow-y": "auto" }
      };
      const _hoisted_2$3 = {
        key: 0,
        class: "empty-message",
        style: { "text-align": "center", "color": "#999", "padding": "20px" }
      };
      const _hoisted_3$2 = {
        key: 1,
        class: "answer-content"
      };
      const _hoisted_4$2 = {
        class: "answer-question",
        style: { "margin-bottom": "5px", "word-break": "break-all" }
      };
      const _hoisted_5$2 = /* @__PURE__ */ createElementVNode("span", {
        class: "label",
        style: { "margin-right": "5px" }
      }, "题号:", -1);
      const _hoisted_6$2 = {
        class: "answer-question",
        style: { "margin-bottom": "5px" }
      };
      const _hoisted_7$1 = /* @__PURE__ */ createElementVNode("span", {
        class: "label",
        style: { "margin-right": "5px" }
      }, "题目:", -1);
      const _hoisted_8$1 = ["innerHTML"];
      const _hoisted_9$1 = {
        class: "answer-value",
        style: { "margin-bottom": "5px", "word-break": "break-all" }
      };
      const _hoisted_10$1 = /* @__PURE__ */ createElementVNode("span", {
        class: "label",
        style: { "margin-right": "5px" }
      }, "答案:", -1);
      const _hoisted_11$1 = /* @__PURE__ */ createElementVNode("div", {
        class: "divider",
        style: { "height": "1px", "background-color": "#eee", "margin": "10px 0" }
      }, null, -1);
      function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {
        return openBlock(), createElementBlock("div", _hoisted_1$3, [
          _ctx.answerStore.totalAnswers === 0 ? (openBlock(), createElementBlock("div", _hoisted_2$3, " 暂无答题记录 ")) : (openBlock(), createElementBlock("div", _hoisted_3$2, [
            (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.answerStore.getAnswers, (item, index) => {
              return openBlock(), createElementBlock("div", {
                key: item.id,
                class: "answer-item",
                style: { "margin-bottom": "15px", "background-color": "#f9f9f9", "border-radius": "8px", "padding": "10px", "box-shadow": "0 1px 3px rgba(0,0,0,0.1)" }
              }, [
                createElementVNode("div", _hoisted_4$2, [
                  _hoisted_5$2,
                  createElementVNode("span", null, toDisplayString(index + 1), 1)
                ]),
                createElementVNode("div", _hoisted_6$2, [
                  _hoisted_7$1,
                  createElementVNode("span", {
                    innerHTML: item.question
                  }, null, 8, _hoisted_8$1)
                ]),
                createElementVNode("div", _hoisted_9$1, [
                  _hoisted_10$1,
                  createElementVNode("span", null, toDisplayString(_ctx.formatAnswer(item.answer)), 1)
                ]),
                _hoisted_11$1
              ]);
            }), 128))
          ]))
        ]);
      }
      const AnswerViewer = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["render", _sfc_render$2]]);
      const defaultSettings = {
        // 视频设置
        videoSettings: {
          playbackRate: 1.5
          // 视频播放速度
        },
        // 任务提交设置
        submitSettings: {
          autoSubmitChapter: true,
          // 自动提交章节作业
          autoSubmitHomework: false,
          // 自动提交课后作业
          autoSubmitExam: false,
          // 自动提交考试
          correctRateThreshold: 90
          // 正确率达到多少时自动提交(%)
        },
        // 自动化设置
        automationSettings: {
          autoNextChapter: true,
          // 自动跳转下一章节
          onlyDoQuestions: false,
          // 只答题,不做其他任务
          skipFinishedTasks: true
          // 跳过已完成任务点
        },
        // 答题设置
        answerSettings: {
          searchInterval: 3,
          // 搜题间隔(秒)
          useAIWhenNoAnswer: false,
          // 无答案时使用AI答题
          saveAnswerHistory: true,
          // 保存答题历史
          token: ""
          // 答题接口的token
        },
        // UI设置
        uiSettings: {
          activeTab: "1",
          // 默认激活的标签页
          position: {
            // 悬浮窗位置
            x: 0,
            y: 0
          }
        }
      };
      const loadSettings = () => {
        try {
          if (typeof GM_getValue === "function") {
            const savedSettings = GM_getValue("cxSettings");
            if (savedSettings) {
              return JSON.parse(savedSettings);
            }
          } else {
            const savedSettings = localStorage.getItem("cxSettings");
            if (savedSettings) {
              return JSON.parse(savedSettings);
            }
          }
        } catch (error) {
          console.error("读取设置失败:", error);
        }
        return defaultSettings;
      };
      const saveSettings = (settings) => {
        try {
          const settingsStr = JSON.stringify(settings);
          if (typeof GM_setValue === "function") {
            GM_setValue("cxSettings", settingsStr);
          } else {
            localStorage.setItem("cxSettings", settingsStr);
          }
          return true;
        } catch (error) {
          console.error("保存设置失败:", error);
          return false;
        }
      };
      const useSettingsStore = defineStore("settings", {
        state: () => loadSettings(),
        actions: {
          // 更新单个设置项
          updateSetting(category, key, value) {
            if (this[category] && key in this[category]) {
              this[category][key] = value;
              this.saveSettings();
            }
          },
          // 更新嵌套设置项
          updateNestedSetting(category, parent, key, value) {
            if (this[category] && this[category][parent] && key in this[category][parent]) {
              this[category][parent][key] = value;
              this.saveSettings();
            }
          },
          // 更新token
          updateToken(token) {
            this.answerSettings.token = token;
            this.saveSettings();
          },
          // 更新悬浮窗位置
          updatePosition(x, y) {
            this.uiSettings.position.x = x;
            this.uiSettings.position.y = y;
            this.saveSettings();
          },
          // 重置为默认设置
          resetSettings() {
            const token = this.answerSettings.token;
            const position = { ...this.uiSettings.position };
            Object.keys(defaultSettings).forEach((category) => {
              this[category] = { ...defaultSettings[category] };
            });
            this.answerSettings.token = token;
            this.uiSettings.position = position;
            this.saveSettings();
          },
          // 保存当前设置
          saveSettings() {
            saveSettings(this.$state);
          }
        }
      });
      function bound01(n, max) {
        if (isOnePointZero(n)) {
          n = "100%";
        }
        var isPercent = isPercentage(n);
        n = max === 360 ? n : Math.min(max, Math.max(0, parseFloat(n)));
        if (isPercent) {
          n = parseInt(String(n * max), 10) / 100;
        }
        if (Math.abs(n - max) < 1e-6) {
          return 1;
        }
        if (max === 360) {
          n = (n < 0 ? n % max + max : n % max) / parseFloat(String(max));
        } else {
          n = n % max / parseFloat(String(max));
        }
        return n;
      }
      function isOnePointZero(n) {
        return typeof n === "string" && n.indexOf(".") !== -1 && parseFloat(n) === 1;
      }
      function isPercentage(n) {
        return typeof n === "string" && n.indexOf("%") !== -1;
      }
      function boundAlpha(a) {
        a = parseFloat(a);
        if (isNaN(a) || a < 0 || a > 1) {
          a = 1;
        }
        return a;
      }
      function convertToPercentage(n) {
        if (n <= 1) {
          return "".concat(Number(n) * 100, "%");
        }
        return n;
      }
      function pad2(c) {
        return c.length === 1 ? "0" + c : String(c);
      }
      function rgbToRgb(r, g, b) {
        return {
          r: bound01(r, 255) * 255,
          g: bound01(g, 255) * 255,
          b: bound01(b, 255) * 255
        };
      }
      function hue2rgb(p, q, t) {
        if (t < 0) {
          t += 1;
        }
        if (t > 1) {
          t -= 1;
        }
        if (t < 1 / 6) {
          return p + (q - p) * (6 * t);
        }
        if (t < 1 / 2) {
          return q;
        }
        if (t < 2 / 3) {
          return p + (q - p) * (2 / 3 - t) * 6;
        }
        return p;
      }
      function hslToRgb(h2, s, l) {
        var r;
        var g;
        var b;
        h2 = bound01(h2, 360);
        s = bound01(s, 100);
        l = bound01(l, 100);
        if (s === 0) {
          g = l;
          b = l;
          r = l;
        } else {
          var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
          var p = 2 * l - q;
          r = hue2rgb(p, q, h2 + 1 / 3);
          g = hue2rgb(p, q, h2);
          b = hue2rgb(p, q, h2 - 1 / 3);
        }
        return { r: r * 255, g: g * 255, b: b * 255 };
      }
      function rgbToHsv(r, g, b) {
        r = bound01(r, 255);
        g = bound01(g, 255);
        b = bound01(b, 255);
        var max = Math.max(r, g, b);
        var min = Math.min(r, g, b);
        var h2 = 0;
        var v = max;
        var d = max - min;
        var s = max === 0 ? 0 : d / max;
        if (max === min) {
          h2 = 0;
        } else {
          switch (max) {
            case r:
              h2 = (g - b) / d + (g < b ? 6 : 0);
              break;
            case g:
              h2 = (b - r) / d + 2;
              break;
            case b:
              h2 = (r - g) / d + 4;
              break;
          }
          h2 /= 6;
        }
        return { h: h2, s, v };
      }
      function hsvToRgb(h2, s, v) {
        h2 = bound01(h2, 360) * 6;
        s = bound01(s, 100);
        v = bound01(v, 100);
        var i = Math.floor(h2);
        var f = h2 - i;
        var p = v * (1 - s);
        var q = v * (1 - f * s);
        var t = v * (1 - (1 - f) * s);
        var mod = i % 6;
        var r = [v, q, p, p, t, v][mod];
        var g = [t, v, v, q, p, p][mod];
        var b = [p, p, t, v, v, q][mod];
        return { r: r * 255, g: g * 255, b: b * 255 };
      }
      function rgbToHex(r, g, b, allow3Char) {
        var hex = [
          pad2(Math.round(r).toString(16)),
          pad2(Math.round(g).toString(16)),
          pad2(Math.round(b).toString(16))
        ];
        return hex.join("");
      }
      function convertHexToDecimal(h2) {
        return parseIntFromHex(h2) / 255;
      }
      function parseIntFromHex(val) {
        return parseInt(val, 16);
      }
      var names = {
        aliceblue: "#f0f8ff",
        antiquewhite: "#faebd7",
        aqua: "#00ffff",
        aquamarine: "#7fffd4",
        azure: "#f0ffff",
        beige: "#f5f5dc",
        bisque: "#ffe4c4",
        black: "#000000",
        blanchedalmond: "#ffebcd",
        blue: "#0000ff",
        blueviolet: "#8a2be2",
        brown: "#a52a2a",
        burlywood: "#deb887",
        cadetblue: "#5f9ea0",
        chartreuse: "#7fff00",
        chocolate: "#d2691e",
        coral: "#ff7f50",
        cornflowerblue: "#6495ed",
        cornsilk: "#fff8dc",
        crimson: "#dc143c",
        cyan: "#00ffff",
        darkblue: "#00008b",
        darkcyan: "#008b8b",
        darkgoldenrod: "#b8860b",
        darkgray: "#a9a9a9",
        darkgreen: "#006400",
        darkgrey: "#a9a9a9",
        darkkhaki: "#bdb76b",
        darkmagenta: "#8b008b",
        darkolivegreen: "#556b2f",
        darkorange: "#ff8c00",
        darkorchid: "#9932cc",
        darkred: "#8b0000",
        darksalmon: "#e9967a",
        darkseagreen: "#8fbc8f",
        darkslateblue: "#483d8b",
        darkslategray: "#2f4f4f",
        darkslategrey: "#2f4f4f",
        darkturquoise: "#00ced1",
        darkviolet: "#9400d3",
        deeppink: "#ff1493",
        deepskyblue: "#00bfff",
        dimgray: "#696969",
        dimgrey: "#696969",
        dodgerblue: "#1e90ff",
        firebrick: "#b22222",
        floralwhite: "#fffaf0",
        forestgreen: "#228b22",
        fuchsia: "#ff00ff",
        gainsboro: "#dcdcdc",
        ghostwhite: "#f8f8ff",
        goldenrod: "#daa520",
        gold: "#ffd700",
        gray: "#808080",
        green: "#008000",
        greenyellow: "#adff2f",
        grey: "#808080",
        honeydew: "#f0fff0",
        hotpink: "#ff69b4",
        indianred: "#cd5c5c",
        indigo: "#4b0082",
        ivory: "#fffff0",
        khaki: "#f0e68c",
        lavenderblush: "#fff0f5",
        lavender: "#e6e6fa",
        lawngreen: "#7cfc00",
        lemonchiffon: "#fffacd",
        lightblue: "#add8e6",
        lightcoral: "#f08080",
        lightcyan: "#e0ffff",
        lightgoldenrodyellow: "#fafad2",
        lightgray: "#d3d3d3",
        lightgreen: "#90ee90",
        lightgrey: "#d3d3d3",
        lightpink: "#ffb6c1",
        lightsalmon: "#ffa07a",
        lightseagreen: "#20b2aa",
        lightskyblue: "#87cefa",
        lightslategray: "#778899",
        lightslategrey: "#778899",
        lightsteelblue: "#b0c4de",
        lightyellow: "#ffffe0",
        lime: "#00ff00",
        limegreen: "#32cd32",
        linen: "#faf0e6",
        magenta: "#ff00ff",
        maroon: "#800000",
        mediumaquamarine: "#66cdaa",
        mediumblue: "#0000cd",
        mediumorchid: "#ba55d3",
        mediumpurple: "#9370db",
        mediumseagreen: "#3cb371",
        mediumslateblue: "#7b68ee",
        mediumspringgreen: "#00fa9a",
        mediumturquoise: "#48d1cc",
        mediumvioletred: "#c71585",
        midnightblue: "#191970",
        mintcream: "#f5fffa",
        mistyrose: "#ffe4e1",
        moccasin: "#ffe4b5",
        navajowhite: "#ffdead",
        navy: "#000080",
        oldlace: "#fdf5e6",
        olive: "#808000",
        olivedrab: "#6b8e23",
        orange: "#ffa500",
        orangered: "#ff4500",
        orchid: "#da70d6",
        palegoldenrod: "#eee8aa",
        palegreen: "#98fb98",
        paleturquoise: "#afeeee",
        palevioletred: "#db7093",
        papayawhip: "#ffefd5",
        peachpuff: "#ffdab9",
        peru: "#cd853f",
        pink: "#ffc0cb",
        plum: "#dda0dd",
        powderblue: "#b0e0e6",
        purple: "#800080",
        rebeccapurple: "#663399",
        red: "#ff0000",
        rosybrown: "#bc8f8f",
        royalblue: "#4169e1",
        saddlebrown: "#8b4513",
        salmon: "#fa8072",
        sandybrown: "#f4a460",
        seagreen: "#2e8b57",
        seashell: "#fff5ee",
        sienna: "#a0522d",
        silver: "#c0c0c0",
        skyblue: "#87ceeb",
        slateblue: "#6a5acd",
        slategray: "#708090",
        slategrey: "#708090",
        snow: "#fffafa",
        springgreen: "#00ff7f",
        steelblue: "#4682b4",
        tan: "#d2b48c",
        teal: "#008080",
        thistle: "#d8bfd8",
        tomato: "#ff6347",
        turquoise: "#40e0d0",
        violet: "#ee82ee",
        wheat: "#f5deb3",
        white: "#ffffff",
        whitesmoke: "#f5f5f5",
        yellow: "#ffff00",
        yellowgreen: "#9acd32"
      };
      function inputToRGB(color) {
        var rgb = { r: 0, g: 0, b: 0 };
        var a = 1;
        var s = null;
        var v = null;
        var l = null;
        var ok = false;
        var format = false;
        if (typeof color === "string") {
          color = stringInputToObject(color);
        }
        if (typeof color === "object") {
          if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {
            rgb = rgbToRgb(color.r, color.g, color.b);
            ok = true;
            format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb";
          } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {
            s = convertToPercentage(color.s);
            v = convertToPercentage(color.v);
            rgb = hsvToRgb(color.h, s, v);
            ok = true;
            format = "hsv";
          } else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {
            s = convertToPercentage(color.s);
            l = convertToPercentage(color.l);
            rgb = hslToRgb(color.h, s, l);
            ok = true;
            format = "hsl";
          }
          if (Object.prototype.hasOwnProperty.call(color, "a")) {
            a = color.a;
          }
        }
        a = boundAlpha(a);
        return {
          ok,
          format: color.format || format,
          r: Math.min(255, Math.max(rgb.r, 0)),
          g: Math.min(255, Math.max(rgb.g, 0)),
          b: Math.min(255, Math.max(rgb.b, 0)),
          a
        };
      }
      var CSS_INTEGER = "[-\\+]?\\d+%?";
      var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
      var CSS_UNIT = "(?:".concat(CSS_NUMBER, ")|(?:").concat(CSS_INTEGER, ")");
      var PERMISSIVE_MATCH3 = "[\\s|\\(]+(".concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")\\s*\\)?");
      var PERMISSIVE_MATCH4 = "[\\s|\\(]+(".concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")[,|\\s]+(").concat(CSS_UNIT, ")\\s*\\)?");
      var matchers = {
        CSS_UNIT: new RegExp(CSS_UNIT),
        rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
        rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
        hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
        hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
        hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
        hsva: new RegExp("hsva" + PERMISSIVE_MATCH4),
        hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
        hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
        hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
        hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
      };
      function stringInputToObject(color) {
        color = color.trim().toLowerCase();
        if (color.length === 0) {
          return false;
        }
        var named = false;
        if (names[color]) {
          color = names[color];
          named = true;
        } else if (color === "transparent") {
          return { r: 0, g: 0, b: 0, a: 0, format: "name" };
        }
        var match = matchers.rgb.exec(color);
        if (match) {
          return { r: match[1], g: match[2], b: match[3] };
        }
        match = matchers.rgba.exec(color);
        if (match) {
          return { r: match[1], g: match[2], b: match[3], a: match[4] };
        }
        match = matchers.hsl.exec(color);
        if (match) {
          return { h: match[1], s: match[2], l: match[3] };
        }
        match = matchers.hsla.exec(color);
        if (match) {
          return { h: match[1], s: match[2], l: match[3], a: match[4] };
        }
        match = matchers.hsv.exec(color);
        if (match) {
          return { h: match[1], s: match[2], v: match[3] };
        }
        match = matchers.hsva.exec(color);
        if (match) {
          return { h: match[1], s: match[2], v: match[3], a: match[4] };
        }
        match = matchers.hex8.exec(color);
        if (match) {
          return {
            r: parseIntFromHex(match[1]),
            g: parseIntFromHex(match[2]),
            b: parseIntFromHex(match[3]),
            a: convertHexToDecimal(match[4]),
            format: named ? "name" : "hex8"
          };
        }
        match = matchers.hex6.exec(color);
        if (match) {
          return {
            r: parseIntFromHex(match[1]),
            g: parseIntFromHex(match[2]),
            b: parseIntFromHex(match[3]),
            format: named ? "name" : "hex"
          };
        }
        match = matchers.hex4.exec(color);
        if (match) {
          return {
            r: parseIntFromHex(match[1] + match[1]),
            g: parseIntFromHex(match[2] + match[2]),
            b: parseIntFromHex(match[3] + match[3]),
            a: convertHexToDecimal(match[4] + match[4]),
            format: named ? "name" : "hex8"
          };
        }
        match = matchers.hex3.exec(color);
        if (match) {
          return {
            r: parseIntFromHex(match[1] + match[1]),
            g: parseIntFromHex(match[2] + match[2]),
            b: parseIntFromHex(match[3] + match[3]),
            format: named ? "name" : "hex"
          };
        }
        return false;
      }
      function isValidCSSUnit(color) {
        return Boolean(matchers.CSS_UNIT.exec(String(color)));
      }
      var hueStep = 2;
      var saturationStep = 0.16;
      var saturationStep2 = 0.05;
      var brightnessStep1 = 0.05;
      var brightnessStep2 = 0.15;
      var lightColorCount = 5;
      var darkColorCount = 4;
      var darkColorMap = [{
        index: 7,
        opacity: 0.15
      }, {
        index: 6,
        opacity: 0.25
      }, {
        index: 5,
        opacity: 0.3
      }, {
        index: 5,
        opacity: 0.45
      }, {
        index: 5,
        opacity: 0.65
      }, {
        index: 5,
        opacity: 0.85
      }, {
        index: 4,
        opacity: 0.9
      }, {
        index: 3,
        opacity: 0.95
      }, {
        index: 2,
        opacity: 0.97
      }, {
        index: 1,
        opacity: 0.98
      }];
      function toHsv(_ref) {
        var r = _ref.r, g = _ref.g, b = _ref.b;
        var hsv = rgbToHsv(r, g, b);
        return {
          h: hsv.h * 360,
          s: hsv.s,
          v: hsv.v
        };
      }
      function toHex(_ref2) {
        var r = _ref2.r, g = _ref2.g, b = _ref2.b;
        return "#".concat(rgbToHex(r, g, b));
      }
      function mix(rgb1, rgb2, amount) {
        var p = amount / 100;
        var rgb = {
          r: (rgb2.r - rgb1.r) * p + rgb1.r,
          g: (rgb2.g - rgb1.g) * p + rgb1.g,
          b: (rgb2.b - rgb1.b) * p + rgb1.b
        };
        return rgb;
      }
      function getHue(hsv, i, light) {
        var hue;
        if (Math.round(hsv.h) >= 60 && Math.round(hsv.h) <= 240) {
          hue = light ? Math.round(hsv.h) - hueStep * i : Math.round(hsv.h) + hueStep * i;
        } else {
          hue = light ? Math.round(hsv.h) + hueStep * i : Math.round(hsv.h) - hueStep * i;
        }
        if (hue < 0) {
          hue += 360;
        } else if (hue >= 360) {
          hue -= 360;
        }
        return hue;
      }
      function getSaturation(hsv, i, light) {
        if (hsv.h === 0 && hsv.s === 0) {
          return hsv.s;
        }
        var saturation;
        if (light) {
          saturation = hsv.s - saturationStep * i;
        } else if (i === darkColorCount) {
          saturation = hsv.s + saturationStep;
        } else {
          saturation = hsv.s + saturationStep2 * i;
        }
        if (saturation > 1) {
          saturation = 1;
        }
        if (light && i === lightColorCount && saturation > 0.1) {
          saturation = 0.1;
        }
        if (saturation < 0.06) {
          saturation = 0.06;
        }
        return Number(saturation.toFixed(2));
      }
      function getValue(hsv, i, light) {
        var value;
        if (light) {
          value = hsv.v + brightnessStep1 * i;
        } else {
          value = hsv.v - brightnessStep2 * i;
        }
        if (value > 1) {
          value = 1;
        }
        return Number(value.toFixed(2));
      }
      function generate$1(color) {
        var opts = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
        var patterns = [];
        var pColor = inputToRGB(color);
        for (var i = lightColorCount; i > 0; i -= 1) {
          var hsv = toHsv(pColor);
          var colorString = toHex(inputToRGB({
            h: getHue(hsv, i, true),
            s: getSaturation(hsv, i, true),
            v: getValue(hsv, i, true)
          }));
          patterns.push(colorString);
        }
        patterns.push(toHex(pColor));
        for (var _i = 1; _i <= darkColorCount; _i += 1) {
          var _hsv = toHsv(pColor);
          var _colorString = toHex(inputToRGB({
            h: getHue(_hsv, _i),
            s: getSaturation(_hsv, _i),
            v: getValue(_hsv, _i)
          }));
          patterns.push(_colorString);
        }
        if (opts.theme === "dark") {
          return darkColorMap.map(function(_ref3) {
            var index = _ref3.index, opacity = _ref3.opacity;
            var darkColorString = toHex(mix(inputToRGB(opts.backgroundColor || "#141414"), inputToRGB(patterns[index]), opacity * 100));
            return darkColorString;
          });
        }
        return patterns;
      }
      var presetPrimaryColors = {
        red: "#F5222D",
        volcano: "#FA541C",
        orange: "#FA8C16",
        gold: "#FAAD14",
        yellow: "#FADB14",
        lime: "#A0D911",
        green: "#52C41A",
        cyan: "#13C2C2",
        blue: "#1890FF",
        geekblue: "#2F54EB",
        purple: "#722ED1",
        magenta: "#EB2F96",
        grey: "#666666"
      };
      var presetPalettes = {};
      var presetDarkPalettes = {};
      Object.keys(presetPrimaryColors).forEach(function(key) {
        presetPalettes[key] = generate$1(presetPrimaryColors[key]);
        presetPalettes[key].primary = presetPalettes[key][5];
        presetDarkPalettes[key] = generate$1(presetPrimaryColors[key], {
          theme: "dark",
          backgroundColor: "#141414"
        });
        presetDarkPalettes[key].primary = presetDarkPalettes[key][5];
      });
      var blue = presetPalettes.blue;
      var contextKey = Symbol("iconContext");
      var useInjectIconContext = function useInjectIconContext2() {
        return inject(contextKey, {
          prefixCls: ref("anticon"),
          rootClassName: ref(""),
          csp: ref()
        });
      };
      function canUseDom() {
        return !!(typeof window !== "undefined" && window.document && window.document.createElement);
      }
      function contains(root, n) {
        if (!root) {
          return false;
        }
        if (root.contains) {
          return root.contains(n);
        }
        return false;
      }
      var APPEND_ORDER = "data-vc-order";
      var MARK_KEY = "vc-icon-key";
      var containerCache = /* @__PURE__ */ new Map();
      function getMark() {
        var _ref = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}, mark = _ref.mark;
        if (mark) {
          return mark.startsWith("data-") ? mark : "data-".concat(mark);
        }
        return MARK_KEY;
      }
      function getContainer(option) {
        if (option.attachTo) {
          return option.attachTo;
        }
        var head = document.querySelector("head");
        return head || document.body;
      }
      function getOrder(prepend) {
        if (prepend === "queue") {
          return "prependQueue";
        }
        return prepend ? "prepend" : "append";
      }
      function findStyles(container) {
        return Array.from((containerCache.get(container) || container).children).filter(function(node) {
          return node.tagName === "STYLE";
        });
      }
      function injectCSS(css) {
        var option = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
        if (!canUseDom()) {
          return null;
        }
        var csp = option.csp, prepend = option.prepend;
        var styleNode = document.createElement("style");
        styleNode.setAttribute(APPEND_ORDER, getOrder(prepend));
        if (csp && csp.nonce) {
          styleNode.nonce = csp.nonce;
        }
        styleNode.innerHTML = css;
        var container = getContainer(option);
        var firstChild = container.firstChild;
        if (prepend) {
          if (prepend === "queue") {
            var existStyle = findStyles(container).filter(function(node) {
              return ["prepend", "prependQueue"].includes(node.getAttribute(APPEND_ORDER));
            });
            if (existStyle.length) {
              container.insertBefore(styleNode, existStyle[existStyle.length - 1].nextSibling);
              return styleNode;
            }
          }
          container.insertBefore(styleNode, firstChild);
        } else {
          container.appendChild(styleNode);
        }
        return styleNode;
      }
      function findExistNode(key) {
        var option = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
        var container = getContainer(option);
        return findStyles(container).find(function(node) {
          return node.getAttribute(getMark(option)) === key;
        });
      }
      function syncRealContainer(container, option) {
        var cachedRealContainer = containerCache.get(container);
        if (!cachedRealContainer || !contains(document, cachedRealContainer)) {
          var placeholderStyle = injectCSS("", option);
          var parentNode = placeholderStyle.parentNode;
          containerCache.set(container, parentNode);
          container.removeChild(placeholderStyle);
        }
      }
      function updateCSS(css, key) {
        var option = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : {};
        var container = getContainer(option);
        syncRealContainer(container, option);
        var existNode = findExistNode(key, option);
        if (existNode) {
          if (option.csp && option.csp.nonce && existNode.nonce !== option.csp.nonce) {
            existNode.nonce = option.csp.nonce;
          }
          if (existNode.innerHTML !== css) {
            existNode.innerHTML = css;
          }
          return existNode;
        }
        var newNode = injectCSS(css, option);
        newNode.setAttribute(getMark(option), key);
        return newNode;
      }
      function _objectSpread$6(target) {
        for (var i = 1; i < arguments.length; i++) {
          var source = arguments[i] != null ? Object(arguments[i]) : {};
          var ownKeys = Object.keys(source);
          if (typeof Object.getOwnPropertySymbols === "function") {
            ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
              return Object.getOwnPropertyDescriptor(source, sym).enumerable;
            }));
          }
          ownKeys.forEach(function(key) {
            _defineProperty$6(target, key, source[key]);
          });
        }
        return target;
      }
      function _defineProperty$6(obj, key, value) {
        if (key in obj) {
          Object.defineProperty(obj, key, { value, enumerable: true, configurable: true, writable: true });
        } else {
          obj[key] = value;
        }
        return obj;
      }
      function warning(valid, message) {
      }
      function isIconDefinition(target) {
        return typeof target === "object" && typeof target.name === "string" && typeof target.theme === "string" && (typeof target.icon === "object" || typeof target.icon === "function");
      }
      function generate(node, key, rootProps) {
        if (!rootProps) {
          return h(node.tag, _objectSpread$6({
            key
          }, node.attrs), (node.children || []).map(function(child, index) {
            return generate(child, "".concat(key, "-").concat(node.tag, "-").concat(index));
          }));
        }
        return h(node.tag, _objectSpread$6({
          key
        }, rootProps, node.attrs), (node.children || []).map(function(child, index) {
          return generate(child, "".concat(key, "-").concat(node.tag, "-").concat(index));
        }));
      }
      function getSecondaryColor(primaryColor) {
        return generate$1(primaryColor)[0];
      }
      function normalizeTwoToneColors(twoToneColor) {
        if (!twoToneColor) {
          return [];
        }
        return Array.isArray(twoToneColor) ? twoToneColor : [twoToneColor];
      }
      var iconStyles = "\n.anticon {\n  display: inline-block;\n  color: inherit;\n  font-style: normal;\n  line-height: 0;\n  text-align: center;\n  text-transform: none;\n  vertical-align: -0.125em;\n  text-rendering: optimizeLegibility;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.anticon > * {\n  line-height: 1;\n}\n\n.anticon svg {\n  display: inline-block;\n}\n\n.anticon::before {\n  display: none;\n}\n\n.anticon .anticon-icon {\n  display: block;\n}\n\n.anticon[tabindex] {\n  cursor: pointer;\n}\n\n.anticon-spin::before,\n.anticon-spin {\n  display: inline-block;\n  -webkit-animation: loadingCircle 1s infinite linear;\n  animation: loadingCircle 1s infinite linear;\n}\n\n@-webkit-keyframes loadingCircle {\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n\n@keyframes loadingCircle {\n  100% {\n    -webkit-transform: rotate(360deg);\n    transform: rotate(360deg);\n  }\n}\n";
      function getRoot(ele) {
        return ele && ele.getRootNode && ele.getRootNode();
      }
      function inShadow(ele) {
        if (!canUseDom()) {
          return false;
        }
        return getRoot(ele) instanceof ShadowRoot;
      }
      function getShadowRoot(ele) {
        return inShadow(ele) ? getRoot(ele) : null;
      }
      var useInsertStyles = function useInsertStyles2() {
        var _useInjectIconContext = useInjectIconContext(), prefixCls = _useInjectIconContext.prefixCls, csp = _useInjectIconContext.csp;
        var instance = getCurrentInstance();
        var mergedStyleStr = iconStyles;
        if (prefixCls) {
          mergedStyleStr = mergedStyleStr.replace(/anticon/g, prefixCls.value);
        }
        nextTick(function() {
          if (!canUseDom()) {
            return;
          }
          var ele = instance.vnode.el;
          var shadowRoot = getShadowRoot(ele);
          updateCSS(mergedStyleStr, "@ant-design-vue-icons", {
            prepend: true,
            csp: csp.value,
            attachTo: shadowRoot
          });
        });
      };
      var _excluded$1 = ["icon", "primaryColor", "secondaryColor"];
      function _objectWithoutProperties$1(source, excluded) {
        if (source == null) return {};
        var target = _objectWithoutPropertiesLoose$1(source, excluded);
        var key, i;
        if (Object.getOwnPropertySymbols) {
          var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
          for (i = 0; i < sourceSymbolKeys.length; i++) {
            key = sourceSymbolKeys[i];
            if (excluded.indexOf(key) >= 0) continue;
            if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
            target[key] = source[key];
          }
        }
        return target;
      }
      function _objectWithoutPropertiesLoose$1(source, excluded) {
        if (source == null) return {};
        var target = {};
        var sourceKeys = Object.keys(source);
        var key, i;
        for (i = 0; i < sourceKeys.length; i++) {
          key = sourceKeys[i];
          if (excluded.indexOf(key) >= 0) continue;
          target[key] = source[key];
        }
        return target;
      }
      function _objectSpread$5(target) {
        for (var i = 1; i < arguments.length; i++) {
          var source = arguments[i] != null ? Object(arguments[i]) : {};
          var ownKeys = Object.keys(source);
          if (typeof Object.getOwnPropertySymbols === "function") {
            ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
              return Object.getOwnPropertyDescriptor(source, sym).enumerable;
            }));
          }
          ownKeys.forEach(function(key) {
            _defineProperty$5(target, key, source[key]);
          });
        }
        return target;
      }
      function _defineProperty$5(obj, key, value) {
        if (key in obj) {
          Object.defineProperty(obj, key, { value, enumerable: true, configurable: true, writable: true });
        } else {
          obj[key] = value;
        }
        return obj;
      }
      var twoToneColorPalette = reactive({
        primaryColor: "#333",
        secondaryColor: "#E6E6E6",
        calculated: false
      });
      function setTwoToneColors(_ref) {
        var primaryColor = _ref.primaryColor, secondaryColor = _ref.secondaryColor;
        twoToneColorPalette.primaryColor = primaryColor;
        twoToneColorPalette.secondaryColor = secondaryColor || getSecondaryColor(primaryColor);
        twoToneColorPalette.calculated = !!secondaryColor;
      }
      function getTwoToneColors() {
        return _objectSpread$5({}, twoToneColorPalette);
      }
      var IconBase = function IconBase2(props, context) {
        var _props$context$attrs = _objectSpread$5({}, props, context.attrs), icon = _props$context$attrs.icon, primaryColor = _props$context$attrs.primaryColor, secondaryColor = _props$context$attrs.secondaryColor, restProps = _objectWithoutProperties$1(_props$context$attrs, _excluded$1);
        var colors = twoToneColorPalette;
        if (primaryColor) {
          colors = {
            primaryColor,
            secondaryColor: secondaryColor || getSecondaryColor(primaryColor)
          };
        }
        warning(isIconDefinition(icon));
        if (!isIconDefinition(icon)) {
          return null;
        }
        var target = icon;
        if (target && typeof target.icon === "function") {
          target = _objectSpread$5({}, target, {
            icon: target.icon(colors.primaryColor, colors.secondaryColor)
          });
        }
        return generate(target.icon, "svg-".concat(target.name), _objectSpread$5({}, restProps, {
          "data-icon": target.name,
          width: "1em",
          height: "1em",
          fill: "currentColor",
          "aria-hidden": "true"
        }));
      };
      IconBase.props = {
        icon: Object,
        primaryColor: String,
        secondaryColor: String,
        focusable: String
      };
      IconBase.inheritAttrs = false;
      IconBase.displayName = "IconBase";
      IconBase.getTwoToneColors = getTwoToneColors;
      IconBase.setTwoToneColors = setTwoToneColors;
      function _slicedToArray$1(arr, i) {
        return _arrayWithHoles$1(arr) || _iterableToArrayLimit$1(arr, i) || _unsupportedIterableToArray$1(arr, i) || _nonIterableRest$1();
      }
      function _nonIterableRest$1() {
        throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
      }
      function _unsupportedIterableToArray$1(o, minLen) {
        if (!o) return;
        if (typeof o === "string") return _arrayLikeToArray$1(o, minLen);
        var n = Object.prototype.toString.call(o).slice(8, -1);
        if (n === "Object" && o.constructor) n = o.constructor.name;
        if (n === "Map" || n === "Set") return Array.from(o);
        if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen);
      }
      function _arrayLikeToArray$1(arr, len) {
        if (len == null || len > arr.length) len = arr.length;
        for (var i = 0, arr2 = new Array(len); i < len; i++) {
          arr2[i] = arr[i];
        }
        return arr2;
      }
      function _iterableToArrayLimit$1(arr, i) {
        var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
        if (_i == null) return;
        var _arr = [];
        var _n = true;
        var _d = false;
        var _s, _e;
        try {
          for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
            _arr.push(_s.value);
            if (i && _arr.length === i) break;
          }
        } catch (err) {
          _d = true;
          _e = err;
        } finally {
          try {
            if (!_n && _i["return"] != null) _i["return"]();
          } finally {
            if (_d) throw _e;
          }
        }
        return _arr;
      }
      function _arrayWithHoles$1(arr) {
        if (Array.isArray(arr)) return arr;
      }
      function setTwoToneColor(twoToneColor) {
        var _normalizeTwoToneColo = normalizeTwoToneColors(twoToneColor), _normalizeTwoToneColo2 = _slicedToArray$1(_normalizeTwoToneColo, 2), primaryColor = _normalizeTwoToneColo2[0], secondaryColor = _normalizeTwoToneColo2[1];
        return IconBase.setTwoToneColors({
          primaryColor,
          secondaryColor
        });
      }
      function getTwoToneColor() {
        var colors = IconBase.getTwoToneColors();
        if (!colors.calculated) {
          return colors.primaryColor;
        }
        return [colors.primaryColor, colors.secondaryColor];
      }
      var InsertStyles = defineComponent({
        name: "InsertStyles",
        setup: function setup() {
          useInsertStyles();
          return function() {
            return null;
          };
        }
      });
      var _excluded = ["class", "icon", "spin", "rotate", "tabindex", "twoToneColor", "onClick"];
      function _slicedToArray(arr, i) {
        return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();
      }
      function _nonIterableRest() {
        throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
      }
      function _unsupportedIterableToArray(o, minLen) {
        if (!o) return;
        if (typeof o === "string") return _arrayLikeToArray(o, minLen);
        var n = Object.prototype.toString.call(o).slice(8, -1);
        if (n === "Object" && o.constructor) n = o.constructor.name;
        if (n === "Map" || n === "Set") return Array.from(o);
        if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
      }
      function _arrayLikeToArray(arr, len) {
        if (len == null || len > arr.length) len = arr.length;
        for (var i = 0, arr2 = new Array(len); i < len; i++) {
          arr2[i] = arr[i];
        }
        return arr2;
      }
      function _iterableToArrayLimit(arr, i) {
        var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
        if (_i == null) return;
        var _arr = [];
        var _n = true;
        var _d = false;
        var _s, _e;
        try {
          for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {
            _arr.push(_s.value);
            if (i && _arr.length === i) break;
          }
        } catch (err) {
          _d = true;
          _e = err;
        } finally {
          try {
            if (!_n && _i["return"] != null) _i["return"]();
          } finally {
            if (_d) throw _e;
          }
        }
        return _arr;
      }
      function _arrayWithHoles(arr) {
        if (Array.isArray(arr)) return arr;
      }
      function _objectSpread$4(target) {
        for (var i = 1; i < arguments.length; i++) {
          var source = arguments[i] != null ? Object(arguments[i]) : {};
          var ownKeys = Object.keys(source);
          if (typeof Object.getOwnPropertySymbols === "function") {
            ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
              return Object.getOwnPropertyDescriptor(source, sym).enumerable;
            }));
          }
          ownKeys.forEach(function(key) {
            _defineProperty$4(target, key, source[key]);
          });
        }
        return target;
      }
      function _defineProperty$4(obj, key, value) {
        if (key in obj) {
          Object.defineProperty(obj, key, { value, enumerable: true, configurable: true, writable: true });
        } else {
          obj[key] = value;
        }
        return obj;
      }
      function _objectWithoutProperties(source, excluded) {
        if (source == null) return {};
        var target = _objectWithoutPropertiesLoose(source, excluded);
        var key, i;
        if (Object.getOwnPropertySymbols) {
          var sourceSymbolKeys = Object.getOwnPropertySymbols(source);
          for (i = 0; i < sourceSymbolKeys.length; i++) {
            key = sourceSymbolKeys[i];
            if (excluded.indexOf(key) >= 0) continue;
            if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
            target[key] = source[key];
          }
        }
        return target;
      }
      function _objectWithoutPropertiesLoose(source, excluded) {
        if (source == null) return {};
        var target = {};
        var sourceKeys = Object.keys(source);
        var key, i;
        for (i = 0; i < sourceKeys.length; i++) {
          key = sourceKeys[i];
          if (excluded.indexOf(key) >= 0) continue;
          target[key] = source[key];
        }
        return target;
      }
      setTwoToneColor(blue.primary);
      var Icon = function Icon2(props, context) {
        var _classObj;
        var _props$context$attrs = _objectSpread$4({}, props, context.attrs), cls = _props$context$attrs["class"], icon = _props$context$attrs.icon, spin = _props$context$attrs.spin, rotate = _props$context$attrs.rotate, tabindex = _props$context$attrs.tabindex, twoToneColor = _props$context$attrs.twoToneColor, onClick = _props$context$attrs.onClick, restProps = _objectWithoutProperties(_props$context$attrs, _excluded);
        var _useInjectIconContext = useInjectIconContext(), prefixCls = _useInjectIconContext.prefixCls, rootClassName = _useInjectIconContext.rootClassName;
        var classObj = (_classObj = {}, _defineProperty$4(_classObj, rootClassName.value, !!rootClassName.value), _defineProperty$4(_classObj, prefixCls.value, true), _defineProperty$4(_classObj, "".concat(prefixCls.value, "-").concat(icon.name), Boolean(icon.name)), _defineProperty$4(_classObj, "".concat(prefixCls.value, "-spin"), !!spin || icon.name === "loading"), _classObj);
        var iconTabIndex = tabindex;
        if (iconTabIndex === void 0 && onClick) {
          iconTabIndex = -1;
        }
        var svgStyle = rotate ? {
          msTransform: "rotate(".concat(rotate, "deg)"),
          transform: "rotate(".concat(rotate, "deg)")
        } : void 0;
        var _normalizeTwoToneColo = normalizeTwoToneColors(twoToneColor), _normalizeTwoToneColo2 = _slicedToArray(_normalizeTwoToneColo, 2), primaryColor = _normalizeTwoToneColo2[0], secondaryColor = _normalizeTwoToneColo2[1];
        return createVNode("span", _objectSpread$4({
          "role": "img",
          "aria-label": icon.name
        }, restProps, {
          "onClick": onClick,
          "class": [classObj, cls],
          "tabindex": iconTabIndex
        }), [createVNode(IconBase, {
          "icon": icon,
          "primaryColor": primaryColor,
          "secondaryColor": secondaryColor,
          "style": svgStyle
        }, null), createVNode(InsertStyles, null, null)]);
      };
      Icon.props = {
        spin: Boolean,
        rotate: Number,
        icon: Object,
        twoToneColor: [String, Array]
      };
      Icon.displayName = "AntdIcon";
      Icon.inheritAttrs = false;
      Icon.getTwoToneColor = getTwoToneColor;
      Icon.setTwoToneColor = setTwoToneColor;
      var ExpandOutlined$1 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "defs", "attrs": {}, "children": [{ "tag": "style", "attrs": {} }] }, { "tag": "path", "attrs": { "d": "M342 88H120c-17.7 0-32 14.3-32 32v224c0 8.8 7.2 16 16 16h48c8.8 0 16-7.2 16-16V168h174c8.8 0 16-7.2 16-16v-48c0-8.8-7.2-16-16-16zm578 576h-48c-8.8 0-16 7.2-16 16v176H682c-8.8 0-16 7.2-16 16v48c0 8.8 7.2 16 16 16h222c17.7 0 32-14.3 32-32V680c0-8.8-7.2-16-16-16zM342 856H168V680c0-8.8-7.2-16-16-16h-48c-8.8 0-16 7.2-16 16v224c0 17.7 14.3 32 32 32h222c8.8 0 16-7.2 16-16v-48c0-8.8-7.2-16-16-16zM904 88H682c-8.8 0-16 7.2-16 16v48c0 8.8 7.2 16 16 16h174v176c0 8.8 7.2 16 16 16h48c8.8 0 16-7.2 16-16V120c0-17.7-14.3-32-32-32z" } }] }, "name": "expand", "theme": "outlined" };
      function _objectSpread$3(target) {
        for (var i = 1; i < arguments.length; i++) {
          var source = arguments[i] != null ? Object(arguments[i]) : {};
          var ownKeys = Object.keys(source);
          if (typeof Object.getOwnPropertySymbols === "function") {
            ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
              return Object.getOwnPropertyDescriptor(source, sym).enumerable;
            }));
          }
          ownKeys.forEach(function(key) {
            _defineProperty$3(target, key, source[key]);
          });
        }
        return target;
      }
      function _defineProperty$3(obj, key, value) {
        if (key in obj) {
          Object.defineProperty(obj, key, { value, enumerable: true, configurable: true, writable: true });
        } else {
          obj[key] = value;
        }
        return obj;
      }
      var ExpandOutlined = function ExpandOutlined2(props, context) {
        var p = _objectSpread$3({}, props, context.attrs);
        return createVNode(Icon, _objectSpread$3({}, p, {
          "icon": ExpandOutlined$1
        }), null);
      };
      ExpandOutlined.displayName = "ExpandOutlined";
      ExpandOutlined.inheritAttrs = false;
      var KeyOutlined$1 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M608 112c-167.9 0-304 136.1-304 304 0 70.3 23.9 135 63.9 186.5l-41.1 41.1-62.3-62.3a8.15 8.15 0 00-11.4 0l-39.8 39.8a8.15 8.15 0 000 11.4l62.3 62.3-44.9 44.9-62.3-62.3a8.15 8.15 0 00-11.4 0l-39.8 39.8a8.15 8.15 0 000 11.4l62.3 62.3-65.3 65.3a8.03 8.03 0 000 11.3l42.3 42.3c3.1 3.1 8.2 3.1 11.3 0l253.6-253.6A304.06 304.06 0 00608 720c167.9 0 304-136.1 304-304S775.9 112 608 112zm161.2 465.2C726.2 620.3 668.9 644 608 644c-60.9 0-118.2-23.7-161.2-66.8-43.1-43-66.8-100.3-66.8-161.2 0-60.9 23.7-118.2 66.8-161.2 43-43.1 100.3-66.8 161.2-66.8 60.9 0 118.2 23.7 161.2 66.8 43.1 43 66.8 100.3 66.8 161.2 0 60.9-23.7 118.2-66.8 161.2z" } }] }, "name": "key", "theme": "outlined" };
      function _objectSpread$2(target) {
        for (var i = 1; i < arguments.length; i++) {
          var source = arguments[i] != null ? Object(arguments[i]) : {};
          var ownKeys = Object.keys(source);
          if (typeof Object.getOwnPropertySymbols === "function") {
            ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
              return Object.getOwnPropertyDescriptor(source, sym).enumerable;
            }));
          }
          ownKeys.forEach(function(key) {
            _defineProperty$2(target, key, source[key]);
          });
        }
        return target;
      }
      function _defineProperty$2(obj, key, value) {
        if (key in obj) {
          Object.defineProperty(obj, key, { value, enumerable: true, configurable: true, writable: true });
        } else {
          obj[key] = value;
        }
        return obj;
      }
      var KeyOutlined = function KeyOutlined2(props, context) {
        var p = _objectSpread$2({}, props, context.attrs);
        return createVNode(Icon, _objectSpread$2({}, p, {
          "icon": KeyOutlined$1
        }), null);
      };
      KeyOutlined.displayName = "KeyOutlined";
      KeyOutlined.inheritAttrs = false;
      var MinusOutlined$1 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M872 474H152c-4.4 0-8 3.6-8 8v60c0 4.4 3.6 8 8 8h720c4.4 0 8-3.6 8-8v-60c0-4.4-3.6-8-8-8z" } }] }, "name": "minus", "theme": "outlined" };
      function _objectSpread$1(target) {
        for (var i = 1; i < arguments.length; i++) {
          var source = arguments[i] != null ? Object(arguments[i]) : {};
          var ownKeys = Object.keys(source);
          if (typeof Object.getOwnPropertySymbols === "function") {
            ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
              return Object.getOwnPropertyDescriptor(source, sym).enumerable;
            }));
          }
          ownKeys.forEach(function(key) {
            _defineProperty$1(target, key, source[key]);
          });
        }
        return target;
      }
      function _defineProperty$1(obj, key, value) {
        if (key in obj) {
          Object.defineProperty(obj, key, { value, enumerable: true, configurable: true, writable: true });
        } else {
          obj[key] = value;
        }
        return obj;
      }
      var MinusOutlined = function MinusOutlined2(props, context) {
        var p = _objectSpread$1({}, props, context.attrs);
        return createVNode(Icon, _objectSpread$1({}, p, {
          "icon": MinusOutlined$1
        }), null);
      };
      MinusOutlined.displayName = "MinusOutlined";
      MinusOutlined.inheritAttrs = false;
      var NotificationOutlined$1 = { "icon": { "tag": "svg", "attrs": { "viewBox": "64 64 896 896", "focusable": "false" }, "children": [{ "tag": "path", "attrs": { "d": "M880 112c-3.8 0-7.7.7-11.6 2.3L292 345.9H128c-8.8 0-16 7.4-16 16.6v299c0 9.2 7.2 16.6 16 16.6h101.7c-3.7 11.6-5.7 23.9-5.7 36.4 0 65.9 53.8 119.5 120 119.5 55.4 0 102.1-37.6 115.9-88.4l408.6 164.2c3.9 1.5 7.8 2.3 11.6 2.3 16.9 0 32-14.2 32-33.2V145.2C912 126.2 897 112 880 112zM344 762.3c-26.5 0-48-21.4-48-47.8 0-11.2 3.9-21.9 11-30.4l84.9 34.1c-2 24.6-22.7 44.1-47.9 44.1zm496 58.4L318.8 611.3l-12.9-5.2H184V417.9h121.9l12.9-5.2L840 203.3v617.4z" } }] }, "name": "notification", "theme": "outlined" };
      function _objectSpread(target) {
        for (var i = 1; i < arguments.length; i++) {
          var source = arguments[i] != null ? Object(arguments[i]) : {};
          var ownKeys = Object.keys(source);
          if (typeof Object.getOwnPropertySymbols === "function") {
            ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
              return Object.getOwnPropertyDescriptor(source, sym).enumerable;
            }));
          }
          ownKeys.forEach(function(key) {
            _defineProperty(target, key, source[key]);
          });
        }
        return target;
      }
      function _defineProperty(obj, key, value) {
        if (key in obj) {
          Object.defineProperty(obj, key, { value, enumerable: true, configurable: true, writable: true });
        } else {
          obj[key] = value;
        }
        return obj;
      }
      var NotificationOutlined = function NotificationOutlined2(props, context) {
        var p = _objectSpread({}, props, context.attrs);
        return createVNode(Icon, _objectSpread({}, p, {
          "icon": NotificationOutlined$1
        }), null);
      };
      NotificationOutlined.displayName = "NotificationOutlined";
      NotificationOutlined.inheritAttrs = false;
      const _sfc_main$2 = defineComponent({
        components: {
          KeyOutlined
        },
        setup() {
          const settingsStore2 = useSettingsStore();
          const state = reactive({
            videoSettings: { ...settingsStore2.videoSettings },
            submitSettings: { ...settingsStore2.submitSettings },
            automationSettings: { ...settingsStore2.automationSettings },
            answerSettings: { ...settingsStore2.answerSettings }
          });
          const updateVideoSetting = (key) => {
            settingsStore2.updateSetting("videoSettings", key, state.videoSettings[key]);
          };
          const updateSubmitSetting = (key) => {
            settingsStore2.updateSetting("submitSettings", key, state.submitSettings[key]);
          };
          const updateAutomationSetting = (key) => {
            settingsStore2.updateSetting("automationSettings", key, state.automationSettings[key]);
          };
          const updateAnswerSetting = (key) => {
            settingsStore2.updateSetting("answerSettings", key, state.answerSettings[key]);
          };
          const resetSettings = () => {
            settingsStore2.resetSettings();
            Object.assign(state.videoSettings, settingsStore2.videoSettings);
            Object.assign(state.submitSettings, settingsStore2.submitSettings);
            Object.assign(state.automationSettings, settingsStore2.automationSettings);
            Object.assign(state.answerSettings, settingsStore2.answerSettings);
          };
          const rootRef = ref(null);
          const getModalContainer = () => {
            var _a;
            return (_a = rootRef.value) == null ? void 0 : _a.getRootNode();
          };
          return {
            ...toRefs$1(state),
            updateVideoSetting,
            updateSubmitSetting,
            updateAutomationSetting,
            updateAnswerSetting,
            resetSettings,
            rootRef,
            getModalContainer
          };
        }
      });
      const _hoisted_1$2 = {
        ref: "rootRef",
        style: { "max-height": "500px", "overflow-y": "auto" }
      };
      const _hoisted_2$2 = { style: { "margin-bottom": "15px", "padding": "10px", "background-color": "#f9f9f9", "border-radius": "6px" } };
      const _hoisted_3$1 = /* @__PURE__ */ createElementVNode("h3", { style: { "font-size": "14px", "font-weight": "bold", "margin-bottom": "8px", "padding-bottom": "5px", "border-bottom": "1px solid #eee" } }, "视频设置", -1);
      const _hoisted_4$1 = { style: { "margin-bottom": "8px", "display": "flex", "align-items": "center" } };
      const _hoisted_5$1 = /* @__PURE__ */ createElementVNode("span", { style: { "margin-right": "8px", "flex-shrink": "0" } }, "视频倍速:", -1);
      const _hoisted_6$1 = { style: { "margin-bottom": "15px", "padding": "10px", "background-color": "#f9f9f9", "border-radius": "6px" } };
      const _hoisted_7 = /* @__PURE__ */ createElementVNode("h3", { style: { "font-size": "14px", "font-weight": "bold", "margin-bottom": "8px", "padding-bottom": "5px", "border-bottom": "1px solid #eee" } }, "答题设置", -1);
      const _hoisted_8 = { style: { "margin-bottom": "12px" } };
      const _hoisted_9 = { style: { "margin-bottom": "8px", "display": "flex", "align-items": "center" } };
      const _hoisted_10 = /* @__PURE__ */ createElementVNode("span", { style: { "margin-right": "8px", "flex-shrink": "0" } }, "搜题间隔(秒):", -1);
      const _hoisted_11 = { style: { "margin-bottom": "8px", "display": "flex", "align-items": "center" } };
      const _hoisted_12 = { style: { "margin-bottom": "8px", "display": "flex", "align-items": "center" } };
      const _hoisted_13 = { style: { "margin-bottom": "15px", "padding": "10px", "background-color": "#f9f9f9", "border-radius": "6px" } };
      const _hoisted_14 = /* @__PURE__ */ createElementVNode("h3", { style: { "font-size": "14px", "font-weight": "bold", "margin-bottom": "8px", "padding-bottom": "5px", "border-bottom": "1px solid #eee" } }, "任务提交设置", -1);
      const _hoisted_15 = { style: { "margin-bottom": "8px", "display": "flex", "align-items": "center" } };
      const _hoisted_16 = { style: { "margin-bottom": "8px", "display": "flex", "align-items": "center" } };
      const _hoisted_17 = { style: { "margin-bottom": "8px", "display": "flex", "align-items": "center" } };
      const _hoisted_18 = { style: { "margin-bottom": "8px", "display": "flex", "align-items": "center" } };
      const _hoisted_19 = /* @__PURE__ */ createElementVNode("span", { style: { "margin-right": "8px", "flex-shrink": "0" } }, "准确率低于这个值时不会自动提交( %):", -1);
      const _hoisted_20 = { style: { "margin-bottom": "15px", "padding": "10px", "background-color": "#f9f9f9", "border-radius": "6px" } };
      const _hoisted_21 = /* @__PURE__ */ createElementVNode("h3", { style: { "font-size": "14px", "font-weight": "bold", "margin-bottom": "8px", "padding-bottom": "5px", "border-bottom": "1px solid #eee" } }, "自动化设置", -1);
      const _hoisted_22 = { style: { "margin-bottom": "8px", "display": "flex", "align-items": "center" } };
      const _hoisted_23 = { style: { "margin-bottom": "8px", "display": "flex", "align-items": "center" } };
      const _hoisted_24 = { style: { "margin-bottom": "8px", "display": "flex", "align-items": "center" } };
      const _hoisted_25 = { style: { "margin-top": "15px", "display": "flex", "justify-content": "center" } };
      function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
        const _component_a_select_option = resolveComponent("a-select-option");
        const _component_a_select = resolveComponent("a-select");
        const _component_key_outlined = resolveComponent("key-outlined");
        const _component_a_input_password = resolveComponent("a-input-password");
        const _component_a_input_number = resolveComponent("a-input-number");
        const _component_a_checkbox = resolveComponent("a-checkbox");
        const _component_a_button = resolveComponent("a-button");
        return openBlock(), createElementBlock("div", _hoisted_1$2, [
          createElementVNode("div", _hoisted_2$2, [
            _hoisted_3$1,
            createElementVNode("div", _hoisted_4$1, [
              _hoisted_5$1,
              createVNode(_component_a_select, {
                getPopupContainer: _ctx.getModalContainer,
                value: _ctx.videoSettings.playbackRate,
                "onUpdate:value": _cache[0] || (_cache[0] = ($event) => _ctx.videoSettings.playbackRate = $event),
                style: { "width": "100px" },
                onChange: _cache[1] || (_cache[1] = ($event) => _ctx.updateVideoSetting("playbackRate"))
              }, {
                default: withCtx(() => [
                  createVNode(_component_a_select_option, { value: 1 }, {
                    default: withCtx(() => [
                      createTextVNode("1倍速")
                    ]),
                    _: 1
                  }),
                  createVNode(_component_a_select_option, { value: 1.5 }, {
                    default: withCtx(() => [
                      createTextVNode("1.5倍速")
                    ]),
                    _: 1
                  }),
                  createVNode(_component_a_select_option, { value: 2 }, {
                    default: withCtx(() => [
                      createTextVNode("2倍速")
                    ]),
                    _: 1
                  })
                ]),
                _: 1
              }, 8, ["getPopupContainer", "value"])
            ])
          ]),
          createElementVNode("div", _hoisted_6$1, [
            _hoisted_7,
            createElementVNode("div", _hoisted_8, [
              createVNode(_component_a_input_password, {
                value: _ctx.answerSettings.token,
                "onUpdate:value": _cache[2] || (_cache[2] = ($event) => _ctx.answerSettings.token = $event),
                placeholder: "填写授权码解锁高级搜索(暂时不用输入,等待更新)",
                onChange: _cache[3] || (_cache[3] = ($event) => _ctx.updateAnswerSetting("token")),
                style: { "width": "100%" }
              }, {
                addonBefore: withCtx(() => [
                  createVNode(_component_key_outlined)
                ]),
                _: 1
              }, 8, ["value"])
            ]),
            createElementVNode("div", _hoisted_9, [
              _hoisted_10,
              createVNode(_component_a_input_number, {
                value: _ctx.answerSettings.searchInterval,
                "onUpdate:value": _cache[4] || (_cache[4] = ($event) => _ctx.answerSettings.searchInterval = $event),
                min: 1,
                max: 10,
                onChange: _cache[5] || (_cache[5] = ($event) => _ctx.updateAnswerSetting("searchInterval")),
                style: { "width": "100px" }
              }, null, 8, ["value"])
            ]),
            createElementVNode("div", _hoisted_11, [
              createVNode(_component_a_checkbox, {
                checked: _ctx.answerSettings.useAIWhenNoAnswer,
                "onUpdate:checked": _cache[6] || (_cache[6] = ($event) => _ctx.answerSettings.useAIWhenNoAnswer = $event),
                onChange: _cache[7] || (_cache[7] = ($event) => _ctx.updateAnswerSetting("useAIWhenNoAnswer")),
                disabled: ""
              }, {
                default: withCtx(() => [
                  createTextVNode(" 无答案时使用AI答题(等待开发) ")
                ]),
                _: 1
              }, 8, ["checked"])
            ]),
            createElementVNode("div", _hoisted_12, [
              createVNode(_component_a_checkbox, {
                checked: _ctx.answerSettings.saveAnswerHistory,
                "onUpdate:checked": _cache[8] || (_cache[8] = ($event) => _ctx.answerSettings.saveAnswerHistory = $event),
                onChange: _cache[9] || (_cache[9] = ($event) => _ctx.updateAnswerSetting("saveAnswerHistory"))
              }, {
                default: withCtx(() => [
                  createTextVNode(" 保存答题历史 ")
                ]),
                _: 1
              }, 8, ["checked"])
            ])
          ]),
          createElementVNode("div", _hoisted_13, [
            _hoisted_14,
            createElementVNode("div", _hoisted_15, [
              createVNode(_component_a_checkbox, {
                checked: _ctx.submitSettings.autoSubmitChapter,
                "onUpdate:checked": _cache[10] || (_cache[10] = ($event) => _ctx.submitSettings.autoSubmitChapter = $event),
                onChange: _cache[11] || (_cache[11] = ($event) => _ctx.updateSubmitSetting("autoSubmitChapter"))
              }, {
                default: withCtx(() => [
                  createTextVNode(" 自动提交章节作业 ")
                ]),
                _: 1
              }, 8, ["checked"])
            ]),
            createElementVNode("div", _hoisted_16, [
              createVNode(_component_a_checkbox, {
                checked: _ctx.submitSettings.autoSubmitHomework,
                "onUpdate:checked": _cache[12] || (_cache[12] = ($event) => _ctx.submitSettings.autoSubmitHomework = $event),
                onChange: _cache[13] || (_cache[13] = ($event) => _ctx.updateSubmitSetting("autoSubmitHomework")),
                disabled: ""
              }, {
                default: withCtx(() => [
                  createTextVNode(" 自动提交课后作业(请自行提交) ")
                ]),
                _: 1
              }, 8, ["checked"])
            ]),
            createElementVNode("div", _hoisted_17, [
              createVNode(_component_a_checkbox, {
                checked: _ctx.submitSettings.autoSubmitExam,
                "onUpdate:checked": _cache[14] || (_cache[14] = ($event) => _ctx.submitSettings.autoSubmitExam = $event),
                onChange: _cache[15] || (_cache[15] = ($event) => _ctx.updateSubmitSetting("autoSubmitExam")),
                disabled: ""
              }, {
                default: withCtx(() => [
                  createTextVNode(" 自动提交考试(请自行提交) ")
                ]),
                _: 1
              }, 8, ["checked"])
            ]),
            createElementVNode("div", _hoisted_18, [
              _hoisted_19,
              createVNode(_component_a_input_number, {
                value: _ctx.submitSettings.correctRateThreshold,
                "onUpdate:value": _cache[16] || (_cache[16] = ($event) => _ctx.submitSettings.correctRateThreshold = $event),
                min: 0,
                max: 100,
                onChange: _cache[17] || (_cache[17] = ($event) => _ctx.updateSubmitSetting("correctRateThreshold")),
                style: { "width": "100px" }
              }, null, 8, ["value"])
            ])
          ]),
          createElementVNode("div", _hoisted_20, [
            _hoisted_21,
            createElementVNode("div", _hoisted_22, [
              createVNode(_component_a_checkbox, {
                checked: _ctx.automationSettings.autoNextChapter,
                "onUpdate:checked": _cache[18] || (_cache[18] = ($event) => _ctx.automationSettings.autoNextChapter = $event),
                onChange: _cache[19] || (_cache[19] = ($event) => _ctx.updateAutomationSetting("autoNextChapter"))
              }, {
                default: withCtx(() => [
                  createTextVNode(" 自动跳转下一章节 ")
                ]),
                _: 1
              }, 8, ["checked"])
            ]),
            createElementVNode("div", _hoisted_23, [
              createVNode(_component_a_checkbox, {
                checked: _ctx.automationSettings.onlyDoQuestions,
                "onUpdate:checked": _cache[20] || (_cache[20] = ($event) => _ctx.automationSettings.onlyDoQuestions = $event),
                onChange: _cache[21] || (_cache[21] = ($event) => _ctx.updateAutomationSetting("onlyDoQuestions"))
              }, {
                default: withCtx(() => [
                  createTextVNode(" 只完成答题类任务 ")
                ]),
                _: 1
              }, 8, ["checked"])
            ]),
            createElementVNode("div", _hoisted_24, [
              createVNode(_component_a_checkbox, {
                checked: _ctx.automationSettings.skipFinishedTasks,
                "onUpdate:checked": _cache[22] || (_cache[22] = ($event) => _ctx.automationSettings.skipFinishedTasks = $event),
                onChange: _cache[23] || (_cache[23] = ($event) => _ctx.updateAutomationSetting("skipFinishedTasks"))
              }, {
                default: withCtx(() => [
                  createTextVNode(" 自动跳过已完成任务点 ")
                ]),
                _: 1
              }, 8, ["checked"])
            ])
          ]),
          createElementVNode("div", _hoisted_25, [
            createVNode(_component_a_button, {
              type: "primary",
              onClick: _ctx.resetSettings
            }, {
              default: withCtx(() => [
                createTextVNode("恢复默认设置")
              ]),
              _: 1
            }, 8, ["onClick"])
          ])
        ], 512);
      }
      const SettingsPanel = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["render", _sfc_render$1]]);
      var _GM_getResourceText = exports("_", /* @__PURE__ */ (() => typeof GM_getResourceText != "undefined" ? GM_getResourceText : void 0)());
      var _GM_xmlhttpRequest = /* @__PURE__ */ (() => typeof GM_xmlhttpRequest != "undefined" ? GM_xmlhttpRequest : void 0)();
      var _unsafeWindow = /* @__PURE__ */ (() => typeof unsafeWindow != "undefined" ? unsafeWindow : void 0)();
      const _sfc_main$1 = defineComponent({
        components: {
          LogViewer,
          AnswerViewer,
          SettingsPanel,
          MinusOutlined,
          ExpandOutlined,
          KeyOutlined,
          NotificationOutlined
        },
        setup() {
          const settingsStore2 = useSettingsStore();
          const visible = ref(true);
          const modalTitleRef = ref(null);
          const rootRef = ref(null);
          const activeKey = ref(settingsStore2.uiSettings.activeTab);
          const token = ref(settingsStore2.answerSettings.token || "");
          const isMinimized = ref(false);
          const notice = ref("");
          const toggleMinimize = () => {
            isMinimized.value = !isMinimized.value;
          };
          const updateToken = () => {
            settingsStore2.updateToken(token.value);
          };
          const {
            x,
            y,
            isDragging
          } = useDraggable(modalTitleRef);
          const fetchNotice = async () => {
            try {
              _GM_xmlhttpRequest({
                method: "GET",
                url: "https://www.aiask.site/v1/notice",
                responseType: "json",
                onload: function(response) {
                  if (response.status === 200) {
                    const data2 = response.response;
                    if (data2 && data2.code === 200 && data2.data && data2.data.notice) {
                      notice.value = data2.data.notice;
                    } else {
                      notice.value = "暂无公告";
                    }
                  } else {
                    console.log(data.data.notice);
                    notice.value = "获取公告失败,请稍后重试";
                  }
                },
                onerror: function(error) {
                  console.error("Failed to fetch notice:", error);
                  notice.value = "获取公告失败,请检查网络连接";
                }
              });
            } catch (error) {
              console.error("Failed to fetch notice:", error);
              notice.value = "获取公告失败,请检查网络或项目地址";
            }
          };
          onMounted(() => {
            document.body.style.overflow = "auto";
            if (settingsStore2.uiSettings.position) {
              transformX.value = settingsStore2.uiSettings.position.x;
              transformY.value = settingsStore2.uiSettings.position.y;
            }
            fetchNotice();
          });
          watch(activeKey, (newVal) => {
            settingsStore2.updateSetting("uiSettings", "activeTab", newVal);
          });
          const handleOk = (e) => {
            console.log(e);
            visible.value = false;
          };
          const startX = ref(0);
          const startY = ref(0);
          const startedDrag = ref(false);
          const transformX = ref(0);
          const transformY = ref(0);
          const preTransformX = ref(0);
          const preTransformY = ref(0);
          const dragRect = ref({
            left: 0,
            right: 0,
            top: 0,
            bottom: 0
          });
          const getModalContainer = () => {
            var _a;
            return (_a = rootRef.value) == null ? void 0 : _a.getRootNode();
          };
          watch([x, y], () => {
            if (!startedDrag.value) {
              startX.value = x.value;
              startY.value = y.value;
              if (modalTitleRef.value) {
                const titleRect = modalTitleRef.value.getBoundingClientRect();
                dragRect.value.left = 0;
                dragRect.value.top = 0;
                dragRect.value.right = window.innerWidth - titleRect.width;
                dragRect.value.bottom = window.innerHeight - titleRect.height;
                preTransformX.value = transformX.value;
                preTransformY.value = transformY.value;
              }
            }
            startedDrag.value = true;
          });
          watch(isDragging, () => {
            if (!isDragging) {
              startedDrag.value = false;
              settingsStore2.updatePosition(transformX.value, transformY.value);
            }
          });
          watchEffect(() => {
            if (startedDrag.value) {
              transformX.value = preTransformX.value + Math.min(Math.max(dragRect.value.left, x.value), dragRect.value.right) - startX.value;
              transformY.value = preTransformY.value + Math.min(Math.max(dragRect.value.top, y.value), dragRect.value.bottom) - startY.value;
            }
          });
          const transformStyle = computed(() => {
            return {
              transform: `translate(${transformX.value}px, ${transformY.value}px)`
            };
          });
          return {
            visible,
            handleOk,
            modalTitleRef,
            transformStyle,
            rootRef,
            getModalContainer,
            activeKey,
            token,
            updateToken,
            toggleMinimize,
            isMinimized,
            notice
          };
        }
      });
      const _withScopeId = (n) => (pushScopeId("data-v-0fae829c"), n = n(), popScopeId(), n);
      const _hoisted_1$1 = { ref: "rootRef" };
      const _hoisted_2$1 = ["innerHTML"];
      const _hoisted_3 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ createElementVNode("div", { style: { "margin": "12px 0", "padding": "8px", "background-color": "#f0f9ff", "border-radius": "4px", "font-size": "12px", "text-align": "center", "border": "1px dashed #1890ff" } }, [
        /* @__PURE__ */ createElementVNode("a", {
          href: "https://github.com/你的项目地址",
          target: "_blank",
          style: { "color": "#1890ff", "text-decoration": "none" }
        }, " CX助手 - 让学习更轻松 - 点击访问项目主页 ")
      ], -1));
      const _hoisted_4 = {
        ref: "modalTitleRef",
        style: { "display": "flex", "align-items": "center", "width": "100%", "cursor": "move" }
      };
      const _hoisted_5 = /* @__PURE__ */ _withScopeId(() => /* @__PURE__ */ createElementVNode("div", { style: { "font-size": "15px", "margin-left": "10px", "margin-top": "2px" } }, " 🔥 超星学习助手 ", -1));
      const _hoisted_6 = { style: { "margin-left": "auto", "display": "flex", "align-items": "center" } };
      function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
        const _component_LogViewer = resolveComponent("LogViewer");
        const _component_a_tab_pane = resolveComponent("a-tab-pane");
        const _component_AnswerViewer = resolveComponent("AnswerViewer");
        const _component_SettingsPanel = resolveComponent("SettingsPanel");
        const _component_a_tabs = resolveComponent("a-tabs");
        const _component_minus_square_outlined = resolveComponent("minus-square-outlined");
        const _component_expand_outlined = resolveComponent("expand-outlined");
        const _component_minus_outlined = resolveComponent("minus-outlined");
        const _component_a_button = resolveComponent("a-button");
        const _component_a_modal = resolveComponent("a-modal");
        return openBlock(), createElementBlock(Fragment, null, [
          createElementVNode("div", _hoisted_1$1, null, 512),
          createElementVNode("div", null, [
            createVNode(_component_a_modal, {
              ref: "modalRef",
              maskStyle: { display: "none" },
              wrapClassName: "floating-modal",
              getContainer: _ctx.getModalContainer,
              visible: _ctx.visible,
              "onUpdate:visible": _cache[1] || (_cache[1] = ($event) => _ctx.visible = $event),
              maskClosable: false,
              closable: false,
              onOk: _ctx.handleOk,
              footer: null,
              bodyStyle: _ctx.isMinimized ? { display: "none" } : { paddingTop: "10px" }
            }, {
              closeIcon: withCtx(() => [
                createVNode(_component_minus_square_outlined)
              ]),
              title: withCtx(() => [
                createElementVNode("div", _hoisted_4, [
                  _hoisted_5,
                  createElementVNode("div", _hoisted_6, [
                    createVNode(_component_a_button, {
                      type: "text",
                      size: "small",
                      onClick: _ctx.toggleMinimize,
                      style: { "margin-right": "10px" }
                    }, {
                      icon: withCtx(() => [
                        _ctx.isMinimized ? (openBlock(), createBlock(_component_expand_outlined, { key: 0 })) : (openBlock(), createBlock(_component_minus_outlined, { key: 1 }))
                      ]),
                      _: 1
                    }, 8, ["onClick"])
                  ])
                ], 512)
              ]),
              modalRender: withCtx(({ originVNode }) => [
                createElementVNode("div", {
                  style: normalizeStyle(_ctx.transformStyle)
                }, [
                  (openBlock(), createBlock(resolveDynamicComponent(originVNode)))
                ], 4)
              ]),
              default: withCtx(() => [
                createElementVNode("div", {
                  innerHTML: _ctx.notice,
                  style: { "font-size": "14px", "line-height": "1.6", "color": "#333", "overflow-y": "auto", "margin-top": "10px", "background-color": "#fff" },
                  class: "notice-wrapper"
                }, null, 8, _hoisted_2$1),
                createVNode(_component_a_tabs, {
                  activeKey: _ctx.activeKey,
                  "onUpdate:activeKey": _cache[0] || (_cache[0] = ($event) => _ctx.activeKey = $event),
                  type: "line",
                  size: "small"
                }, {
                  default: withCtx(() => [
                    createVNode(_component_a_tab_pane, {
                      key: "1",
                      tab: "日志"
                    }, {
                      default: withCtx(() => [
                        createVNode(_component_LogViewer)
                      ]),
                      _: 1
                    }),
                    createVNode(_component_a_tab_pane, {
                      key: "2",
                      tab: "答题记录"
                    }, {
                      default: withCtx(() => [
                        createVNode(_component_AnswerViewer)
                      ]),
                      _: 1
                    }),
                    createVNode(_component_a_tab_pane, {
                      key: "3",
                      tab: "高级设置"
                    }, {
                      default: withCtx(() => [
                        createVNode(_component_SettingsPanel)
                      ]),
                      _: 1
                    })
                  ]),
                  _: 1
                }, 8, ["activeKey"]),
                _hoisted_3
              ]),
              _: 1
            }, 8, ["getContainer", "visible", "onOk", "bodyStyle"])
          ])
        ], 64);
      }
      const FloatingWindow = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["render", _sfc_render], ["__scopeId", "data-v-0fae829c"]]);
      const scriptRel = /* @__PURE__ */ function detectScriptRel() {
        const relList = typeof document !== "undefined" && document.createElement("link").relList;
        return relList && relList.supports && relList.supports("modulepreload") ? "modulepreload" : "preload";
      }();
      const assetsURL = function(dep) {
        return "/" + dep;
      };
      const seen = {};
      const __vitePreload = function preload(baseModule, deps, importerUrl) {
        let promise = Promise.resolve();
        if (deps && deps.length > 0) {
          let allSettled2 = function(promises) {
            return Promise.all(
              promises.map(
                (p) => Promise.resolve(p).then(
                  (value) => ({ status: "fulfilled", value }),
                  (reason) => ({ status: "rejected", reason })
                )
              )
            );
          };
          document.getElementsByTagName("link");
          const cspNonceMeta = document.querySelector(
            "meta[property=csp-nonce]"
          );
          const cspNonce = (cspNonceMeta == null ? void 0 : cspNonceMeta.nonce) || (cspNonceMeta == null ? void 0 : cspNonceMeta.getAttribute("nonce"));
          promise = allSettled2(
            deps.map((dep) => {
              dep = assetsURL(dep);
              if (dep in seen) return;
              seen[dep] = true;
              const isCss = dep.endsWith(".css");
              const cssSelector = isCss ? '[rel="stylesheet"]' : "";
              if (document.querySelector(`link[href="${dep}"]${cssSelector}`)) {
                return;
              }
              const link = document.createElement("link");
              link.rel = isCss ? "stylesheet" : scriptRel;
              if (!isCss) {
                link.as = "script";
              }
              link.crossOrigin = "";
              link.href = dep;
              if (cspNonce) {
                link.setAttribute("nonce", cspNonce);
              }
              document.head.appendChild(link);
              if (isCss) {
                return new Promise((res, rej) => {
                  link.addEventListener("load", res);
                  link.addEventListener(
                    "error",
                    () => rej(new Error(`Unable to preload CSS for ${dep}`))
                  );
                });
              }
            })
          );
        }
        function handlePreloadError(err) {
          const e = new Event("vite:preloadError", {
            cancelable: true
          });
          e.payload = err;
          window.dispatchEvent(e);
          if (!e.defaultPrevented) {
            throw err;
          }
        }
        return promise.then((res) => {
          for (const item of res || []) {
            if (item.status !== "rejected") continue;
            handlePreloadError(item.reason);
          }
          return baseModule().catch(handlePreloadError);
        });
      };
      function sleep$2(ms) {
        return new Promise((resolve) => setTimeout(resolve, ms));
      }
      function handleError(message) {
        return {
          message
        };
      }
      async function getAnswer(question, options) {
        try {
          const settingsStore2 = useSettingsStore();
          const logStore2 = useLogStore();
          const searchInterval = settingsStore2.answerSettings.searchInterval;
          if (searchInterval > 0) {
            await sleep$2(searchInterval * 1e3);
          }
          const optionsText = options.map((option) => option.text);
          let type = 1;
          console.log(question.type);
          if (question.type.includes("多选题")) {
            type = 1;
          } else if (question.type.includes("判断题")) {
            type = 2;
          } else if (question.type.includes("填空题")) {
            type = 3;
          } else if (question.type.includes("简答题")) {
            type = 4;
          }
          const headers = {
            "Accept": "*/*",
            "Content-Type": "application/x-www-form-urlencoded",
            "Connection": "keep-alive",
            "User-Agent": "CXHelper/1.0.0"
          };
          const token = settingsStore2.answerSettings.token;
          if (token && token.trim() !== "") {
            headers["Authorization"] = `Bearer ${token}`;
          }
          return new Promise((resolve) => {
            _GM_xmlhttpRequest({
              method: "POST",
              url: "https://www.aiask.site/v1/question/precise",
              headers,
              data: `type=${type}&question=${encodeURIComponent(question.title)}&options=${encodeURIComponent(JSON.stringify(optionsText))}`,
              timeout: 5e3,
              onload: (response) => {
                try {
                  if (response.status >= 200 && response.status < 300) {
                    const data2 = JSON.parse(response.responseText);
                    if (data2.code === 200) {
                      resolve(data2);
                    } else {
                      resolve(handleError(`请求失败: ${data2.message}`));
                    }
                  } else {
                    resolve(handleError(`请求失败: ${response.status}`));
                  }
                } catch (error) {
                  resolve(handleError(`解析响应失败: ${error.message}`));
                }
              },
              onerror: (error) => {
                resolve(handleError("请求出错"));
              },
              ontimeout: () => {
                resolve(handleError("请求超时"));
              }
            });
          });
        } catch (error) {
          console.error("获取答案失败:", error);
          return handleError(`请求异常: ${error.message}`);
        }
      }
      function parseQuestion$1(questionElement) {
        const type = questionElement.querySelector(".newZy_TItle").textContent;
        const titleDiv = questionElement.querySelector(".Zy_TItle .fontLabel");
        const titleHtml = titleDiv.innerHTML;
        return {
          type: type.replace(/[【】]/g, ""),
          title: clean(removeHtml$1(titleHtml))
        };
      }
      function parseOptions$1(questionElement) {
        const questionType = questionElement.querySelector(".newZy_TItle").textContent;
        const options = Array.from(questionElement.querySelectorAll(".Zy_ulTop li"));
        return options.map((option) => {
          const label = option.querySelector(".after");
          let valueElement;
          if (questionType.includes("多选题")) {
            valueElement = option.querySelector(".num_option_dx");
          } else if (questionType.includes("单选题") || questionType.includes("判断题")) {
            valueElement = option.querySelector(".num_option");
          }
          const value = valueElement ? valueElement.getAttribute("data") : "";
          return {
            text: label ? clean(removeHtml$1(label.innerHTML)).trim() : "",
            value
          };
        });
      }
      function getQuestionId$1(questionElement) {
        return questionElement.closest(".singleQuesId").getAttribute("data");
      }
      function removeHtml$1(html) {
        if (html == null) {
          return "";
        }
        return html.replace(/<((?!img|sub|sup|br)[^>]+)>/g, "").replace(/&nbsp;/g, " ").replace(/\s+/g, " ").replace(/<br\s*\/?>/g, "\n").replace(/<img.*?src="(.*?)".*?>/g, '<img src="$1"/>').trim();
      }
      function clean(str) {
        return str.replace(/^【.*?】\s*/, "").replace(/\s*(\d+\.\d+分)$/, "");
      }
      async function checkAnswer(question, options) {
        try {
          if (window._taskCancelled) {
            throw new Error("Task cancelled");
          }
          const logStore2 = useLogStore();
          const settingsStore2 = useSettingsStore();
          const formattedTitle = clean(question.title);
          if (window._taskCancelled) {
            throw new Error("Task cancelled");
          }
          if (window._taskCancelled) {
            throw new Error("Task cancelled");
          }
          const apiResponse = await getAnswer(question, options);
          if (window._taskCancelled) {
            throw new Error("Task cancelled");
          }
          if (apiResponse.code === 200 && apiResponse.data && apiResponse.data.answer) {
            if (Array.isArray(apiResponse.data.answer) && apiResponse.data.answer.length > 0) {
              logStore2.addLog(`找到答案`, LOG_TYPES.SUCCESS);
            }
            if (question.type.includes("多选题")) {
              const answerValues = apiResponse.data.answer.map((answerText) => {
                const option = options.find((opt) => opt.text === answerText);
                return option ? option.value : null;
              }).filter(Boolean);
              return {
                isCorrect: answerValues.length > 0,
                answer: answerValues,
                title: formattedTitle
              };
            } else if (question.type.includes("单选题")) {
              const answerText = Array.isArray(apiResponse.data.answer) ? apiResponse.data.answer[0] : apiResponse.data.answer;
              const option = options.find((opt) => opt.text === answerText);
              const answerValue = option ? option.value : null;
              return {
                isCorrect: !!answerValue,
                answer: answerValue,
                title: formattedTitle
              };
            } else if (question.type.includes("判断题")) {
              const answerText = Array.isArray(apiResponse.data.answer) ? apiResponse.data.answer[0] : apiResponse.data.answer;
              const isTrue = ["对", "是", "√", "正确", "true"].some((text) => answerText.includes(text));
              const isFalse = ["错", "否", "×", "错误", "false"].some((text) => answerText.includes(text));
              let answerValue = null;
              if (isTrue) {
                answerValue = "true";
              } else if (isFalse) {
                answerValue = "false";
              }
              return {
                isCorrect: answerValue !== null,
                answer: answerValue,
                title: formattedTitle
              };
            } else if (question.type.includes("填空题")) {
              return {
                isCorrect: true,
                answer: apiResponse.data.answer,
                title: formattedTitle
              };
            }
          } else {
            const message = apiResponse.message || "未找到答案";
            logStore2.addLog(message, LOG_TYPES.WARNING);
            return {
              isCorrect: false,
              answer: null,
              message,
              title: formattedTitle
            };
          }
        } catch (error) {
          if (error.message === "Task cancelled" || window._taskCancelled) {
            throw new Error("Task cancelled");
          }
          console.error("答案判断失败:", error);
          return {
            isCorrect: false,
            answer: null,
            message: error.message || "答案判断失败",
            title: question.title
          };
        }
      }
      async function submitAnswer(questionElement, questionId, answers, contentWindow) {
        try {
          if (window._taskCancelled) return false;
          const questionType = questionElement.querySelector(".newZy_TItle").textContent;
          const hasAnswered = checkIfAlreadyAnswered(questionElement, questionId, questionType, answers);
          if (hasAnswered) {
            console.log("此题已正确作答,跳过提交");
            return true;
          }
          if (window._taskCancelled) return false;
          if (Array.isArray(answers)) {
            for (const answer of answers) {
              if (window._taskCancelled) return false;
              const optionLi = questionElement.querySelector(`li[qid="${questionId}"] .num_option_dx[data="${answer}"]`).closest("li");
              if (optionLi) {
                optionLi.click();
                await sleep$1(200);
              }
            }
          } else if (questionType.includes("单选题")) {
            const optionLi = questionElement.querySelector(`li[qid="${questionId}"][qtype="0"] .num_option[data="${answers}"]`).closest("li");
            if (optionLi) {
              optionLi.click();
            }
          } else if (questionType.includes("判断题")) {
            const dataValue = answers === "true" ? "true" : "false";
            const optionLi = questionElement.querySelector(`li[qid="${questionId}"][qtype="3"] .num_option[data="${dataValue}"]`).closest("li");
            if (optionLi) {
              optionLi.click();
            }
          }
          return true;
        } catch (error) {
          console.error("提交答案失败:", error);
          return false;
        }
      }
      function checkIfAlreadyAnswered(questionElement, questionId, questionType, answers) {
        try {
          if (questionType.includes("多选题")) {
            if (Array.isArray(answers)) {
              const selectedOptions = Array.from(
                questionElement.querySelectorAll(`li[qid="${questionId}"] .check_answer`)
              ).map((option) => option.closest("li").querySelector(".num_option_dx").getAttribute("data"));
              const allSelected = answers.every((answer) => selectedOptions.includes(answer));
              const noExtraSelections = selectedOptions.every((selected) => answers.includes(selected));
              return allSelected && noExtraSelections;
            }
          } else if (questionType.includes("单选题")) {
            const selectedOption = questionElement.querySelector(`li[qid="${questionId}"][qtype="0"] .check_answer`);
            if (selectedOption) {
              const selectedValue = selectedOption.closest("li").querySelector(".num_option").getAttribute("data");
              return selectedValue === answers;
            }
          } else if (questionType.includes("判断题")) {
            const dataValue = answers === "true" ? "true" : "false";
            const selectedOption = questionElement.querySelector(`li[qid="${questionId}"][qtype="3"] .check_answer`);
            if (selectedOption) {
              const selectedValue = selectedOption.closest("li").querySelector(".num_option").getAttribute("data");
              return selectedValue === dataValue;
            }
          }
          return false;
        } catch (error) {
          console.error("检查已答题状态失败:", error);
          return false;
        }
      }
      async function submitEssayAnswer(questionElement, questionId, answer, contentWindow) {
        try {
          if (window._taskCancelled) return false;
          const UE = (contentWindow == null ? void 0 : contentWindow.UE) || window.UE;
          if (!UE) {
            throw new Error("找不到UEditor实例");
          }
          const editorId = `answer${questionId}`;
          const ueEditor = UE.getEditor(editorId);
          if (ueEditor) {
            const formattedAnswer = Array.isArray(answer) ? answer[0] : answer;
            const hasAnswered = checkIfEssayAlreadyAnswered(ueEditor, formattedAnswer);
            if (hasAnswered) {
              console.log("简答题已正确作答,跳过提交");
              return true;
            }
            if (window._taskCancelled) return false;
            ueEditor.setContent(formattedAnswer);
            await sleep$1(200);
            return true;
          } else {
            console.error("找不到简答题编辑器:", editorId);
            return false;
          }
        } catch (error) {
          console.error("提交简答题答案失败:", error);
          return false;
        }
      }
      function checkIfEssayAlreadyAnswered(ueEditor, answer) {
        try {
          const currentContent = ueEditor.getContent().trim();
          if (currentContent && answer && currentContent === answer) {
            return true;
          }
          return false;
        } catch (error) {
          console.error("检查简答题答案状态失败:", error);
          return false;
        }
      }
      async function submitFillBlankAnswer(questionElement, questionId, answers, contentWindow) {
        try {
          if (window._taskCancelled) return false;
          const editors = questionElement.querySelectorAll('[id^="answerEditor"]');
          const UE = (contentWindow == null ? void 0 : contentWindow.UE) || window.UE;
          if (!UE) {
            throw new Error("找不到UEditor实例");
          }
          const hasAnswered = checkIfFillBlankAlreadyAnswered(editors, answers, contentWindow);
          if (hasAnswered) {
            console.log("填空题已正确作答,跳过提交");
            return true;
          }
          if (window._taskCancelled) return false;
          for (let i = 0; i < editors.length; i++) {
            if (window._taskCancelled) return false;
            const editor = editors[i];
            const answer = Array.isArray(answers) ? answers[i] : answers;
            const ueEditor = UE.getEditor(editor.id);
            ueEditor.setContent(answer);
            await sleep$1(100);
          }
          return true;
        } catch (error) {
          console.error("提交填空答案失败:", error);
          return false;
        }
      }
      function checkIfFillBlankAlreadyAnswered(editors, answers, contentWindow) {
        try {
          const UE = (contentWindow == null ? void 0 : contentWindow.UE) || window.UE;
          if (!UE) {
            throw new Error("找不到UEditor实例");
          }
          for (let i = 0; i < editors.length; i++) {
            const editor = editors[i];
            const answer = Array.isArray(answers) ? answers[i] : answers;
            const ueEditor = UE.getEditor(editor.id);
            const currentContent = ueEditor.getContent().trim();
            if (!currentContent || !answer || currentContent !== answer) {
              return false;
            }
          }
          return true;
        } catch (error) {
          console.error("检查填空题答案状态失败:", error);
          return false;
        }
      }
      function sleep$1(ms) {
        return new Promise((resolve) => setTimeout(resolve, ms));
      }
      let logStore$1;
      let answerStore$1;
      let settingsStore$1;
      function initStores$1() {
        if (!logStore$1) logStore$1 = useLogStore();
        if (!answerStore$1) answerStore$1 = useAnswerStore();
        if (!settingsStore$1) settingsStore$1 = useSettingsStore();
      }
      const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
      async function waitForPageLoad() {
        return new Promise((resolve) => {
          if (document.readyState === "complete") {
            resolve();
          } else {
            const checkState = async () => {
              if (document.readyState === "complete") {
                resolve();
              } else {
                await sleep(500);
                checkState();
              }
            };
            checkState();
          }
        });
      }
      async function waitForElement(doc, selector, maxAttempts = 20) {
        return new Promise((resolve) => {
          let attempts = 0;
          const checkElement = async () => {
            const element = doc.querySelector(selector);
            if (element) {
              resolve(element);
            } else if (attempts < maxAttempts) {
              attempts++;
              await sleep(500);
              checkElement();
            } else {
              resolve(null);
            }
          };
          checkElement();
        });
      }
      async function waitForIframeLoad(iframe) {
        return new Promise((resolve) => {
          if (!iframe.src || iframe.src === "about:blank" || iframe.src.includes("javascript:")) {
            resolve(null);
            return;
          }
          const checkIframe = async () => {
            var _a;
            try {
              const doc = iframe.contentDocument || ((_a = iframe.contentWindow) == null ? void 0 : _a.document);
              if (doc) {
                if (doc.readyState === "complete") {
                  resolve(doc);
                } else {
                  await sleep(500);
                  checkIframe();
                }
              } else {
                await sleep(500);
                checkIframe();
              }
            } catch (error) {
              resolve(null);
            }
          };
          checkIframe();
        });
      }
      async function handleMedia(mediaElement, mediaType) {
        initStores$1();
        return new Promise(async (resolve) => {
          try {
            logStore$1.addLog(`正在处理一个视频/音频任务,请耐心等待`, LOG_TYPES.INFO);
            const { playbackRate } = settingsStore$1.videoSettings;
            mediaElement.playbackRate = playbackRate;
            const unwatch = watch(
              () => settingsStore$1.videoSettings.playbackRate,
              (newRate) => {
                if (mediaElement && !mediaElement.ended) {
                  mediaElement.playbackRate = newRate;
                  logStore$1.addLog(`已将播放速率更改为 ${newRate} 倍速`, LOG_TYPES.INFO);
                }
              }
            );
            mediaElement.muted = true;
            await mediaElement.pause();
            try {
              await mediaElement.play();
            } catch (playError) {
              console.error("媒体播放初始化失败:", playError);
              logStore$1.addLog(`媒体播放被浏览器阻止,请检查浏览器设置`, LOG_TYPES.ERROR);
              setTimeout(async () => {
                try {
                  await mediaElement.play();
                } catch (retryError) {
                  console.error("重试播放失败:", retryError);
                }
              }, 1e3);
            }
            let lastPlayTime = Date.now();
            let isPlaying = true;
            const monitorPlayback = setInterval(() => {
              if (window._taskCancelled) {
                clearInterval(monitorPlayback);
                mediaElement.removeEventListener("pause", mediaElement._handlePause);
                mediaElement.removeEventListener("ended", mediaElement._handleEnded);
                unwatch();
                resolve();
                return;
              }
              if (!mediaElement.ended && !mediaElement.paused) {
                lastPlayTime = Date.now();
                isPlaying = true;
              } else if (!mediaElement.ended && mediaElement.paused && isPlaying) {
                const currentTime = Date.now();
                if (currentTime - lastPlayTime > 1e3) {
                  logStore$1.addLog(`已被暂停,尝试继续播放`, LOG_TYPES.WARNING);
                  mediaElement.play().catch((error) => {
                    console.error(`自动继续播放失败:`, error);
                  });
                }
                isPlaying = false;
              }
            }, 1e3);
            const handlePause = async () => {
              if (window._taskCancelled) return;
              try {
                await mediaElement.play();
              } catch (error) {
                console.error(`${mediaType}重新播放失败:`, error);
                setTimeout(async () => {
                  if (window._taskCancelled) return;
                  try {
                    await mediaElement.play();
                  } catch (retryError) {
                    console.error(`重试播放失败:`, retryError);
                  }
                }, 1e3);
              }
            };
            const handleEnded = () => {
              clearInterval(monitorPlayback);
              mediaElement.removeEventListener("pause", mediaElement._handlePause);
              mediaElement.removeEventListener("ended", mediaElement._handleEnded);
              unwatch();
              resolve();
              logStore$1.addLog(`处理完成`, LOG_TYPES.SUCCESS);
            };
            mediaElement._handlePause = handlePause;
            mediaElement._handleEnded = handleEnded;
            mediaElement._monitorInterval = monitorPlayback;
            mediaElement._unwatchFn = unwatch;
            mediaElement.addEventListener("pause", handlePause);
            mediaElement.addEventListener("ended", handleEnded);
          } catch (error) {
            console.error(`播放${mediaType}时出错:`, error);
            resolve();
          }
        });
      }
      async function checkForMedia(iframe) {
        initStores$1();
        return new Promise(async (resolve, reject) => {
          try {
            if (window._taskCancelled) {
              resolve();
              return;
            }
            const signal = window._cancelController.signal;
            signal.addEventListener("abort", () => {
              resolve();
            });
            const doc = await waitForIframeLoad(iframe);
            if (!doc || window._taskCancelled) {
              resolve();
              return;
            }
            if (window._taskCancelled) {
              resolve();
              return;
            }
            if (iframe.src.includes("api/work")) {
              if (window._taskCancelled) {
                resolve();
                return;
              }
              try {
                const { decrypt } = await __vitePreload(async () => {
                  const { decrypt: decrypt2 } = await module.import('./fontDecrypt-DGcy2eZR-CITC-UpU.js');
                  return { decrypt: decrypt2 };
                }, true ? void 0 : void 0);
                if (window._taskCancelled) {
                  resolve();
                  return;
                }
                decrypt(doc);
                logStore$1.addLog("字体解密完成", LOG_TYPES.SUCCESS);
              } catch (error) {
                logStore$1.addLog(`字体解密失败: ${error.message}`, LOG_TYPES.ERROR);
                if (window._taskCancelled) {
                  resolve();
                  return;
                }
              }
              if (window._taskCancelled) {
                resolve();
                return;
              }
              try {
                await handleWork$1(doc);
              } catch (error) {
                if (error.message === "Task cancelled" || window._taskCancelled) {
                  logStore$1.addLog("答题任务已取消", LOG_TYPES.WARNING);
                } else {
                  logStore$1.addLog(`处理作业时出错: ${error.message}`, LOG_TYPES.ERROR);
                }
              }
              resolve();
              return;
            }
            if (window._taskCancelled) {
              resolve();
              return;
            }
            if (settingsStore$1.automationSettings.onlyDoQuestions && !iframe.src.includes("api/work") && !iframe.src.includes("exam")) {
              resolve();
              return;
            }
            const hasVideo = iframe.src.includes("video");
            const hasAudio = iframe.src.includes("audio");
            if ((hasVideo || hasAudio) && !window._taskCancelled) {
              const mediaType = hasVideo ? "video" : "audio";
              const mediaElement = await waitForElement(doc, mediaType);
              if (window._taskCancelled) {
                resolve();
                return;
              }
              if (mediaElement) {
                await handleMedia(mediaElement, mediaType);
              }
            }
            if (window._taskCancelled) {
              resolve();
              return;
            }
            resolve();
          } catch (error) {
            console.error("处理iframe时出错:", error);
            if (error.message === "Task cancelled" || window._taskCancelled) {
              resolve();
            } else {
              resolve();
            }
          }
        });
      }
      async function handleWork$1(doc) {
        initStores$1();
        if (window._taskCancelled) return;
        const questions = doc.querySelectorAll(".TiMu");
        if (!questions.length) return;
        const contentWindow = doc.defaultView || doc.parentWindow;
        if (!contentWindow) {
          logStore$1.addLog(`无法获取iframe的contentWindow`, LOG_TYPES.ERROR);
          return;
        }
        logStore$1.addLog(`正在完成一个作业,共${questions.length}道题目`, LOG_TYPES.INFO);
        let correctCount = 0;
        for (const [index, question] of questions.entries()) {
          if (window._taskCancelled) {
            logStore$1.addLog("答题任务被终止", LOG_TYPES.WARNING);
            break;
          }
          try {
            if (window._taskCancelled) {
              logStore$1.addLog("答题任务被终止", LOG_TYPES.WARNING);
              break;
            }
            const { type, title } = parseQuestion$1(question);
            const questionId = getQuestionId$1(question);
            const options = parseOptions$1(question);
            logStore$1.addLog(`正在完成第${index + 1}题,题型:${type}`, LOG_TYPES.INFO);
            if (window._taskCancelled) {
              logStore$1.addLog("答题任务被终止", LOG_TYPES.WARNING);
              break;
            }
            const { isCorrect, answer, title: fullTitle, message } = await checkAnswer({ type, title }, options);
            if (window._taskCancelled) {
              logStore$1.addLog("答题任务被终止", LOG_TYPES.WARNING);
              break;
            }
            if (settingsStore$1.answerSettings.saveAnswerHistory) {
              answerStore$1.addAnswer(fullTitle, isCorrect ? answer : message, type);
            }
            if (!isCorrect) {
              logStore$1.addLog(`未找到答案,跳过此题`, LOG_TYPES.WARNING);
              continue;
            } else {
              correctCount++;
            }
            if (window._taskCancelled) {
              logStore$1.addLog("答题任务被终止", LOG_TYPES.WARNING);
              break;
            }
            if (type.includes("单选题")) {
              if (window._taskCancelled) {
                logStore$1.addLog("答题任务被终止", LOG_TYPES.WARNING);
                break;
              }
              await handleSingleChoice$1(question, questionId, answer, contentWindow);
            } else if (type.includes("多选题")) {
              if (window._taskCancelled) {
                logStore$1.addLog("答题任务被终止", LOG_TYPES.WARNING);
                break;
              }
              await handleMultipleChoice$1(question, questionId, answer, contentWindow);
            } else if (type.includes("判断题")) {
              if (window._taskCancelled) {
                logStore$1.addLog("答题任务被终止", LOG_TYPES.WARNING);
                break;
              }
              await handleJudgment$1(question, questionId, answer, contentWindow);
            } else if (type.includes("填空题")) {
              if (window._taskCancelled) {
                logStore$1.addLog("答题任务被终止", LOG_TYPES.WARNING);
                break;
              }
              await handleFillBlank$1(question, questionId, answer, contentWindow);
            } else if (type.includes("简答题")) {
              if (window._taskCancelled) {
                logStore$1.addLog("答题任务被终止", LOG_TYPES.WARNING);
                break;
              }
              await handleEssay$1(question, questionId, answer, contentWindow);
            }
            if (window._taskCancelled) {
              logStore$1.addLog("答题过程中任务被终止", LOG_TYPES.WARNING);
              break;
            }
          } catch (error) {
            if (window._taskCancelled || error.message === "Task cancelled") {
              logStore$1.addLog("答题任务被终止", LOG_TYPES.WARNING);
              break;
            }
            logStore$1.addLog(`处理题目出错: ${error.message}`, LOG_TYPES.ERROR);
          }
        }
        if (window._taskCancelled) {
          return;
        }
        const correctRate = correctCount / questions.length * 100;
        logStore$1.addLog(`答题完成,正确率: ${correctRate.toFixed(2)}%`, LOG_TYPES.SUCCESS);
        if (settingsStore$1.submitSettings.autoSubmitChapter && correctRate >= settingsStore$1.submitSettings.correctRateThreshold) {
          try {
            if (window._taskCancelled) {
              logStore$1.addLog("任务已取消,不进行提交", LOG_TYPES.WARNING);
              return;
            }
            logStore$1.addLog(`自动提交作业`, LOG_TYPES.INFO);
            contentWindow.btnBlueSubmit();
            await sleep(1e3);
            const submitButton = document.querySelector("#popok");
            if (submitButton) {
              submitButton.click();
              logStore$1.addLog("已点击提交按钮", LOG_TYPES.INFO);
            }
            logStore$1.addLog(`作业提交成功`, LOG_TYPES.SUCCESS);
          } catch (error) {
            if (window._taskCancelled) {
              logStore$1.addLog("提交操作被取消", LOG_TYPES.WARNING);
              return;
            }
            logStore$1.addLog(`提交出错: ${error.message}`, LOG_TYPES.ERROR);
          }
        } else if (!settingsStore$1.submitSettings.autoSubmitChapter) {
          logStore$1.addLog(`自动提交已禁用,请手动提交`, LOG_TYPES.INFO);
          const iframes = document.querySelectorAll("iframe");
          iframes.forEach((iframe) => {
            if (iframe.contentWindow === contentWindow) {
              iframe.removeEventListener("load", handleIframeLoad);
              logStore$1.addLog("已移除iframe监听器,防止重复处理", LOG_TYPES.INFO);
            }
          });
          contentWindow.noSubmit();
        } else {
          logStore$1.addLog(`正确率不足,不进行提交,请检查答案后手动提交`, LOG_TYPES.WARNING);
          const iframes = document.querySelectorAll("iframe");
          iframes.forEach((iframe) => {
            if (iframe.contentWindow === contentWindow) {
              iframe.removeEventListener("load", handleIframeLoad);
              logStore$1.addLog("已移除iframe监听器,防止重复处理", LOG_TYPES.INFO);
            }
          });
          contentWindow.noSubmit();
        }
        if (!settingsStore$1.submitSettings.autoSubmitChapter) {
          try {
            if (window._taskCancelled) {
              logStore$1.addLog("任务已取消,不执行阻止提交操作", LOG_TYPES.WARNING);
              return;
            }
            if (contentWindow && contentWindow.document && contentWindow.document.forms.length > 0) {
              const forms = contentWindow.document.forms;
              for (let i = 0; i < forms.length; i++) {
                const originalSubmit = forms[i].submit;
                forms[i].submit = function() {
                  logStore$1.addLog("已阻止自动提交", LOG_TYPES.WARNING);
                  return false;
                };
              }
              logStore$1.addLog("已禁用自动提交功能", LOG_TYPES.SUCCESS);
              if (window._processedIframes) {
                const iframes = document.querySelectorAll("iframe");
                iframes.forEach((iframe) => {
                  if (iframe.contentWindow === contentWindow) {
                    window._processedIframes.delete(iframe);
                    logStore$1.addLog("已移除iframe处理记录,防止重复处理", LOG_TYPES.INFO);
                  }
                });
              }
            }
          } catch (error) {
            if (window._taskCancelled) {
              logStore$1.addLog("任务已取消", LOG_TYPES.WARNING);
              return;
            }
            logStore$1.addLog(`执行不提交操作失败: ${error.message}`, LOG_TYPES.WARNING);
          }
        }
      }
      async function handleSingleChoice$1(question, questionId, answer, contentWindow) {
        initStores$1();
        if (window._taskCancelled) return;
        try {
          if (window._taskCancelled) return;
          if (await submitAnswer(question, questionId, answer, contentWindow)) {
            if (window._taskCancelled) return;
            logStore$1.addLog("单选题已完成", LOG_TYPES.SUCCESS);
          }
        } catch (error) {
          if (window._taskCancelled) return;
          logStore$1.addLog("单选题答题失败", LOG_TYPES.ERROR);
        }
      }
      async function handleMultipleChoice$1(question, questionId, answers, contentWindow) {
        initStores$1();
        if (window._taskCancelled) return;
        try {
          if (window._taskCancelled) return;
          if (await submitAnswer(question, questionId, answers, contentWindow)) {
            if (window._taskCancelled) return;
            logStore$1.addLog("多选题已完成", LOG_TYPES.SUCCESS);
          }
        } catch (error) {
          if (window._taskCancelled) return;
          logStore$1.addLog("多选题答题失败", LOG_TYPES.ERROR);
        }
      }
      async function handleJudgment$1(question, questionId, answer, contentWindow) {
        initStores$1();
        if (window._taskCancelled) return;
        try {
          if (window._taskCancelled) return;
          if (await submitAnswer(question, questionId, answer, contentWindow)) {
            if (window._taskCancelled) return;
            logStore$1.addLog("判断题已完成", LOG_TYPES.SUCCESS);
          }
        } catch (error) {
          if (window._taskCancelled) return;
          logStore$1.addLog("判断题答题失败", LOG_TYPES.ERROR);
        }
      }
      async function handleFillBlank$1(question, questionId, answer, contentWindow) {
        initStores$1();
        if (window._taskCancelled) return;
        try {
          if (window._taskCancelled) return;
          if (await submitFillBlankAnswer(question, questionId, answer, contentWindow)) {
            if (window._taskCancelled) return;
            logStore$1.addLog("填空题已完成", LOG_TYPES.SUCCESS);
          }
        } catch (error) {
          if (window._taskCancelled) return;
          logStore$1.addLog("填空题答题失败", LOG_TYPES.ERROR);
        }
      }
      async function handleEssay$1(question, questionId, answer, contentWindow) {
        initStores$1();
        if (window._taskCancelled) return;
        try {
          if (window._taskCancelled) return;
          if (await submitEssayAnswer(question, questionId, answer, contentWindow)) {
            if (window._taskCancelled) return;
            logStore$1.addLog("简答题已完成", LOG_TYPES.SUCCESS);
          }
        } catch (error) {
          if (window._taskCancelled) return;
          logStore$1.addLog("简答题答题失败", LOG_TYPES.ERROR);
        }
      }
      async function getAllIframes(doc, processedFrames = /* @__PURE__ */ new Set()) {
        var _a;
        initStores$1();
        if (window._taskCancelled || !doc) return [];
        await waitForPageLoad();
        const iframes = Array.from(doc.getElementsByTagName("iframe"));
        const allIframes = [];
        for (const iframe of iframes) {
          if (window._taskCancelled) break;
          if (processedFrames.has(iframe)) {
            continue;
          }
          processedFrames.add(iframe);
          const parentClass = ((_a = iframe.parentElement) == null ? void 0 : _a.className) || "";
          if (parentClass.includes("ans-job-finished") && settingsStore$1.automationSettings.skipFinishedTasks) {
            continue;
          }
          allIframes.push(iframe);
          try {
            const iframeDoc = await waitForIframeLoad(iframe);
            if (iframeDoc) {
              await waitForPageLoad();
              const innerIframes = await getAllIframes(iframeDoc, processedFrames);
              allIframes.push(...innerIframes);
            }
          } catch (error) {
            console.error("获取子iframe失败:", error);
          }
        }
        return allIframes;
      }
      function addIframeLoadListener(iframe) {
        iframe.removeEventListener("load", handleIframeLoad);
        iframe.addEventListener("load", handleIframeLoad);
      }
      function cancelCurrentTask() {
        initStores$1();
        window._taskCancelled = true;
        window._isProcessing = false;
        if (window._cancelController) {
          try {
            window._cancelController.abort("Task cancelled");
            window._cancelController = new AbortController();
          } catch (e) {
          }
        }
        try {
          const mediaElements = document.querySelectorAll("video, audio");
          mediaElements.forEach((media) => {
            try {
              if (!media.paused) {
                media.pause();
              }
              if (media._handlePause) {
                media.removeEventListener("pause", media._handlePause);
                delete media._handlePause;
              }
              if (media._handleEnded) {
                media.removeEventListener("ended", media._handleEnded);
                delete media._handleEnded;
              }
              if (media._monitorInterval) {
                clearInterval(media._monitorInterval);
                delete media._monitorInterval;
              }
              if (media._unwatchFn) {
                media._unwatchFn();
                delete media._unwatchFn;
              }
            } catch (e) {
            }
          });
        } catch (e) {
        }
        if (answerStore$1) {
          answerStore$1.clearAnswers();
          logStore$1.addLog("已清空答题记录", LOG_TYPES.INFO);
        }
        if (window.gc) {
          try {
            window.gc();
          } catch (e) {
          }
        }
        logStore$1.addLog("已终止之前的任务", LOG_TYPES.WARNING);
      }
      function checkCancelled() {
        if (window._taskCancelled) {
          logStore$1.addLog("检测到任务已被取消,终止处理", LOG_TYPES.WARNING);
          throw new Error("Task cancelled");
        }
      }
      async function checkAndNavigateToNextChapter() {
        initStores$1();
        try {
          if (window._taskCancelled) {
            logStore$1.addLog("任务已被取消,不执行章节跳转", LOG_TYPES.WARNING);
            return;
          }
          if (settingsStore$1.automationSettings.autoNextChapter) {
            const nextButton = document.querySelector(".nextChapter") || document.querySelector(".next_chapternew") || document.querySelector('[title="下一章"]');
            if (nextButton) {
              logStore$1.addLog("所有任务完成,准备进入下一章节", LOG_TYPES.INFO);
              try {
                const signal = window._cancelController.signal;
                if (window._taskCancelled) {
                  logStore$1.addLog("任务已取消,取消跳转到下一章", LOG_TYPES.WARNING);
                  return;
                }
                await Promise.race([
                  sleep(5e3),
                  new Promise((_, reject) => {
                    signal.addEventListener("abort", () => reject(new Error("Wait aborted")));
                  })
                ]);
                if (window._taskCancelled) {
                  logStore$1.addLog("任务已取消,取消跳转到下一章", LOG_TYPES.WARNING);
                  return;
                }
                nextButton.click();
                logStore$1.addLog("已跳转到下一章节", LOG_TYPES.SUCCESS);
              } catch (error) {
                if (window._taskCancelled || error.message === "Wait aborted") {
                  logStore$1.addLog("章节跳转已取消", LOG_TYPES.WARNING);
                } else {
                  logStore$1.addLog(`章节跳转出错: ${error.message}`, LOG_TYPES.ERROR);
                }
                return;
              }
            } else {
              logStore$1.addLog("当前已是最后一章,所有任务已完成", LOG_TYPES.SUCCESS);
            }
          }
        } catch (error) {
          if (error.message === "Task cancelled" || window._taskCancelled) {
            logStore$1.addLog("跳转操作已取消", LOG_TYPES.WARNING);
          } else {
            console.error("跳转到下一章节时出错:", error);
            logStore$1.addLog(`跳转到下一章节出错: ${error.message}`, LOG_TYPES.ERROR);
          }
        }
      }
      function handlePageChange() {
        logStore$1.addLog("页面切换,终止当前任务并重新处理页面", LOG_TYPES.INFO);
        cancelCurrentTask();
        clearAllIframeEventListeners();
        if (window._processedIframes) {
          window._processedIframes.clear();
        }
        if (window._cancelController) {
          window._cancelController.abort("Page changed");
          window._cancelController = new AbortController();
        }
        window._taskCancelled = true;
        window._isProcessing = false;
        setTimeout(() => {
          window._taskCancelled = false;
          window._isProcessing = false;
          try {
            const mediaElements = document.querySelectorAll("video, audio");
            mediaElements.forEach((media) => {
              try {
                media.pause();
                media.removeEventListener("pause", media._handlePause);
                media.removeEventListener("ended", media._handleEnded);
              } catch (e) {
              }
            });
          } catch (e) {
          }
          processPage$1();
        }, 3e3);
      }
      function clearAllIframeEventListeners() {
        var _a;
        try {
          const allIframes = Array.from(document.getElementsByTagName("iframe"));
          for (const iframe of allIframes) {
            iframe.removeEventListener("load", handleIframeLoad);
            try {
              const doc = iframe.contentDocument || ((_a = iframe.contentWindow) == null ? void 0 : _a.document);
              if (doc) {
                const forms = doc.forms;
                if (forms) {
                  for (let i = 0; i < forms.length; i++) {
                    if (forms[i]._originalSubmit) {
                      forms[i].submit = forms[i]._originalSubmit;
                      delete forms[i]._originalSubmit;
                    }
                  }
                }
              }
            } catch (e) {
            }
          }
        } catch (error) {
          console.error("清理iframe事件监听器时出错:", error);
        }
      }
      function setupUrlChangeListener() {
        window._lastUrl = window.location.href;
        window.addEventListener("popstate", () => {
          if (window._lastUrl !== window.location.href) {
            window._lastUrl = window.location.href;
            handlePageChange();
          }
        });
        const urlObserver = new MutationObserver(() => {
          if (window._lastUrl !== window.location.href) {
            window._lastUrl = window.location.href;
            logStore$1.addLog("检测到URL变化,终止当前任务", LOG_TYPES.INFO);
            handlePageChange();
          }
        });
        urlObserver.observe(document, {
          subtree: true,
          childList: true,
          attributes: true,
          characterData: false
        });
        window._urlObserver = urlObserver;
        window.addEventListener("hashchange", () => {
          if (window._lastUrl !== window.location.href) {
            window._lastUrl = window.location.href;
            logStore$1.addLog("检测到hash变化,终止当前任务", LOG_TYPES.INFO);
            handlePageChange();
          }
        });
      }
      async function processPage$1() {
        try {
          initStores$1();
          const currentUrl = window.location.href;
          if (!currentUrl.includes("&mooc2=1") && !currentUrl.includes("?mooc2=1")) {
            const separator = currentUrl.includes("?") ? "&" : "?";
            const newUrl = `${currentUrl}${separator}mooc2=1`;
            window.location.href = newUrl;
            return;
          }
          if (!window._processedIframes) {
            window._processedIframes = /* @__PURE__ */ new Set();
          }
          if (!window._urlObserver) {
            setupUrlChangeListener();
          }
          if (!window._cancelController) {
            window._cancelController = new AbortController();
          }
          if (window._isProcessing) {
            logStore$1.addLog("检测到有正在进行的任务,先终止它", LOG_TYPES.WARNING);
            cancelCurrentTask();
            await sleep(1e3);
          }
          window._taskCancelled = false;
          window._isProcessing = true;
          if (answerStore$1) {
            answerStore$1.clearAnswers();
          }
          logStore$1.addLog("正在解析任务", LOG_TYPES.INFO);
          await waitForPageLoad();
          checkCancelled();
          const allIframes = await getAllIframes(document);
          checkCancelled();
          for (const iframe of allIframes) {
            if (window._taskCancelled) {
              logStore$1.addLog("任务已被取消,终止处理", LOG_TYPES.WARNING);
              break;
            }
            if (!window._processedIframes.has(iframe)) {
              window._processedIframes.add(iframe);
              await processIframe(iframe);
              if (window._taskCancelled) {
                logStore$1.addLog("任务已被取消,终止处理", LOG_TYPES.WARNING);
                break;
              }
            }
          }
          if (window._taskCancelled) {
            return;
          }
          await checkAndNavigateToNextChapter();
          window.addEventListener("beforeunload", () => {
            cancelCurrentTask();
          });
        } catch (error) {
          if (error.message === "Task cancelled") {
            if (logStore$1) logStore$1.addLog("页面处理已取消", LOG_TYPES.WARNING);
          } else {
            console.error("处理页面时出错:", error);
          }
        } finally {
          if (window._taskCancelled) {
            window._isProcessing = false;
          }
        }
      }
      async function handleIframeLoad(event) {
        initStores$1();
        if (window._taskCancelled) return;
        const iframe = event.target;
        try {
          if (iframe.src && iframe.src.includes("api/work")) {
            iframe.removeEventListener("load", handleIframeLoad);
            return;
          }
        } catch (e) {
        }
        logStore$1.addLog("检测到iframe加载,终止当前任务", LOG_TYPES.INFO);
        handlePageChange();
      }
      async function processIframe(iframe) {
        var _a;
        initStores$1();
        try {
          if (window._taskCancelled) {
            logStore$1.addLog("任务已被终止,不处理此iframe", LOG_TYPES.WARNING);
            return;
          }
          const parentClass = ((_a = iframe.parentElement) == null ? void 0 : _a.className) || "";
          if (parentClass.includes("ans-job-finished") && settingsStore$1.automationSettings.skipFinishedTasks) {
            logStore$1.addLog("发现一个已完成任务点", LOG_TYPES.SUCCESS);
            return;
          }
          addIframeLoadListener(iframe);
          if (window._taskCancelled) {
            logStore$1.addLog("任务已被终止,不处理媒体", LOG_TYPES.WARNING);
            return;
          }
          await checkForMedia(iframe);
        } catch (error) {
          if (window._taskCancelled || error.message === "Task cancelled") {
            logStore$1.addLog("iframe处理已取消", LOG_TYPES.WARNING);
          } else {
            console.error("处理iframe时出错:", error);
          }
        }
      }
      function handleChapterPage() {
        initStores$1();
        return processPage$1();
      }
      let logStore = null;
      let answerStore = null;
      let settingsStore = null;
      function initStores() {
        if (!logStore) logStore = useLogStore();
        if (!answerStore) answerStore = useAnswerStore();
        if (!settingsStore) settingsStore = useSettingsStore();
      }
      function removeHtml(html) {
        if (html == null) {
          return "";
        }
        return html.replace(/<((?!img|sub|sup|br)[^>]+)>/g, "").replace(/&nbsp;/g, " ").replace(/\s+/g, " ").replace(/<br\s*\/?>/g, "\n").replace(/<img.*?src="(.*?)".*?>/g, '<img src="$1"/>').trim();
      }
      function parseQuestion(questionElement) {
        try {
          const titleElement = questionElement.querySelector(".mark_name");
          const typeElement = questionElement.getAttribute("typeName");
          if (!titleElement) return { type: "", title: "" };
          const titleHtml = titleElement.innerHTML;
          let title = titleHtml.replace(/^\d+\./, "").replace(/<span[^>]*>\([^)]+\)<\/span>/g, "").trim();
          title = removeHtml(title);
          return {
            type: typeElement || "",
            title
          };
        } catch (error) {
          return { type: "", title: "" };
        }
      }
      function parseOptions(questionElement) {
        try {
          const type = questionElement.getAttribute("typeName");
          const questionId = questionElement.getAttribute("data");
          const stemAnswer = questionElement.querySelector(".stem_answer");
          if (!stemAnswer) return [];
          let options = [];
          if (type === "单选题") {
            options = Array.from(stemAnswer.querySelectorAll(".clearfix.answerBg")).map((option) => {
              const valueElement = option.querySelector(`[data]`);
              const textElement = option.querySelector(".answer_p");
              const value = valueElement ? valueElement.getAttribute("data") : "";
              const text = textElement ? removeHtml(textElement.innerHTML) : "";
              return { value, text };
            });
          } else if (type === "多选题") {
            options = Array.from(stemAnswer.querySelectorAll(".clearfix.answerBg")).map((option) => {
              const valueElement = option.querySelector(`[data]`);
              const textElement = option.querySelector(".answer_p");
              const value = valueElement ? valueElement.getAttribute("data") : "";
              const text = textElement ? removeHtml(textElement.innerHTML) : "";
              return { value, text };
            });
          } else if (type === "判断题") {
            options = Array.from(stemAnswer.querySelectorAll(".clearfix.answerBg")).map((option) => {
              const valueElement = option.querySelector(`[data]`);
              const textElement = option.querySelector(".answer_p");
              const value = valueElement ? valueElement.getAttribute("data") : "";
              const text = textElement ? removeHtml(textElement.innerHTML) : "";
              return { value, text };
            });
          }
          return options;
        } catch (error) {
          return [];
        }
      }
      function getQuestionId(questionElement) {
        try {
          const id = questionElement.getAttribute("data") || questionElement.id || "";
          const match = id.match(/question(\d+)/);
          return match ? match[1] : id;
        } catch (error) {
          return "";
        }
      }
      async function handleSingleChoice(questionElement, questionId, answer) {
        if (!answer) return;
        try {
          const stemAnswer = questionElement.querySelector(".stem_answer");
          if (!stemAnswer) return;
          const options = Array.from(stemAnswer.querySelectorAll(".clearfix.answerBg"));
          for (const option of options) {
            const valueElement = option.querySelector(`[data]`);
            const value = valueElement ? valueElement.getAttribute("data") : "";
            if (value === answer) {
              const isSelected = option.querySelector(".check_answer") !== null;
              if (!isSelected) {
                option.click();
              }
              break;
            }
          }
        } catch (error) {
        }
      }
      async function handleMultipleChoice(questionElement, questionId, answer) {
        if (!answer || !answer.length) return;
        const answers = Array.isArray(answer) ? answer : [answer];
        try {
          const stemAnswer = questionElement.querySelector(".stem_answer");
          if (!stemAnswer) return;
          const options = Array.from(stemAnswer.querySelectorAll(".clearfix.answerBg"));
          for (const option of options) {
            const valueElement = option.querySelector(`[data]`);
            const value = valueElement ? valueElement.getAttribute("data") : "";
            if (answers.includes(value)) {
              const isSelected = option.querySelector(".check_answer") !== null;
              if (!isSelected) {
                option.click();
              }
            }
          }
        } catch (error) {
        }
      }
      async function handleJudgment(questionElement, questionId, answer) {
        if (!answer) return;
        try {
          const stemAnswer = questionElement.querySelector(".stem_answer");
          if (!stemAnswer) return;
          const options = Array.from(stemAnswer.querySelectorAll(".clearfix.answerBg"));
          for (const option of options) {
            const valueElement = option.querySelector(`[data]`);
            const value = valueElement ? valueElement.getAttribute("data") : "";
            const textElement = option.querySelector(".answer_p");
            const text = textElement ? textElement.textContent.trim() : "";
            const isMatch = answer === value || answer === "true" && value === "true" || answer === "false" && value === "false" || answer === "true" && text === "对" || answer === "false" && text === "错";
            if (isMatch) {
              const isSelected = option.querySelector(".check_answer") !== null;
              if (!isSelected) {
                option.click();
              }
              break;
            }
          }
        } catch (error) {
        }
      }
      async function handleFillBlank(questionElement, questionId, answer) {
        if (!answer) return;
        try {
          const inputs = Array.from(questionElement.querySelectorAll("textarea"));
          const answers = Array.isArray(answer) ? answer : [answer];
          if (inputs.length === 0) return;
          for (let i = 0; i < inputs.length && i < answers.length; i++) {
            const input = inputs[i];
            if (!input.id) continue;
            try {
              const editor = unsafeWindow.UE.getEditor(input.id);
              if (editor) {
                editor.setContent("");
                editor.setContent(answers[i]);
              } else {
                input.value = answers[i];
                const event = new Event("change", { bubbles: true });
                input.dispatchEvent(event);
              }
            } catch (editorError) {
              try {
                input.value = answers[i];
                const event = new Event("change", { bubbles: true });
                input.dispatchEvent(event);
              } catch (inputError) {
              }
            }
          }
        } catch (error) {
        }
      }
      async function handleEssay(questionElement, questionId, answer) {
        if (!answer) return;
        try {
          const textarea = questionElement.querySelector("textarea");
          if (!textarea) return;
          if (!textarea.id) {
            textarea.value = answer;
            const event = new Event("change", { bubbles: true });
            textarea.dispatchEvent(event);
            return;
          }
          try {
            const editor = unsafeWindow.UE.getEditor(textarea.id);
            if (editor) {
              if (editor.ready) {
                editor.setContent("");
                editor.setContent(answer);
              } else {
                editor.addListener("ready", function() {
                  editor.setContent("");
                  editor.setContent(answer);
                });
              }
            } else {
              textarea.value = answer;
              const event = new Event("change", { bubbles: true });
              textarea.dispatchEvent(event);
            }
          } catch (editorError) {
            try {
              textarea.value = answer;
              const event = new Event("change", { bubbles: true });
              textarea.dispatchEvent(event);
            } catch (inputError) {
            }
          }
        } catch (error) {
        }
      }
      async function handleWork(doc) {
        initStores();
        if (window._taskCancelled) return;
        const questionSections = doc.querySelectorAll(".whiteDiv");
        if (!questionSections.length) {
          logStore.addLog("未找到题目区域", LOG_TYPES.WARNING);
          return;
        }
        let totalQuestions = 0;
        questionSections.forEach((section) => {
          const questions = section.querySelectorAll(".questionLi");
          totalQuestions += questions.length;
        });
        logStore.addLog(`找到${questionSections.length}个题目类型,共${totalQuestions}道题`, LOG_TYPES.INFO);
        let correctCount = 0;
        let totalProcessed = 0;
        for (const section of questionSections) {
          if (window._taskCancelled) break;
          const questions = section.querySelectorAll(".questionLi");
          for (const question of questions) {
            if (window._taskCancelled) break;
            totalProcessed++;
            try {
              const questionId = getQuestionId(question);
              const { type, title } = parseQuestion(question);
              if (!title) continue;
              const options = parseOptions(question);
              logStore.addLog(`正在完成第${totalProcessed}题,题型:${type}`, LOG_TYPES.INFO);
              if (window._taskCancelled) break;
              const { isCorrect, answer, title: fullTitle, message } = await checkAnswer({ type, title }, options);
              if (window._taskCancelled) break;
              if (settingsStore.answerSettings.saveAnswerHistory) {
                answerStore.addAnswer(fullTitle, isCorrect ? answer : message, type);
              }
              if (!isCorrect) {
                logStore.addLog(`未找到答案,跳过此题`, LOG_TYPES.WARNING);
                continue;
              } else {
                correctCount++;
              }
              if (window._taskCancelled) break;
              if (type === "单选题") {
                await handleSingleChoice(question, questionId, answer);
              } else if (type === "多选题") {
                await handleMultipleChoice(question, questionId, answer);
              } else if (type === "判断题") {
                await handleJudgment(question, questionId, answer);
              } else if (type === "填空题") {
                await handleFillBlank(question, questionId, answer);
              } else if (type === "简答题") {
                await handleEssay(question, questionId, answer);
              }
              if (window._taskCancelled) {
                logStore.addLog("答题过程中任务被终止", LOG_TYPES.WARNING);
                break;
              }
            } catch (error) {
              logStore.addLog(`处理题目出错: ${error.message}`, LOG_TYPES.ERROR);
              if (window._taskCancelled || error.message === "Task cancelled") {
                break;
              }
            }
          }
        }
        if (window._taskCancelled) return;
        const correctRate = totalProcessed > 0 ? correctCount / totalProcessed * 100 : 0;
        logStore.addLog(`答题完成,正确率: ${correctRate.toFixed(2)}%`, LOG_TYPES.SUCCESS);
        try {
          if (typeof window.saveWork === "function") {
            logStore.addLog("正在保存作业...", LOG_TYPES.INFO);
            window.saveWork();
            logStore.addLog("作业已保存", LOG_TYPES.SUCCESS);
          } else if (doc.saveWork) {
            logStore.addLog("正在保存作业...", LOG_TYPES.INFO);
            doc.saveWork();
            logStore.addLog("作业已保存", LOG_TYPES.SUCCESS);
          }
        } catch (error) {
          logStore.addLog(`保存作业失败: ${error.message}`, LOG_TYPES.ERROR);
        }
        if (settingsStore.automationSettings.autoSubmit && correctRate >= settingsStore.automationSettings.submitThreshold) {
          try {
            if (window._taskCancelled) return;
            const submitButton = doc.querySelector(".Btn_blue_1");
            if (submitButton) {
              logStore.addLog("正在提交作业...", LOG_TYPES.INFO);
              submitButton.click();
            } else {
              logStore.addLog("未找到提交按钮", LOG_TYPES.WARNING);
            }
          } catch (error) {
            logStore.addLog(`提交失败: ${error.message}`, LOG_TYPES.ERROR);
          }
        }
      }
      async function processPage() {
        try {
          initStores();
          if (!window._cancelController) {
            window._cancelController = new AbortController();
          }
          if (window._isProcessing) {
            window._cancelController.abort("Task cancelled");
            window._cancelController = new AbortController();
            window._taskCancelled = false;
            await new Promise((resolve) => setTimeout(resolve, 500));
          }
          window._taskCancelled = false;
          window._isProcessing = true;
          if (answerStore) {
            answerStore.clearAnswers();
          }
          logStore.addLog("正在解析作业页面", LOG_TYPES.INFO);
          await handleWork(document);
          window._isProcessing = false;
          logStore.addLog("作业页面处理完成", LOG_TYPES.SUCCESS);
        } catch (error) {
          if (error.message === "Task cancelled") {
            if (logStore) logStore.addLog("页面处理已取消", LOG_TYPES.WARNING);
          } else {
            console.error("处理作业页面时出错:", error);
            if (logStore) logStore.addLog(`处理错误: ${error.message}`, LOG_TYPES.ERROR);
          }
          window._isProcessing = false;
        }
      }
      function handleHomeworkPage() {
        initStores();
        logStore.addLog("开始处理作业页面", LOG_TYPES.INFO);
        processPage().catch((error) => {
          console.error("处理作业页面主函数出错:", error);
          logStore.addLog(`处理错误: ${error.message}`, LOG_TYPES.ERROR);
        });
      }
      const experienceNewHandler = () => {
        const experienceLinks = Array.from(document.querySelectorAll(".experience")).filter(
          (el) => el.textContent.includes("体验新版")
        );
        if (experienceLinks.length > 0) {
          experienceLinks[0].click();
          console.log('已点击"体验新版"按钮');
        } else {
          console.log('未找到"体验新版"按钮');
        }
      };
      function myCourseHandler() {
        const logStore2 = useLogStore();
        logStore2.addLog("请进入相关页面学习");
        console.log("超星课程页面处理器已执行");
      }
      const routes = [
        {
          // 匹配超星章节页面 - 同时匹配两种路径模式
          pattern: /\.chaoxing\.com\/(mooc-ans\/)?mycourse\/studentstudy/,
          handler: handleChapterPage,
          description: "超星章节"
        },
        {
          // 匹配超星作业页面 /mooc-ans/mooc2/work/dowork
          pattern: /\.chaoxing\.com\/mooc-ans\/mooc2\/work\/dowork/,
          handler: handleHomeworkPage,
          description: "超星作业"
        },
        {
          // 匹配 mooc1.chaoxing.com/mooc-ans/mycourse/studentcourse 页面,点击"体验新版"按钮
          pattern: /mooc1\.chaoxing\.com\/mycourse\/studentcourse/,
          handler: experienceNewHandler,
          description: "点击体验新版"
        },
        {
          // 课程页面处理
          pattern: /\.chaoxing\.com\/mooc2-ans\/mycourse\/stu\?/,
          handler: myCourseHandler,
          description: "超星课程页面"
        }
        // {
        //   // 匹配其他超星章节页面
        //   pattern: /\.chaoxing\.com\/.*\/chapter/,
        //   handler: chapterHandler,
        //   description: '超星章节页面处理'
        // }
        // 可以继续添加更多路由配置
      ];
      function isMatchingUrl(pattern) {
        const currentUrl = _unsafeWindow.location.href;
        console.log("currentUrl", currentUrl);
        if (pattern instanceof RegExp) {
          return pattern.test(currentUrl);
        }
        return currentUrl.includes(pattern);
      }
      const _hoisted_1 = { id: "app" };
      const _hoisted_2 = { class: "app-container" };
      const _sfc_main = {
        __name: "App",
        setup(__props) {
          const visible = ref(false);
          const processedUrls = /* @__PURE__ */ new Set();
          const checkRouteMatch = async () => {
            const currentUrl = window.location.href;
            if (processedUrls.has(currentUrl)) {
              console.log(`URL已处理过,跳过: ${currentUrl}`);
              return;
            }
            for (const route of routes) {
              if (isMatchingUrl(route.pattern)) {
                console.log(`匹配到路由: ${route.description},显示浮窗`);
                visible.value = true;
                processedUrls.add(currentUrl);
                try {
                  if (typeof route.handler === "function") {
                    await route.handler();
                  }
                } catch (error) {
                  console.error("执行页面处理器失败:", error);
                }
                return;
              }
            }
            console.log("未匹配到任何路由,隐藏浮窗");
            visible.value = false;
          };
          const setupUrlObserver = () => {
            const observer = new MutationObserver((mutations) => {
              const currentUrl = window.location.href;
              if (window._lastUrl !== currentUrl) {
                window._lastUrl = currentUrl;
                console.log("URL已变化,重新检查路由匹配");
                checkRouteMatch();
              }
            });
            observer.observe(document.body, {
              childList: true,
              subtree: true
            });
            window._urlChangeObserver = observer;
            window._lastUrl = window.location.href;
          };
          onMounted(() => {
            checkRouteMatch();
            setupUrlObserver();
          });
          onUnmounted(() => {
            if (window._urlChangeObserver) {
              window._urlChangeObserver.disconnect();
            }
          });
          return (_ctx, _cache) => {
            return openBlock(), createElementBlock("div", _hoisted_1, [
              createElementVNode("div", _hoisted_2, [
                visible.value ? (openBlock(), createBlock(FloatingWindow, { key: 0 })) : createCommentVNode("", true)
              ])
            ]);
          };
        }
      };
      const inlineCss = '.floating-modal{pointer-events:none}.ant-modal-header{padding:13px}:host{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji"}';
      const vueApp = createApp(_sfc_main);
      const pinia = createPinia();
      vueApp.use(pinia).use(Antd).mount(
        (() => {
          const shadow_root = document.createElement("div");
          const app = document.createElement("div");
          document.body.append(shadow_root);
          const shadow = shadow_root.attachShadow({ mode: "open" });
          shadow.appendChild(app);
          const sheet = new CSSStyleSheet();
          const sheet1 = new CSSStyleSheet();
          const AntdStyle = _GM_getResourceText("AntdStyle");
          sheet.replace(AntdStyle);
          sheet1.replace(inlineCss);
          shadow.adoptedStyleSheets = [sheet, sheet1];
          return app;
        })()
      );

    })
  };
}));

System.register("./fontDecrypt-DGcy2eZR-CITC-UpU.js", ['./__monkey.entry-CnOo8JLR.js', 'blueimp-md5', 'vue', 'pinia', 'ant-design-vue'], (function (exports, module) {
  'use strict';
  var _GM_getResourceText, md5;
  return {
    setters: [module => {
      _GM_getResourceText = module._;
    }, module => {
      md5 = module.default;
    }, null, null, null],
    execute: (function () {

      exports("decrypt", decrypt);

      var dist = {};
      var Typr = {};
      var hasRequiredTypr;
      function requireTypr() {
        if (hasRequiredTypr) return Typr;
        hasRequiredTypr = 1;
        var Typr$1 = {};
        Typr$1.parse = function(buff) {
          var bin = Typr$1._bin;
          var data = new Uint8Array(buff);
          var tag = bin.readASCII(data, 0, 4);
          if (tag == "ttcf") {
            var offset = 4;
            bin.readUshort(data, offset);
            offset += 2;
            bin.readUshort(data, offset);
            offset += 2;
            var numF = bin.readUint(data, offset);
            offset += 4;
            var fnts = [];
            for (var i = 0; i < numF; i++) {
              var foff = bin.readUint(data, offset);
              offset += 4;
              fnts.push(Typr$1._readFont(data, foff));
            }
            return fnts;
          } else
            return [Typr$1._readFont(data, 0)];
        };
        Typr$1._readFont = function(data, offset) {
          var bin = Typr$1._bin;
          var ooff = offset;
          bin.readFixed(data, offset);
          offset += 4;
          var numTables = bin.readUshort(data, offset);
          offset += 2;
          bin.readUshort(data, offset);
          offset += 2;
          bin.readUshort(data, offset);
          offset += 2;
          bin.readUshort(data, offset);
          offset += 2;
          var tags = [
            "cmap",
            "head",
            "hhea",
            "maxp",
            "hmtx",
            "name",
            "OS/2",
            "post",
            //"cvt",
            //"fpgm",
            "loca",
            "glyf",
            "kern",
            //"prep"
            //"gasp"
            "CFF ",
            "GPOS",
            "GSUB",
            "SVG "
            //"VORG",
          ];
          var obj = { _data: data, _offset: ooff };
          var tabs = {};
          for (var i = 0; i < numTables; i++) {
            var tag = bin.readASCII(data, offset, 4);
            offset += 4;
            bin.readUint(data, offset);
            offset += 4;
            var toffset = bin.readUint(data, offset);
            offset += 4;
            var length = bin.readUint(data, offset);
            offset += 4;
            tabs[tag] = { offset: toffset, length };
          }
          for (var i = 0; i < tags.length; i++) {
            var t = tags[i];
            if (tabs[t])
              obj[t.trim()] = Typr$1[t.trim()].parse(data, tabs[t].offset, tabs[t].length, obj);
          }
          return obj;
        };
        Typr$1._tabOffset = function(data, tab, foff) {
          var bin = Typr$1._bin;
          var numTables = bin.readUshort(data, foff + 4);
          var offset = foff + 12;
          for (var i = 0; i < numTables; i++) {
            var tag = bin.readASCII(data, offset, 4);
            offset += 4;
            bin.readUint(data, offset);
            offset += 4;
            var toffset = bin.readUint(data, offset);
            offset += 4;
            bin.readUint(data, offset);
            offset += 4;
            if (tag == tab)
              return toffset;
          }
          return 0;
        };
        Typr$1._bin = {
          readFixed: function(data, o) {
            return (data[o] << 8 | data[o + 1]) + (data[o + 2] << 8 | data[o + 3]) / (256 * 256 + 4);
          },
          readF2dot14: function(data, o) {
            var num = Typr$1._bin.readShort(data, o);
            return num / 16384;
          },
          readInt: function(buff, p) {
            return Typr$1._bin._view(buff).getInt32(p);
          },
          readInt8: function(buff, p) {
            return Typr$1._bin._view(buff).getInt8(p);
          },
          readShort: function(buff, p) {
            return Typr$1._bin._view(buff).getInt16(p);
          },
          readUshort: function(buff, p) {
            return Typr$1._bin._view(buff).getUint16(p);
          },
          readUshorts: function(buff, p, len) {
            var arr = [];
            for (var i = 0; i < len; i++)
              arr.push(Typr$1._bin.readUshort(buff, p + i * 2));
            return arr;
          },
          readUint: function(buff, p) {
            return Typr$1._bin._view(buff).getUint32(p);
          },
          readUint64: function(buff, p) {
            return Typr$1._bin.readUint(buff, p) * (4294967295 + 1) + Typr$1._bin.readUint(buff, p + 4);
          },
          readASCII: function(buff, p, l) {
            var s = "";
            for (var i = 0; i < l; i++)
              s += String.fromCharCode(buff[p + i]);
            return s;
          },
          readUnicode: function(buff, p, l) {
            var s = "";
            for (var i = 0; i < l; i++) {
              var c = buff[p++] << 8 | buff[p++];
              s += String.fromCharCode(c);
            }
            return s;
          },
          _tdec: typeof window !== "undefined" && window["TextDecoder"] ? new window["TextDecoder"]() : null,
          readUTF8: function(buff, p, l) {
            var tdec = Typr$1._bin._tdec;
            if (tdec && p == 0 && l == buff.length)
              return tdec["decode"](buff);
            return Typr$1._bin.readASCII(buff, p, l);
          },
          readBytes: function(buff, p, l) {
            var arr = [];
            for (var i = 0; i < l; i++)
              arr.push(buff[p + i]);
            return arr;
          },
          readASCIIArray: function(buff, p, l) {
            var s = [];
            for (var i = 0; i < l; i++)
              s.push(String.fromCharCode(buff[p + i]));
            return s;
          },
          _view: function(buff) {
            return buff._dataView || (buff._dataView = buff.buffer ? new DataView(buff.buffer, buff.byteOffset, buff.byteLength) : new DataView(new Uint8Array(buff).buffer));
          }
        };
        Typr$1._lctf = {};
        Typr$1._lctf.parse = function(data, offset, length, font, subt) {
          var bin = Typr$1._bin;
          var obj = {};
          var offset0 = offset;
          bin.readFixed(data, offset);
          offset += 4;
          var offScriptList = bin.readUshort(data, offset);
          offset += 2;
          var offFeatureList = bin.readUshort(data, offset);
          offset += 2;
          var offLookupList = bin.readUshort(data, offset);
          offset += 2;
          obj.scriptList = Typr$1._lctf.readScriptList(data, offset0 + offScriptList);
          obj.featureList = Typr$1._lctf.readFeatureList(data, offset0 + offFeatureList);
          obj.lookupList = Typr$1._lctf.readLookupList(data, offset0 + offLookupList, subt);
          return obj;
        };
        Typr$1._lctf.readLookupList = function(data, offset, subt) {
          var bin = Typr$1._bin;
          var offset0 = offset;
          var obj = [];
          var count = bin.readUshort(data, offset);
          offset += 2;
          for (var i = 0; i < count; i++) {
            var noff = bin.readUshort(data, offset);
            offset += 2;
            var lut = Typr$1._lctf.readLookupTable(data, offset0 + noff, subt);
            obj.push(lut);
          }
          return obj;
        };
        Typr$1._lctf.readLookupTable = function(data, offset, subt) {
          var bin = Typr$1._bin;
          var offset0 = offset;
          var obj = { tabs: [] };
          obj.ltype = bin.readUshort(data, offset);
          offset += 2;
          obj.flag = bin.readUshort(data, offset);
          offset += 2;
          var cnt = bin.readUshort(data, offset);
          offset += 2;
          var ltype = obj.ltype;
          for (var i = 0; i < cnt; i++) {
            var noff = bin.readUshort(data, offset);
            offset += 2;
            var tab = subt(data, ltype, offset0 + noff, obj);
            obj.tabs.push(tab);
          }
          return obj;
        };
        Typr$1._lctf.numOfOnes = function(n) {
          var num = 0;
          for (var i = 0; i < 32; i++)
            if ((n >>> i & 1) != 0)
              num++;
          return num;
        };
        Typr$1._lctf.readClassDef = function(data, offset) {
          var bin = Typr$1._bin;
          var obj = [];
          var format = bin.readUshort(data, offset);
          offset += 2;
          if (format == 1) {
            var startGlyph = bin.readUshort(data, offset);
            offset += 2;
            var glyphCount = bin.readUshort(data, offset);
            offset += 2;
            for (var i = 0; i < glyphCount; i++) {
              obj.push(startGlyph + i);
              obj.push(startGlyph + i);
              obj.push(bin.readUshort(data, offset));
              offset += 2;
            }
          }
          if (format == 2) {
            var count = bin.readUshort(data, offset);
            offset += 2;
            for (var i = 0; i < count; i++) {
              obj.push(bin.readUshort(data, offset));
              offset += 2;
              obj.push(bin.readUshort(data, offset));
              offset += 2;
              obj.push(bin.readUshort(data, offset));
              offset += 2;
            }
          }
          return obj;
        };
        Typr$1._lctf.getInterval = function(tab, val) {
          for (var i = 0; i < tab.length; i += 3) {
            var start = tab[i], end = tab[i + 1];
            tab[i + 2];
            if (start <= val && val <= end)
              return i;
          }
          return -1;
        };
        Typr$1._lctf.readCoverage = function(data, offset) {
          var bin = Typr$1._bin;
          var cvg = {};
          cvg.fmt = bin.readUshort(data, offset);
          offset += 2;
          var count = bin.readUshort(data, offset);
          offset += 2;
          if (cvg.fmt == 1)
            cvg.tab = bin.readUshorts(data, offset, count);
          if (cvg.fmt == 2)
            cvg.tab = bin.readUshorts(data, offset, count * 3);
          return cvg;
        };
        Typr$1._lctf.coverageIndex = function(cvg, val) {
          var tab = cvg.tab;
          if (cvg.fmt == 1)
            return tab.indexOf(val);
          if (cvg.fmt == 2) {
            var ind = Typr$1._lctf.getInterval(tab, val);
            if (ind != -1)
              return tab[ind + 2] + (val - tab[ind]);
          }
          return -1;
        };
        Typr$1._lctf.readFeatureList = function(data, offset) {
          var bin = Typr$1._bin;
          var offset0 = offset;
          var obj = [];
          var count = bin.readUshort(data, offset);
          offset += 2;
          for (var i = 0; i < count; i++) {
            var tag = bin.readASCII(data, offset, 4);
            offset += 4;
            var noff = bin.readUshort(data, offset);
            offset += 2;
            var feat = Typr$1._lctf.readFeatureTable(data, offset0 + noff);
            feat.tag = tag.trim();
            obj.push(feat);
          }
          return obj;
        };
        Typr$1._lctf.readFeatureTable = function(data, offset) {
          var bin = Typr$1._bin;
          var offset0 = offset;
          var feat = {};
          var featureParams = bin.readUshort(data, offset);
          offset += 2;
          if (featureParams > 0) {
            feat.featureParams = offset0 + featureParams;
          }
          var lookupCount = bin.readUshort(data, offset);
          offset += 2;
          feat.tab = [];
          for (var i = 0; i < lookupCount; i++)
            feat.tab.push(bin.readUshort(data, offset + 2 * i));
          return feat;
        };
        Typr$1._lctf.readScriptList = function(data, offset) {
          var bin = Typr$1._bin;
          var offset0 = offset;
          var obj = {};
          var count = bin.readUshort(data, offset);
          offset += 2;
          for (var i = 0; i < count; i++) {
            var tag = bin.readASCII(data, offset, 4);
            offset += 4;
            var noff = bin.readUshort(data, offset);
            offset += 2;
            obj[tag.trim()] = Typr$1._lctf.readScriptTable(data, offset0 + noff);
          }
          return obj;
        };
        Typr$1._lctf.readScriptTable = function(data, offset) {
          var bin = Typr$1._bin;
          var offset0 = offset;
          var obj = {};
          var defLangSysOff = bin.readUshort(data, offset);
          offset += 2;
          if (defLangSysOff > 0) {
            obj["default"] = Typr$1._lctf.readLangSysTable(data, offset0 + defLangSysOff);
          }
          var langSysCount = bin.readUshort(data, offset);
          offset += 2;
          for (var i = 0; i < langSysCount; i++) {
            var tag = bin.readASCII(data, offset, 4);
            offset += 4;
            var langSysOff = bin.readUshort(data, offset);
            offset += 2;
            obj[tag.trim()] = Typr$1._lctf.readLangSysTable(data, offset0 + langSysOff);
          }
          return obj;
        };
        Typr$1._lctf.readLangSysTable = function(data, offset) {
          var bin = Typr$1._bin;
          var obj = {};
          bin.readUshort(data, offset);
          offset += 2;
          obj.reqFeature = bin.readUshort(data, offset);
          offset += 2;
          var featureCount = bin.readUshort(data, offset);
          offset += 2;
          obj.features = bin.readUshorts(data, offset, featureCount);
          return obj;
        };
        Typr$1.CFF = {};
        Typr$1.CFF.parse = function(data, offset, length) {
          var bin = Typr$1._bin;
          data = new Uint8Array(data.buffer, offset, length);
          offset = 0;
          data[offset];
          offset++;
          data[offset];
          offset++;
          data[offset];
          offset++;
          data[offset];
          offset++;
          var ninds = [];
          offset = Typr$1.CFF.readIndex(data, offset, ninds);
          var names = [];
          for (var i = 0; i < ninds.length - 1; i++)
            names.push(bin.readASCII(data, offset + ninds[i], ninds[i + 1] - ninds[i]));
          offset += ninds[ninds.length - 1];
          var tdinds = [];
          offset = Typr$1.CFF.readIndex(data, offset, tdinds);
          var topDicts = [];
          for (var i = 0; i < tdinds.length - 1; i++)
            topDicts.push(Typr$1.CFF.readDict(data, offset + tdinds[i], offset + tdinds[i + 1]));
          offset += tdinds[tdinds.length - 1];
          var topdict = topDicts[0];
          var sinds = [];
          offset = Typr$1.CFF.readIndex(data, offset, sinds);
          var strings = [];
          for (var i = 0; i < sinds.length - 1; i++)
            strings.push(bin.readASCII(data, offset + sinds[i], sinds[i + 1] - sinds[i]));
          offset += sinds[sinds.length - 1];
          Typr$1.CFF.readSubrs(data, offset, topdict);
          if (topdict.CharStrings) {
            offset = topdict.CharStrings;
            var sinds = [];
            offset = Typr$1.CFF.readIndex(data, offset, sinds);
            var cstr = [];
            for (var i = 0; i < sinds.length - 1; i++)
              cstr.push(bin.readBytes(data, offset + sinds[i], sinds[i + 1] - sinds[i]));
            topdict.CharStrings = cstr;
          }
          if (topdict.ROS) {
            offset = topdict.FDArray;
            var fdind = [];
            offset = Typr$1.CFF.readIndex(data, offset, fdind);
            topdict.FDArray = [];
            for (var i = 0; i < fdind.length - 1; i++) {
              var dict = Typr$1.CFF.readDict(data, offset + fdind[i], offset + fdind[i + 1]);
              Typr$1.CFF._readFDict(data, dict, strings);
              topdict.FDArray.push(dict);
            }
            offset += fdind[fdind.length - 1];
            offset = topdict.FDSelect;
            topdict.FDSelect = [];
            var fmt = data[offset];
            offset++;
            if (fmt == 3) {
              var rns = bin.readUshort(data, offset);
              offset += 2;
              for (var i = 0; i < rns + 1; i++) {
                topdict.FDSelect.push(bin.readUshort(data, offset), data[offset + 2]);
                offset += 3;
              }
            } else
              throw fmt;
          }
          if (topdict.Encoding)
            topdict.Encoding = Typr$1.CFF.readEncoding(data, topdict.Encoding, topdict.CharStrings.length);
          if (topdict.charset)
            topdict.charset = Typr$1.CFF.readCharset(data, topdict.charset, topdict.CharStrings.length);
          Typr$1.CFF._readFDict(data, topdict, strings);
          return topdict;
        };
        Typr$1.CFF._readFDict = function(data, dict, ss) {
          var offset;
          if (dict.Private) {
            offset = dict.Private[1];
            dict.Private = Typr$1.CFF.readDict(data, offset, offset + dict.Private[0]);
            if (dict.Private.Subrs)
              Typr$1.CFF.readSubrs(data, offset + dict.Private.Subrs, dict.Private);
          }
          for (var p in dict)
            if (["FamilyName", "FontName", "FullName", "Notice", "version", "Copyright"].indexOf(p) != -1)
              dict[p] = ss[dict[p] - 426 + 35];
        };
        Typr$1.CFF.readSubrs = function(data, offset, obj) {
          var bin = Typr$1._bin;
          var gsubinds = [];
          offset = Typr$1.CFF.readIndex(data, offset, gsubinds);
          var bias, nSubrs = gsubinds.length;
          if (nSubrs < 1240)
            bias = 107;
          else if (nSubrs < 33900)
            bias = 1131;
          else
            bias = 32768;
          obj.Bias = bias;
          obj.Subrs = [];
          for (var i = 0; i < gsubinds.length - 1; i++)
            obj.Subrs.push(bin.readBytes(data, offset + gsubinds[i], gsubinds[i + 1] - gsubinds[i]));
        };
        Typr$1.CFF.tableSE = [
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          1,
          2,
          3,
          4,
          5,
          6,
          7,
          8,
          9,
          10,
          11,
          12,
          13,
          14,
          15,
          16,
          17,
          18,
          19,
          20,
          21,
          22,
          23,
          24,
          25,
          26,
          27,
          28,
          29,
          30,
          31,
          32,
          33,
          34,
          35,
          36,
          37,
          38,
          39,
          40,
          41,
          42,
          43,
          44,
          45,
          46,
          47,
          48,
          49,
          50,
          51,
          52,
          53,
          54,
          55,
          56,
          57,
          58,
          59,
          60,
          61,
          62,
          63,
          64,
          65,
          66,
          67,
          68,
          69,
          70,
          71,
          72,
          73,
          74,
          75,
          76,
          77,
          78,
          79,
          80,
          81,
          82,
          83,
          84,
          85,
          86,
          87,
          88,
          89,
          90,
          91,
          92,
          93,
          94,
          95,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          96,
          97,
          98,
          99,
          100,
          101,
          102,
          103,
          104,
          105,
          106,
          107,
          108,
          109,
          110,
          0,
          111,
          112,
          113,
          114,
          0,
          115,
          116,
          117,
          118,
          119,
          120,
          121,
          122,
          0,
          123,
          0,
          124,
          125,
          126,
          127,
          128,
          129,
          130,
          131,
          0,
          132,
          133,
          0,
          134,
          135,
          136,
          137,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          0,
          138,
          0,
          139,
          0,
          0,
          0,
          0,
          140,
          141,
          142,
          143,
          0,
          0,
          0,
          0,
          0,
          144,
          0,
          0,
          0,
          145,
          0,
          0,
          146,
          147,
          148,
          149,
          0,
          0,
          0,
          0
        ];
        Typr$1.CFF.glyphByUnicode = function(cff, code) {
          for (var i = 0; i < cff.charset.length; i++)
            if (cff.charset[i] == code)
              return i;
          return -1;
        };
        Typr$1.CFF.glyphBySE = function(cff, charcode) {
          if (charcode < 0 || charcode > 255)
            return -1;
          return Typr$1.CFF.glyphByUnicode(cff, Typr$1.CFF.tableSE[charcode]);
        };
        Typr$1.CFF.readEncoding = function(data, offset, num) {
          Typr$1._bin;
          var array = [".notdef"];
          var format = data[offset];
          offset++;
          if (format == 0) {
            var nCodes = data[offset];
            offset++;
            for (var i = 0; i < nCodes; i++)
              array.push(data[offset + i]);
          } else
            throw "error: unknown encoding format: " + format;
          return array;
        };
        Typr$1.CFF.readCharset = function(data, offset, num) {
          var bin = Typr$1._bin;
          var charset = [".notdef"];
          var format = data[offset];
          offset++;
          if (format == 0) {
            for (var i = 0; i < num; i++) {
              var first = bin.readUshort(data, offset);
              offset += 2;
              charset.push(first);
            }
          } else if (format == 1 || format == 2) {
            while (charset.length < num) {
              var first = bin.readUshort(data, offset);
              offset += 2;
              var nLeft = 0;
              if (format == 1) {
                nLeft = data[offset];
                offset++;
              } else {
                nLeft = bin.readUshort(data, offset);
                offset += 2;
              }
              for (var i = 0; i <= nLeft; i++) {
                charset.push(first);
                first++;
              }
            }
          } else
            throw "error: format: " + format;
          return charset;
        };
        Typr$1.CFF.readIndex = function(data, offset, inds) {
          var bin = Typr$1._bin;
          var count = bin.readUshort(data, offset) + 1;
          offset += 2;
          var offsize = data[offset];
          offset++;
          if (offsize == 1)
            for (var i = 0; i < count; i++)
              inds.push(data[offset + i]);
          else if (offsize == 2)
            for (var i = 0; i < count; i++)
              inds.push(bin.readUshort(data, offset + i * 2));
          else if (offsize == 3)
            for (var i = 0; i < count; i++)
              inds.push(bin.readUint(data, offset + i * 3 - 1) & 16777215);
          else if (count != 1)
            throw "unsupported offset size: " + offsize + ", count: " + count;
          offset += count * offsize;
          return offset - 1;
        };
        Typr$1.CFF.getCharString = function(data, offset, o) {
          var bin = Typr$1._bin;
          var b0 = data[offset], b1 = data[offset + 1];
          data[offset + 2];
          data[offset + 3];
          data[offset + 4];
          var vs = 1;
          var op = null, val = null;
          if (b0 <= 20) {
            op = b0;
            vs = 1;
          }
          if (b0 == 12) {
            op = b0 * 100 + b1;
            vs = 2;
          }
          if (21 <= b0 && b0 <= 27) {
            op = b0;
            vs = 1;
          }
          if (b0 == 28) {
            val = bin.readShort(data, offset + 1);
            vs = 3;
          }
          if (29 <= b0 && b0 <= 31) {
            op = b0;
            vs = 1;
          }
          if (32 <= b0 && b0 <= 246) {
            val = b0 - 139;
            vs = 1;
          }
          if (247 <= b0 && b0 <= 250) {
            val = (b0 - 247) * 256 + b1 + 108;
            vs = 2;
          }
          if (251 <= b0 && b0 <= 254) {
            val = -(b0 - 251) * 256 - b1 - 108;
            vs = 2;
          }
          if (b0 == 255) {
            val = bin.readInt(data, offset + 1) / 65535;
            vs = 5;
          }
          o.val = val != null ? val : "o" + op;
          o.size = vs;
        };
        Typr$1.CFF.readCharString = function(data, offset, length) {
          var end = offset + length;
          var bin = Typr$1._bin;
          var arr = [];
          while (offset < end) {
            var b0 = data[offset], b1 = data[offset + 1];
            data[offset + 2];
            data[offset + 3];
            data[offset + 4];
            var vs = 1;
            var op = null, val = null;
            if (b0 <= 20) {
              op = b0;
              vs = 1;
            }
            if (b0 == 12) {
              op = b0 * 100 + b1;
              vs = 2;
            }
            if (b0 == 19 || b0 == 20) {
              op = b0;
              vs = 2;
            }
            if (21 <= b0 && b0 <= 27) {
              op = b0;
              vs = 1;
            }
            if (b0 == 28) {
              val = bin.readShort(data, offset + 1);
              vs = 3;
            }
            if (29 <= b0 && b0 <= 31) {
              op = b0;
              vs = 1;
            }
            if (32 <= b0 && b0 <= 246) {
              val = b0 - 139;
              vs = 1;
            }
            if (247 <= b0 && b0 <= 250) {
              val = (b0 - 247) * 256 + b1 + 108;
              vs = 2;
            }
            if (251 <= b0 && b0 <= 254) {
              val = -(b0 - 251) * 256 - b1 - 108;
              vs = 2;
            }
            if (b0 == 255) {
              val = bin.readInt(data, offset + 1) / 65535;
              vs = 5;
            }
            arr.push(val != null ? val : "o" + op);
            offset += vs;
          }
          return arr;
        };
        Typr$1.CFF.readDict = function(data, offset, end) {
          var bin = Typr$1._bin;
          var dict = {};
          var carr = [];
          while (offset < end) {
            var b0 = data[offset], b1 = data[offset + 1];
            data[offset + 2];
            data[offset + 3];
            data[offset + 4];
            var vs = 1;
            var key = null, val = null;
            if (b0 == 28) {
              val = bin.readShort(data, offset + 1);
              vs = 3;
            }
            if (b0 == 29) {
              val = bin.readInt(data, offset + 1);
              vs = 5;
            }
            if (32 <= b0 && b0 <= 246) {
              val = b0 - 139;
              vs = 1;
            }
            if (247 <= b0 && b0 <= 250) {
              val = (b0 - 247) * 256 + b1 + 108;
              vs = 2;
            }
            if (251 <= b0 && b0 <= 254) {
              val = -(b0 - 251) * 256 - b1 - 108;
              vs = 2;
            }
            if (b0 == 255) {
              val = bin.readInt(data, offset + 1) / 65535;
              vs = 5;
              throw "unknown number";
            }
            if (b0 == 30) {
              var nibs = [];
              vs = 1;
              while (true) {
                var b = data[offset + vs];
                vs++;
                var nib0 = b >> 4, nib1 = b & 15;
                if (nib0 != 15)
                  nibs.push(nib0);
                if (nib1 != 15)
                  nibs.push(nib1);
                if (nib1 == 15)
                  break;
              }
              var s = "";
              var chars = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ".", "e", "e-", "reserved", "-", "endOfNumber"];
              for (var i = 0; i < nibs.length; i++)
                s += chars[nibs[i]];
              val = parseFloat(s);
            }
            if (b0 <= 21) {
              var keys = [
                "version",
                "Notice",
                "FullName",
                "FamilyName",
                "Weight",
                "FontBBox",
                "BlueValues",
                "OtherBlues",
                "FamilyBlues",
                "FamilyOtherBlues",
                "StdHW",
                "StdVW",
                "escape",
                "UniqueID",
                "XUID",
                "charset",
                "Encoding",
                "CharStrings",
                "Private",
                "Subrs",
                "defaultWidthX",
                "nominalWidthX"
              ];
              key = keys[b0];
              vs = 1;
              if (b0 == 12) {
                var keys = [
                  "Copyright",
                  "isFixedPitch",
                  "ItalicAngle",
                  "UnderlinePosition",
                  "UnderlineThickness",
                  "PaintType",
                  "CharstringType",
                  "FontMatrix",
                  "StrokeWidth",
                  "BlueScale",
                  "BlueShift",
                  "BlueFuzz",
                  "StemSnapH",
                  "StemSnapV",
                  "ForceBold",
                  0,
                  0,
                  "LanguageGroup",
                  "ExpansionFactor",
                  "initialRandomSeed",
                  "SyntheticBase",
                  "PostScript",
                  "BaseFontName",
                  "BaseFontBlend",
                  0,
                  0,
                  0,
                  0,
                  0,
                  0,
                  "ROS",
                  "CIDFontVersion",
                  "CIDFontRevision",
                  "CIDFontType",
                  "CIDCount",
                  "UIDBase",
                  "FDArray",
                  "FDSelect",
                  "FontName"
                ];
                key = keys[b1];
                vs = 2;
              }
            }
            if (key != null) {
              dict[key] = carr.length == 1 ? carr[0] : carr;
              carr = [];
            } else
              carr.push(val);
            offset += vs;
          }
          return dict;
        };
        Typr$1.cmap = {};
        Typr$1.cmap.parse = function(data, offset, length) {
          data = new Uint8Array(data.buffer, offset, length);
          offset = 0;
          var bin = Typr$1._bin;
          var obj = {};
          bin.readUshort(data, offset);
          offset += 2;
          var numTables = bin.readUshort(data, offset);
          offset += 2;
          var offs = [];
          obj.tables = [];
          for (var i = 0; i < numTables; i++) {
            var platformID = bin.readUshort(data, offset);
            offset += 2;
            var encodingID = bin.readUshort(data, offset);
            offset += 2;
            var noffset = bin.readUint(data, offset);
            offset += 4;
            var id = "p" + platformID + "e" + encodingID;
            var tind = offs.indexOf(noffset);
            if (tind == -1) {
              tind = obj.tables.length;
              var subt;
              offs.push(noffset);
              var format = bin.readUshort(data, noffset);
              if (format == 0)
                subt = Typr$1.cmap.parse0(data, noffset);
              else if (format == 4)
                subt = Typr$1.cmap.parse4(data, noffset);
              else if (format == 6)
                subt = Typr$1.cmap.parse6(data, noffset);
              else if (format == 12)
                subt = Typr$1.cmap.parse12(data, noffset);
              else
                console.warn("unknown format: " + format, platformID, encodingID, noffset);
              obj.tables.push(subt);
            }
            if (obj[id] != null)
              throw "multiple tables for one platform+encoding";
            obj[id] = tind;
          }
          return obj;
        };
        Typr$1.cmap.parse0 = function(data, offset) {
          var bin = Typr$1._bin;
          var obj = {};
          obj.format = bin.readUshort(data, offset);
          offset += 2;
          var len = bin.readUshort(data, offset);
          offset += 2;
          bin.readUshort(data, offset);
          offset += 2;
          obj.map = [];
          for (var i = 0; i < len - 6; i++)
            obj.map.push(data[offset + i]);
          return obj;
        };
        Typr$1.cmap.parse4 = function(data, offset) {
          var bin = Typr$1._bin;
          var offset0 = offset;
          var obj = {};
          obj.format = bin.readUshort(data, offset);
          offset += 2;
          var length = bin.readUshort(data, offset);
          offset += 2;
          bin.readUshort(data, offset);
          offset += 2;
          var segCountX2 = bin.readUshort(data, offset);
          offset += 2;
          var segCount = segCountX2 / 2;
          obj.searchRange = bin.readUshort(data, offset);
          offset += 2;
          obj.entrySelector = bin.readUshort(data, offset);
          offset += 2;
          obj.rangeShift = bin.readUshort(data, offset);
          offset += 2;
          obj.endCount = bin.readUshorts(data, offset, segCount);
          offset += segCount * 2;
          offset += 2;
          obj.startCount = bin.readUshorts(data, offset, segCount);
          offset += segCount * 2;
          obj.idDelta = [];
          for (var i = 0; i < segCount; i++) {
            obj.idDelta.push(bin.readShort(data, offset));
            offset += 2;
          }
          obj.idRangeOffset = bin.readUshorts(data, offset, segCount);
          offset += segCount * 2;
          obj.glyphIdArray = [];
          while (offset < offset0 + length) {
            obj.glyphIdArray.push(bin.readUshort(data, offset));
            offset += 2;
          }
          return obj;
        };
        Typr$1.cmap.parse6 = function(data, offset) {
          var bin = Typr$1._bin;
          var obj = {};
          obj.format = bin.readUshort(data, offset);
          offset += 2;
          bin.readUshort(data, offset);
          offset += 2;
          bin.readUshort(data, offset);
          offset += 2;
          obj.firstCode = bin.readUshort(data, offset);
          offset += 2;
          var entryCount = bin.readUshort(data, offset);
          offset += 2;
          obj.glyphIdArray = [];
          for (var i = 0; i < entryCount; i++) {
            obj.glyphIdArray.push(bin.readUshort(data, offset));
            offset += 2;
          }
          return obj;
        };
        Typr$1.cmap.parse12 = function(data, offset) {
          var bin = Typr$1._bin;
          var obj = {};
          obj.format = bin.readUshort(data, offset);
          offset += 2;
          offset += 2;
          bin.readUint(data, offset);
          offset += 4;
          bin.readUint(data, offset);
          offset += 4;
          var nGroups = bin.readUint(data, offset);
          offset += 4;
          obj.groups = [];
          for (var i = 0; i < nGroups; i++) {
            var off = offset + i * 12;
            var startCharCode = bin.readUint(data, off + 0);
            var endCharCode = bin.readUint(data, off + 4);
            var startGlyphID = bin.readUint(data, off + 8);
            obj.groups.push([startCharCode, endCharCode, startGlyphID]);
          }
          return obj;
        };
        Typr$1.glyf = {};
        Typr$1.glyf.parse = function(data, offset, length, font) {
          var obj = [];
          for (var g = 0; g < font.maxp.numGlyphs; g++)
            obj.push(null);
          return obj;
        };
        Typr$1.glyf._parseGlyf = function(font, g) {
          var bin = Typr$1._bin;
          var data = font._data;
          var offset = Typr$1._tabOffset(data, "glyf", font._offset) + font.loca[g];
          if (font.loca[g] == font.loca[g + 1])
            return null;
          var gl = {};
          gl.noc = bin.readShort(data, offset);
          offset += 2;
          gl.xMin = bin.readShort(data, offset);
          offset += 2;
          gl.yMin = bin.readShort(data, offset);
          offset += 2;
          gl.xMax = bin.readShort(data, offset);
          offset += 2;
          gl.yMax = bin.readShort(data, offset);
          offset += 2;
          if (gl.xMin >= gl.xMax || gl.yMin >= gl.yMax)
            return null;
          if (gl.noc > 0) {
            gl.endPts = [];
            for (var i = 0; i < gl.noc; i++) {
              gl.endPts.push(bin.readUshort(data, offset));
              offset += 2;
            }
            var instructionLength = bin.readUshort(data, offset);
            offset += 2;
            if (data.length - offset < instructionLength)
              return null;
            gl.instructions = bin.readBytes(data, offset, instructionLength);
            offset += instructionLength;
            var crdnum = gl.endPts[gl.noc - 1] + 1;
            gl.flags = [];
            for (var i = 0; i < crdnum; i++) {
              var flag = data[offset];
              offset++;
              gl.flags.push(flag);
              if ((flag & 8) != 0) {
                var rep = data[offset];
                offset++;
                for (var j = 0; j < rep; j++) {
                  gl.flags.push(flag);
                  i++;
                }
              }
            }
            gl.xs = [];
            for (var i = 0; i < crdnum; i++) {
              var i8 = (gl.flags[i] & 2) != 0, same = (gl.flags[i] & 16) != 0;
              if (i8) {
                gl.xs.push(same ? data[offset] : -data[offset]);
                offset++;
              } else {
                if (same)
                  gl.xs.push(0);
                else {
                  gl.xs.push(bin.readShort(data, offset));
                  offset += 2;
                }
              }
            }
            gl.ys = [];
            for (var i = 0; i < crdnum; i++) {
              var i8 = (gl.flags[i] & 4) != 0, same = (gl.flags[i] & 32) != 0;
              if (i8) {
                gl.ys.push(same ? data[offset] : -data[offset]);
                offset++;
              } else {
                if (same)
                  gl.ys.push(0);
                else {
                  gl.ys.push(bin.readShort(data, offset));
                  offset += 2;
                }
              }
            }
            var x = 0, y = 0;
            for (var i = 0; i < crdnum; i++) {
              x += gl.xs[i];
              y += gl.ys[i];
              gl.xs[i] = x;
              gl.ys[i] = y;
            }
          } else {
            var ARG_1_AND_2_ARE_WORDS = 1 << 0;
            var ARGS_ARE_XY_VALUES = 1 << 1;
            var WE_HAVE_A_SCALE = 1 << 3;
            var MORE_COMPONENTS = 1 << 5;
            var WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6;
            var WE_HAVE_A_TWO_BY_TWO = 1 << 7;
            var WE_HAVE_INSTRUCTIONS = 1 << 8;
            gl.parts = [];
            var flags;
            do {
              flags = bin.readUshort(data, offset);
              offset += 2;
              var part = { m: { a: 1, b: 0, c: 0, d: 1, tx: 0, ty: 0 }, p1: -1, p2: -1 };
              gl.parts.push(part);
              part.glyphIndex = bin.readUshort(data, offset);
              offset += 2;
              if (flags & ARG_1_AND_2_ARE_WORDS) {
                var arg1 = bin.readShort(data, offset);
                offset += 2;
                var arg2 = bin.readShort(data, offset);
                offset += 2;
              } else {
                var arg1 = bin.readInt8(data, offset);
                offset++;
                var arg2 = bin.readInt8(data, offset);
                offset++;
              }
              if (flags & ARGS_ARE_XY_VALUES) {
                part.m.tx = arg1;
                part.m.ty = arg2;
              } else {
                part.p1 = arg1;
                part.p2 = arg2;
              }
              if (flags & WE_HAVE_A_SCALE) {
                part.m.a = part.m.d = bin.readF2dot14(data, offset);
                offset += 2;
              } else if (flags & WE_HAVE_AN_X_AND_Y_SCALE) {
                part.m.a = bin.readF2dot14(data, offset);
                offset += 2;
                part.m.d = bin.readF2dot14(data, offset);
                offset += 2;
              } else if (flags & WE_HAVE_A_TWO_BY_TWO) {
                part.m.a = bin.readF2dot14(data, offset);
                offset += 2;
                part.m.b = bin.readF2dot14(data, offset);
                offset += 2;
                part.m.c = bin.readF2dot14(data, offset);
                offset += 2;
                part.m.d = bin.readF2dot14(data, offset);
                offset += 2;
              }
            } while (flags & MORE_COMPONENTS);
            if (flags & WE_HAVE_INSTRUCTIONS) {
              var numInstr = bin.readUshort(data, offset);
              offset += 2;
              gl.instr = [];
              for (var i = 0; i < numInstr; i++) {
                gl.instr.push(data[offset]);
                offset++;
              }
            }
          }
          return gl;
        };
        Typr$1.GPOS = {};
        Typr$1.GPOS.parse = function(data, offset, length, font) {
          return Typr$1._lctf.parse(data, offset, length, font, Typr$1.GPOS.subt);
        };
        Typr$1.GPOS.subt = function(data, ltype, offset, ltable) {
          var bin = Typr$1._bin, offset0 = offset, tab = {};
          tab.fmt = bin.readUshort(data, offset);
          offset += 2;
          if (ltype == 1 || ltype == 2 || ltype == 3 || ltype == 7 || ltype == 8 && tab.fmt <= 2) {
            var covOff = bin.readUshort(data, offset);
            offset += 2;
            tab.coverage = Typr$1._lctf.readCoverage(data, covOff + offset0);
          }
          if (ltype == 1 && tab.fmt == 1) {
            var valFmt1 = bin.readUshort(data, offset);
            offset += 2;
            var ones1 = Typr$1._lctf.numOfOnes(valFmt1);
            if (valFmt1 != 0)
              tab.pos = Typr$1.GPOS.readValueRecord(data, offset, valFmt1);
          } else if (ltype == 2 && tab.fmt >= 1 && tab.fmt <= 2) {
            var valFmt1 = bin.readUshort(data, offset);
            offset += 2;
            var valFmt2 = bin.readUshort(data, offset);
            offset += 2;
            var ones1 = Typr$1._lctf.numOfOnes(valFmt1);
            var ones2 = Typr$1._lctf.numOfOnes(valFmt2);
            if (tab.fmt == 1) {
              tab.pairsets = [];
              var psc = bin.readUshort(data, offset);
              offset += 2;
              for (var i = 0; i < psc; i++) {
                var psoff = offset0 + bin.readUshort(data, offset);
                offset += 2;
                var pvc = bin.readUshort(data, psoff);
                psoff += 2;
                var arr = [];
                for (var j = 0; j < pvc; j++) {
                  var gid2 = bin.readUshort(data, psoff);
                  psoff += 2;
                  var value1, value2;
                  if (valFmt1 != 0) {
                    value1 = Typr$1.GPOS.readValueRecord(data, psoff, valFmt1);
                    psoff += ones1 * 2;
                  }
                  if (valFmt2 != 0) {
                    value2 = Typr$1.GPOS.readValueRecord(data, psoff, valFmt2);
                    psoff += ones2 * 2;
                  }
                  arr.push({ gid2, val1: value1, val2: value2 });
                }
                tab.pairsets.push(arr);
              }
            }
            if (tab.fmt == 2) {
              var classDef1 = bin.readUshort(data, offset);
              offset += 2;
              var classDef2 = bin.readUshort(data, offset);
              offset += 2;
              var class1Count = bin.readUshort(data, offset);
              offset += 2;
              var class2Count = bin.readUshort(data, offset);
              offset += 2;
              tab.classDef1 = Typr$1._lctf.readClassDef(data, offset0 + classDef1);
              tab.classDef2 = Typr$1._lctf.readClassDef(data, offset0 + classDef2);
              tab.matrix = [];
              for (var i = 0; i < class1Count; i++) {
                var row = [];
                for (var j = 0; j < class2Count; j++) {
                  var value1 = null, value2 = null;
                  if (valFmt1 != 0) {
                    value1 = Typr$1.GPOS.readValueRecord(data, offset, valFmt1);
                    offset += ones1 * 2;
                  }
                  if (valFmt2 != 0) {
                    value2 = Typr$1.GPOS.readValueRecord(data, offset, valFmt2);
                    offset += ones2 * 2;
                  }
                  row.push({ val1: value1, val2: value2 });
                }
                tab.matrix.push(row);
              }
            }
          } else if (ltype == 9 && tab.fmt == 1) {
            var extType = bin.readUshort(data, offset);
            offset += 2;
            var extOffset = bin.readUint(data, offset);
            offset += 4;
            if (ltable.ltype == 9) {
              ltable.ltype = extType;
            } else if (ltable.ltype != extType) {
              throw "invalid extension substitution";
            }
            return Typr$1.GPOS.subt(data, ltable.ltype, offset0 + extOffset);
          } else
            console.warn("unsupported GPOS table LookupType", ltype, "format", tab.fmt);
          return tab;
        };
        Typr$1.GPOS.readValueRecord = function(data, offset, valFmt) {
          var bin = Typr$1._bin;
          var arr = [];
          arr.push(valFmt & 1 ? bin.readShort(data, offset) : 0);
          offset += valFmt & 1 ? 2 : 0;
          arr.push(valFmt & 2 ? bin.readShort(data, offset) : 0);
          offset += valFmt & 2 ? 2 : 0;
          arr.push(valFmt & 4 ? bin.readShort(data, offset) : 0);
          offset += valFmt & 4 ? 2 : 0;
          arr.push(valFmt & 8 ? bin.readShort(data, offset) : 0);
          offset += valFmt & 8 ? 2 : 0;
          return arr;
        };
        Typr$1.GSUB = {};
        Typr$1.GSUB.parse = function(data, offset, length, font) {
          return Typr$1._lctf.parse(data, offset, length, font, Typr$1.GSUB.subt);
        };
        Typr$1.GSUB.subt = function(data, ltype, offset, ltable) {
          var bin = Typr$1._bin, offset0 = offset, tab = {};
          tab.fmt = bin.readUshort(data, offset);
          offset += 2;
          if (ltype != 1 && ltype != 4 && ltype != 5 && ltype != 6)
            return null;
          if (ltype == 1 || ltype == 4 || ltype == 5 && tab.fmt <= 2 || ltype == 6 && tab.fmt <= 2) {
            var covOff = bin.readUshort(data, offset);
            offset += 2;
            tab.coverage = Typr$1._lctf.readCoverage(data, offset0 + covOff);
          }
          if (ltype == 1 && tab.fmt >= 1 && tab.fmt <= 2) {
            if (tab.fmt == 1) {
              tab.delta = bin.readShort(data, offset);
              offset += 2;
            } else if (tab.fmt == 2) {
              var cnt = bin.readUshort(data, offset);
              offset += 2;
              tab.newg = bin.readUshorts(data, offset, cnt);
              offset += tab.newg.length * 2;
            }
          } else if (ltype == 4) {
            tab.vals = [];
            var cnt = bin.readUshort(data, offset);
            offset += 2;
            for (var i = 0; i < cnt; i++) {
              var loff = bin.readUshort(data, offset);
              offset += 2;
              tab.vals.push(Typr$1.GSUB.readLigatureSet(data, offset0 + loff));
            }
          } else if (ltype == 5 && tab.fmt == 2) {
            if (tab.fmt == 2) {
              var cDefOffset = bin.readUshort(data, offset);
              offset += 2;
              tab.cDef = Typr$1._lctf.readClassDef(data, offset0 + cDefOffset);
              tab.scset = [];
              var subClassSetCount = bin.readUshort(data, offset);
              offset += 2;
              for (var i = 0; i < subClassSetCount; i++) {
                var scsOff = bin.readUshort(data, offset);
                offset += 2;
                tab.scset.push(scsOff == 0 ? null : Typr$1.GSUB.readSubClassSet(data, offset0 + scsOff));
              }
            }
          } else if (ltype == 6 && tab.fmt == 3) {
            if (tab.fmt == 3) {
              for (var i = 0; i < 3; i++) {
                var cnt = bin.readUshort(data, offset);
                offset += 2;
                var cvgs = [];
                for (var j = 0; j < cnt; j++)
                  cvgs.push(Typr$1._lctf.readCoverage(data, offset0 + bin.readUshort(data, offset + j * 2)));
                offset += cnt * 2;
                if (i == 0)
                  tab.backCvg = cvgs;
                if (i == 1)
                  tab.inptCvg = cvgs;
                if (i == 2)
                  tab.ahedCvg = cvgs;
              }
              var cnt = bin.readUshort(data, offset);
              offset += 2;
              tab.lookupRec = Typr$1.GSUB.readSubstLookupRecords(data, offset, cnt);
            }
          } else if (ltype == 7 && tab.fmt == 1) {
            var extType = bin.readUshort(data, offset);
            offset += 2;
            var extOffset = bin.readUint(data, offset);
            offset += 4;
            if (ltable.ltype == 9) {
              ltable.ltype = extType;
            } else if (ltable.ltype != extType) {
              throw "invalid extension substitution";
            }
            return Typr$1.GSUB.subt(data, ltable.ltype, offset0 + extOffset);
          } else
            console.warn("unsupported GSUB table LookupType", ltype, "format", tab.fmt);
          return tab;
        };
        Typr$1.GSUB.readSubClassSet = function(data, offset) {
          var rUs = Typr$1._bin.readUshort, offset0 = offset, lset = [];
          var cnt = rUs(data, offset);
          offset += 2;
          for (var i = 0; i < cnt; i++) {
            var loff = rUs(data, offset);
            offset += 2;
            lset.push(Typr$1.GSUB.readSubClassRule(data, offset0 + loff));
          }
          return lset;
        };
        Typr$1.GSUB.readSubClassRule = function(data, offset) {
          var rUs = Typr$1._bin.readUshort, rule = {};
          var gcount = rUs(data, offset);
          offset += 2;
          var scount = rUs(data, offset);
          offset += 2;
          rule.input = [];
          for (var i = 0; i < gcount - 1; i++) {
            rule.input.push(rUs(data, offset));
            offset += 2;
          }
          rule.substLookupRecords = Typr$1.GSUB.readSubstLookupRecords(data, offset, scount);
          return rule;
        };
        Typr$1.GSUB.readSubstLookupRecords = function(data, offset, cnt) {
          var rUs = Typr$1._bin.readUshort;
          var out = [];
          for (var i = 0; i < cnt; i++) {
            out.push(rUs(data, offset), rUs(data, offset + 2));
            offset += 4;
          }
          return out;
        };
        Typr$1.GSUB.readChainSubClassSet = function(data, offset) {
          var bin = Typr$1._bin, offset0 = offset, lset = [];
          var cnt = bin.readUshort(data, offset);
          offset += 2;
          for (var i = 0; i < cnt; i++) {
            var loff = bin.readUshort(data, offset);
            offset += 2;
            lset.push(Typr$1.GSUB.readChainSubClassRule(data, offset0 + loff));
          }
          return lset;
        };
        Typr$1.GSUB.readChainSubClassRule = function(data, offset) {
          var bin = Typr$1._bin, rule = {};
          var pps = ["backtrack", "input", "lookahead"];
          for (var pi = 0; pi < pps.length; pi++) {
            var cnt = bin.readUshort(data, offset);
            offset += 2;
            if (pi == 1)
              cnt--;
            rule[pps[pi]] = bin.readUshorts(data, offset, cnt);
            offset += rule[pps[pi]].length * 2;
          }
          var cnt = bin.readUshort(data, offset);
          offset += 2;
          rule.subst = bin.readUshorts(data, offset, cnt * 2);
          offset += rule.subst.length * 2;
          return rule;
        };
        Typr$1.GSUB.readLigatureSet = function(data, offset) {
          var bin = Typr$1._bin, offset0 = offset, lset = [];
          var lcnt = bin.readUshort(data, offset);
          offset += 2;
          for (var j = 0; j < lcnt; j++) {
            var loff = bin.readUshort(data, offset);
            offset += 2;
            lset.push(Typr$1.GSUB.readLigature(data, offset0 + loff));
          }
          return lset;
        };
        Typr$1.GSUB.readLigature = function(data, offset) {
          var bin = Typr$1._bin, lig = { chain: [] };
          lig.nglyph = bin.readUshort(data, offset);
          offset += 2;
          var ccnt = bin.readUshort(data, offset);
          offset += 2;
          for (var k = 0; k < ccnt - 1; k++) {
            lig.chain.push(bin.readUshort(data, offset));
            offset += 2;
          }
          return lig;
        };
        Typr$1.head = {};
        Typr$1.head.parse = function(data, offset, length) {
          var bin = Typr$1._bin;
          var obj = {};
          bin.readFixed(data, offset);
          offset += 4;
          obj.fontRevision = bin.readFixed(data, offset);
          offset += 4;
          bin.readUint(data, offset);
          offset += 4;
          bin.readUint(data, offset);
          offset += 4;
          obj.flags = bin.readUshort(data, offset);
          offset += 2;
          obj.unitsPerEm = bin.readUshort(data, offset);
          offset += 2;
          obj.created = bin.readUint64(data, offset);
          offset += 8;
          obj.modified = bin.readUint64(data, offset);
          offset += 8;
          obj.xMin = bin.readShort(data, offset);
          offset += 2;
          obj.yMin = bin.readShort(data, offset);
          offset += 2;
          obj.xMax = bin.readShort(data, offset);
          offset += 2;
          obj.yMax = bin.readShort(data, offset);
          offset += 2;
          obj.macStyle = bin.readUshort(data, offset);
          offset += 2;
          obj.lowestRecPPEM = bin.readUshort(data, offset);
          offset += 2;
          obj.fontDirectionHint = bin.readShort(data, offset);
          offset += 2;
          obj.indexToLocFormat = bin.readShort(data, offset);
          offset += 2;
          obj.glyphDataFormat = bin.readShort(data, offset);
          offset += 2;
          return obj;
        };
        Typr$1.hhea = {};
        Typr$1.hhea.parse = function(data, offset, length) {
          var bin = Typr$1._bin;
          var obj = {};
          bin.readFixed(data, offset);
          offset += 4;
          obj.ascender = bin.readShort(data, offset);
          offset += 2;
          obj.descender = bin.readShort(data, offset);
          offset += 2;
          obj.lineGap = bin.readShort(data, offset);
          offset += 2;
          obj.advanceWidthMax = bin.readUshort(data, offset);
          offset += 2;
          obj.minLeftSideBearing = bin.readShort(data, offset);
          offset += 2;
          obj.minRightSideBearing = bin.readShort(data, offset);
          offset += 2;
          obj.xMaxExtent = bin.readShort(data, offset);
          offset += 2;
          obj.caretSlopeRise = bin.readShort(data, offset);
          offset += 2;
          obj.caretSlopeRun = bin.readShort(data, offset);
          offset += 2;
          obj.caretOffset = bin.readShort(data, offset);
          offset += 2;
          offset += 4 * 2;
          obj.metricDataFormat = bin.readShort(data, offset);
          offset += 2;
          obj.numberOfHMetrics = bin.readUshort(data, offset);
          offset += 2;
          return obj;
        };
        Typr$1.hmtx = {};
        Typr$1.hmtx.parse = function(data, offset, length, font) {
          var bin = Typr$1._bin;
          var obj = {};
          obj.aWidth = [];
          obj.lsBearing = [];
          var aw = 0, lsb = 0;
          for (var i = 0; i < font.maxp.numGlyphs; i++) {
            if (i < font.hhea.numberOfHMetrics) {
              aw = bin.readUshort(data, offset);
              offset += 2;
              lsb = bin.readShort(data, offset);
              offset += 2;
            }
            obj.aWidth.push(aw);
            obj.lsBearing.push(lsb);
          }
          return obj;
        };
        Typr$1.kern = {};
        Typr$1.kern.parse = function(data, offset, length, font) {
          var bin = Typr$1._bin;
          var version = bin.readUshort(data, offset);
          offset += 2;
          if (version == 1)
            return Typr$1.kern.parseV1(data, offset - 2, length, font);
          var nTables = bin.readUshort(data, offset);
          offset += 2;
          var map = { glyph1: [], rval: [] };
          for (var i = 0; i < nTables; i++) {
            offset += 2;
            var length = bin.readUshort(data, offset);
            offset += 2;
            var coverage = bin.readUshort(data, offset);
            offset += 2;
            var format = coverage >>> 8;
            format &= 15;
            if (format == 0)
              offset = Typr$1.kern.readFormat0(data, offset, map);
            else
              throw "unknown kern table format: " + format;
          }
          return map;
        };
        Typr$1.kern.parseV1 = function(data, offset, length, font) {
          var bin = Typr$1._bin;
          bin.readFixed(data, offset);
          offset += 4;
          var nTables = bin.readUint(data, offset);
          offset += 4;
          var map = { glyph1: [], rval: [] };
          for (var i = 0; i < nTables; i++) {
            bin.readUint(data, offset);
            offset += 4;
            var coverage = bin.readUshort(data, offset);
            offset += 2;
            bin.readUshort(data, offset);
            offset += 2;
            var format = coverage >>> 8;
            format &= 15;
            if (format == 0)
              offset = Typr$1.kern.readFormat0(data, offset, map);
            else
              throw "unknown kern table format: " + format;
          }
          return map;
        };
        Typr$1.kern.readFormat0 = function(data, offset, map) {
          var bin = Typr$1._bin;
          var pleft = -1;
          var nPairs = bin.readUshort(data, offset);
          offset += 2;
          bin.readUshort(data, offset);
          offset += 2;
          bin.readUshort(data, offset);
          offset += 2;
          bin.readUshort(data, offset);
          offset += 2;
          for (var j = 0; j < nPairs; j++) {
            var left = bin.readUshort(data, offset);
            offset += 2;
            var right = bin.readUshort(data, offset);
            offset += 2;
            var value = bin.readShort(data, offset);
            offset += 2;
            if (left != pleft) {
              map.glyph1.push(left);
              map.rval.push({ glyph2: [], vals: [] });
            }
            var rval = map.rval[map.rval.length - 1];
            rval.glyph2.push(right);
            rval.vals.push(value);
            pleft = left;
          }
          return offset;
        };
        Typr$1.loca = {};
        Typr$1.loca.parse = function(data, offset, length, font) {
          var bin = Typr$1._bin;
          var obj = [];
          var ver = font.head.indexToLocFormat;
          var len = font.maxp.numGlyphs + 1;
          if (ver == 0)
            for (var i = 0; i < len; i++)
              obj.push(bin.readUshort(data, offset + (i << 1)) << 1);
          if (ver == 1)
            for (var i = 0; i < len; i++)
              obj.push(bin.readUint(data, offset + (i << 2)));
          return obj;
        };
        Typr$1.maxp = {};
        Typr$1.maxp.parse = function(data, offset, length) {
          var bin = Typr$1._bin;
          var obj = {};
          var ver = bin.readUint(data, offset);
          offset += 4;
          obj.numGlyphs = bin.readUshort(data, offset);
          offset += 2;
          if (ver == 65536) {
            obj.maxPoints = bin.readUshort(data, offset);
            offset += 2;
            obj.maxContours = bin.readUshort(data, offset);
            offset += 2;
            obj.maxCompositePoints = bin.readUshort(data, offset);
            offset += 2;
            obj.maxCompositeContours = bin.readUshort(data, offset);
            offset += 2;
            obj.maxZones = bin.readUshort(data, offset);
            offset += 2;
            obj.maxTwilightPoints = bin.readUshort(data, offset);
            offset += 2;
            obj.maxStorage = bin.readUshort(data, offset);
            offset += 2;
            obj.maxFunctionDefs = bin.readUshort(data, offset);
            offset += 2;
            obj.maxInstructionDefs = bin.readUshort(data, offset);
            offset += 2;
            obj.maxStackElements = bin.readUshort(data, offset);
            offset += 2;
            obj.maxSizeOfInstructions = bin.readUshort(data, offset);
            offset += 2;
            obj.maxComponentElements = bin.readUshort(data, offset);
            offset += 2;
            obj.maxComponentDepth = bin.readUshort(data, offset);
            offset += 2;
          }
          return obj;
        };
        Typr$1.name = {};
        Typr$1.name.parse = function(data, offset, length) {
          var bin = Typr$1._bin;
          var obj = {};
          bin.readUshort(data, offset);
          offset += 2;
          var count = bin.readUshort(data, offset);
          offset += 2;
          bin.readUshort(data, offset);
          offset += 2;
          var names = [
            "copyright",
            "fontFamily",
            "fontSubfamily",
            "ID",
            "fullName",
            "version",
            "postScriptName",
            "trademark",
            "manufacturer",
            "designer",
            "description",
            "urlVendor",
            "urlDesigner",
            "licence",
            "licenceURL",
            "---",
            "typoFamilyName",
            "typoSubfamilyName",
            "compatibleFull",
            "sampleText",
            "postScriptCID",
            "wwsFamilyName",
            "wwsSubfamilyName",
            "lightPalette",
            "darkPalette"
          ];
          var offset0 = offset;
          for (var i = 0; i < count; i++) {
            var platformID = bin.readUshort(data, offset);
            offset += 2;
            var encodingID = bin.readUshort(data, offset);
            offset += 2;
            var languageID = bin.readUshort(data, offset);
            offset += 2;
            var nameID = bin.readUshort(data, offset);
            offset += 2;
            var slen = bin.readUshort(data, offset);
            offset += 2;
            var noffset = bin.readUshort(data, offset);
            offset += 2;
            var cname = names[nameID];
            var soff = offset0 + count * 12 + noffset;
            var str;
            if (platformID == 0)
              str = bin.readUnicode(data, soff, slen / 2);
            else if (platformID == 3 && encodingID == 0)
              str = bin.readUnicode(data, soff, slen / 2);
            else if (encodingID == 0)
              str = bin.readASCII(data, soff, slen);
            else if (encodingID == 1)
              str = bin.readUnicode(data, soff, slen / 2);
            else if (encodingID == 3)
              str = bin.readUnicode(data, soff, slen / 2);
            else if (platformID == 1) {
              str = bin.readASCII(data, soff, slen);
              console.warn("reading unknown MAC encoding " + encodingID + " as ASCII");
            } else
              throw "unknown encoding " + encodingID + ", platformID: " + platformID;
            var tid = "p" + platformID + "," + languageID.toString(16);
            if (obj[tid] == null)
              obj[tid] = {};
            obj[tid][cname !== void 0 ? cname : nameID] = str;
            obj[tid]._lang = languageID;
          }
          for (var p in obj)
            if (obj[p].postScriptName != null && obj[p]._lang == 1033)
              return obj[p];
          for (var p in obj)
            if (obj[p].postScriptName != null && obj[p]._lang == 0)
              return obj[p];
          for (var p in obj)
            if (obj[p].postScriptName != null && obj[p]._lang == 3084)
              return obj[p];
          for (var p in obj)
            if (obj[p].postScriptName != null)
              return obj[p];
          var tname;
          for (var p in obj) {
            tname = p;
            break;
          }
          console.warn("returning name table with languageID " + obj[tname]._lang);
          return obj[tname];
        };
        Typr$1["OS/2"] = {};
        Typr$1["OS/2"].parse = function(data, offset, length) {
          var bin = Typr$1._bin;
          var ver = bin.readUshort(data, offset);
          offset += 2;
          var obj = {};
          if (ver == 0)
            Typr$1["OS/2"].version0(data, offset, obj);
          else if (ver == 1)
            Typr$1["OS/2"].version1(data, offset, obj);
          else if (ver == 2 || ver == 3 || ver == 4)
            Typr$1["OS/2"].version2(data, offset, obj);
          else if (ver == 5)
            Typr$1["OS/2"].version5(data, offset, obj);
          else
            throw "unknown OS/2 table version: " + ver;
          return obj;
        };
        Typr$1["OS/2"].version0 = function(data, offset, obj) {
          var bin = Typr$1._bin;
          obj.xAvgCharWidth = bin.readShort(data, offset);
          offset += 2;
          obj.usWeightClass = bin.readUshort(data, offset);
          offset += 2;
          obj.usWidthClass = bin.readUshort(data, offset);
          offset += 2;
          obj.fsType = bin.readUshort(data, offset);
          offset += 2;
          obj.ySubscriptXSize = bin.readShort(data, offset);
          offset += 2;
          obj.ySubscriptYSize = bin.readShort(data, offset);
          offset += 2;
          obj.ySubscriptXOffset = bin.readShort(data, offset);
          offset += 2;
          obj.ySubscriptYOffset = bin.readShort(data, offset);
          offset += 2;
          obj.ySuperscriptXSize = bin.readShort(data, offset);
          offset += 2;
          obj.ySuperscriptYSize = bin.readShort(data, offset);
          offset += 2;
          obj.ySuperscriptXOffset = bin.readShort(data, offset);
          offset += 2;
          obj.ySuperscriptYOffset = bin.readShort(data, offset);
          offset += 2;
          obj.yStrikeoutSize = bin.readShort(data, offset);
          offset += 2;
          obj.yStrikeoutPosition = bin.readShort(data, offset);
          offset += 2;
          obj.sFamilyClass = bin.readShort(data, offset);
          offset += 2;
          obj.panose = bin.readBytes(data, offset, 10);
          offset += 10;
          obj.ulUnicodeRange1 = bin.readUint(data, offset);
          offset += 4;
          obj.ulUnicodeRange2 = bin.readUint(data, offset);
          offset += 4;
          obj.ulUnicodeRange3 = bin.readUint(data, offset);
          offset += 4;
          obj.ulUnicodeRange4 = bin.readUint(data, offset);
          offset += 4;
          obj.achVendID = [bin.readInt8(data, offset), bin.readInt8(data, offset + 1), bin.readInt8(data, offset + 2), bin.readInt8(data, offset + 3)];
          offset += 4;
          obj.fsSelection = bin.readUshort(data, offset);
          offset += 2;
          obj.usFirstCharIndex = bin.readUshort(data, offset);
          offset += 2;
          obj.usLastCharIndex = bin.readUshort(data, offset);
          offset += 2;
          obj.sTypoAscender = bin.readShort(data, offset);
          offset += 2;
          obj.sTypoDescender = bin.readShort(data, offset);
          offset += 2;
          obj.sTypoLineGap = bin.readShort(data, offset);
          offset += 2;
          obj.usWinAscent = bin.readUshort(data, offset);
          offset += 2;
          obj.usWinDescent = bin.readUshort(data, offset);
          offset += 2;
          return offset;
        };
        Typr$1["OS/2"].version1 = function(data, offset, obj) {
          var bin = Typr$1._bin;
          offset = Typr$1["OS/2"].version0(data, offset, obj);
          obj.ulCodePageRange1 = bin.readUint(data, offset);
          offset += 4;
          obj.ulCodePageRange2 = bin.readUint(data, offset);
          offset += 4;
          return offset;
        };
        Typr$1["OS/2"].version2 = function(data, offset, obj) {
          var bin = Typr$1._bin;
          offset = Typr$1["OS/2"].version1(data, offset, obj);
          obj.sxHeight = bin.readShort(data, offset);
          offset += 2;
          obj.sCapHeight = bin.readShort(data, offset);
          offset += 2;
          obj.usDefault = bin.readUshort(data, offset);
          offset += 2;
          obj.usBreak = bin.readUshort(data, offset);
          offset += 2;
          obj.usMaxContext = bin.readUshort(data, offset);
          offset += 2;
          return offset;
        };
        Typr$1["OS/2"].version5 = function(data, offset, obj) {
          var bin = Typr$1._bin;
          offset = Typr$1["OS/2"].version2(data, offset, obj);
          obj.usLowerOpticalPointSize = bin.readUshort(data, offset);
          offset += 2;
          obj.usUpperOpticalPointSize = bin.readUshort(data, offset);
          offset += 2;
          return offset;
        };
        Typr$1.post = {};
        Typr$1.post.parse = function(data, offset, length) {
          var bin = Typr$1._bin;
          var obj = {};
          obj.version = bin.readFixed(data, offset);
          offset += 4;
          obj.italicAngle = bin.readFixed(data, offset);
          offset += 4;
          obj.underlinePosition = bin.readShort(data, offset);
          offset += 2;
          obj.underlineThickness = bin.readShort(data, offset);
          offset += 2;
          return obj;
        };
        Typr$1.SVG = {};
        Typr$1.SVG.parse = function(data, offset, length) {
          var bin = Typr$1._bin;
          var obj = { entries: [] };
          var offset0 = offset;
          bin.readUshort(data, offset);
          offset += 2;
          var svgDocIndexOffset = bin.readUint(data, offset);
          offset += 4;
          bin.readUint(data, offset);
          offset += 4;
          offset = svgDocIndexOffset + offset0;
          var numEntries = bin.readUshort(data, offset);
          offset += 2;
          for (var i = 0; i < numEntries; i++) {
            var startGlyphID = bin.readUshort(data, offset);
            offset += 2;
            var endGlyphID = bin.readUshort(data, offset);
            offset += 2;
            var svgDocOffset = bin.readUint(data, offset);
            offset += 4;
            var svgDocLength = bin.readUint(data, offset);
            offset += 4;
            var sbuf = new Uint8Array(data.buffer, offset0 + svgDocOffset + svgDocIndexOffset, svgDocLength);
            var svg = bin.readUTF8(sbuf, 0, sbuf.length);
            for (var f = startGlyphID; f <= endGlyphID; f++) {
              obj.entries[f] = svg;
            }
          }
          return obj;
        };
        Typr$1.SVG.toPath = function(str) {
          var pth = { cmds: [], crds: [] };
          if (str == null)
            return pth;
          var prsr = new DOMParser();
          var doc = prsr["parseFromString"](str, "image/svg+xml");
          var svg = doc.firstChild;
          while (svg.tagName != "svg")
            svg = svg.nextSibling;
          var vb = svg.getAttribute("viewBox");
          if (vb)
            vb = vb.trim().split(" ").map(parseFloat);
          else
            vb = [0, 0, 1e3, 1e3];
          Typr$1.SVG._toPath(svg.children, pth);
          for (var i = 0; i < pth.crds.length; i += 2) {
            var x = pth.crds[i], y = pth.crds[i + 1];
            x -= vb[0];
            y -= vb[1];
            y = -y;
            pth.crds[i] = x;
            pth.crds[i + 1] = y;
          }
          return pth;
        };
        Typr$1.SVG._toPath = function(nds, pth, fill) {
          for (var ni = 0; ni < nds.length; ni++) {
            var nd = nds[ni], tn = nd.tagName;
            var cfl = nd.getAttribute("fill");
            if (cfl == null)
              cfl = fill;
            if (tn == "g")
              Typr$1.SVG._toPath(nd.children, pth, cfl);
            else if (tn == "path") {
              pth.cmds.push(cfl ? cfl : "#000000");
              var d = nd.getAttribute("d");
              var toks = Typr$1.SVG._tokens(d);
              Typr$1.SVG._toksToPath(toks, pth);
              pth.cmds.push("X");
            } else if (tn == "defs") ;
            else
              console.warn(tn, nd);
          }
        };
        Typr$1.SVG._tokens = function(d) {
          var ts = [], off = 0, rn = false, cn = "";
          while (off < d.length) {
            var cc = d.charCodeAt(off), ch = d.charAt(off);
            off++;
            var isNum = 48 <= cc && cc <= 57 || ch == "." || ch == "-";
            if (rn) {
              if (ch == "-") {
                ts.push(parseFloat(cn));
                cn = ch;
              } else if (isNum)
                cn += ch;
              else {
                ts.push(parseFloat(cn));
                if (ch != "," && ch != " ")
                  ts.push(ch);
                rn = false;
              }
            } else {
              if (isNum) {
                cn = ch;
                rn = true;
              } else if (ch != "," && ch != " ")
                ts.push(ch);
            }
          }
          if (rn)
            ts.push(parseFloat(cn));
          return ts;
        };
        Typr$1.SVG._toksToPath = function(ts, pth) {
          var i = 0, x = 0, y = 0, ox = 0, oy = 0;
          var pc = { "M": 2, "L": 2, "H": 1, "V": 1, "S": 4, "C": 6 };
          var cmds = pth.cmds, crds = pth.crds;
          while (i < ts.length) {
            var cmd = ts[i];
            i++;
            if (cmd == "z") {
              cmds.push("Z");
              x = ox;
              y = oy;
            } else {
              var cmu = cmd.toUpperCase();
              var ps = pc[cmu], reps = Typr$1.SVG._reps(ts, i, ps);
              for (var j = 0; j < reps; j++) {
                var xi = 0, yi = 0;
                if (cmd != cmu) {
                  xi = x;
                  yi = y;
                }
                if (cmu == "M") {
                  x = xi + ts[i++];
                  y = yi + ts[i++];
                  cmds.push("M");
                  crds.push(x, y);
                  ox = x;
                  oy = y;
                } else if (cmu == "L") {
                  x = xi + ts[i++];
                  y = yi + ts[i++];
                  cmds.push("L");
                  crds.push(x, y);
                } else if (cmu == "H") {
                  x = xi + ts[i++];
                  cmds.push("L");
                  crds.push(x, y);
                } else if (cmu == "V") {
                  y = yi + ts[i++];
                  cmds.push("L");
                  crds.push(x, y);
                } else if (cmu == "C") {
                  var x1 = xi + ts[i++], y1 = yi + ts[i++], x2 = xi + ts[i++], y2 = yi + ts[i++], x3 = xi + ts[i++], y3 = yi + ts[i++];
                  cmds.push("C");
                  crds.push(x1, y1, x2, y2, x3, y3);
                  x = x3;
                  y = y3;
                } else if (cmu == "S") {
                  var co = Math.max(crds.length - 4, 0);
                  var x1 = x + x - crds[co], y1 = y + y - crds[co + 1];
                  var x2 = xi + ts[i++], y2 = yi + ts[i++], x3 = xi + ts[i++], y3 = yi + ts[i++];
                  cmds.push("C");
                  crds.push(x1, y1, x2, y2, x3, y3);
                  x = x3;
                  y = y3;
                } else
                  console.warn("Unknown SVG command " + cmd);
              }
            }
          }
        };
        Typr$1.SVG._reps = function(ts, off, ps) {
          var i = off;
          while (i < ts.length) {
            if (typeof ts[i] == "string")
              break;
            i += ps;
          }
          return (i - off) / ps;
        };
        if (Typr$1 == null)
          Typr$1 = {};
        if (Typr$1.U == null)
          Typr$1.U = {};
        Typr$1.U.codeToGlyph = function(font, code) {
          var cmap = font.cmap;
          for (var _i = 0, _a = [cmap.p0e4, cmap.p3e1, cmap.p3e10, cmap.p0e3, cmap.p1e0]; _i < _a.length; _i++) {
            var tind = _a[_i];
            if (tind == null)
              continue;
            var tab = cmap.tables[tind];
            if (tab.format == 0) {
              if (code >= tab.map.length)
                continue;
              return tab.map[code];
            } else if (tab.format == 4) {
              var sind = -1;
              for (var i = 0; i < tab.endCount.length; i++) {
                if (code <= tab.endCount[i]) {
                  sind = i;
                  break;
                }
              }
              if (sind == -1)
                continue;
              if (tab.startCount[sind] > code)
                continue;
              var gli = 0;
              if (tab.idRangeOffset[sind] != 0) {
                gli = tab.glyphIdArray[code - tab.startCount[sind] + (tab.idRangeOffset[sind] >> 1) - (tab.idRangeOffset.length - sind)];
              } else {
                gli = code + tab.idDelta[sind];
              }
              return gli & 65535;
            } else if (tab.format == 12) {
              if (code > tab.groups[tab.groups.length - 1][1])
                continue;
              for (var i = 0; i < tab.groups.length; i++) {
                var grp = tab.groups[i];
                if (grp[0] <= code && code <= grp[1])
                  return grp[2] + (code - grp[0]);
              }
              continue;
            } else {
              throw "unknown cmap table format " + tab.format;
            }
          }
          return 0;
        };
        Typr$1.U.glyphToPath = function(font, gid) {
          var path = { cmds: [], crds: [] };
          if (font.SVG && font.SVG.entries[gid]) {
            var p = font.SVG.entries[gid];
            if (p == null)
              return path;
            if (typeof p == "string") {
              p = Typr$1.SVG.toPath(p);
              font.SVG.entries[gid] = p;
            }
            return p;
          } else if (font.CFF) {
            var state = { x: 0, y: 0, stack: [], nStems: 0, haveWidth: false, width: font.CFF.Private ? font.CFF.Private.defaultWidthX : 0, open: false };
            var cff = font.CFF, pdct = font.CFF.Private;
            if (cff.ROS) {
              var gi = 0;
              while (cff.FDSelect[gi + 2] <= gid)
                gi += 2;
              pdct = cff.FDArray[cff.FDSelect[gi + 1]].Private;
            }
            Typr$1.U._drawCFF(font.CFF.CharStrings[gid], state, cff, pdct, path);
          } else if (font.glyf) {
            Typr$1.U._drawGlyf(gid, font, path);
          }
          return path;
        };
        Typr$1.U._drawGlyf = function(gid, font, path) {
          var gl = font.glyf[gid];
          if (gl == null)
            gl = font.glyf[gid] = Typr$1.glyf._parseGlyf(font, gid);
          if (gl != null) {
            if (gl.noc > -1) {
              Typr$1.U._simpleGlyph(gl, path);
            } else {
              Typr$1.U._compoGlyph(gl, font, path);
            }
          }
        };
        Typr$1.U._simpleGlyph = function(gl, p) {
          for (var c = 0; c < gl.noc; c++) {
            var i0 = c == 0 ? 0 : gl.endPts[c - 1] + 1;
            var il = gl.endPts[c];
            for (var i = i0; i <= il; i++) {
              var pr = i == i0 ? il : i - 1;
              var nx = i == il ? i0 : i + 1;
              var onCurve = gl.flags[i] & 1;
              var prOnCurve = gl.flags[pr] & 1;
              var nxOnCurve = gl.flags[nx] & 1;
              var x = gl.xs[i], y = gl.ys[i];
              if (i == i0) {
                if (onCurve) {
                  if (prOnCurve) {
                    Typr$1.U.P.moveTo(p, gl.xs[pr], gl.ys[pr]);
                  } else {
                    Typr$1.U.P.moveTo(p, x, y);
                    continue;
                  }
                } else {
                  if (prOnCurve) {
                    Typr$1.U.P.moveTo(p, gl.xs[pr], gl.ys[pr]);
                  } else {
                    Typr$1.U.P.moveTo(p, (gl.xs[pr] + x) / 2, (gl.ys[pr] + y) / 2);
                  }
                }
              }
              if (onCurve) {
                if (prOnCurve)
                  Typr$1.U.P.lineTo(p, x, y);
              } else {
                if (nxOnCurve) {
                  Typr$1.U.P.qcurveTo(p, x, y, gl.xs[nx], gl.ys[nx]);
                } else {
                  Typr$1.U.P.qcurveTo(p, x, y, (x + gl.xs[nx]) / 2, (y + gl.ys[nx]) / 2);
                }
              }
            }
            Typr$1.U.P.closePath(p);
          }
        };
        Typr$1.U._compoGlyph = function(gl, font, p) {
          for (var j = 0; j < gl.parts.length; j++) {
            var path = { cmds: [], crds: [] };
            var prt = gl.parts[j];
            Typr$1.U._drawGlyf(prt.glyphIndex, font, path);
            var m = prt.m;
            for (var i = 0; i < path.crds.length; i += 2) {
              var x = path.crds[i], y = path.crds[i + 1];
              p.crds.push(x * m.a + y * m.b + m.tx);
              p.crds.push(x * m.c + y * m.d + m.ty);
            }
            for (var i = 0; i < path.cmds.length; i++) {
              p.cmds.push(path.cmds[i]);
            }
          }
        };
        Typr$1.U._getGlyphClass = function(g, cd) {
          var intr = Typr$1._lctf.getInterval(cd, g);
          return intr == -1 ? 0 : cd[intr + 2];
        };
        Typr$1.U.getPairAdjustment = function(font, g1, g2) {
          var hasGPOSkern = false;
          if (font.GPOS) {
            var gpos = font["GPOS"];
            var llist = gpos.lookupList, flist = gpos.featureList;
            var tused = [];
            for (var i = 0; i < flist.length; i++) {
              var fl = flist[i];
              if (fl.tag != "kern")
                continue;
              hasGPOSkern = true;
              for (var ti = 0; ti < fl.tab.length; ti++) {
                if (tused[fl.tab[ti]])
                  continue;
                tused[fl.tab[ti]] = true;
                var tab = llist[fl.tab[ti]];
                for (var j = 0; j < tab.tabs.length; j++) {
                  if (tab.tabs[j] == null)
                    continue;
                  var ltab = tab.tabs[j], ind;
                  if (ltab.coverage) {
                    ind = Typr$1._lctf.coverageIndex(ltab.coverage, g1);
                    if (ind == -1)
                      continue;
                  }
                  if (tab.ltype == 1) ;
                  else if (tab.ltype == 2) {
                    var adj = null;
                    if (ltab.fmt == 1) {
                      var right = ltab.pairsets[ind];
                      for (var i = 0; i < right.length; i++) {
                        if (right[i].gid2 == g2)
                          adj = right[i];
                      }
                    } else if (ltab.fmt == 2) {
                      var c1 = Typr$1.U._getGlyphClass(g1, ltab.classDef1);
                      var c2 = Typr$1.U._getGlyphClass(g2, ltab.classDef2);
                      adj = ltab.matrix[c1][c2];
                    }
                    if (adj) {
                      var offset = 0;
                      if (adj.val1 && adj.val1[2])
                        offset += adj.val1[2];
                      if (adj.val2 && adj.val2[0])
                        offset += adj.val2[0];
                      return offset;
                    }
                  }
                }
              }
            }
          }
          if (font.kern && !hasGPOSkern) {
            var ind1 = font.kern.glyph1.indexOf(g1);
            if (ind1 != -1) {
              var ind2 = font.kern.rval[ind1].glyph2.indexOf(g2);
              if (ind2 != -1)
                return font.kern.rval[ind1].vals[ind2];
            }
          }
          return 0;
        };
        Typr$1.U.stringToGlyphs = function(font, str) {
          var gls = [];
          for (var i = 0; i < str.length; i++) {
            var cc = str.codePointAt(i);
            if (cc > 65535)
              i++;
            gls.push(Typr$1.U.codeToGlyph(font, cc));
          }
          for (var i = 0; i < str.length; i++) {
            var cc = str.codePointAt(i);
            if (cc == 2367) {
              var t = gls[i - 1];
              gls[i - 1] = gls[i];
              gls[i] = t;
            }
            if (cc > 65535)
              i++;
          }
          var gsub = font["GSUB"];
          if (gsub == null)
            return gls;
          var llist = gsub.lookupList, flist = gsub.featureList;
          var cligs = [
            "rlig",
            "liga",
            "mset",
            "isol",
            "init",
            "fina",
            "medi",
            "half",
            "pres",
            "blws"
            /* Tibetan fonts like Himalaya.ttf */
          ];
          var tused = [];
          for (var fi = 0; fi < flist.length; fi++) {
            var fl = flist[fi];
            if (cligs.indexOf(fl.tag) == -1)
              continue;
            for (var ti = 0; ti < fl.tab.length; ti++) {
              if (tused[fl.tab[ti]])
                continue;
              tused[fl.tab[ti]] = true;
              var tab = llist[fl.tab[ti]];
              for (var ci = 0; ci < gls.length; ci++) {
                var feat = Typr$1.U._getWPfeature(str, ci);
                if ("isol,init,fina,medi".indexOf(fl.tag) != -1 && fl.tag != feat)
                  continue;
                Typr$1.U._applySubs(gls, ci, tab, llist);
              }
            }
          }
          return gls;
        };
        Typr$1.U._getWPfeature = function(str, ci) {
          var wsep = '\n	" ,.:;!?()  ،';
          var R = "آأؤإاةدذرزوٱٲٳٵٶٷڈډڊڋڌڍڎڏڐڑڒړڔڕږڗژڙۀۃۄۅۆۇۈۉۊۋۍۏےۓەۮۯܐܕܖܗܘܙܞܨܪܬܯݍݙݚݛݫݬݱݳݴݸݹࡀࡆࡇࡉࡔࡧࡩࡪࢪࢫࢬࢮࢱࢲࢹૅેૉ૊૎૏ૐ૑૒૝ૡ૤૯஁ஃ஄அஉ஌எஏ஑னப஫஬";
          var L = "ꡲ્૗";
          var slft = ci == 0 || wsep.indexOf(str[ci - 1]) != -1;
          var srgt = ci == str.length - 1 || wsep.indexOf(str[ci + 1]) != -1;
          if (!slft && R.indexOf(str[ci - 1]) != -1)
            slft = true;
          if (!srgt && R.indexOf(str[ci]) != -1)
            srgt = true;
          if (!srgt && L.indexOf(str[ci + 1]) != -1)
            srgt = true;
          if (!slft && L.indexOf(str[ci]) != -1)
            slft = true;
          var feat = null;
          if (slft) {
            feat = srgt ? "isol" : "init";
          } else {
            feat = srgt ? "fina" : "medi";
          }
          return feat;
        };
        Typr$1.U._applySubs = function(gls, ci, tab, llist) {
          var rlim = gls.length - ci - 1;
          for (var j = 0; j < tab.tabs.length; j++) {
            if (tab.tabs[j] == null)
              continue;
            var ltab = tab.tabs[j], ind;
            if (ltab.coverage) {
              ind = Typr$1._lctf.coverageIndex(ltab.coverage, gls[ci]);
              if (ind == -1)
                continue;
            }
            if (tab.ltype == 1) {
              gls[ci];
              if (ltab.fmt == 1)
                gls[ci] = gls[ci] + ltab.delta;
              else
                gls[ci] = ltab.newg[ind];
            } else if (tab.ltype == 4) {
              var vals = ltab.vals[ind];
              for (var k = 0; k < vals.length; k++) {
                var lig = vals[k], rl = lig.chain.length;
                if (rl > rlim)
                  continue;
                var good = true, em1 = 0;
                for (var l = 0; l < rl; l++) {
                  while (gls[ci + em1 + (1 + l)] == -1)
                    em1++;
                  if (lig.chain[l] != gls[ci + em1 + (1 + l)])
                    good = false;
                }
                if (!good)
                  continue;
                gls[ci] = lig.nglyph;
                for (var l = 0; l < rl + em1; l++)
                  gls[ci + l + 1] = -1;
                break;
              }
            } else if (tab.ltype == 5 && ltab.fmt == 2) {
              var cind = Typr$1._lctf.getInterval(ltab.cDef, gls[ci]);
              var cls = ltab.cDef[cind + 2], scs = ltab.scset[cls];
              for (var i = 0; i < scs.length; i++) {
                var sc = scs[i], inp = sc.input;
                if (inp.length > rlim)
                  continue;
                var good = true;
                for (var l = 0; l < inp.length; l++) {
                  var cind2 = Typr$1._lctf.getInterval(ltab.cDef, gls[ci + 1 + l]);
                  if (cind == -1 && ltab.cDef[cind2 + 2] != inp[l]) {
                    good = false;
                    break;
                  }
                }
                if (!good)
                  continue;
                var lrs = sc.substLookupRecords;
                for (var k = 0; k < lrs.length; k += 2) {
                  lrs[k];
                  lrs[k + 1];
                }
              }
            } else if (tab.ltype == 6 && ltab.fmt == 3) {
              if (!Typr$1.U._glsCovered(gls, ltab.backCvg, ci - ltab.backCvg.length))
                continue;
              if (!Typr$1.U._glsCovered(gls, ltab.inptCvg, ci))
                continue;
              if (!Typr$1.U._glsCovered(gls, ltab.ahedCvg, ci + ltab.inptCvg.length))
                continue;
              var lr = ltab.lookupRec;
              for (var i = 0; i < lr.length; i += 2) {
                var cind = lr[i], tab2 = llist[lr[i + 1]];
                Typr$1.U._applySubs(gls, ci + cind, tab2, llist);
              }
            }
          }
        };
        Typr$1.U._glsCovered = function(gls, cvgs, ci) {
          for (var i = 0; i < cvgs.length; i++) {
            var ind = Typr$1._lctf.coverageIndex(cvgs[i], gls[ci + i]);
            if (ind == -1)
              return false;
          }
          return true;
        };
        Typr$1.U.glyphsToPath = function(font, gls, clr) {
          var tpath = { cmds: [], crds: [] };
          var x = 0;
          for (var i = 0; i < gls.length; i++) {
            var gid = gls[i];
            if (gid == -1)
              continue;
            var gid2 = i < gls.length - 1 && gls[i + 1] != -1 ? gls[i + 1] : 0;
            var path = Typr$1.U.glyphToPath(font, gid);
            for (var j = 0; j < path.crds.length; j += 2) {
              tpath.crds.push(path.crds[j] + x);
              tpath.crds.push(path.crds[j + 1]);
            }
            if (clr)
              tpath.cmds.push(clr);
            for (var j = 0; j < path.cmds.length; j++)
              tpath.cmds.push(path.cmds[j]);
            if (clr)
              tpath.cmds.push("X");
            x += font.hmtx.aWidth[gid];
            if (i < gls.length - 1)
              x += Typr$1.U.getPairAdjustment(font, gid, gid2);
          }
          return tpath;
        };
        Typr$1.U.pathToSVG = function(path, prec) {
          if (prec == null)
            prec = 5;
          var out = [], co = 0, lmap = { "M": 2, "L": 2, "Q": 4, "C": 6 };
          for (var i = 0; i < path.cmds.length; i++) {
            var cmd = path.cmds[i], cn = co + (lmap[cmd] ? lmap[cmd] : 0);
            out.push(cmd);
            while (co < cn) {
              var c = path.crds[co++];
              out.push(parseFloat(c.toFixed(prec)) + (co == cn ? "" : " "));
            }
          }
          return out.join("");
        };
        Typr$1.U.pathToContext = function(path, ctx) {
          var c = 0, crds = path.crds;
          for (var j = 0; j < path.cmds.length; j++) {
            var cmd = path.cmds[j];
            if (cmd == "M") {
              ctx.moveTo(crds[c], crds[c + 1]);
              c += 2;
            } else if (cmd == "L") {
              ctx.lineTo(crds[c], crds[c + 1]);
              c += 2;
            } else if (cmd == "C") {
              ctx.bezierCurveTo(crds[c], crds[c + 1], crds[c + 2], crds[c + 3], crds[c + 4], crds[c + 5]);
              c += 6;
            } else if (cmd == "Q") {
              ctx.quadraticCurveTo(crds[c], crds[c + 1], crds[c + 2], crds[c + 3]);
              c += 4;
            } else if (cmd.charAt(0) == "#") {
              ctx.beginPath();
              ctx.fillStyle = cmd;
            } else if (cmd == "Z") {
              ctx.closePath();
            } else if (cmd == "X") {
              ctx.fill();
            }
          }
        };
        Typr$1.U.P = {};
        Typr$1.U.P.moveTo = function(p, x, y) {
          p.cmds.push("M");
          p.crds.push(x, y);
        };
        Typr$1.U.P.lineTo = function(p, x, y) {
          p.cmds.push("L");
          p.crds.push(x, y);
        };
        Typr$1.U.P.curveTo = function(p, a, b, c, d, e, f) {
          p.cmds.push("C");
          p.crds.push(a, b, c, d, e, f);
        };
        Typr$1.U.P.qcurveTo = function(p, a, b, c, d) {
          p.cmds.push("Q");
          p.crds.push(a, b, c, d);
        };
        Typr$1.U.P.closePath = function(p) {
          p.cmds.push("Z");
        };
        Typr$1.U._drawCFF = function(cmds, state, font, pdct, p) {
          var stack = state.stack;
          var nStems = state.nStems, haveWidth = state.haveWidth, width = state.width, open = state.open;
          var i = 0;
          var x = state.x, y = state.y, c1x = 0, c1y = 0, c2x = 0, c2y = 0, c3x = 0, c3y = 0, c4x = 0, c4y = 0, jpx = 0, jpy = 0;
          var o = { val: 0, size: 0 };
          while (i < cmds.length) {
            Typr$1.CFF.getCharString(cmds, i, o);
            var v = o.val;
            i += o.size;
            if (v == "o1" || v == "o18") {
              var hasWidthArg;
              hasWidthArg = stack.length % 2 !== 0;
              if (hasWidthArg && !haveWidth) {
                width = stack.shift() + pdct.nominalWidthX;
              }
              nStems += stack.length >> 1;
              stack.length = 0;
              haveWidth = true;
            } else if (v == "o3" || v == "o23") {
              var hasWidthArg;
              hasWidthArg = stack.length % 2 !== 0;
              if (hasWidthArg && !haveWidth) {
                width = stack.shift() + pdct.nominalWidthX;
              }
              nStems += stack.length >> 1;
              stack.length = 0;
              haveWidth = true;
            } else if (v == "o4") {
              if (stack.length > 1 && !haveWidth) {
                width = stack.shift() + pdct.nominalWidthX;
                haveWidth = true;
              }
              if (open)
                Typr$1.U.P.closePath(p);
              y += stack.pop();
              Typr$1.U.P.moveTo(p, x, y);
              open = true;
            } else if (v == "o5") {
              while (stack.length > 0) {
                x += stack.shift();
                y += stack.shift();
                Typr$1.U.P.lineTo(p, x, y);
              }
            } else if (v == "o6" || v == "o7") {
              var count = stack.length;
              var isX = v == "o6";
              for (var j = 0; j < count; j++) {
                var sval = stack.shift();
                if (isX) {
                  x += sval;
                } else {
                  y += sval;
                }
                isX = !isX;
                Typr$1.U.P.lineTo(p, x, y);
              }
            } else if (v == "o8" || v == "o24") {
              var count = stack.length;
              var index = 0;
              while (index + 6 <= count) {
                c1x = x + stack.shift();
                c1y = y + stack.shift();
                c2x = c1x + stack.shift();
                c2y = c1y + stack.shift();
                x = c2x + stack.shift();
                y = c2y + stack.shift();
                Typr$1.U.P.curveTo(p, c1x, c1y, c2x, c2y, x, y);
                index += 6;
              }
              if (v == "o24") {
                x += stack.shift();
                y += stack.shift();
                Typr$1.U.P.lineTo(p, x, y);
              }
            } else if (v == "o11") {
              break;
            } else if (v == "o1234" || v == "o1235" || v == "o1236" || v == "o1237") {
              if (v == "o1234") {
                c1x = x + stack.shift();
                c1y = y;
                c2x = c1x + stack.shift();
                c2y = c1y + stack.shift();
                jpx = c2x + stack.shift();
                jpy = c2y;
                c3x = jpx + stack.shift();
                c3y = c2y;
                c4x = c3x + stack.shift();
                c4y = y;
                x = c4x + stack.shift();
                Typr$1.U.P.curveTo(p, c1x, c1y, c2x, c2y, jpx, jpy);
                Typr$1.U.P.curveTo(p, c3x, c3y, c4x, c4y, x, y);
              }
              if (v == "o1235") {
                c1x = x + stack.shift();
                c1y = y + stack.shift();
                c2x = c1x + stack.shift();
                c2y = c1y + stack.shift();
                jpx = c2x + stack.shift();
                jpy = c2y + stack.shift();
                c3x = jpx + stack.shift();
                c3y = jpy + stack.shift();
                c4x = c3x + stack.shift();
                c4y = c3y + stack.shift();
                x = c4x + stack.shift();
                y = c4y + stack.shift();
                stack.shift();
                Typr$1.U.P.curveTo(p, c1x, c1y, c2x, c2y, jpx, jpy);
                Typr$1.U.P.curveTo(p, c3x, c3y, c4x, c4y, x, y);
              }
              if (v == "o1236") {
                c1x = x + stack.shift();
                c1y = y + stack.shift();
                c2x = c1x + stack.shift();
                c2y = c1y + stack.shift();
                jpx = c2x + stack.shift();
                jpy = c2y;
                c3x = jpx + stack.shift();
                c3y = c2y;
                c4x = c3x + stack.shift();
                c4y = c3y + stack.shift();
                x = c4x + stack.shift();
                Typr$1.U.P.curveTo(p, c1x, c1y, c2x, c2y, jpx, jpy);
                Typr$1.U.P.curveTo(p, c3x, c3y, c4x, c4y, x, y);
              }
              if (v == "o1237") {
                c1x = x + stack.shift();
                c1y = y + stack.shift();
                c2x = c1x + stack.shift();
                c2y = c1y + stack.shift();
                jpx = c2x + stack.shift();
                jpy = c2y + stack.shift();
                c3x = jpx + stack.shift();
                c3y = jpy + stack.shift();
                c4x = c3x + stack.shift();
                c4y = c3y + stack.shift();
                if (Math.abs(c4x - x) > Math.abs(c4y - y)) {
                  x = c4x + stack.shift();
                } else {
                  y = c4y + stack.shift();
                }
                Typr$1.U.P.curveTo(p, c1x, c1y, c2x, c2y, jpx, jpy);
                Typr$1.U.P.curveTo(p, c3x, c3y, c4x, c4y, x, y);
              }
            } else if (v == "o14") {
              if (stack.length > 0 && !haveWidth) {
                width = stack.shift() + font.nominalWidthX;
                haveWidth = true;
              }
              if (stack.length == 4) {
                var adx = stack.shift();
                var ady = stack.shift();
                var bchar = stack.shift();
                var achar = stack.shift();
                var bind = Typr$1.CFF.glyphBySE(font, bchar);
                var aind = Typr$1.CFF.glyphBySE(font, achar);
                Typr$1.U._drawCFF(font.CharStrings[bind], state, font, pdct, p);
                state.x = adx;
                state.y = ady;
                Typr$1.U._drawCFF(font.CharStrings[aind], state, font, pdct, p);
              }
              if (open) {
                Typr$1.U.P.closePath(p);
                open = false;
              }
            } else if (v == "o19" || v == "o20") {
              var hasWidthArg;
              hasWidthArg = stack.length % 2 !== 0;
              if (hasWidthArg && !haveWidth) {
                width = stack.shift() + pdct.nominalWidthX;
              }
              nStems += stack.length >> 1;
              stack.length = 0;
              haveWidth = true;
              i += nStems + 7 >> 3;
            } else if (v == "o21") {
              if (stack.length > 2 && !haveWidth) {
                width = stack.shift() + pdct.nominalWidthX;
                haveWidth = true;
              }
              y += stack.pop();
              x += stack.pop();
              if (open)
                Typr$1.U.P.closePath(p);
              Typr$1.U.P.moveTo(p, x, y);
              open = true;
            } else if (v == "o22") {
              if (stack.length > 1 && !haveWidth) {
                width = stack.shift() + pdct.nominalWidthX;
                haveWidth = true;
              }
              x += stack.pop();
              if (open)
                Typr$1.U.P.closePath(p);
              Typr$1.U.P.moveTo(p, x, y);
              open = true;
            } else if (v == "o25") {
              while (stack.length > 6) {
                x += stack.shift();
                y += stack.shift();
                Typr$1.U.P.lineTo(p, x, y);
              }
              c1x = x + stack.shift();
              c1y = y + stack.shift();
              c2x = c1x + stack.shift();
              c2y = c1y + stack.shift();
              x = c2x + stack.shift();
              y = c2y + stack.shift();
              Typr$1.U.P.curveTo(p, c1x, c1y, c2x, c2y, x, y);
            } else if (v == "o26") {
              if (stack.length % 2) {
                x += stack.shift();
              }
              while (stack.length > 0) {
                c1x = x;
                c1y = y + stack.shift();
                c2x = c1x + stack.shift();
                c2y = c1y + stack.shift();
                x = c2x;
                y = c2y + stack.shift();
                Typr$1.U.P.curveTo(p, c1x, c1y, c2x, c2y, x, y);
              }
            } else if (v == "o27") {
              if (stack.length % 2) {
                y += stack.shift();
              }
              while (stack.length > 0) {
                c1x = x + stack.shift();
                c1y = y;
                c2x = c1x + stack.shift();
                c2y = c1y + stack.shift();
                x = c2x + stack.shift();
                y = c2y;
                Typr$1.U.P.curveTo(p, c1x, c1y, c2x, c2y, x, y);
              }
            } else if (v == "o10" || v == "o29") {
              var obj = v == "o10" ? pdct : font;
              if (stack.length == 0) {
                console.warn("error: empty stack");
              } else {
                var ind = stack.pop();
                var subr = obj.Subrs[ind + obj.Bias];
                state.x = x;
                state.y = y;
                state.nStems = nStems;
                state.haveWidth = haveWidth;
                state.width = width;
                state.open = open;
                Typr$1.U._drawCFF(subr, state, font, pdct, p);
                x = state.x;
                y = state.y;
                nStems = state.nStems;
                haveWidth = state.haveWidth;
                width = state.width;
                open = state.open;
              }
            } else if (v == "o30" || v == "o31") {
              var count, count1 = stack.length;
              var index = 0;
              var alternate = v == "o31";
              count = count1 & -3;
              index += count1 - count;
              while (index < count) {
                if (alternate) {
                  c1x = x + stack.shift();
                  c1y = y;
                  c2x = c1x + stack.shift();
                  c2y = c1y + stack.shift();
                  y = c2y + stack.shift();
                  if (count - index == 5) {
                    x = c2x + stack.shift();
                    index++;
                  } else {
                    x = c2x;
                  }
                  alternate = false;
                } else {
                  c1x = x;
                  c1y = y + stack.shift();
                  c2x = c1x + stack.shift();
                  c2y = c1y + stack.shift();
                  x = c2x + stack.shift();
                  if (count - index == 5) {
                    y = c2y + stack.shift();
                    index++;
                  } else {
                    y = c2y;
                  }
                  alternate = true;
                }
                Typr$1.U.P.curveTo(p, c1x, c1y, c2x, c2y, x, y);
                index += 4;
              }
            } else if ((v + "").charAt(0) == "o") {
              console.warn("Unknown operation: " + v, cmds);
              throw v;
            } else
              stack.push(v);
          }
          state.x = x;
          state.y = y;
          state.nStems = nStems;
          state.haveWidth = haveWidth;
          state.width = width;
          state.open = open;
        };
        Typr.Typr = Typr$1;
        return Typr;
      }
      var hasRequiredDist;
      function requireDist() {
        if (hasRequiredDist) return dist;
        hasRequiredDist = 1;
        dist.__esModule = true;
        var Typr_js_1 = requireTypr();
        var friendlyTags = { "aalt": "Access All Alternates", "abvf": "Above-base Forms", "abvm": "Above - base Mark Positioning", "abvs": "Above - base Substitutions", "afrc": "Alternative Fractions", "akhn": "Akhands", "blwf": "Below - base Forms", "blwm": "Below - base Mark Positioning", "blws": "Below - base Substitutions", "calt": "Contextual Alternates", "case": "Case - Sensitive Forms", "ccmp": "Glyph Composition / Decomposition", "cfar": "Conjunct Form After Ro", "cjct": "Conjunct Forms", "clig": "Contextual Ligatures", "cpct": "Centered CJK Punctuation", "cpsp": "Capital Spacing", "cswh": "Contextual Swash", "curs": "Cursive Positioning", "c2pc": "Petite Capitals From Capitals", "c2sc": "Small Capitals From Capitals", "dist": "Distances", "dlig": "Discretionary Ligatures", "dnom": "Denominators", "dtls": "Dotless Forms", "expt": "Expert Forms", "falt": "Final Glyph on Line Alternates", "fin2": "Terminal Forms #2", "fin3": "Terminal Forms #3", "fina": "Terminal Forms", "flac": "Flattened accent forms", "frac": "Fractions", "fwid": "Full Widths", "half": "Half Forms", "haln": "Halant Forms", "halt": "Alternate Half Widths", "hist": "Historical Forms", "hkna": "Horizontal Kana Alternates", "hlig": "Historical Ligatures", "hngl": "Hangul", "hojo": "Hojo Kanji Forms(JIS X 0212 - 1990 Kanji Forms)", "hwid": "Half Widths", "init": "Initial Forms", "isol": "Isolated Forms", "ital": "Italics", "jalt": "Justification Alternates", "jp78": "JIS78 Forms", "jp83": "JIS83 Forms", "jp90": "JIS90 Forms", "jp04": "JIS2004 Forms", "kern": "Kerning", "lfbd": "Left Bounds", "liga": "Standard Ligatures", "ljmo": "Leading Jamo Forms", "lnum": "Lining Figures", "locl": "Localized Forms", "ltra": "Left - to - right alternates", "ltrm": "Left - to - right mirrored forms", "mark": "Mark Positioning", "med2": "Medial Forms #2", "medi": "Medial Forms", "mgrk": "Mathematical Greek", "mkmk": "Mark to Mark Positioning", "mset": "Mark Positioning via Substitution", "nalt": "Alternate Annotation Forms", "nlck": "NLC Kanji Forms", "nukt": "Nukta Forms", "numr": "Numerators", "onum": "Oldstyle Figures", "opbd": "Optical Bounds", "ordn": "Ordinals", "ornm": "Ornaments", "palt": "Proportional Alternate Widths", "pcap": "Petite Capitals", "pkna": "Proportional Kana", "pnum": "Proportional Figures", "pref": "Pre - Base Forms", "pres": "Pre - base Substitutions", "pstf": "Post - base Forms", "psts": "Post - base Substitutions", "pwid": "Proportional Widths", "qwid": "Quarter Widths", "rand": "Randomize", "rclt": "Required Contextual Alternates", "rkrf": "Rakar Forms", "rlig": "Required Ligatures", "rphf": "Reph Forms", "rtbd": "Right Bounds", "rtla": "Right - to - left alternates", "rtlm": "Right - to - left mirrored forms", "ruby": "Ruby Notation Forms", "rvrn": "Required Variation Alternates", "salt": "Stylistic Alternates", "sinf": "Scientific Inferiors", "size": "Optical size", "smcp": "Small Capitals", "smpl": "Simplified Forms", "ssty": "Math script style alternates", "stch": "Stretching Glyph Decomposition", "subs": "Subscript", "sups": "Superscript", "swsh": "Swash", "titl": "Titling", "tjmo": "Trailing Jamo Forms", "tnam": "Traditional Name Forms", "tnum": "Tabular Figures", "trad": "Traditional Forms", "twid": "Third Widths", "unic": "Unicase", "valt": "Alternate Vertical Metrics", "vatu": "Vattu Variants", "vert": "Vertical Writing", "vhal": "Alternate Vertical Half Metrics", "vjmo": "Vowel Jamo Forms", "vkna": "Vertical Kana Alternates", "vkrn": "Vertical Kerning", "vpal": "Proportional Alternate Vertical Metrics", "vrt2": "Vertical Alternates and Rotation", "vrtr": "Vertical Alternates for Rotation", "zero": "Slashed Zero" };
        var Font = (
          /** @class */
          function() {
            function Font2(data) {
              var obj = Typr_js_1.Typr.parse(data);
              if (!obj.length || typeof obj[0] !== "object" || typeof obj[0].hasOwnProperty !== "function") {
                throw "unable to parse font";
              }
              for (var n in obj[0]) {
                this[n] = obj[0][n];
              }
              this.enabledGSUB = {};
            }
            Font2.prototype.getFamilyName = function() {
              return this.name && (this.name.typoFamilyName || this.name.fontFamily) || "";
            };
            Font2.prototype.getSubFamilyName = function() {
              return this.name && (this.name.typoSubfamilyName || this.name.fontSubfamily) || "";
            };
            Font2.prototype.glyphToPath = function(gid) {
              return Typr_js_1.Typr.U.glyphToPath(this, gid);
            };
            Font2.prototype.getPairAdjustment = function(gid1, gid2) {
              return Typr_js_1.Typr.U.getPairAdjustment(this, gid1, gid2);
            };
            Font2.prototype.stringToGlyphs = function(str) {
              return Typr_js_1.Typr.U.stringToGlyphs(this, str);
            };
            Font2.prototype.glyphsToPath = function(gls) {
              return Typr_js_1.Typr.U.glyphsToPath(this, gls);
            };
            Font2.prototype.pathToSVG = function(path, prec) {
              return Typr_js_1.Typr.U.pathToSVG(path, prec);
            };
            Font2.prototype.pathToContext = function(path, ctx) {
              return Typr_js_1.Typr.U.pathToContext(path, ctx);
            };
            Font2.prototype.lookupFriendlyName = function(table, feature) {
              if (this[table] !== void 0) {
                var tbl = this[table];
                var feat = tbl.featureList[feature];
                return this.featureFriendlyName(feat);
              }
              return "";
            };
            Font2.prototype.featureFriendlyName = function(feature) {
              if (friendlyTags[feature.tag]) {
                return friendlyTags[feature.tag];
              }
              if (feature.tag.match(/ss[0-2][0-9]/)) {
                var name_1 = "Stylistic Set " + Number(feature.tag.substr(2, 2)).toString();
                if (feature.featureParams) {
                  var version = Typr_js_1.Typr._bin.readUshort(this._data, feature.featureParams);
                  if (version === 0) {
                    var nameID = Typr_js_1.Typr._bin.readUshort(this._data, feature.featureParams + 2);
                    if (this.name && this.name[nameID] !== void 0) {
                      return name_1 + " - " + this.name[nameID];
                    }
                  }
                }
                return name_1;
              }
              if (feature.tag.match(/cv[0-9][0-9]/)) {
                return "Character Variant " + Number(feature.tag.substr(2, 2)).toString();
              }
              return "";
            };
            Font2.prototype.enableGSUB = function(featureNumber) {
              if (this.GSUB) {
                var feature = this.GSUB.featureList[featureNumber];
                if (feature) {
                  for (var i = 0; i < feature.tab.length; ++i) {
                    this.enabledGSUB[feature.tab[i]] = (this.enabledGSUB[feature.tab[i]] || 0) + 1;
                  }
                }
              }
            };
            Font2.prototype.disableGSUB = function(featureNumber) {
              if (this.GSUB) {
                var feature = this.GSUB.featureList[featureNumber];
                if (feature) {
                  for (var i = 0; i < feature.tab.length; ++i) {
                    if (this.enabledGSUB[feature.tab[i]] > 1) {
                      --this.enabledGSUB[feature.tab[i]];
                    } else {
                      delete this.enabledGSUB[feature.tab[i]];
                    }
                  }
                }
              }
            };
            Font2.prototype.codeToGlyph = function(code) {
              var g = Typr_js_1.Typr.U.codeToGlyph(this, code);
              if (this.GSUB) {
                var gls = [g];
                for (var n in this.enabledGSUB) {
                  var l = this.GSUB.lookupList[n];
                  Typr_js_1.Typr.U._applySubs(gls, 0, l, this.GSUB.lookupList);
                }
                if (gls.length === 1)
                  return gls[0];
              }
              return g;
            };
            return Font2;
          }()
        );
        dist.Font = Font;
        return dist;
      }
      var distExports = requireDist();
      function decrypt(iframeDocument) {
        var _a, _b;
        const styles = iframeDocument.querySelectorAll("style");
        let tip;
        for (let i = 0; i < styles.length; i++) {
          if ((_a = styles[i].textContent) == null ? void 0 : _a.includes("font-cxsecret")) {
            tip = styles[i];
            break;
          }
        }
        if (!tip) return;
        const fontDataMatch = (_b = tip.textContent) == null ? void 0 : _b.match(/base64,([\w\W]+?)'/);
        const fontData = fontDataMatch == null ? void 0 : fontDataMatch[1];
        if (!fontData) return;
        const fontArray = base64ToUint8Array(fontData);
        const font = new distExports.Font(fontArray);
        const table = JSON.parse(_GM_getResourceText("ttf"));
        const match = {};
        for (let i = 19968; i < 40870; i++) {
          const glyph = font.codeToGlyph(i);
          if (!glyph) continue;
          const path = font.glyphToPath(glyph);
          const hash = md5(JSON.stringify(path)).slice(24);
          match[i] = table[hash];
        }
        const elements = iframeDocument.querySelectorAll(".font-cxsecret");
        for (let i = 0; i < elements.length; i++) {
          const el = elements[i];
          let html = el.innerHTML;
          for (const key in match) {
            const value = String.fromCharCode(match[key]);
            const regExp = new RegExp(String.fromCharCode(Number(key)), "g");
            html = html.replace(regExp, value);
          }
          el.innerHTML = html;
          el.classList.remove("font-cxsecret");
        }
      }
      function base64ToUint8Array(base64) {
        const data = window.atob(base64);
        const buffer = new Uint8Array(data.length);
        for (let i = 0; i < data.length; ++i) {
          buffer[i] = data.charCodeAt(i);
        }
        return buffer;
      }

    })
  };
}));

System.import("./__entry.js", "./");