'),
+ put_scope(f"dashboard-content-{arg}", [
+ put_scope(f"dashboard-value-{arg}", set_value(arg_dict)),
+ put_scope(f"dashboard-time-{arg}", [
+ put_text(f"{name} - {lang.readable_time(config.get('time', ''))}").style("--dashboard-time--"),
+ ])
+ ])
+
+ @use_scope("content", clear=True)
+ def alas_overview(self) -> None:
+ self.init_menu(name="Overview")
+ self.set_title(t(f"Gui.MenuAlas.Overview"))
+
+ put_scope("overview", [put_scope("schedulers"), put_scope("logs")])
+
+ with use_scope("schedulers"):
+ put_scope(
+ "scheduler-bar",
+ [
+ put_text(t("Gui.Overview.Scheduler")).style(
+ "font-size: 1.25rem; margin: auto .5rem auto;"
+ ),
+ put_scope("scheduler_btn"),
+ ],
+ )
+ put_scope(
+ "running",
+ [
+ put_text(t("Gui.Overview.Running")),
+ put_html('
'),
+ put_scope("running_tasks"),
+ ],
+ )
+ put_scope(
+ "pending",
+ [
+ put_text(t("Gui.Overview.Pending")),
+ put_html('
'),
+ put_scope("pending_tasks"),
+ ],
+ )
+ put_scope(
+ "waiting",
+ [
+ put_text(t("Gui.Overview.Waiting")),
+ put_html('
'),
+ put_scope("waiting_tasks"),
+ ],
+ )
+
+ switch_scheduler = BinarySwitchButton(
+ label_on=t("Gui.Button.Stop"),
+ label_off=t("Gui.Button.Start"),
+ onclick_on=lambda: self.alas.stop(),
+ onclick_off=lambda: self.alas.start(None, updater.event),
+ get_state=lambda: self.alas.alive,
+ color_on="off",
+ color_off="on",
+ scope="scheduler_btn",
+ )
+
+ log = RichLog("log")
+
+ with use_scope("logs"):
+ put_scope("log-bar", [
+ put_scope("log-title", [
+ put_text(t("Gui.Overview.Log")).style("font-size: 1.25rem; margin: auto .5rem auto;"),
+ put_scope("log-title-btns", [
+ put_scope("log_scroll_btn"),
+ ]),
+ ]),
+ put_html('
'),
+ put_scope("dashboard", [
+ # Empty dashboard, values will be updated in alas_update_overview_task()
+ put_scope(f"dashboard-row-{arg}", [])
+ for arg in self.ALAS_STORED.keys() if deep_get(self.ALAS_STORED, keys=[arg, "order"], default=0)
+ # Empty content to left-align last row
+ ] + [put_html("
")] * min(len(self.ALAS_STORED), 4))
+ ])
+ put_scope("log", [put_html("")])
+
+ log.console.width = log.get_width()
+
+ switch_log_scroll = BinarySwitchButton(
+ label_on=t("Gui.Button.ScrollON"),
+ label_off=t("Gui.Button.ScrollOFF"),
+ onclick_on=lambda: log.set_scroll(False),
+ onclick_off=lambda: log.set_scroll(True),
+ get_state=lambda: log.keep_bottom,
+ color_on="on",
+ color_off="off",
+ scope="log_scroll_btn",
+ )
+
+ self.task_handler.add(switch_scheduler.g(), 1, True)
+ self.task_handler.add(switch_log_scroll.g(), 1, True)
+ self.task_handler.add(self.alas_update_overview_task, 10, True)
+ self.task_handler.add(log.put_log(self.alas), 0.25, True)
+
+ def _init_alas_config_watcher(self) -> None:
+ def put_queue(path, value):
+ self.modified_config_queue.put({"name": path, "value": value})
+
+ for path in get_alas_config_listen_path(self.ALAS_ARGS):
+ pin_on_change(
+ name="_".join(path), onchange=partial(put_queue, ".".join(path))
+ )
+ logger.info("Init config watcher done.")
+
+ def _alas_thread_update_config(self) -> None:
+ modified = {}
+ while self.alive:
+ try:
+ d = self.modified_config_queue.get(timeout=10)
+ config_name = self.alas_name
+ read = self.alas_config.read_file
+ write = self.alas_config.write_file
+ except queue.Empty:
+ continue
+ modified[d["name"]] = d["value"]
+ while True:
+ try:
+ d = self.modified_config_queue.get(timeout=1)
+ modified[d["name"]] = d["value"]
+ except queue.Empty:
+ self._save_config(modified, config_name, read, write)
+ modified.clear()
+ break
+
+ def _save_config(
+ self,
+ modified: Dict[str, str],
+ config_name: str,
+ read=State.config_updater.read_file,
+ write=State.config_updater.write_file,
+ ) -> None:
+ try:
+ valid = []
+ invalid = []
+ config = read(config_name)
+ for k, v in modified.copy().items():
+ valuetype = deep_get(self.ALAS_ARGS, k + ".valuetype")
+ v = parse_pin_value(v, valuetype)
+ validate = deep_get(self.ALAS_ARGS, k + ".validate")
+ if not len(str(v)):
+ default = deep_get(self.ALAS_ARGS, k + ".value")
+ modified[k] = default
+ deep_set(config, k, default)
+ valid.append(k)
+ pin["_".join(k.split("."))] = default
+
+ elif not validate or re_fullmatch(validate, v):
+ deep_set(config, k, v)
+ modified[k] = v
+ valid.append(k)
+
+ # update Emotion Record if Emotion Value is changed
+ if "Emotion" in k and "Value" in k:
+ k = k.split(".")
+ k[-1] = k[-1].replace("Value", "Record")
+ k = ".".join(k)
+ v = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
+ modified[k] = v
+ deep_set(config, k, v)
+ valid.append(k)
+ pin["_".join(k.split("."))] = v
+ else:
+ modified.pop(k)
+ invalid.append(k)
+ logger.warning(f"Invalid value {v} for key {k}, skip saving.")
+ self.pin_remove_invalid_mark(valid)
+ self.pin_set_invalid_mark(invalid)
+ if modified:
+ toast(
+ t("Gui.Toast.ConfigSaved"),
+ duration=1,
+ position="right",
+ color="success",
+ )
+ logger.info(
+ f"Save config {filepath_config(config_name)}, {dict_to_kv(modified)}"
+ )
+ write(config_name, config)
+ except Exception as e:
+ logger.exception(e)
+
+ def alas_update_overview_task(self) -> None:
+ if not self.visible:
+ return
+ self.alas_config.load()
+ self.alas_config.get_next_task()
+
+ alive = self.alas.alive
+ if len(self.alas_config.pending_task) >= 1:
+ if self.alas.alive:
+ running = self.alas_config.pending_task[:1]
+ pending = self.alas_config.pending_task[1:]
+ else:
+ running = []
+ pending = self.alas_config.pending_task[:]
+ else:
+ running = []
+ pending = []
+ waiting = self.alas_config.waiting_task
+
+ def put_task(func: Function):
+ with use_scope(f"overview-task_{func.command}"):
+ put_column(
+ [
+ put_text(t(f"Task.{func.command}.name")).style("--arg-title--"),
+ put_text(str(func.next_run)).style("--arg-help--"),
+ ],
+ size="auto auto",
+ )
+ put_button(
+ label=t("Gui.Button.Setting"),
+ onclick=lambda: self.alas_set_group(func.command),
+ color="off",
+ )
+
+ if self.scope_expired_then_add("pending_task", [
+ alive,
+ self.alas_config.pending_task
+ ]):
+ clear("running_tasks")
+ clear("pending_tasks")
+ clear("waiting_tasks")
+ with use_scope("running_tasks"):
+ if running:
+ for task in running:
+ put_task(task)
+ else:
+ put_text(t("Gui.Overview.NoTask")).style("--overview-notask-text--")
+ with use_scope("pending_tasks"):
+ if pending:
+ for task in pending:
+ put_task(task)
+ else:
+ put_text(t("Gui.Overview.NoTask")).style("--overview-notask-text--")
+ with use_scope("waiting_tasks"):
+ if waiting:
+ for task in waiting:
+ put_task(task)
+ else:
+ put_text(t("Gui.Overview.NoTask")).style("--overview-notask-text--")
+
+ for arg, arg_dict in self.ALAS_STORED.items():
+ # Skip order=0
+ if not arg_dict.get("order", 0):
+ continue
+ path = arg_dict["path"]
+ if self.scope_expired_then_add(f"dashboard-time-value-{arg}", [
+ deep_get(self.alas_config.data, keys=f"{path}.value"),
+ lang.readable_time(deep_get(self.alas_config.data, keys=f"{path}.time")),
+ ]):
+ self.set_dashboard(arg, arg_dict, deep_get(self.alas_config.data, keys=path, default={}))
+
+ @use_scope("content", clear=True)
+ def alas_daemon_overview(self, task: str) -> None:
+ self.init_menu(name=task)
+ self.set_title(t(f"Task.{task}.name"))
+
+ log = RichLog("log")
+
+ if self.is_mobile:
+ put_scope(
+ "daemon-overview",
+ [
+ put_scope("scheduler-bar"),
+ put_scope("groups"),
+ put_scope("log-bar"),
+ put_scope("log", [put_html("")]),
+ ],
+ )
+ else:
+ put_scope(
+ "daemon-overview",
+ [
+ put_none(),
+ put_scope(
+ "_daemon",
+ [
+ put_scope(
+ "_daemon_upper",
+ [put_scope("scheduler-bar"), put_scope("log-bar")],
+ ),
+ put_scope("groups"),
+ put_scope("log", [put_html("")]),
+ ],
+ ),
+ put_none(),
+ ],
+ )
+
+ log.console.width = log.get_width()
+
+ with use_scope("scheduler-bar"):
+ put_text(t("Gui.Overview.Scheduler")).style(
+ "font-size: 1.25rem; margin: auto .5rem auto;"
+ )
+ put_scope("scheduler_btn")
+
+ switch_scheduler = BinarySwitchButton(
+ label_on=t("Gui.Button.Stop"),
+ label_off=t("Gui.Button.Start"),
+ onclick_on=lambda: self.alas.stop(),
+ onclick_off=lambda: self.alas.start(task),
+ get_state=lambda: self.alas.alive,
+ color_on="off",
+ color_off="on",
+ scope="scheduler_btn",
+ )
+
+ with use_scope("log-bar"):
+ put_text(t("Gui.Overview.Log")).style(
+ "font-size: 1.25rem; margin: auto .5rem auto;"
+ )
+ put_scope(
+ "log-bar-btns",
+ [
+ put_scope("log_scroll_btn"),
+ ],
+ )
+
+ switch_log_scroll = BinarySwitchButton(
+ label_on=t("Gui.Button.ScrollON"),
+ label_off=t("Gui.Button.ScrollOFF"),
+ onclick_on=lambda: log.set_scroll(False),
+ onclick_off=lambda: log.set_scroll(True),
+ get_state=lambda: log.keep_bottom,
+ color_on="on",
+ color_off="off",
+ scope="log_scroll_btn",
+ )
+
+ config = self.alas_config.read_file(self.alas_name)
+ for group, arg_dict in deep_iter(self.ALAS_ARGS[task], depth=1):
+ if group[0] == "Storage":
+ continue
+ self.set_group(group, arg_dict, config, task)
+
+ run_js("""
+ $("#pywebio-scope-log").css(
+ "grid-row-start",
+ -2 - $("#pywebio-scope-_daemon").children().filter(
+ function(){
+ return $(this).css("display") === "none";
+ }
+ ).length
+ );
+ $("#pywebio-scope-log").css(
+ "grid-row-end",
+ -1
+ );
+ """)
+
+ self.task_handler.add(switch_scheduler.g(), 1, True)
+ self.task_handler.add(switch_log_scroll.g(), 1, True)
+ self.task_handler.add(log.put_log(self.alas), 0.25, True)
+
+ @use_scope("menu", clear=True)
+ def dev_set_menu(self) -> None:
+ self.init_menu(collapse_menu=False, name="Develop")
+
+ put_button(
+ label=t("Gui.MenuDevelop.HomePage"),
+ onclick=self.show,
+ color="menu",
+ ).style(f"--menu-HomePage--")
+
+ # put_button(
+ # label=t("Gui.MenuDevelop.Translate"),
+ # onclick=self.dev_translate,
+ # color="menu",
+ # ).style(f"--menu-Translate--")
+
+ put_button(
+ label=t("Gui.MenuDevelop.Update"),
+ onclick=self.dev_update,
+ color="menu",
+ ).style(f"--menu-Update--")
+
+ put_button(
+ label=t("Gui.MenuDevelop.Remote"),
+ onclick=self.dev_remote,
+ color="menu",
+ ).style(f"--menu-Remote--")
+
+ put_button(
+ label=t("Gui.MenuDevelop.Utils"),
+ onclick=self.dev_utils,
+ color="menu",
+ ).style(f"--menu-Utils--")
+
+ def dev_translate(self) -> None:
+ go_app("translate", new_window=True)
+ lang.TRANSLATE_MODE = True
+ self.show()
+
+ @use_scope("content", clear=True)
+ def dev_update(self) -> None:
+ self.init_menu(name="Update")
+ self.set_title(t("Gui.MenuDevelop.Update"))
+
+ if State.restart_event is None:
+ put_warning(t("Gui.Update.DisabledWarn"))
+
+ put_row(
+ content=[put_scope("updater_loading"), None, put_scope("updater_state")],
+ size="auto .25rem 1fr",
+ )
+
+ put_scope("updater_btn")
+ put_scope("updater_info")
+
+ def update_table():
+ with use_scope("updater_info", clear=True):
+ local_commit = updater.get_commit(short_sha1=True)
+ upstream_commit = updater.get_commit(
+ f"origin/{updater.Branch}", short_sha1=True
+ )
+ put_table(
+ [
+ [t("Gui.Update.Local"), *local_commit],
+ [t("Gui.Update.Upstream"), *upstream_commit],
+ ],
+ header=[
+ "",
+ "SHA1",
+ t("Gui.Update.Author"),
+ t("Gui.Update.Time"),
+ t("Gui.Update.Message"),
+ ],
+ )
+ with use_scope("updater_detail", clear=True):
+ put_text(t("Gui.Update.DetailedHistory"))
+ history = updater.get_commit(
+ f"origin/{updater.Branch}", n=20, short_sha1=True
+ )
+ put_table(
+ [commit for commit in history],
+ header=[
+ "SHA1",
+ t("Gui.Update.Author"),
+ t("Gui.Update.Time"),
+ t("Gui.Update.Message"),
+ ],
+ )
+
+ def u(state):
+ if state == -1:
+ return
+ clear("updater_loading")
+ clear("updater_state")
+ clear("updater_btn")
+ if state == 0:
+ put_loading("border", "secondary", "updater_loading").style(
+ "--loading-border-fill--"
+ )
+ put_text(t("Gui.Update.UpToDate"), scope="updater_state")
+ put_button(
+ t("Gui.Button.CheckUpdate"),
+ onclick=updater.check_update,
+ color="info",
+ scope="updater_btn",
+ )
+ update_table()
+ elif state == 1:
+ put_loading("grow", "success", "updater_loading").style(
+ "--loading-grow--"
+ )
+ put_text(t("Gui.Update.HaveUpdate"), scope="updater_state")
+ put_button(
+ t("Gui.Button.ClickToUpdate"),
+ onclick=updater.run_update,
+ color="success",
+ scope="updater_btn",
+ )
+ update_table()
+ elif state == "checking":
+ put_loading("border", "primary", "updater_loading").style(
+ "--loading-border--"
+ )
+ put_text(t("Gui.Update.UpdateChecking"), scope="updater_state")
+ elif state == "failed":
+ put_loading("grow", "danger", "updater_loading").style(
+ "--loading-grow--"
+ )
+ put_text(t("Gui.Update.UpdateFailed"), scope="updater_state")
+ put_button(
+ t("Gui.Button.RetryUpdate"),
+ onclick=updater.run_update,
+ color="primary",
+ scope="updater_btn",
+ )
+ elif state == "start":
+ put_loading("border", "primary", "updater_loading").style(
+ "--loading-border--"
+ )
+ put_text(t("Gui.Update.UpdateStart"), scope="updater_state")
+ put_button(
+ t("Gui.Button.CancelUpdate"),
+ onclick=updater.cancel,
+ color="danger",
+ scope="updater_btn",
+ )
+ elif state == "wait":
+ put_loading("border", "primary", "updater_loading").style(
+ "--loading-border--"
+ )
+ put_text(t("Gui.Update.UpdateWait"), scope="updater_state")
+ put_button(
+ t("Gui.Button.CancelUpdate"),
+ onclick=updater.cancel,
+ color="danger",
+ scope="updater_btn",
+ )
+ elif state == "run update":
+ put_loading("border", "primary", "updater_loading").style(
+ "--loading-border--"
+ )
+ put_text(t("Gui.Update.UpdateRun"), scope="updater_state")
+ put_button(
+ t("Gui.Button.CancelUpdate"),
+ onclick=updater.cancel,
+ color="danger",
+ scope="updater_btn",
+ disabled=True,
+ )
+ elif state == "reload":
+ put_loading("grow", "success", "updater_loading").style(
+ "--loading-grow--"
+ )
+ put_text(t("Gui.Update.UpdateSuccess"), scope="updater_state")
+ update_table()
+ elif state == "finish":
+ put_loading("grow", "success", "updater_loading").style(
+ "--loading-grow--"
+ )
+ put_text(t("Gui.Update.UpdateFinish"), scope="updater_state")
+ update_table()
+ elif state == "cancel":
+ put_loading("border", "danger", "updater_loading").style(
+ "--loading-border--"
+ )
+ put_text(t("Gui.Update.UpdateCancel"), scope="updater_state")
+ put_button(
+ t("Gui.Button.CancelUpdate"),
+ onclick=updater.cancel,
+ color="danger",
+ scope="updater_btn",
+ disabled=True,
+ )
+ else:
+ put_text(
+ "Something went wrong, please contact develops",
+ scope="updater_state",
+ )
+ put_text(f"state: {state}", scope="updater_state")
+
+ updater_switch = Switch(
+ status=u, get_state=lambda: updater.state, name="updater"
+ )
+
+ update_table()
+ self.task_handler.add(updater_switch.g(), delay=0.5, pending_delete=True)
+
+ updater.check_update()
+
+ @use_scope("content", clear=True)
+ def dev_utils(self) -> None:
+ self.init_menu(name="Utils")
+ self.set_title(t("Gui.MenuDevelop.Utils"))
+ put_button(label="Raise exception", onclick=raise_exception)
+
+ def _force_restart():
+ if State.restart_event is not None:
+ toast("Alas will restart in 3 seconds", duration=0, color="error")
+ clearup()
+ State.restart_event.set()
+ else:
+ toast("Reload not enabled", color="error")
+
+ put_button(label="Force restart", onclick=_force_restart)
+
+ @use_scope("content", clear=True)
+ def dev_remote(self) -> None:
+ self.init_menu(name="Remote")
+ self.set_title(t("Gui.MenuDevelop.Remote"))
+ put_row(
+ content=[put_scope("remote_loading"), None, put_scope("remote_state")],
+ size="auto .25rem 1fr",
+ )
+ put_scope("remote_info")
+
+ def u(state):
+ if state == -1:
+ return
+ clear("remote_loading")
+ clear("remote_state")
+ clear("remote_info")
+ if state in (1, 2):
+ put_loading("grow", "success", "remote_loading").style(
+ "--loading-grow--"
+ )
+ put_text(t("Gui.Remote.Running"), scope="remote_state")
+ put_text(t("Gui.Remote.EntryPoint"), scope="remote_info")
+ entrypoint = RemoteAccess.get_entry_point()
+ if entrypoint:
+ if State.electron: # Prevent click into url in electron client
+ put_text(entrypoint, scope="remote_info").style(
+ "text-decoration-line: underline"
+ )
+ else:
+ put_link(name=entrypoint, url=entrypoint, scope="remote_info")
+ else:
+ put_text("Loading...", scope="remote_info")
+ elif state in (0, 3):
+ put_loading("border", "secondary", "remote_loading").style(
+ "--loading-border-fill--"
+ )
+ if (
+ State.deploy_config.EnableRemoteAccess
+ and State.deploy_config.Password
+ ):
+ put_text(t("Gui.Remote.NotRunning"), scope="remote_state")
+ else:
+ put_text(t("Gui.Remote.NotEnable"), scope="remote_state")
+ put_text(t("Gui.Remote.ConfigureHint"), scope="remote_info")
+ url = "http://app.azurlane.cloud" + (
+ "" if State.deploy_config.Language.startswith("zh") else "/en.html"
+ )
+ put_html(
+ f'
{url}', scope="remote_info"
+ )
+ if state == 3:
+ put_warning(
+ t("Gui.Remote.SSHNotInstall"),
+ closable=False,
+ scope="remote_info",
+ )
+
+ remote_switch = Switch(
+ status=u, get_state=RemoteAccess.get_state, name="remote"
+ )
+
+ self.task_handler.add(remote_switch.g(), delay=1, pending_delete=True)
+
+ def ui_develop(self) -> None:
+ if not self.is_mobile:
+ self.show()
+ return
+ self.init_aside(name="Home")
+ self.set_title(t("Gui.Aside.Home"))
+ self.dev_set_menu()
+ self.alas_name = ""
+ if hasattr(self, "alas"):
+ del self.alas
+ self.state_switch.switch()
+
+ def ui_alas(self, config_name: str) -> None:
+ if config_name == self.alas_name:
+ self.expand_menu()
+ return
+ self.init_aside(name=config_name)
+ clear("content")
+ self.alas_name = config_name
+ self.alas_mod = get_config_mod(config_name)
+ self.alas = ProcessManager.get_manager(config_name)
+ self.alas_config = load_config(config_name)
+ self.state_switch.switch()
+ self.initial()
+ self.alas_set_menu()
+
+ def ui_add_alas(self) -> None:
+ with popup(t("Gui.AddAlas.PopupTitle")) as s:
+
+ def get_unused_name():
+ all_name = alas_instance()
+ for i in range(2, 100):
+ if f"aas{i}" not in all_name:
+ return f"aas{i}"
+ else:
+ return ""
+
+ def add():
+ name = pin["AddAlas_name"]
+ origin = pin["AddAlas_copyfrom"]
+
+ if name in alas_instance():
+ err = "Gui.AddAlas.FileExist"
+ elif set(name) & set(".\\/:*?\"'<>|"):
+ err = "Gui.AddAlas.InvalidChar"
+ elif name.lower().startswith("template"):
+ err = "Gui.AddAlas.InvalidPrefixTemplate"
+ else:
+ err = ""
+ if err:
+ clear(s)
+ put(name, origin)
+ put_error(t(err), scope=s)
+ return
+
+ r = load_config(origin).read_file(origin)
+ State.config_updater.write_file(name, r, get_config_mod(origin))
+ self.set_aside()
+ self.active_button("aside", self.alas_name)
+ close_popup()
+
+ def put(name=None, origin=None):
+ put_input(
+ name="AddAlas_name",
+ label=t("Gui.AddAlas.NewName"),
+ value=name or get_unused_name(),
+ scope=s,
+ ),
+ put_select(
+ name="AddAlas_copyfrom",
+ label=t("Gui.AddAlas.CopyFrom"),
+ options=alas_template() + alas_instance(),
+ value=origin or "template-aas",
+ scope=s,
+ ),
+ put_button(label=t("Gui.AddAlas.Confirm"), onclick=add, scope=s)
+
+ put()
+
+ def show(self) -> None:
+ self._show()
+ self.set_aside()
+ self.init_aside(name="Home")
+ self.dev_set_menu()
+ self.init_menu(name="HomePage")
+ self.alas_name = ""
+ if hasattr(self, "alas"):
+ del self.alas
+ self.set_status(0)
+
+ def set_language(l):
+ lang.set_language(l)
+ self.show()
+
+ def set_theme(t):
+ self.set_theme(t)
+ run_js("location.reload()")
+
+ with use_scope("content"):
+ put_text("Select your language / 选择语言").style("text-align: center")
+ put_buttons(
+ [
+ {"label": "简体中文", "value": "zh-CN"},
+ {"label": "English", "value": "en-US"},
+ ],
+ onclick=lambda l: set_language(l),
+ ).style("text-align: center")
+ put_text("Change theme / 更改主题").style("text-align: center")
+ put_buttons(
+ [
+ {"label": "Light", "value": "default", "color": "light"},
+ {"label": "Dark", "value": "dark", "color": "dark"},
+ ],
+ onclick=lambda t: set_theme(t),
+ ).style("text-align: center")
+
+ # show something
+ put_markdown(
+ """
+ SRC is a free open source software, if you paid for SRC from any channel, please refund.
+ SRC 是一款免费开源软件,如果你在任何渠道付费购买了SRC,请退款。
+ Project repository 项目地址:`https://github.com/LmeSzinc/StarRailCopilot`
+ """
+ ).style("text-align: center")
+
+ if lang.TRANSLATE_MODE:
+ lang.reload()
+
+ def _disable():
+ lang.TRANSLATE_MODE = False
+ self.show()
+
+ toast(
+ _t("Gui.Toast.DisableTranslateMode"),
+ duration=0,
+ position="right",
+ onclick=_disable,
+ )
+
+ def run(self) -> None:
+ # setup gui
+ set_env(title="AAS", output_animation=False)
+ add_css(filepath_css("alas"))
+ if self.is_mobile:
+ add_css(filepath_css("alas-mobile"))
+ else:
+ add_css(filepath_css("alas-pc"))
+
+ if self.theme == "dark":
+ add_css(filepath_css("dark-alas"))
+ else:
+ add_css(filepath_css("light-alas"))
+
+ # Auto refresh when lost connection
+ # [For develop] Disable by run `reload=0` in console
+ run_js(
+ """
+ reload = 1;
+ WebIO._state.CurrentSession.on_session_close(
+ ()=>{
+ setTimeout(
+ ()=>{
+ if (reload == 1){
+ location.reload();
+ }
+ }, 4000
+ )
+ }
+ );
+ """
+ )
+
+ aside = get_localstorage("aside")
+ self.show()
+
+ # init config watcher
+ self._init_alas_config_watcher()
+
+ # save config
+ _thread_save_config = threading.Thread(target=self._alas_thread_update_config)
+ register_thread(_thread_save_config)
+ _thread_save_config.start()
+
+ visibility_state_switch = Switch(
+ status={
+ True: [
+ lambda: self.__setattr__("visible", True),
+ lambda: self.alas_update_overview_task()
+ if self.page == "Overview"
+ else 0,
+ lambda: self.task_handler._task.__setattr__("delay", 15),
+ ],
+ False: [
+ lambda: self.__setattr__("visible", False),
+ lambda: self.task_handler._task.__setattr__("delay", 1),
+ ],
+ },
+ get_state=get_window_visibility_state,
+ name="visibility_state",
+ )
+
+ self.state_switch = Switch(
+ status=self.set_status,
+ get_state=lambda: getattr(getattr(self, "alas", -1), "state", 0),
+ name="state",
+ )
+
+ def goto_update():
+ self.ui_develop()
+ self.dev_update()
+
+ update_switch = Switch(
+ status={
+ 1: lambda: toast(
+ t("Gui.Toast.ClickToUpdate"),
+ duration=0,
+ position="right",
+ color="success",
+ onclick=goto_update,
+ )
+ },
+ get_state=lambda: updater.state,
+ name="update_state",
+ )
+
+ self.task_handler.add(self.state_switch.g(), 2)
+ self.task_handler.add(visibility_state_switch.g(), 15)
+ self.task_handler.add(update_switch.g(), 1)
+ self.task_handler.start()
+
+ # Return to previous page
+ if aside not in ["Home", None]:
+ self.ui_alas(aside)
+
+
+def debug():
+ """For interactive python.
+ $ python3
+ >>> from module.webui.app import *
+ >>> debug()
+ >>>
+ """
+ startup()
+ AlasGUI().run()
+
+
+def startup():
+ State.init()
+ lang.reload()
+ updater.event = State.manager.Event()
+ if updater.delay > 0:
+ task_handler.add(updater.check_update, updater.delay)
+ task_handler.add(updater.schedule_update(), 86400)
+ task_handler.start()
+ # if State.deploy_config.DiscordRichPresence:
+ # init_discord_rpc()
+ # if State.deploy_config.StartOcrServer:
+ # start_ocr_server_process(State.deploy_config.OcrServerPort)
+ if (
+ State.deploy_config.EnableRemoteAccess
+ and State.deploy_config.Password is not None
+ ):
+ task_handler.add(RemoteAccess.keep_ssh_alive(), 60)
+
+
+def clearup():
+ """
+ Notice: Ensure run it before uvicorn reload app,
+ all process will NOT EXIT after close electron app.
+ """
+ logger.info("Start clearup")
+ RemoteAccess.kill_ssh_process()
+ # close_discord_rpc()
+ # stop_ocr_server_process()
+ for alas in ProcessManager._processes.values():
+ alas.stop()
+ State.clearup()
+ task_handler.stop()
+ logger.info("Alas closed.")
+
+
+def app():
+ parser = argparse.ArgumentParser(description="Alas web service")
+ parser.add_argument(
+ "-k", "--key", type=str, help="Password of alas. No password by default"
+ )
+ parser.add_argument(
+ "--cdn",
+ action="store_true",
+ help="Use jsdelivr cdn for pywebio static files (css, js). Self host cdn by default.",
+ )
+ parser.add_argument(
+ "--run",
+ nargs="+",
+ type=str,
+ help="Run alas by config names on startup",
+ )
+ args, _ = parser.parse_known_args()
+
+ # Apply config
+ AlasGUI.set_theme(theme=State.deploy_config.Theme)
+ lang.LANG = State.deploy_config.Language
+ key = args.key or State.deploy_config.Password
+ cdn = args.cdn if args.cdn else State.deploy_config.CDN
+ runs = None
+ if args.run:
+ runs = args.run
+ elif State.deploy_config.Run:
+ # TODO: refactor poor_yaml_read() to support list
+ tmp = State.deploy_config.Run.split(",")
+ runs = [l.strip(" ['\"]") for l in tmp if len(l)]
+ instances: List[str] = runs
+
+ logger.hr("Webui configs")
+ logger.attr("Theme", State.deploy_config.Theme)
+ logger.attr("Language", lang.LANG)
+ logger.attr("Password", True if key else False)
+ logger.attr("CDN", cdn)
+
+ def index():
+ if key is not None and not login(key):
+ logger.warning(f"{info.user_ip} login failed.")
+ time.sleep(1.5)
+ run_js("location.reload();")
+ return
+ gui = AlasGUI()
+ local.gui = gui
+ gui.run()
+
+ app = asgi_app(
+ applications=[index],
+ cdn=cdn,
+ static_dir=None,
+ debug=True,
+ on_startup=[
+ startup,
+ lambda: ProcessManager.restart_processes(
+ instances=instances, ev=updater.event
+ ),
+ ],
+ on_shutdown=[clearup],
+ )
+
+ return app
diff --git a/module/webui/base.py b/module/webui/base.py
new file mode 100644
index 0000000..6834424
--- /dev/null
+++ b/module/webui/base.py
@@ -0,0 +1,169 @@
+from typing import Any, Dict
+
+from pywebio.output import clear, put_html, put_scope, put_text, use_scope
+from pywebio.session import defer_call, info, run_js
+
+from module.webui.utils import Icon, WebIOTaskHandler, set_localstorage
+
+
+class Base:
+ def __init__(self) -> None:
+ self.alive = True
+ # Whether window is visible
+ self.visible = True
+ # Device type
+ self.is_mobile = info.user_agent.is_mobile
+ # Task handler
+ self.task_handler = WebIOTaskHandler()
+ # Record scopes to reduce data transfer to frontend
+ # Key: scope name, value: last update time
+ self.scope: Dict[str, Any] = {}
+ defer_call(self.stop)
+
+ def stop(self) -> None:
+ self.alive = False
+ self.task_handler.stop()
+
+ def scope_clear(self):
+ self.scope = {}
+
+ def scope_add(self, key, value):
+ self.scope[key] = value
+
+ def scope_expired(self, key, value) -> bool:
+ try:
+ return self.scope[key] != value
+ except KeyError:
+ return True
+
+ def scope_expired_then_add(self, key, value) -> bool:
+ if self.scope_expired(key, value):
+ self.scope_add(key, value)
+ return True
+ else:
+ return False
+
+
+class Frame(Base):
+ def __init__(self) -> None:
+ super().__init__()
+ self.page = "Home"
+
+ def init_aside(self, expand_menu: bool = True, name: str = None) -> None:
+ """
+ Call this in aside button callback function.
+ Args:
+ expand_menu: expand menu
+ name: button name(label) to be highlight
+ """
+ self.visible = True
+ self.scope_clear()
+ self.task_handler.remove_pending_task()
+ clear("menu")
+ if expand_menu:
+ self.expand_menu()
+ if name:
+ self.active_button("aside", name)
+ set_localstorage("aside", name)
+
+ def init_menu(self, collapse_menu: bool = True, name: str = None) -> None:
+ """
+ Call this in menu button callback function.
+ Args:
+ collapse_menu: collapse menu
+ name: button name(label) to be highlight
+ """
+ self.visible = True
+ self.page = name
+ self.scope_clear()
+ self.task_handler.remove_pending_task()
+ clear("content")
+ if collapse_menu:
+ self.collapse_menu()
+ if name:
+ self.active_button("menu", name)
+
+ @staticmethod
+ @use_scope("ROOT", clear=True)
+ def _show() -> None:
+ put_scope(
+ "header",
+ [
+ put_html(Icon.ALAS).style("--header-icon--"),
+ put_text("AAS").style("--header-text--"),
+ put_scope("header_status"),
+ put_scope("header_title"),
+ ],
+ )
+ put_scope(
+ "contents",
+ [
+ put_scope("aside"),
+ put_scope("menu"),
+ put_scope("content"),
+ ],
+ )
+
+ @staticmethod
+ @use_scope("header_title", clear=True)
+ def set_title(text=""):
+ put_text(text)
+
+ @staticmethod
+ def collapse_menu() -> None:
+ run_js(
+ f"""
+ $("#pywebio-scope-menu").addClass("container-menu-collapsed");
+ $(".container-content-collapsed").removeClass("container-content-collapsed");
+ """
+ )
+
+ @staticmethod
+ def expand_menu() -> None:
+ run_js(
+ f"""
+ $(".container-menu-collapsed").removeClass("container-menu-collapsed");
+ $("#pywebio-scope-content").addClass("container-content-collapsed");
+ """
+ )
+
+ @staticmethod
+ def active_button(position, value) -> None:
+ run_js(
+ f"""
+ $("button.btn-{position}").removeClass("btn-{position}-active");
+ $("div[style*='--{position}-{value}--']>button").addClass("btn-{position}-active");
+ """
+ )
+
+ @staticmethod
+ def pin_set_invalid_mark(keys) -> None:
+ if isinstance(keys, str):
+ keys = [keys]
+ keys = ["_".join(key.split(".")) for key in keys]
+ js = "".join(
+ [
+ f"""$(".form-control[name='{key}']").addClass('is-invalid');"""
+ for key in keys
+ ]
+ )
+ if js:
+ run_js(js)
+ # for key in keys:
+ # pin_update(key, valid_status=False)
+
+ @staticmethod
+ def pin_remove_invalid_mark(keys) -> None:
+ if isinstance(keys, str):
+ keys = [keys]
+ keys = ["_".join(key.split(".")) for key in keys]
+ js = "".join(
+ [
+ f"""$(".form-control[name='{key}']").removeClass('is-invalid');"""
+ for key in keys
+ ]
+ )
+ if js:
+ run_js(js)
+ # for key in keys:
+ # pin_update(key, valid_status=0)
diff --git a/module/webui/config.py b/module/webui/config.py
new file mode 100644
index 0000000..fd4d6ef
--- /dev/null
+++ b/module/webui/config.py
@@ -0,0 +1,53 @@
+from filelock import FileLock
+
+from deploy.Windows.config import DeployConfig as _DeployConfig
+from deploy.Windows.utils import *
+
+
+def poor_yaml_read_with_lock(file):
+ if not os.path.exists(file):
+ return {}
+
+ with FileLock(f"{file}.lock"):
+ return poor_yaml_read(file)
+
+
+def poor_yaml_write_with_lock(data, file, template_file=DEPLOY_TEMPLATE):
+ folder = os.path.dirname(file)
+ if not os.path.exists(folder):
+ os.mkdir(folder)
+
+ with FileLock(f"{file}.lock"):
+ with FileLock(f"{DEPLOY_TEMPLATE}.lock"):
+ return poor_yaml_write(data, file, template_file)
+
+
+class DeployConfig(_DeployConfig):
+ def show_config(self):
+ pass
+
+ def read(self):
+ """
+ Read and update deploy config, copy `self.configs` to properties.
+ """
+ self.config = poor_yaml_read_with_lock(DEPLOY_TEMPLATE)
+ self.config.update(poor_yaml_read_with_lock(self.file))
+
+ for key, value in self.config.items():
+ if hasattr(self, key):
+ super().__setattr__(key, value)
+
+ def write(self):
+ """
+ Write `self.config` into deploy config.
+ """
+ poor_yaml_write_with_lock(self.config, self.file)
+
+ def __setattr__(self, key: str, value):
+ """
+ Catch __setattr__, copy to `self.config`, write deploy config.
+ """
+ super().__setattr__(key, value)
+ if key[0].isupper() and key in self.config:
+ self.config[key] = value
+ self.write()
diff --git a/module/webui/fake.py b/module/webui/fake.py
new file mode 100644
index 0000000..e8cb91b
--- /dev/null
+++ b/module/webui/fake.py
@@ -0,0 +1,41 @@
+from module.config.config import AzurLaneConfig
+
+"""
+Return default values, since submodules shouldn't have nested submodules
+"""
+
+
+def start_ocr_server_process(*args, **kwargs):
+ pass
+
+
+def stop_ocr_server_process(*args, **kwargs):
+ pass
+
+
+def load_config(config_name):
+ return AzurLaneConfig(config_name, '')
+
+
+def get_config_mod(config_name):
+ """
+ Args:
+ config_name (str):
+ """
+ return 'alas'
+
+
+def list_mod():
+ return []
+
+
+def mod_instance():
+ return []
+
+
+def init_discord_rpc():
+ pass
+
+
+def close_discord_rpc():
+ pass
diff --git a/module/webui/fastapi.py b/module/webui/fastapi.py
new file mode 100644
index 0000000..689846d
--- /dev/null
+++ b/module/webui/fastapi.py
@@ -0,0 +1,100 @@
+"""
+Copy from pywebio.platform.fastapi
+"""
+import asyncio
+import os
+
+import uvicorn
+from pywebio.platform.fastapi import (STATIC_PATH, Session, cdn_validation,
+ get_free_port,
+ open_webbrowser_on_server_started,
+ start_remote_access_service,
+ webio_routes)
+from starlette.applications import Starlette
+from starlette.middleware import Middleware
+from starlette.middleware.base import BaseHTTPMiddleware
+from starlette.routing import Mount
+from starlette.staticfiles import StaticFiles
+
+
+class HeaderMiddleware(BaseHTTPMiddleware):
+ async def dispatch(self, request, call_next):
+ response = await call_next(request)
+ response.headers["Cache-Control"] = "no-cache"
+ return response
+
+
+def asgi_app(
+ applications,
+ cdn=True,
+ static_dir=None,
+ debug=False,
+ allowed_origins=None,
+ check_origin=None,
+ **starlette_settings
+):
+ debug = Session.debug = os.environ.get("PYWEBIO_DEBUG", debug)
+ cdn = cdn_validation(cdn, "warn")
+ if cdn is False:
+ cdn = "pywebio_static"
+ routes = webio_routes(
+ applications,
+ cdn=cdn,
+ allowed_origins=allowed_origins,
+ check_origin=check_origin,
+ )
+ if static_dir:
+ routes.append(
+ Mount("/static", app=StaticFiles(directory=static_dir), name="static")
+ )
+ routes.append(
+ Mount(
+ "/pywebio_static",
+ app=StaticFiles(directory=STATIC_PATH),
+ name="pywebio_static",
+ )
+ )
+ middleware = [Middleware(HeaderMiddleware)]
+ return Starlette(
+ routes=routes, middleware=middleware, debug=debug, **starlette_settings
+ )
+
+
+def start_server(
+ applications,
+ port=0,
+ host="",
+ cdn=True,
+ static_dir=None,
+ remote_access=False,
+ debug=False,
+ allowed_origins=None,
+ check_origin=None,
+ auto_open_webbrowser=False,
+ **uvicorn_settings
+):
+
+ app = asgi_app(
+ applications,
+ cdn=cdn,
+ static_dir=static_dir,
+ debug=debug,
+ allowed_origins=allowed_origins,
+ check_origin=check_origin,
+ )
+
+ if auto_open_webbrowser:
+ asyncio.get_event_loop().create_task(
+ open_webbrowser_on_server_started("localhost", port)
+ )
+
+ if not host:
+ host = "0.0.0.0"
+
+ if port == 0:
+ port = get_free_port()
+
+ if remote_access:
+ start_remote_access_service(local_port=port)
+
+ uvicorn.run(app, host=host, port=port, **uvicorn_settings)
diff --git a/module/webui/lang.py b/module/webui/lang.py
new file mode 100644
index 0000000..51027fe
--- /dev/null
+++ b/module/webui/lang.py
@@ -0,0 +1,100 @@
+import time
+from typing import Dict
+
+from module.config.utils import *
+from module.webui.fake import list_mod
+from module.webui.setting import State
+
+LANG = "zh-CN"
+TRANSLATE_MODE = False
+
+
+def set_language(s: str, refresh=False):
+ global LANG
+ for i, lang in enumerate(LANGUAGES):
+ # pywebio.session.info.user_language return `zh-CN` or `zh-cn`, depends on browser
+ if lang.lower() == s.lower():
+ LANG = LANGUAGES[i]
+ break
+ else:
+ LANG = "en-US"
+
+ State.deploy_config.Language = LANG
+
+ if refresh:
+ from pywebio.session import run_js
+
+ run_js("location.reload();")
+
+
+def t(s, *args, **kwargs):
+ """
+ Get translation.
+ other args, kwargs pass to .format()
+ """
+ if TRANSLATE_MODE:
+ return s
+ return _t(s, LANG).format(*args, **kwargs)
+
+
+def _t(s, lang=None):
+ """
+ Get translation, ignore TRANSLATE_MODE
+ """
+ if not lang:
+ lang = LANG
+ try:
+ return dic_lang[lang][s]
+ except KeyError:
+ print(f"Language key ({s}) not found")
+ return s
+
+
+dic_lang: Dict[str, Dict[str, str]] = {}
+
+
+def reload():
+ for lang in LANGUAGES:
+ if lang not in dic_lang:
+ dic_lang[lang] = {}
+
+ for mod_name, dir_name in list_mod():
+ for path, v in deep_iter(read_file(filepath_i18n(lang, mod_name)), depth=3):
+ dic_lang[lang][".".join(path)] = v
+
+ for path, v in deep_iter(read_file(filepath_i18n(lang)), depth=3):
+ dic_lang[lang][".".join(path)] = v
+
+ for key in dic_lang["zh-CN"].keys():
+ if dic_lang["zh-CN"][key] == key:
+ dic_lang["zh-CN"][key] = dic_lang["en-US"][key]
+
+
+def readable_time(before: str) -> str:
+ """
+ Convert "2023-08-29 12:30:53" to "3 Minutes Ago"
+ """
+ if not before:
+ return t("Gui.Dashboard.NoData")
+ try:
+ ti = datetime.fromisoformat(before)
+ except ValueError:
+ return t("Gui.Dashboard.TimeError")
+ if ti == DEFAULT_TIME:
+ return t("Gui.Dashboard.NoData")
+
+ diff = time.time() - ti.timestamp()
+ if diff < -1:
+ return t("Gui.Dashboard.TimeError")
+ elif diff < 60:
+ # < 1 min
+ return t("Gui.Dashboard.JustNow")
+ elif diff < 3600:
+ return t("Gui.Dashboard.MinutesAgo", time=int(diff // 60))
+ elif diff < 86400:
+ return t("Gui.Dashboard.HoursAgo", time=int(diff // 3600))
+ elif diff < 1296000:
+ return t("Gui.Dashboard.DaysAgo", time=int(diff // 86400))
+ else:
+ # > 15 days
+ return t("Gui.Dashboard.LongTimeAgo")
diff --git a/module/webui/pin.py b/module/webui/pin.py
new file mode 100644
index 0000000..4d70243
--- /dev/null
+++ b/module/webui/pin.py
@@ -0,0 +1,49 @@
+"""
+Copy from pywebio.pin
+Add **other_html_attrs to put_xxx()
+"""
+
+from pywebio.io_ctrl import Output
+from pywebio.output import OutputPosition
+from pywebio.pin import _pin_output, check_dom_name_value
+
+
+def put_input(name, type='text', *, label='', value=None, placeholder=None, readonly=None, datalist=None,
+ help_text=None, scope=None, position=OutputPosition.BOTTOM, **other_html_attrs) -> Output:
+ """Output an input widget. Refer to: `pywebio.input.input()`"""
+ from pywebio.input import input
+ check_dom_name_value(name, 'pin `name`')
+ single_input_return = input(name=name, label=label, value=value, type=type, placeholder=placeholder,
+ readonly=readonly, datalist=datalist, help_text=help_text, **other_html_attrs)
+ return _pin_output(single_input_return, scope, position)
+
+
+def put_textarea(name, *, label='', rows=6, code=None, maxlength=None, minlength=None, value=None, placeholder=None,
+ readonly=None, help_text=None, scope=None, position=OutputPosition.BOTTOM, **other_html_attrs) -> Output:
+ """Output a textarea widget. Refer to: `pywebio.input.textarea()`"""
+ from pywebio.input import textarea
+ check_dom_name_value(name, 'pin `name`')
+ single_input_return = textarea(
+ name=name, label=label, rows=rows, code=code, maxlength=maxlength,
+ minlength=minlength, value=value, placeholder=placeholder, readonly=readonly, help_text=help_text, **other_html_attrs)
+ return _pin_output(single_input_return, scope, position)
+
+
+def put_select(name, options=None, *, label='', multiple=None, value=None, help_text=None,
+ scope=None, position=OutputPosition.BOTTOM, **other_html_attrs) -> Output:
+ """Output a select widget. Refer to: `pywebio.input.select()`"""
+ from pywebio.input import select
+ check_dom_name_value(name, 'pin `name`')
+ single_input_return = select(name=name, options=options, label=label, multiple=multiple,
+ value=value, help_text=help_text, **other_html_attrs)
+ return _pin_output(single_input_return, scope, position)
+
+
+def put_checkbox(name, options=None, *, label='', inline=None, value=None, help_text=None,
+ scope=None, position=OutputPosition.BOTTOM, **other_html_attrs) -> Output:
+ """Output a checkbox widget. Refer to: `pywebio.input.checkbox()`"""
+ from pywebio.input import checkbox
+ check_dom_name_value(name, 'pin `name`')
+ single_input_return = checkbox(name=name, options=options, label=label, inline=inline, value=value,
+ help_text=help_text, **other_html_attrs)
+ return _pin_output(single_input_return, scope, position)
\ No newline at end of file
diff --git a/module/webui/process_manager.py b/module/webui/process_manager.py
new file mode 100644
index 0000000..60b2d1a
--- /dev/null
+++ b/module/webui/process_manager.py
@@ -0,0 +1,204 @@
+import argparse
+import os
+import queue
+import threading
+from multiprocessing import Process
+from typing import Dict, List, Union
+
+from filelock import FileLock
+from module.config.utils import filepath_config
+from module.logger import logger, set_file_logger, set_func_logger
+from module.webui.fake import get_config_mod, mod_instance
+from module.webui.setting import State
+from rich.console import Console, ConsoleRenderable
+
+
+class ProcessManager:
+ _processes: Dict[str, "ProcessManager"] = {}
+
+ def __init__(self, config_name: str = "alas") -> None:
+ self.config_name = config_name
+ self._renderable_queue: queue.Queue[ConsoleRenderable] = State.manager.Queue()
+ self.renderables: List[ConsoleRenderable] = []
+ self.renderables_max_length = 400
+ self.renderables_reduce_length = 80
+ self._process: Process = None
+ self.thd_log_queue_handler: threading.Thread = None
+
+ def start(self, func, ev: threading.Event = None) -> None:
+ if not self.alive:
+ if func is None:
+ func = get_config_mod(self.config_name)
+ self._process = Process(
+ target=ProcessManager.run_process,
+ args=(
+ self.config_name,
+ func,
+ self._renderable_queue,
+ ev,
+ ),
+ )
+ self._process.start()
+ self.start_log_queue_handler()
+
+ def start_log_queue_handler(self):
+ if (
+ self.thd_log_queue_handler is not None
+ and self.thd_log_queue_handler.is_alive()
+ ):
+ return
+ self.thd_log_queue_handler = threading.Thread(
+ target=self._thread_log_queue_handler
+ )
+ self.thd_log_queue_handler.start()
+
+ def stop(self) -> None:
+ lock = FileLock(f"{filepath_config(self.config_name)}.lock")
+ with lock:
+ if self.alive:
+ self._process.kill()
+ self.renderables.append(
+ f"[{self.config_name}] exited. Reason: Manual stop\n"
+ )
+ if self.thd_log_queue_handler is not None:
+ self.thd_log_queue_handler.join(timeout=1)
+ if self.thd_log_queue_handler.is_alive():
+ logger.warning(
+ "Log queue handler thread does not stop within 1 seconds"
+ )
+ logger.info(f"[{self.config_name}] exited")
+
+ def _thread_log_queue_handler(self) -> None:
+ while self.alive:
+ try:
+ log = self._renderable_queue.get(timeout=1)
+ except queue.Empty:
+ continue
+ self.renderables.append(log)
+ if len(self.renderables) > self.renderables_max_length:
+ self.renderables = self.renderables[self.renderables_reduce_length :]
+ logger.info("End of log queue handler loop")
+
+ @property
+ def alive(self) -> bool:
+ if self._process is not None:
+ return self._process.is_alive()
+ else:
+ return False
+
+ @property
+ def state(self) -> int:
+ if self.alive:
+ return 1
+ elif len(self.renderables) == 0:
+ return 2
+ else:
+ console = Console(no_color=True)
+ with console.capture() as capture:
+ console.print(self.renderables[-1])
+ s = capture.get().strip()
+ if s.endswith("Reason: Manual stop"):
+ return 2
+ elif s.endswith("Reason: Finish"):
+ return 2
+ elif s.endswith("Reason: Update"):
+ return 4
+ else:
+ return 3
+
+ @classmethod
+ def get_manager(cls, config_name: str) -> "ProcessManager":
+ """
+ Create a new alas if not exists.
+ """
+ if config_name not in cls._processes:
+ cls._processes[config_name] = ProcessManager(config_name)
+ return cls._processes[config_name]
+
+ @staticmethod
+ def run_process(
+ config_name, func: str, q: queue.Queue, e: threading.Event = None
+ ) -> None:
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "--electron", action="store_true", help="Runs by electron client."
+ )
+ args, _ = parser.parse_known_args()
+ State.electron = args.electron
+
+ # Setup logger
+ set_file_logger(name=config_name)
+ if State.electron:
+ # https://github.com/LmeSzinc/AzurLaneAutoScript/issues/2051
+ logger.info("Electron detected, remove log output to stdout")
+ from module.logger.logger import console_hdlr
+ logger.removeHandler(console_hdlr)
+ set_func_logger(func=q.put)
+
+ from module.config.config import AzurLaneConfig
+
+ AzurLaneConfig.stop_event = e
+ try:
+ # Run alas
+ if func == "alas":
+ from module.alas import AzurLaneAutoScript
+ from aas import ArisuAutoSweeper
+
+ if e is not None:
+ AzurLaneAutoScript.stop_event = e
+ ArisuAutoSweeper(config_name=config_name).loop()
+ else:
+ logger.critical(f"No function matched: {func}")
+ logger.info(f"[{config_name}] exited. Reason: Finish\n")
+ except Exception as e:
+ logger.exception(e)
+
+ @classmethod
+ def running_instances(cls) -> List["ProcessManager"]:
+ l = []
+ for process in cls._processes.values():
+ if process.alive:
+ l.append(process)
+ return l
+
+ @staticmethod
+ def restart_processes(
+ instances: List[Union["ProcessManager", str]] = None, ev: threading.Event = None
+ ):
+ """
+ After update and reload, or failed to perform an update,
+ restart all alas that running before update
+ """
+ logger.hr("Restart alas")
+
+ # Load MOD_CONFIG_DICT
+ mod_instance()
+
+ if instances is None:
+ instances = []
+
+ _instances = set()
+
+ for instance in instances:
+ if isinstance(instance, str):
+ _instances.add(ProcessManager.get_manager(instance))
+ elif isinstance(instance, ProcessManager):
+ _instances.add(instance)
+
+ try:
+ with open("./config/reloadalas", mode="r") as f:
+ for line in f.readlines():
+ line = line.strip()
+ _instances.add(ProcessManager.get_manager(line))
+ except FileNotFoundError:
+ pass
+
+ for process in _instances:
+ logger.info(f"Starting [{process.config_name}]")
+ process.start(func=get_config_mod(process.config_name), ev=ev)
+
+ try:
+ os.remove("./config/reloadalas")
+ except:
+ pass
+ logger.info("Start alas complete")
diff --git a/module/webui/remote_access.py b/module/webui/remote_access.py
new file mode 100644
index 0000000..163cbd1
--- /dev/null
+++ b/module/webui/remote_access.py
@@ -0,0 +1,230 @@
+"""
+Copy from pywebio.platform.remote_access
+
+* Implementation of remote access
+Use https://github.com/wang0618/localshare service by running a ssh subprocess in PyWebIO application.
+
+The stdout of ssh process is the connection info.
+
+
+"""
+
+import json
+import shlex
+import threading
+import time
+from subprocess import PIPE, Popen
+from typing import TYPE_CHECKING
+
+from module.logger import logger
+from module.config.utils import random_id
+from module.webui.setting import State
+
+if TYPE_CHECKING:
+ from module.webui.utils import TaskHandler
+
+_ssh_process: Popen = None
+_ssh_thread: threading.Thread = None
+_ssh_notfound: bool = False
+address: str = None
+
+
+def am_i_the_only_thread() -> bool:
+ """Whether the current thread is the only non-Daemon threads in the process"""
+ alive_none_daemonic_thread_cnt = sum(
+ 1
+ for t in threading.enumerate()
+ if t.is_alive() and not t.isDaemon() or t is threading.current_thread()
+ )
+ return alive_none_daemonic_thread_cnt == 1
+
+
+def remote_access_service(
+ local_host="127.0.0.1",
+ local_port=22367,
+ server="app.pywebio.online",
+ server_port=1022,
+ remote_port="/",
+ setup_timeout=60,
+):
+ """
+ Wait at most one minute to get the ssh output, if it gets a normal out, the connection is successfully established.
+ Otherwise report error and kill ssh process.
+
+ :param local_port: ssh local listen port
+ :param server: ssh server domain
+ :param server_port: ssh server port
+ :param setup_timeout: If the service can't setup successfully in `setup_timeout` seconds, then exit.
+ """
+ global _ssh_process, _ssh_notfound
+
+ bin = State.deploy_config.SSHExecutable
+ cmd = f"{bin} -oStrictHostKeyChecking=no -R {remote_port}:{local_host}:{local_port} -p {server_port} {server} -- --output json"
+ args = shlex.split(cmd)
+ logger.debug(f"remote access service command: {cmd}")
+
+ if _ssh_process is not None and _ssh_process.poll() is None:
+ logger.warning(f"Kill previous ssh process [{_ssh_process.pid}]")
+ _ssh_process.kill()
+ try:
+ _ssh_process = Popen(args, stdout=PIPE, stderr=PIPE)
+ except FileNotFoundError as e:
+ logger.critical(
+ f"Cannot find SSH executable {bin}, please install OpenSSH or specify SSHExecutable in deploy.yaml"
+ )
+ _ssh_notfound = True
+ return
+ logger.info(f"remote access process pid: {_ssh_process.pid}")
+ success = False
+
+ def timeout_killer(wait_sec):
+ time.sleep(wait_sec)
+ if not success and _ssh_process.poll() is None:
+ logger.info("Connection timeout, kill ssh process")
+ _ssh_process.kill()
+
+ threading.Thread(
+ target=timeout_killer, kwargs=dict(wait_sec=setup_timeout), daemon=True
+ ).start()
+
+ stdout = _ssh_process.stdout.readline().decode("utf8")
+ logger.debug(f"ssh server stdout: {stdout}")
+ connection_info = {}
+ try:
+ connection_info = json.loads(stdout)
+ success = True
+ except json.decoder.JSONDecodeError:
+ if not success and _ssh_process.poll() is None:
+ _ssh_process.kill()
+
+ if success:
+ if connection_info.get("status", "fail") != "success":
+ logger.info(
+ f"Failed to establish remote access, this is the error message from service provider: {connection_info.get('message', '')}"
+ )
+ new_username = connection_info.get("change_username", None)
+ if new_username:
+ logger.info(f"Server requested to change username, change it to: {new_username}")
+ State.deploy_config.SSHUser = new_username
+ else:
+ global address
+ address = connection_info["address"]
+ logger.debug(f"Remote access url: {address}")
+
+ # wait ssh or main thread exit
+ while not am_i_the_only_thread() and _ssh_process.poll() is None:
+ # while _ssh_process.poll() is None:
+ time.sleep(1)
+
+ if _ssh_process.poll() is None: # main thread exit, kill ssh process
+ logger.info("App process exit, killing ssh process")
+ _ssh_process.kill()
+ else: # ssh process exit by itself or by timeout killer
+ stderr = _ssh_process.stderr.read().decode("utf8")
+ if stderr:
+ logger.error(f"PyWebIO application remote access service error: {stderr}")
+ else:
+ logger.info("PyWebIO application remote access service exit.")
+ address = None
+
+
+def start_remote_access_service_(**kwargs):
+ logger.info("Start remote access service")
+ try:
+ remote_access_service(**kwargs)
+ except KeyboardInterrupt: # ignore KeyboardInterrupt
+ pass
+ except Exception as e:
+ logger.exception(e)
+ finally:
+ if _ssh_process:
+ logger.info("Exception occurred, killing ssh process")
+ _ssh_process.kill()
+ logger.info("Exit remote access service thread")
+
+
+class ParseError(Exception):
+ pass
+
+
+def start_remote_access_service(**kwagrs):
+ global _ssh_thread
+
+ try:
+ server, server_port = State.deploy_config.SSHServer.split(":")
+ except (ValueError, AttributeError):
+ raise ParseError(
+ f"Failed to parse SSH server [{State.deploy_config.SSHServer}]"
+ )
+ if State.deploy_config.WebuiHost == "0.0.0.0":
+ local_host = "127.0.0.1"
+ elif State.deploy_config.WebuiHost == "::":
+ local_host = "[::1]"
+ else:
+ local_host = State.deploy_config.WebuiHost
+
+ if State.deploy_config.SSHUser is None:
+ logger.info("SSHUser is not set, generate a random one")
+ State.deploy_config.SSHUser = random_id(24)
+
+ server = f"{State.deploy_config.SSHUser}@{server}"
+ kwagrs.setdefault("server", server)
+ kwagrs.setdefault("server_port", server_port)
+ kwagrs.setdefault("local_host", local_host)
+ kwagrs.setdefault("local_port", State.deploy_config.WebuiPort)
+
+ _ssh_thread = threading.Thread(
+ target=start_remote_access_service_,
+ kwargs=kwagrs,
+ daemon=False,
+ )
+ _ssh_thread.start()
+ return _ssh_thread
+
+
+class RemoteAccess:
+ @staticmethod
+ def keep_ssh_alive():
+ task_handler: TaskHandler
+ task_handler = yield
+ while True:
+ if _ssh_thread is not None and _ssh_thread.is_alive():
+ yield
+ continue
+ logger.info("Remote access service is not running, starting now")
+ try:
+ start_remote_access_service()
+ except ParseError as e:
+ logger.exception(e)
+ task_handler.remove_current_task()
+ yield
+
+ @staticmethod
+ def kill_ssh_process():
+ if RemoteAccess.is_alive():
+ _ssh_process.kill()
+
+ @staticmethod
+ def is_alive():
+ return (
+ _ssh_thread is not None
+ and _ssh_thread.is_alive()
+ and _ssh_process is not None
+ and _ssh_process.poll() is None
+ )
+
+ @staticmethod
+ def get_state():
+ if RemoteAccess.is_alive():
+ if address is not None:
+ return 1
+ else:
+ return 2
+ elif _ssh_notfound:
+ return 3
+ else:
+ return 0
+
+ @staticmethod
+ def get_entry_point():
+ return address if RemoteAccess.is_alive() else None
diff --git a/module/webui/setting.py b/module/webui/setting.py
new file mode 100644
index 0000000..1a814d5
--- /dev/null
+++ b/module/webui/setting.py
@@ -0,0 +1,91 @@
+import multiprocessing
+import threading
+from multiprocessing.managers import SyncManager
+from typing import TYPE_CHECKING, Callable, Generic, TypeVar
+
+if TYPE_CHECKING:
+ from module.config.config_updater import ConfigUpdater
+ from module.webui.config import DeployConfig
+
+T = TypeVar("T")
+
+
+class cached_class_property(Generic[T]):
+ """
+ Code from https://github.com/dssg/dickens
+ Add typing support
+
+ Descriptor decorator implementing a class-level, read-only
+ property, which caches its results on the class(es) on which it
+ operates.
+ Inheritance is supported, insofar as the descriptor is never hidden
+ by its cache; rather, it stores values under its access name with
+ added underscores. For example, when wrapping getters named
+ "choices", "choices_" or "_choices", each class's result is stored
+ on the class at "_choices_"; decoration of a getter named
+ "_choices_" would raise an exception.
+ """
+
+ class AliasConflict(ValueError):
+ pass
+
+ def __init__(self, func: Callable[..., T]):
+ self.__func__ = func
+ self.__cache_name__ = '_{}_'.format(func.__name__.strip('_'))
+ if self.__cache_name__ == func.__name__:
+ raise self.AliasConflict(self.__cache_name__)
+
+ def __get__(self, instance, cls=None) -> T:
+ if cls is None:
+ cls = type(instance)
+
+ try:
+ return vars(cls)[self.__cache_name__]
+ except KeyError:
+ result = self.__func__(cls)
+ setattr(cls, self.__cache_name__, result)
+ return result
+
+
+class State:
+ """
+ Shared settings
+ """
+
+ _init = False
+ _clearup = False
+
+ restart_event: threading.Event = None
+ manager: SyncManager = None
+ electron: bool = False
+ theme: str = "default"
+
+ @classmethod
+ def init(cls):
+ cls.manager = multiprocessing.Manager()
+ cls._init = True
+
+ @classmethod
+ def clearup(cls):
+ cls.manager.shutdown()
+ cls._clearup = True
+
+ @cached_class_property
+ def deploy_config(self) -> "DeployConfig":
+ """
+ Returns:
+ DeployConfig:
+ """
+ from module.webui.config import DeployConfig
+
+ return DeployConfig()
+
+ @cached_class_property
+ def config_updater(self) -> "ConfigUpdater":
+ """
+ Returns:
+ ConfigUpdater:
+ """
+ from module.config.config_updater import ConfigUpdater
+
+ return ConfigUpdater()
diff --git a/module/webui/translate.py b/module/webui/translate.py
new file mode 100644
index 0000000..7953673
--- /dev/null
+++ b/module/webui/translate.py
@@ -0,0 +1,231 @@
+# This module is a ton of shit
+# you'd better close right now
+from pywebio.input import (actions, checkbox, input, input_group, input_update,
+ select)
+from pywebio.output import put_buttons, put_markdown
+from pywebio.session import defer_call, hold, run_js, set_env
+
+import module.webui.lang as lang
+from module.config.utils import (LANGUAGES, deep_get, deep_iter, deep_set,
+ filepath_i18n, read_file, write_file)
+
+
+def translate():
+ """
+ Translate Alas
+ """
+ set_env(output_animation=False)
+ run_js(r"""$('head').append('')""")
+
+ put_markdown("""
+ # Translate
+ You can submit(Next) by press `Enter`.
+ """)
+
+ dict_lang = {
+ "zh-CN": read_file(filepath_i18n('zh-CN')),
+ "zh-TW": read_file(filepath_i18n('zh-TW')),
+ "en-US": read_file(filepath_i18n('en-US')),
+ "ja-JP": read_file(filepath_i18n('ja-JP')),
+ }
+ modified = {
+ "zh-CN": {},
+ "zh-TW": {},
+ "en-US": {},
+ "ja-JP": {},
+ }
+
+ list_path = [] # Menu.Task.name
+ list_group = [] # Menu
+ list_arg = [] # Task
+ list_key = [] # name
+ for L, _ in deep_iter(dict_lang['zh-CN'], depth=3):
+ list_path.append('.'.join(L))
+ list_group.append(L[0])
+ list_arg.append(L[1])
+ list_key.append(L[2])
+ total = len(list_path)
+
+ class V:
+ lang = lang.LANG
+ untranslated_only = False
+ clear = False
+
+ idx = -1
+ group = ''
+ group_idx = 0
+ groups = list(dict_lang['zh-CN'].keys())
+ arg = ''
+ arg_idx = 0
+ args = []
+ key = ''
+ key_idx = 0
+ keys = []
+
+ def update_var(group=None, arg=None, key=None):
+ if group:
+ V.group = group
+ V.idx = list_group.index(group)
+ V.group_idx = V.idx
+ V.arg = list_arg[V.idx]
+ V.arg_idx = V.idx
+ V.args = list(dict_lang["zh-CN"][V.group].keys())
+ V.key = list_key[V.idx]
+ V.key_idx = V.idx
+ V.keys = list(dict_lang["zh-CN"][V.group][V.arg].keys())
+ elif arg:
+ V.arg = arg
+ V.idx = list_arg.index(arg, V.group_idx)
+ V.arg_idx = V.idx
+ V.args = list(dict_lang["zh-CN"][V.group].keys())
+ V.key = list_key[V.idx]
+ V.key_idx = V.idx
+ V.keys = list(dict_lang["zh-CN"][V.group][V.arg].keys())
+ elif key:
+ V.key = key
+ V.idx = list_key.index(key, V.arg_idx)
+ V.key_idx = V.idx
+ V.keys = list(dict_lang["zh-CN"][V.group][V.arg].keys())
+
+ update_form()
+
+ def next_key():
+ if V.idx + 1 > total:
+ V.idx = -1
+
+ V.idx += 1
+
+ if V.untranslated_only:
+ while True:
+ # print(V.idx)
+ key = deep_get(dict_lang[V.lang], list_path[V.idx])
+ if list_path[V.idx] == key or list_path[V.idx].split('.')[2] == key:
+ break
+ else:
+ V.idx += 1
+ if V.idx + 1 > total:
+ V.idx = 0
+ break
+
+ (V.group, V.arg, V.key) = tuple(list_path[V.idx].split('.'))
+ V.group_idx = list_group.index(V.group)
+ V.arg_idx = list_arg.index(V.arg, V.group_idx)
+ V.args = list(dict_lang["zh-CN"][V.group].keys())
+ V.key_idx = list_key.index(V.key, V.arg_idx)
+ V.keys = list(dict_lang["zh-CN"][V.group][V.arg].keys())
+
+ def update_form():
+ input_update('arg', options=V.args, value=V.arg)
+ input_update('key', options=V.keys, value=V.key)
+ for L in LANGUAGES:
+ input_update(L, value=deep_get(
+ dict_lang[L], f'{V.group}.{V.arg}.{V.key}', 'Key not found!'))
+
+ old = deep_get(dict_lang[V.lang],
+ f'{V.group}.{V.arg}.{V.key}', 'Key not found!')
+ input_update(V.lang,
+ value=None if V.clear else old,
+ help_text=f'{V.group}.{V.arg}.{V.key}',
+ placeholder=old,
+ )
+
+ def get_inputs():
+ out = []
+ old = deep_get(dict_lang[V.lang],
+ f'{V.group}.{V.arg}.{V.key}', 'Key not found!')
+ out.append(
+ input(
+ name=V.lang,
+ label=V.lang,
+ value=None if V.clear else old,
+ help_text=f'{V.group}.{V.arg}.{V.key}',
+ placeholder=old,
+ )
+ )
+ out.append(
+ select(name='group', label='Group', options=V.groups, value=V.group,
+ onchange=lambda g: update_var(group=g), required=True)
+ )
+ out.append(
+ select(name='arg', label='Arg', options=V.args, value=V.arg,
+ onchange=lambda a: update_var(arg=a), required=True)
+ )
+ out.append(
+ select(name='key', label='Key', options=V.keys, value=V.key,
+ onchange=lambda k: update_var(key=k), required=True)
+ )
+ _LANGUAGES = LANGUAGES.copy()
+ _LANGUAGES.remove(V.lang)
+ for L in _LANGUAGES:
+ out.append(
+ input(name=L, label=L, readonly=True, value=deep_get(
+ dict_lang[L], f'{V.group}.{V.arg}.{V.key}', 'Key not found!'))
+ )
+ out.append(
+ actions(name='action', buttons=[
+ {"label": "Next", "value": 'Next',
+ "type": "submit", "color": "success"},
+ {"label": "Next without save", "value": 'Skip',
+ "type": "submit", "color": "secondary"},
+ {"label": "Submit", "value": "Submit",
+ "type": "submit", "color": "primary"},
+ {"label": "Quit and save", "type": "cancel", "color": "secondary"},
+ ])
+ )
+
+ return out
+
+ def save():
+ for LANG in LANGUAGES:
+ d = read_file(filepath_i18n(LANG))
+ for k in modified[LANG].keys():
+ deep_set(d, k, modified[LANG][k])
+ write_file(filepath_i18n(LANG), d)
+ defer_call(save)
+
+ def loop():
+ while True:
+ data = input_group(inputs=get_inputs())
+ if data is None:
+ save()
+ break
+
+ if data['action'] == 'Next':
+
+ modified[V.lang][f'{V.group}.{V.arg}.{V.key}'] = data[V.lang].replace(
+ "\\n", "\n")
+ deep_set(dict_lang[V.lang], f'{V.group}.{V.arg}.{V.key}', data[V.lang].replace(
+ "\\n", "\n"))
+ next_key()
+ if data['action'] == 'Skip':
+ next_key()
+ elif data['action'] == 'Submit':
+
+ modified[V.lang][f'{V.group}.{V.arg}.{V.key}'] = data[V.lang].replace(
+ "\\n", "\n")
+ deep_set(dict_lang[V.lang], f'{V.group}.{V.arg}.{V.key}', data[V.lang].replace(
+ "\\n", "\n"))
+ continue
+
+ def setting():
+ data = input_group(inputs=[
+ select(name='language', label='Language',
+ options=LANGUAGES, value=V.lang, required=True),
+ checkbox(name='check', label='Other settings', options=[
+ {"label": 'Button [Next] only shows untranslated key',
+ 'value': 'untranslated', 'selected': V.untranslated_only},
+ {"label": 'Do not fill input with old value (only effect the language you selected)',
+ "value": "clear", "selected": V.clear}
+ ])
+ ])
+ V.lang = data['language']
+ V.untranslated_only = True if 'untranslated' in data['check'] else False
+ V.clear = True if 'clear' in data['check'] else False
+
+ put_buttons([
+ {"label": "Start", "value": "start"},
+ {"label": "Setting", "value": "setting"}
+ ], onclick=[loop, setting])
+ next_key()
+ setting()
+ hold()
diff --git a/module/webui/updater.py b/module/webui/updater.py
new file mode 100644
index 0000000..5c60b24
--- /dev/null
+++ b/module/webui/updater.py
@@ -0,0 +1,309 @@
+import datetime
+import subprocess
+import threading
+import time
+from typing import Generator, List, Tuple
+
+import requests
+from deploy.Windows.config import ExecutionError
+from deploy.Windows.git import GitManager
+from deploy.Windows.pip import PipManager
+from deploy.Windows.utils import DEPLOY_CONFIG
+from module.base.retry import retry
+from module.logger import logger
+from module.webui.config import DeployConfig
+from module.webui.process_manager import ProcessManager
+from module.webui.setting import State
+from module.webui.utils import TaskHandler, get_next_time
+
+
+class Updater(DeployConfig, GitManager, PipManager):
+ def __init__(self, file=DEPLOY_CONFIG):
+ super().__init__(file=file)
+ self.state = 0
+ self.event: threading.Event = None
+
+ @property
+ def delay(self):
+ self.read()
+ return int(self.CheckUpdateInterval) * 60
+
+ @property
+ def schedule_time(self):
+ self.read()
+ t = self.AutoRestartTime
+ if t is not None:
+ return datetime.time.fromisoformat(t)
+ else:
+ return None
+
+ def execute_output(self, command) -> str:
+ command = command.replace(r"\\", "/").replace("\\", "/").replace('"', '"')
+ log = subprocess.run(
+ command, capture_output=True, text=True, encoding="utf8", shell=True
+ ).stdout
+ return log
+
+ def get_commit(self, revision="", n=1, short_sha1=False) -> Tuple:
+ """
+ Return:
+ (sha1, author, isotime, message,)
+ """
+ ph = "h" if short_sha1 else "H"
+
+ log = self.execute_output(
+ f'"{self.git}" log {revision} --pretty=format:"%{ph}---%an---%ad---%s" --date=iso -{n}'
+ )
+
+ if not log:
+ return None, None, None, None
+
+ logs = log.split("\n")
+ logs = list(map(lambda log: tuple(log.split("---")), logs))
+
+ if n == 1:
+ return logs[0]
+ else:
+ return logs
+
+ def _check_update(self) -> bool:
+ self.state = "checking"
+
+ if State.deploy_config.GitOverCdn:
+ status = self.goc_client.get_status()
+ if status == "uptodate":
+ logger.info(f"No update")
+ return False
+ elif status == "behind":
+ logger.info(f"New update available")
+ return True
+ else:
+ # failed, should fallback to `git pull`
+ pass
+
+ source = "origin"
+ for _ in range(3):
+ if self.execute(
+ f'"{self.git}" fetch {source} {self.Branch}', allow_failure=True
+ ):
+ break
+ else:
+ logger.warning("Git fetch failed")
+ return False
+
+ log = self.execute_output(
+ f'"{self.git}" log --not --remotes={source}/* -1 --oneline'
+ )
+ if log:
+ logger.info(
+ f"Cannot find local commit {log.split()[0]} in upstream, skip update"
+ )
+ return False
+
+ sha1, _, _, message = self.get_commit(f"..{source}/{self.Branch}")
+
+ if sha1:
+ logger.info(f"New update available")
+ logger.info(f"{sha1[:8]} - {message}")
+ return True
+ else:
+ logger.info(f"No update")
+ return False
+
+ def _check_update_(self) -> bool:
+ """
+ Deprecated
+ """
+ self.state = "checking"
+ r = self.Repository.split("/")
+ owner = r[3]
+ repo = r[4]
+ if "gitee" in r[2]:
+ base = "https://gitee.com/api/v5/repos/"
+ headers = {}
+ token = self.config["ApiToken"]
+ if token:
+ para = {"access_token": token}
+ else:
+ base = "https://api.github.com/repos/"
+ headers = {"Accept": "application/vnd.github.v3.sha"}
+ para = {}
+ token = self.config["ApiToken"]
+ if token:
+ headers["Authorization"] = "token " + token
+
+ try:
+ list_commit = requests.get(
+ base + f"{owner}/{repo}/branches/{self.Branch}",
+ headers=headers,
+ params=para,
+ )
+ except Exception as e:
+ logger.exception(e)
+ logger.warning("Check update failed")
+ return 0
+
+ if list_commit.status_code != 200:
+ logger.warning(f"Check update failed, code {list_commit.status_code}")
+ return 0
+ try:
+ sha = list_commit.json()["commit"]["sha"]
+ except Exception as e:
+ logger.exception(e)
+ logger.warning("Check update failed when parsing return json")
+ return 0
+
+ local_sha, _, _, _ = self._get_local_commit()
+
+ if sha == local_sha:
+ logger.info("No update")
+ return 0
+
+ try:
+ get_commit = requests.get(
+ base + f"{owner}/{repo}/commits/" + local_sha,
+ headers=headers,
+ params=para,
+ )
+ except Exception as e:
+ logger.exception(e)
+ logger.warning("Check update failed")
+ return 0
+
+ if get_commit.status_code != 200:
+ # for develops
+ logger.info(
+ f"Cannot find local commit {local_sha[:8]} in upstream, skip update"
+ )
+ return 0
+
+ logger.info(f"Update {sha[:8]} available")
+ return 1
+
+ def check_update(self):
+ if self.state in (0, "failed", "finish"):
+ self.state = self._check_update()
+
+ @retry(ExecutionError, tries=3, delay=5, logger=None)
+ def git_install(self):
+ return super().git_install()
+
+ @retry(ExecutionError, tries=3, delay=5, logger=None)
+ def pip_install(self):
+ return super().pip_install()
+
+ def update(self):
+ logger.hr("Run update")
+ try:
+ self.git_install()
+ self.pip_install()
+ except ExecutionError:
+ return False
+ return True
+
+ def run_update(self):
+ if self.state not in ("failed", 0, 1):
+ return
+ self._start_update()
+
+ def _start_update(self):
+ self.state = "start"
+ instances = ProcessManager.running_instances()
+ names = []
+ for alas in instances:
+ names.append(alas.config_name + "\n")
+
+ logger.info("Waiting all running alas finish.")
+ self._wait_update(instances, names)
+
+ def _wait_update(self, instances: List[ProcessManager], names):
+ if self.state == "cancel":
+ self.state = 1
+ self.state = "wait"
+ self.event.set()
+ _instances = instances.copy()
+ start_time = time.time()
+ while _instances:
+ for alas in _instances:
+ if not alas.alive:
+ _instances.remove(alas)
+ logger.info(f"Alas [{alas.config_name}] stopped")
+ logger.info(f"Remains: {[alas.config_name for alas in _instances]}")
+ if self.state == "cancel":
+ self.state = 1
+ self.event.clear()
+ ProcessManager.restart_processes(instances, self.event)
+ return
+ time.sleep(0.25)
+ if time.time() - start_time > 60 * 10:
+ logger.warning("Waiting alas shutdown timeout, force kill")
+ for alas in _instances:
+ alas.stop()
+ break
+ self._run_update(instances, names)
+
+ def _run_update(self, instances, names):
+ self.state = "run update"
+ logger.info("All alas stopped, start updating")
+
+ if self.update():
+ if State.restart_event is not None:
+ self.state = "reload"
+ with open("./config/reloadalas", mode="w") as f:
+ f.writelines(names)
+ from module.webui.app import clearup
+
+ self._trigger_reload(2)
+ clearup()
+ else:
+ self.state = "finish"
+ else:
+ self.state = "failed"
+ logger.warning("Update failed")
+ self.event.clear()
+ ProcessManager.restart_processes(instances, self.event)
+ return False
+
+ @staticmethod
+ def _trigger_reload(delay=2):
+ def trigger():
+ # with open("./config/reloadflag", mode="w"):
+ # # app ended here and uvicorn will restart whole app
+ # pass
+ State.restart_event.set()
+
+ timer = threading.Timer(delay, trigger)
+ timer.start()
+
+ def schedule_update(self) -> Generator:
+ th: TaskHandler
+ th = yield
+ if self.schedule_time is None:
+ th.remove_current_task()
+ yield
+ th._task.delay = get_next_time(self.schedule_time)
+ yield
+ while True:
+ self.check_update()
+ if self.state != 1:
+ th._task.delay = get_next_time(self.schedule_time)
+ yield
+ continue
+ if State.restart_event is None:
+ yield
+ continue
+ if not self.run_update():
+ self.state = "failed"
+ th._task.delay = get_next_time(self.schedule_time)
+ yield
+
+ def cancel(self):
+ self.state = "cancel"
+
+
+updater = Updater()
+
+if __name__ == "__main__":
+ pass
+ # if updater.check_update():
+ updater.update()
diff --git a/module/webui/utils.py b/module/webui/utils.py
new file mode 100644
index 0000000..7cd3a35
--- /dev/null
+++ b/module/webui/utils.py
@@ -0,0 +1,555 @@
+import datetime
+import operator
+import re
+import sys
+import threading
+import time
+import traceback
+from queue import Queue
+from typing import Callable, Generator, List
+
+import pywebio
+from module.config.utils import deep_iter
+from module.logger import logger
+from module.webui.setting import State
+from pywebio.input import PASSWORD, input
+from pywebio.output import PopupSize, popup, put_html, toast
+from pywebio.session import eval_js
+from pywebio.session import info as session_info
+from pywebio.session import register_thread, run_js
+from rich.console import Console, ConsoleOptions
+from rich.terminal_theme import TerminalTheme
+
+
+RE_DATETIME = (
+ r"\d{4}\-(0\d|1[0-2])\-([0-2]\d|[3][0-1]) "
+ r"([0-1]\d|[2][0-3]):([0-5]\d):([0-5]\d)"
+)
+
+
+TRACEBACK_CODE_FORMAT = """\
+
+ {code}
+
+"""
+
+LOG_CODE_FORMAT = "{code}"
+
+DARK_TERMINAL_THEME = TerminalTheme(
+ (30, 30, 30), # Background
+ (204, 204, 204), # Foreground
+ [
+ (0, 0, 0), # Black
+ (205, 49, 49), # Red
+ (13, 188, 121), # Green
+ (229, 229, 16), # Yellow
+ (36, 114, 200), # Blue
+ (188, 63, 188), # Purple / Magenta
+ (17, 168, 205), # Cyan
+ (229, 229, 229), # White
+ ],
+ [ # Bright
+ (102, 102, 102), # Black
+ (241, 76, 76), # Red
+ (35, 209, 139), # Green
+ (245, 245, 67), # Yellow
+ (59, 142, 234), # Blue
+ (214, 112, 214), # Purple / Magenta
+ (41, 184, 219), # Cyan
+ (229, 229, 229), # White
+ ],
+)
+
+LIGHT_TERMINAL_THEME = TerminalTheme(
+ (255, 255, 255), # Background
+ (97, 97, 97), # Foreground
+ [
+ (0, 0, 0), # Black
+ (205, 49, 49), # Red
+ (0, 188, 0), # Green
+ (148, 152, 0), # Yellow
+ (4, 81, 165), # Blue
+ (188, 5, 188), # Purple / Magenta
+ (5, 152, 188), # Cyan
+ (85, 85, 85), # White
+ ],
+ [ # Bright
+ (102, 102, 102), # Black
+ (205, 49, 49), # Red
+ (20, 206, 20), # Green
+ (181, 186, 0), # Yellow
+ (4, 81, 165), # Blue
+ (188, 5, 188), # Purple / Magenta
+ (5, 152, 188), # Cyan
+ (165, 165, 165), # White
+ ],
+)
+
+
+class QueueHandler:
+ def __init__(self, q: Queue) -> None:
+ self.queue = q
+
+ def write(self, s: str):
+ self.queue.put(s)
+
+
+class Task:
+ def __init__(
+ self, g: Generator, delay: float, next_run: float = None, name: str = None
+ ) -> None:
+ self.g = g
+ g.send(None)
+ self.delay = delay
+ self.next_run = next_run if next_run else time.time()
+ self.name = name if name is not None else self.g.__name__
+
+ def __str__(self) -> str:
+ return f"<{self.name} (delay={self.delay})>"
+
+ def __next__(self) -> None:
+ return next(self.g)
+
+ def send(self, obj) -> None:
+ return self.g.send(obj)
+
+ __repr__ = __str__
+
+
+class TaskHandler:
+ def __init__(self) -> None:
+ # List of background running task
+ self.tasks: List[Task] = []
+ # List of task name to be removed
+ self.pending_remove_tasks: List[Task] = []
+ # Running task
+ self._task = None
+ # Task running thread
+ self._thread: threading.Thread = None
+ self._alive = False
+ self._lock = threading.Lock()
+
+ def add(self, func, delay: float, pending_delete: bool = False) -> None:
+ """
+ Add a task running background.
+ Another way of `self.add_task()`.
+ func: Callable or Generator
+ """
+ if isinstance(func, Callable):
+ g = get_generator(func)
+ elif isinstance(func, Generator):
+ g = func
+ self.add_task(Task(g, delay), pending_delete=pending_delete)
+
+ def add_task(self, task: Task, pending_delete: bool = False) -> None:
+ """
+ Add a task running background.
+ """
+ if task in self.tasks:
+ logger.warning(f"Task {task} already in tasks list.")
+ return
+ logger.info(f"Add task {task}")
+ with self._lock:
+ self.tasks.append(task)
+ if pending_delete:
+ self.pending_remove_tasks.append(task)
+
+ def _remove_task(self, task: Task) -> None:
+ if task in self.tasks:
+ self.tasks.remove(task)
+ logger.info(f"Task {task} removed.")
+ else:
+ logger.warning(
+ f"Failed to remove task {task}. Current tasks list: {self.tasks}"
+ )
+
+ def remove_task(self, task: Task, nowait: bool = False) -> None:
+ """
+ Remove a task in `self.tasks`.
+ Args:
+ task:
+ nowait: if True, remove it right now,
+ otherwise remove when call `self.remove_pending_task`
+ """
+ if nowait:
+ with self._lock:
+ self._remove_task(task)
+ else:
+ self.pending_remove_tasks.append(task)
+
+ def remove_pending_task(self) -> None:
+ """
+ Remove all pending remove tasks.
+ """
+ with self._lock:
+ for task in self.pending_remove_tasks:
+ self._remove_task(task)
+ self.pending_remove_tasks = []
+
+ def remove_current_task(self) -> None:
+ self.remove_task(self._task, nowait=True)
+
+ def get_task(self, name) -> Task:
+ with self._lock:
+ for task in self.tasks:
+ if task.name == name:
+ return task
+ return None
+
+ def loop(self) -> None:
+ """
+ Start task loop.
+ You **should** run this function in an individual thread.
+ """
+ self._alive = True
+ while self._alive:
+ if self.tasks:
+ with self._lock:
+ self.tasks.sort(key=operator.attrgetter("next_run"))
+ task = self.tasks[0]
+ if task.next_run < time.time():
+ start_time = time.time()
+ try:
+ self._task = task
+ # logger.debug(f'Start task {task.g.__name__}')
+ task.send(self)
+ # logger.debug(f'End task {task.g.__name__}')
+ except Exception as e:
+ logger.exception(e)
+ self.remove_task(task, nowait=True)
+ finally:
+ self._task = None
+ end_time = time.time()
+ task.next_run += task.delay
+ with self._lock:
+ for task in self.tasks:
+ task.next_run += end_time - start_time
+ else:
+ time.sleep(0.05)
+ else:
+ time.sleep(0.5)
+ logger.info("End of task handler loop")
+
+ def _get_thread(self) -> threading.Thread:
+ thread = threading.Thread(target=self.loop, daemon=True)
+ return thread
+
+ def start(self) -> None:
+ """
+ Start task handler.
+ """
+ logger.info("Start task handler")
+ if self._thread is not None and self._thread.is_alive():
+ logger.warning("Task handler already running!")
+ return
+ self._thread = self._get_thread()
+ self._thread.start()
+
+ def stop(self) -> None:
+ self.remove_pending_task()
+ self._alive = False
+ self._thread.join(timeout=2)
+ if not self._thread.is_alive():
+ logger.info("Finish task handler")
+ else:
+ logger.warning("Task handler does not stop within 2 seconds")
+
+
+class WebIOTaskHandler(TaskHandler):
+ def _get_thread(self) -> threading.Thread:
+ thread = super()._get_thread()
+ register_thread(thread)
+ return thread
+
+
+class Switch:
+ def __init__(self, status, get_state, name=None):
+ """
+ Args:
+ status
+ (dict):A dict describes each state.
+ {
+ 0: {
+ 'func': (Callable)
+ },
+ 1: {
+ 'func'
+ 'args': (Optional, tuple)
+ 'kwargs': (Optional, dict)
+ },
+ 2: [
+ func1,
+ {
+ 'func': func2
+ 'args': args2
+ }
+ ]
+ -1: []
+ }
+ (Callable):current state will pass into this function
+ lambda state: do_update(state=state)
+ get_state:
+ (Callable):
+ return current state
+ (Generator):
+ yield current state, do nothing when state not in status
+ name:
+ """
+ self._lock = threading.Lock()
+ self.name = name
+ self.status = status
+ self.get_state = get_state
+ if isinstance(get_state, Generator):
+ self._generator = get_state
+ elif isinstance(get_state, Callable):
+ self._generator = self._get_state()
+
+ @staticmethod
+ def get_state():
+ pass
+
+ def _get_state(self):
+ """
+ Predefined generator when `get_state` is an callable
+ Customize it if you have multiple criteria on state
+ """
+ _status = self.get_state()
+ yield _status
+ while True:
+ status = self.get_state()
+ if _status != status:
+ _status = status
+ yield _status
+ continue
+ yield -1
+
+ def switch(self):
+ with self._lock:
+ r = next(self._generator)
+ if callable(self.status):
+ self.status(r)
+ elif r in self.status:
+ f = self.status[r]
+ if isinstance(f, (dict, Callable)):
+ f = [f]
+ for d in f:
+ if isinstance(d, Callable):
+ d = {"func": d}
+ func = d["func"]
+ args = d.get("args", tuple())
+ kwargs = d.get("kwargs", dict())
+ func(*args, **kwargs)
+
+ def g(self) -> Generator:
+ g = get_generator(self.switch)
+ if self.name:
+ name = self.name
+ else:
+ name = self.get_state.__name__
+ g.__name__ = f"Switch_{name}_refresh"
+ return g
+
+
+def get_generator(func: Callable):
+ def _g():
+ yield
+ while True:
+ yield func()
+
+ g = _g()
+ g.__name__ = func.__name__
+ return g
+
+
+def filepath_css(filename):
+ return f"./assets/gui/css/{filename}.css"
+
+
+def filepath_icon(filename):
+ return f"./assets/gui/icon/{filename}.svg"
+
+
+def add_css(filepath):
+ with open(filepath, "r") as f:
+ css = f.read().replace("\n", "")
+ run_js(f"""$('head').append('')""")
+
+
+def _read(path):
+ with open(path, "r") as f:
+ return f.read()
+
+
+class Icon:
+ """
+ Storage html of icon.
+ """
+
+ ALAS = _read(filepath_icon("alas"))
+ SETTING = _read(filepath_icon("setting"))
+ RUN = _read(filepath_icon("run"))
+ DEVELOP = _read(filepath_icon("develop"))
+ ADD = _read(filepath_icon("add"))
+
+
+str2type = {
+ "str": str,
+ "float": float,
+ "int": int,
+ "bool": bool,
+ "ignore": lambda x: x,
+}
+
+
+def parse_pin_value(val, valuetype: str = None):
+ """
+ input, textarea return str
+ select return its option (str or int)
+ checkbox return [] or [True] (define in put_checkbox_)
+ """
+ if isinstance(val, list):
+ if len(val) == 0:
+ return False
+ else:
+ return True
+ elif valuetype:
+ return str2type[valuetype](val)
+ elif isinstance(val, (int, float)):
+ return val
+ else:
+ try:
+ v = float(val)
+ except ValueError:
+ return val
+ if v.is_integer():
+ return int(v)
+ else:
+ return v
+
+
+def login(password):
+ if get_localstorage("password") == str(password):
+ return True
+ pwd = input(label="Please login below.", type=PASSWORD, placeholder="PASSWORD")
+ if str(pwd) == str(password):
+ set_localstorage("password", str(pwd))
+ return True
+ else:
+ toast("Wrong password!", color="error")
+ return False
+
+
+def get_window_visibility_state():
+ ret = eval_js("document.visibilityState")
+ return False if ret == "hidden" else True
+
+
+# https://pywebio.readthedocs.io/zh_CN/latest/cookbook.html#cookie-and-localstorage-manipulation
+def set_localstorage(key, value):
+ return run_js("localStorage.setItem(key, value)", key=key, value=value)
+
+
+def get_localstorage(key):
+ return eval_js("localStorage.getItem(key)", key=key)
+
+
+def re_fullmatch(pattern, string):
+ if pattern == "datetime":
+ pattern = RE_DATETIME
+ # elif:
+ return re.fullmatch(pattern=pattern, string=string)
+
+
+def get_next_time(t: datetime.time):
+ now = datetime.datetime.today().time()
+ second = (
+ (t.hour - now.hour) * 3600
+ + (t.minute - now.minute) * 60
+ + (t.second - now.second)
+ )
+ if second < 0:
+ second += 86400
+ return second
+
+
+def on_task_exception(self):
+ logger.exception("An internal error occurred in the application")
+ toast_msg = (
+ "应用发生内部错误"
+ if "zh" in session_info.user_language
+ else "An internal error occurred in the application"
+ )
+
+ e_type, e_value, e_tb = sys.exc_info()
+ lines = traceback.format_exception(e_type, e_value, e_tb)
+ traceback_msg = "".join(lines)
+
+ traceback_console = Console(
+ color_system="truecolor", tab_size=2, record=True, width=90
+ )
+ with traceback_console.capture(): # prevent logging to stdout again
+ traceback_console.print_exception(
+ word_wrap=True, extra_lines=1, show_locals=True
+ )
+
+ if State.theme == "dark":
+ theme = DARK_TERMINAL_THEME
+ else:
+ theme = LIGHT_TERMINAL_THEME
+
+ html = traceback_console.export_html(
+ theme=theme, code_format=TRACEBACK_CODE_FORMAT, inline_styles=True
+ )
+ try:
+ popup(title=toast_msg, content=put_html(html), size=PopupSize.LARGE)
+ run_js(
+ "console.error(traceback_msg)",
+ traceback_msg="Internal Server Error\n" + traceback_msg,
+ )
+ except Exception:
+ pass
+
+
+# Monkey patch
+pywebio.session.base.Session.on_task_exception = on_task_exception
+
+
+def raise_exception(x=3):
+ """
+ For testing purpose
+ """
+ if x > 0:
+ raise_exception(x - 1)
+ else:
+ raise Exception("quq")
+
+
+def get_alas_config_listen_path(args):
+ for path, d in deep_iter(args, depth=3):
+ if d.get("display") in ["readonly", "hide"]:
+ continue
+ yield path
+
+
+if __name__ == "__main__":
+
+ def gen(x):
+ n = 0
+ while True:
+ n += x
+ print(n)
+ yield n
+
+ th = TaskHandler()
+ th.start()
+
+ t1 = Task(gen(1), delay=1)
+ t2 = Task(gen(-2), delay=3)
+
+ th.add_task(t1)
+ th.add_task(t2)
+
+ time.sleep(5)
+ th.remove_task(t2, nowait=True)
+ time.sleep(5)
+ th.stop()
diff --git a/module/webui/widgets.py b/module/webui/widgets.py
new file mode 100644
index 0000000..c14ebc6
--- /dev/null
+++ b/module/webui/widgets.py
@@ -0,0 +1,532 @@
+import copy
+import json
+import random
+import string
+from typing import TYPE_CHECKING, Any, Callable, Dict, Generator, List, Optional, Union
+
+from pywebio.exceptions import SessionException
+from pywebio.io_ctrl import Output
+from pywebio.output import *
+from pywebio.session import eval_js, local, run_js
+from rich.console import ConsoleRenderable
+
+from module.logger import WEB_THEME, Highlighter, HTMLConsole
+from module.webui.lang import t
+from module.webui.pin import put_checkbox, put_input, put_select, put_textarea
+from module.webui.process_manager import ProcessManager
+from module.webui.setting import State
+from module.webui.utils import (
+ DARK_TERMINAL_THEME,
+ LIGHT_TERMINAL_THEME,
+ LOG_CODE_FORMAT,
+ Switch,
+)
+
+if TYPE_CHECKING:
+ from module.webui.app import AlasGUI
+
+
+class ScrollableCode:
+ """
+ https://github.com/pywebio/PyWebIO/discussions/21
+ Deprecated
+ """
+
+ def __init__(self, keep_bottom: bool = True) -> None:
+ self.keep_bottom = keep_bottom
+
+ self.id = "".join(random.choice(string.ascii_letters) for _ in range(10))
+ self.html = (
+ """
"""
+ % self.id
+ )
+
+ def output(self):
+ # .style("display: grid; overflow-y: auto;")
+ return put_html(self.html)
+
+ def append(self, text: str) -> None:
+ if text:
+ run_js(
+ """$("#{dom_id}>code").append(text);
+ """.format(
+ dom_id=self.id
+ ),
+ text=str(text),
+ )
+ if self.keep_bottom:
+ self.scroll()
+
+ def scroll(self) -> None:
+ run_js(
+ r"""$("\#{dom_id}").animate({{scrollTop: $("\#{dom_id}").prop("scrollHeight")}}, 0);
+ """.format(
+ dom_id=self.id
+ )
+ )
+
+ def reset(self) -> None:
+ run_js(r"""$("\#{dom_id}>code").empty();""".format(dom_id=self.id))
+
+ def set_scroll(self, b: bool) -> None:
+ # use for lambda callback function
+ self.keep_bottom = b
+
+
+class RichLog:
+ def __init__(self, scope, font_width="0.559") -> None:
+ self.scope = scope
+ self.font_width = font_width
+ self.console = HTMLConsole(
+ force_terminal=False,
+ force_interactive=False,
+ width=80,
+ color_system="truecolor",
+ markup=False,
+ record=True,
+ safe_box=False,
+ highlighter=Highlighter(),
+ theme=WEB_THEME,
+ )
+ # self.callback_id = output_register_callback(
+ # self._callback_set_width, serial_mode=True)
+ # self._callback_thread = None
+ # self._width = 80
+ self.keep_bottom = True
+ if State.theme == "dark":
+ self.terminal_theme = DARK_TERMINAL_THEME
+ else:
+ self.terminal_theme = LIGHT_TERMINAL_THEME
+
+ def render(self, renderable: ConsoleRenderable) -> str:
+ with self.console.capture():
+ self.console.print(renderable)
+
+ html = self.console.export_html(
+ theme=self.terminal_theme,
+ clear=True,
+ code_format=LOG_CODE_FORMAT,
+ inline_styles=True,
+ )
+ # print(html)
+ return html
+
+ def extend(self, text):
+ if text:
+ run_js(
+ """$("#pywebio-scope-{scope}>div").append(text);
+ """.format(
+ scope=self.scope
+ ),
+ text=str(text),
+ )
+ if self.keep_bottom:
+ self.scroll()
+
+ def reset(self):
+ run_js(f"""$("#pywebio-scope-{self.scope}>div").empty();""")
+
+ def scroll(self) -> None:
+ run_js(
+ """$("#pywebio-scope-{scope}").scrollTop($("#pywebio-scope-{scope}").prop("scrollHeight"));
+ """.format(
+ scope=self.scope
+ )
+ )
+
+ def set_scroll(self, b: bool) -> None:
+ # use for lambda callback function
+ self.keep_bottom = b
+
+ def get_width(self):
+ js = """
+ let canvas = document.createElement('canvas');
+ canvas.style.position = "absolute";
+ let ctx = canvas.getContext('2d');
+ document.body.appendChild(canvas);
+ ctx.font = `16px Menlo, consolas, DejaVu Sans Mono, Courier New, monospace`;
+ document.body.removeChild(canvas);
+ let text = ctx.measureText('0');
+ ctx.fillText('0', 50, 50);
+
+ ($('#pywebio-scope-{scope}').width()-16)/\
+ $('#pywebio-scope-{scope}').css('font-size').slice(0, -2)/text.width*16;\
+ """.format(
+ scope=self.scope
+ )
+ width = eval_js(js)
+ return 80 if width is None else 128 if width > 128 else int(width)
+
+ # def _register_resize_callback(self):
+ # js = """
+ # WebIO.pushData(
+ # ($('#pywebio-scope-log').width()-16)/$('#pywebio-scope-log').css('font-size').slice(0, -2)/0.55,
+ # {callback_id}
+ # )""".format(callback_id=self.callback_id)
+
+ # def _callback_set_width(self, width):
+ # self._width = width
+ # if self._callback_thread is None:
+ # self._callback_thread = Thread(target=self._callback_width_checker)
+ # self._callback_thread.start()
+
+ # def _callback_width_checker(self):
+ # last_modify = time.time()
+ # _width = self._width
+ # while True:
+ # if time.time() - last_modify > 1:
+ # break
+ # if self._width == _width:
+ # time.sleep(0.1)
+ # continue
+ # else:
+ # _width = self._width
+ # last_modify = time.time()
+
+ # self._callback_thread = None
+ # self.console.width = int(_width)
+
+ def put_log(self, pm: ProcessManager) -> Generator:
+ yield
+ try:
+ while True:
+ last_idx = len(pm.renderables)
+ html = "".join(map(self.render, pm.renderables[:]))
+ self.reset()
+ self.extend(html)
+ counter = last_idx
+ while counter < pm.renderables_max_length * 2:
+ yield
+ idx = len(pm.renderables)
+ if idx < last_idx:
+ last_idx -= pm.renderables_reduce_length
+ if idx != last_idx:
+ html = "".join(map(self.render, pm.renderables[last_idx:idx]))
+ self.extend(html)
+ counter += idx - last_idx
+ last_idx = idx
+ except SessionException:
+ pass
+
+
+class BinarySwitchButton(Switch):
+ def __init__(
+ self,
+ get_state,
+ label_on,
+ label_off,
+ onclick_on,
+ onclick_off,
+ scope,
+ color_on="success",
+ color_off="secondary",
+ ):
+ """
+ Args:
+ get_state:
+ (Callable):
+ return True to represent state `ON`
+ return False tp represent state `OFF`
+ (Generator):
+ yield True to change btn state to `ON`
+ yield False to change btn state to `OFF`
+ label_on: label to show when state is `ON`
+ label_off:
+ onclick_on: function to call when state is `ON`
+ onclick_off:
+ color_on: button color when state is `ON`
+ color_off:
+ scope: scope for button, just for button **only**
+ """
+ self.scope = scope
+ status = {
+ 0: {
+ "func": self.update_button,
+ "args": (
+ label_off,
+ onclick_off,
+ color_off,
+ ),
+ },
+ 1: {
+ "func": self.update_button,
+ "args": (
+ label_on,
+ onclick_on,
+ color_on,
+ ),
+ },
+ }
+ super().__init__(status=status, get_state=get_state, name=scope)
+
+ def update_button(self, label, onclick, color):
+ clear(self.scope)
+ put_button(label=label, onclick=onclick, color=color, scope=self.scope)
+
+
+# aside buttons
+
+
+def put_icon_buttons(
+ icon_html: str,
+ buttons: List[Dict[str, str]],
+ onclick: Union[List[Callable[[], None]], Callable[[], None]],
+) -> Output:
+ value = buttons[0]["value"]
+ return put_column(
+ [
+ output(put_html(icon_html)).style(
+ "z-index: 1; margin-left: 8px;text-align: center"
+ ),
+ put_buttons(buttons, onclick).style(f"z-index: 2; --aside-{value}--;"),
+ ],
+ size="0",
+ )
+
+
+def put_none() -> Output:
+ return put_html("
")
+
+
+T_Output_Kwargs = Dict[str, Union[str, Dict[str, Any]]]
+
+
+def get_title_help(kwargs: T_Output_Kwargs) -> Output:
+ title: str = kwargs.get("title")
+ help_text: str = kwargs.get("help")
+
+ if help_text:
+ res = put_column(
+ [
+ put_text(title).style("--arg-title--"),
+ put_text(help_text).style("--arg-help--"),
+ ],
+ size="auto 1fr",
+ )
+ else:
+ res = put_text(title).style("--arg-title--")
+
+ return res
+
+
+# args input widget
+def put_arg_input(kwargs: T_Output_Kwargs) -> Output:
+ name: str = kwargs["name"]
+ options: List = kwargs.get("options")
+ if options is not None:
+ kwargs.setdefault("datalist", options)
+
+ return put_scope(
+ f"arg_container-input-{name}",
+ [
+ get_title_help(kwargs),
+ put_input(**kwargs).style("--input--"),
+ ],
+ )
+
+
+def product_stored_row(kwargs: T_Output_Kwargs, key, value):
+ kwargs = copy.copy(kwargs)
+ kwargs["name"] += f'_{key}'
+ kwargs["value"] = value
+ return put_input(**kwargs).style("--input--")
+
+
+def put_arg_stored(kwargs: T_Output_Kwargs) -> Output:
+ name: str = kwargs["name"]
+ kwargs["disabled"] = True
+
+ values = kwargs.pop("value", {})
+ time_ = values.pop("time", "")
+
+ rows = [product_stored_row(kwargs, key, value) for key, value in values.items() if value]
+ if time_:
+ rows += [product_stored_row(kwargs, "time", time_)]
+ return put_scope(
+ f"arg_container-stored-{name}",
+ [
+ get_title_help(kwargs),
+ put_scope(
+ f"arg_stored-stored-value-{name}",
+ rows,
+ )
+ ]
+ )
+
+
+def put_arg_select(kwargs: T_Output_Kwargs) -> Output:
+ name: str = kwargs["name"]
+ value: str = kwargs["value"]
+ options: List[str] = kwargs["options"]
+ options_label: List[str] = kwargs.pop("options_label", [])
+ disabled: bool = kwargs.pop("disabled", False)
+ _: str = kwargs.pop("invalid_feedback", None)
+
+ if disabled:
+ option = [{
+ "label": next((opt_label for opt, opt_label in zip(options, options_label) if opt == value), value),
+ "value": value,
+ "selected": True,
+ }]
+ else:
+ option = [{
+ "label": opt_label,
+ "value": opt,
+ "select": opt == value,
+ } for opt, opt_label in zip(options, options_label)]
+ kwargs["options"] = option
+
+ return put_scope(
+ f"arg_container-select-{name}",
+ [
+ get_title_help(kwargs),
+ put_select(**kwargs).style("--input--"),
+ ],
+ )
+
+
+def put_arg_state(kwargs: T_Output_Kwargs) -> Output:
+ name: str = kwargs["name"]
+ value: str = kwargs["value"]
+ options: List[str] = kwargs["options"]
+ options_label: List[str] = kwargs.pop("options_label", [])
+ _: str = kwargs.pop("invalid_feedback", None)
+ bold: bool = value in kwargs.pop("option_bold", [])
+ light: bool = value in kwargs.pop("option_light", [])
+
+ option = [{
+ "label": next((opt_label for opt, opt_label in zip(options, options_label) if opt == value), value),
+ "value": value,
+ "selected": True,
+ }]
+ if bold:
+ kwargs["class"] = "form-control state state-bold"
+ elif light:
+ kwargs["class"] = "form-control state state-light"
+ else:
+ kwargs["class"] = "form-control state"
+ kwargs["options"] = option
+
+ return put_scope(
+ f"arg_container-select-{name}",
+ [
+ get_title_help(kwargs),
+ put_select(**kwargs).style("--input--"),
+ ],
+ )
+
+
+def put_arg_textarea(kwargs: T_Output_Kwargs) -> Output:
+ name: str = kwargs["name"]
+ mode: str = kwargs.pop("mode", None)
+ kwargs.setdefault(
+ "code", {"lineWrapping": True, "lineNumbers": False, "mode": mode}
+ )
+
+ return put_scope(
+ f"arg_contianer-textarea-{name}",
+ [
+ get_title_help(kwargs),
+ put_textarea(**kwargs),
+ ],
+ )
+
+
+def put_arg_checkbox(kwargs: T_Output_Kwargs) -> Output:
+ # Not real checkbox, use as a switch (on/off)
+ name: str = kwargs["name"]
+ value: str = kwargs["value"]
+ _: str = kwargs.pop("invalid_feedback", None)
+
+ kwargs["options"] = [{"label": "", "value": True, "selected": value}]
+ return put_scope(
+ f"arg_container-checkbox-{name}",
+ [
+ get_title_help(kwargs),
+ put_checkbox(**kwargs).style("text-align: center"),
+ ],
+ )
+
+
+def put_arg_datetime(kwargs: T_Output_Kwargs) -> Output:
+ name: str = kwargs["name"]
+ return put_scope(
+ f"arg_container-datetime-{name}",
+ [
+ get_title_help(kwargs),
+ put_input(**kwargs).style("--input--"),
+ ],
+ )
+
+
+def put_arg_storage(kwargs: T_Output_Kwargs) -> Optional[Output]:
+ name: str = kwargs["name"]
+ if kwargs["value"] == {}:
+ return None
+
+ kwargs["value"] = json.dumps(
+ kwargs["value"], indent=2, ensure_ascii=False, sort_keys=False, default=str
+ )
+ kwargs.setdefault(
+ "code", {"lineWrapping": True, "lineNumbers": False, "mode": "json"}
+ )
+
+ def clear_callback():
+ alasgui: "AlasGUI" = local.gui
+ alasgui.modified_config_queue.put(
+ {"name": ".".join(name.split("_")), "value": {}}
+ )
+ # https://github.com/pywebio/PyWebIO/issues/459
+ # pin[name] = "{}"
+
+ return put_scope(
+ f"arg_container-storage-{name}",
+ [
+ put_textarea(**kwargs),
+ put_html(
+ f'
'
+ ).onclick(clear_callback),
+ ],
+ )
+
+
+_widget_type_to_func: Dict[str, Callable] = {
+ "input": put_arg_input,
+ "lock": put_arg_input,
+ "datetime": put_arg_input, # TODO
+ "select": put_arg_select,
+ "textarea": put_arg_textarea,
+ "checkbox": put_arg_checkbox,
+ "storage": put_arg_storage,
+ "state": put_arg_state,
+ "stored": put_arg_stored,
+}
+
+
+def put_output(output_kwargs: T_Output_Kwargs) -> Optional[Output]:
+ return _widget_type_to_func[output_kwargs["widget_type"]](output_kwargs)
+
+
+def get_loading_style(shape: str, fill: bool) -> str:
+ if fill:
+ return f"--loading-{shape}-fill--"
+ else:
+ return f"--loading-{shape}--"
+
+
+def put_loading_text(
+ text: str,
+ shape: str = "border",
+ color: str = "dark",
+ fill: bool = False,
+ size: str = "auto 2px 1fr",
+):
+ loading_style = get_loading_style(shape=shape, fill=fill)
+ return put_row(
+ [
+ put_loading(shape=shape, color=color).style(loading_style),
+ None,
+ put_text(text),
+ ],
+ size=size,
+ )
diff --git a/requirements-in.txt b/requirements-in.txt
new file mode 100644
index 0000000..101bf52
--- /dev/null
+++ b/requirements-in.txt
@@ -0,0 +1,39 @@
+# Image processing
+numpy
+scipy
+pillow
+opencv-python
+
+# Device connection
+adbutils
+uiautomator2==2.16.17
+uiautomator2cache==0.3.0.1
+wrapt>=1.14.0
+lz4
+av==10.0.0
+psutil==5.9.3
+
+# Utils
+rich
+tqdm
+jellyfish
+pyyaml
+inflection
+prettytable==2.2.1
+pydantic
+
+# OCR
+pponnxcr==2.0
+
+# Webui
+pywebio==1.6.2
+starlette==0.14.2
+uvicorn[standard]==0.17.6
+aiofiles
+
+# Game resources
+srcmap==1.1.0
+
+# For dev
+# pip-tools
+pynput
diff --git a/requirements.txt b/requirements.txt
new file mode 100644
index 0000000..74a129b
--- /dev/null
+++ b/requirements.txt
@@ -0,0 +1,84 @@
+#
+# This file is autogenerated by pip-compile with Python 3.10
+# by the following command:
+#
+# pip-compile --annotation-style=line --output-file=requirements.txt requirements-in.txt
+#
+--index-url https://mirrors.ustc.edu.cn/pypi/web/simple
+
+adbutils==1.2.9 # via -r requirements-in.txt, uiautomator2
+aiofiles==23.1.0 # via -r requirements-in.txt
+anyio==3.6.2 # via watchgod
+apkutils2==1.0.0 # via adbutils
+asgiref==3.6.0 # via uvicorn
+av==10.0.0 # via -r requirements-in.txt
+cached-property==1.5.2 # via uiautomator2
+certifi==2022.12.7 # via requests
+charset-normalizer==3.1.0 # via requests
+cigam==0.0.3 # via apkutils2
+click==8.1.3 # via uvicorn
+colorama==0.4.6 # via click, logzero, tqdm, uvicorn
+coloredlogs==15.0.1 # via onnxruntime
+decorator==5.1.1 # via retry
+deprecated==1.2.13 # via uiautomator2
+deprecation==2.1.0 # via adbutils
+filelock==3.12.0 # via uiautomator2
+flatbuffers==23.5.9 # via onnxruntime
+h11==0.14.0 # via uvicorn
+httptools==0.5.0 # via uvicorn
+humanfriendly==10.0 # via coloredlogs
+idna==3.4 # via anyio, requests
+inflection==0.5.1 # via -r requirements-in.txt
+jellyfish==0.11.2 # via -r requirements-in.txt
+logzero==1.7.0 # via uiautomator2
+lxml==4.9.2 # via uiautomator2
+lz4==4.3.2 # via -r requirements-in.txt
+markdown-it-py==2.2.0 # via rich
+mdurl==0.1.2 # via markdown-it-py
+mpmath==1.3.0 # via sympy
+numpy==1.24.3 # via -r requirements-in.txt, onnxruntime, opencv-python, pponnxcr, scipy, shapely
+onnxruntime==1.14.1 # via pponnxcr
+opencv-python==4.7.0.72 # via -r requirements-in.txt, pponnxcr
+packaging==20.9 # via deprecation, onnxruntime, uiautomator2
+pillow==9.5.0 # via -r requirements-in.txt, adbutils, uiautomator2
+pponnxcr==2.0 # via -r requirements-in.txt
+prettytable==2.2.1 # via -r requirements-in.txt
+progress==1.6 # via uiautomator2
+protobuf==4.23.0 # via onnxruntime
+psutil==5.9.3 # via -r requirements-in.txt
+py==1.11.0 # via retry
+pyclipper==1.3.0.post4 # via pponnxcr
+pydantic==1.10.7 # via -r requirements-in.txt
+pyelftools==0.29 # via apkutils2
+pygments==2.15.1 # via rich
+pynput==1.7.6 # via -r requirements-in.txt
+pyparsing==3.0.9 # via packaging
+pyreadline3==3.4.1 # via humanfriendly
+python-dotenv==1.0.0 # via uvicorn
+pywebio==1.6.2 # via -r requirements-in.txt
+pyyaml==6.0 # via -r requirements-in.txt, uvicorn
+requests==2.30.0 # via adbutils, uiautomator2
+retry==0.9.2 # via adbutils, uiautomator2
+rich==13.3.5 # via -r requirements-in.txt
+scipy==1.10.1 # via -r requirements-in.txt
+shapely==2.0.1 # via pponnxcr
+six==1.16.0 # via pynput, uiautomator2
+sniffio==1.3.0 # via anyio
+srcmap==1.1.0 # via -r requirements-in.txt
+starlette==0.14.2 # via -r requirements-in.txt
+sympy==1.12 # via onnxruntime
+tornado==6.3.1 # via pywebio
+tqdm==4.65.0 # via -r requirements-in.txt
+typing-extensions==4.5.0 # via pydantic
+ua-parser==0.16.1 # via user-agents
+uiautomator2==2.16.17 # via -r requirements-in.txt
+uiautomator2cache==0.3.0.1 # via -r requirements-in.txt
+urllib3==2.0.2 # via requests
+user-agents==2.2.0 # via pywebio
+uvicorn[standard]==0.17.6 # via -r requirements-in.txt
+watchgod==0.8.2 # via uvicorn
+wcwidth==0.2.6 # via prettytable
+websockets==11.0.3 # via uvicorn
+whichcraft==0.6.1 # via adbutils, uiautomator2
+wrapt==1.15.0 # via -r requirements-in.txt, deprecated
+xmltodict==0.13.0 # via apkutils2
diff --git a/tasks/base/assets/assets_base_page.py b/tasks/base/assets/assets_base_page.py
new file mode 100644
index 0000000..42b3300
--- /dev/null
+++ b/tasks/base/assets/assets_base_page.py
@@ -0,0 +1,385 @@
+from module.base.button import Button, ButtonWrapper
+
+# This file was auto-generated, do not modify it manually. To generate:
+# ``` python -m dev_tools.button_extract ```
+
+ACCOUNT_INFO_CHECK = ButtonWrapper(
+ name='ACCOUNT_INFO_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/ACCOUNT_INFO_CHECK.png',
+ area=(108, 11, 235, 36),
+ search=(88, 0, 255, 56),
+ color=(193, 201, 210),
+ button=(108, 11, 235, 36),
+ ),
+)
+BACK = ButtonWrapper(
+ name='BACK',
+ jp=Button(
+ file='./assets/jp/base/page/BACK.png',
+ area=(34, 19, 81, 56),
+ search=(14, 0, 101, 76),
+ color=(93, 118, 164),
+ button=(34, 19, 81, 56),
+ ),
+)
+BOUNTY_CHECK = ButtonWrapper(
+ name='BOUNTY_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/BOUNTY_CHECK.png',
+ area=(107, 10, 158, 37),
+ search=(87, 0, 178, 57),
+ color=(150, 164, 177),
+ button=(107, 10, 158, 37),
+ ),
+)
+CAFE_CHECK = ButtonWrapper(
+ name='CAFE_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/CAFE_CHECK.png',
+ area=(264, 11, 337, 35),
+ search=(244, 0, 357, 55),
+ color=(188, 197, 205),
+ button=(264, 11, 337, 35),
+ ),
+)
+CIRCLE_CHECK = ButtonWrapper(
+ name='CIRCLE_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/CIRCLE_CHECK.png',
+ area=(107, 11, 211, 36),
+ search=(87, 0, 231, 56),
+ color=(195, 203, 211),
+ button=(107, 11, 211, 36),
+ ),
+)
+COMMISSIONS_CHECK = ButtonWrapper(
+ name='COMMISSIONS_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/COMMISSIONS_CHECK.png',
+ area=(107, 10, 158, 37),
+ search=(87, 0, 178, 57),
+ color=(146, 160, 174),
+ button=(107, 10, 158, 37),
+ ),
+)
+CRAFTING_CHECK = ButtonWrapper(
+ name='CRAFTING_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/CRAFTING_CHECK.png',
+ area=(108, 10, 214, 37),
+ search=(88, 0, 234, 57),
+ color=(200, 208, 215),
+ button=(108, 10, 214, 37),
+ ),
+)
+GACHA_CHECK = ButtonWrapper(
+ name='GACHA_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/GACHA_CHECK.png',
+ area=(159, 10, 210, 37),
+ search=(139, 0, 230, 57),
+ color=(135, 148, 164),
+ button=(159, 10, 210, 37),
+ ),
+)
+HOME = ButtonWrapper(
+ name='HOME',
+ jp=Button(
+ file='./assets/jp/base/page/HOME.png',
+ area=(1218, 8, 1253, 41),
+ search=(1198, 0, 1273, 61),
+ color=(168, 182, 205),
+ button=(1218, 8, 1253, 41),
+ ),
+)
+LOADING_CHECK = ButtonWrapper(
+ name='LOADING_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/LOADING_CHECK.png',
+ area=(1084, 659, 1120, 674),
+ search=(1064, 639, 1140, 694),
+ color=(173, 196, 219),
+ button=(1084, 659, 1120, 674),
+ ),
+)
+MAIL_CHECK = ButtonWrapper(
+ name='MAIL_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/MAIL_CHECK.png',
+ area=(108, 9, 186, 37),
+ search=(88, 0, 206, 57),
+ color=(205, 212, 219),
+ button=(108, 9, 186, 37),
+ ),
+)
+MAIN_GO_TO_CAFE = ButtonWrapper(
+ name='MAIN_GO_TO_CAFE',
+ jp=Button(
+ file='./assets/jp/base/page/MAIN_GO_TO_CAFE.png',
+ area=(81, 638, 102, 668),
+ search=(61, 618, 122, 688),
+ color=(156, 209, 233),
+ button=(81, 638, 102, 668),
+ ),
+)
+MAIN_GO_TO_CIRCLE = ButtonWrapper(
+ name='MAIN_GO_TO_CIRCLE',
+ jp=Button(
+ file='./assets/jp/base/page/MAIN_GO_TO_CIRCLE.png',
+ area=(540, 631, 583, 660),
+ search=(520, 611, 603, 680),
+ color=(131, 204, 234),
+ button=(540, 631, 583, 660),
+ ),
+)
+MAIN_GO_TO_CRAFTING = ButtonWrapper(
+ name='MAIN_GO_TO_CRAFTING',
+ jp=Button(
+ file='./assets/jp/base/page/MAIN_GO_TO_CRAFTING.png',
+ area=(665, 622, 693, 664),
+ search=(645, 602, 713, 684),
+ color=(192, 229, 241),
+ button=(665, 622, 693, 664),
+ ),
+)
+MAIN_GO_TO_GACHA = ButtonWrapper(
+ name='MAIN_GO_TO_GACHA',
+ jp=Button(
+ file='./assets/jp/base/page/MAIN_GO_TO_GACHA.png',
+ area=(900, 623, 924, 670),
+ search=(880, 603, 944, 690),
+ color=(157, 219, 241),
+ button=(900, 623, 924, 670),
+ ),
+)
+MAIN_GO_TO_MAIL = ButtonWrapper(
+ name='MAIN_GO_TO_MAIL',
+ jp=Button(
+ file='./assets/jp/base/page/MAIN_GO_TO_MAIL.png',
+ area=(1130, 29, 1156, 49),
+ search=(1110, 9, 1176, 69),
+ color=(94, 121, 166),
+ button=(1130, 29, 1156, 49),
+ ),
+)
+MAIN_GO_TO_MOMOTALK = ButtonWrapper(
+ name='MAIN_GO_TO_MOMOTALK',
+ jp=Button(
+ file='./assets/jp/base/page/MAIN_GO_TO_MOMOTALK.png',
+ area=(154, 134, 177, 158),
+ search=(134, 114, 197, 178),
+ color=(255, 219, 227),
+ button=(154, 134, 177, 158),
+ ),
+)
+MAIN_GO_TO_PURCHASE = ButtonWrapper(
+ name='MAIN_GO_TO_PURCHASE',
+ jp=Button(
+ file='./assets/jp/base/page/MAIN_GO_TO_PURCHASE.png',
+ area=(148, 204, 183, 253),
+ search=(128, 184, 203, 273),
+ color=(172, 214, 239),
+ button=(148, 204, 183, 253),
+ ),
+)
+MAIN_GO_TO_SCHEDULE = ButtonWrapper(
+ name='MAIN_GO_TO_SCHEDULE',
+ jp=Button(
+ file='./assets/jp/base/page/MAIN_GO_TO_SCHEDULE.png',
+ area=(194, 638, 216, 672),
+ search=(174, 618, 236, 692),
+ color=(149, 194, 222),
+ button=(194, 638, 216, 672),
+ ),
+)
+MAIN_GO_TO_SHOP = ButtonWrapper(
+ name='MAIN_GO_TO_SHOP',
+ jp=Button(
+ file='./assets/jp/base/page/MAIN_GO_TO_SHOP.png',
+ area=(773, 630, 816, 667),
+ search=(753, 610, 836, 687),
+ color=(146, 208, 235),
+ button=(773, 630, 816, 667),
+ ),
+)
+MAIN_GO_TO_TASK = ButtonWrapper(
+ name='MAIN_GO_TO_TASK',
+ jp=Button(
+ file='./assets/jp/base/page/MAIN_GO_TO_TASK.png',
+ area=(52, 220, 78, 248),
+ search=(32, 200, 98, 268),
+ color=(226, 207, 203),
+ button=(52, 220, 78, 248),
+ ),
+)
+MAIN_GO_TO_WORK = ButtonWrapper(
+ name='MAIN_GO_TO_WORK',
+ jp=Button(
+ file='./assets/jp/base/page/MAIN_GO_TO_WORK.png',
+ area=(1167, 605, 1241, 632),
+ search=(1147, 585, 1261, 652),
+ color=(135, 149, 169),
+ button=(1167, 605, 1241, 632),
+ ),
+)
+MISSION_CHECK = ButtonWrapper(
+ name='MISSION_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/MISSION_CHECK.png',
+ area=(108, 12, 183, 36),
+ search=(88, 0, 203, 56),
+ color=(188, 197, 206),
+ button=(108, 12, 183, 36),
+ ),
+)
+MOMOTALK_CHECK = ButtonWrapper(
+ name='MOMOTALK_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/MOMOTALK_CHECK.png',
+ area=(144, 107, 169, 130),
+ search=(124, 87, 189, 150),
+ color=(253, 211, 219),
+ button=(144, 107, 169, 130),
+ ),
+)
+MOMOTALK_GO_TO_MAIN = ButtonWrapper(
+ name='MOMOTALK_GO_TO_MAIN',
+ jp=Button(
+ file='./assets/jp/base/page/MOMOTALK_GO_TO_MAIN.png',
+ area=(1108, 105, 1134, 131),
+ search=(1088, 85, 1154, 151),
+ color=(252, 182, 194),
+ button=(1108, 105, 1134, 131),
+ ),
+)
+SCHEDULE_CHECK = ButtonWrapper(
+ name='SCHEDULE_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/SCHEDULE_CHECK.png',
+ area=(108, 12, 159, 36),
+ search=(88, 0, 179, 56),
+ color=(188, 197, 206),
+ button=(108, 12, 159, 36),
+ ),
+)
+SCHOOL_EXCHANGE_CHECK = ButtonWrapper(
+ name='SCHOOL_EXCHANGE_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/SCHOOL_EXCHANGE_CHECK.png',
+ area=(107, 11, 158, 36),
+ search=(87, 0, 178, 56),
+ color=(134, 149, 164),
+ button=(107, 11, 158, 36),
+ ),
+)
+SHOP_CHECK = ButtonWrapper(
+ name='SHOP_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/SHOP_CHECK.png',
+ area=(108, 10, 212, 36),
+ search=(88, 0, 232, 56),
+ color=(200, 208, 215),
+ button=(108, 10, 212, 36),
+ ),
+)
+STORY_CHECK = ButtonWrapper(
+ name='STORY_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/STORY_CHECK.png',
+ area=(108, 11, 157, 36),
+ search=(88, 0, 177, 56),
+ color=(194, 203, 211),
+ button=(108, 11, 157, 36),
+ ),
+)
+TACTICAL_CHALLENGE_CHECK = ButtonWrapper(
+ name='TACTICAL_CHALLENGE_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/TACTICAL_CHALLENGE_CHECK.png',
+ area=(107, 11, 133, 37),
+ search=(87, 0, 153, 57),
+ color=(129, 145, 161),
+ button=(107, 11, 133, 37),
+ ),
+)
+TASK_CHECK = ButtonWrapper(
+ name='TASK_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/TASK_CHECK.png',
+ area=(109, 12, 155, 36),
+ search=(89, 0, 175, 56),
+ color=(189, 198, 207),
+ button=(109, 12, 155, 36),
+ ),
+)
+WORK_CHECK = ButtonWrapper(
+ name='WORK_CHECK',
+ jp=Button(
+ file='./assets/jp/base/page/WORK_CHECK.png',
+ area=(107, 10, 185, 38),
+ search=(87, 0, 205, 58),
+ color=(164, 175, 187),
+ button=(107, 10, 185, 38),
+ ),
+)
+WORK_GO_TO_BOUNTY = ButtonWrapper(
+ name='WORK_GO_TO_BOUNTY',
+ jp=Button(
+ file='./assets/jp/base/page/WORK_GO_TO_BOUNTY.png',
+ area=(669, 412, 765, 436),
+ search=(649, 392, 785, 456),
+ color=(165, 181, 208),
+ button=(669, 412, 765, 436),
+ ),
+)
+WORK_GO_TO_COMMISSIONS = ButtonWrapper(
+ name='WORK_GO_TO_COMMISSIONS',
+ jp=Button(
+ file='./assets/jp/base/page/WORK_GO_TO_COMMISSIONS.png',
+ area=(655, 494, 751, 518),
+ search=(635, 474, 771, 538),
+ color=(165, 179, 204),
+ button=(655, 494, 751, 518),
+ ),
+)
+WORK_GO_TO_MISSION = ButtonWrapper(
+ name='WORK_GO_TO_MISSION',
+ jp=Button(
+ file='./assets/jp/base/page/WORK_GO_TO_MISSION.png',
+ area=(720, 160, 803, 199),
+ search=(700, 140, 823, 219),
+ color=(165, 178, 204),
+ button=(720, 160, 803, 199),
+ ),
+)
+WORK_GO_TO_SCHOOL_EXCHANGE = ButtonWrapper(
+ name='WORK_GO_TO_SCHOOL_EXCHANGE',
+ jp=Button(
+ file='./assets/jp/base/page/WORK_GO_TO_SCHOOL_EXCHANGE.png',
+ area=(641, 575, 758, 599),
+ search=(621, 555, 778, 619),
+ color=(165, 179, 204),
+ button=(641, 575, 758, 599),
+ ),
+)
+WORK_GO_TO_STORY = ButtonWrapper(
+ name='WORK_GO_TO_STORY',
+ jp=Button(
+ file='./assets/jp/base/page/WORK_GO_TO_STORY.png',
+ area=(995, 163, 1032, 197),
+ search=(975, 143, 1052, 217),
+ color=(191, 201, 219),
+ button=(995, 163, 1032, 197),
+ ),
+)
+WORK_GO_TO_TACTICAL_CHALLENGE = ButtonWrapper(
+ name='WORK_GO_TO_TACTICAL_CHALLENGE',
+ jp=Button(
+ file='./assets/jp/base/page/WORK_GO_TO_TACTICAL_CHALLENGE.png',
+ area=(1012, 535, 1151, 562),
+ search=(992, 515, 1171, 582),
+ color=(159, 174, 200),
+ button=(1012, 535, 1151, 562),
+ ),
+)
diff --git a/tasks/base/assets/assets_base_popup.py b/tasks/base/assets/assets_base_popup.py
new file mode 100644
index 0000000..d904d8b
--- /dev/null
+++ b/tasks/base/assets/assets_base_popup.py
@@ -0,0 +1,75 @@
+from module.base.button import Button, ButtonWrapper
+
+# This file was auto-generated, do not modify it manually. To generate:
+# ``` python -m dev_tools.button_extract ```
+
+AFFECTION_LEVEL_UP = ButtonWrapper(
+ name='AFFECTION_LEVEL_UP',
+ jp=Button(
+ file='./assets/jp/base/popup/AFFECTION_LEVEL_UP.png',
+ area=(643, 599, 773, 641),
+ search=(623, 579, 793, 661),
+ color=(208, 223, 243),
+ button=(882, 244, 1176, 476),
+ ),
+)
+DAILY_NEWS = ButtonWrapper(
+ name='DAILY_NEWS',
+ jp=Button(
+ file='./assets/jp/base/popup/DAILY_NEWS.png',
+ area=(120, 89, 326, 113),
+ search=(100, 69, 346, 133),
+ color=(150, 204, 253),
+ button=(1128, 89, 1156, 117),
+ ),
+)
+DAILY_REWARD = ButtonWrapper(
+ name='DAILY_REWARD',
+ jp=Button(
+ file='./assets/jp/base/popup/DAILY_REWARD.png',
+ area=(854, 117, 1008, 165),
+ search=(834, 97, 1028, 185),
+ color=(178, 167, 112),
+ button=(920, 632, 1140, 712),
+ ),
+)
+GET_NEW_STUDENT = ButtonWrapper(
+ name='GET_NEW_STUDENT',
+ jp=Button(
+ file='./assets/jp/base/popup/GET_NEW_STUDENT.png',
+ area=(32, 93, 158, 114),
+ search=(12, 73, 178, 134),
+ color=(125, 132, 92),
+ button=(934, 643, 1263, 714),
+ ),
+)
+GET_REWARD = ButtonWrapper(
+ name='GET_REWARD',
+ jp=Button(
+ file='./assets/jp/base/popup/GET_REWARD.png',
+ area=(657, 145, 693, 170),
+ search=(637, 125, 713, 190),
+ color=(230, 222, 93),
+ button=(675, 623, 870, 695),
+ ),
+)
+GET_REWARD_SKIP = ButtonWrapper(
+ name='GET_REWARD_SKIP',
+ jp=Button(
+ file='./assets/jp/base/popup/GET_REWARD_SKIP.png',
+ area=(1137, 34, 1243, 65),
+ search=(1117, 14, 1263, 85),
+ color=(197, 200, 205),
+ button=(1137, 34, 1243, 65),
+ ),
+)
+NETWORK_RECONNECT = ButtonWrapper(
+ name='NETWORK_RECONNECT',
+ jp=Button(
+ file='./assets/jp/base/popup/NETWORK_RECONNECT.png',
+ area=(725, 488, 810, 516),
+ search=(705, 468, 830, 536),
+ color=(78, 138, 169),
+ button=(663, 467, 870, 537),
+ ),
+)
diff --git a/tasks/base/main_page.py b/tasks/base/main_page.py
new file mode 100644
index 0000000..9a8529b
--- /dev/null
+++ b/tasks/base/main_page.py
@@ -0,0 +1,5 @@
+from tasks.base.popup import PopupHandler
+
+
+class MainPage(PopupHandler):
+ pass
diff --git a/tasks/base/page.py b/tasks/base/page.py
new file mode 100644
index 0000000..9726082
--- /dev/null
+++ b/tasks/base/page.py
@@ -0,0 +1,162 @@
+import traceback
+
+from tasks.base.assets.assets_base_page import *
+
+
+class Page:
+ # Key: str, page name like "page_main"
+ # Value: Page, page instance
+ all_pages = {}
+
+ @classmethod
+ def clear_connection(cls):
+ for page in cls.all_pages.values():
+ page.parent = None
+
+ @classmethod
+ def init_connection(cls, destination):
+ """
+ Initialize an A* path finding among pages.
+
+ Args:
+ destination (Page):
+ """
+ cls.clear_connection()
+
+ visited = [destination]
+ visited = set(visited)
+ while 1:
+ new = visited.copy()
+ for page in visited:
+ for link in cls.iter_pages():
+ if link in visited:
+ continue
+ if page in link.links:
+ link.parent = page
+ new.add(link)
+ if len(new) == len(visited):
+ break
+ visited = new
+
+ @classmethod
+ def iter_pages(cls):
+ return cls.all_pages.values()
+
+ @classmethod
+ def iter_check_buttons(cls):
+ for page in cls.all_pages.values():
+ yield page.check_button
+
+ def __init__(self, check_button):
+ self.check_button = check_button
+ self.links = {}
+ (filename, line_number, function_name, text) = traceback.extract_stack()[-2]
+ self.name = text[:text.find('=')].strip()
+ self.parent = None
+ Page.all_pages[self.name] = self
+
+ def __eq__(self, other):
+ return self.name == other.name
+
+ def __hash__(self):
+ return hash(self.name)
+
+ def __str__(self):
+ return self.name
+
+ def link(self, button, destination):
+ self.links[destination] = button
+
+
+# Main Page
+page_main = Page(MAIN_GO_TO_PURCHASE)
+
+# Cafe
+page_cafe = Page(CAFE_CHECK)
+page_cafe.link(HOME, destination=page_main)
+page_main.link(MAIN_GO_TO_CAFE, destination=page_cafe)
+
+# Schedule
+page_schedule = Page(SCHEDULE_CHECK)
+page_schedule.link(HOME, destination=page_main)
+page_main.link(MAIN_GO_TO_SCHEDULE, destination=page_schedule)
+
+# Circle
+page_circle = Page(CIRCLE_CHECK)
+page_circle.link(HOME, destination=page_main)
+page_main.link(MAIN_GO_TO_CIRCLE, destination=page_circle)
+
+# Crafting Chamber
+page_crafting = Page(CRAFTING_CHECK)
+page_crafting.link(HOME, destination=page_main)
+page_main.link(MAIN_GO_TO_CRAFTING, destination=page_crafting)
+
+# Shop
+page_shop = Page(SHOP_CHECK)
+page_shop.link(HOME, destination=page_main)
+page_main.link(MAIN_GO_TO_SHOP, destination=page_shop)
+
+# Gacha
+page_gacha = Page(GACHA_CHECK)
+page_gacha.link(HOME, destination=page_main)
+page_main.link(MAIN_GO_TO_GACHA, destination=page_gacha)
+
+# Account Info
+page_account_info = Page(ACCOUNT_INFO_CHECK)
+page_account_info.link(HOME, destination=page_main)
+
+# Mail
+page_mail = Page(MAIL_CHECK)
+page_mail.link(HOME, destination=page_main)
+page_main.link(MAIN_GO_TO_MAIL, destination=page_mail)
+
+# Task (Daily)
+page_task = Page(TASK_CHECK)
+page_task.link(HOME, destination=page_main)
+page_main.link(MAIN_GO_TO_TASK, destination=page_task)
+
+# MomoTalk
+page_momo_talk = Page(MOMOTALK_CHECK)
+page_momo_talk.link(MOMOTALK_GO_TO_MAIN, destination=page_main)
+page_main.link(MAIN_GO_TO_MOMOTALK, destination=page_momo_talk)
+
+# Work
+page_work = Page(WORK_CHECK)
+page_work.link(HOME, destination=page_main)
+page_main.link(MAIN_GO_TO_WORK, destination=page_work)
+
+# Mission
+page_mission = Page(MISSION_CHECK)
+page_mission.link(HOME, destination=page_main)
+page_mission.link(BACK, destination=page_work)
+page_work.link(WORK_GO_TO_MISSION, destination=page_mission)
+
+# Story
+page_story = Page(STORY_CHECK)
+page_story.link(HOME, destination=page_main)
+page_story.link(BACK, destination=page_work)
+page_work.link(WORK_GO_TO_STORY, destination=page_story)
+
+# Bounty
+page_bounty = Page(BOUNTY_CHECK)
+page_bounty.link(HOME, destination=page_main)
+page_bounty.link(BACK, destination=page_work)
+page_work.link(WORK_GO_TO_BOUNTY, destination=page_bounty)
+
+# Commissions
+page_commissions = Page(COMMISSIONS_CHECK)
+page_commissions.link(HOME, destination=page_main)
+page_commissions.link(BACK, destination=page_work)
+page_work.link(WORK_GO_TO_COMMISSIONS, destination=page_commissions)
+
+# School Exchange
+page_school_exchange = Page(SCHOOL_EXCHANGE_CHECK)
+page_school_exchange.link(HOME, destination=page_main)
+page_school_exchange.link(BACK, destination=page_work)
+page_work.link(WORK_GO_TO_SCHOOL_EXCHANGE, destination=page_school_exchange)
+
+# Tactical Challenge
+page_tactical_challenge = Page(TACTICAL_CHALLENGE_CHECK)
+page_tactical_challenge.link(HOME, destination=page_main)
+page_tactical_challenge.link(BACK, destination=page_work)
+page_work.link(WORK_GO_TO_TACTICAL_CHALLENGE, destination=page_tactical_challenge)
diff --git a/tasks/base/popup.py b/tasks/base/popup.py
new file mode 100644
index 0000000..e454e92
--- /dev/null
+++ b/tasks/base/popup.py
@@ -0,0 +1,91 @@
+from module.base.base import ModuleBase
+from module.base.timer import Timer
+from tasks.base.assets.assets_base_popup import *
+from tasks.base.assets.assets_base_page import LOADING_CHECK
+
+
+class PopupHandler(ModuleBase):
+ def handle_loading(self, interval=5) -> bool:
+ """
+ Args:
+ interval:
+
+ Returns:
+ If handled.
+ """
+ if self.appear(LOADING_CHECK, interval=interval):
+ timer = Timer(0.5).start()
+ while 1:
+ if timer.reached_and_reset():
+ self.device.screenshot()
+ if self.appear(LOADING_CHECK):
+ self.device.stuck_record_clear()
+ continue
+ else:
+ break
+ return True
+
+ return False
+
+ def handle_reward(self, interval=5) -> bool:
+ """
+ Args:
+ interval:
+
+ Returns:
+ If handled.
+ """
+ if self.appear_then_click(GET_REWARD, interval=interval):
+ timer = Timer(0.2).start()
+ while 1:
+ if timer.reached_and_reset():
+ self.device.screenshot()
+ if self.appear(GET_REWARD):
+ self.device.click(GET_REWARD)
+ else:
+ break
+ return True
+
+ return False
+
+ def handle_reward_skip(self, interval=5) -> bool:
+ if self.appear_then_click(GET_REWARD_SKIP, interval=interval):
+ return True
+
+ def handle_daily_news(self, interval=5) -> bool:
+ if self.appear_then_click(DAILY_NEWS, interval=interval):
+ return True
+
+ return False
+
+ def handle_daily_reward(self, interval=5) -> bool:
+ if self.appear_then_click(DAILY_REWARD, interval=interval):
+ return True
+
+ return False
+
+ def handle_network_reconnect(self, interval=5) -> bool:
+ if self.appear_then_click(NETWORK_RECONNECT, interval=interval):
+ return True
+
+ return False
+
+ def handle_affection_level_up(self, interval=5) -> bool:
+ if self.appear_then_click(AFFECTION_LEVEL_UP, interval=interval):
+ timer = Timer(0.2).start()
+ while 1:
+ if timer.reached_and_reset():
+ self.device.screenshot()
+ if self.appear(AFFECTION_LEVEL_UP):
+ self.device.click(AFFECTION_LEVEL_UP)
+ else:
+ break
+ return True
+
+ return False
+
+ def handle_new_student(self, interval=5) -> bool:
+ if self.appear_then_click(GET_NEW_STUDENT, interval=interval):
+ return True
+
+ return False
diff --git a/tasks/base/ui.py b/tasks/base/ui.py
new file mode 100644
index 0000000..dba3dc3
--- /dev/null
+++ b/tasks/base/ui.py
@@ -0,0 +1,393 @@
+from module.base.button import ButtonWrapper
+from module.base.decorator import run_once
+from module.base.timer import Timer
+from module.exception import GameNotRunningError, GamePageUnknownError
+from module.logger import logger
+from module.ocr.ocr import Ocr
+from tasks.base.main_page import MainPage
+from tasks.base.page import Page, page_main
+from tasks.base.assets.assets_base_page import BACK
+
+
+class UI(MainPage):
+ ui_current: Page
+ ui_main_confirm_timer = Timer(0.2, count=2)
+
+ def ui_page_appear(self, page):
+ """
+ Args:
+ page (Page):
+ """
+ return self.appear(page.check_button)
+
+ def ui_get_current_page(self, skip_first_screenshot=True):
+ """
+ Args:
+ skip_first_screenshot:
+
+ Returns:
+ Page:
+
+ Raises:
+ GameNotRunningError:
+ GamePageUnknownError:
+ """
+ logger.info("UI get current page")
+
+ @run_once
+ def app_check():
+ if not self.device.app_is_running():
+ raise GameNotRunningError("Game not running")
+
+ @run_once
+ def minicap_check():
+ if self.config.Emulator_ControlMethod == "uiautomator2":
+ self.device.uninstall_minicap()
+
+ @run_once
+ def rotation_check():
+ self.device.get_orientation()
+
+ timeout = Timer(10, count=20).start()
+ while 1:
+ if skip_first_screenshot:
+ skip_first_screenshot = False
+ if not hasattr(self.device, "image") or self.device.image is None:
+ self.device.screenshot()
+ else:
+ self.device.screenshot()
+
+ # End
+ if timeout.reached():
+ break
+
+ # Known pages
+ for page in Page.iter_pages():
+ if page.check_button is None:
+ continue
+ if self.ui_page_appear(page=page):
+ logger.attr("UI", page.name)
+ self.ui_current = page
+ return page
+
+ # Unknown page but able to handle
+ logger.info("Unknown ui page")
+ if self.ui_additional():
+ logger.info("Additional ui page handled")
+ timeout.reset()
+ continue
+ logger.info("May be in standby main page")
+ self.device.click(BACK)
+
+ app_check()
+ minicap_check()
+ rotation_check()
+
+ # Unknown page, need manual switching
+ logger.warning("Unknown ui page")
+ logger.attr("EMULATOR__SCREENSHOT_METHOD", self.config.Emulator_ScreenshotMethod)
+ logger.attr("EMULATOR__CONTROL_METHOD", self.config.Emulator_ControlMethod)
+ logger.attr("Lang", self.config.LANG)
+ logger.warning("Starting from current page is not supported")
+ logger.warning(f"Supported page: {[str(page) for page in Page.iter_pages()]}")
+ logger.warning('Supported page: Any page with a "HOME" button on the upper-right')
+ logger.critical("Please switch to a supported page before starting AAS")
+ raise GamePageUnknownError
+
+ def ui_goto(self, destination, skip_first_screenshot=True):
+ """
+ Args:
+ destination (Page):
+ skip_first_screenshot:
+ """
+ # Create connection
+ Page.init_connection(destination)
+ self.interval_clear(list(Page.iter_check_buttons()))
+
+ # loading_timer = Timer(0.5)
+
+ logger.hr(f"UI goto {destination}")
+ while 1:
+ if skip_first_screenshot:
+ skip_first_screenshot = False
+ else:
+ self.device.screenshot()
+
+ # # Loading
+ # if self.appear(LOADING_CHECK):
+ # loading_timer.reset()
+ # continue
+ #
+ # if not loading_timer.reached():
+ # continue
+
+ # Destination page
+ if self.ui_page_appear(destination):
+ logger.info(f'Page arrive: {destination}')
+ if self.ui_page_confirm(destination):
+ logger.info(f'Page arrive confirm {destination}')
+ break
+
+ # Other pages
+ clicked = False
+ for page in Page.iter_pages():
+ if page.parent is None or page.check_button is None:
+ continue
+ if self.appear(page.check_button, interval=5):
+ logger.info(f'Page switch: {page} -> {page.parent}')
+ # self.handle_lang_check(page)
+ if self.ui_page_confirm(page):
+ logger.info(f'Page arrive confirm {page}')
+ button = page.links[page.parent]
+ self.device.click(button)
+ self.ui_button_interval_reset(button)
+ clicked = True
+ break
+ if clicked:
+ continue
+
+ # Additional
+ if self.ui_additional():
+ continue
+
+ # Reset connection
+ Page.clear_connection()
+
+ def ui_ensure(self, destination, acquire_lang_checked=True, skip_first_screenshot=True):
+ """
+ Args:
+ destination (Page):
+ acquire_lang_checked:
+ skip_first_screenshot:
+
+ Returns:
+ bool: If UI switched.
+ """
+ logger.hr("UI ensure")
+ self.ui_get_current_page(skip_first_screenshot=skip_first_screenshot)
+
+ # self.ui_leave_special()
+
+ # if acquire_lang_checked:
+ # if self.acquire_lang_checked():
+ # self.ui_get_current_page(skip_first_screenshot=skip_first_screenshot)
+
+ if self.ui_current == destination:
+ logger.info("Already at %s" % destination)
+ return False
+ else:
+ logger.info("Goto %s" % destination)
+ self.ui_goto(destination, skip_first_screenshot=True)
+ return True
+
+ def ui_ensure_index(
+ self,
+ index,
+ letter,
+ next_button,
+ prev_button,
+ skip_first_screenshot=False,
+ fast=True,
+ interval=(0.2, 0.3),
+ ):
+ """
+ Args:
+ index (int):
+ letter (Ocr, callable): OCR button.
+ next_button (Button):
+ prev_button (Button):
+ skip_first_screenshot (bool):
+ fast (bool): Default true. False when index is not continuous.
+ interval (tuple, int, float): Seconds between two click.
+ """
+ logger.hr("UI ensure index")
+ retry = Timer(1, count=2)
+ while 1:
+ if skip_first_screenshot:
+ skip_first_screenshot = False
+ else:
+ self.device.screenshot()
+
+ if isinstance(letter, Ocr):
+ current = letter.ocr_single_line(self.device.image)
+ else:
+ current = letter(self.device.image)
+
+ logger.attr("Index", current)
+ diff = index - current
+ if diff == 0:
+ break
+ if current == 0:
+ logger.warning(f'ui_ensure_index got an empty current value: {current}')
+ continue
+
+ if retry.reached():
+ button = next_button if diff > 0 else prev_button
+ if fast:
+ self.device.multi_click(button, n=abs(diff), interval=interval)
+ else:
+ self.device.click(button)
+ retry.reset()
+
+ def ui_click(
+ self,
+ click_button,
+ check_button,
+ appear_button=None,
+ additional=None,
+ retry_wait=5,
+ skip_first_screenshot=True,
+ ):
+ """
+ Args:
+ click_button (ButtonWrapper):
+ check_button (ButtonWrapper, callable, list[ButtonWrapper], tuple[ButtonWrapper]):
+ appear_button (ButtonWrapper, callable, list[ButtonWrapper], tuple[ButtonWrapper]):
+ additional (callable):
+ retry_wait (int, float):
+ skip_first_screenshot (bool):
+ """
+ if appear_button is None:
+ appear_button = click_button
+ logger.info(f'UI click: {appear_button} -> {check_button}')
+
+ def process_appear(button):
+ if isinstance(button, ButtonWrapper):
+ return self.appear(button)
+ elif callable(button):
+ return button()
+ elif isinstance(button, (list, tuple)):
+ for b in button:
+ if self.appear(b):
+ return True
+ return False
+ else:
+ return self.appear(button)
+
+ click_timer = Timer(retry_wait, count=retry_wait // 0.5)
+ while 1:
+ if skip_first_screenshot:
+ skip_first_screenshot = False
+ else:
+ self.device.screenshot()
+
+ # End
+ if process_appear(check_button):
+ break
+
+ # Click
+ if click_timer.reached():
+ if process_appear(appear_button):
+ self.device.click(click_button)
+ click_timer.reset()
+ continue
+ if additional is not None:
+ if additional():
+ continue
+
+ def is_in_main(self):
+ if self.appear(page_main.check_button):
+ if self.image_color_count(page_main.check_button, color=(235, 235, 235), threshold=221, count=400):
+ return True
+ # if self.appear(MAP_EXIT):
+ # if self.image_color_count(MAP_EXIT, color=(235, 235, 235), threshold=221, count=50):
+ # return True
+ return False
+
+ def ui_goto_main(self):
+ return self.ui_ensure(destination=page_main)
+
+ # def ui_additional(self) -> bool:
+ # """
+ # Handle all possible popups during UI switching.
+ #
+ # Returns:
+ # If handled any popup.
+ # """
+ # if self.handle_reward():
+ # return True
+ # if self.handle_battle_pass_notification():
+ # return True
+ # if self.handle_monthly_card_reward():
+ # return True
+ # if self.appear(COMBAT_PREPARE, interval=5):
+ # logger.info(f'UI additional: {COMBAT_PREPARE} -> {CLOSE}')
+ # self.device.click(CLOSE)
+ # if self.appear_then_click(COMBAT_EXIT, interval=5):
+ # return True
+ # if self.appear_then_click(INFO_CLOSE, interval=5):
+ # return True
+ #
+ # return False
+
+ def ui_additional(self) -> bool:
+ """
+ Handle all possible popups during UI switching.
+
+ Returns:
+ If handled any popup.
+ """
+ if self.handle_loading():
+ return True
+ if self.handle_reward_skip():
+ return True
+ if self.handle_reward():
+ return True
+ if self.handle_daily_news():
+ return True
+ if self.handle_network_reconnect():
+ return True
+ if self.handle_affection_level_up():
+ return True
+ if self.handle_new_student():
+ return True
+
+ return False
+
+ def _ui_button_confirm(
+ self,
+ button,
+ confirm=Timer(0.1, count=0),
+ timeout=Timer(2, count=6),
+ skip_first_screenshot=True
+ ):
+ confirm.reset()
+ timeout.reset()
+ while 1:
+ if skip_first_screenshot:
+ skip_first_screenshot = False
+ else:
+ self.device.screenshot()
+
+ if timeout.reached():
+ logger.warning(f'_ui_button_confirm({button}) timeout')
+ break
+
+ if self.appear(button):
+ if confirm.reached():
+ break
+ else:
+ confirm.reset()
+
+ def ui_page_confirm(self, page):
+ """
+ Args:
+ page (Page):
+
+ Returns:
+ bool: If handled
+ """
+ if page == page_main:
+ self._ui_button_confirm(page.check_button)
+ return True
+
+ return False
+
+ def ui_button_interval_reset(self, button):
+ """
+ Reset interval of some button to avoid mistaken clicks
+
+ Args:
+ button (Button):
+ """
+ pass
diff --git a/tasks/cafe/assets/assets_cafe.py b/tasks/cafe/assets/assets_cafe.py
new file mode 100644
index 0000000..9a11e35
--- /dev/null
+++ b/tasks/cafe/assets/assets_cafe.py
@@ -0,0 +1,85 @@
+from module.base.button import Button, ButtonWrapper
+
+# This file was auto-generated, do not modify it manually. To generate:
+# ``` python -m dev_tools.button_extract ```
+
+BOX_CAFE = ButtonWrapper(
+ name='BOX_CAFE',
+ jp=Button(
+ file='./assets/jp/cafe/BOX_CAFE.png',
+ area=(33, 130, 1247, 569),
+ search=(13, 110, 1267, 589),
+ color=(175, 181, 186),
+ button=(33, 130, 1247, 569),
+ ),
+)
+CHECK_REWARD = ButtonWrapper(
+ name='CHECK_REWARD',
+ jp=Button(
+ file='./assets/jp/cafe/CHECK_REWARD.png',
+ area=(1095, 621, 1146, 637),
+ search=(1075, 601, 1166, 657),
+ color=(82, 105, 129),
+ button=(1086, 607, 1225, 685),
+ ),
+)
+CLICKABLE_TEMPLATE = ButtonWrapper(
+ name='CLICKABLE_TEMPLATE',
+ jp=Button(
+ file='./assets/jp/cafe/CLICKABLE_TEMPLATE.png',
+ area=(0, 0, 42, 56),
+ search=(0, 0, 62, 76),
+ color=(77, 63, 1),
+ button=(0, 0, 42, 56),
+ ),
+)
+GET_REWARD = ButtonWrapper(
+ name='GET_REWARD',
+ jp=Button(
+ file='./assets/jp/cafe/GET_REWARD.png',
+ area=(611, 514, 669, 543),
+ search=(591, 494, 689, 563),
+ color=(159, 133, 48),
+ button=(546, 494, 735, 563),
+ ),
+)
+GET_REWARD_CLOSE = ButtonWrapper(
+ name='GET_REWARD_CLOSE',
+ jp=Button(
+ file='./assets/jp/cafe/GET_REWARD_CLOSE.png',
+ area=(891, 144, 917, 170),
+ search=(871, 124, 937, 190),
+ color=(173, 179, 189),
+ button=(891, 144, 917, 170),
+ ),
+)
+GOT_REWARD = ButtonWrapper(
+ name='GOT_REWARD',
+ jp=Button(
+ file='./assets/jp/cafe/GOT_REWARD.png',
+ area=(609, 507, 672, 535),
+ search=(589, 487, 692, 555),
+ color=(174, 175, 174),
+ button=(609, 507, 672, 535),
+ ),
+)
+OCR_CAFE = ButtonWrapper(
+ name='OCR_CAFE',
+ jp=Button(
+ file='./assets/jp/cafe/OCR_CAFE.png',
+ area=(1103, 642, 1202, 672),
+ search=(1083, 622, 1222, 692),
+ color=(87, 107, 129),
+ button=(1103, 642, 1202, 672),
+ ),
+)
+STUDENT_LIST = ButtonWrapper(
+ name='STUDENT_LIST',
+ jp=Button(
+ file='./assets/jp/cafe/STUDENT_LIST.png',
+ area=(612, 172, 667, 201),
+ search=(592, 152, 687, 221),
+ color=(145, 157, 172),
+ button=(545, 423, 738, 495),
+ ),
+)
diff --git a/tasks/cafe/cafe.py b/tasks/cafe/cafe.py
new file mode 100644
index 0000000..055b449
--- /dev/null
+++ b/tasks/cafe/cafe.py
@@ -0,0 +1,227 @@
+import cv2
+import numpy as np
+from enum import Enum
+
+from module.logger import logger
+from module.base.timer import Timer
+from module.base.button import ClickButton
+from module.base.utils.utils import area_offset
+from module.ocr.ocr import Digit
+from tasks.base.page import page_cafe
+from tasks.base.ui import UI
+from tasks.cafe.assets.assets_cafe import *
+
+
+class CafeStatus(Enum):
+ STUDENT_LIST = 0
+ OCR = 1
+ REWARD = 2
+ GOT = 3
+ CLICK = 4
+ CHECK = 5
+ FINISHED = -1
+
+
+class Cafe(UI):
+ @staticmethod
+ def merge_points(points, threshold=3):
+ if len(points) <= 1:
+ return points
+ result = []
+ for point in points:
+ if not result:
+ result.append(point)
+ continue
+ if point[0] - result[-1][0] < threshold and point[1] - result[-1][1] < threshold:
+ result[-1] = ((point[0] + result[-1][0]) // 2, (point[1] + result[-1][1]) // 2)
+ continue
+ result.append(point)
+ return result
+
+ @staticmethod
+ def _extract_clickable_from_image(image):
+ # convert to hsv for better color matching
+ image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
+ hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
+ # set color range
+ lower_hsv = np.array([17, 200, 220])
+ upper_hsv = np.array([28, 255, 255])
+ # get mask
+ mask = cv2.inRange(hsv, lower_hsv, upper_hsv)
+ # generate result
+ return cv2.bitwise_and(image, image, mask=mask)
+
+ def _match_clickable_points(self, image, threshold=0.9):
+ image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
+ template = self.btn.matched_button.image
+ template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
+
+ res = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
+ loc = np.where(res >= threshold)
+ return [point for point in zip(*loc[::-1])]
+
+ def _get_clickable_buttons(self, threshold=0.9, offset=(0, 0)):
+ image = cv2.copyMakeBorder(self.device.image, 20, 20, 10, 60, cv2.BORDER_CONSTANT, value=(0, 0, 0))
+ image = self._extract_clickable_from_image(image)
+ points = self._match_clickable_points(image, threshold)
+ points = self.merge_points(points)
+ if not points:
+ return []
+ area = area_offset((0, 0, self.btn.width, self.btn.height), offset)
+ return [
+ ClickButton(
+ button=area_offset(area, offset=point),
+ name=self.btn.name
+ )
+ for point in points
+ ]
+
+ def _reset_cafe_position(self, direction: str):
+ width = BOX_CAFE.width
+ height = BOX_CAFE.height
+ r = np.random.uniform(0.6, 0.8)
+ vector_down = (width * r, height * r)
+ vector_up = (width * r, -height * r)
+ vector_left = (-width * r, 0)
+ vector_right = (width * r, 0)
+ random_r = (-5, -5, 5, 5)
+ match direction:
+ case 'init':
+ self.device.pinch()
+ self.device.swipe_vector(vector_down, box=BOX_CAFE.area, random_range=random_r, padding=5)
+ self.device.swipe_vector(vector_right, box=BOX_CAFE.area, random_range=random_r, padding=5)
+ self.device.swipe_vector(vector_up, box=BOX_CAFE.area, random_range=random_r, padding=5)
+ self.device.swipe_vector(vector_up, box=BOX_CAFE.area, random_range=random_r, padding=5)
+ case 'left':
+ self.device.swipe_vector(vector_left, box=BOX_CAFE.area, random_range=random_r, padding=5)
+ self.device.swipe_vector(vector_left, box=BOX_CAFE.area, random_range=random_r, padding=5)
+ case 'right':
+ self.device.swipe_vector(vector_right, box=BOX_CAFE.area, random_range=random_r, padding=5)
+ self.device.swipe_vector(vector_right, box=BOX_CAFE.area, random_range=random_r, padding=5)
+
+ def _get_reward_num(self):
+ ocr = Digit(OCR_CAFE)
+ num = ocr.detect_and_ocr(self.device.image)
+ if len(num) != 1:
+ logger.warning(f'Invalid reward num: {num}')
+ num = float(num[0].ocr_text.rstrip('%'))
+ logger.attr('Reward', num)
+ return num
+
+ def _handle_cafe(self, status):
+ match status:
+ case CafeStatus.STUDENT_LIST:
+ self.appear_then_click(STUDENT_LIST)
+ if not self.appear(STUDENT_LIST):
+ return CafeStatus.OCR
+ case CafeStatus.OCR:
+ reward = self._get_reward_num()
+ if reward == 0:
+ return CafeStatus.GOT
+ if self.appear_then_click(CHECK_REWARD):
+ return CafeStatus.REWARD
+ case CafeStatus.REWARD:
+ if self.match_color(GOT_REWARD):
+ self.device.click(GET_REWARD_CLOSE)
+ return CafeStatus.GOT
+ if not self.appear(GET_REWARD):
+ return CafeStatus.OCR
+ if self.match_color(GET_REWARD):
+ self.device.click(GET_REWARD)
+ case CafeStatus.GOT:
+ logger.info('Cafe reward have been got')
+ self.appear_then_click(GET_REWARD_CLOSE)
+ return CafeStatus.CLICK
+ case CafeStatus.CLICK:
+ buttons = self._get_clickable_buttons(offset=(45, 10))
+ self.click = len(buttons)
+ logger.attr('Clickable', self.click)
+ if not buttons:
+ return CafeStatus.CHECK
+ self.device.click(buttons[0])
+ case CafeStatus.CHECK:
+ buttons = self._get_clickable_buttons()
+ if not self.is_adjust_on:
+ if not buttons:
+ return CafeStatus.FINISHED
+ else:
+ return CafeStatus.CLICK
+ if not buttons:
+ self.check += 1
+ else:
+ self.check = 0
+ return CafeStatus.CLICK
+ match self.check:
+ case 1:
+ self._reset_cafe_position('left')
+ case 2:
+ self._reset_cafe_position('right')
+ case 3:
+ self._reset_cafe_position('init')
+ case 4:
+ return CafeStatus.FINISHED
+ case CafeStatus.FINISHED:
+ return status
+ case _:
+ logger.warning(f'Invalid status: {status}')
+ return status
+
+ def run(self):
+ self.btn = CLICKABLE_TEMPLATE
+ self.click = 0
+ self.check = 0
+
+ is_reward_on = self.config.Cafe_Reward
+ is_touch_on = self.config.Cafe_Touch
+ self.is_adjust_on = self.config.Cafe_AutoAdjust
+
+ self.ui_ensure(page_cafe)
+
+ status = CafeStatus.STUDENT_LIST
+ loading_timer = Timer(2).start()
+ action_timer = Timer(1.5, count=1) # cant be too fast
+ check_timer = Timer(1, count=1)
+ is_list = False
+ is_reset = False
+ is_enable = is_reward_on or is_touch_on
+
+ while is_enable:
+ self.device.screenshot()
+
+ if self.ui_additional():
+ continue
+
+ if not loading_timer.reached():
+ continue
+
+ if not is_list and status == CafeStatus.STUDENT_LIST and self.appear(STUDENT_LIST):
+ is_list = True
+ loading_timer = Timer(5).start()
+ continue
+
+ if not is_reward_on and status == CafeStatus.OCR:
+ logger.info('Skip reward')
+ status = CafeStatus.CLICK
+ continue
+
+ if not is_touch_on and status == CafeStatus.CLICK:
+ logger.info('Skip touch')
+ status = CafeStatus.FINISHED
+ continue
+
+ if is_touch_on and not is_reset and status == CafeStatus.CLICK:
+ self._reset_cafe_position('init')
+ is_reset = True
+ continue
+
+ if status == CafeStatus.CHECK and not check_timer.reached_and_reset():
+ continue
+
+ if action_timer.reached_and_reset():
+ status = self._handle_cafe(status)
+ logger.attr('Status', status)
+
+ if status is CafeStatus.FINISHED:
+ break
+
+ self.config.task_delay(server_update=True, minute=180)
diff --git a/tasks/circle/assets/assets_circle.py b/tasks/circle/assets/assets_circle.py
new file mode 100644
index 0000000..68e424a
--- /dev/null
+++ b/tasks/circle/assets/assets_circle.py
@@ -0,0 +1,15 @@
+from module.base.button import Button, ButtonWrapper
+
+# This file was auto-generated, do not modify it manually. To generate:
+# ``` python -m dev_tools.button_extract ```
+
+GET_REWARD_AP = ButtonWrapper(
+ name='GET_REWARD_AP',
+ jp=Button(
+ file='./assets/jp/circle/GET_REWARD_AP.png',
+ area=(540, 148, 623, 175),
+ search=(520, 128, 643, 195),
+ color=(198, 206, 213),
+ button=(543, 457, 735, 524),
+ ),
+)
diff --git a/tasks/circle/circle.py b/tasks/circle/circle.py
new file mode 100644
index 0000000..a4ddb13
--- /dev/null
+++ b/tasks/circle/circle.py
@@ -0,0 +1,56 @@
+from enum import Enum
+
+from module.base.timer import Timer
+from module.logger import logger
+from tasks.base.page import page_circle
+from tasks.base.ui import UI
+from tasks.circle.assets.assets_circle import *
+
+
+class CircleStatus(Enum):
+ """
+ Circle status
+ """
+ REWARD = 0
+ GOT = 1
+ FINISHED = -1
+
+
+class Circle(UI):
+ def _handle_circle(self, status):
+ match status:
+ case CircleStatus.REWARD:
+ if self.appear_then_click(GET_REWARD_AP):
+ logger.info("Get circle AP reward")
+ return CircleStatus.FINISHED
+ case CircleStatus.GOT:
+ logger.info("Circle AP reward have been got")
+ return CircleStatus.FINISHED
+ case _:
+ logger.warning(f"Invalid status: {status}")
+ return status
+
+ def run(self):
+ self.ui_ensure(page_circle)
+
+ status = CircleStatus.REWARD
+ action_timer = Timer(0.5)
+ ap_timer = Timer(2).start()
+
+ while 1:
+ self.device.screenshot()
+
+ if self.ui_additional():
+ continue
+
+ if ap_timer.reached() and status == CircleStatus.REWARD:
+ status = CircleStatus.GOT
+
+ if action_timer.reached_and_reset():
+ status = self._handle_circle(status)
+ logger.attr('Status', status)
+
+ if status is CircleStatus.FINISHED:
+ break
+
+ self.config.task_delay(server_update=True)
diff --git a/tasks/item/assets/assets_item_data.py b/tasks/item/assets/assets_item_data.py
new file mode 100644
index 0000000..6860b3d
--- /dev/null
+++ b/tasks/item/assets/assets_item_data.py
@@ -0,0 +1,25 @@
+from module.base.button import Button, ButtonWrapper
+
+# This file was auto-generated, do not modify it manually. To generate:
+# ``` python -m dev_tools.button_extract ```
+
+OCR_AP = ButtonWrapper(
+ name='OCR_AP',
+ share=Button(
+ file='./assets/share/item/data/OCR_AP.png',
+ area=(560, 11, 667, 37),
+ search=(540, 0, 687, 57),
+ color=(211, 216, 219),
+ button=(560, 11, 667, 37),
+ ),
+)
+OCR_DATA = ButtonWrapper(
+ name='OCR_DATA',
+ share=Button(
+ file='./assets/share/item/data/OCR_DATA.png',
+ area=(768, 12, 1072, 37),
+ search=(748, 0, 1092, 57),
+ color=(212, 220, 224),
+ button=(768, 12, 1072, 37),
+ ),
+)
diff --git a/tasks/item/data_update.py b/tasks/item/data_update.py
new file mode 100644
index 0000000..1d1a482
--- /dev/null
+++ b/tasks/item/data_update.py
@@ -0,0 +1,47 @@
+from module.base.timer import Timer
+from module.logger import logger
+from module.ocr.ocr import Digit, DigitCounter
+from tasks.base.page import page_work
+from tasks.base.ui import UI
+from tasks.item.assets.assets_item_data import *
+
+
+class DataUpdate(UI):
+ def _get_data(self):
+ """
+ Page:
+ in: page_work
+ """
+ ap = DigitCounter(OCR_AP).ocr_single_line(self.device.image)
+ # Data for Credit and Pyroxene
+ ocr = Digit(OCR_DATA)
+ timeout = Timer(2, count=6).start()
+ while 1:
+ data = ocr.detect_and_ocr(self.device.image)
+ if len(data) != 2:
+ data = [data[0], data[-1]]
+ logger.attr('Data', data)
+ credit, pyroxene = [int(''.join([v for v in d.ocr_text if v.isdigit()])) for d in data]
+ if credit > 0 or pyroxene > 0:
+ break
+
+ logger.warning(f'Invalid credit and pyroxene: {data}')
+ if timeout.reached():
+ logger.warning('Get data timeout')
+ break
+
+ logger.attr('Credit', credit)
+ logger.attr('Pyroxene', pyroxene)
+ with self.config.multi_set():
+ self.config.stored.AP.set(ap[0], ap[2])
+ self.config.stored.Credit.value = credit
+ self.config.stored.Pyroxene.value = pyroxene
+
+ return ap, credit, pyroxene
+
+ def run(self):
+ self.ui_ensure(page_work, acquire_lang_checked=False)
+
+ with self.config.multi_set():
+ self._get_data()
+ self.config.task_delay(server_update=True)
diff --git a/tasks/login/assets/assets_login.py b/tasks/login/assets/assets_login.py
new file mode 100644
index 0000000..7c0fd38
--- /dev/null
+++ b/tasks/login/assets/assets_login.py
@@ -0,0 +1,25 @@
+from module.base.button import Button, ButtonWrapper
+
+# This file was auto-generated, do not modify it manually. To generate:
+# ``` python -m dev_tools.button_extract ```
+
+LOGIN_CONFIRM = ButtonWrapper(
+ name='LOGIN_CONFIRM',
+ jp=Button(
+ file='./assets/jp/login/LOGIN_CONFIRM.png',
+ area=(36, 621, 98, 654),
+ search=(16, 601, 118, 674),
+ color=(211, 215, 220),
+ button=(990, 354, 1232, 506),
+ ),
+)
+LOGIN_LOADING = ButtonWrapper(
+ name='LOGIN_LOADING',
+ jp=Button(
+ file='./assets/jp/login/LOGIN_LOADING.png',
+ area=(34, 682, 60, 707),
+ search=(14, 662, 80, 720),
+ color=(8, 66, 96),
+ button=(34, 682, 60, 707),
+ ),
+)
diff --git a/tasks/login/login.py b/tasks/login/login.py
new file mode 100644
index 0000000..e3ecb15
--- /dev/null
+++ b/tasks/login/login.py
@@ -0,0 +1,109 @@
+from module.base.timer import Timer
+from module.exception import GameNotRunningError
+from module.logger import logger
+from tasks.base.page import page_main
+from tasks.base.ui import UI
+# from tasks.login.assets.assets_login import LOGIN_CONFIRM, USER_AGREEMENT_ACCEPT, LOGIN_LOADING
+from tasks.login.assets.assets_login import LOGIN_CONFIRM, LOGIN_LOADING
+
+
+class Login(UI):
+ def _handle_app_login(self):
+ """
+ Pages:
+ in: Any page
+ out: page_main
+
+ Raises:
+ GameStuckError:
+ GameTooManyClickError:
+ GameNotRunningError:
+ """
+ def _page_main_twice_confirm():
+ if self.ui_page_appear(page_main):
+ timer = Timer(1).start()
+ while 1:
+ if timer.reached():
+ self.device.screenshot()
+ if self.ui_page_appear(page_main):
+ logger.info('Login to main confirm')
+ return True
+ return False
+
+ logger.hr('App login')
+ orientation_timer = Timer(5)
+ startup_timer = Timer(5).start()
+ app_timer = Timer(5).start()
+ login_success = False
+
+ while 1:
+ # Watch if game alive
+ if app_timer.reached():
+ if not self.device.app_is_running():
+ logger.error('Game died during launch')
+ raise GameNotRunningError('Game not running')
+ app_timer.reset()
+ # Watch device rotation
+ if not login_success and orientation_timer.reached():
+ # Screen may rotate after starting an app
+ self.device.get_orientation()
+ orientation_timer.reset()
+
+ self.device.screenshot()
+
+ # End
+ # Game client requires at least 5s to start
+ # The first few frames might be captured before app_stop(), ignore them
+ if startup_timer.reached():
+ if self.handle_daily_reward() or self.handle_daily_news():
+ startup_timer.reset() # reuse startup timer as daily reward timer
+ continue
+ if _page_main_twice_confirm():
+ break
+
+ # Watch resource downloading and loading
+ if self.match_color(LOGIN_LOADING, interval=5, threshold=45):
+ logger.info('Game resources downloading or loading')
+ self.device.stuck_record_clear()
+
+ # Login
+ if self.appear_then_click(LOGIN_CONFIRM):
+ login_success = True
+ continue
+ # if self.appear_then_click(USER_AGREEMENT_ACCEPT):
+ # continue
+ # Additional
+ # if self.handle_popup_single():
+ # continue
+ # if self.handle_popup_confirm():
+ # continue
+ if self.ui_additional():
+ continue
+
+ return True
+
+ def handle_app_login(self):
+ logger.info('handle_app_login')
+ self.device.screenshot_interval_set(1.0)
+ self.device.stuck_timer = Timer(300, count=300).start()
+ try:
+ self._handle_app_login()
+ finally:
+ self.device.screenshot_interval_set()
+ self.device.stuck_timer = Timer(60, count=60).start()
+
+ def app_stop(self):
+ logger.hr('App stop')
+ self.device.app_stop()
+
+ def app_start(self):
+ logger.hr('App start')
+ self.device.app_start()
+ self.handle_app_login()
+
+ def app_restart(self):
+ logger.hr('App restart')
+ self.device.app_stop()
+ self.device.app_start()
+ self.handle_app_login()
+ self.config.task_delay(server_update=True)
diff --git a/tasks/mail/assets/assets_mail.py b/tasks/mail/assets/assets_mail.py
new file mode 100644
index 0000000..fe64618
--- /dev/null
+++ b/tasks/mail/assets/assets_mail.py
@@ -0,0 +1,25 @@
+from module.base.button import Button, ButtonWrapper
+
+# This file was auto-generated, do not modify it manually. To generate:
+# ``` python -m dev_tools.button_extract ```
+
+MAIL_RECEIVE = ButtonWrapper(
+ name='MAIL_RECEIVE',
+ jp=Button(
+ file='./assets/jp/mail/MAIL_RECEIVE.png',
+ area=(1086, 659, 1183, 682),
+ search=(1066, 639, 1203, 702),
+ color=(174, 151, 53),
+ button=(1043, 640, 1226, 701),
+ ),
+)
+MAIL_RECEIVED = ButtonWrapper(
+ name='MAIL_RECEIVED',
+ jp=Button(
+ file='./assets/jp/mail/MAIL_RECEIVED.png',
+ area=(1085, 657, 1186, 685),
+ search=(1065, 637, 1206, 705),
+ color=(195, 196, 196),
+ button=(1085, 657, 1186, 685),
+ ),
+)
diff --git a/tasks/mail/mail.py b/tasks/mail/mail.py
new file mode 100644
index 0000000..d71344f
--- /dev/null
+++ b/tasks/mail/mail.py
@@ -0,0 +1,26 @@
+from module.base.timer import Timer
+from module.logger import logger
+from tasks.base.page import page_mail
+from tasks.base.ui import UI
+from tasks.mail.assets.assets_mail import *
+
+
+class Mail(UI):
+ def run(self):
+ self.ui_ensure(page_mail)
+ action_timer = Timer(1).start()
+
+ while 1:
+ self.device.screenshot()
+ if self.ui_additional():
+ continue
+ if action_timer.reached_and_reset():
+ if self.match_color(MAIL_RECEIVE):
+ self.device.click(MAIL_RECEIVE)
+ logger.info("Receive mail")
+ continue
+ if self.appear(MAIL_RECEIVED):
+ logger.info("Mail have been received")
+ break
+
+ self.config.task_delay(server_update=True)
diff --git a/tasks/schedule/assets/assets_schedule.py b/tasks/schedule/assets/assets_schedule.py
new file mode 100644
index 0000000..75b7492
--- /dev/null
+++ b/tasks/schedule/assets/assets_schedule.py
@@ -0,0 +1,15 @@
+from module.base.button import Button, ButtonWrapper
+
+# This file was auto-generated, do not modify it manually. To generate:
+# ``` python -m dev_tools.button_extract ```
+
+SCROLL = ButtonWrapper(
+ name='SCROLL',
+ jp=Button(
+ file='./assets/jp/schedule/SCROLL.png',
+ area=(742, 136, 1101, 671),
+ search=(722, 116, 1121, 691),
+ color=(198, 214, 210),
+ button=(742, 136, 1101, 671),
+ ),
+)
diff --git a/tasks/tactical_challenge/assets/assets_tactical_challenge.py b/tasks/tactical_challenge/assets/assets_tactical_challenge.py
new file mode 100644
index 0000000..33a6425
--- /dev/null
+++ b/tasks/tactical_challenge/assets/assets_tactical_challenge.py
@@ -0,0 +1,145 @@
+from module.base.button import Button, ButtonWrapper
+
+# This file was auto-generated, do not modify it manually. To generate:
+# ``` python -m dev_tools.button_extract ```
+
+CHALLENGE_LOSE = ButtonWrapper(
+ name='CHALLENGE_LOSE',
+ jp=Button(
+ file='./assets/jp/tactical_challenge/CHALLENGE_LOSE.png',
+ area=(583, 195, 698, 224),
+ search=(563, 175, 718, 244),
+ color=(146, 158, 173),
+ button=(548, 431, 738, 499),
+ ),
+)
+CHALLENGE_WIN = ButtonWrapper(
+ name='CHALLENGE_WIN',
+ jp=Button(
+ file='./assets/jp/tactical_challenge/CHALLENGE_WIN.png',
+ area=(583, 131, 698, 160),
+ search=(563, 111, 718, 180),
+ color=(151, 165, 180),
+ button=(549, 495, 737, 563),
+ ),
+)
+GET_REWARD_CREDIT = ButtonWrapper(
+ name='GET_REWARD_CREDIT',
+ jp=Button(
+ file='./assets/jp/tactical_challenge/GET_REWARD_CREDIT.png',
+ area=(308, 360, 397, 415),
+ search=(288, 340, 417, 435),
+ color=(215, 193, 61),
+ button=(308, 360, 397, 415),
+ ),
+)
+GET_REWARD_DAILY = ButtonWrapper(
+ name='GET_REWARD_DAILY',
+ jp=Button(
+ file='./assets/jp/tactical_challenge/GET_REWARD_DAILY.png',
+ area=(307, 440, 395, 493),
+ search=(287, 420, 415, 513),
+ color=(214, 192, 60),
+ button=(307, 440, 395, 493),
+ ),
+)
+GOT_REWARD_CREDIT = ButtonWrapper(
+ name='GOT_REWARD_CREDIT',
+ jp=Button(
+ file='./assets/jp/tactical_challenge/GOT_REWARD_CREDIT.png',
+ area=(308, 358, 398, 416),
+ search=(288, 338, 418, 436),
+ color=(203, 205, 204),
+ button=(308, 358, 398, 416),
+ ),
+)
+GOT_REWARD_DAILY = ButtonWrapper(
+ name='GOT_REWARD_DAILY',
+ jp=Button(
+ file='./assets/jp/tactical_challenge/GOT_REWARD_DAILY.png',
+ area=(307, 439, 397, 494),
+ search=(287, 419, 417, 514),
+ color=(203, 203, 204),
+ button=(307, 439, 397, 494),
+ ),
+)
+OCR_TICKET = ButtonWrapper(
+ name='OCR_TICKET',
+ jp=Button(
+ file='./assets/jp/tactical_challenge/OCR_TICKET.png',
+ area=(206, 479, 240, 499),
+ search=(186, 459, 260, 519),
+ color=(200, 202, 204),
+ button=(206, 479, 240, 499),
+ ),
+)
+PLAYER_SELECT_FIRST = ButtonWrapper(
+ name='PLAYER_SELECT_FIRST',
+ jp=Button(
+ file='./assets/jp/tactical_challenge/PLAYER_SELECT_FIRST.png',
+ area=(467, 293, 496, 316),
+ search=(447, 273, 516, 336),
+ color=(191, 202, 207),
+ button=(558, 179, 1118, 282),
+ ),
+)
+PLAYER_SELECT_SECOND = ButtonWrapper(
+ name='PLAYER_SELECT_SECOND',
+ jp=Button(
+ file='./assets/jp/tactical_challenge/PLAYER_SELECT_SECOND.png',
+ area=(466, 451, 496, 475),
+ search=(446, 431, 516, 495),
+ color=(192, 203, 208),
+ button=(554, 336, 1127, 443),
+ ),
+)
+PLAYER_SELECT_THIRD = ButtonWrapper(
+ name='PLAYER_SELECT_THIRD',
+ jp=Button(
+ file='./assets/jp/tactical_challenge/PLAYER_SELECT_THIRD.png',
+ area=(466, 608, 496, 634),
+ search=(446, 588, 516, 654),
+ color=(194, 206, 211),
+ button=(557, 495, 1120, 599),
+ ),
+)
+PREPARE_CHALLENGE = ButtonWrapper(
+ name='PREPARE_CHALLENGE',
+ jp=Button(
+ file='./assets/jp/tactical_challenge/PREPARE_CHALLENGE.png',
+ area=(583, 83, 698, 111),
+ search=(563, 63, 718, 131),
+ color=(148, 161, 175),
+ button=(561, 548, 723, 598),
+ ),
+)
+SKIP_OFF = ButtonWrapper(
+ name='SKIP_OFF',
+ jp=Button(
+ file='./assets/jp/tactical_challenge/SKIP_OFF.png',
+ area=(1087, 585, 1127, 622),
+ search=(1067, 565, 1147, 642),
+ color=(96, 137, 171),
+ button=(1088, 582, 1250, 626),
+ ),
+)
+SKIP_ON = ButtonWrapper(
+ name='SKIP_ON',
+ jp=Button(
+ file='./assets/jp/tactical_challenge/SKIP_ON.png',
+ area=(1096, 591, 1121, 615),
+ search=(1076, 571, 1141, 635),
+ color=(99, 177, 212),
+ button=(1089, 581, 1250, 626),
+ ),
+)
+START_CHALLENGE = ButtonWrapper(
+ name='START_CHALLENGE',
+ jp=Button(
+ file='./assets/jp/tactical_challenge/START_CHALLENGE.png',
+ area=(107, 10, 159, 37),
+ search=(87, 0, 179, 57),
+ color=(148, 161, 176),
+ button=(1091, 635, 1246, 704),
+ ),
+)
diff --git a/tasks/tactical_challenge/tactical_challenge.py b/tasks/tactical_challenge/tactical_challenge.py
new file mode 100644
index 0000000..cb9dc18
--- /dev/null
+++ b/tasks/tactical_challenge/tactical_challenge.py
@@ -0,0 +1,157 @@
+import random
+from enum import Enum
+
+from module.base.timer import Timer
+from module.logger import logger
+from module.ocr.ocr import DigitCounter
+from module.ui.switch import Switch
+from tasks.base.page import page_tactical_challenge
+from tasks.base.ui import UI
+from tasks.tactical_challenge.assets.assets_tactical_challenge import *
+
+SWITCH_SKIP = Switch('Skip_switch')
+SWITCH_SKIP.add_state('on', SKIP_ON)
+SWITCH_SKIP.add_state('off', SKIP_OFF)
+
+
+class TCStatus(Enum):
+ """
+ Tactical challenge status
+ """
+ REWARD = 0
+ OCR = 1
+ SELECT = 2
+ PREPARE = 3
+ SKIP = 4
+ START = 5
+ RESULT = 6
+ WIN = 7
+ LOSE = 8
+ FINAL = 9
+ FINISHED = -1
+
+
+class TacticalChallenge(UI):
+ select_players = (PLAYER_SELECT_FIRST, PLAYER_SELECT_SECOND, PLAYER_SELECT_THIRD)
+
+ def _get_ticket(self):
+ """
+ Page:
+ in: page_tactical_challenge
+ """
+ ocr = DigitCounter(OCR_TICKET).ocr_single_line(self.device.image)
+ # number of tickets remaining
+ ticket, _, total = ocr
+ if total == 0:
+ logger.warning('Invalid ticket')
+ return False, 5
+ logger.attr('Ticket', ticket)
+
+ return True, ticket
+
+ def _get_reward(self):
+ if self.match_color(GET_REWARD_DAILY):
+ self.device.click(GET_REWARD_DAILY)
+ logger.info('Get tc daily reward')
+ return True
+ if self.match_color(GET_REWARD_CREDIT):
+ self.device.click(GET_REWARD_CREDIT)
+ logger.info('Get tc credit reward')
+ return True
+ if self.match_color(GOT_REWARD_DAILY) and self.match_color(GOT_REWARD_CREDIT):
+ logger.info('Both tc reward got')
+ return True
+
+ return False
+
+ def _set_skip(self):
+ """
+ Set skip switch to on
+ :returns: True if switch is set, False if switch not found
+ """
+ if not SWITCH_SKIP.appear(main=self):
+ logger.info('Skip switch not found')
+ return False
+ SWITCH_SKIP.set('on', main=self)
+
+ return True
+
+ def _player_select(self, select):
+ if select:
+ return random.choice(self.select_players)
+ else:
+ return self.select_players[select]
+
+ def _handle_challenge(self, status):
+ match status:
+ case TCStatus.REWARD:
+ if self._get_reward():
+ return TCStatus.OCR
+ case TCStatus.OCR:
+ is_valid, ticket = self._get_ticket()
+ if not is_valid:
+ return status
+ if ticket == 0:
+ return TCStatus.FINISHED
+ return TCStatus.SELECT
+ case TCStatus.SELECT:
+ self.appear_then_click(self.select)
+ if self.appear(PREPARE_CHALLENGE):
+ return TCStatus.PREPARE
+ case TCStatus.PREPARE:
+ self.appear_then_click(PREPARE_CHALLENGE)
+ if not self.appear(PREPARE_CHALLENGE):
+ return TCStatus.SKIP
+ case TCStatus.SKIP:
+ if not self._set_skip():
+ return TCStatus.SKIP
+ return TCStatus.START
+ case TCStatus.START:
+ self.appear_then_click(START_CHALLENGE)
+ if not self.appear(START_CHALLENGE):
+ return TCStatus.RESULT
+ case TCStatus.RESULT:
+ if self.appear_then_click(CHALLENGE_WIN):
+ return TCStatus.WIN
+ if self.appear_then_click(CHALLENGE_LOSE):
+ return TCStatus.LOSE
+ case TCStatus.WIN | TCStatus.LOSE:
+ if self.appear(CHALLENGE_WIN) or self.appear(CHALLENGE_LOSE):
+ return TCStatus.RESULT
+ is_valid, ticket = self._get_ticket()
+ if not is_valid:
+ return status
+ if ticket == 0:
+ return TCStatus.FINISHED
+ return TCStatus.FINAL
+ case TCStatus.FINAL | TCStatus.FINISHED:
+ return status
+ case _:
+ logger.warning(f'Invalid status: {status}')
+ return status
+
+ def run(self):
+ self.ui_ensure(page_tactical_challenge)
+
+ self.select = self._player_select(self.config.TacticalChallenge_PlayerSelect)
+ status = TCStatus.REWARD
+ action_timer = Timer(1, count=1)
+ # ensure reward can be clicked
+ ui_timer = Timer(2).start()
+
+ while 1:
+ self.device.screenshot()
+ if self.ui_additional():
+ continue
+ if not ui_timer.reached():
+ continue
+ if action_timer.reached_and_reset():
+ status = self._handle_challenge(status)
+ logger.attr('Status', status.name)
+ if status in (TCStatus.FINAL, TCStatus.FINISHED):
+ break
+
+ if status is TCStatus.FINISHED:
+ self.config.task_delay(server_update=True)
+ else:
+ self.config.task_delay(minute=1)
diff --git a/webapp/.editorconfig b/webapp/.editorconfig
new file mode 100644
index 0000000..872069e
--- /dev/null
+++ b/webapp/.editorconfig
@@ -0,0 +1,18 @@
+# EditorConfig is awesome: http://EditorConfig.org
+
+# https://github.com/jokeyrhyme/standard-editorconfig
+
+# top-most EditorConfig file
+root = true
+
+# defaults
+[*]
+charset = utf-8
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+indent_size = 2
+indent_style = space
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/webapp/.electron-builder.config.js b/webapp/.electron-builder.config.js
new file mode 100644
index 0000000..0938d0d
--- /dev/null
+++ b/webapp/.electron-builder.config.js
@@ -0,0 +1,28 @@
+/**
+ * But currently electron-builder doesn't support ESM configs
+ * @see https://github.com/develar/read-config-file/issues/10
+ */
+
+/**
+ * @type {() => import('electron-builder').Configuration}
+ * @see https://www.electron.build/configuration/configuration
+ */
+module.exports = async function () {
+ const {getVersion} = await import('./version/getVersion.mjs');
+
+ return {
+ directories: {
+ output: 'dist',
+ buildResources: 'buildResources',
+ },
+ files: ['packages/**/dist/**'],
+ extraMetadata: {
+ version: getVersion(),
+ },
+
+ // Specify linux target just for disabling snap compilation
+ linux: {
+ target: 'deb',
+ },
+ };
+};
diff --git a/webapp/.env.development b/webapp/.env.development
new file mode 100644
index 0000000..e69de29
diff --git a/webapp/.eslintrc.json b/webapp/.eslintrc.json
new file mode 100644
index 0000000..5f65e89
--- /dev/null
+++ b/webapp/.eslintrc.json
@@ -0,0 +1,55 @@
+{
+ "root": true,
+ "env": {
+ "es2021": true,
+ "node": true,
+ "browser": false
+ },
+ "extends": [
+ "eslint:recommended",
+ /** @see https://github.com/typescript-eslint/typescript-eslint/tree/master/packages/eslint-plugin#recommended-configs */
+ "plugin:@typescript-eslint/recommended",
+ "prettier",
+ "plugin:prettier/recommended"
+ ],
+ "parser": "@typescript-eslint/parser",
+ "parserOptions": {
+ "ecmaVersion": 12,
+ "sourceType": "module"
+ },
+ "plugins": ["@typescript-eslint"],
+ "ignorePatterns": ["node_modules/**", "**/dist/**"],
+ "rules": {
+ "@typescript-eslint/no-unused-vars": [
+ "error",
+ {
+ "argsIgnorePattern": "^_",
+ "varsIgnorePattern": "^_"
+ }
+ ],
+ "@typescript-eslint/no-var-requires": "off",
+ "@typescript-eslint/consistent-type-imports": "error",
+ /**
+ * Having a semicolon helps the optimizer interpret your code correctly.
+ * This avoids rare errors in optimized code.
+ * @see https://twitter.com/alex_kozack/status/1364210394328408066
+ */
+ "semi": ["error", "always"],
+ /**
+ * This will make the history of changes in the hit a little cleaner
+ */
+ "comma-dangle": ["warn", "always-multiline"],
+ /**
+ * Just for beauty
+ */
+ "quotes": [
+ "warn",
+ "single",
+ {
+ "avoidEscape": true
+ }
+ ],
+ "@typescript-eslint/no-explicit-any": "off",
+ "@typescript-eslint/ban-types": "off"
+ }
+}
diff --git a/webapp/.gitattributes b/webapp/.gitattributes
new file mode 100644
index 0000000..4e01be4
--- /dev/null
+++ b/webapp/.gitattributes
@@ -0,0 +1,4 @@
+.github/actions/**/*.js linguist-detectable=false
+scripts/*.js linguist-detectable=false
+*.config.js linguist-detectable=false
+* text=auto eol=lf
diff --git a/webapp/.github/FUNDING.yml b/webapp/.github/FUNDING.yml
new file mode 100644
index 0000000..a9c0779
--- /dev/null
+++ b/webapp/.github/FUNDING.yml
@@ -0,0 +1,3 @@
+# These are supported funding model platforms
+
+custom: ["https://www.buymeacoffee.com/kozack/", "https://send.monobank.ua/6SmojkkR9i"]
diff --git a/webapp/.github/ISSUE_TEMPLATE/bug_report.md b/webapp/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..8764ca0
--- /dev/null
+++ b/webapp/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,28 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: bug
+assignees: cawa-93
+
+---
+
+**Describe the bug**
+A clear and concise description of what the bug is.
+
+**To Reproduce**
+Steps to reproduce the behavior:
+
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/webapp/.github/ISSUE_TEMPLATE/config.yml b/webapp/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..9523d66
--- /dev/null
+++ b/webapp/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1,5 @@
+blank_issues_enabled: false
+contact_links:
+ - name: Questions & Discussions
+ url: https://github.com/cawa-93/vite-electron-builder/discussions/categories/q-a
+ about: Use GitHub discussions for message-board style questions and discussions.
diff --git a/webapp/.github/ISSUE_TEMPLATE/feature_request.md b/webapp/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..e6e6c92
--- /dev/null
+++ b/webapp/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,20 @@
+---
+name: Feature request
+about: Suggest an idea for this project
+title: ''
+labels: enhancement
+assignees: cawa-93
+
+---
+
+**Is your feature request related to a problem? Please describe.**
+A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
+
+**Describe the solution you'd like**
+A clear and concise description of what you want to happen.
+
+**Describe alternatives you've considered**
+A clear and concise description of any alternative solutions or features you've considered.
+
+**Additional context**
+Add any other context or screenshots about the feature request here.
diff --git a/webapp/.github/actions/release-notes/action.yml b/webapp/.github/actions/release-notes/action.yml
new file mode 100644
index 0000000..d334f5a
--- /dev/null
+++ b/webapp/.github/actions/release-notes/action.yml
@@ -0,0 +1,23 @@
+name: 'Release Notes'
+description: 'Return release notes based on Git Commits'
+inputs:
+ from:
+ description: 'Commit from which start log'
+ required: true
+ to:
+ description: 'Commit to which end log'
+ required: true
+ include-commit-body:
+ description: 'Should the commit body be in notes'
+ required: false
+ default: 'false'
+ include-abbreviated-commit:
+ description: 'Should the commit sha be in notes'
+ required: false
+ default: 'true'
+outputs:
+ release-note: # id of output
+ description: 'Release notes'
+runs:
+ using: 'node12'
+ main: 'main.js'
diff --git a/webapp/.github/actions/release-notes/main.js b/webapp/.github/actions/release-notes/main.js
new file mode 100644
index 0000000..94b0b17
--- /dev/null
+++ b/webapp/.github/actions/release-notes/main.js
@@ -0,0 +1,346 @@
+// TODO: Refactor this action
+
+const {execSync} = require('child_process');
+
+/**
+ * Gets the value of an input. The value is also trimmed.
+ *
+ * @param name name of the input to get
+ * @param options optional. See InputOptions.
+ * @returns string
+ */
+function getInput(name, options) {
+ const val = process.env[`INPUT_${name.replace(/ /g, '_').toUpperCase()}`] || '';
+ if (options && options.required && !val) {
+ throw new Error(`Input required and not supplied: ${name}`);
+ }
+
+ return val.trim();
+}
+
+const START_FROM = getInput('from');
+const END_TO = getInput('to');
+const INCLUDE_COMMIT_BODY = getInput('include-commit-body') === 'true';
+const INCLUDE_ABBREVIATED_COMMIT = getInput('include-abbreviated-commit') === 'true';
+
+/**
+ * @typedef {Object} ICommit
+ * @property {string | undefined} abbreviated_commit
+ * @property {string | undefined} subject
+ * @property {string | undefined} body
+ */
+
+/**
+ * @typedef {ICommit & {type: string | undefined, scope: string | undefined}} ICommitExtended
+ */
+
+
+/**
+ * Any unique string that is guaranteed not to be used in committee text.
+ * Used to split data in the commit line
+ * @type {string}
+ */
+const commitInnerSeparator = '~~~~';
+
+
+/**
+ * Any unique string that is guaranteed not to be used in committee text.
+ * Used to split each commit line
+ * @type {string}
+ */
+const commitOuterSeparator = '₴₴₴₴';
+
+
+/**
+ * Commit data to be obtained.
+ * @type {Map
}
+ *
+ * @see https://git-scm.com/docs/git-log#Documentation/git-log.txt-emnem
+ */
+const commitDataMap = new Map([
+ ['subject', '%s'], // Required
+]);
+
+if (INCLUDE_COMMIT_BODY) {
+ commitDataMap.set('body', '%b');
+}
+
+if (INCLUDE_ABBREVIATED_COMMIT) {
+ commitDataMap.set('abbreviated_commit', '%h');
+}
+
+/**
+ * The type used to group commits that do not comply with the convention
+ * @type {string}
+ */
+const fallbackType = 'other';
+
+
+/**
+ * List of all desired commit groups and in what order to display them.
+ * @type {string[]}
+ */
+const supportedTypes = [
+ 'feat',
+ 'fix',
+ 'perf',
+ 'refactor',
+ 'style',
+ 'docs',
+ 'test',
+ 'build',
+ 'ci',
+ 'chore',
+ 'revert',
+ 'deps',
+ fallbackType,
+];
+
+/**
+ * @param {string} commitString
+ * @returns {ICommit}
+ */
+function parseCommit(commitString) {
+ /** @type {ICommit} */
+ const commitDataObj = {};
+ const commitDataArray =
+ commitString
+ .split(commitInnerSeparator)
+ .map(s => s.trim());
+
+ for (const [key] of commitDataMap) {
+ commitDataObj[key] = commitDataArray.shift();
+ }
+
+ return commitDataObj;
+}
+
+/**
+ * Returns an array of commits since the last git tag
+ * @return {ICommit[]}
+ */
+function getCommits() {
+
+ const format = Array.from(commitDataMap.values()).join(commitInnerSeparator) + commitOuterSeparator;
+
+ const logs = String(execSync(`git --no-pager log ${START_FROM}..${END_TO} --pretty=format:"${format}" --reverse`));
+
+ return logs
+ .trim()
+ .split(commitOuterSeparator)
+ .filter(r => !!r.trim()) // Skip empty lines
+ .map(parseCommit);
+}
+
+
+/**
+ *
+ * @param {ICommit} commit
+ * @return {ICommitExtended}
+ */
+function setCommitTypeAndScope(commit) {
+
+ const matchRE = new RegExp(`^(?:(${supportedTypes.join('|')})(?:\\((\\S+)\\))?:)?(.*)`, 'i');
+
+ let [, type, scope, clearSubject] = commit.subject.match(matchRE);
+
+ /**
+ * Additional rules for checking committees that do not comply with the convention, but for which it is possible to determine the type.
+ */
+ // Commits like `revert something`
+ if (type === undefined && commit.subject.startsWith('revert')) {
+ type = 'revert';
+ }
+
+ return {
+ ...commit,
+ type: (type || fallbackType).toLowerCase().trim(),
+ scope: (scope || '').toLowerCase().trim(),
+ subject: (clearSubject || commit.subject).trim(),
+ };
+}
+
+class CommitGroup {
+ constructor() {
+ this.scopes = new Map;
+ this.commits = [];
+ }
+
+ /**
+ *
+ * @param {ICommitExtended[]} array
+ * @param {ICommitExtended} commit
+ */
+ static _pushOrMerge(array, commit) {
+ const similarCommit = array.find(c => c.subject === commit.subject);
+ if (similarCommit) {
+ if (commit.abbreviated_commit !== undefined) {
+ similarCommit.abbreviated_commit += `, ${commit.abbreviated_commit}`;
+ }
+ } else {
+ array.push(commit);
+ }
+ }
+
+ /**
+ * @param {ICommitExtended} commit
+ */
+ push(commit) {
+ if (!commit.scope) {
+ CommitGroup._pushOrMerge(this.commits, commit);
+ return;
+ }
+
+ const scope = this.scopes.get(commit.scope) || {commits: []};
+ CommitGroup._pushOrMerge(scope.commits, commit);
+ this.scopes.set(commit.scope, scope);
+ }
+
+ get isEmpty() {
+ return this.commits.length === 0 && this.scopes.size === 0;
+ }
+}
+
+
+/**
+ * Groups all commits by type and scopes
+ * @param {ICommit[]} commits
+ * @returns {Map}
+ */
+function getGroupedCommits(commits) {
+ const parsedCommits = commits.map(setCommitTypeAndScope);
+
+ const types = new Map(
+ supportedTypes.map(id => ([id, new CommitGroup()])),
+ );
+
+ for (const parsedCommit of parsedCommits) {
+ const typeId = parsedCommit.type;
+ const type = types.get(typeId);
+ type.push(parsedCommit);
+ }
+
+ return types;
+}
+
+/**
+ * Return markdown list with commits
+ * @param {ICommitExtended[]} commits
+ * @param {string} pad
+ * @returns {string}
+ */
+function getCommitsList(commits, pad = '') {
+ let changelog = '';
+ for (const commit of commits) {
+ changelog += `${pad}- ${commit.subject}.`;
+
+ if (commit.abbreviated_commit !== undefined) {
+ changelog += ` (${commit.abbreviated_commit})`;
+ }
+
+ changelog += '\r\n';
+
+ if (commit.body === undefined) {
+ continue;
+ }
+
+ const body = commit.body.replace('[skip ci]', '').trim();
+ if (body !== '') {
+ changelog += `${
+ body
+ .split(/\r*\n+/)
+ .filter(s => !!s.trim())
+ .map(s => `${pad} ${s}`)
+ .join('\r\n')
+ }${'\r\n'}`;
+ }
+ }
+
+ return changelog;
+}
+
+
+function replaceHeader(str) {
+ switch (str) {
+ case 'feat':
+ return 'New Features';
+ case 'fix':
+ return 'Bug Fixes';
+ case 'docs':
+ return 'Documentation Changes';
+ case 'build':
+ return 'Build System';
+ case 'chore':
+ return 'Chores';
+ case 'ci':
+ return 'Continuous Integration';
+ case 'refactor':
+ return 'Refactors';
+ case 'style':
+ return 'Code Style Changes';
+ case 'test':
+ return 'Tests';
+ case 'perf':
+ return 'Performance improvements';
+ case 'revert':
+ return 'Reverts';
+ case 'deps':
+ return 'Dependency updates';
+ case 'other':
+ return 'Other Changes';
+ default:
+ return str;
+ }
+}
+
+
+/**
+ * Return markdown string with changelog
+ * @param {Map} groups
+ */
+function getChangeLog(groups) {
+
+ let changelog = '';
+
+ for (const [typeId, group] of groups) {
+ if (group.isEmpty) {
+ continue;
+ }
+
+ changelog += `### ${replaceHeader(typeId)}${'\r\n'}`;
+
+ for (const [scopeId, scope] of group.scopes) {
+ if (scope.commits.length) {
+ changelog += `- #### ${replaceHeader(scopeId)}${'\r\n'}`;
+ changelog += getCommitsList(scope.commits, ' ');
+ }
+ }
+
+ if (group.commits.length) {
+ changelog += getCommitsList(group.commits);
+ }
+
+ changelog += ('\r\n' + '\r\n');
+ }
+
+ return changelog.trim();
+}
+
+
+function escapeData(s) {
+ return String(s)
+ .replace(/%/g, '%25')
+ .replace(/\r/g, '%0D')
+ .replace(/\n/g, '%0A');
+}
+
+try {
+ const commits = getCommits();
+ const grouped = getGroupedCommits(commits);
+ const changelog = getChangeLog(grouped);
+ process.stdout.write('::set-output name=release-note::' + escapeData(changelog) + '\r\n');
+// require('fs').writeFileSync('../CHANGELOG.md', changelog, {encoding: 'utf-8'})
+} catch (e) {
+ console.error(e);
+ process.exit(1);
+}
diff --git a/webapp/.github/renovate.json b/webapp/.github/renovate.json
new file mode 100644
index 0000000..3807570
--- /dev/null
+++ b/webapp/.github/renovate.json
@@ -0,0 +1,27 @@
+{
+ "extends": [
+ "config:base",
+ ":semanticCommits",
+ ":semanticCommitTypeAll(deps)",
+ ":semanticCommitScopeDisabled",
+ ":automergeAll",
+ ":automergeBranch",
+ ":disableDependencyDashboard",
+ ":pinVersions",
+ ":onlyNpm",
+ ":label(dependencies)"
+ ],
+ "packageRules": [
+ {
+ "groupName": "Vite packages",
+ "matchUpdateTypes": "major",
+ "matchSourceUrlPrefixes": [
+ "https://github.com/vitejs/"
+ ]
+ }
+ ],
+ "gitNoVerify": [
+ "commit",
+ "push"
+ ]
+}
diff --git a/webapp/.github/workflows/ci.yml b/webapp/.github/workflows/ci.yml
new file mode 100644
index 0000000..b24c34f
--- /dev/null
+++ b/webapp/.github/workflows/ci.yml
@@ -0,0 +1,47 @@
+# This workflow is the entry point for all CI processes.
+# It is from here that all other workflows are launched.
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - main
+ - 'renovate/**'
+ paths-ignore:
+ - '.github/**'
+ - '!.github/workflows/ci.yml'
+ - '!.github/workflows/typechecking.yml'
+ - '!.github/workflows/tests.yml'
+ - '!.github/workflows/release.yml'
+ - '**.md'
+ - .editorconfig
+ - .gitignore
+ - '.idea/**'
+ - '.vscode/**'
+ pull_request:
+ paths-ignore:
+ - '.github/**'
+ - '!.github/workflows/ci.yml'
+ - '!.github/workflows/typechecking.yml'
+ - '!.github/workflows/tests.yml'
+ - '!.github/workflows/release.yml'
+ - '**.md'
+ - .editorconfig
+ - .gitignore
+ - '.idea/**'
+ - '.vscode/**'
+
+concurrency:
+ group: ci-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ typechecking:
+ uses: ./.github/workflows/typechecking.yml
+ tests:
+ uses: ./.github/workflows/tests.yml
+ draft_release:
+ with:
+ dry-run: ${{ github.event_name != 'push' || github.ref_name != 'main' }}
+ needs: [ typechecking, tests ]
+ uses: ./.github/workflows/release.yml
+
diff --git a/webapp/.github/workflows/lint.yml b/webapp/.github/workflows/lint.yml
new file mode 100644
index 0000000..e8770a9
--- /dev/null
+++ b/webapp/.github/workflows/lint.yml
@@ -0,0 +1,65 @@
+on:
+ workflow_dispatch:
+ push:
+ paths:
+ - '**.js'
+ - '**.mjs'
+ - '**.cjs'
+ - '**.jsx'
+ - '**.ts'
+ - '**.mts'
+ - '**.cts'
+ - '**.tsx'
+ - '**.vue'
+ - '**.json'
+ pull_request:
+ paths:
+ - '**.js'
+ - '**.mjs'
+ - '**.cjs'
+ - '**.jsx'
+ - '**.ts'
+ - '**.mts'
+ - '**.cts'
+ - '**.tsx'
+ - '**.vue'
+ - '**.json'
+
+concurrency:
+ group: lint-${{ github.ref }}
+ cancel-in-progress: true
+
+defaults:
+ run:
+ shell: 'bash'
+
+jobs:
+ eslint:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-node@v3
+ with:
+ node-version: 16 # Need for npm >=7.7
+ cache: 'npm'
+
+ - run: npm ci
+ env:
+ PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
+
+ - run: npm run lint --if-present
+
+ # This job just check code style for in-template contributions.
+ code-style:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-node@v3
+ with:
+ node-version: 16 # Need for npm >=7.7
+ cache: 'npm'
+
+ - run: npm i prettier
+ - run: npx prettier --check "**/*.{js,mjs,cjs,jsx,ts,mts,cts,tsx,vue,json}"
diff --git a/webapp/.github/workflows/release.yml b/webapp/.github/workflows/release.yml
new file mode 100644
index 0000000..f570381
--- /dev/null
+++ b/webapp/.github/workflows/release.yml
@@ -0,0 +1,61 @@
+name: Release
+on:
+ workflow_call:
+ inputs:
+ dry-run:
+ description: 'Compiles the app but not upload artifacts to distribution server'
+ default: false
+ required: false
+ type: boolean
+
+concurrency:
+ group: release-${{ github.ref }}
+ cancel-in-progress: true
+
+
+defaults:
+ run:
+ shell: 'bash'
+
+
+jobs:
+ draft_release:
+
+ strategy:
+ fail-fast: true
+ matrix:
+ os: [ macos-latest, ubuntu-latest, windows-latest ]
+
+ runs-on: ${{ matrix.os }}
+
+ steps:
+ - uses: actions/checkout@v3
+
+ - uses: actions/setup-node@v3
+ with:
+ node-version: 16 # Need for npm >=7.7
+ cache: 'npm'
+
+ - run: npm ci
+ env:
+ PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
+
+ - run: npm run build
+
+ - name: Compile artifacts ${{ inputs.dry-run && '' || 'and upload them to github release' }}
+ # I use this action because it is capable of retrying multiple times if there are any issues with the distribution server
+ uses: nick-fields/retry@v2
+ with:
+ timeout_minutes: 15
+ max_attempts: 6
+ retry_wait_seconds: 15
+ retry_on: error
+ shell: 'bash'
+ command: npx --no-install electron-builder --config .electron-builder.config.js --publish ${{ inputs.dry-run && 'never' || 'always' }}
+ env:
+ # Code Signing params
+ # See https://www.electron.build/code-signing
+ # CSC_LINK: ''
+ # CSC_KEY_PASSWORD: ''
+ # Publishing artifacts
+ GH_TOKEN: ${{ secrets.github_token }} # GitHub token, automatically provided (No need to define this secret in the repo settings)
diff --git a/webapp/.github/workflows/tests.yml b/webapp/.github/workflows/tests.yml
new file mode 100644
index 0000000..a79697c
--- /dev/null
+++ b/webapp/.github/workflows/tests.yml
@@ -0,0 +1,38 @@
+name: Tests
+on: [ workflow_call ]
+
+concurrency:
+ group: tests-${{ github.ref }}
+ cancel-in-progress: true
+
+defaults:
+ run:
+ shell: 'bash'
+
+jobs:
+ tests:
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [ windows-latest, ubuntu-latest, macos-latest ]
+ runs-on: ${{ matrix.os }}
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-node@v3
+ with:
+ node-version: 16
+ cache: 'npm'
+ - run: npm ci
+ env:
+ PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
+ - run: npm run test:main --if-present
+ - run: npm run test:preload --if-present
+ - run: npm run test:renderer --if-present
+
+ # I ran into problems trying to run an electron window in ubuntu due to a missing graphics server.
+ # That's why this special command for Ubuntu is here
+ - run: xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- npm run test:e2e --if-present
+ if: matrix.os == 'ubuntu-latest'
+
+ - run: npm run test:e2e --if-present
+ if: matrix.os != 'ubuntu-latest'
diff --git a/webapp/.github/workflows/typechecking.yml b/webapp/.github/workflows/typechecking.yml
new file mode 100644
index 0000000..9389241
--- /dev/null
+++ b/webapp/.github/workflows/typechecking.yml
@@ -0,0 +1,27 @@
+name: Typechecking
+on: [ workflow_call ]
+
+concurrency:
+ group: typechecking-${{ github.ref }}
+ cancel-in-progress: true
+
+defaults:
+ run:
+ shell: 'bash'
+
+jobs:
+ typescript:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v3
+ - uses: actions/setup-node@v3
+ with:
+ node-version: 16 # Need for npm >=7.7
+ cache: 'npm'
+
+ - run: npm ci
+ env:
+ PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
+
+ - run: npm run typecheck --if-present
diff --git a/webapp/.github/workflows/update-electron-vendors.yml b/webapp/.github/workflows/update-electron-vendors.yml
new file mode 100644
index 0000000..fa9e328
--- /dev/null
+++ b/webapp/.github/workflows/update-electron-vendors.yml
@@ -0,0 +1,44 @@
+name: Update Electon vendors versions
+on:
+ push:
+ branches:
+ - main
+ paths:
+ - 'package-lock.json'
+
+
+concurrency:
+ group: update-electron-vendors-${{ github.ref }}
+ cancel-in-progress: true
+
+
+defaults:
+ run:
+ shell: 'bash'
+
+
+jobs:
+ node-chrome:
+ runs-on: ubuntu-latest
+
+ steps:
+ - uses: actions/checkout@v2
+ - uses: actions/setup-node@v2
+ with:
+ node-version: 16 # Need for npm >=7.7
+ cache: 'npm'
+
+ # TODO: Install not all dependencies, but only those required for this workflow
+ - name: Install dependencies
+ run: npm ci
+
+ - run: node ./scripts/update-electron-vendors.js
+
+ - name: Create Pull Request
+ uses: peter-evans/create-pull-request@v3
+ with:
+ delete-branch: true
+ commit-message: Update electron vendors
+ branch: autoupdates/electron-vendors
+ title: Update electron vendors
+ body: Updated versions of electron vendors in `electron-vendors.config.json` and `.browserslistrc` files
diff --git a/webapp/.gitignore b/webapp/.gitignore
new file mode 100644
index 0000000..170663c
--- /dev/null
+++ b/webapp/.gitignore
@@ -0,0 +1,58 @@
+node_modules
+.DS_Store
+dist
+*.local
+thumbs.db
+
+.eslintcache
+.browserslistrc
+.electron-vendors.cache.json
+
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+ .idea/artifacts
+ .idea/compiler.xml
+ .idea/jarRepositories.xml
+ .idea/modules.xml
+ .idea/*.iml
+ .idea/modules
+ *.iml
+ *.ipr
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# Editor-based Rest Client
+.idea/httpRequests
+/.idea/csv-plugin.xml
diff --git a/webapp/.nano-staged.mjs b/webapp/.nano-staged.mjs
new file mode 100644
index 0000000..f69dd0d
--- /dev/null
+++ b/webapp/.nano-staged.mjs
@@ -0,0 +1,24 @@
+import {resolve, sep} from 'path';
+
+export default {
+ '*.{js,mjs,cjs,ts,mts,cts,vue}': 'eslint --cache --fix',
+
+ /**
+ * Run typechecking if any type-sensitive files or project dependencies was changed
+ * @param {string[]} filenames
+ * @return {string[]}
+ */
+ '{package-lock.json,packages/**/{*.ts,*.vue,tsconfig.json}}': ({filenames}) => {
+ // if dependencies was changed run type checking for all packages
+ if (filenames.some(f => f.endsWith('package-lock.json'))) {
+ return ['npm run typecheck --if-present'];
+ }
+
+ // else run type checking for staged packages
+ const fileNameToPackageName = filename =>
+ filename.replace(resolve(process.cwd(), 'packages') + sep, '').split(sep)[0];
+ return [...new Set(filenames.map(fileNameToPackageName))].map(
+ p => `npm run typecheck:${p} --if-present`,
+ );
+ },
+};
diff --git a/webapp/.npmrc b/webapp/.npmrc
new file mode 100644
index 0000000..3e775ef
--- /dev/null
+++ b/webapp/.npmrc
@@ -0,0 +1 @@
+auto-install-peers=true
diff --git a/webapp/.prettierignore b/webapp/.prettierignore
new file mode 100644
index 0000000..bee20b1
--- /dev/null
+++ b/webapp/.prettierignore
@@ -0,0 +1,10 @@
+**/node_modules
+**/dist
+**/*.svg
+
+package.json
+package-lock.json
+.electron-vendors.cache.json
+
+.github
+.idea
\ No newline at end of file
diff --git a/webapp/.prettierrc b/webapp/.prettierrc
new file mode 100644
index 0000000..f59460f
--- /dev/null
+++ b/webapp/.prettierrc
@@ -0,0 +1,21 @@
+{
+ "printWidth": 100,
+ "semi": true,
+ "singleQuote": true,
+ "overrides": [
+ {
+ "files": ["**/*.css", "**/*.scss", "**/*.html"],
+ "options": {
+ "singleQuote": false
+ }
+ }
+ ],
+ "trailingComma": "all",
+ "bracketSpacing": false,
+ "arrowParens": "avoid",
+ "proseWrap": "never",
+ "htmlWhitespaceSensitivity": "strict",
+ "vueIndentScriptAndStyle": false,
+ "endOfLine": "lf",
+ "singleAttributePerLine": true
+}
diff --git a/webapp/.simple-git-hooks.json b/webapp/.simple-git-hooks.json
new file mode 100644
index 0000000..a0ba3b8
--- /dev/null
+++ b/webapp/.simple-git-hooks.json
@@ -0,0 +1,3 @@
+{
+ "pre-commit": "npx nano-staged"
+}
diff --git a/webapp/.vscode/launch.json b/webapp/.vscode/launch.json
new file mode 100644
index 0000000..0af4f9a
--- /dev/null
+++ b/webapp/.vscode/launch.json
@@ -0,0 +1,13 @@
+{
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "type": "node",
+ "request": "launch",
+ "name": "Debug Main Process",
+ "skipFiles": ["/**"],
+ "program": "${workspaceFolder}\\scripts\\watch.mjs",
+ "autoAttachChildProcesses": true
+ }
+ ]
+}
diff --git a/webapp/.yarnclean b/webapp/.yarnclean
new file mode 100644
index 0000000..9e8b8b4
--- /dev/null
+++ b/webapp/.yarnclean
@@ -0,0 +1,47 @@
+# test directories
+__tests__
+test
+tests
+powered-test
+
+# asset directories
+docs
+website
+images
+assets
+
+# examples
+example
+examples
+
+# code coverage directories
+coverage
+.nyc_output
+
+# build scripts
+Makefile
+Gulpfile.js
+Gruntfile.js
+
+# configs
+appveyor.yml
+circle.yml
+codeship-services.yml
+codeship-steps.yml
+wercker.yml
+.tern-project
+.gitattributes
+.editorconfig
+.*ignore
+.eslintrc
+.jshintrc
+.flowconfig
+.documentup.json
+.yarn-metadata.json
+.travis.yml
+
+# misc
+*.md
+LICENSE
+*.txt
+!path.txt
diff --git a/webapp/LICENSE b/webapp/LICENSE
new file mode 100644
index 0000000..ff2283b
--- /dev/null
+++ b/webapp/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 Alex Kozack
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/webapp/README.md b/webapp/README.md
new file mode 100644
index 0000000..a4b43ac
--- /dev/null
+++ b/webapp/README.md
@@ -0,0 +1,297 @@
+# Vite Electron Builder Boilerplate
+
+This is a template for secure electron applications. Written following the latest safety requirements, recommendations
+and best practices.
+
+Under the hood is [Vite] — A next-generation blazing fast bundler, and [electron-builder] for packaging.
+
+## Get started
+
+Follow these steps to get started with the template:
+
+1. Click the **[Use this template](https://github.com/cawa-93/vite-electron-builder/generate)** button (you must be
+ logged in) or just clone this repo.
+2. If you want to use another package manager you may need to edit [`.github/workflows`](/.github/workflows) — [it
+ uses `npm` by default](https://github.com/search?q=npm+repo%3Acawa-93%2Fvite-electron-builder+path%3A.github%2Fworkflows&type=Code&ref=advsearch&l=&l=).
+3. If you like this template, don't forget to give a github star or send support! ⭐♥
+
+That's all you need. 😉
+
+> **Note**:
+> This template uses npm v7 feature — [**Installing Peer Dependencies
+Automatically**](https://github.com/npm/rfcs/blob/latest/implemented/0025-install-peer-deps.md). If you are using a
+different package manager, you may need to install some peerDependencies manually.
+
+## Features
+
+### Electron [][electron]
+
+- This template uses the latest electron version with all the latest security patches.
+- The architecture of the application is built according to the
+ security [guides](https://www.electronjs.org/docs/tutorial/security) and best practices.
+- The latest version of the [electron-builder] is used to package the application.
+
+### Vite [][vite]
+
+- [Vite] is used to bundle all source codes. It's an extremely fast bundler, that has a vast array of amazing features.
+ You can learn more about how it is arranged in [this](https://www.youtube.com/watch?v=xXrhg26VCSc) video.
+- Vite [supports](https://vitejs.dev/guide/env-and-mode.html) reading `.env` files. You can also specify the types of
+ your environment variables in [`types/env.d.ts`](types/env.d.ts).
+- Automatic hot-reloads for the `Main` and `Renderer` processes.
+
+Vite provides many useful features, such as: `TypeScript`, `TSX/JSX`, `CSS/JSON Importing`, `CSS Modules`
+, `Web Assembly` and much more.
+
+> [See all Vite features](https://vitejs.dev/guide/features.html).
+
+### TypeScript [][typescript] (optional)
+
+- The latest version of TypeScript is used for all the source code.
+- **Vite** supports TypeScript out of the box. However, it does not support type checking.
+- Code formatting rules follow the latest TypeScript recommendations and best practices thanks
+ to [@typescript-eslint/eslint-plugin](https://www.npmjs.com/package/@typescript-eslint/eslint-plugin).
+
+> [Guide to disable typescript and remove dependencies](https://github.com/cawa-93/vite-electron-builder/discussions/339)
+
+### Vue [][vue] (optional)
+
+- By default, web pages are built using [Vue]. However, you can easily change that. Or not use additional frameworks at
+ all.
+- Code formatting rules follow the latest Vue recommendations and best practices thanks to [eslint-plugin-vue].
+
+> [Find more forks 🔱 for others frameworks or setups](https://github.com/cawa-93/vite-electron-builder/discussions/categories/forks)
+
+### Continuous Integration
+
+- The configured workflow will check the types for each push and PR.
+- The configured workflow will check the code style for each push and PR.
+- **Automatic tests**
+ used [Vitest ][vitest]
+ -- A blazing fast test framework powered by Vite.
+ - Unit tests are placed within each package and are ran separately.
+ - End-to-end tests are placed in the root [`tests`](tests) directory and use [playwright].
+
+
+
+
+### Publishing
+
+- Each time you push changes to the `main` branch, the [`release`](.github/workflows/release.yml) workflow starts, which creates a new draft release. For each next commit will be created and replaced artifacts. That way you will always have draft with latest artifacts, and the release can be published once it is ready.
+ - Code signing supported. See [`release` workflow](.github/workflows/release.yml).
+ - **Auto-update is supported**. After the release is published, all client applications will download the new version
+ and install updates silently.
+
+> **Note**:
+> This template **configured only for GitHub public repository**, but electron-builder also supports other update distribution servers. Find more in [electron-builder docs](https://www.electron.build/configuration/publish).
+
+## How it works
+
+The template requires a minimum amount [dependencies](package.json). Only **Vite** is used for building, nothing more.
+
+### Project Structure
+
+The structure of this template is very similar to a monorepo. The entire source code of the project is divided into three modules (packages) that are each bundled independently:
+
+- [`packages/renderer`](packages/renderer). Responsible for the contents of the application window. In fact, it is a
+ regular web application. In developer mode, you can even open it in a browser. The development and build process is
+ the same as for classic web applications. Access to low-level API electrons or Node.js is done through the _preload_
+ layer.
+- [`packages/preload`](packages/preload). Contain Electron [**preload scripts**](https://www.electronjs.org/docs/latest/tutorial/tutorial-preload). Acts as an intermediate bridge between the _renderer_ process and the API
+ exposed by electron and Node.js. Runs in an _isolated browser context_, but has direct access to the full Node.js
+ functionality.
+- [`packages/main`](packages/main)
+ Contain Electron [**main script**](https://www.electronjs.org/docs/tutorial/quick-start#create-the-main-script-file). This is
+ the main process that powers the application. It manages creating and handling the spawned BrowserWindow, setting and
+ enforcing secure permissions and request handlers. You can also configure it to do much more as per your need, such
+ as: logging, reporting statistics and health status among others.
+
+Schematically, the structure of the application and the method of communication between packages can be depicted as follows:
+```mermaid
+flowchart TB;
+
+packages/preload <-. IPC Messages .-> packages/main
+
+ subgraph packages/main["packages/main (Shared beatween all windows)"]
+ M[index.ts] --> EM[Electron Main Process Modules]
+ M --> N2[Node.js API]
+ end
+
+subgraph Window["Browser Window"]
+ subgraph packages/preload["packages/preload (Works in isolated context)"]
+ P[index.ts] --> N[Node.js API]
+ P --> ED[External dependencies]
+ P --> ER[Electron Renderer Process Modules]
+ end
+
+
+ subgraph packages/renderer
+ R[index.html] --> W[Web API]
+ R --> BD[Bundled dependencies]
+ R --> F[Web Frameforks]
+ end
+ end
+
+packages/renderer -- Call Exposed API --> P
+```
+### Build web resources
+
+The `main` and `preload` packages are built in [library mode](https://vitejs.dev/guide/build.html#library-mode) as it is
+simple javascript.
+The `renderer` package builds as a regular web app.
+
+### Compile App
+
+The next step is to package a ready to distribute Electron app for macOS, Windows and Linux with "auto update" support
+out of the box.
+
+To do this, use [electron-builder]:
+
+- Using the npm script `compile`: This script is configured to compile the application as quickly as possible. It is not
+ ready for distribution, it is compiled only for the current platform and is used for debugging.
+- Using GitHub Actions: The application is compiled for any platform and ready-to-distribute files are automatically
+ added as a draft to the GitHub releases page.
+
+### Working with dependencies
+
+Because the `renderer` works and builds like a _regular web application_, you can only use dependencies that support the
+browser or compile to a browser-friendly format.
+
+This means that in the `renderer` you are free to use any frontend dependencies such as Vue, React, lodash, axios and so
+on. However, you _CANNOT_ use any native Node.js APIs, such as, `systeminformation`. These APIs are _only_ available in
+a Node.js runtime environment and will cause your application to crash if used in the `renderer` layer. Instead, if you
+need access to Node.js runtime APIs in your frontend, export a function form the `preload` package.
+
+All dependencies that require Node.js api can be used in
+the [`preload` script](https://www.electronjs.org/docs/latest/tutorial/process-model#preload-scripts).
+
+#### Expose in main world
+Here is an example. Let's say you need to read some data from the file system or database in the renderer.
+
+In the preload context, create a function that reads and returns data. To make the function announced in the preload
+available in the render, you usually need to call
+the [`electron.contextBridge.exposeInMainWorld`](https://www.electronjs.org/ru/docs/latest/api/context-bridge). However,
+this template uses the [unplugin-auto-expose](https://github.com/cawa-93/unplugin-auto-expose) plugin, so you just need
+to export the method from the preload. The `exposeInMainWorld` will be called automatically.
+
+```ts
+// preload/index.ts
+import { readFile } from 'node:fs/promises';
+
+// Encapsulate types if you use typescript
+interface UserData {
+ prop: string
+}
+
+// Encapsulate all node.js api
+// Everything you exported from preload/index.ts may be called in renderer
+export function getUserData(): Promise {
+ return readFile('/path/to/file/in/user/filesystem.json', {encoding:'utf8'}).then(JSON.parse);
+}
+```
+
+Now you can import and call the method in renderer
+
+```ts
+// renderer/anywere/component.ts
+import { getUserData } from '#preload'
+const userData = await getUserData()
+```
+
+> Find more in [Context Isolation tutorial](https://www.electronjs.org/docs/tutorial/context-isolation#security-considerations).
+
+### Working with Electron API
+
+Although the preload has access to all of Node.js's API, it **still runs in the BrowserWindow context**, so a limited
+electron modules are available in it. Check the [electron docs](https://www.electronjs.org/ru/docs/latest/api/clipboard)
+for full list of available methods.
+
+All other electron methods can be invoked in the `main`.
+
+As a result, the architecture of interaction between all modules is as follows:
+
+```mermaid
+sequenceDiagram
+renderer->>+preload: Read data from file system
+preload->>-renderer: Data
+renderer->>preload: Maximize window
+activate preload
+preload-->>main: Invoke IPC command
+activate main
+main-->>preload: IPC response
+deactivate main
+preload->>renderer: Window maximized
+deactivate preload
+```
+
+> Find more in [Inter-Process Communication tutorial](https://www.electronjs.org/docs/latest/tutorial/ipc).
+
+### Modes and Environment Variables
+
+All environment variables are set as part of the `import.meta`, so you can access them vie the following
+way: `import.meta.env`.
+
+> **Note**:
+> If you are using TypeScript and want to get code completion you must add all the environment variables to
+the [`ImportMetaEnv` in `types/env.d.ts`](types/env.d.ts).
+
+The mode option is used to specify the value of `import.meta.env.MODE` and the corresponding environment variables files
+that need to be loaded.
+
+By default, there are two modes:
+
+- `production` is used by default
+- `development` is used by `npm run watch` script
+
+When running the build script, the environment variables are loaded from the following files in your project root:
+
+```
+.env # loaded in all cases
+.env.local # loaded in all cases, ignored by git
+.env.[mode] # only loaded in specified env mode
+.env.[mode].local # only loaded in specified env mode, ignored by git
+```
+
+> **Warning**:
+> To prevent accidentally leaking env variables to the client, only variables prefixed with `VITE_` are exposed to your
+Vite-processed code.
+
+For example let's take the following `.env` file:
+
+```
+DB_PASSWORD=foobar
+VITE_SOME_KEY=123
+```
+
+Only `VITE_SOME_KEY` will be exposed as `import.meta.env.VITE_SOME_KEY` to your client source code, but `DB_PASSWORD`
+will not.
+
+You can change that prefix or add another. See [`envPrefix`](https://vitejs.dev/config/shared-options.html#envprefix)
+
+## Contribution
+
+See [Contributing Guide](contributing.md).
+
+
+[vite]: https://github.com/vitejs/vite/
+
+[electron]: https://github.com/electron/electron
+
+[electron-builder]: https://github.com/electron-userland/electron-builder
+
+[vue]: https://github.com/vuejs/vue-next
+
+[vue-router]: https://github.com/vuejs/vue-router-next/
+
+[typescript]: https://github.com/microsoft/TypeScript/
+
+[playwright]: https://playwright.dev
+
+[vitest]: https://vitest.dev
+
+[vue-tsc]: https://github.com/johnsoncodehk/vue-tsc
+
+[eslint-plugin-vue]: https://github.com/vuejs/eslint-plugin-vue
+
+[cawa-93-github]: https://github.com/cawa-93/
+
+[cawa-93-sponsor]: https://www.patreon.com/Kozack/
diff --git a/webapp/buildResources/.gitkeep b/webapp/buildResources/.gitkeep
new file mode 100644
index 0000000..e69de29
diff --git a/webapp/buildResources/aas.png b/webapp/buildResources/aas.png
new file mode 100644
index 0000000..d45a01e
Binary files /dev/null and b/webapp/buildResources/aas.png differ
diff --git a/webapp/buildResources/icon.icns b/webapp/buildResources/icon.icns
new file mode 100644
index 0000000..b15ddcc
Binary files /dev/null and b/webapp/buildResources/icon.icns differ
diff --git a/webapp/buildResources/icon.ico b/webapp/buildResources/icon.ico
new file mode 100644
index 0000000..4d5c90d
Binary files /dev/null and b/webapp/buildResources/icon.ico differ
diff --git a/webapp/buildResources/icon.png b/webapp/buildResources/icon.png
new file mode 100644
index 0000000..337a70c
Binary files /dev/null and b/webapp/buildResources/icon.png differ
diff --git a/webapp/buildResources/icons/1024x1024.png b/webapp/buildResources/icons/1024x1024.png
new file mode 100644
index 0000000..b6cb680
Binary files /dev/null and b/webapp/buildResources/icons/1024x1024.png differ
diff --git a/webapp/buildResources/icons/128x128.png b/webapp/buildResources/icons/128x128.png
new file mode 100644
index 0000000..ba1b2e5
Binary files /dev/null and b/webapp/buildResources/icons/128x128.png differ
diff --git a/webapp/buildResources/icons/16x16.png b/webapp/buildResources/icons/16x16.png
new file mode 100644
index 0000000..91d768f
Binary files /dev/null and b/webapp/buildResources/icons/16x16.png differ
diff --git a/webapp/buildResources/icons/24x24.png b/webapp/buildResources/icons/24x24.png
new file mode 100644
index 0000000..3cf3a4a
Binary files /dev/null and b/webapp/buildResources/icons/24x24.png differ
diff --git a/webapp/buildResources/icons/256x256.png b/webapp/buildResources/icons/256x256.png
new file mode 100644
index 0000000..337a70c
Binary files /dev/null and b/webapp/buildResources/icons/256x256.png differ
diff --git a/webapp/buildResources/icons/32x32.png b/webapp/buildResources/icons/32x32.png
new file mode 100644
index 0000000..01b600f
Binary files /dev/null and b/webapp/buildResources/icons/32x32.png differ
diff --git a/webapp/buildResources/icons/48x48.png b/webapp/buildResources/icons/48x48.png
new file mode 100644
index 0000000..1410446
Binary files /dev/null and b/webapp/buildResources/icons/48x48.png differ
diff --git a/webapp/buildResources/icons/512x512.png b/webapp/buildResources/icons/512x512.png
new file mode 100644
index 0000000..7e2a510
Binary files /dev/null and b/webapp/buildResources/icons/512x512.png differ
diff --git a/webapp/buildResources/icons/64x64.png b/webapp/buildResources/icons/64x64.png
new file mode 100644
index 0000000..4bda4b8
Binary files /dev/null and b/webapp/buildResources/icons/64x64.png differ
diff --git a/webapp/buildResources/icons/icon.icns b/webapp/buildResources/icons/icon.icns
new file mode 100644
index 0000000..b15ddcc
Binary files /dev/null and b/webapp/buildResources/icons/icon.icns differ
diff --git a/webapp/buildResources/icons/icon.ico b/webapp/buildResources/icons/icon.ico
new file mode 100644
index 0000000..4d5c90d
Binary files /dev/null and b/webapp/buildResources/icons/icon.ico differ
diff --git a/webapp/contributing.md b/webapp/contributing.md
new file mode 100644
index 0000000..2e5835f
--- /dev/null
+++ b/webapp/contributing.md
@@ -0,0 +1,34 @@
+# Contributing
+
+First and foremost, thank you! We appreciate that you want to contribute to vite-electron-builder, your time is
+valuable, and your contributions mean a lot to us.
+
+## Issues
+
+Do not create issues about bumping dependencies unless a bug has been identified, and you can demonstrate that it
+effects this library.
+
+**Help us to help you**
+
+Remember that we’re here to help, but not to make guesses about what you need help with:
+
+- Whatever bug or issue you're experiencing, assume that it will not be as obvious to the maintainers as it is to you.
+- Spell it out completely. Keep in mind that maintainers need to think about _all potential use cases_ of a library.
+ It's important that you explain how you're using a library so that maintainers can make that connection and solve the
+ issue.
+
+_It can't be understated how frustrating and draining it can be to maintainers to have to ask clarifying questions on
+the most basic things, before it's even possible to start debugging. Please try to make the best use of everyone's time
+involved, including yourself, by providing this information up front._
+
+## Repo Setup
+
+The package manager used to install and link dependencies must be npm v7 or later.
+
+1. Clone repo
+1. `npm run watch` start electron app in watch mode.
+1. `npm run compile` build app but for local debugging only.
+1. `npm run lint` lint your code.
+1. `npm run typecheck` Run typescript check.
+1. `npm run test` Run app test.
+1. `npm run format` Reformat all codebase to project code style.
diff --git a/webapp/electron-builder.config.js b/webapp/electron-builder.config.js
new file mode 100644
index 0000000..96b367b
--- /dev/null
+++ b/webapp/electron-builder.config.js
@@ -0,0 +1,23 @@
+if (process.env.VITE_APP_VERSION === undefined) {
+ const now = new Date();
+ process.env.VITE_APP_VERSION = `${now.getUTCFullYear() - 2000}.${
+ now.getUTCMonth() + 1
+ }.${now.getUTCDate()}-${now.getUTCHours() * 60 + now.getUTCMinutes()}`;
+}
+
+/**
+ * @type {import('electron-builder').Configuration}
+ * @see https://www.electron.build/configuration/configuration
+ */
+const config = {
+ directories: {
+ output: 'dist',
+ buildResources: 'buildResources',
+ },
+ files: ['packages/**/dist/**'],
+ extraMetadata: {
+ version: process.env.VITE_APP_VERSION,
+ },
+};
+
+module.exports = config;
diff --git a/webapp/electron-vendors.config.json b/webapp/electron-vendors.config.json
new file mode 100644
index 0000000..7a864ee
--- /dev/null
+++ b/webapp/electron-vendors.config.json
@@ -0,0 +1,4 @@
+{
+ "chrome": "94",
+ "node": "16"
+}
diff --git a/webapp/package-lock.json b/webapp/package-lock.json
new file mode 100644
index 0000000..70e44bd
--- /dev/null
+++ b/webapp/package-lock.json
@@ -0,0 +1,16583 @@
+{
+ "name": "src",
+ "version": "0.4.0",
+ "lockfileVersion": 2,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "src",
+ "version": "0.4.0",
+ "hasInstallScript": true,
+ "dependencies": {
+ "@ant-design/icons-vue": "^6.1.0",
+ "@vueuse/core": "^10.0.2",
+ "autoprefixer": "^10.4.14",
+ "dayjs": "^1.11.7",
+ "electron-log": "^4.4.8",
+ "electron-updater": "5.3.0",
+ "fast-glob": "^3.2.12",
+ "fs-extra": "^11.1.1",
+ "lodash-es": "^4.17.21",
+ "mustache": "^4.2.0",
+ "nanoid": "^4.0.2",
+ "pinia": "^2.0.34",
+ "postcss": "^8.4.21",
+ "python-shell": "^5.0.0",
+ "tree-kill": "^1.2.2",
+ "vue-i18n": "^9.2.2",
+ "vue-router": "^4.1.6",
+ "yaml": "^2.2.1"
+ },
+ "devDependencies": {
+ "@arco-design/web-vue": "^2.45.2",
+ "@arco-plugins/vite-vue": "^1.4.5",
+ "@arco-themes/vue-am-alas": "^0.0.1",
+ "@intlify/unplugin-vue-i18n": "^0.10.0",
+ "@types/fs-extra": "^11.0.1",
+ "@types/lodash-es": "^4.17.7",
+ "@types/node": "18.15.3",
+ "@typescript-eslint/eslint-plugin": "5.55.0",
+ "@typescript-eslint/parser": "^5.58.0",
+ "@vitejs/plugin-vue": "4.0.0",
+ "@vue/test-utils": "2.3.1",
+ "consola": "^3.1.0",
+ "cross-env": "7.0.3",
+ "electron": "^22.3.27",
+ "electron-builder": "^24.6.4",
+ "eslint": "8.36.0",
+ "eslint-config-prettier": "^8.8.0",
+ "eslint-plugin-prettier": "^4.2.1",
+ "eslint-plugin-vue": "9.9.0",
+ "happy-dom": "8.9.0",
+ "less": "^4.1.3",
+ "nano-staged": "0.8.0",
+ "playwright": "1.31.2",
+ "prettier": "^2.8.7",
+ "prettier-eslint": "^15.0.1",
+ "simple-git-hooks": "2.8.1",
+ "ts-node": "^10.9.1",
+ "typescript": "4.9.5",
+ "unocss": "^0.51.8",
+ "unplugin-auto-expose": "0.0.4",
+ "unplugin-auto-import": "^0.15.3",
+ "unplugin-vue-components": "^0.24.1",
+ "vite": "^4.3.1",
+ "vite-plugin-style-import": "^2.0.0",
+ "vitest": "0.29.3",
+ "vue": "^3.2.47",
+ "vue-tsc": "1.2.0",
+ "vue-types": "^5.0.2"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+ "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@ant-design/colors": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz",
+ "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==",
+ "dependencies": {
+ "@ctrl/tinycolor": "^3.4.0"
+ }
+ },
+ "node_modules/@ant-design/icons-svg": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz",
+ "integrity": "sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g=="
+ },
+ "node_modules/@ant-design/icons-vue": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz",
+ "integrity": "sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==",
+ "dependencies": {
+ "@ant-design/colors": "^6.0.0",
+ "@ant-design/icons-svg": "^4.2.1"
+ },
+ "peerDependencies": {
+ "vue": ">=3.0.3"
+ }
+ },
+ "node_modules/@antfu/install-pkg": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.1.1.tgz",
+ "integrity": "sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==",
+ "dev": true,
+ "dependencies": {
+ "execa": "^5.1.1",
+ "find-up": "^5.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@antfu/utils": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.6.tgz",
+ "integrity": "sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@arco-design/color": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@arco-design/color/-/color-0.4.0.tgz",
+ "integrity": "sha512-s7p9MSwJgHeL8DwcATaXvWT3m2SigKpxx4JA1BGPHL4gfvaQsmQfrLBDpjOJFJuJ2jG2dMt3R3P8Pm9E65q18g==",
+ "dev": true,
+ "dependencies": {
+ "color": "^3.1.3"
+ }
+ },
+ "node_modules/@arco-design/web-vue": {
+ "version": "2.52.1",
+ "resolved": "https://registry.npmjs.org/@arco-design/web-vue/-/web-vue-2.52.1.tgz",
+ "integrity": "sha512-XE9zHC2ZqYqkC+bgqljFoA+5zDOXx8bOWFDoVlO/LgEq55284C7kkPZjmIyAeurkYdDYqlbxjWaPOwJXaj3J2g==",
+ "dev": true,
+ "dependencies": {
+ "@arco-design/color": "^0.4.0",
+ "b-tween": "^0.3.3",
+ "b-validate": "^1.4.4",
+ "compute-scroll-into-view": "^1.0.17",
+ "dayjs": "^1.10.3",
+ "number-precision": "^1.5.0",
+ "resize-observer-polyfill": "^1.5.1",
+ "scroll-into-view-if-needed": "^2.2.28"
+ },
+ "peerDependencies": {
+ "vue": "^3.1.0"
+ }
+ },
+ "node_modules/@arco-plugins/vite-vue": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/@arco-plugins/vite-vue/-/vite-vue-1.4.5.tgz",
+ "integrity": "sha512-2pJ9mpZP9mRD7NGZwRsZTS9C/US5ilEBBUqxN5Qgnd3Td50u9apJVKAABCZjG2K2eHiyZg7Fd9XhgHJXVJJmsw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/generator": "^7.12.11",
+ "@babel/helper-module-imports": "^7.12.5",
+ "@babel/parser": "^7.12.11",
+ "@babel/traverse": "^7.12.12",
+ "@babel/types": "^7.12.12",
+ "@types/node": "^16.11.10"
+ }
+ },
+ "node_modules/@arco-plugins/vite-vue/node_modules/@types/node": {
+ "version": "16.18.58",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.58.tgz",
+ "integrity": "sha512-YGncyA25/MaVtQkjWW9r0EFBukZ+JulsLcVZBlGUfIb96OBMjkoRWwQo5IEWJ8Fj06Go3GHw+bjYDitv6BaGsA==",
+ "dev": true
+ },
+ "node_modules/@arco-themes/vue-am-alas": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@arco-themes/vue-am-alas/-/vue-am-alas-0.0.1.tgz",
+ "integrity": "sha512-JCI9KZaqXXUEnQC945cwmA6rMI8GJ3YzpQK3fx3ASTvOSAOeUw0Kh/iAYref4/JhxSghMJYnrNYM1RCCL37VMw==",
+ "dev": true,
+ "peerDependencies": {
+ "@arco-design/web-vue": "^2.45.2"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.22.13",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
+ "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/highlight": "^7.22.13",
+ "chalk": "^2.4.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/@babel/code-frame/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/code-frame/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz",
+ "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.23.0",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jsesc": "^2.5.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-environment-visitor": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
+ "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-function-name": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
+ "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.22.15",
+ "@babel/types": "^7.23.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-hoist-variables": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
+ "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-split-export-declaration": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.22.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+ "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+ "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz",
+ "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/@babel/highlight/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/highlight/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz",
+ "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==",
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
+ "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.22.13",
+ "@babel/parser": "^7.22.15",
+ "@babel/types": "^7.22.15"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.23.2",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz",
+ "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.22.13",
+ "@babel/generator": "^7.23.0",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.23.0",
+ "@babel/types": "^7.23.0",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse/node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz",
+ "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "0.3.9"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@ctrl/tinycolor": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
+ "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@develar/schema-utils": {
+ "version": "2.6.5",
+ "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz",
+ "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.0",
+ "ajv-keywords": "^3.4.1"
+ },
+ "engines": {
+ "node": ">= 8.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/@electron/asar": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.7.tgz",
+ "integrity": "sha512-8FaSCAIiZGYFWyjeevPQt+0e9xCK9YmJ2Rjg5SXgdsXon6cRnU0Yxnbe6CvJbQn26baifur2Y2G5EBayRIsjyg==",
+ "dev": true,
+ "dependencies": {
+ "commander": "^5.0.0",
+ "glob": "^7.1.6",
+ "minimatch": "^3.0.4"
+ },
+ "bin": {
+ "asar": "bin/asar.js"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/@electron/get": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz",
+ "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "env-paths": "^2.2.0",
+ "fs-extra": "^8.1.0",
+ "got": "^11.8.5",
+ "progress": "^2.0.3",
+ "semver": "^6.2.0",
+ "sumchecker": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "global-agent": "^3.0.0"
+ }
+ },
+ "node_modules/@electron/get/node_modules/fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=6 <7 || >=8"
+ }
+ },
+ "node_modules/@electron/get/node_modules/jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/@electron/get/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@electron/get/node_modules/universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/@electron/notarize": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.1.0.tgz",
+ "integrity": "sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "fs-extra": "^9.0.1",
+ "promise-retry": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@electron/notarize/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@electron/osx-sign": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz",
+ "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==",
+ "dev": true,
+ "dependencies": {
+ "compare-version": "^0.1.2",
+ "debug": "^4.3.4",
+ "fs-extra": "^10.0.0",
+ "isbinaryfile": "^4.0.8",
+ "minimist": "^1.2.6",
+ "plist": "^3.0.5"
+ },
+ "bin": {
+ "electron-osx-flat": "bin/electron-osx-flat.js",
+ "electron-osx-sign": "bin/electron-osx-sign.js"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/@electron/osx-sign/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@electron/osx-sign/node_modules/isbinaryfile": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
+ "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/gjtorikian/"
+ }
+ },
+ "node_modules/@electron/universal": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz",
+ "integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==",
+ "dev": true,
+ "dependencies": {
+ "@electron/asar": "^3.2.1",
+ "@malept/cross-spawn-promise": "^1.1.0",
+ "debug": "^4.3.1",
+ "dir-compare": "^3.0.0",
+ "fs-extra": "^9.0.1",
+ "minimatch": "^3.0.4",
+ "plist": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/@electron/universal/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
+ "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
+ "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
+ "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
+ "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
+ "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
+ "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
+ "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
+ "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
+ "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
+ "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
+ "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
+ "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
+ "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
+ "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
+ "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
+ "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
+ "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
+ "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
+ "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
+ "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
+ "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
+ "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz",
+ "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz",
+ "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz",
+ "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.5.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.36.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz",
+ "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
+ "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "node_modules/@iconify/types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
+ "dev": true
+ },
+ "node_modules/@iconify/utils": {
+ "version": "2.1.11",
+ "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.11.tgz",
+ "integrity": "sha512-M/w3PkN8zQYXi8N6qK/KhnYMfEbbb6Sk8RZVn8g+Pmmu5ybw177RpsaGwpziyHeUsu4etrexYSWq3rwnIqzYCg==",
+ "dev": true,
+ "dependencies": {
+ "@antfu/install-pkg": "^0.1.1",
+ "@antfu/utils": "^0.7.5",
+ "@iconify/types": "^2.0.0",
+ "debug": "^4.3.4",
+ "kolorist": "^1.8.0",
+ "local-pkg": "^0.4.3"
+ }
+ },
+ "node_modules/@intlify/bundle-utils": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-5.5.0.tgz",
+ "integrity": "sha512-k5xe8oAoPXiH6unXvyyyCRbq+LtLn1tSi/6r5f6mF+MsX7mcOMtgYbyAQINsjFrf7EDu5Pg4BY00VWSt8bI9XQ==",
+ "dev": true,
+ "dependencies": {
+ "@intlify/message-compiler": "9.3.0-beta.17",
+ "@intlify/shared": "9.3.0-beta.17",
+ "acorn": "^8.8.2",
+ "escodegen": "^2.0.0",
+ "estree-walker": "^2.0.2",
+ "jsonc-eslint-parser": "^1.0.1",
+ "magic-string": "^0.30.0",
+ "source-map": "0.6.1",
+ "yaml-eslint-parser": "^0.3.2"
+ },
+ "engines": {
+ "node": ">= 12"
+ },
+ "peerDependenciesMeta": {
+ "petite-vue-i18n": {
+ "optional": true
+ },
+ "vue-i18n": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@intlify/bundle-utils/node_modules/magic-string": {
+ "version": "0.30.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
+ "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@intlify/core-base": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.5.0.tgz",
+ "integrity": "sha512-y3ufM1RJbI/DSmJf3lYs9ACq3S/iRvaSsE3rPIk0MGH7fp+JxU6rdryv/EYcwfcr3Y1aHFlCBir6S391hRZ57w==",
+ "dependencies": {
+ "@intlify/message-compiler": "9.5.0",
+ "@intlify/shared": "9.5.0"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/@intlify/core-base/node_modules/@intlify/message-compiler": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.5.0.tgz",
+ "integrity": "sha512-CAhVNfEZcOVFg0/5MNyt+OFjvs4J/ARjCj2b+54/FvFP0EDJI5lIqMTSDBE7k0atMROSP0SvWCkwu/AZ5xkK1g==",
+ "dependencies": {
+ "@intlify/shared": "9.5.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/@intlify/core-base/node_modules/@intlify/shared": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.5.0.tgz",
+ "integrity": "sha512-tAxV14LMXZDZbu32XzLMTsowNlgJNmLwWHYzvMUl6L8gvQeoYiZONjY7AUsqZW8TOZDX9lfvF6adPkk9FSRdDA==",
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/@intlify/message-compiler": {
+ "version": "9.3.0-beta.17",
+ "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.3.0-beta.17.tgz",
+ "integrity": "sha512-i7hvVIRk1Ax2uKa9xLRJCT57to08OhFMhFXXjWN07rmx5pWQYQ23MfX1xgggv9drnWTNhqEiD+u4EJeHoS5+Ww==",
+ "dev": true,
+ "dependencies": {
+ "@intlify/shared": "9.3.0-beta.17",
+ "source-map": "0.6.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/@intlify/shared": {
+ "version": "9.3.0-beta.17",
+ "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.17.tgz",
+ "integrity": "sha512-mscf7RQsUTOil35jTij4KGW1RC9SWQjYScwLxP53Ns6g24iEd5HN7ksbt9O6FvTmlQuX77u+MXpBdfJsGqizLQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/@intlify/unplugin-vue-i18n": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-0.10.1.tgz",
+ "integrity": "sha512-9ZzE0ddlDO06Xzg25JPiNbx6PJPDho5k/Np+uL9fJRZEKq2TxT3c+ZK+Pec6j0ybhhVXeda8/yE3tPUf4SOXZQ==",
+ "dev": true,
+ "dependencies": {
+ "@intlify/bundle-utils": "^5.4.0",
+ "@intlify/shared": "9.3.0-beta.17",
+ "@rollup/pluginutils": "^5.0.2",
+ "@vue/compiler-sfc": "^3.2.47",
+ "debug": "^4.3.3",
+ "fast-glob": "^3.2.12",
+ "js-yaml": "^4.1.0",
+ "json5": "^2.2.3",
+ "pathe": "^1.0.0",
+ "picocolors": "^1.0.0",
+ "source-map": "0.6.1",
+ "unplugin": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 14.16"
+ },
+ "peerDependencies": {
+ "petite-vue-i18n": "*",
+ "vue-i18n": "*",
+ "vue-i18n-bridge": "*"
+ },
+ "peerDependenciesMeta": {
+ "petite-vue-i18n": {
+ "optional": true
+ },
+ "vue-i18n": {
+ "optional": true
+ },
+ "vue-i18n-bridge": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@intlify/unplugin-vue-i18n/node_modules/pathe": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz",
+ "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==",
+ "dev": true
+ },
+ "node_modules/@intlify/unplugin-vue-i18n/node_modules/unplugin": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.0.tgz",
+ "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.10.0",
+ "chokidar": "^3.5.3",
+ "webpack-sources": "^3.2.3",
+ "webpack-virtual-modules": "^0.5.0"
+ }
+ },
+ "node_modules/@intlify/unplugin-vue-i18n/node_modules/webpack-virtual-modules": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
+ "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.20",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz",
+ "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@malept/cross-spawn-promise": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
+ "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/malept"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund"
+ }
+ ],
+ "dependencies": {
+ "cross-spawn": "^7.0.1"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@malept/flatpak-bundler": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz",
+ "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "fs-extra": "^9.0.0",
+ "lodash": "^4.17.15",
+ "tmp-promise": "^3.0.2"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/@malept/flatpak-bundler/node_modules/fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "dependencies": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.23",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz",
+ "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==",
+ "dev": true
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz",
+ "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0"
+ },
+ "peerDependenciesMeta": {
+ "rollup": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@sindresorhus/is": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
+ },
+ "node_modules/@szmarczak/http-timer": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
+ "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
+ "dev": true,
+ "dependencies": {
+ "defer-to-connect": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tsconfig/node10": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
+ "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node12": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node14": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node16": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+ "dev": true
+ },
+ "node_modules/@types/cacheable-request": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
+ "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
+ "dev": true,
+ "dependencies": {
+ "@types/http-cache-semantics": "*",
+ "@types/keyv": "^3.1.4",
+ "@types/node": "*",
+ "@types/responselike": "^1.0.0"
+ }
+ },
+ "node_modules/@types/chai": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz",
+ "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==",
+ "dev": true
+ },
+ "node_modules/@types/chai-subset": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz",
+ "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==",
+ "dev": true,
+ "dependencies": {
+ "@types/chai": "*"
+ }
+ },
+ "node_modules/@types/debug": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.10.tgz",
+ "integrity": "sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==",
+ "dev": true,
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "8.44.5",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.5.tgz",
+ "integrity": "sha512-Ol2eio8LtD/tGM4Ga7Jb83NuFwEv3NqvssSlifXL9xuFpSyQZw0ecmm2Kux6iU0KxQmp95hlPmGCzGJ0TCFeRA==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz",
+ "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==",
+ "dev": true
+ },
+ "node_modules/@types/fs-extra": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.2.tgz",
+ "integrity": "sha512-c0hrgAOVYr21EX8J0jBMXGLMgJqVf/v6yxi0dLaJboW9aQPh16Id+z6w2Tx1hm+piJOLv8xPfVKZCLfjPw/IMQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/jsonfile": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/http-cache-semantics": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
+ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==",
+ "dev": true
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "dev": true
+ },
+ "node_modules/@types/jsonfile": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.2.tgz",
+ "integrity": "sha512-8t92P+oeW4d/CRQfJaSqEwXujrhH4OEeHRjGU3v1Q8mUS8GPF3yiX26sw4svv6faL2HfBtGTe2xWIoVgN3dy9w==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/keyv": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
+ "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/lodash": {
+ "version": "4.14.200",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.200.tgz",
+ "integrity": "sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==",
+ "dev": true
+ },
+ "node_modules/@types/lodash-es": {
+ "version": "4.17.10",
+ "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.10.tgz",
+ "integrity": "sha512-YJP+w/2khSBwbUSFdGsSqmDvmnN3cCKoPOL7Zjle6s30ZtemkkqhjVfFqGwPN7ASil5VyjE2GtyU/yqYY6mC0A==",
+ "dev": true,
+ "dependencies": {
+ "@types/lodash": "*"
+ }
+ },
+ "node_modules/@types/ms": {
+ "version": "0.7.32",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.32.tgz",
+ "integrity": "sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "18.15.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz",
+ "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==",
+ "dev": true
+ },
+ "node_modules/@types/plist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.3.tgz",
+ "integrity": "sha512-DXkBoKc7jwUR0p439icInmXXMJNhoImdpOrrgA5/nDFK7LVtcJ9MyQNKhJEKpEztnHGWnNWMWLOIR62By0Ln0A==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "@types/node": "*",
+ "xmlbuilder": ">=11.0.1"
+ }
+ },
+ "node_modules/@types/prettier": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz",
+ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
+ "dev": true
+ },
+ "node_modules/@types/responselike": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
+ "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/semver": {
+ "version": "7.3.12",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz",
+ "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A=="
+ },
+ "node_modules/@types/verror": {
+ "version": "1.10.7",
+ "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.7.tgz",
+ "integrity": "sha512-4c5F4T0qMSoXq1KHx7WV1FMuD2h0xdaFoJ7HSVWUfQ8w5YbqCwLOA8K7/yy1I+Txuzvm417dnPUaLmqazX1F7g==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.18",
+ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.18.tgz",
+ "integrity": "sha512-v/ZHEj9xh82usl8LMR3GarzFY1IrbXJw5L4QfQhokjRV91q+SelFqxQWSep1ucXEZ22+dSTwLFkXeur25sPIbw=="
+ },
+ "node_modules/@types/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.55.0.tgz",
+ "integrity": "sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.4.0",
+ "@typescript-eslint/scope-manager": "5.55.0",
+ "@typescript-eslint/type-utils": "5.55.0",
+ "@typescript-eslint/utils": "5.55.0",
+ "debug": "^4.3.4",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^5.0.0",
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz",
+ "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.55.0",
+ "@typescript-eslint/visitor-keys": "5.55.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz",
+ "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz",
+ "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.55.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz",
+ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
+ "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.55.0.tgz",
+ "integrity": "sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "5.55.0",
+ "@typescript-eslint/utils": "5.55.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz",
+ "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz",
+ "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.55.0",
+ "@typescript-eslint/visitor-keys": "5.55.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz",
+ "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.55.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz",
+ "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
+ "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.55.0.tgz",
+ "integrity": "sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.55.0",
+ "@typescript-eslint/types": "5.55.0",
+ "@typescript-eslint/typescript-estree": "5.55.0",
+ "eslint-scope": "^5.1.1",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz",
+ "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.55.0",
+ "@typescript-eslint/visitor-keys": "5.55.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz",
+ "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz",
+ "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.55.0",
+ "@typescript-eslint/visitor-keys": "5.55.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz",
+ "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.55.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
+ "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@unocss/astro": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-0.51.13.tgz",
+ "integrity": "sha512-Dul0ZJNwseGBxngBMfghfTsf0quf4HcQcqJuIDzA1T+ueavpwf4QScwbDuS0BqFO4ZiIVSItA7f6eLe31PHUmw==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/core": "0.51.13",
+ "@unocss/reset": "0.51.13",
+ "@unocss/vite": "0.51.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/cli": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-0.51.13.tgz",
+ "integrity": "sha512-g5CmSVyMFIgw/uStVlABldw+EYsrCyGjHd9jQMMTSZbV9IWuM0Tf+ILAZ+B4iXs62ctnrxPYH3Mha6IIuuZXZg==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.1",
+ "@rollup/pluginutils": "^5.0.2",
+ "@unocss/config": "0.51.13",
+ "@unocss/core": "0.51.13",
+ "@unocss/preset-uno": "0.51.13",
+ "cac": "^6.7.14",
+ "chokidar": "^3.5.3",
+ "colorette": "^2.0.20",
+ "consola": "^3.1.0",
+ "fast-glob": "^3.2.12",
+ "magic-string": "^0.30.0",
+ "pathe": "^1.1.0",
+ "perfect-debounce": "^1.0.0"
+ },
+ "bin": {
+ "unocss": "bin/unocss.mjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/cli/node_modules/magic-string": {
+ "version": "0.30.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
+ "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@unocss/cli/node_modules/pathe": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz",
+ "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==",
+ "dev": true
+ },
+ "node_modules/@unocss/config": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/config/-/config-0.51.13.tgz",
+ "integrity": "sha512-EnSLt7Z1C01U3kORh+Iql+zLFm/PQTD1Np6oEW6U0/GTmD3HEilVFQFFxdM5F0X2bBZtZMkkAGGyhRWQj09hDQ==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/core": "0.51.13",
+ "unconfig": "^0.3.7"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/core": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/core/-/core-0.51.13.tgz",
+ "integrity": "sha512-SclWkqY2c+p5+PiqrbQkhJNEExPdeo71/aGFye10tpBkgPJWd5xC7dhg5F8M4VPNBtuNCrvBWyqNnunMyuz/WQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/extractor-arbitrary-variants": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-0.51.13.tgz",
+ "integrity": "sha512-lF7p0ea/MeNf4IsjzNhRNYP8u+f1h5JjhTzcvFpQo/vpBvuM5ZCyqp4mkXxYnLNLFfTLsc+MxXaU34IXxpw1QA==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/core": "0.51.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/inspector": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-0.51.13.tgz",
+ "integrity": "sha512-y6wCvLDmfFHfr5MHqcQLZkwRio4+VEH6j607bgUdKTRlZGVCD7/GBV8lperxsxpkspaE1eykOeDmW7Ms99SEuQ==",
+ "dev": true,
+ "dependencies": {
+ "gzip-size": "^6.0.0",
+ "sirv": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/postcss": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-0.51.13.tgz",
+ "integrity": "sha512-V1QJ7md9jYtBwRc6NGep1Atc+QhaR3115B1wCo8CNM+v+ZOQzpxNsAshvOfyPzfzTj+KLtp4u4zqqaTbYGX2cw==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/config": "0.51.13",
+ "@unocss/core": "0.51.13",
+ "css-tree": "^2.3.1",
+ "fast-glob": "^3.2.12",
+ "magic-string": "^0.30.0",
+ "postcss": "^8.4.23"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.21"
+ }
+ },
+ "node_modules/@unocss/postcss/node_modules/magic-string": {
+ "version": "0.30.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
+ "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@unocss/preset-attributify": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-0.51.13.tgz",
+ "integrity": "sha512-a501ylamV90E+tVf7Dgc8Plwex5LQ5oFSYwsxk06QhcxPWdLmDey3SQjL68AsP9qnLGfIez51sV4y/6H8wFqlw==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/core": "0.51.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/preset-icons": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-0.51.13.tgz",
+ "integrity": "sha512-iL9s1NUVeWe3WSh5LHn7vy+veCAag9AFA50IfNlHuAARhuI8JtrMQA8dOXrWrzM0zWBMB+BVIkVaMVrF257n+Q==",
+ "dev": true,
+ "dependencies": {
+ "@iconify/utils": "^2.1.5",
+ "@unocss/core": "0.51.13",
+ "ofetch": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/preset-mini": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-0.51.13.tgz",
+ "integrity": "sha512-Wa6eMq8IiJEb7F8rL+cDX4XFm4ViAULaAvn8rjk7ANGdOmeqYGyGc0IZkOjQgl3PiFJFnitsBluHhg7nMIk7QQ==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/core": "0.51.13",
+ "@unocss/extractor-arbitrary-variants": "0.51.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/preset-tagify": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-0.51.13.tgz",
+ "integrity": "sha512-9pWPTff/1OKFmOQiGolVKFPzXwJ+r77UhXTB5E793uOQFHPMWCdkjyTPiN12FlB9izjTLIFH3GCGy/koRX9S4w==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/core": "0.51.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/preset-typography": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-0.51.13.tgz",
+ "integrity": "sha512-9uXrPztLsc8ZMnmoIdNAC3/gD183wyFECDzXtJqjOrJhzGr1kcv1sByyQO+kRPI67eWErSsDjpJwK2arfDOihQ==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/core": "0.51.13",
+ "@unocss/preset-mini": "0.51.13"
+ }
+ },
+ "node_modules/@unocss/preset-uno": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-0.51.13.tgz",
+ "integrity": "sha512-S9po93y87YphySfW21+Z5uzSL/GAGN5MqZURQxaGk9WGxYugAnu2PnvhhyqLCVmP05J34tMSDMkIZZqjnGaJzg==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/core": "0.51.13",
+ "@unocss/preset-mini": "0.51.13",
+ "@unocss/preset-wind": "0.51.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/preset-web-fonts": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-0.51.13.tgz",
+ "integrity": "sha512-jl6AhPcnLYN4oKYQZbU/40714IIuNb7TOFh2kgMkDH70r+fzLEdH+cB4l5m0yTsMhEQ6oDsppxm9aXcsVDRESA==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/core": "0.51.13",
+ "ofetch": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/preset-wind": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-0.51.13.tgz",
+ "integrity": "sha512-deRXLOWmKmqCJuohWCE5NUzs7XDJLn4pzgYQSUlEAVUfS6rzL49aJmSHA+p/f+HhJs5jipNdvkcrHYEBMNV1XQ==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/core": "0.51.13",
+ "@unocss/preset-mini": "0.51.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/reset": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-0.51.13.tgz",
+ "integrity": "sha512-xwYJW6vNbHIpBtlFcW93fZxILZpWatcCc9nclSgsl0YlFUz9w4/aoV9KqwU62Y4VUteJxCZCCXa3pSiPO8h5KA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/scope": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/scope/-/scope-0.51.13.tgz",
+ "integrity": "sha512-ATwgDx1qZflR2/EPsAs/XMR9/HdcUNyAZ6VdenwQQdlmAFlIWZQ6smswKyuiJWKtcJynfbdGOWcO3vcocrnSrQ==",
+ "dev": true
+ },
+ "node_modules/@unocss/transformer-attributify-jsx": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-0.51.13.tgz",
+ "integrity": "sha512-vLAtT0K3Rfa3Xiu3LhU4tNCptuO3QlbgSsVO93K3onujfO7qZAaXjK5nj7jiLPyTKtQyl/3WOgNStfReMleF0w==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/core": "0.51.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/transformer-attributify-jsx-babel": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx-babel/-/transformer-attributify-jsx-babel-0.51.13.tgz",
+ "integrity": "sha512-HMEeTi3FIuI5gMJnRICbWdDmraL4NfpjSTjSmAo6EsraBuNO2m+/5JZL5Fc1B3olKes2G84FDSlzfofHyinWzw==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/core": "0.51.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/transformer-compile-class": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-0.51.13.tgz",
+ "integrity": "sha512-7G5ReCIkrZOAikwM9LN74nR4uxffJMSDAbLFDyhdh4qaumJFaxDLDQ4lxpQVZVeXQIF12QSxsnJuI9Fu1nuqmg==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/core": "0.51.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/transformer-directives": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-0.51.13.tgz",
+ "integrity": "sha512-1tl8UcVpqYaKkj1zan/QmUAslEcHe9WdN0/QX3Ao663A5r91EwWhnhwKFfvujrZp1XlFnXgKLmKS8OwTRQfCQg==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/core": "0.51.13",
+ "css-tree": "^2.3.1"
+ }
+ },
+ "node_modules/@unocss/transformer-variant-group": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-0.51.13.tgz",
+ "integrity": "sha512-QT3dfnYeht9SpqPFHJrEfZjL+XeMyi0Wwc4ll4ttIQNCl1Ihiwxl4ScRs1oVXlhCAc3hCXNu9V/FWO0cYHRt/Q==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/core": "0.51.13"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@unocss/vite": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-0.51.13.tgz",
+ "integrity": "sha512-WwyaPnu1XfRiFy4uxXwBuWaL7J1Rcaetsw5lJQUIUdSBTblsd6W7sW+MYTsLfAlA9FUxWDK4ESdI51Xgq4glxw==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.1",
+ "@rollup/pluginutils": "^5.0.2",
+ "@unocss/config": "0.51.13",
+ "@unocss/core": "0.51.13",
+ "@unocss/inspector": "0.51.13",
+ "@unocss/scope": "0.51.13",
+ "@unocss/transformer-directives": "0.51.13",
+ "chokidar": "^3.5.3",
+ "fast-glob": "^3.2.12",
+ "magic-string": "^0.30.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0"
+ }
+ },
+ "node_modules/@unocss/vite/node_modules/magic-string": {
+ "version": "0.30.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
+ "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz",
+ "integrity": "sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==",
+ "dev": true,
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vitest/expect": {
+ "version": "0.29.3",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.3.tgz",
+ "integrity": "sha512-z/0JqBqqrdtrT/wzxNrWC76EpkOHdl+SvuNGxWulLaoluygntYyG5wJul5u/rQs5875zfFz/F+JaDf90SkLUIg==",
+ "dev": true,
+ "dependencies": {
+ "@vitest/spy": "0.29.3",
+ "@vitest/utils": "0.29.3",
+ "chai": "^4.3.7"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "0.29.3",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.3.tgz",
+ "integrity": "sha512-XLi8ctbvOWhUWmuvBUSIBf8POEDH4zCh6bOuVxm/KGfARpgmVF1ku+vVNvyq85va+7qXxtl+MFmzyXQ2xzhAvw==",
+ "dev": true,
+ "dependencies": {
+ "@vitest/utils": "0.29.3",
+ "p-limit": "^4.0.0",
+ "pathe": "^1.1.0"
+ }
+ },
+ "node_modules/@vitest/runner/node_modules/p-limit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@vitest/runner/node_modules/pathe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz",
+ "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==",
+ "dev": true
+ },
+ "node_modules/@vitest/runner/node_modules/yocto-queue": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
+ "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "0.29.3",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.3.tgz",
+ "integrity": "sha512-LLpCb1oOCOZcBm0/Oxbr1DQTuKLRBsSIHyLYof7z4QVE8/v8NcZKdORjMUq645fcfX55+nLXwU/1AQ+c2rND+w==",
+ "dev": true,
+ "dependencies": {
+ "tinyspy": "^1.0.2"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "0.29.3",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.3.tgz",
+ "integrity": "sha512-hg4Ff8AM1GtUnLpUJlNMxrf9f4lZr/xRJjh3uJ0QFP+vjaW82HAxKrmeBmLnhc8Os2eRf+f+VBu4ts7TafPPkA==",
+ "dev": true,
+ "dependencies": {
+ "cli-truncate": "^3.1.0",
+ "diff": "^5.1.0",
+ "loupe": "^2.3.6",
+ "pretty-format": "^27.5.1"
+ }
+ },
+ "node_modules/@vitest/utils/node_modules/ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@vitest/utils/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@vitest/utils/node_modules/cli-truncate": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz",
+ "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==",
+ "dev": true,
+ "dependencies": {
+ "slice-ansi": "^5.0.0",
+ "string-width": "^5.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@vitest/utils/node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/@vitest/utils/node_modules/is-fullwidth-code-point": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+ "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@vitest/utils/node_modules/slice-ansi": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
+ "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^6.0.0",
+ "is-fullwidth-code-point": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@vitest/utils/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@vitest/utils/node_modules/strip-ansi": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
+ "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@volar/language-core": {
+ "version": "1.3.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.3.0-alpha.0.tgz",
+ "integrity": "sha512-W3uMzecHPcbwddPu4SJpUcPakRBK/y/BP+U0U6NiPpUX1tONLC4yCawt+QBJqtgJ+sfD6ztf5PyvPL3hQRqfOA==",
+ "dev": true,
+ "dependencies": {
+ "@volar/source-map": "1.3.0-alpha.0"
+ }
+ },
+ "node_modules/@volar/source-map": {
+ "version": "1.3.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.3.0-alpha.0.tgz",
+ "integrity": "sha512-jSdizxWFvDTvkPYZnO6ew3sBZUnS0abKCbuopkc0JrIlFbznWC/fPH3iPFIMS8/IIkRxq1Jh9VVG60SmtsdaMQ==",
+ "dev": true,
+ "dependencies": {
+ "muggle-string": "^0.2.2"
+ }
+ },
+ "node_modules/@volar/typescript": {
+ "version": "1.3.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.3.0-alpha.0.tgz",
+ "integrity": "sha512-5UItyW2cdH2mBLu4RrECRNJRgtvvzKrSCn2y3v/D61QwIDkGx4aeil6x8RFuUL5TFtV6QvVHXnsOHxNgd+sCow==",
+ "dev": true,
+ "dependencies": {
+ "@volar/language-core": "1.3.0-alpha.0"
+ }
+ },
+ "node_modules/@volar/vue-language-core": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.2.0.tgz",
+ "integrity": "sha512-w7yEiaITh2WzKe6u8ZdeLKCUz43wdmY/OqAmsB/PGDvvhTcVhCJ6f0W/RprZL1IhqH8wALoWiwEh/Wer7ZviMQ==",
+ "dev": true,
+ "dependencies": {
+ "@volar/language-core": "1.3.0-alpha.0",
+ "@volar/source-map": "1.3.0-alpha.0",
+ "@vue/compiler-dom": "^3.2.47",
+ "@vue/compiler-sfc": "^3.2.47",
+ "@vue/reactivity": "^3.2.47",
+ "@vue/shared": "^3.2.47",
+ "minimatch": "^6.1.6",
+ "muggle-string": "^0.2.2",
+ "vue-template-compiler": "^2.7.14"
+ }
+ },
+ "node_modules/@volar/vue-language-core/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@volar/vue-language-core/node_modules/minimatch": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz",
+ "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@volar/vue-typescript": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.2.0.tgz",
+ "integrity": "sha512-zjmRi9y3J1EkG+pfuHp8IbHmibihrKK485cfzsHjiuvJMGrpkWvlO5WVEk8oslMxxeGC5XwBFE9AOlvh378EPA==",
+ "dev": true,
+ "dependencies": {
+ "@volar/typescript": "1.3.0-alpha.0",
+ "@volar/vue-language-core": "1.2.0"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz",
+ "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==",
+ "dependencies": {
+ "@babel/parser": "^7.16.4",
+ "@vue/shared": "3.2.47",
+ "estree-walker": "^2.0.2",
+ "source-map": "^0.6.1"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz",
+ "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==",
+ "dependencies": {
+ "@vue/compiler-core": "3.2.47",
+ "@vue/shared": "3.2.47"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz",
+ "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==",
+ "dependencies": {
+ "@babel/parser": "^7.16.4",
+ "@vue/compiler-core": "3.2.47",
+ "@vue/compiler-dom": "3.2.47",
+ "@vue/compiler-ssr": "3.2.47",
+ "@vue/reactivity-transform": "3.2.47",
+ "@vue/shared": "3.2.47",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.25.7",
+ "postcss": "^8.1.10",
+ "source-map": "^0.6.1"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz",
+ "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.2.47",
+ "@vue/shared": "3.2.47"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz",
+ "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA=="
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz",
+ "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==",
+ "dependencies": {
+ "@vue/shared": "3.2.47"
+ }
+ },
+ "node_modules/@vue/reactivity-transform": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz",
+ "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==",
+ "dependencies": {
+ "@babel/parser": "^7.16.4",
+ "@vue/compiler-core": "3.2.47",
+ "@vue/shared": "3.2.47",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.25.7"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz",
+ "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==",
+ "dependencies": {
+ "@vue/reactivity": "3.2.47",
+ "@vue/shared": "3.2.47"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz",
+ "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==",
+ "dependencies": {
+ "@vue/runtime-core": "3.2.47",
+ "@vue/shared": "3.2.47",
+ "csstype": "^2.6.8"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz",
+ "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.2.47",
+ "@vue/shared": "3.2.47"
+ },
+ "peerDependencies": {
+ "vue": "3.2.47"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz",
+ "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ=="
+ },
+ "node_modules/@vue/test-utils": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.3.1.tgz",
+ "integrity": "sha512-tRtHRPEETQSUrqXgAewNZHm5iypxDFxwenfdcvMRm1kbGo4bcqHb1XHHlsaIjoDbLkuE2NYiF8vBQDNYrzlrSA==",
+ "dev": true,
+ "dependencies": {
+ "js-beautify": "1.14.6"
+ },
+ "optionalDependencies": {
+ "@vue/compiler-dom": "^3.0.1",
+ "@vue/server-renderer": "^3.0.1"
+ },
+ "peerDependencies": {
+ "@vue/compiler-dom": "^3.0.1",
+ "@vue/server-renderer": "^3.0.1",
+ "vue": "^3.0.1"
+ }
+ },
+ "node_modules/@vueuse/core": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.5.0.tgz",
+ "integrity": "sha512-z/tI2eSvxwLRjOhDm0h/SXAjNm8N5ld6/SC/JQs6o6kpJ6Ya50LnEL8g5hoYu005i28L0zqB5L5yAl8Jl26K3A==",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.18",
+ "@vueuse/metadata": "10.5.0",
+ "@vueuse/shared": "10.5.0",
+ "vue-demi": ">=0.14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/core/node_modules/vue-demi": {
+ "version": "0.14.6",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
+ "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+ "hasInstallScript": true,
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.5.0.tgz",
+ "integrity": "sha512-fEbElR+MaIYyCkeM0SzWkdoMtOpIwO72x8WsZHRE7IggiOlILttqttM69AS13nrDxosnDBYdyy3C5mR1LCxHsw==",
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.5.0.tgz",
+ "integrity": "sha512-18iyxbbHYLst9MqU1X1QNdMHIjks6wC7XTVf0KNOv5es/Ms6gjVFCAAWTVP2JStuGqydg3DT+ExpFORUEi9yhg==",
+ "dependencies": {
+ "vue-demi": ">=0.14.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@vueuse/shared/node_modules/vue-demi": {
+ "version": "0.14.6",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
+ "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+ "hasInstallScript": true,
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@xmldom/xmldom": {
+ "version": "0.8.10",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
+ "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/7zip-bin": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz",
+ "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==",
+ "dev": true
+ },
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
+ "node_modules/acorn": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/app-builder-bin": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz",
+ "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==",
+ "dev": true
+ },
+ "node_modules/app-builder-lib": {
+ "version": "24.6.4",
+ "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.6.4.tgz",
+ "integrity": "sha512-m9931WXb83teb32N0rKg+ulbn6+Hl8NV5SUpVDOVz9MWOXfhV6AQtTdftf51zJJvCQnQugGtSqoLvgw6mdF/Rg==",
+ "dev": true,
+ "dependencies": {
+ "@develar/schema-utils": "~2.6.5",
+ "@electron/notarize": "2.1.0",
+ "@electron/osx-sign": "1.0.5",
+ "@electron/universal": "1.4.1",
+ "@malept/flatpak-bundler": "^0.4.0",
+ "@types/fs-extra": "9.0.13",
+ "7zip-bin": "~5.1.1",
+ "async-exit-hook": "^2.0.1",
+ "bluebird-lst": "^1.0.9",
+ "builder-util": "24.5.0",
+ "builder-util-runtime": "9.2.1",
+ "chromium-pickle-js": "^0.2.0",
+ "debug": "^4.3.4",
+ "ejs": "^3.1.8",
+ "electron-publish": "24.5.0",
+ "form-data": "^4.0.0",
+ "fs-extra": "^10.1.0",
+ "hosted-git-info": "^4.1.0",
+ "is-ci": "^3.0.0",
+ "isbinaryfile": "^5.0.0",
+ "js-yaml": "^4.1.0",
+ "lazy-val": "^1.0.5",
+ "minimatch": "^5.1.1",
+ "read-config-file": "6.3.2",
+ "sanitize-filename": "^1.6.3",
+ "semver": "^7.3.8",
+ "tar": "^6.1.12",
+ "temp-file": "^3.4.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/app-builder-lib/node_modules/@types/fs-extra": {
+ "version": "9.0.13",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz",
+ "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/app-builder-lib/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/app-builder-lib/node_modules/builder-util-runtime": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz",
+ "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.4",
+ "sax": "^1.2.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/app-builder-lib/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/app-builder-lib/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "dev": true
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/async": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
+ "dev": true
+ },
+ "node_modules/async-exit-hook": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz",
+ "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true
+ },
+ "node_modules/at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.16",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
+ "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.21.10",
+ "caniuse-lite": "^1.0.30001538",
+ "fraction.js": "^4.3.6",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/b-tween": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/b-tween/-/b-tween-0.3.3.tgz",
+ "integrity": "sha512-oEHegcRpA7fAuc9KC4nktucuZn2aS8htymCPcP3qkEGPqiBH+GfqtqoG2l7LxHngg6O0HFM7hOeOYExl1Oz4ZA==",
+ "dev": true
+ },
+ "node_modules/b-validate": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/b-validate/-/b-validate-1.5.3.tgz",
+ "integrity": "sha512-iCvCkGFskbaYtfQ0a3GmcQCHl/Sv1GufXFGuUQ+FE+WJa7A/espLOuFIn09B944V8/ImPj71T4+rTASxO2PAuA==",
+ "dev": true
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
+ "node_modules/bluebird-lst": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz",
+ "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==",
+ "dev": true,
+ "dependencies": {
+ "bluebird": "^3.5.5"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
+ "node_modules/boolean": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
+ "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz",
+ "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001541",
+ "electron-to-chromium": "^1.4.535",
+ "node-releases": "^2.0.13",
+ "update-browserslist-db": "^1.0.13"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "optional": true,
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/buffer-equal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz",
+ "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "node_modules/builder-util": {
+ "version": "24.5.0",
+ "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.5.0.tgz",
+ "integrity": "sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/debug": "^4.1.6",
+ "7zip-bin": "~5.1.1",
+ "app-builder-bin": "4.0.0",
+ "bluebird-lst": "^1.0.9",
+ "builder-util-runtime": "9.2.1",
+ "chalk": "^4.1.2",
+ "cross-spawn": "^7.0.3",
+ "debug": "^4.3.4",
+ "fs-extra": "^10.1.0",
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.1",
+ "is-ci": "^3.0.0",
+ "js-yaml": "^4.1.0",
+ "source-map-support": "^0.5.19",
+ "stat-mode": "^1.0.0",
+ "temp-file": "^3.4.0"
+ }
+ },
+ "node_modules/builder-util-runtime": {
+ "version": "9.1.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.1.1.tgz",
+ "integrity": "sha512-azRhYLEoDvRDR8Dhis4JatELC/jUvYjm4cVSj7n9dauGTOM2eeNn9KS0z6YA6oDsjI1xphjNbY6PZZeHPzzqaw==",
+ "dependencies": {
+ "debug": "^4.3.4",
+ "sax": "^1.2.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/builder-util/node_modules/builder-util-runtime": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz",
+ "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.4",
+ "sax": "^1.2.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/builder-util/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cacheable-lookup": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
+ "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.6.0"
+ }
+ },
+ "node_modules/cacheable-request": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
+ "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
+ "dev": true,
+ "dependencies": {
+ "clone-response": "^1.0.2",
+ "get-stream": "^5.1.0",
+ "http-cache-semantics": "^4.0.0",
+ "keyv": "^4.0.0",
+ "lowercase-keys": "^2.0.0",
+ "normalize-url": "^6.0.1",
+ "responselike": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "dev": true,
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001550",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001550.tgz",
+ "integrity": "sha512-p82WjBYIypO0ukTsd/FG3Xxs+4tFeaY9pfT4amQL8KWtYH7H9nYwReGAbMTJ0hsmRO8IfDtsS6p3ZWj8+1c2RQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ]
+ },
+ "node_modules/capital-case": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz",
+ "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3",
+ "upper-case-first": "^2.0.2"
+ }
+ },
+ "node_modules/chai": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz",
+ "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==",
+ "dev": true,
+ "dependencies": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^4.1.2",
+ "get-func-name": "^2.0.0",
+ "loupe": "^2.3.1",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.5"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/change-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz",
+ "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==",
+ "dev": true,
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "capital-case": "^1.0.4",
+ "constant-case": "^3.0.4",
+ "dot-case": "^3.0.4",
+ "header-case": "^2.0.4",
+ "no-case": "^3.0.4",
+ "param-case": "^3.0.4",
+ "pascal-case": "^3.1.2",
+ "path-case": "^3.0.4",
+ "sentence-case": "^3.0.4",
+ "snake-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/chromium-pickle-js": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
+ "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==",
+ "dev": true
+ },
+ "node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-truncate": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+ "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "slice-ansi": "^3.0.0",
+ "string-width": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/clone-response": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
+ "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
+ "dev": true,
+ "dependencies": {
+ "mimic-response": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/color": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
+ "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.3",
+ "color-string": "^1.6.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "node_modules/color/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/color/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/common-tags": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/compare-version": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz",
+ "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/compute-scroll-into-view": {
+ "version": "1.0.20",
+ "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
+ "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "node_modules/config-chain": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
+ "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
+ "dev": true,
+ "dependencies": {
+ "ini": "^1.3.4",
+ "proto-list": "~1.2.1"
+ }
+ },
+ "node_modules/config-file-ts": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.4.tgz",
+ "integrity": "sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.6",
+ "typescript": "^4.0.2"
+ }
+ },
+ "node_modules/consola": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
+ "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
+ "dev": true,
+ "engines": {
+ "node": "^14.18.0 || >=16.10.0"
+ }
+ },
+ "node_modules/console": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/console/-/console-0.7.2.tgz",
+ "integrity": "sha512-+JSDwGunA4MTEgAV/4VBKwUHonP8CzJ/6GIuwPi6acKFqFfHUdSGCm89ZxZ5FfGWdZfkdgAroy5bJ5FSeN/t4g==",
+ "dev": true
+ },
+ "node_modules/constant-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz",
+ "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3",
+ "upper-case": "^2.0.2"
+ }
+ },
+ "node_modules/copy-anything": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
+ "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+ "dev": true,
+ "dependencies": {
+ "is-what": "^3.14.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mesqueeb"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/crc": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
+ "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "buffer": "^5.1.0"
+ }
+ },
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "dev": true
+ },
+ "node_modules/cross-env": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
+ "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.1"
+ },
+ "bin": {
+ "cross-env": "src/bin/cross-env.js",
+ "cross-env-shell": "src/bin/cross-env-shell.js"
+ },
+ "engines": {
+ "node": ">=10.14",
+ "npm": ">=6",
+ "yarn": ">=1"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
+ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+ "dev": true,
+ "dependencies": {
+ "mdn-data": "2.0.30",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/css.escape": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
+ "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=",
+ "dev": true
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "2.6.20",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz",
+ "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA=="
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.10",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
+ "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
+ },
+ "node_modules/de-indent": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
+ "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
+ "dev": true
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "dev": true,
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decompress-response/node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-eql": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
+ "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/defer-to-connect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
+ "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/defu": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.2.tgz",
+ "integrity": "sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==",
+ "dev": true
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/destr": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.1.tgz",
+ "integrity": "sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==",
+ "dev": true
+ },
+ "node_modules/detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/diff": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz",
+ "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dir-compare": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz",
+ "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==",
+ "dev": true,
+ "dependencies": {
+ "buffer-equal": "^1.0.0",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true
+ },
+ "node_modules/dmg-builder": {
+ "version": "24.6.4",
+ "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.6.4.tgz",
+ "integrity": "sha512-BNcHRc9CWEuI9qt0E655bUBU/j/3wUCYBVKGu1kVpbN5lcUdEJJJeiO0NHK3dgKmra6LUUZlo+mWqc+OCbi0zw==",
+ "dev": true,
+ "dependencies": {
+ "app-builder-lib": "24.6.4",
+ "builder-util": "24.5.0",
+ "builder-util-runtime": "9.2.1",
+ "fs-extra": "^10.1.0",
+ "iconv-lite": "^0.6.2",
+ "js-yaml": "^4.1.0"
+ },
+ "optionalDependencies": {
+ "dmg-license": "^1.0.11"
+ }
+ },
+ "node_modules/dmg-builder/node_modules/builder-util-runtime": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz",
+ "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.4",
+ "sax": "^1.2.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/dmg-builder/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/dmg-license": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz",
+ "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==",
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "dependencies": {
+ "@types/plist": "^3.0.1",
+ "@types/verror": "^1.10.3",
+ "ajv": "^6.10.0",
+ "crc": "^3.8.0",
+ "iconv-corefoundation": "^1.1.7",
+ "plist": "^3.0.4",
+ "smart-buffer": "^4.0.2",
+ "verror": "^1.10.0"
+ },
+ "bin": {
+ "dmg-license": "bin/dmg-license.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz",
+ "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/dotenv-expand": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
+ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
+ "dev": true
+ },
+ "node_modules/duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+ "dev": true
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "node_modules/editorconfig": {
+ "version": "0.15.3",
+ "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz",
+ "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==",
+ "dev": true,
+ "dependencies": {
+ "commander": "^2.19.0",
+ "lru-cache": "^4.1.5",
+ "semver": "^5.6.0",
+ "sigmund": "^1.0.1"
+ },
+ "bin": {
+ "editorconfig": "bin/editorconfig"
+ }
+ },
+ "node_modules/editorconfig/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/editorconfig/node_modules/lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "dependencies": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "node_modules/editorconfig/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/editorconfig/node_modules/yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
+ "dev": true
+ },
+ "node_modules/ejs": {
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
+ "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
+ "dev": true,
+ "dependencies": {
+ "jake": "^10.8.5"
+ },
+ "bin": {
+ "ejs": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/electron": {
+ "version": "22.3.27",
+ "resolved": "https://registry.npmjs.org/electron/-/electron-22.3.27.tgz",
+ "integrity": "sha512-7Rht21vHqj4ZFRnKuZdFqZFsvMBCmDqmjetiMqPtF+TmTBiGne1mnstVXOA/SRGhN2Qy5gY5bznJKpiqogjM8A==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "@electron/get": "^2.0.0",
+ "@types/node": "^16.11.26",
+ "extract-zip": "^2.0.1"
+ },
+ "bin": {
+ "electron": "cli.js"
+ },
+ "engines": {
+ "node": ">= 12.20.55"
+ }
+ },
+ "node_modules/electron-builder": {
+ "version": "24.6.4",
+ "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.6.4.tgz",
+ "integrity": "sha512-uNWQoU7pE7qOaIQ6CJHpBi44RJFVG8OHRBIadUxrsDJVwLLo8Nma3K/EEtx5/UyWAQYdcK4nVPYKoRqBb20hbA==",
+ "dev": true,
+ "dependencies": {
+ "app-builder-lib": "24.6.4",
+ "builder-util": "24.5.0",
+ "builder-util-runtime": "9.2.1",
+ "chalk": "^4.1.2",
+ "dmg-builder": "24.6.4",
+ "fs-extra": "^10.1.0",
+ "is-ci": "^3.0.0",
+ "lazy-val": "^1.0.5",
+ "read-config-file": "6.3.2",
+ "simple-update-notifier": "2.0.0",
+ "yargs": "^17.6.2"
+ },
+ "bin": {
+ "electron-builder": "cli.js",
+ "install-app-deps": "install-app-deps.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/electron-builder/node_modules/builder-util-runtime": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz",
+ "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.4",
+ "sax": "^1.2.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/electron-builder/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/electron-log": {
+ "version": "4.4.8",
+ "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.4.8.tgz",
+ "integrity": "sha512-QQ4GvrXO+HkgqqEOYbi+DHL7hj5JM+nHi/j+qrN9zeeXVKy8ZABgbu4CnG+BBqDZ2+tbeq9tUC4DZfIWFU5AZA=="
+ },
+ "node_modules/electron-publish": {
+ "version": "24.5.0",
+ "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.5.0.tgz",
+ "integrity": "sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA==",
+ "dev": true,
+ "dependencies": {
+ "@types/fs-extra": "^9.0.11",
+ "builder-util": "24.5.0",
+ "builder-util-runtime": "9.2.1",
+ "chalk": "^4.1.2",
+ "fs-extra": "^10.1.0",
+ "lazy-val": "^1.0.5",
+ "mime": "^2.5.2"
+ }
+ },
+ "node_modules/electron-publish/node_modules/@types/fs-extra": {
+ "version": "9.0.13",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz",
+ "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/electron-publish/node_modules/builder-util-runtime": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz",
+ "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.4",
+ "sax": "^1.2.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/electron-publish/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.557",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.557.tgz",
+ "integrity": "sha512-6x0zsxyMXpnMJnHrondrD3SuAeKcwij9S+83j2qHAQPXbGTDDfgImzzwgGlzrIcXbHQ42tkG4qA6U860cImNhw=="
+ },
+ "node_modules/electron-updater": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-5.3.0.tgz",
+ "integrity": "sha512-iKEr7yQBcvnQUPnSDYGSWC9t0eF2YbZWeYYYZzYxdl+HiRejXFENjYMnYjoOm2zxyD6Cr2JTHZhp9pqxiXuCOw==",
+ "dependencies": {
+ "@types/semver": "^7.3.6",
+ "builder-util-runtime": "9.1.1",
+ "fs-extra": "^10.0.0",
+ "js-yaml": "^4.1.0",
+ "lazy-val": "^1.0.5",
+ "lodash.escaperegexp": "^4.1.2",
+ "lodash.isequal": "^4.5.0",
+ "semver": "^7.3.5",
+ "typed-emitter": "^2.1.0"
+ }
+ },
+ "node_modules/electron-updater/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/electron/node_modules/@types/node": {
+ "version": "16.18.16",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.16.tgz",
+ "integrity": "sha512-ZOzvDRWp8dCVBmgnkIqYCArgdFOO9YzocZp8Ra25N/RStKiWvMOXHMz+GjSeVNe5TstaTmTWPucGJkDw0XXJWA==",
+ "dev": true
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/err-code": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
+ "dev": true
+ },
+ "node_modules/errno": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "prr": "~1.0.1"
+ },
+ "bin": {
+ "errno": "cli.js"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
+ "dev": true
+ },
+ "node_modules/es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/esbuild": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
+ "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/android-arm": "0.18.20",
+ "@esbuild/android-arm64": "0.18.20",
+ "@esbuild/android-x64": "0.18.20",
+ "@esbuild/darwin-arm64": "0.18.20",
+ "@esbuild/darwin-x64": "0.18.20",
+ "@esbuild/freebsd-arm64": "0.18.20",
+ "@esbuild/freebsd-x64": "0.18.20",
+ "@esbuild/linux-arm": "0.18.20",
+ "@esbuild/linux-arm64": "0.18.20",
+ "@esbuild/linux-ia32": "0.18.20",
+ "@esbuild/linux-loong64": "0.18.20",
+ "@esbuild/linux-mips64el": "0.18.20",
+ "@esbuild/linux-ppc64": "0.18.20",
+ "@esbuild/linux-riscv64": "0.18.20",
+ "@esbuild/linux-s390x": "0.18.20",
+ "@esbuild/linux-x64": "0.18.20",
+ "@esbuild/netbsd-x64": "0.18.20",
+ "@esbuild/openbsd-x64": "0.18.20",
+ "@esbuild/sunos-x64": "0.18.20",
+ "@esbuild/win32-arm64": "0.18.20",
+ "@esbuild/win32-ia32": "0.18.20",
+ "@esbuild/win32-x64": "0.18.20"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "dev": true,
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/escodegen/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.36.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz",
+ "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.4.0",
+ "@eslint/eslintrc": "^2.0.1",
+ "@eslint/js": "8.36.0",
+ "@humanwhocodes/config-array": "^0.11.8",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.5.0",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-sdsl": "^4.1.4",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz",
+ "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-prettier": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz",
+ "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==",
+ "dev": true,
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.28.0",
+ "prettier": ">=2.0.0"
+ },
+ "peerDependenciesMeta": {
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-vue": {
+ "version": "9.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.9.0.tgz",
+ "integrity": "sha512-YbubS7eK0J7DCf0U2LxvVP7LMfs6rC6UltihIgval3azO3gyDwEGVgsCMe1TmDiEkl6GdMKfRpaME6QxIYtzDQ==",
+ "dev": true,
+ "dependencies": {
+ "eslint-utils": "^3.0.0",
+ "natural-compare": "^1.4.0",
+ "nth-check": "^2.0.1",
+ "postcss-selector-parser": "^6.0.9",
+ "semver": "^7.3.5",
+ "vue-eslint-parser": "^9.0.1",
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz",
+ "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.8.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz",
+ "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esquery/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/execa/node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/extract-zip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "get-stream": "^5.1.0",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "extract-zip": "cli.js"
+ },
+ "engines": {
+ "node": ">= 10.17.0"
+ },
+ "optionalDependencies": {
+ "@types/yauzl": "^2.9.1"
+ }
+ },
+ "node_modules/extsprintf": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz",
+ "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==",
+ "dev": true,
+ "engines": [
+ "node >=0.6.0"
+ ],
+ "optional": true
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-diff": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "dev": true,
+ "dependencies": {
+ "pend": "~1.2.0"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "dev": true,
+ "dependencies": {
+ "minimatch": "^5.0.1"
+ }
+ },
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/filelist/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz",
+ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==",
+ "dev": true
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz",
+ "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==",
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "dev": true,
+ "dependencies": {
+ "minipass": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/fs-minipass/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-func-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/global-agent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
+ "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "boolean": "^3.0.1",
+ "es6-error": "^4.1.1",
+ "matcher": "^3.0.0",
+ "roarr": "^2.15.3",
+ "semver": "^7.3.2",
+ "serialize-error": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=10.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.19.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
+ "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/got": {
+ "version": "11.8.5",
+ "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz",
+ "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==",
+ "dev": true,
+ "dependencies": {
+ "@sindresorhus/is": "^4.0.0",
+ "@szmarczak/http-timer": "^4.0.5",
+ "@types/cacheable-request": "^6.0.1",
+ "@types/responselike": "^1.0.0",
+ "cacheable-lookup": "^5.0.3",
+ "cacheable-request": "^7.0.2",
+ "decompress-response": "^6.0.0",
+ "http2-wrapper": "^1.0.0-beta.5.2",
+ "lowercase-keys": "^2.0.0",
+ "p-cancelable": "^2.0.0",
+ "responselike": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/got?sponsor=1"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
+ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
+ },
+ "node_modules/grapheme-splitter": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+ "dev": true
+ },
+ "node_modules/gzip-size": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
+ "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+ "dev": true,
+ "dependencies": {
+ "duplexer": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/happy-dom": {
+ "version": "8.9.0",
+ "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-8.9.0.tgz",
+ "integrity": "sha512-JZwJuGdR7ko8L61136YzmrLv7LgTh5b8XaEM3P709mLjyQuXJ3zHTDXvUtBBahRjGlcYW0zGjIiEWizoTUGKfA==",
+ "dev": true,
+ "dependencies": {
+ "css.escape": "^1.5.1",
+ "he": "^1.2.0",
+ "iconv-lite": "^0.6.3",
+ "node-fetch": "^2.x.x",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^2.0.0",
+ "whatwg-mimetype": "^3.0.0"
+ }
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-ansi/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/header-case": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz",
+ "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==",
+ "dev": true,
+ "dependencies": {
+ "capital-case": "^1.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/http-cache-semantics": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
+ "dev": true
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+ "dev": true,
+ "dependencies": {
+ "@tootallnate/once": "2",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/http2-wrapper": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
+ "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
+ "dev": true,
+ "dependencies": {
+ "quick-lru": "^5.1.1",
+ "resolve-alpn": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10.19.0"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/iconv-corefoundation": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz",
+ "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==",
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "dependencies": {
+ "cli-truncate": "^2.1.0",
+ "node-addon-api": "^1.6.3"
+ },
+ "engines": {
+ "node": "^8.11.2 || >=10"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "optional": true
+ },
+ "node_modules/ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/image-size": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+ "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "image-size": "bin/image-size.js"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+ "dev": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-ci": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
+ "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
+ "dev": true,
+ "dependencies": {
+ "ci-info": "^3.2.0"
+ },
+ "bin": {
+ "is-ci": "bin.js"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
+ "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+ "dev": true,
+ "dependencies": {
+ "has": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-what": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
+ "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+ "dev": true
+ },
+ "node_modules/isbinaryfile": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz",
+ "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/gjtorikian/"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "node_modules/jake": {
+ "version": "10.8.7",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz",
+ "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==",
+ "dev": true,
+ "dependencies": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.4",
+ "minimatch": "^3.1.2"
+ },
+ "bin": {
+ "jake": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz",
+ "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==",
+ "dev": true,
+ "bin": {
+ "jiti": "bin/jiti.js"
+ }
+ },
+ "node_modules/js-beautify": {
+ "version": "1.14.6",
+ "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.6.tgz",
+ "integrity": "sha512-GfofQY5zDp+cuHc+gsEXKPpNw2KbPddreEo35O6jT6i0RVK6LhsoYBhq5TvK4/n74wnA0QbK8gGd+jUZwTMKJw==",
+ "dev": true,
+ "dependencies": {
+ "config-chain": "^1.1.13",
+ "editorconfig": "^0.15.3",
+ "glob": "^8.0.3",
+ "nopt": "^6.0.0"
+ },
+ "bin": {
+ "css-beautify": "js/bin/css-beautify.js",
+ "html-beautify": "js/bin/html-beautify.js",
+ "js-beautify": "js/bin/js-beautify.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/js-beautify/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/js-beautify/node_modules/glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/js-beautify/node_modules/minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/js-sdsl": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz",
+ "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==",
+ "dev": true
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true,
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonc-eslint-parser": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-1.4.1.tgz",
+ "integrity": "sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^7.4.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^1.3.0",
+ "espree": "^6.0.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/jsonc-eslint-parser/node_modules/acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/jsonc-eslint-parser/node_modules/eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/jsonc-eslint-parser/node_modules/espree": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
+ "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^7.1.1",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/jsonc-eslint-parser/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
+ "dev": true
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
+ "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/kolorist": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz",
+ "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==",
+ "dev": true
+ },
+ "node_modules/lazy-val": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz",
+ "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q=="
+ },
+ "node_modules/less": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz",
+ "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==",
+ "dev": true,
+ "dependencies": {
+ "copy-anything": "^2.0.1",
+ "parse-node-version": "^1.0.1",
+ "tslib": "^2.3.0"
+ },
+ "bin": {
+ "lessc": "bin/lessc"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "optionalDependencies": {
+ "errno": "^0.1.1",
+ "graceful-fs": "^4.1.2",
+ "image-size": "~0.5.0",
+ "make-dir": "^2.1.0",
+ "mime": "^1.4.1",
+ "needle": "^3.1.0",
+ "source-map": "~0.6.0"
+ }
+ },
+ "node_modules/less/node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/local-pkg": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz",
+ "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ },
+ "node_modules/lodash.escaperegexp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
+ "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c="
+ },
+ "node_modules/lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/loglevel": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz",
+ "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6.0"
+ },
+ "funding": {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/loglevel"
+ }
+ },
+ "node_modules/loglevel-colored-level-prefix": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz",
+ "integrity": "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^1.1.3",
+ "loglevel": "^1.4.1"
+ }
+ },
+ "node_modules/loglevel-colored-level-prefix/node_modules/ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/loglevel-colored-level-prefix/node_modules/ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/loglevel-colored-level-prefix/node_modules/chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/loglevel-colored-level-prefix/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/loglevel-colored-level-prefix/node_modules/strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/loglevel-colored-level-prefix/node_modules/supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/loupe": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
+ "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
+ "dev": true,
+ "dependencies": {
+ "get-func-name": "^2.0.0"
+ }
+ },
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/magic-string": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "dependencies": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "dev": true
+ },
+ "node_modules/matcher": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
+ "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "escape-string-regexp": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.0.30",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
+ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+ "dev": true
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mimic-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "dev": true,
+ "dependencies": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/minizlib/node_modules/minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true,
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "0.5.16",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-0.5.16.tgz",
+ "integrity": "sha512-LaJ8yuh4v0zEmge/g3c7jjFlhoCPfQn6RCjXgm9A0Qiuochq4BcuOxVfWmdnCoLTlg2MV+hqhOek+W2OhG0Lwg==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.8.0",
+ "pathe": "^0.3.8",
+ "pkg-types": "^0.3.5",
+ "ufo": "^0.8.5"
+ }
+ },
+ "node_modules/mrmime": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz",
+ "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "node_modules/muggle-string": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.2.2.tgz",
+ "integrity": "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==",
+ "dev": true
+ },
+ "node_modules/mustache": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
+ "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==",
+ "bin": {
+ "mustache": "bin/mustache"
+ }
+ },
+ "node_modules/nano-staged": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/nano-staged/-/nano-staged-0.8.0.tgz",
+ "integrity": "sha512-QSEqPGTCJbkHU2yLvfY6huqYPjdBrOaTMKatO1F8nCSrkQGXeKwtCiCnsdxnuMhbg3DTVywKaeWLGCE5oJpq0g==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "nano-staged": "lib/bin.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/nanoid": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz",
+ "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.js"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "node_modules/natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "dev": true
+ },
+ "node_modules/needle": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz",
+ "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "debug": "^3.2.6",
+ "iconv-lite": "^0.6.3",
+ "sax": "^1.2.4"
+ },
+ "bin": {
+ "needle": "bin/needle"
+ },
+ "engines": {
+ "node": ">= 4.4.x"
+ }
+ },
+ "node_modules/needle/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/node-addon-api": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz",
+ "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dev": true,
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-fetch-native": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.4.0.tgz",
+ "integrity": "sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==",
+ "dev": true
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
+ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ=="
+ },
+ "node_modules/nopt": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz",
+ "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==",
+ "dev": true,
+ "dependencies": {
+ "abbrev": "^1.0.0"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/number-precision": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/number-precision/-/number-precision-1.6.0.tgz",
+ "integrity": "sha512-05OLPgbgmnixJw+VvEh18yNPUo3iyp4BEWJcrLu4X9W05KmMifN7Mu5exYvQXqxxeNWhvIF+j3Rij+HmddM/hQ==",
+ "dev": true
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ofetch": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.3.3.tgz",
+ "integrity": "sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==",
+ "dev": true,
+ "dependencies": {
+ "destr": "^2.0.1",
+ "node-fetch-native": "^1.4.0",
+ "ufo": "^1.3.0"
+ }
+ },
+ "node_modules/ofetch/node_modules/ufo": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz",
+ "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==",
+ "dev": true
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-cancelable": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
+ "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "dev": true,
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-node-version": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/path-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz",
+ "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==",
+ "dev": true,
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pathe": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.3.9.tgz",
+ "integrity": "sha512-6Y6s0vT112P3jD8dGfuS6r+lpa0qqNrLyHPOwvXMnyNTQaYiwgau2DP3aNDsR13xqtGj7rrPo+jFUATpU6/s+g==",
+ "dev": true
+ },
+ "node_modules/pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "dev": true
+ },
+ "node_modules/perfect-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
+ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
+ "dev": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pinia": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz",
+ "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==",
+ "dependencies": {
+ "@vue/devtools-api": "^6.5.0",
+ "vue-demi": ">=0.14.5"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.4.0",
+ "typescript": ">=4.4.4",
+ "vue": "^2.6.14 || ^3.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pinia/node_modules/vue-demi": {
+ "version": "0.14.6",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
+ "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+ "hasInstallScript": true,
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-0.3.6.tgz",
+ "integrity": "sha512-uQZutkkh6axl1GxDm5/+8ivVdwuJ5pyDGqJeSiIWIUWIqYiK3p9QKozN/Rv6eVvFoeSWkN1uoYeSDBwwBJBtbg==",
+ "dev": true,
+ "dependencies": {
+ "jsonc-parser": "^3.2.0",
+ "mlly": "^0.5.16",
+ "pathe": "^0.3.9"
+ }
+ },
+ "node_modules/playwright": {
+ "version": "1.31.2",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.31.2.tgz",
+ "integrity": "sha512-jpC47n2PKQNtzB7clmBuWh6ftBRS/Bt5EGLigJ9k2QAKcNeYXZkEaDH5gmvb6+AbcE0DO6GnXdbl9ogG6Eh+og==",
+ "dev": true,
+ "hasInstallScript": true,
+ "dependencies": {
+ "playwright-core": "1.31.2"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/playwright-core": {
+ "version": "1.31.2",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.31.2.tgz",
+ "integrity": "sha512-a1dFgCNQw4vCsG7bnojZjDnPewZcw7tZUNFN0ZkcLYKj+mPmXvg4MpaaKZ5SgqPsOmqIf2YsVRkgqiRDxD+fDQ==",
+ "dev": true,
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/plist": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz",
+ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==",
+ "dev": true,
+ "dependencies": {
+ "@xmldom/xmldom": "^0.8.8",
+ "base64-js": "^1.5.1",
+ "xmlbuilder": "^15.1.1"
+ },
+ "engines": {
+ "node": ">=10.4.0"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.0.10",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
+ },
+ "node_modules/postcss/node_modules/nanoid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin-prettier.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-eslint": {
+ "version": "15.0.1",
+ "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-15.0.1.tgz",
+ "integrity": "sha512-mGOWVHixSvpZWARqSDXbdtTL54mMBxc5oQYQ6RAqy8jecuNJBgN3t9E5a81G66F8x8fsKNiR1HWaBV66MJDOpg==",
+ "dev": true,
+ "dependencies": {
+ "@types/eslint": "^8.4.2",
+ "@types/prettier": "^2.6.0",
+ "@typescript-eslint/parser": "^5.10.0",
+ "common-tags": "^1.4.0",
+ "dlv": "^1.1.0",
+ "eslint": "^8.7.0",
+ "indent-string": "^4.0.0",
+ "lodash.merge": "^4.6.0",
+ "loglevel-colored-level-prefix": "^1.0.0",
+ "prettier": "^2.5.1",
+ "pretty-format": "^23.0.1",
+ "require-relative": "^0.8.7",
+ "typescript": "^4.5.4",
+ "vue-eslint-parser": "^8.0.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/prettier-eslint/node_modules/ansi-regex": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
+ "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/prettier-eslint/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/prettier-eslint/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/prettier-eslint/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/prettier-eslint/node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/prettier-eslint/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/prettier-eslint/node_modules/pretty-format": {
+ "version": "23.6.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz",
+ "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^3.0.0",
+ "ansi-styles": "^3.2.0"
+ }
+ },
+ "node_modules/prettier-eslint/node_modules/vue-eslint-parser": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
+ "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.2",
+ "eslint-scope": "^7.0.0",
+ "eslint-visitor-keys": "^3.1.0",
+ "espree": "^9.0.0",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/promise-retry": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+ "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+ "dev": true,
+ "dependencies": {
+ "err-code": "^2.0.2",
+ "retry": "^0.12.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/proto-list": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
+ "dev": true
+ },
+ "node_modules/prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
+ "dev": true
+ },
+ "node_modules/pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/python-shell": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/python-shell/-/python-shell-5.0.0.tgz",
+ "integrity": "sha512-RUOOOjHLhgR1MIQrCtnEqz/HJ1RMZBIN+REnpSUrfft2bXqXy69fwJASVziWExfFXsR1bCY0TznnHooNsCo0/w==",
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true
+ },
+ "node_modules/read-config-file": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz",
+ "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==",
+ "dev": true,
+ "dependencies": {
+ "config-file-ts": "^0.2.4",
+ "dotenv": "^9.0.2",
+ "dotenv-expand": "^5.1.0",
+ "js-yaml": "^4.1.0",
+ "json5": "^2.2.0",
+ "lazy-val": "^1.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-relative": {
+ "version": "0.8.7",
+ "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz",
+ "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==",
+ "dev": true
+ },
+ "node_modules/resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==",
+ "dev": true
+ },
+ "node_modules/resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-alpn": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+ "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
+ "dev": true
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/responselike": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
+ "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
+ "dev": true,
+ "dependencies": {
+ "lowercase-keys": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/roarr": {
+ "version": "2.15.4",
+ "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
+ "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "boolean": "^3.0.1",
+ "detect-node": "^2.0.4",
+ "globalthis": "^1.0.1",
+ "json-stringify-safe": "^5.0.1",
+ "semver-compare": "^1.0.0",
+ "sprintf-js": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "3.29.4",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz",
+ "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==",
+ "dev": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=14.18.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/rxjs": {
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz",
+ "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==",
+ "optional": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "node_modules/sanitize-filename": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz",
+ "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==",
+ "dev": true,
+ "dependencies": {
+ "truncate-utf8-bytes": "^1.0.0"
+ }
+ },
+ "node_modules/sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+ },
+ "node_modules/scroll-into-view-if-needed": {
+ "version": "2.2.31",
+ "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
+ "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
+ "dev": true,
+ "dependencies": {
+ "compute-scroll-into-view": "^1.0.20"
+ }
+ },
+ "node_modules/scule": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/scule/-/scule-1.0.0.tgz",
+ "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==",
+ "dev": true
+ },
+ "node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/sentence-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz",
+ "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==",
+ "dev": true,
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3",
+ "upper-case-first": "^2.0.2"
+ }
+ },
+ "node_modules/serialize-error": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
+ "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "type-fest": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/serialize-error/node_modules/type-fest": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
+ "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true
+ },
+ "node_modules/sigmund": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
+ "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==",
+ "dev": true
+ },
+ "node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/simple-git-hooks": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/simple-git-hooks/-/simple-git-hooks-2.8.1.tgz",
+ "integrity": "sha512-DYpcVR1AGtSfFUNzlBdHrQGPsOhuuEJ/FkmPOOlFysP60AHd3nsEpkGq/QEOdtUyT1Qhk7w9oLmFoMG+75BDog==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "simple-git-hooks": "cli.js"
+ }
+ },
+ "node_modules/simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "dev": true,
+ "dependencies": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "node_modules/simple-update-notifier": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
+ "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/sirv": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz",
+ "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==",
+ "dev": true,
+ "dependencies": {
+ "@polka/url": "^1.0.0-next.20",
+ "mrmime": "^1.0.0",
+ "totalist": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+ "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/snake-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
+ "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
+ "dev": true,
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
+ "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "dev": true
+ },
+ "node_modules/stat-mode": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz",
+ "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/std-env": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.1.tgz",
+ "integrity": "sha512-3H20QlwQsSm2OvAxWIYhs+j01MzzqwMwGiiO1NQaJYZgJZFPuAbf95/DiKRBSTYIJ2FeGUc+B/6mPGcWP9dO3Q==",
+ "dev": true
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-literal": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz",
+ "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/sumchecker": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
+ "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.0"
+ },
+ "engines": {
+ "node": ">= 8.0"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/tar": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
+ "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==",
+ "dev": true,
+ "dependencies": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/temp-file": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz",
+ "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==",
+ "dev": true,
+ "dependencies": {
+ "async-exit-hook": "^2.0.1",
+ "fs-extra": "^10.0.0"
+ }
+ },
+ "node_modules/temp-file/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "node_modules/tinybench": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz",
+ "integrity": "sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==",
+ "dev": true
+ },
+ "node_modules/tinypool": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.1.tgz",
+ "integrity": "sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tinyspy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.0.2.tgz",
+ "integrity": "sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tmp": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+ "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+ "dev": true,
+ "dependencies": {
+ "rimraf": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8.17.0"
+ }
+ },
+ "node_modules/tmp-promise": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz",
+ "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==",
+ "dev": true,
+ "dependencies": {
+ "tmp": "^0.2.0"
+ }
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/totalist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
+ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
+ "dev": true
+ },
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
+ "node_modules/truncate-utf8-bytes": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
+ "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==",
+ "dev": true,
+ "dependencies": {
+ "utf8-byte-length": "^1.0.1"
+ }
+ },
+ "node_modules/ts-node": {
+ "version": "10.9.1",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
+ "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
+ "dev": true,
+ "dependencies": {
+ "@cspotcode/source-map-support": "^0.8.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "v8-compile-cache-lib": "^3.0.1",
+ "yn": "3.1.1"
+ },
+ "bin": {
+ "ts-node": "dist/bin.js",
+ "ts-node-cwd": "dist/bin-cwd.js",
+ "ts-node-esm": "dist/bin-esm.js",
+ "ts-node-script": "dist/bin-script.js",
+ "ts-node-transpile-only": "dist/bin-transpile.js",
+ "ts-script": "dist/bin-script-deprecated.js"
+ },
+ "peerDependencies": {
+ "@swc/core": ">=1.2.50",
+ "@swc/wasm": ">=1.2.50",
+ "@types/node": "*",
+ "typescript": ">=2.7"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/wasm": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ts-node/node_modules/diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
+ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
+ "devOptional": true
+ },
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "node_modules/tsutils/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typed-emitter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz",
+ "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==",
+ "optionalDependencies": {
+ "rxjs": "*"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "devOptional": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/ufo": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-0.8.5.tgz",
+ "integrity": "sha512-e4+UtA5IRO+ha6hYklwj6r7BjiGMxS0O+UaSg9HbaTefg4kMkzj4tXzEBajRR+wkxf+golgAWKzLbytCUDMJAA==",
+ "dev": true
+ },
+ "node_modules/unconfig": {
+ "version": "0.3.11",
+ "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.3.11.tgz",
+ "integrity": "sha512-bV/nqePAKv71v3HdVUn6UefbsDKQWRX+bJIkiSm0+twIds6WiD2bJLWWT3i214+J/B4edufZpG2w7Y63Vbwxow==",
+ "dev": true,
+ "dependencies": {
+ "@antfu/utils": "^0.7.6",
+ "defu": "^6.1.2",
+ "jiti": "^1.20.0",
+ "mlly": "^1.4.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/unconfig/node_modules/mlly": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz",
+ "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.10.0",
+ "pathe": "^1.1.1",
+ "pkg-types": "^1.0.3",
+ "ufo": "^1.3.0"
+ }
+ },
+ "node_modules/unconfig/node_modules/pathe": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz",
+ "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==",
+ "dev": true
+ },
+ "node_modules/unconfig/node_modules/pkg-types": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz",
+ "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==",
+ "dev": true,
+ "dependencies": {
+ "jsonc-parser": "^3.2.0",
+ "mlly": "^1.2.0",
+ "pathe": "^1.1.0"
+ }
+ },
+ "node_modules/unconfig/node_modules/ufo": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz",
+ "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==",
+ "dev": true
+ },
+ "node_modules/unimport": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.4.0.tgz",
+ "integrity": "sha512-M/lfFEgufIT156QAr/jWHLUn55kEmxBBiQsMxvRSIbquwmeJEyQYgshHDEvQDWlSJrVOOTAgnJ3FvlsrpGkanA==",
+ "dev": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^5.0.4",
+ "escape-string-regexp": "^5.0.0",
+ "fast-glob": "^3.3.1",
+ "local-pkg": "^0.4.3",
+ "magic-string": "^0.30.3",
+ "mlly": "^1.4.2",
+ "pathe": "^1.1.1",
+ "pkg-types": "^1.0.3",
+ "scule": "^1.0.0",
+ "strip-literal": "^1.3.0",
+ "unplugin": "^1.5.0"
+ }
+ },
+ "node_modules/unimport/node_modules/escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/unimport/node_modules/magic-string": {
+ "version": "0.30.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
+ "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/unimport/node_modules/mlly": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz",
+ "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.10.0",
+ "pathe": "^1.1.1",
+ "pkg-types": "^1.0.3",
+ "ufo": "^1.3.0"
+ }
+ },
+ "node_modules/unimport/node_modules/pathe": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz",
+ "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==",
+ "dev": true
+ },
+ "node_modules/unimport/node_modules/pkg-types": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz",
+ "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==",
+ "dev": true,
+ "dependencies": {
+ "jsonc-parser": "^3.2.0",
+ "mlly": "^1.2.0",
+ "pathe": "^1.1.0"
+ }
+ },
+ "node_modules/unimport/node_modules/ufo": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz",
+ "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==",
+ "dev": true
+ },
+ "node_modules/unimport/node_modules/unplugin": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.0.tgz",
+ "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.10.0",
+ "chokidar": "^3.5.3",
+ "webpack-sources": "^3.2.3",
+ "webpack-virtual-modules": "^0.5.0"
+ }
+ },
+ "node_modules/unimport/node_modules/webpack-virtual-modules": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
+ "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
+ "dev": true
+ },
+ "node_modules/universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==",
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unocss": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/unocss/-/unocss-0.51.13.tgz",
+ "integrity": "sha512-EAhuQ97D7E+EsTdlCL+xoWEsvz46Se9ZAtHhJ+1W+DzMky9qrDLRyR8Caf2TPbz8dw/z0qYhoPr6/aJARG4r0g==",
+ "dev": true,
+ "dependencies": {
+ "@unocss/astro": "0.51.13",
+ "@unocss/cli": "0.51.13",
+ "@unocss/core": "0.51.13",
+ "@unocss/extractor-arbitrary-variants": "0.51.13",
+ "@unocss/postcss": "0.51.13",
+ "@unocss/preset-attributify": "0.51.13",
+ "@unocss/preset-icons": "0.51.13",
+ "@unocss/preset-mini": "0.51.13",
+ "@unocss/preset-tagify": "0.51.13",
+ "@unocss/preset-typography": "0.51.13",
+ "@unocss/preset-uno": "0.51.13",
+ "@unocss/preset-web-fonts": "0.51.13",
+ "@unocss/preset-wind": "0.51.13",
+ "@unocss/reset": "0.51.13",
+ "@unocss/transformer-attributify-jsx": "0.51.13",
+ "@unocss/transformer-attributify-jsx-babel": "0.51.13",
+ "@unocss/transformer-compile-class": "0.51.13",
+ "@unocss/transformer-directives": "0.51.13",
+ "@unocss/transformer-variant-group": "0.51.13",
+ "@unocss/vite": "0.51.13"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@unocss/webpack": "0.51.13"
+ },
+ "peerDependenciesMeta": {
+ "@unocss/webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/unplugin": {
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-0.10.2.tgz",
+ "integrity": "sha512-6rk7GUa4ICYjae5PrAllvcDeuT8pA9+j5J5EkxbMFaV+SalHhxZ7X2dohMzu6C3XzsMT+6jwR/+pwPNR3uK9MA==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.8.0",
+ "chokidar": "^3.5.3",
+ "webpack-sources": "^3.2.3",
+ "webpack-virtual-modules": "^0.4.5"
+ }
+ },
+ "node_modules/unplugin-auto-expose": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/unplugin-auto-expose/-/unplugin-auto-expose-0.0.4.tgz",
+ "integrity": "sha512-TMkcJll/FODZW3+O/H/caZg+C5TUdMgu20xvB/YKqVpGjpbxaInSlAZrcKh8ifpCY6V+aMKQ4ubiEVJ87Otlog==",
+ "dev": true,
+ "dependencies": {
+ "magic-string": "^0.26.7",
+ "mlly": "0.5.16",
+ "unplugin": "0.10.2"
+ }
+ },
+ "node_modules/unplugin-auto-expose/node_modules/magic-string": {
+ "version": "0.26.7",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz",
+ "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==",
+ "dev": true,
+ "dependencies": {
+ "sourcemap-codec": "^1.4.8"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/unplugin-auto-import": {
+ "version": "0.15.3",
+ "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.15.3.tgz",
+ "integrity": "sha512-RLT8SqbPn4bT7yBshZId0uPSofKWnwr66RyDaxWaFb/+f7OTDOWAsVNz+hOQLBWSjvbekr2xZY9ccS8TDHJbCQ==",
+ "dev": true,
+ "dependencies": {
+ "@antfu/utils": "^0.7.2",
+ "@rollup/pluginutils": "^5.0.2",
+ "local-pkg": "^0.4.3",
+ "magic-string": "^0.30.0",
+ "minimatch": "^9.0.0",
+ "unimport": "^3.0.6",
+ "unplugin": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@nuxt/kit": "^3.2.2",
+ "@vueuse/core": "*"
+ },
+ "peerDependenciesMeta": {
+ "@nuxt/kit": {
+ "optional": true
+ },
+ "@vueuse/core": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/unplugin-auto-import/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/unplugin-auto-import/node_modules/magic-string": {
+ "version": "0.30.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
+ "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/unplugin-auto-import/node_modules/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/unplugin-auto-import/node_modules/unplugin": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.0.tgz",
+ "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.10.0",
+ "chokidar": "^3.5.3",
+ "webpack-sources": "^3.2.3",
+ "webpack-virtual-modules": "^0.5.0"
+ }
+ },
+ "node_modules/unplugin-auto-import/node_modules/webpack-virtual-modules": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
+ "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
+ "dev": true
+ },
+ "node_modules/unplugin-vue-components": {
+ "version": "0.24.1",
+ "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.24.1.tgz",
+ "integrity": "sha512-T3A8HkZoIE1Cja95xNqolwza0yD5IVlgZZ1PVAGvVCx8xthmjsv38xWRCtHtwl+rvZyL9uif42SRkDGw9aCfMA==",
+ "dev": true,
+ "dependencies": {
+ "@antfu/utils": "^0.7.2",
+ "@rollup/pluginutils": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.2.12",
+ "local-pkg": "^0.4.3",
+ "magic-string": "^0.30.0",
+ "minimatch": "^7.4.2",
+ "resolve": "^1.22.1",
+ "unplugin": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@babel/parser": "^7.15.8",
+ "@nuxt/kit": "^3.2.2",
+ "vue": "2 || 3"
+ },
+ "peerDependenciesMeta": {
+ "@babel/parser": {
+ "optional": true
+ },
+ "@nuxt/kit": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/unplugin-vue-components/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/unplugin-vue-components/node_modules/magic-string": {
+ "version": "0.30.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
+ "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/unplugin-vue-components/node_modules/minimatch": {
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz",
+ "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/unplugin-vue-components/node_modules/unplugin": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.0.tgz",
+ "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.10.0",
+ "chokidar": "^3.5.3",
+ "webpack-sources": "^3.2.3",
+ "webpack-virtual-modules": "^0.5.0"
+ }
+ },
+ "node_modules/unplugin-vue-components/node_modules/webpack-virtual-modules": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
+ "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
+ "dev": true
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+ "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/upper-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz",
+ "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/upper-case-first": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz",
+ "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/utf8-byte-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz",
+ "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==",
+ "dev": true
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "node_modules/v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "dev": true
+ },
+ "node_modules/verror": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz",
+ "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "4.4.11",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz",
+ "integrity": "sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.18.10",
+ "postcss": "^8.4.27",
+ "rollup": "^3.27.1"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ },
+ "peerDependencies": {
+ "@types/node": ">= 14",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-node": {
+ "version": "0.29.3",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.3.tgz",
+ "integrity": "sha512-QYzYSA4Yt2IiduEjYbccfZQfxKp+T1Do8/HEpSX/G5WIECTFKJADwLs9c94aQH4o0A+UtCKU61lj1m5KvbxxQA==",
+ "dev": true,
+ "dependencies": {
+ "cac": "^6.7.14",
+ "debug": "^4.3.4",
+ "mlly": "^1.1.0",
+ "pathe": "^1.1.0",
+ "picocolors": "^1.0.0",
+ "vite": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "vite-node": "vite-node.mjs"
+ },
+ "engines": {
+ "node": ">=v14.16.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/vite-node/node_modules/mlly": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.0.tgz",
+ "integrity": "sha512-cwzBrBfwGC1gYJyfcy8TcZU1f+dbH/T+TuOhtYP2wLv/Fb51/uV7HJQfBPtEupZ2ORLRU1EKFS/QfS3eo9+kBQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.8.1",
+ "pathe": "^1.0.0",
+ "pkg-types": "^1.0.1",
+ "ufo": "^1.0.1"
+ }
+ },
+ "node_modules/vite-node/node_modules/pathe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz",
+ "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==",
+ "dev": true
+ },
+ "node_modules/vite-node/node_modules/pkg-types": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.1.tgz",
+ "integrity": "sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==",
+ "dev": true,
+ "dependencies": {
+ "jsonc-parser": "^3.2.0",
+ "mlly": "^1.0.0",
+ "pathe": "^1.0.0"
+ }
+ },
+ "node_modules/vite-node/node_modules/ufo": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.0.1.tgz",
+ "integrity": "sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==",
+ "dev": true
+ },
+ "node_modules/vite-plugin-style-import": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/vite-plugin-style-import/-/vite-plugin-style-import-2.0.0.tgz",
+ "integrity": "sha512-qtoHQae5dSUQPo/rYz/8p190VU5y19rtBaeV7ryLa/AYAU/e9CG89NrN/3+k7MR8mJy/GPIu91iJ3zk9foUOSA==",
+ "dev": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^4.1.2",
+ "change-case": "^4.1.2",
+ "console": "^0.7.2",
+ "es-module-lexer": "^0.9.3",
+ "fs-extra": "^10.0.0",
+ "magic-string": "^0.25.7",
+ "pathe": "^0.2.0"
+ },
+ "peerDependencies": {
+ "vite": ">=2.0.0"
+ }
+ },
+ "node_modules/vite-plugin-style-import/node_modules/@rollup/pluginutils": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
+ "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
+ "dev": true,
+ "dependencies": {
+ "estree-walker": "^2.0.1",
+ "picomatch": "^2.2.2"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/vite-plugin-style-import/node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/vite-plugin-style-import/node_modules/pathe": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz",
+ "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==",
+ "dev": true
+ },
+ "node_modules/vitest": {
+ "version": "0.29.3",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.3.tgz",
+ "integrity": "sha512-muMsbXnZsrzDGiyqf/09BKQsGeUxxlyLeLK/sFFM4EXdURPQRv8y7dco32DXaRORYP0bvyN19C835dT23mL0ow==",
+ "dev": true,
+ "dependencies": {
+ "@types/chai": "^4.3.4",
+ "@types/chai-subset": "^1.3.3",
+ "@types/node": "*",
+ "@vitest/expect": "0.29.3",
+ "@vitest/runner": "0.29.3",
+ "@vitest/spy": "0.29.3",
+ "@vitest/utils": "0.29.3",
+ "acorn": "^8.8.1",
+ "acorn-walk": "^8.2.0",
+ "cac": "^6.7.14",
+ "chai": "^4.3.7",
+ "debug": "^4.3.4",
+ "local-pkg": "^0.4.2",
+ "pathe": "^1.1.0",
+ "picocolors": "^1.0.0",
+ "source-map": "^0.6.1",
+ "std-env": "^3.3.1",
+ "strip-literal": "^1.0.0",
+ "tinybench": "^2.3.1",
+ "tinypool": "^0.3.1",
+ "tinyspy": "^1.0.2",
+ "vite": "^3.0.0 || ^4.0.0",
+ "vite-node": "0.29.3",
+ "why-is-node-running": "^2.2.2"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": ">=v14.16.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@vitest/browser": "*",
+ "@vitest/ui": "*",
+ "happy-dom": "*",
+ "jsdom": "*"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@vitest/browser": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitest/node_modules/pathe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz",
+ "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==",
+ "dev": true
+ },
+ "node_modules/vue": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz",
+ "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==",
+ "dependencies": {
+ "@vue/compiler-dom": "3.2.47",
+ "@vue/compiler-sfc": "3.2.47",
+ "@vue/runtime-dom": "3.2.47",
+ "@vue/server-renderer": "3.2.47",
+ "@vue/shared": "3.2.47"
+ }
+ },
+ "node_modules/vue-eslint-parser": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.0.2.tgz",
+ "integrity": "sha512-uCPQwTGjOtAYrwnU+76pYxalhjsh7iFBsHwBqDHiOPTxtICDaraO4Szw54WFTNZTAEsgHHzqFOu1mmnBOBRzDA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.4",
+ "eslint-scope": "^7.1.1",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.1",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^7.3.6"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/vue-i18n": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.5.0.tgz",
+ "integrity": "sha512-NiI3Ph1qMstNf7uhYh8trQBOBFLxeJgcOxBq51pCcZ28Vs18Y7BDS58r8HGDKCYgXdLUYqPDXdKatIF4bvBVZg==",
+ "dependencies": {
+ "@intlify/core-base": "9.5.0",
+ "@intlify/shared": "9.5.0",
+ "@vue/devtools-api": "^6.5.0"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ },
+ "peerDependencies": {
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/vue-i18n/node_modules/@intlify/shared": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.5.0.tgz",
+ "integrity": "sha512-tAxV14LMXZDZbu32XzLMTsowNlgJNmLwWHYzvMUl6L8gvQeoYiZONjY7AUsqZW8TOZDX9lfvF6adPkk9FSRdDA==",
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz",
+ "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==",
+ "dependencies": {
+ "@vue/devtools-api": "^6.5.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/vue-template-compiler": {
+ "version": "2.7.14",
+ "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz",
+ "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==",
+ "dev": true,
+ "dependencies": {
+ "de-indent": "^1.0.2",
+ "he": "^1.2.0"
+ }
+ },
+ "node_modules/vue-tsc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.2.0.tgz",
+ "integrity": "sha512-rIlzqdrhyPYyLG9zxsVRa+JEseeS9s8F2BbVVVWRRsTZvJO2BbhLEb2HW3MY+DFma0378tnIqs+vfTzbcQtRFw==",
+ "dev": true,
+ "dependencies": {
+ "@volar/vue-language-core": "1.2.0",
+ "@volar/vue-typescript": "1.2.0"
+ },
+ "bin": {
+ "vue-tsc": "bin/vue-tsc.js"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ }
+ },
+ "node_modules/vue-types": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/vue-types/-/vue-types-5.1.1.tgz",
+ "integrity": "sha512-FMY/JCLWePXgGIcMDqYdJsQm1G0CDxEjq6W0+tZMJZlX37q/61eSGSIa/XFRwa9T7kkKXuxxl94/2kgxyWQqKw==",
+ "dev": true,
+ "dependencies": {
+ "is-plain-object": "5.0.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "peerDependencies": {
+ "vue": "^2.0.0 || ^3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "vue": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack-virtual-modules": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz",
+ "integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==",
+ "dev": true
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+ "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+ "dev": true,
+ "dependencies": {
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
+ "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+ "dev": true,
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/whatwg-url/node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
+ "dev": true
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/why-is-node-running": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz",
+ "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==",
+ "dev": true,
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "node_modules/xml-name-validator": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/xmlbuilder": {
+ "version": "15.1.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
+ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "node_modules/yaml": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz",
+ "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ==",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/yaml-eslint-parser": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-0.3.2.tgz",
+ "integrity": "sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^1.3.0",
+ "lodash": "^4.17.20",
+ "yaml": "^1.10.0"
+ }
+ },
+ "node_modules/yaml-eslint-parser/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/yaml-eslint-parser/node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "dev": true,
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
+ "node_modules/yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ },
+ "dependencies": {
+ "@ampproject/remapping": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+ "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@ant-design/colors": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz",
+ "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==",
+ "requires": {
+ "@ctrl/tinycolor": "^3.4.0"
+ }
+ },
+ "@ant-design/icons-svg": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz",
+ "integrity": "sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g=="
+ },
+ "@ant-design/icons-vue": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-6.1.0.tgz",
+ "integrity": "sha512-EX6bYm56V+ZrKN7+3MT/ubDkvJ5rK/O2t380WFRflDcVFgsvl3NLH7Wxeau6R8DbrO5jWR6DSTC3B6gYFp77AA==",
+ "requires": {
+ "@ant-design/colors": "^6.0.0",
+ "@ant-design/icons-svg": "^4.2.1"
+ }
+ },
+ "@antfu/install-pkg": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-0.1.1.tgz",
+ "integrity": "sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==",
+ "dev": true,
+ "requires": {
+ "execa": "^5.1.1",
+ "find-up": "^5.0.0"
+ }
+ },
+ "@antfu/utils": {
+ "version": "0.7.6",
+ "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.6.tgz",
+ "integrity": "sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==",
+ "dev": true
+ },
+ "@arco-design/color": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@arco-design/color/-/color-0.4.0.tgz",
+ "integrity": "sha512-s7p9MSwJgHeL8DwcATaXvWT3m2SigKpxx4JA1BGPHL4gfvaQsmQfrLBDpjOJFJuJ2jG2dMt3R3P8Pm9E65q18g==",
+ "dev": true,
+ "requires": {
+ "color": "^3.1.3"
+ }
+ },
+ "@arco-design/web-vue": {
+ "version": "2.52.1",
+ "resolved": "https://registry.npmjs.org/@arco-design/web-vue/-/web-vue-2.52.1.tgz",
+ "integrity": "sha512-XE9zHC2ZqYqkC+bgqljFoA+5zDOXx8bOWFDoVlO/LgEq55284C7kkPZjmIyAeurkYdDYqlbxjWaPOwJXaj3J2g==",
+ "dev": true,
+ "requires": {
+ "@arco-design/color": "^0.4.0",
+ "b-tween": "^0.3.3",
+ "b-validate": "^1.4.4",
+ "compute-scroll-into-view": "^1.0.17",
+ "dayjs": "^1.10.3",
+ "number-precision": "^1.5.0",
+ "resize-observer-polyfill": "^1.5.1",
+ "scroll-into-view-if-needed": "^2.2.28"
+ }
+ },
+ "@arco-plugins/vite-vue": {
+ "version": "1.4.5",
+ "resolved": "https://registry.npmjs.org/@arco-plugins/vite-vue/-/vite-vue-1.4.5.tgz",
+ "integrity": "sha512-2pJ9mpZP9mRD7NGZwRsZTS9C/US5ilEBBUqxN5Qgnd3Td50u9apJVKAABCZjG2K2eHiyZg7Fd9XhgHJXVJJmsw==",
+ "dev": true,
+ "requires": {
+ "@babel/generator": "^7.12.11",
+ "@babel/helper-module-imports": "^7.12.5",
+ "@babel/parser": "^7.12.11",
+ "@babel/traverse": "^7.12.12",
+ "@babel/types": "^7.12.12",
+ "@types/node": "^16.11.10"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "16.18.58",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.58.tgz",
+ "integrity": "sha512-YGncyA25/MaVtQkjWW9r0EFBukZ+JulsLcVZBlGUfIb96OBMjkoRWwQo5IEWJ8Fj06Go3GHw+bjYDitv6BaGsA==",
+ "dev": true
+ }
+ }
+ },
+ "@arco-themes/vue-am-alas": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/@arco-themes/vue-am-alas/-/vue-am-alas-0.0.1.tgz",
+ "integrity": "sha512-JCI9KZaqXXUEnQC945cwmA6rMI8GJ3YzpQK3fx3ASTvOSAOeUw0Kh/iAYref4/JhxSghMJYnrNYM1RCCL37VMw==",
+ "dev": true,
+ "requires": {}
+ },
+ "@babel/code-frame": {
+ "version": "7.22.13",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
+ "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
+ "dev": true,
+ "requires": {
+ "@babel/highlight": "^7.22.13",
+ "chalk": "^2.4.2"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "@babel/generator": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz",
+ "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.23.0",
+ "@jridgewell/gen-mapping": "^0.3.2",
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jsesc": "^2.5.1"
+ }
+ },
+ "@babel/helper-environment-visitor": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
+ "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+ "dev": true
+ },
+ "@babel/helper-function-name": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
+ "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+ "dev": true,
+ "requires": {
+ "@babel/template": "^7.22.15",
+ "@babel/types": "^7.23.0"
+ }
+ },
+ "@babel/helper-hoist-variables": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+ "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.22.5"
+ }
+ },
+ "@babel/helper-module-imports": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
+ "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.22.15"
+ }
+ },
+ "@babel/helper-split-export-declaration": {
+ "version": "7.22.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+ "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+ "dev": true,
+ "requires": {
+ "@babel/types": "^7.22.5"
+ }
+ },
+ "@babel/helper-string-parser": {
+ "version": "7.22.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+ "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
+ "dev": true
+ },
+ "@babel/helper-validator-identifier": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+ "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+ "dev": true
+ },
+ "@babel/highlight": {
+ "version": "7.22.20",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz",
+ "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "chalk": "^2.4.2",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "@babel/parser": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz",
+ "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw=="
+ },
+ "@babel/template": {
+ "version": "7.22.15",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
+ "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.22.13",
+ "@babel/parser": "^7.22.15",
+ "@babel/types": "^7.22.15"
+ }
+ },
+ "@babel/traverse": {
+ "version": "7.23.2",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz",
+ "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.22.13",
+ "@babel/generator": "^7.23.0",
+ "@babel/helper-environment-visitor": "^7.22.20",
+ "@babel/helper-function-name": "^7.23.0",
+ "@babel/helper-hoist-variables": "^7.22.5",
+ "@babel/helper-split-export-declaration": "^7.22.6",
+ "@babel/parser": "^7.23.0",
+ "@babel/types": "^7.23.0",
+ "debug": "^4.1.0",
+ "globals": "^11.1.0"
+ },
+ "dependencies": {
+ "globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "dev": true
+ }
+ }
+ },
+ "@babel/types": {
+ "version": "7.23.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz",
+ "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==",
+ "dev": true,
+ "requires": {
+ "@babel/helper-string-parser": "^7.22.5",
+ "@babel/helper-validator-identifier": "^7.22.20",
+ "to-fast-properties": "^2.0.0"
+ }
+ },
+ "@cspotcode/source-map-support": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/trace-mapping": "0.3.9"
+ },
+ "dependencies": {
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ }
+ }
+ },
+ "@ctrl/tinycolor": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz",
+ "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA=="
+ },
+ "@develar/schema-utils": {
+ "version": "2.6.5",
+ "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz",
+ "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.0",
+ "ajv-keywords": "^3.4.1"
+ }
+ },
+ "@electron/asar": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.7.tgz",
+ "integrity": "sha512-8FaSCAIiZGYFWyjeevPQt+0e9xCK9YmJ2Rjg5SXgdsXon6cRnU0Yxnbe6CvJbQn26baifur2Y2G5EBayRIsjyg==",
+ "dev": true,
+ "requires": {
+ "commander": "^5.0.0",
+ "glob": "^7.1.6",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "@electron/get": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.2.tgz",
+ "integrity": "sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.1",
+ "env-paths": "^2.2.0",
+ "fs-extra": "^8.1.0",
+ "global-agent": "^3.0.0",
+ "got": "^11.8.5",
+ "progress": "^2.0.3",
+ "semver": "^6.2.0",
+ "sumchecker": "^3.0.1"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
+ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ }
+ }
+ },
+ "@electron/notarize": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.1.0.tgz",
+ "integrity": "sha512-Q02xem1D0sg4v437xHgmBLxI2iz/fc0D4K7fiVWHa/AnW8o7D751xyKNXgziA6HrTOme9ul1JfWN5ark8WH1xA==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.1",
+ "fs-extra": "^9.0.1",
+ "promise-retry": "^2.0.1"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "requires": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@electron/osx-sign": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz",
+ "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==",
+ "dev": true,
+ "requires": {
+ "compare-version": "^0.1.2",
+ "debug": "^4.3.4",
+ "fs-extra": "^10.0.0",
+ "isbinaryfile": "^4.0.8",
+ "minimist": "^1.2.6",
+ "plist": "^3.0.5"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "isbinaryfile": {
+ "version": "4.0.10",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
+ "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==",
+ "dev": true
+ }
+ }
+ },
+ "@electron/universal": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.4.1.tgz",
+ "integrity": "sha512-lE/U3UNw1YHuowNbTmKNs9UlS3En3cPgwM5MI+agIgr/B1hSze9NdOP0qn7boZaI9Lph8IDv3/24g9IxnJP7aQ==",
+ "dev": true,
+ "requires": {
+ "@electron/asar": "^3.2.1",
+ "@malept/cross-spawn-promise": "^1.1.0",
+ "debug": "^4.3.1",
+ "dir-compare": "^3.0.0",
+ "fs-extra": "^9.0.1",
+ "minimatch": "^3.0.4",
+ "plist": "^3.0.4"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "requires": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@esbuild/android-arm": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz",
+ "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/android-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz",
+ "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/android-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz",
+ "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/darwin-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz",
+ "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/darwin-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz",
+ "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/freebsd-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz",
+ "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/freebsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz",
+ "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-arm": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz",
+ "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz",
+ "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-ia32": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz",
+ "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-loong64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz",
+ "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-mips64el": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz",
+ "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-ppc64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz",
+ "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-riscv64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz",
+ "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-s390x": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz",
+ "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/linux-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz",
+ "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/netbsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz",
+ "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/openbsd-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz",
+ "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/sunos-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz",
+ "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-arm64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz",
+ "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-ia32": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz",
+ "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==",
+ "dev": true,
+ "optional": true
+ },
+ "@esbuild/win32-x64": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz",
+ "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==",
+ "dev": true,
+ "optional": true
+ },
+ "@eslint-community/eslint-utils": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz",
+ "integrity": "sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
+ "@eslint-community/regexpp": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz",
+ "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==",
+ "dev": true
+ },
+ "@eslint/eslintrc": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz",
+ "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.5.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ }
+ },
+ "@eslint/js": {
+ "version": "8.36.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz",
+ "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==",
+ "dev": true
+ },
+ "@humanwhocodes/config-array": {
+ "version": "0.11.8",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz",
+ "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==",
+ "dev": true,
+ "requires": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ }
+ },
+ "@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true
+ },
+ "@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "@iconify/types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
+ "dev": true
+ },
+ "@iconify/utils": {
+ "version": "2.1.11",
+ "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-2.1.11.tgz",
+ "integrity": "sha512-M/w3PkN8zQYXi8N6qK/KhnYMfEbbb6Sk8RZVn8g+Pmmu5ybw177RpsaGwpziyHeUsu4etrexYSWq3rwnIqzYCg==",
+ "dev": true,
+ "requires": {
+ "@antfu/install-pkg": "^0.1.1",
+ "@antfu/utils": "^0.7.5",
+ "@iconify/types": "^2.0.0",
+ "debug": "^4.3.4",
+ "kolorist": "^1.8.0",
+ "local-pkg": "^0.4.3"
+ }
+ },
+ "@intlify/bundle-utils": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/@intlify/bundle-utils/-/bundle-utils-5.5.0.tgz",
+ "integrity": "sha512-k5xe8oAoPXiH6unXvyyyCRbq+LtLn1tSi/6r5f6mF+MsX7mcOMtgYbyAQINsjFrf7EDu5Pg4BY00VWSt8bI9XQ==",
+ "dev": true,
+ "requires": {
+ "@intlify/message-compiler": "9.3.0-beta.17",
+ "@intlify/shared": "9.3.0-beta.17",
+ "acorn": "^8.8.2",
+ "escodegen": "^2.0.0",
+ "estree-walker": "^2.0.2",
+ "jsonc-eslint-parser": "^1.0.1",
+ "magic-string": "^0.30.0",
+ "source-map": "0.6.1",
+ "yaml-eslint-parser": "^0.3.2"
+ },
+ "dependencies": {
+ "magic-string": {
+ "version": "0.30.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
+ "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ }
+ }
+ }
+ },
+ "@intlify/core-base": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.5.0.tgz",
+ "integrity": "sha512-y3ufM1RJbI/DSmJf3lYs9ACq3S/iRvaSsE3rPIk0MGH7fp+JxU6rdryv/EYcwfcr3Y1aHFlCBir6S391hRZ57w==",
+ "requires": {
+ "@intlify/message-compiler": "9.5.0",
+ "@intlify/shared": "9.5.0"
+ },
+ "dependencies": {
+ "@intlify/message-compiler": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.5.0.tgz",
+ "integrity": "sha512-CAhVNfEZcOVFg0/5MNyt+OFjvs4J/ARjCj2b+54/FvFP0EDJI5lIqMTSDBE7k0atMROSP0SvWCkwu/AZ5xkK1g==",
+ "requires": {
+ "@intlify/shared": "9.5.0",
+ "source-map-js": "^1.0.2"
+ }
+ },
+ "@intlify/shared": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.5.0.tgz",
+ "integrity": "sha512-tAxV14LMXZDZbu32XzLMTsowNlgJNmLwWHYzvMUl6L8gvQeoYiZONjY7AUsqZW8TOZDX9lfvF6adPkk9FSRdDA=="
+ }
+ }
+ },
+ "@intlify/message-compiler": {
+ "version": "9.3.0-beta.17",
+ "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.3.0-beta.17.tgz",
+ "integrity": "sha512-i7hvVIRk1Ax2uKa9xLRJCT57to08OhFMhFXXjWN07rmx5pWQYQ23MfX1xgggv9drnWTNhqEiD+u4EJeHoS5+Ww==",
+ "dev": true,
+ "requires": {
+ "@intlify/shared": "9.3.0-beta.17",
+ "source-map": "0.6.1"
+ }
+ },
+ "@intlify/shared": {
+ "version": "9.3.0-beta.17",
+ "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.3.0-beta.17.tgz",
+ "integrity": "sha512-mscf7RQsUTOil35jTij4KGW1RC9SWQjYScwLxP53Ns6g24iEd5HN7ksbt9O6FvTmlQuX77u+MXpBdfJsGqizLQ==",
+ "dev": true
+ },
+ "@intlify/unplugin-vue-i18n": {
+ "version": "0.10.1",
+ "resolved": "https://registry.npmjs.org/@intlify/unplugin-vue-i18n/-/unplugin-vue-i18n-0.10.1.tgz",
+ "integrity": "sha512-9ZzE0ddlDO06Xzg25JPiNbx6PJPDho5k/Np+uL9fJRZEKq2TxT3c+ZK+Pec6j0ybhhVXeda8/yE3tPUf4SOXZQ==",
+ "dev": true,
+ "requires": {
+ "@intlify/bundle-utils": "^5.4.0",
+ "@intlify/shared": "9.3.0-beta.17",
+ "@rollup/pluginutils": "^5.0.2",
+ "@vue/compiler-sfc": "^3.2.47",
+ "debug": "^4.3.3",
+ "fast-glob": "^3.2.12",
+ "js-yaml": "^4.1.0",
+ "json5": "^2.2.3",
+ "pathe": "^1.0.0",
+ "picocolors": "^1.0.0",
+ "source-map": "0.6.1",
+ "unplugin": "^1.1.0"
+ },
+ "dependencies": {
+ "pathe": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz",
+ "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==",
+ "dev": true
+ },
+ "unplugin": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.0.tgz",
+ "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.10.0",
+ "chokidar": "^3.5.3",
+ "webpack-sources": "^3.2.3",
+ "webpack-virtual-modules": "^0.5.0"
+ }
+ },
+ "webpack-virtual-modules": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
+ "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
+ "dev": true
+ }
+ }
+ },
+ "@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "@jridgewell/resolve-uri": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+ "dev": true
+ },
+ "@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true
+ },
+ "@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true
+ },
+ "@jridgewell/trace-mapping": {
+ "version": "0.3.20",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz",
+ "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "@malept/cross-spawn-promise": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz",
+ "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.1"
+ }
+ },
+ "@malept/flatpak-bundler": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@malept/flatpak-bundler/-/flatpak-bundler-0.4.0.tgz",
+ "integrity": "sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.1",
+ "fs-extra": "^9.0.0",
+ "lodash": "^4.17.15",
+ "tmp-promise": "^3.0.2"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
+ "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+ "dev": true,
+ "requires": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ }
+ }
+ },
+ "@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "requires": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ }
+ },
+ "@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
+ },
+ "@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "requires": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ }
+ },
+ "@polka/url": {
+ "version": "1.0.0-next.23",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.23.tgz",
+ "integrity": "sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==",
+ "dev": true
+ },
+ "@rollup/pluginutils": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.5.tgz",
+ "integrity": "sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==",
+ "dev": true,
+ "requires": {
+ "@types/estree": "^1.0.0",
+ "estree-walker": "^2.0.2",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "@sindresorhus/is": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
+ "dev": true
+ },
+ "@szmarczak/http-timer": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
+ "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
+ "dev": true,
+ "requires": {
+ "defer-to-connect": "^2.0.0"
+ }
+ },
+ "@tootallnate/once": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+ "dev": true
+ },
+ "@tsconfig/node10": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
+ "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
+ "dev": true
+ },
+ "@tsconfig/node12": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+ "dev": true
+ },
+ "@tsconfig/node14": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+ "dev": true
+ },
+ "@tsconfig/node16": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+ "dev": true
+ },
+ "@types/cacheable-request": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
+ "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
+ "dev": true,
+ "requires": {
+ "@types/http-cache-semantics": "*",
+ "@types/keyv": "^3.1.4",
+ "@types/node": "*",
+ "@types/responselike": "^1.0.0"
+ }
+ },
+ "@types/chai": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz",
+ "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==",
+ "dev": true
+ },
+ "@types/chai-subset": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz",
+ "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "*"
+ }
+ },
+ "@types/debug": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.10.tgz",
+ "integrity": "sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==",
+ "dev": true,
+ "requires": {
+ "@types/ms": "*"
+ }
+ },
+ "@types/eslint": {
+ "version": "8.44.5",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.5.tgz",
+ "integrity": "sha512-Ol2eio8LtD/tGM4Ga7Jb83NuFwEv3NqvssSlifXL9xuFpSyQZw0ecmm2Kux6iU0KxQmp95hlPmGCzGJ0TCFeRA==",
+ "dev": true,
+ "requires": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "@types/estree": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz",
+ "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==",
+ "dev": true
+ },
+ "@types/fs-extra": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.2.tgz",
+ "integrity": "sha512-c0hrgAOVYr21EX8J0jBMXGLMgJqVf/v6yxi0dLaJboW9aQPh16Id+z6w2Tx1hm+piJOLv8xPfVKZCLfjPw/IMQ==",
+ "dev": true,
+ "requires": {
+ "@types/jsonfile": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/http-cache-semantics": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz",
+ "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==",
+ "dev": true
+ },
+ "@types/json-schema": {
+ "version": "7.0.11",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz",
+ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==",
+ "dev": true
+ },
+ "@types/jsonfile": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.2.tgz",
+ "integrity": "sha512-8t92P+oeW4d/CRQfJaSqEwXujrhH4OEeHRjGU3v1Q8mUS8GPF3yiX26sw4svv6faL2HfBtGTe2xWIoVgN3dy9w==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/keyv": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
+ "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/lodash": {
+ "version": "4.14.200",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.200.tgz",
+ "integrity": "sha512-YI/M/4HRImtNf3pJgbF+W6FrXovqj+T+/HpENLTooK9PnkacBsDpeP3IpHab40CClUfhNmdM2WTNP2sa2dni5Q==",
+ "dev": true
+ },
+ "@types/lodash-es": {
+ "version": "4.17.10",
+ "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.10.tgz",
+ "integrity": "sha512-YJP+w/2khSBwbUSFdGsSqmDvmnN3cCKoPOL7Zjle6s30ZtemkkqhjVfFqGwPN7ASil5VyjE2GtyU/yqYY6mC0A==",
+ "dev": true,
+ "requires": {
+ "@types/lodash": "*"
+ }
+ },
+ "@types/ms": {
+ "version": "0.7.32",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.32.tgz",
+ "integrity": "sha512-xPSg0jm4mqgEkNhowKgZFBNtwoEwF6gJ4Dhww+GFpm3IgtNseHQZ5IqdNwnquZEoANxyDAKDRAdVo4Z72VvD/g==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "18.15.3",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz",
+ "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==",
+ "dev": true
+ },
+ "@types/plist": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.3.tgz",
+ "integrity": "sha512-DXkBoKc7jwUR0p439icInmXXMJNhoImdpOrrgA5/nDFK7LVtcJ9MyQNKhJEKpEztnHGWnNWMWLOIR62By0Ln0A==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "@types/node": "*",
+ "xmlbuilder": ">=11.0.1"
+ }
+ },
+ "@types/prettier": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz",
+ "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==",
+ "dev": true
+ },
+ "@types/responselike": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz",
+ "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/semver": {
+ "version": "7.3.12",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.12.tgz",
+ "integrity": "sha512-WwA1MW0++RfXmCr12xeYOOC5baSC9mSb0ZqCquFzKhcoF4TvHu5MKOuXsncgZcpVFhB1pXd5hZmM0ryAoCp12A=="
+ },
+ "@types/verror": {
+ "version": "1.10.7",
+ "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.7.tgz",
+ "integrity": "sha512-4c5F4T0qMSoXq1KHx7WV1FMuD2h0xdaFoJ7HSVWUfQ8w5YbqCwLOA8K7/yy1I+Txuzvm417dnPUaLmqazX1F7g==",
+ "dev": true,
+ "optional": true
+ },
+ "@types/web-bluetooth": {
+ "version": "0.0.18",
+ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.18.tgz",
+ "integrity": "sha512-v/ZHEj9xh82usl8LMR3GarzFY1IrbXJw5L4QfQhokjRV91q+SelFqxQWSep1ucXEZ22+dSTwLFkXeur25sPIbw=="
+ },
+ "@types/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@typescript-eslint/eslint-plugin": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.55.0.tgz",
+ "integrity": "sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==",
+ "dev": true,
+ "requires": {
+ "@eslint-community/regexpp": "^4.4.0",
+ "@typescript-eslint/scope-manager": "5.55.0",
+ "@typescript-eslint/type-utils": "5.55.0",
+ "@typescript-eslint/utils": "5.55.0",
+ "debug": "^4.3.4",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "natural-compare-lite": "^1.4.0",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "dependencies": {
+ "@typescript-eslint/scope-manager": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz",
+ "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.55.0",
+ "@typescript-eslint/visitor-keys": "5.55.0"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz",
+ "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==",
+ "dev": true
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz",
+ "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.55.0",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ }
+ }
+ },
+ "@typescript-eslint/parser": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz",
+ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "debug": "^4.3.4"
+ }
+ },
+ "@typescript-eslint/scope-manager": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
+ "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0"
+ }
+ },
+ "@typescript-eslint/type-utils": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.55.0.tgz",
+ "integrity": "sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/typescript-estree": "5.55.0",
+ "@typescript-eslint/utils": "5.55.0",
+ "debug": "^4.3.4",
+ "tsutils": "^3.21.0"
+ },
+ "dependencies": {
+ "@typescript-eslint/types": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz",
+ "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz",
+ "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.55.0",
+ "@typescript-eslint/visitor-keys": "5.55.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz",
+ "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.55.0",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ }
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz",
+ "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
+ "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/utils": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.55.0.tgz",
+ "integrity": "sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==",
+ "dev": true,
+ "requires": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.55.0",
+ "@typescript-eslint/types": "5.55.0",
+ "@typescript-eslint/typescript-estree": "5.55.0",
+ "eslint-scope": "^5.1.1",
+ "semver": "^7.3.7"
+ },
+ "dependencies": {
+ "@typescript-eslint/scope-manager": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz",
+ "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.55.0",
+ "@typescript-eslint/visitor-keys": "5.55.0"
+ }
+ },
+ "@typescript-eslint/types": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz",
+ "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==",
+ "dev": true
+ },
+ "@typescript-eslint/typescript-estree": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz",
+ "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.55.0",
+ "@typescript-eslint/visitor-keys": "5.55.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "5.55.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz",
+ "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.55.0",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ }
+ }
+ },
+ "@typescript-eslint/visitor-keys": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
+ "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
+ "dev": true,
+ "requires": {
+ "@typescript-eslint/types": "5.62.0",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
+ "@unocss/astro": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/astro/-/astro-0.51.13.tgz",
+ "integrity": "sha512-Dul0ZJNwseGBxngBMfghfTsf0quf4HcQcqJuIDzA1T+ueavpwf4QScwbDuS0BqFO4ZiIVSItA7f6eLe31PHUmw==",
+ "dev": true,
+ "requires": {
+ "@unocss/core": "0.51.13",
+ "@unocss/reset": "0.51.13",
+ "@unocss/vite": "0.51.13"
+ }
+ },
+ "@unocss/cli": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/cli/-/cli-0.51.13.tgz",
+ "integrity": "sha512-g5CmSVyMFIgw/uStVlABldw+EYsrCyGjHd9jQMMTSZbV9IWuM0Tf+ILAZ+B4iXs62ctnrxPYH3Mha6IIuuZXZg==",
+ "dev": true,
+ "requires": {
+ "@ampproject/remapping": "^2.2.1",
+ "@rollup/pluginutils": "^5.0.2",
+ "@unocss/config": "0.51.13",
+ "@unocss/core": "0.51.13",
+ "@unocss/preset-uno": "0.51.13",
+ "cac": "^6.7.14",
+ "chokidar": "^3.5.3",
+ "colorette": "^2.0.20",
+ "consola": "^3.1.0",
+ "fast-glob": "^3.2.12",
+ "magic-string": "^0.30.0",
+ "pathe": "^1.1.0",
+ "perfect-debounce": "^1.0.0"
+ },
+ "dependencies": {
+ "magic-string": {
+ "version": "0.30.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
+ "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ }
+ },
+ "pathe": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz",
+ "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==",
+ "dev": true
+ }
+ }
+ },
+ "@unocss/config": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/config/-/config-0.51.13.tgz",
+ "integrity": "sha512-EnSLt7Z1C01U3kORh+Iql+zLFm/PQTD1Np6oEW6U0/GTmD3HEilVFQFFxdM5F0X2bBZtZMkkAGGyhRWQj09hDQ==",
+ "dev": true,
+ "requires": {
+ "@unocss/core": "0.51.13",
+ "unconfig": "^0.3.7"
+ }
+ },
+ "@unocss/core": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/core/-/core-0.51.13.tgz",
+ "integrity": "sha512-SclWkqY2c+p5+PiqrbQkhJNEExPdeo71/aGFye10tpBkgPJWd5xC7dhg5F8M4VPNBtuNCrvBWyqNnunMyuz/WQ==",
+ "dev": true
+ },
+ "@unocss/extractor-arbitrary-variants": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/extractor-arbitrary-variants/-/extractor-arbitrary-variants-0.51.13.tgz",
+ "integrity": "sha512-lF7p0ea/MeNf4IsjzNhRNYP8u+f1h5JjhTzcvFpQo/vpBvuM5ZCyqp4mkXxYnLNLFfTLsc+MxXaU34IXxpw1QA==",
+ "dev": true,
+ "requires": {
+ "@unocss/core": "0.51.13"
+ }
+ },
+ "@unocss/inspector": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/inspector/-/inspector-0.51.13.tgz",
+ "integrity": "sha512-y6wCvLDmfFHfr5MHqcQLZkwRio4+VEH6j607bgUdKTRlZGVCD7/GBV8lperxsxpkspaE1eykOeDmW7Ms99SEuQ==",
+ "dev": true,
+ "requires": {
+ "gzip-size": "^6.0.0",
+ "sirv": "^2.0.3"
+ }
+ },
+ "@unocss/postcss": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/postcss/-/postcss-0.51.13.tgz",
+ "integrity": "sha512-V1QJ7md9jYtBwRc6NGep1Atc+QhaR3115B1wCo8CNM+v+ZOQzpxNsAshvOfyPzfzTj+KLtp4u4zqqaTbYGX2cw==",
+ "dev": true,
+ "requires": {
+ "@unocss/config": "0.51.13",
+ "@unocss/core": "0.51.13",
+ "css-tree": "^2.3.1",
+ "fast-glob": "^3.2.12",
+ "magic-string": "^0.30.0",
+ "postcss": "^8.4.23"
+ },
+ "dependencies": {
+ "magic-string": {
+ "version": "0.30.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
+ "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ }
+ }
+ }
+ },
+ "@unocss/preset-attributify": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/preset-attributify/-/preset-attributify-0.51.13.tgz",
+ "integrity": "sha512-a501ylamV90E+tVf7Dgc8Plwex5LQ5oFSYwsxk06QhcxPWdLmDey3SQjL68AsP9qnLGfIez51sV4y/6H8wFqlw==",
+ "dev": true,
+ "requires": {
+ "@unocss/core": "0.51.13"
+ }
+ },
+ "@unocss/preset-icons": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/preset-icons/-/preset-icons-0.51.13.tgz",
+ "integrity": "sha512-iL9s1NUVeWe3WSh5LHn7vy+veCAag9AFA50IfNlHuAARhuI8JtrMQA8dOXrWrzM0zWBMB+BVIkVaMVrF257n+Q==",
+ "dev": true,
+ "requires": {
+ "@iconify/utils": "^2.1.5",
+ "@unocss/core": "0.51.13",
+ "ofetch": "^1.0.1"
+ }
+ },
+ "@unocss/preset-mini": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/preset-mini/-/preset-mini-0.51.13.tgz",
+ "integrity": "sha512-Wa6eMq8IiJEb7F8rL+cDX4XFm4ViAULaAvn8rjk7ANGdOmeqYGyGc0IZkOjQgl3PiFJFnitsBluHhg7nMIk7QQ==",
+ "dev": true,
+ "requires": {
+ "@unocss/core": "0.51.13",
+ "@unocss/extractor-arbitrary-variants": "0.51.13"
+ }
+ },
+ "@unocss/preset-tagify": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/preset-tagify/-/preset-tagify-0.51.13.tgz",
+ "integrity": "sha512-9pWPTff/1OKFmOQiGolVKFPzXwJ+r77UhXTB5E793uOQFHPMWCdkjyTPiN12FlB9izjTLIFH3GCGy/koRX9S4w==",
+ "dev": true,
+ "requires": {
+ "@unocss/core": "0.51.13"
+ }
+ },
+ "@unocss/preset-typography": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/preset-typography/-/preset-typography-0.51.13.tgz",
+ "integrity": "sha512-9uXrPztLsc8ZMnmoIdNAC3/gD183wyFECDzXtJqjOrJhzGr1kcv1sByyQO+kRPI67eWErSsDjpJwK2arfDOihQ==",
+ "dev": true,
+ "requires": {
+ "@unocss/core": "0.51.13",
+ "@unocss/preset-mini": "0.51.13"
+ }
+ },
+ "@unocss/preset-uno": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/preset-uno/-/preset-uno-0.51.13.tgz",
+ "integrity": "sha512-S9po93y87YphySfW21+Z5uzSL/GAGN5MqZURQxaGk9WGxYugAnu2PnvhhyqLCVmP05J34tMSDMkIZZqjnGaJzg==",
+ "dev": true,
+ "requires": {
+ "@unocss/core": "0.51.13",
+ "@unocss/preset-mini": "0.51.13",
+ "@unocss/preset-wind": "0.51.13"
+ }
+ },
+ "@unocss/preset-web-fonts": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/preset-web-fonts/-/preset-web-fonts-0.51.13.tgz",
+ "integrity": "sha512-jl6AhPcnLYN4oKYQZbU/40714IIuNb7TOFh2kgMkDH70r+fzLEdH+cB4l5m0yTsMhEQ6oDsppxm9aXcsVDRESA==",
+ "dev": true,
+ "requires": {
+ "@unocss/core": "0.51.13",
+ "ofetch": "^1.0.1"
+ }
+ },
+ "@unocss/preset-wind": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/preset-wind/-/preset-wind-0.51.13.tgz",
+ "integrity": "sha512-deRXLOWmKmqCJuohWCE5NUzs7XDJLn4pzgYQSUlEAVUfS6rzL49aJmSHA+p/f+HhJs5jipNdvkcrHYEBMNV1XQ==",
+ "dev": true,
+ "requires": {
+ "@unocss/core": "0.51.13",
+ "@unocss/preset-mini": "0.51.13"
+ }
+ },
+ "@unocss/reset": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/reset/-/reset-0.51.13.tgz",
+ "integrity": "sha512-xwYJW6vNbHIpBtlFcW93fZxILZpWatcCc9nclSgsl0YlFUz9w4/aoV9KqwU62Y4VUteJxCZCCXa3pSiPO8h5KA==",
+ "dev": true
+ },
+ "@unocss/scope": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/scope/-/scope-0.51.13.tgz",
+ "integrity": "sha512-ATwgDx1qZflR2/EPsAs/XMR9/HdcUNyAZ6VdenwQQdlmAFlIWZQ6smswKyuiJWKtcJynfbdGOWcO3vcocrnSrQ==",
+ "dev": true
+ },
+ "@unocss/transformer-attributify-jsx": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx/-/transformer-attributify-jsx-0.51.13.tgz",
+ "integrity": "sha512-vLAtT0K3Rfa3Xiu3LhU4tNCptuO3QlbgSsVO93K3onujfO7qZAaXjK5nj7jiLPyTKtQyl/3WOgNStfReMleF0w==",
+ "dev": true,
+ "requires": {
+ "@unocss/core": "0.51.13"
+ }
+ },
+ "@unocss/transformer-attributify-jsx-babel": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/transformer-attributify-jsx-babel/-/transformer-attributify-jsx-babel-0.51.13.tgz",
+ "integrity": "sha512-HMEeTi3FIuI5gMJnRICbWdDmraL4NfpjSTjSmAo6EsraBuNO2m+/5JZL5Fc1B3olKes2G84FDSlzfofHyinWzw==",
+ "dev": true,
+ "requires": {
+ "@unocss/core": "0.51.13"
+ }
+ },
+ "@unocss/transformer-compile-class": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/transformer-compile-class/-/transformer-compile-class-0.51.13.tgz",
+ "integrity": "sha512-7G5ReCIkrZOAikwM9LN74nR4uxffJMSDAbLFDyhdh4qaumJFaxDLDQ4lxpQVZVeXQIF12QSxsnJuI9Fu1nuqmg==",
+ "dev": true,
+ "requires": {
+ "@unocss/core": "0.51.13"
+ }
+ },
+ "@unocss/transformer-directives": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/transformer-directives/-/transformer-directives-0.51.13.tgz",
+ "integrity": "sha512-1tl8UcVpqYaKkj1zan/QmUAslEcHe9WdN0/QX3Ao663A5r91EwWhnhwKFfvujrZp1XlFnXgKLmKS8OwTRQfCQg==",
+ "dev": true,
+ "requires": {
+ "@unocss/core": "0.51.13",
+ "css-tree": "^2.3.1"
+ }
+ },
+ "@unocss/transformer-variant-group": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/transformer-variant-group/-/transformer-variant-group-0.51.13.tgz",
+ "integrity": "sha512-QT3dfnYeht9SpqPFHJrEfZjL+XeMyi0Wwc4ll4ttIQNCl1Ihiwxl4ScRs1oVXlhCAc3hCXNu9V/FWO0cYHRt/Q==",
+ "dev": true,
+ "requires": {
+ "@unocss/core": "0.51.13"
+ }
+ },
+ "@unocss/vite": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/@unocss/vite/-/vite-0.51.13.tgz",
+ "integrity": "sha512-WwyaPnu1XfRiFy4uxXwBuWaL7J1Rcaetsw5lJQUIUdSBTblsd6W7sW+MYTsLfAlA9FUxWDK4ESdI51Xgq4glxw==",
+ "dev": true,
+ "requires": {
+ "@ampproject/remapping": "^2.2.1",
+ "@rollup/pluginutils": "^5.0.2",
+ "@unocss/config": "0.51.13",
+ "@unocss/core": "0.51.13",
+ "@unocss/inspector": "0.51.13",
+ "@unocss/scope": "0.51.13",
+ "@unocss/transformer-directives": "0.51.13",
+ "chokidar": "^3.5.3",
+ "fast-glob": "^3.2.12",
+ "magic-string": "^0.30.0"
+ },
+ "dependencies": {
+ "magic-string": {
+ "version": "0.30.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
+ "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ }
+ }
+ }
+ },
+ "@vitejs/plugin-vue": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz",
+ "integrity": "sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==",
+ "dev": true,
+ "requires": {}
+ },
+ "@vitest/expect": {
+ "version": "0.29.3",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.29.3.tgz",
+ "integrity": "sha512-z/0JqBqqrdtrT/wzxNrWC76EpkOHdl+SvuNGxWulLaoluygntYyG5wJul5u/rQs5875zfFz/F+JaDf90SkLUIg==",
+ "dev": true,
+ "requires": {
+ "@vitest/spy": "0.29.3",
+ "@vitest/utils": "0.29.3",
+ "chai": "^4.3.7"
+ }
+ },
+ "@vitest/runner": {
+ "version": "0.29.3",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.29.3.tgz",
+ "integrity": "sha512-XLi8ctbvOWhUWmuvBUSIBf8POEDH4zCh6bOuVxm/KGfARpgmVF1ku+vVNvyq85va+7qXxtl+MFmzyXQ2xzhAvw==",
+ "dev": true,
+ "requires": {
+ "@vitest/utils": "0.29.3",
+ "p-limit": "^4.0.0",
+ "pathe": "^1.1.0"
+ },
+ "dependencies": {
+ "p-limit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "^1.0.0"
+ }
+ },
+ "pathe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz",
+ "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==",
+ "dev": true
+ },
+ "yocto-queue": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz",
+ "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==",
+ "dev": true
+ }
+ }
+ },
+ "@vitest/spy": {
+ "version": "0.29.3",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.29.3.tgz",
+ "integrity": "sha512-LLpCb1oOCOZcBm0/Oxbr1DQTuKLRBsSIHyLYof7z4QVE8/v8NcZKdORjMUq645fcfX55+nLXwU/1AQ+c2rND+w==",
+ "dev": true,
+ "requires": {
+ "tinyspy": "^1.0.2"
+ }
+ },
+ "@vitest/utils": {
+ "version": "0.29.3",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.29.3.tgz",
+ "integrity": "sha512-hg4Ff8AM1GtUnLpUJlNMxrf9f4lZr/xRJjh3uJ0QFP+vjaW82HAxKrmeBmLnhc8Os2eRf+f+VBu4ts7TafPPkA==",
+ "dev": true,
+ "requires": {
+ "cli-truncate": "^3.1.0",
+ "diff": "^5.1.0",
+ "loupe": "^2.3.6",
+ "pretty-format": "^27.5.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
+ "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true
+ },
+ "cli-truncate": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz",
+ "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==",
+ "dev": true,
+ "requires": {
+ "slice-ansi": "^5.0.0",
+ "string-width": "^5.0.0"
+ }
+ },
+ "emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz",
+ "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz",
+ "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^6.0.0",
+ "is-fullwidth-code-point": "^4.0.0"
+ }
+ },
+ "string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "requires": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz",
+ "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^6.0.1"
+ }
+ }
+ }
+ },
+ "@volar/language-core": {
+ "version": "1.3.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.3.0-alpha.0.tgz",
+ "integrity": "sha512-W3uMzecHPcbwddPu4SJpUcPakRBK/y/BP+U0U6NiPpUX1tONLC4yCawt+QBJqtgJ+sfD6ztf5PyvPL3hQRqfOA==",
+ "dev": true,
+ "requires": {
+ "@volar/source-map": "1.3.0-alpha.0"
+ }
+ },
+ "@volar/source-map": {
+ "version": "1.3.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.3.0-alpha.0.tgz",
+ "integrity": "sha512-jSdizxWFvDTvkPYZnO6ew3sBZUnS0abKCbuopkc0JrIlFbznWC/fPH3iPFIMS8/IIkRxq1Jh9VVG60SmtsdaMQ==",
+ "dev": true,
+ "requires": {
+ "muggle-string": "^0.2.2"
+ }
+ },
+ "@volar/typescript": {
+ "version": "1.3.0-alpha.0",
+ "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.3.0-alpha.0.tgz",
+ "integrity": "sha512-5UItyW2cdH2mBLu4RrECRNJRgtvvzKrSCn2y3v/D61QwIDkGx4aeil6x8RFuUL5TFtV6QvVHXnsOHxNgd+sCow==",
+ "dev": true,
+ "requires": {
+ "@volar/language-core": "1.3.0-alpha.0"
+ }
+ },
+ "@volar/vue-language-core": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.2.0.tgz",
+ "integrity": "sha512-w7yEiaITh2WzKe6u8ZdeLKCUz43wdmY/OqAmsB/PGDvvhTcVhCJ6f0W/RprZL1IhqH8wALoWiwEh/Wer7ZviMQ==",
+ "dev": true,
+ "requires": {
+ "@volar/language-core": "1.3.0-alpha.0",
+ "@volar/source-map": "1.3.0-alpha.0",
+ "@vue/compiler-dom": "^3.2.47",
+ "@vue/compiler-sfc": "^3.2.47",
+ "@vue/reactivity": "^3.2.47",
+ "@vue/shared": "^3.2.47",
+ "minimatch": "^6.1.6",
+ "muggle-string": "^0.2.2",
+ "vue-template-compiler": "^2.7.14"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-6.2.0.tgz",
+ "integrity": "sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ }
+ }
+ },
+ "@volar/vue-typescript": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.2.0.tgz",
+ "integrity": "sha512-zjmRi9y3J1EkG+pfuHp8IbHmibihrKK485cfzsHjiuvJMGrpkWvlO5WVEk8oslMxxeGC5XwBFE9AOlvh378EPA==",
+ "dev": true,
+ "requires": {
+ "@volar/typescript": "1.3.0-alpha.0",
+ "@volar/vue-language-core": "1.2.0"
+ }
+ },
+ "@vue/compiler-core": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.47.tgz",
+ "integrity": "sha512-p4D7FDnQb7+YJmO2iPEv0SQNeNzcbHdGByJDsT4lynf63AFkOTFN07HsiRSvjGo0QrxR/o3d0hUyNCUnBU2Tig==",
+ "requires": {
+ "@babel/parser": "^7.16.4",
+ "@vue/shared": "3.2.47",
+ "estree-walker": "^2.0.2",
+ "source-map": "^0.6.1"
+ }
+ },
+ "@vue/compiler-dom": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.47.tgz",
+ "integrity": "sha512-dBBnEHEPoftUiS03a4ggEig74J2YBZ2UIeyfpcRM2tavgMWo4bsEfgCGsu+uJIL/vax9S+JztH8NmQerUo7shQ==",
+ "requires": {
+ "@vue/compiler-core": "3.2.47",
+ "@vue/shared": "3.2.47"
+ }
+ },
+ "@vue/compiler-sfc": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.47.tgz",
+ "integrity": "sha512-rog05W+2IFfxjMcFw10tM9+f7i/+FFpZJJ5XHX72NP9eC2uRD+42M3pYcQqDXVYoj74kHMSEdQ/WmCjt8JFksQ==",
+ "requires": {
+ "@babel/parser": "^7.16.4",
+ "@vue/compiler-core": "3.2.47",
+ "@vue/compiler-dom": "3.2.47",
+ "@vue/compiler-ssr": "3.2.47",
+ "@vue/reactivity-transform": "3.2.47",
+ "@vue/shared": "3.2.47",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.25.7",
+ "postcss": "^8.1.10",
+ "source-map": "^0.6.1"
+ }
+ },
+ "@vue/compiler-ssr": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.47.tgz",
+ "integrity": "sha512-wVXC+gszhulcMD8wpxMsqSOpvDZ6xKXSVWkf50Guf/S+28hTAXPDYRTbLQ3EDkOP5Xz/+SY37YiwDquKbJOgZw==",
+ "requires": {
+ "@vue/compiler-dom": "3.2.47",
+ "@vue/shared": "3.2.47"
+ }
+ },
+ "@vue/devtools-api": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz",
+ "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA=="
+ },
+ "@vue/reactivity": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.47.tgz",
+ "integrity": "sha512-7khqQ/75oyyg+N/e+iwV6lpy1f5wq759NdlS1fpAhFXa8VeAIKGgk2E/C4VF59lx5b+Ezs5fpp/5WsRYXQiKxQ==",
+ "requires": {
+ "@vue/shared": "3.2.47"
+ }
+ },
+ "@vue/reactivity-transform": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.47.tgz",
+ "integrity": "sha512-m8lGXw8rdnPVVIdIFhf0LeQ/ixyHkH5plYuS83yop5n7ggVJU+z5v0zecwEnX7fa7HNLBhh2qngJJkxpwEEmYA==",
+ "requires": {
+ "@babel/parser": "^7.16.4",
+ "@vue/compiler-core": "3.2.47",
+ "@vue/shared": "3.2.47",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.25.7"
+ }
+ },
+ "@vue/runtime-core": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.47.tgz",
+ "integrity": "sha512-RZxbLQIRB/K0ev0K9FXhNbBzT32H9iRtYbaXb0ZIz2usLms/D55dJR2t6cIEUn6vyhS3ALNvNthI+Q95C+NOpA==",
+ "requires": {
+ "@vue/reactivity": "3.2.47",
+ "@vue/shared": "3.2.47"
+ }
+ },
+ "@vue/runtime-dom": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.47.tgz",
+ "integrity": "sha512-ArXrFTjS6TsDei4qwNvgrdmHtD930KgSKGhS5M+j8QxXrDJYLqYw4RRcDy1bz1m1wMmb6j+zGLifdVHtkXA7gA==",
+ "requires": {
+ "@vue/runtime-core": "3.2.47",
+ "@vue/shared": "3.2.47",
+ "csstype": "^2.6.8"
+ }
+ },
+ "@vue/server-renderer": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.47.tgz",
+ "integrity": "sha512-dN9gc1i8EvmP9RCzvneONXsKfBRgqFeFZLurmHOveL7oH6HiFXJw5OGu294n1nHc/HMgTy6LulU/tv5/A7f/LA==",
+ "requires": {
+ "@vue/compiler-ssr": "3.2.47",
+ "@vue/shared": "3.2.47"
+ }
+ },
+ "@vue/shared": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.47.tgz",
+ "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ=="
+ },
+ "@vue/test-utils": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/@vue/test-utils/-/test-utils-2.3.1.tgz",
+ "integrity": "sha512-tRtHRPEETQSUrqXgAewNZHm5iypxDFxwenfdcvMRm1kbGo4bcqHb1XHHlsaIjoDbLkuE2NYiF8vBQDNYrzlrSA==",
+ "dev": true,
+ "requires": {
+ "@vue/compiler-dom": "^3.0.1",
+ "@vue/server-renderer": "^3.0.1",
+ "js-beautify": "1.14.6"
+ }
+ },
+ "@vueuse/core": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.5.0.tgz",
+ "integrity": "sha512-z/tI2eSvxwLRjOhDm0h/SXAjNm8N5ld6/SC/JQs6o6kpJ6Ya50LnEL8g5hoYu005i28L0zqB5L5yAl8Jl26K3A==",
+ "requires": {
+ "@types/web-bluetooth": "^0.0.18",
+ "@vueuse/metadata": "10.5.0",
+ "@vueuse/shared": "10.5.0",
+ "vue-demi": ">=0.14.6"
+ },
+ "dependencies": {
+ "vue-demi": {
+ "version": "0.14.6",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
+ "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+ "requires": {}
+ }
+ }
+ },
+ "@vueuse/metadata": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.5.0.tgz",
+ "integrity": "sha512-fEbElR+MaIYyCkeM0SzWkdoMtOpIwO72x8WsZHRE7IggiOlILttqttM69AS13nrDxosnDBYdyy3C5mR1LCxHsw=="
+ },
+ "@vueuse/shared": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.5.0.tgz",
+ "integrity": "sha512-18iyxbbHYLst9MqU1X1QNdMHIjks6wC7XTVf0KNOv5es/Ms6gjVFCAAWTVP2JStuGqydg3DT+ExpFORUEi9yhg==",
+ "requires": {
+ "vue-demi": ">=0.14.6"
+ },
+ "dependencies": {
+ "vue-demi": {
+ "version": "0.14.6",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
+ "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+ "requires": {}
+ }
+ }
+ },
+ "@xmldom/xmldom": {
+ "version": "0.8.10",
+ "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz",
+ "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==",
+ "dev": true
+ },
+ "7zip-bin": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.1.1.tgz",
+ "integrity": "sha512-sAP4LldeWNz0lNzmTird3uWfFDWWTeg6V/MsmyyLR9X1idwKBWIgt/ZvinqQldJm3LecKEs1emkbquO6PCiLVQ==",
+ "dev": true
+ },
+ "abbrev": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
+ "dev": true
+ },
+ "acorn": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "acorn-walk": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+ "dev": true
+ },
+ "agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "requires": {
+ "debug": "4"
+ }
+ },
+ "ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "requires": {}
+ },
+ "ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ }
+ },
+ "anymatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+ "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
+ "dev": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "app-builder-bin": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz",
+ "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==",
+ "dev": true
+ },
+ "app-builder-lib": {
+ "version": "24.6.4",
+ "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.6.4.tgz",
+ "integrity": "sha512-m9931WXb83teb32N0rKg+ulbn6+Hl8NV5SUpVDOVz9MWOXfhV6AQtTdftf51zJJvCQnQugGtSqoLvgw6mdF/Rg==",
+ "dev": true,
+ "requires": {
+ "@develar/schema-utils": "~2.6.5",
+ "@electron/notarize": "2.1.0",
+ "@electron/osx-sign": "1.0.5",
+ "@electron/universal": "1.4.1",
+ "@malept/flatpak-bundler": "^0.4.0",
+ "@types/fs-extra": "9.0.13",
+ "7zip-bin": "~5.1.1",
+ "async-exit-hook": "^2.0.1",
+ "bluebird-lst": "^1.0.9",
+ "builder-util": "24.5.0",
+ "builder-util-runtime": "9.2.1",
+ "chromium-pickle-js": "^0.2.0",
+ "debug": "^4.3.4",
+ "ejs": "^3.1.8",
+ "electron-publish": "24.5.0",
+ "form-data": "^4.0.0",
+ "fs-extra": "^10.1.0",
+ "hosted-git-info": "^4.1.0",
+ "is-ci": "^3.0.0",
+ "isbinaryfile": "^5.0.0",
+ "js-yaml": "^4.1.0",
+ "lazy-val": "^1.0.5",
+ "minimatch": "^5.1.1",
+ "read-config-file": "6.3.2",
+ "sanitize-filename": "^1.6.3",
+ "semver": "^7.3.8",
+ "tar": "^6.1.12",
+ "temp-file": "^3.4.0"
+ },
+ "dependencies": {
+ "@types/fs-extra": {
+ "version": "9.0.13",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz",
+ "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "builder-util-runtime": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz",
+ "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.3.4",
+ "sax": "^1.2.4"
+ }
+ },
+ "fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ }
+ }
+ },
+ "arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "dev": true
+ },
+ "argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ },
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==",
+ "dev": true,
+ "optional": true
+ },
+ "assertion-error": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
+ "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
+ "dev": true
+ },
+ "astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "optional": true
+ },
+ "async": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz",
+ "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==",
+ "dev": true
+ },
+ "async-exit-hook": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz",
+ "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true
+ },
+ "at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "dev": true
+ },
+ "autoprefixer": {
+ "version": "10.4.16",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz",
+ "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==",
+ "requires": {
+ "browserslist": "^4.21.10",
+ "caniuse-lite": "^1.0.30001538",
+ "fraction.js": "^4.3.6",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.0",
+ "postcss-value-parser": "^4.2.0"
+ }
+ },
+ "b-tween": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/b-tween/-/b-tween-0.3.3.tgz",
+ "integrity": "sha512-oEHegcRpA7fAuc9KC4nktucuZn2aS8htymCPcP3qkEGPqiBH+GfqtqoG2l7LxHngg6O0HFM7hOeOYExl1Oz4ZA==",
+ "dev": true
+ },
+ "b-validate": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/b-validate/-/b-validate-1.5.3.tgz",
+ "integrity": "sha512-iCvCkGFskbaYtfQ0a3GmcQCHl/Sv1GufXFGuUQ+FE+WJa7A/espLOuFIn09B944V8/ImPj71T4+rTASxO2PAuA==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "dev": true
+ },
+ "binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true
+ },
+ "bluebird": {
+ "version": "3.7.2",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
+ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
+ "dev": true
+ },
+ "bluebird-lst": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz",
+ "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==",
+ "dev": true,
+ "requires": {
+ "bluebird": "^3.5.5"
+ }
+ },
+ "boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
+ "boolean": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
+ "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==",
+ "dev": true,
+ "optional": true
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "browserslist": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz",
+ "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==",
+ "requires": {
+ "caniuse-lite": "^1.0.30001541",
+ "electron-to-chromium": "^1.4.535",
+ "node-releases": "^2.0.13",
+ "update-browserslist-db": "^1.0.13"
+ }
+ },
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true
+ },
+ "buffer-equal": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz",
+ "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==",
+ "dev": true
+ },
+ "buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "builder-util": {
+ "version": "24.5.0",
+ "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.5.0.tgz",
+ "integrity": "sha512-STnBmZN/M5vGcv01u/K8l+H+kplTaq4PAIn3yeuufUKSpcdro0DhJWxPI81k5XcNfC//bjM3+n9nr8F9uV4uAQ==",
+ "dev": true,
+ "requires": {
+ "@types/debug": "^4.1.6",
+ "7zip-bin": "~5.1.1",
+ "app-builder-bin": "4.0.0",
+ "bluebird-lst": "^1.0.9",
+ "builder-util-runtime": "9.2.1",
+ "chalk": "^4.1.2",
+ "cross-spawn": "^7.0.3",
+ "debug": "^4.3.4",
+ "fs-extra": "^10.1.0",
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.1",
+ "is-ci": "^3.0.0",
+ "js-yaml": "^4.1.0",
+ "source-map-support": "^0.5.19",
+ "stat-mode": "^1.0.0",
+ "temp-file": "^3.4.0"
+ },
+ "dependencies": {
+ "builder-util-runtime": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz",
+ "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.3.4",
+ "sax": "^1.2.4"
+ }
+ },
+ "fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ }
+ }
+ },
+ "builder-util-runtime": {
+ "version": "9.1.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.1.1.tgz",
+ "integrity": "sha512-azRhYLEoDvRDR8Dhis4JatELC/jUvYjm4cVSj7n9dauGTOM2eeNn9KS0z6YA6oDsjI1xphjNbY6PZZeHPzzqaw==",
+ "requires": {
+ "debug": "^4.3.4",
+ "sax": "^1.2.4"
+ }
+ },
+ "cac": {
+ "version": "6.7.14",
+ "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz",
+ "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==",
+ "dev": true
+ },
+ "cacheable-lookup": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
+ "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
+ "dev": true
+ },
+ "cacheable-request": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz",
+ "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==",
+ "dev": true,
+ "requires": {
+ "clone-response": "^1.0.2",
+ "get-stream": "^5.1.0",
+ "http-cache-semantics": "^4.0.0",
+ "keyv": "^4.0.0",
+ "lowercase-keys": "^2.0.0",
+ "normalize-url": "^6.0.1",
+ "responselike": "^2.0.0"
+ }
+ },
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ },
+ "camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "dev": true,
+ "requires": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "caniuse-lite": {
+ "version": "1.0.30001550",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001550.tgz",
+ "integrity": "sha512-p82WjBYIypO0ukTsd/FG3Xxs+4tFeaY9pfT4amQL8KWtYH7H9nYwReGAbMTJ0hsmRO8IfDtsS6p3ZWj8+1c2RQ=="
+ },
+ "capital-case": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz",
+ "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==",
+ "dev": true,
+ "requires": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3",
+ "upper-case-first": "^2.0.2"
+ }
+ },
+ "chai": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz",
+ "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==",
+ "dev": true,
+ "requires": {
+ "assertion-error": "^1.1.0",
+ "check-error": "^1.0.2",
+ "deep-eql": "^4.1.2",
+ "get-func-name": "^2.0.0",
+ "loupe": "^2.3.1",
+ "pathval": "^1.1.1",
+ "type-detect": "^4.0.5"
+ }
+ },
+ "chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "change-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz",
+ "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==",
+ "dev": true,
+ "requires": {
+ "camel-case": "^4.1.2",
+ "capital-case": "^1.0.4",
+ "constant-case": "^3.0.4",
+ "dot-case": "^3.0.4",
+ "header-case": "^2.0.4",
+ "no-case": "^3.0.4",
+ "param-case": "^3.0.4",
+ "pascal-case": "^3.1.2",
+ "path-case": "^3.0.4",
+ "sentence-case": "^3.0.4",
+ "snake-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true
+ },
+ "chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "requires": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "fsevents": "~2.3.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
+ "chownr": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
+ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
+ "dev": true
+ },
+ "chromium-pickle-js": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz",
+ "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==",
+ "dev": true
+ },
+ "ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "dev": true
+ },
+ "cli-truncate": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz",
+ "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "slice-ansi": "^3.0.0",
+ "string-width": "^4.2.0"
+ }
+ },
+ "cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "clone-response": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
+ "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
+ "dev": true,
+ "requires": {
+ "mimic-response": "^1.0.0"
+ }
+ },
+ "color": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
+ "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.3",
+ "color-string": "^1.6.0"
+ },
+ "dependencies": {
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ }
+ }
+ },
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "color-string": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
+ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
+ "dev": true,
+ "requires": {
+ "color-name": "^1.0.0",
+ "simple-swizzle": "^0.2.2"
+ }
+ },
+ "colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "dev": true
+ },
+ "common-tags": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz",
+ "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==",
+ "dev": true
+ },
+ "compare-version": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/compare-version/-/compare-version-0.1.2.tgz",
+ "integrity": "sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==",
+ "dev": true
+ },
+ "compute-scroll-into-view": {
+ "version": "1.0.20",
+ "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
+ "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "config-chain": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz",
+ "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==",
+ "dev": true,
+ "requires": {
+ "ini": "^1.3.4",
+ "proto-list": "~1.2.1"
+ }
+ },
+ "config-file-ts": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.4.tgz",
+ "integrity": "sha512-cKSW0BfrSaAUnxpgvpXPLaaW/umg4bqg4k3GO1JqlRfpx+d5W0GDXznCMkWotJQek5Mmz1MJVChQnz3IVaeMZQ==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.6",
+ "typescript": "^4.0.2"
+ }
+ },
+ "consola": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz",
+ "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==",
+ "dev": true
+ },
+ "console": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/console/-/console-0.7.2.tgz",
+ "integrity": "sha512-+JSDwGunA4MTEgAV/4VBKwUHonP8CzJ/6GIuwPi6acKFqFfHUdSGCm89ZxZ5FfGWdZfkdgAroy5bJ5FSeN/t4g==",
+ "dev": true
+ },
+ "constant-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz",
+ "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==",
+ "dev": true,
+ "requires": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3",
+ "upper-case": "^2.0.2"
+ }
+ },
+ "copy-anything": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
+ "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+ "dev": true,
+ "requires": {
+ "is-what": "^3.14.1"
+ }
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
+ "dev": true,
+ "optional": true
+ },
+ "crc": {
+ "version": "3.8.0",
+ "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz",
+ "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "buffer": "^5.1.0"
+ }
+ },
+ "create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "dev": true
+ },
+ "cross-env": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz",
+ "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.1"
+ }
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ }
+ },
+ "css-tree": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
+ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+ "dev": true,
+ "requires": {
+ "mdn-data": "2.0.30",
+ "source-map-js": "^1.0.1"
+ }
+ },
+ "css.escape": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
+ "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=",
+ "dev": true
+ },
+ "cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true
+ },
+ "csstype": {
+ "version": "2.6.20",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz",
+ "integrity": "sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA=="
+ },
+ "dayjs": {
+ "version": "1.11.10",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
+ "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
+ },
+ "de-indent": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
+ "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "dev": true,
+ "requires": {
+ "mimic-response": "^3.1.0"
+ },
+ "dependencies": {
+ "mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "dev": true
+ }
+ }
+ },
+ "deep-eql": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
+ "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
+ "dev": true,
+ "requires": {
+ "type-detect": "^4.0.0"
+ }
+ },
+ "deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "defer-to-connect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+ "dev": true
+ },
+ "define-properties": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz",
+ "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "defu": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.2.tgz",
+ "integrity": "sha512-+uO4+qr7msjNNWKYPHqN/3+Dx3NFkmIzayk2L1MyZQlvgZb/J1A0fo410dpKrN2SnqFjt8n4JL8fDJE0wIgjFQ==",
+ "dev": true
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true
+ },
+ "destr": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.1.tgz",
+ "integrity": "sha512-M1Ob1zPSIvlARiJUkKqvAZ3VAqQY6Jcuth/pBKQ2b1dX/Qx0OnJ8Vux6J2H5PTMQeRzWrrbTu70VxBfv/OPDJA==",
+ "dev": true
+ },
+ "detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "dev": true,
+ "optional": true
+ },
+ "diff": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz",
+ "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==",
+ "dev": true
+ },
+ "dir-compare": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz",
+ "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==",
+ "dev": true,
+ "requires": {
+ "buffer-equal": "^1.0.0",
+ "minimatch": "^3.0.4"
+ }
+ },
+ "dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "requires": {
+ "path-type": "^4.0.0"
+ }
+ },
+ "dlv": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
+ "dev": true
+ },
+ "dmg-builder": {
+ "version": "24.6.4",
+ "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.6.4.tgz",
+ "integrity": "sha512-BNcHRc9CWEuI9qt0E655bUBU/j/3wUCYBVKGu1kVpbN5lcUdEJJJeiO0NHK3dgKmra6LUUZlo+mWqc+OCbi0zw==",
+ "dev": true,
+ "requires": {
+ "app-builder-lib": "24.6.4",
+ "builder-util": "24.5.0",
+ "builder-util-runtime": "9.2.1",
+ "dmg-license": "^1.0.11",
+ "fs-extra": "^10.1.0",
+ "iconv-lite": "^0.6.2",
+ "js-yaml": "^4.1.0"
+ },
+ "dependencies": {
+ "builder-util-runtime": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz",
+ "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.3.4",
+ "sax": "^1.2.4"
+ }
+ },
+ "fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ }
+ }
+ },
+ "dmg-license": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz",
+ "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "@types/plist": "^3.0.1",
+ "@types/verror": "^1.10.3",
+ "ajv": "^6.10.0",
+ "crc": "^3.8.0",
+ "iconv-corefoundation": "^1.1.7",
+ "plist": "^3.0.4",
+ "smart-buffer": "^4.0.2",
+ "verror": "^1.10.0"
+ }
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dev": true,
+ "requires": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "dotenv": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz",
+ "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==",
+ "dev": true
+ },
+ "dotenv-expand": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz",
+ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==",
+ "dev": true
+ },
+ "duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+ "dev": true
+ },
+ "eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
+ "editorconfig": {
+ "version": "0.15.3",
+ "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz",
+ "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==",
+ "dev": true,
+ "requires": {
+ "commander": "^2.19.0",
+ "lru-cache": "^4.1.5",
+ "semver": "^5.6.0",
+ "sigmund": "^1.0.1"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "requires": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
+ "dev": true
+ }
+ }
+ },
+ "ejs": {
+ "version": "3.1.9",
+ "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz",
+ "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==",
+ "dev": true,
+ "requires": {
+ "jake": "^10.8.5"
+ }
+ },
+ "electron": {
+ "version": "22.3.27",
+ "resolved": "https://registry.npmjs.org/electron/-/electron-22.3.27.tgz",
+ "integrity": "sha512-7Rht21vHqj4ZFRnKuZdFqZFsvMBCmDqmjetiMqPtF+TmTBiGne1mnstVXOA/SRGhN2Qy5gY5bznJKpiqogjM8A==",
+ "dev": true,
+ "requires": {
+ "@electron/get": "^2.0.0",
+ "@types/node": "^16.11.26",
+ "extract-zip": "^2.0.1"
+ },
+ "dependencies": {
+ "@types/node": {
+ "version": "16.18.16",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.16.tgz",
+ "integrity": "sha512-ZOzvDRWp8dCVBmgnkIqYCArgdFOO9YzocZp8Ra25N/RStKiWvMOXHMz+GjSeVNe5TstaTmTWPucGJkDw0XXJWA==",
+ "dev": true
+ }
+ }
+ },
+ "electron-builder": {
+ "version": "24.6.4",
+ "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.6.4.tgz",
+ "integrity": "sha512-uNWQoU7pE7qOaIQ6CJHpBi44RJFVG8OHRBIadUxrsDJVwLLo8Nma3K/EEtx5/UyWAQYdcK4nVPYKoRqBb20hbA==",
+ "dev": true,
+ "requires": {
+ "app-builder-lib": "24.6.4",
+ "builder-util": "24.5.0",
+ "builder-util-runtime": "9.2.1",
+ "chalk": "^4.1.2",
+ "dmg-builder": "24.6.4",
+ "fs-extra": "^10.1.0",
+ "is-ci": "^3.0.0",
+ "lazy-val": "^1.0.5",
+ "read-config-file": "6.3.2",
+ "simple-update-notifier": "2.0.0",
+ "yargs": "^17.6.2"
+ },
+ "dependencies": {
+ "builder-util-runtime": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz",
+ "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.3.4",
+ "sax": "^1.2.4"
+ }
+ },
+ "fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ }
+ }
+ },
+ "electron-log": {
+ "version": "4.4.8",
+ "resolved": "https://registry.npmjs.org/electron-log/-/electron-log-4.4.8.tgz",
+ "integrity": "sha512-QQ4GvrXO+HkgqqEOYbi+DHL7hj5JM+nHi/j+qrN9zeeXVKy8ZABgbu4CnG+BBqDZ2+tbeq9tUC4DZfIWFU5AZA=="
+ },
+ "electron-publish": {
+ "version": "24.5.0",
+ "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.5.0.tgz",
+ "integrity": "sha512-zwo70suH15L15B4ZWNDoEg27HIYoPsGJUF7xevLJLSI7JUPC8l2yLBdLGwqueJ5XkDL7ucYyRZzxJVR8ElV9BA==",
+ "dev": true,
+ "requires": {
+ "@types/fs-extra": "^9.0.11",
+ "builder-util": "24.5.0",
+ "builder-util-runtime": "9.2.1",
+ "chalk": "^4.1.2",
+ "fs-extra": "^10.1.0",
+ "lazy-val": "^1.0.5",
+ "mime": "^2.5.2"
+ },
+ "dependencies": {
+ "@types/fs-extra": {
+ "version": "9.0.13",
+ "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-9.0.13.tgz",
+ "integrity": "sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "builder-util-runtime": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.1.tgz",
+ "integrity": "sha512-2rLv/uQD2x+dJ0J3xtsmI12AlRyk7p45TEbE/6o/fbb633e/S3pPgm+ct+JHsoY7r39dKHnGEFk/AASRFdnXmA==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.3.4",
+ "sax": "^1.2.4"
+ }
+ },
+ "fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ }
+ }
+ },
+ "electron-to-chromium": {
+ "version": "1.4.557",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.557.tgz",
+ "integrity": "sha512-6x0zsxyMXpnMJnHrondrD3SuAeKcwij9S+83j2qHAQPXbGTDDfgImzzwgGlzrIcXbHQ42tkG4qA6U860cImNhw=="
+ },
+ "electron-updater": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/electron-updater/-/electron-updater-5.3.0.tgz",
+ "integrity": "sha512-iKEr7yQBcvnQUPnSDYGSWC9t0eF2YbZWeYYYZzYxdl+HiRejXFENjYMnYjoOm2zxyD6Cr2JTHZhp9pqxiXuCOw==",
+ "requires": {
+ "@types/semver": "^7.3.6",
+ "builder-util-runtime": "9.1.1",
+ "fs-extra": "^10.0.0",
+ "js-yaml": "^4.1.0",
+ "lazy-val": "^1.0.5",
+ "lodash.escaperegexp": "^4.1.2",
+ "lodash.isequal": "^4.5.0",
+ "semver": "^7.3.5",
+ "typed-emitter": "^2.1.0"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ }
+ }
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true
+ },
+ "err-code": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
+ "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==",
+ "dev": true
+ },
+ "errno": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+ "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "prr": "~1.0.1"
+ }
+ },
+ "es-module-lexer": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
+ "dev": true
+ },
+ "es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "dev": true,
+ "optional": true
+ },
+ "esbuild": {
+ "version": "0.18.20",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz",
+ "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==",
+ "dev": true,
+ "requires": {
+ "@esbuild/android-arm": "0.18.20",
+ "@esbuild/android-arm64": "0.18.20",
+ "@esbuild/android-x64": "0.18.20",
+ "@esbuild/darwin-arm64": "0.18.20",
+ "@esbuild/darwin-x64": "0.18.20",
+ "@esbuild/freebsd-arm64": "0.18.20",
+ "@esbuild/freebsd-x64": "0.18.20",
+ "@esbuild/linux-arm": "0.18.20",
+ "@esbuild/linux-arm64": "0.18.20",
+ "@esbuild/linux-ia32": "0.18.20",
+ "@esbuild/linux-loong64": "0.18.20",
+ "@esbuild/linux-mips64el": "0.18.20",
+ "@esbuild/linux-ppc64": "0.18.20",
+ "@esbuild/linux-riscv64": "0.18.20",
+ "@esbuild/linux-s390x": "0.18.20",
+ "@esbuild/linux-x64": "0.18.20",
+ "@esbuild/netbsd-x64": "0.18.20",
+ "@esbuild/openbsd-x64": "0.18.20",
+ "@esbuild/sunos-x64": "0.18.20",
+ "@esbuild/win32-arm64": "0.18.20",
+ "@esbuild/win32-ia32": "0.18.20",
+ "@esbuild/win32-x64": "0.18.20"
+ }
+ },
+ "escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
+ },
+ "escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true
+ },
+ "escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "dev": true,
+ "requires": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2",
+ "source-map": "~0.6.1"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ }
+ }
+ },
+ "eslint": {
+ "version": "8.36.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz",
+ "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==",
+ "dev": true,
+ "requires": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.4.0",
+ "@eslint/eslintrc": "^2.0.1",
+ "@eslint/js": "8.36.0",
+ "@humanwhocodes/config-array": "^0.11.8",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.1.1",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.5.0",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "grapheme-splitter": "^1.0.4",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-sdsl": "^4.1.4",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0"
+ },
+ "dependencies": {
+ "eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-config-prettier": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz",
+ "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==",
+ "dev": true,
+ "requires": {}
+ },
+ "eslint-plugin-prettier": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz",
+ "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==",
+ "dev": true,
+ "requires": {
+ "prettier-linter-helpers": "^1.0.0"
+ }
+ },
+ "eslint-plugin-vue": {
+ "version": "9.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.9.0.tgz",
+ "integrity": "sha512-YbubS7eK0J7DCf0U2LxvVP7LMfs6rC6UltihIgval3azO3gyDwEGVgsCMe1TmDiEkl6GdMKfRpaME6QxIYtzDQ==",
+ "dev": true,
+ "requires": {
+ "eslint-utils": "^3.0.0",
+ "natural-compare": "^1.4.0",
+ "nth-check": "^2.0.1",
+ "postcss-selector-parser": "^6.0.9",
+ "semver": "^7.3.5",
+ "vue-eslint-parser": "^9.0.1",
+ "xml-name-validator": "^4.0.0"
+ }
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-utils": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz",
+ "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz",
+ "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==",
+ "dev": true
+ },
+ "espree": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz",
+ "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.8.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.3.0"
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true
+ },
+ "esquery": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.2.tgz",
+ "integrity": "sha512-JVSoLdTlTDkmjFmab7H/9SL9qGSyjElT3myyKp7krqjVFQCDLmj1QFaCLRFBszBKI0XVZaiiXvuPIX3ZwHe1Ng==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ }
+ }
+ },
+ "estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true
+ },
+ "estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true
+ },
+ "execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "dependencies": {
+ "get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true
+ }
+ }
+ },
+ "extract-zip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "dev": true,
+ "requires": {
+ "@types/yauzl": "^2.9.1",
+ "debug": "^4.1.1",
+ "get-stream": "^5.1.0",
+ "yauzl": "^2.10.0"
+ }
+ },
+ "extsprintf": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz",
+ "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==",
+ "dev": true,
+ "optional": true
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "fast-diff": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+ "dev": true
+ },
+ "fast-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "requires": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
+ }
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "fastq": {
+ "version": "1.13.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+ "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
+ "requires": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "dev": true,
+ "requires": {
+ "pend": "~1.2.0"
+ }
+ },
+ "file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^3.0.4"
+ }
+ },
+ "filelist": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
+ "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "dev": true,
+ "requires": {
+ "minimatch": "^5.0.1"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "requires": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ }
+ },
+ "flatted": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz",
+ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==",
+ "dev": true
+ },
+ "form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dev": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="
+ },
+ "fs-extra": {
+ "version": "11.1.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz",
+ "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==",
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "fs-minipass": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
+ "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
+ "dev": true,
+ "requires": {
+ "minipass": "^3.0.0"
+ },
+ "dependencies": {
+ "minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ }
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "optional": true
+ },
+ "function-bind": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "get-func-name": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
+ "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
+ "dev": true
+ },
+ "get-intrinsic": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+ "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.3"
+ }
+ },
+ "global-agent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
+ "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "boolean": "^3.0.1",
+ "es6-error": "^4.1.1",
+ "matcher": "^3.0.0",
+ "roarr": "^2.15.3",
+ "semver": "^7.3.2",
+ "serialize-error": "^7.0.1"
+ }
+ },
+ "globals": {
+ "version": "13.19.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz",
+ "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.20.2"
+ }
+ },
+ "globalthis": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz",
+ "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "define-properties": "^1.1.3"
+ }
+ },
+ "globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "requires": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ }
+ },
+ "got": {
+ "version": "11.8.5",
+ "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz",
+ "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==",
+ "dev": true,
+ "requires": {
+ "@sindresorhus/is": "^4.0.0",
+ "@szmarczak/http-timer": "^4.0.5",
+ "@types/cacheable-request": "^6.0.1",
+ "@types/responselike": "^1.0.0",
+ "cacheable-lookup": "^5.0.3",
+ "cacheable-request": "^7.0.2",
+ "decompress-response": "^6.0.0",
+ "http2-wrapper": "^1.0.0-beta.5.2",
+ "lowercase-keys": "^2.0.0",
+ "p-cancelable": "^2.0.0",
+ "responselike": "^2.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.8",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
+ "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg=="
+ },
+ "grapheme-splitter": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz",
+ "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==",
+ "dev": true
+ },
+ "gzip-size": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
+ "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+ "dev": true,
+ "requires": {
+ "duplexer": "^0.1.2"
+ }
+ },
+ "happy-dom": {
+ "version": "8.9.0",
+ "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-8.9.0.tgz",
+ "integrity": "sha512-JZwJuGdR7ko8L61136YzmrLv7LgTh5b8XaEM3P709mLjyQuXJ3zHTDXvUtBBahRjGlcYW0zGjIiEWizoTUGKfA==",
+ "dev": true,
+ "requires": {
+ "css.escape": "^1.5.1",
+ "he": "^1.2.0",
+ "iconv-lite": "^0.6.3",
+ "node-fetch": "^2.x.x",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^2.0.0",
+ "whatwg-mimetype": "^3.0.0"
+ }
+ },
+ "has": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+ "dev": true,
+ "requires": {
+ "function-bind": "^1.1.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true
+ }
+ }
+ },
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ },
+ "has-property-descriptors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz",
+ "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "get-intrinsic": "^1.1.1"
+ }
+ },
+ "has-symbols": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+ "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+ "dev": true,
+ "optional": true
+ },
+ "he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true
+ },
+ "header-case": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz",
+ "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==",
+ "dev": true,
+ "requires": {
+ "capital-case": "^1.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "http-cache-semantics": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
+ "dev": true
+ },
+ "http-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+ "dev": true,
+ "requires": {
+ "@tootallnate/once": "2",
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
+ "http2-wrapper": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
+ "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
+ "dev": true,
+ "requires": {
+ "quick-lru": "^5.1.1",
+ "resolve-alpn": "^1.0.0"
+ }
+ },
+ "https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dev": true,
+ "requires": {
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
+ "human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true
+ },
+ "iconv-corefoundation": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz",
+ "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "cli-truncate": "^2.1.0",
+ "node-addon-api": "^1.6.3"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ }
+ },
+ "ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "optional": true
+ },
+ "ignore": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+ "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
+ "dev": true
+ },
+ "image-size": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+ "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+ "dev": true,
+ "optional": true
+ },
+ "import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true
+ },
+ "is-arrayish": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
+ "dev": true
+ },
+ "is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "is-ci": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz",
+ "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==",
+ "dev": true,
+ "requires": {
+ "ci-info": "^3.2.0"
+ }
+ },
+ "is-core-module": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
+ "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
+ "dev": true,
+ "requires": {
+ "has": "^1.0.3"
+ }
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="
+ },
+ "is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true
+ },
+ "is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true
+ },
+ "is-what": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
+ "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+ "dev": true
+ },
+ "isbinaryfile": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-5.0.0.tgz",
+ "integrity": "sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg==",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "jake": {
+ "version": "10.8.7",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz",
+ "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==",
+ "dev": true,
+ "requires": {
+ "async": "^3.2.3",
+ "chalk": "^4.0.2",
+ "filelist": "^1.0.4",
+ "minimatch": "^3.1.2"
+ }
+ },
+ "jiti": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz",
+ "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==",
+ "dev": true
+ },
+ "js-beautify": {
+ "version": "1.14.6",
+ "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.14.6.tgz",
+ "integrity": "sha512-GfofQY5zDp+cuHc+gsEXKPpNw2KbPddreEo35O6jT6i0RVK6LhsoYBhq5TvK4/n74wnA0QbK8gGd+jUZwTMKJw==",
+ "dev": true,
+ "requires": {
+ "config-chain": "^1.1.13",
+ "editorconfig": "^0.15.3",
+ "glob": "^8.0.3",
+ "nopt": "^6.0.0"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "glob": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz",
+ "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==",
+ "dev": true,
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^5.0.1",
+ "once": "^1.3.0"
+ }
+ },
+ "minimatch": {
+ "version": "5.1.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
+ "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ }
+ }
+ },
+ "js-sdsl": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.1.4.tgz",
+ "integrity": "sha512-Y2/yD55y5jteOAmY50JbUZYwk3CP3wnLPEZnlR1w9oKhITrBEtAxwuWKebFf8hMrPMgbYwFoWK/lH2sBkErELw==",
+ "dev": true
+ },
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "requires": {
+ "argparse": "^2.0.1"
+ }
+ },
+ "jsesc": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+ "dev": true
+ },
+ "json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
+ "dev": true
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
+ "dev": true,
+ "optional": true
+ },
+ "json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true
+ },
+ "jsonc-eslint-parser": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsonc-eslint-parser/-/jsonc-eslint-parser-1.4.1.tgz",
+ "integrity": "sha512-hXBrvsR1rdjmB2kQmUjf1rEIa+TqHBGMge8pwi++C+Si1ad7EjZrJcpgwym+QGK/pqTx+K7keFAtLlVNdLRJOg==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.4.1",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^1.3.0",
+ "espree": "^6.0.0",
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ },
+ "eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ },
+ "espree": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz",
+ "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.1.1",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.1.0"
+ }
+ },
+ "semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true
+ }
+ }
+ },
+ "jsonc-parser": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
+ "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^2.0.0"
+ }
+ },
+ "keyv": {
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz",
+ "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==",
+ "dev": true,
+ "requires": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "kolorist": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz",
+ "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==",
+ "dev": true
+ },
+ "lazy-val": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.5.tgz",
+ "integrity": "sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q=="
+ },
+ "less": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz",
+ "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==",
+ "dev": true,
+ "requires": {
+ "copy-anything": "^2.0.1",
+ "errno": "^0.1.1",
+ "graceful-fs": "^4.1.2",
+ "image-size": "~0.5.0",
+ "make-dir": "^2.1.0",
+ "mime": "^1.4.1",
+ "needle": "^3.1.0",
+ "parse-node-version": "^1.0.1",
+ "source-map": "~0.6.0",
+ "tslib": "^2.3.0"
+ },
+ "dependencies": {
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "local-pkg": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz",
+ "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==",
+ "dev": true
+ },
+ "locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^5.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ },
+ "lodash.escaperegexp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz",
+ "integrity": "sha1-ZHYsSGGAglGKw99Mz11YhtriA0c="
+ },
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
+ },
+ "lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "loglevel": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.8.1.tgz",
+ "integrity": "sha512-tCRIJM51SHjAayKwC+QAg8hT8vg6z7GSgLJKGvzuPb1Wc+hLzqtuVLxp6/HzSPOozuK+8ErAhy7U/sVzw8Dgfg==",
+ "dev": true
+ },
+ "loglevel-colored-level-prefix": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/loglevel-colored-level-prefix/-/loglevel-colored-level-prefix-1.0.0.tgz",
+ "integrity": "sha512-u45Wcxxc+SdAlh4yeF/uKlC1SPUPCy0gullSNKXod5I4bmifzk+Q4lSLExNEVn19tGaJipbZ4V4jbFn79/6mVA==",
+ "dev": true,
+ "requires": {
+ "chalk": "^1.1.3",
+ "loglevel": "^1.4.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^2.2.1",
+ "escape-string-regexp": "^1.0.2",
+ "has-ansi": "^2.0.0",
+ "strip-ansi": "^3.0.0",
+ "supports-color": "^2.0.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+ "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==",
+ "dev": true
+ }
+ }
+ },
+ "loupe": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz",
+ "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==",
+ "dev": true,
+ "requires": {
+ "get-func-name": "^2.0.0"
+ }
+ },
+ "lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "requires": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ },
+ "magic-string": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "requires": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
+ "make-dir": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+ "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "pify": "^4.0.1",
+ "semver": "^5.6.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "dev": true
+ },
+ "matcher": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
+ "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "escape-string-regexp": "^4.0.0"
+ }
+ },
+ "mdn-data": {
+ "version": "2.0.30",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
+ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+ "dev": true
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
+ },
+ "micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "requires": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ }
+ },
+ "mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.52.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ },
+ "mimic-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true
+ },
+ "minipass": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
+ "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
+ "dev": true
+ },
+ "minizlib": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
+ "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
+ "dev": true,
+ "requires": {
+ "minipass": "^3.0.0",
+ "yallist": "^4.0.0"
+ },
+ "dependencies": {
+ "minipass": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz",
+ "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==",
+ "dev": true,
+ "requires": {
+ "yallist": "^4.0.0"
+ }
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true
+ },
+ "mlly": {
+ "version": "0.5.16",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-0.5.16.tgz",
+ "integrity": "sha512-LaJ8yuh4v0zEmge/g3c7jjFlhoCPfQn6RCjXgm9A0Qiuochq4BcuOxVfWmdnCoLTlg2MV+hqhOek+W2OhG0Lwg==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.8.0",
+ "pathe": "^0.3.8",
+ "pkg-types": "^0.3.5",
+ "ufo": "^0.8.5"
+ }
+ },
+ "mrmime": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz",
+ "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "muggle-string": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.2.2.tgz",
+ "integrity": "sha512-YVE1mIJ4VpUMqZObFndk9CJu6DBJR/GB13p3tXuNbwD4XExaI5EOuRl6BHeIDxIqXZVxSfAC+y6U1Z/IxCfKUg==",
+ "dev": true
+ },
+ "mustache": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz",
+ "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ=="
+ },
+ "nano-staged": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/nano-staged/-/nano-staged-0.8.0.tgz",
+ "integrity": "sha512-QSEqPGTCJbkHU2yLvfY6huqYPjdBrOaTMKatO1F8nCSrkQGXeKwtCiCnsdxnuMhbg3DTVywKaeWLGCE5oJpq0g==",
+ "dev": true,
+ "requires": {
+ "picocolors": "^1.0.0"
+ }
+ },
+ "nanoid": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz",
+ "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw=="
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
+ "dev": true
+ },
+ "natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==",
+ "dev": true
+ },
+ "needle": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz",
+ "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "debug": "^3.2.6",
+ "iconv-lite": "^0.6.3",
+ "sax": "^1.2.4"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ }
+ }
+ },
+ "no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "requires": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node-addon-api": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz",
+ "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==",
+ "dev": true,
+ "optional": true
+ },
+ "node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dev": true,
+ "requires": {
+ "whatwg-url": "^5.0.0"
+ }
+ },
+ "node-fetch-native": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.4.0.tgz",
+ "integrity": "sha512-F5kfEj95kX8tkDhUCYdV8dg3/8Olx/94zB8+ZNthFs6Bz31UpUi8Xh40TN3thLwXgrwXry1pEg9lJ++tLWTcqA==",
+ "dev": true
+ },
+ "node-releases": {
+ "version": "2.0.13",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
+ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ=="
+ },
+ "nopt": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz",
+ "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==",
+ "dev": true,
+ "requires": {
+ "abbrev": "^1.0.0"
+ }
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA=="
+ },
+ "normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "dev": true
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.0.0"
+ }
+ },
+ "nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "requires": {
+ "boolbase": "^1.0.0"
+ }
+ },
+ "number-precision": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/number-precision/-/number-precision-1.6.0.tgz",
+ "integrity": "sha512-05OLPgbgmnixJw+VvEh18yNPUo3iyp4BEWJcrLu4X9W05KmMifN7Mu5exYvQXqxxeNWhvIF+j3Rij+HmddM/hQ==",
+ "dev": true
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "optional": true
+ },
+ "ofetch": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.3.3.tgz",
+ "integrity": "sha512-s1ZCMmQWXy4b5K/TW9i/DtiN8Ku+xCiHcjQ6/J/nDdssirrQNOoB165Zu8EqLMA2lln1JUth9a0aW9Ap2ctrUg==",
+ "dev": true,
+ "requires": {
+ "destr": "^2.0.1",
+ "node-fetch-native": "^1.4.0",
+ "ufo": "^1.3.0"
+ },
+ "dependencies": {
+ "ufo": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz",
+ "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==",
+ "dev": true
+ }
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "p-cancelable": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
+ "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "requires": {
+ "yocto-queue": "^0.1.0"
+ }
+ },
+ "p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^3.0.2"
+ }
+ },
+ "param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "dev": true,
+ "requires": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ }
+ },
+ "parse-node-version": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+ "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+ "dev": true
+ },
+ "pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "dev": true,
+ "requires": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "path-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz",
+ "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==",
+ "dev": true,
+ "requires": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
+ },
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
+ "dev": true
+ },
+ "path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true
+ },
+ "pathe": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.3.9.tgz",
+ "integrity": "sha512-6Y6s0vT112P3jD8dGfuS6r+lpa0qqNrLyHPOwvXMnyNTQaYiwgau2DP3aNDsR13xqtGj7rrPo+jFUATpU6/s+g==",
+ "dev": true
+ },
+ "pathval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz",
+ "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==",
+ "dev": true
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "dev": true
+ },
+ "perfect-debounce": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz",
+ "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==",
+ "dev": true
+ },
+ "picocolors": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+ },
+ "picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="
+ },
+ "pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "optional": true
+ },
+ "pinia": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz",
+ "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==",
+ "requires": {
+ "@vue/devtools-api": "^6.5.0",
+ "vue-demi": ">=0.14.5"
+ },
+ "dependencies": {
+ "vue-demi": {
+ "version": "0.14.6",
+ "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz",
+ "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==",
+ "requires": {}
+ }
+ }
+ },
+ "pkg-types": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-0.3.6.tgz",
+ "integrity": "sha512-uQZutkkh6axl1GxDm5/+8ivVdwuJ5pyDGqJeSiIWIUWIqYiK3p9QKozN/Rv6eVvFoeSWkN1uoYeSDBwwBJBtbg==",
+ "dev": true,
+ "requires": {
+ "jsonc-parser": "^3.2.0",
+ "mlly": "^0.5.16",
+ "pathe": "^0.3.9"
+ }
+ },
+ "playwright": {
+ "version": "1.31.2",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.31.2.tgz",
+ "integrity": "sha512-jpC47n2PKQNtzB7clmBuWh6ftBRS/Bt5EGLigJ9k2QAKcNeYXZkEaDH5gmvb6+AbcE0DO6GnXdbl9ogG6Eh+og==",
+ "dev": true,
+ "requires": {
+ "playwright-core": "1.31.2"
+ }
+ },
+ "playwright-core": {
+ "version": "1.31.2",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.31.2.tgz",
+ "integrity": "sha512-a1dFgCNQw4vCsG7bnojZjDnPewZcw7tZUNFN0ZkcLYKj+mPmXvg4MpaaKZ5SgqPsOmqIf2YsVRkgqiRDxD+fDQ==",
+ "dev": true
+ },
+ "plist": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz",
+ "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==",
+ "dev": true,
+ "requires": {
+ "@xmldom/xmldom": "^0.8.8",
+ "base64-js": "^1.5.1",
+ "xmlbuilder": "^15.1.1"
+ }
+ },
+ "postcss": {
+ "version": "8.4.31",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+ "requires": {
+ "nanoid": "^3.3.6",
+ "picocolors": "^1.0.0",
+ "source-map-js": "^1.0.2"
+ },
+ "dependencies": {
+ "nanoid": {
+ "version": "3.3.6",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+ "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA=="
+ }
+ }
+ },
+ "postcss-selector-parser": {
+ "version": "6.0.10",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz",
+ "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==",
+ "dev": true,
+ "requires": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ }
+ },
+ "postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
+ },
+ "prettier": {
+ "version": "2.8.8",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz",
+ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==",
+ "dev": true
+ },
+ "prettier-eslint": {
+ "version": "15.0.1",
+ "resolved": "https://registry.npmjs.org/prettier-eslint/-/prettier-eslint-15.0.1.tgz",
+ "integrity": "sha512-mGOWVHixSvpZWARqSDXbdtTL54mMBxc5oQYQ6RAqy8jecuNJBgN3t9E5a81G66F8x8fsKNiR1HWaBV66MJDOpg==",
+ "dev": true,
+ "requires": {
+ "@types/eslint": "^8.4.2",
+ "@types/prettier": "^2.6.0",
+ "@typescript-eslint/parser": "^5.10.0",
+ "common-tags": "^1.4.0",
+ "dlv": "^1.1.0",
+ "eslint": "^8.7.0",
+ "indent-string": "^4.0.0",
+ "lodash.merge": "^4.6.0",
+ "loglevel-colored-level-prefix": "^1.0.0",
+ "prettier": "^2.5.1",
+ "pretty-format": "^23.0.1",
+ "require-relative": "^0.8.7",
+ "typescript": "^4.5.4",
+ "vue-eslint-parser": "^8.0.1"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz",
+ "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "requires": {
+ "color-name": "1.1.3"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ },
+ "pretty-format": {
+ "version": "23.6.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz",
+ "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0",
+ "ansi-styles": "^3.2.0"
+ }
+ },
+ "vue-eslint-parser": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",
+ "integrity": "sha512-dzHGG3+sYwSf6zFBa0Gi9ZDshD7+ad14DGOdTLjruRVgZXe2J+DcZ9iUhyR48z5g1PqRa20yt3Njna/veLJL/g==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.3.2",
+ "eslint-scope": "^7.0.0",
+ "eslint-visitor-keys": "^3.1.0",
+ "espree": "^9.0.0",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^7.3.5"
+ }
+ }
+ }
+ },
+ "prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "requires": {
+ "fast-diff": "^1.1.2"
+ }
+ },
+ "pretty-format": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
+ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^17.0.1"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true
+ }
+ }
+ },
+ "progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true
+ },
+ "promise-retry": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
+ "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
+ "dev": true,
+ "requires": {
+ "err-code": "^2.0.2",
+ "retry": "^0.12.0"
+ }
+ },
+ "proto-list": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
+ "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==",
+ "dev": true
+ },
+ "prr": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+ "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+ "dev": true,
+ "optional": true
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
+ "dev": true
+ },
+ "pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ },
+ "python-shell": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/python-shell/-/python-shell-5.0.0.tgz",
+ "integrity": "sha512-RUOOOjHLhgR1MIQrCtnEqz/HJ1RMZBIN+REnpSUrfft2bXqXy69fwJASVziWExfFXsR1bCY0TznnHooNsCo0/w=="
+ },
+ "queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="
+ },
+ "quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "dev": true
+ },
+ "react-is": {
+ "version": "17.0.2",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
+ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
+ "dev": true
+ },
+ "read-config-file": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz",
+ "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==",
+ "dev": true,
+ "requires": {
+ "config-file-ts": "^0.2.4",
+ "dotenv": "^9.0.2",
+ "dotenv-expand": "^5.1.0",
+ "js-yaml": "^4.1.0",
+ "json5": "^2.2.0",
+ "lazy-val": "^1.0.4"
+ }
+ },
+ "readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true
+ },
+ "require-relative": {
+ "version": "0.8.7",
+ "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz",
+ "integrity": "sha512-AKGr4qvHiryxRb19m3PsLRGuKVAbJLUD7E6eOaHkfKhwc+vSgVOCY5xNvm9EkolBKTOf0GrQAZKLimOCz81Khg==",
+ "dev": true
+ },
+ "resize-observer-polyfill": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
+ "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.22.1",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz",
+ "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
+ "dev": true,
+ "requires": {
+ "is-core-module": "^2.9.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ }
+ },
+ "resolve-alpn": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+ "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
+ "dev": true
+ },
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
+ },
+ "responselike": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
+ "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
+ "dev": true,
+ "requires": {
+ "lowercase-keys": "^2.0.0"
+ }
+ },
+ "retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==",
+ "dev": true
+ },
+ "reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "roarr": {
+ "version": "2.15.4",
+ "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
+ "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "boolean": "^3.0.1",
+ "detect-node": "^2.0.4",
+ "globalthis": "^1.0.1",
+ "json-stringify-safe": "^5.0.1",
+ "semver-compare": "^1.0.0",
+ "sprintf-js": "^1.1.2"
+ }
+ },
+ "rollup": {
+ "version": "3.29.4",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz",
+ "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==",
+ "dev": true,
+ "requires": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "requires": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "rxjs": {
+ "version": "7.5.5",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz",
+ "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==",
+ "optional": true,
+ "requires": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "sanitize-filename": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz",
+ "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==",
+ "dev": true,
+ "requires": {
+ "truncate-utf8-bytes": "^1.0.0"
+ }
+ },
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw=="
+ },
+ "scroll-into-view-if-needed": {
+ "version": "2.2.31",
+ "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
+ "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
+ "dev": true,
+ "requires": {
+ "compute-scroll-into-view": "^1.0.20"
+ }
+ },
+ "scule": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/scule/-/scule-1.0.0.tgz",
+ "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "requires": {
+ "lru-cache": "^6.0.0"
+ }
+ },
+ "semver-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
+ "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
+ "dev": true,
+ "optional": true
+ },
+ "sentence-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz",
+ "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==",
+ "dev": true,
+ "requires": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3",
+ "upper-case-first": "^2.0.2"
+ }
+ },
+ "serialize-error": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
+ "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "type-fest": "^0.13.1"
+ },
+ "dependencies": {
+ "type-fest": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
+ "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
+ "dev": true,
+ "optional": true
+ }
+ }
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true
+ },
+ "sigmund": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
+ "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==",
+ "dev": true
+ },
+ "signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "simple-git-hooks": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/simple-git-hooks/-/simple-git-hooks-2.8.1.tgz",
+ "integrity": "sha512-DYpcVR1AGtSfFUNzlBdHrQGPsOhuuEJ/FkmPOOlFysP60AHd3nsEpkGq/QEOdtUyT1Qhk7w9oLmFoMG+75BDog==",
+ "dev": true
+ },
+ "simple-swizzle": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
+ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.3.1"
+ }
+ },
+ "simple-update-notifier": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
+ "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
+ "dev": true,
+ "requires": {
+ "semver": "^7.5.3"
+ }
+ },
+ "sirv": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz",
+ "integrity": "sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==",
+ "dev": true,
+ "requires": {
+ "@polka/url": "^1.0.0-next.20",
+ "mrmime": "^1.0.0",
+ "totalist": "^3.0.0"
+ }
+ },
+ "slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true
+ },
+ "slice-ansi": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz",
+ "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ }
+ },
+ "smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "dev": true,
+ "optional": true
+ },
+ "snake-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
+ "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
+ "dev": true,
+ "requires": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "source-map-js": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
+ },
+ "source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
+ },
+ "sprintf-js": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz",
+ "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==",
+ "dev": true,
+ "optional": true
+ },
+ "stackback": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz",
+ "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==",
+ "dev": true
+ },
+ "stat-mode": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz",
+ "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==",
+ "dev": true
+ },
+ "std-env": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.3.1.tgz",
+ "integrity": "sha512-3H20QlwQsSm2OvAxWIYhs+j01MzzqwMwGiiO1NQaJYZgJZFPuAbf95/DiKRBSTYIJ2FeGUc+B/6mPGcWP9dO3Q==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.1"
+ }
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "strip-literal": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz",
+ "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.10.0"
+ }
+ },
+ "sumchecker": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
+ "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.1.0"
+ }
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ }
+ },
+ "supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "dev": true
+ },
+ "tar": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz",
+ "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==",
+ "dev": true,
+ "requires": {
+ "chownr": "^2.0.0",
+ "fs-minipass": "^2.0.0",
+ "minipass": "^5.0.0",
+ "minizlib": "^2.1.1",
+ "mkdirp": "^1.0.3",
+ "yallist": "^4.0.0"
+ }
+ },
+ "temp-file": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.4.0.tgz",
+ "integrity": "sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==",
+ "dev": true,
+ "requires": {
+ "async-exit-hook": "^2.0.1",
+ "fs-extra": "^10.0.0"
+ },
+ "dependencies": {
+ "fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ }
+ }
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
+ "dev": true
+ },
+ "tinybench": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.3.1.tgz",
+ "integrity": "sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==",
+ "dev": true
+ },
+ "tinypool": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.3.1.tgz",
+ "integrity": "sha512-zLA1ZXlstbU2rlpA4CIeVaqvWq41MTWqLY3FfsAXgC8+f7Pk7zroaJQxDgxn1xNudKW6Kmj4808rPFShUlIRmQ==",
+ "dev": true
+ },
+ "tinyspy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-1.0.2.tgz",
+ "integrity": "sha512-bSGlgwLBYf7PnUsQ6WOc6SJ3pGOcd+d8AA6EUnLDDM0kWEstC1JIlSZA3UNliDXhd9ABoS7hiRBDCu+XP/sf1Q==",
+ "dev": true
+ },
+ "tmp": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+ "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+ "dev": true,
+ "requires": {
+ "rimraf": "^3.0.0"
+ }
+ },
+ "tmp-promise": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz",
+ "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==",
+ "dev": true,
+ "requires": {
+ "tmp": "^0.2.0"
+ }
+ },
+ "to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "dev": true
+ },
+ "to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "totalist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
+ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+ "dev": true
+ },
+ "tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
+ "dev": true
+ },
+ "tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="
+ },
+ "truncate-utf8-bytes": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz",
+ "integrity": "sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==",
+ "dev": true,
+ "requires": {
+ "utf8-byte-length": "^1.0.1"
+ }
+ },
+ "ts-node": {
+ "version": "10.9.1",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
+ "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
+ "dev": true,
+ "requires": {
+ "@cspotcode/source-map-support": "^0.8.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "v8-compile-cache-lib": "^3.0.1",
+ "yn": "3.1.1"
+ },
+ "dependencies": {
+ "diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "dev": true
+ }
+ }
+ },
+ "tslib": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
+ "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
+ "devOptional": true
+ },
+ "tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "requires": {
+ "tslib": "^1.8.1"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ }
+ }
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true
+ },
+ "type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true
+ },
+ "typed-emitter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz",
+ "integrity": "sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA==",
+ "requires": {
+ "rxjs": "*"
+ }
+ },
+ "typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "devOptional": true
+ },
+ "ufo": {
+ "version": "0.8.5",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-0.8.5.tgz",
+ "integrity": "sha512-e4+UtA5IRO+ha6hYklwj6r7BjiGMxS0O+UaSg9HbaTefg4kMkzj4tXzEBajRR+wkxf+golgAWKzLbytCUDMJAA==",
+ "dev": true
+ },
+ "unconfig": {
+ "version": "0.3.11",
+ "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.3.11.tgz",
+ "integrity": "sha512-bV/nqePAKv71v3HdVUn6UefbsDKQWRX+bJIkiSm0+twIds6WiD2bJLWWT3i214+J/B4edufZpG2w7Y63Vbwxow==",
+ "dev": true,
+ "requires": {
+ "@antfu/utils": "^0.7.6",
+ "defu": "^6.1.2",
+ "jiti": "^1.20.0",
+ "mlly": "^1.4.2"
+ },
+ "dependencies": {
+ "mlly": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz",
+ "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.10.0",
+ "pathe": "^1.1.1",
+ "pkg-types": "^1.0.3",
+ "ufo": "^1.3.0"
+ }
+ },
+ "pathe": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz",
+ "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==",
+ "dev": true
+ },
+ "pkg-types": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz",
+ "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==",
+ "dev": true,
+ "requires": {
+ "jsonc-parser": "^3.2.0",
+ "mlly": "^1.2.0",
+ "pathe": "^1.1.0"
+ }
+ },
+ "ufo": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz",
+ "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==",
+ "dev": true
+ }
+ }
+ },
+ "unimport": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.4.0.tgz",
+ "integrity": "sha512-M/lfFEgufIT156QAr/jWHLUn55kEmxBBiQsMxvRSIbquwmeJEyQYgshHDEvQDWlSJrVOOTAgnJ3FvlsrpGkanA==",
+ "dev": true,
+ "requires": {
+ "@rollup/pluginutils": "^5.0.4",
+ "escape-string-regexp": "^5.0.0",
+ "fast-glob": "^3.3.1",
+ "local-pkg": "^0.4.3",
+ "magic-string": "^0.30.3",
+ "mlly": "^1.4.2",
+ "pathe": "^1.1.1",
+ "pkg-types": "^1.0.3",
+ "scule": "^1.0.0",
+ "strip-literal": "^1.3.0",
+ "unplugin": "^1.5.0"
+ },
+ "dependencies": {
+ "escape-string-regexp": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
+ "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
+ "dev": true
+ },
+ "magic-string": {
+ "version": "0.30.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
+ "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ }
+ },
+ "mlly": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.2.tgz",
+ "integrity": "sha512-i/Ykufi2t1EZ6NaPLdfnZk2AX8cs0d+mTzVKuPfqPKPatxLApaBoxJQ9x1/uckXtrS/U5oisPMDkNs0yQTaBRg==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.10.0",
+ "pathe": "^1.1.1",
+ "pkg-types": "^1.0.3",
+ "ufo": "^1.3.0"
+ }
+ },
+ "pathe": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz",
+ "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==",
+ "dev": true
+ },
+ "pkg-types": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz",
+ "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==",
+ "dev": true,
+ "requires": {
+ "jsonc-parser": "^3.2.0",
+ "mlly": "^1.2.0",
+ "pathe": "^1.1.0"
+ }
+ },
+ "ufo": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.1.tgz",
+ "integrity": "sha512-uY/99gMLIOlJPwATcMVYfqDSxUR9//AUcgZMzwfSTJPDKzA1S8mX4VLqa+fiAtveraQUBCz4FFcwVZBGbwBXIw==",
+ "dev": true
+ },
+ "unplugin": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.0.tgz",
+ "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.10.0",
+ "chokidar": "^3.5.3",
+ "webpack-sources": "^3.2.3",
+ "webpack-virtual-modules": "^0.5.0"
+ }
+ },
+ "webpack-virtual-modules": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
+ "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
+ "dev": true
+ }
+ }
+ },
+ "universalify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
+ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
+ },
+ "unocss": {
+ "version": "0.51.13",
+ "resolved": "https://registry.npmjs.org/unocss/-/unocss-0.51.13.tgz",
+ "integrity": "sha512-EAhuQ97D7E+EsTdlCL+xoWEsvz46Se9ZAtHhJ+1W+DzMky9qrDLRyR8Caf2TPbz8dw/z0qYhoPr6/aJARG4r0g==",
+ "dev": true,
+ "requires": {
+ "@unocss/astro": "0.51.13",
+ "@unocss/cli": "0.51.13",
+ "@unocss/core": "0.51.13",
+ "@unocss/extractor-arbitrary-variants": "0.51.13",
+ "@unocss/postcss": "0.51.13",
+ "@unocss/preset-attributify": "0.51.13",
+ "@unocss/preset-icons": "0.51.13",
+ "@unocss/preset-mini": "0.51.13",
+ "@unocss/preset-tagify": "0.51.13",
+ "@unocss/preset-typography": "0.51.13",
+ "@unocss/preset-uno": "0.51.13",
+ "@unocss/preset-web-fonts": "0.51.13",
+ "@unocss/preset-wind": "0.51.13",
+ "@unocss/reset": "0.51.13",
+ "@unocss/transformer-attributify-jsx": "0.51.13",
+ "@unocss/transformer-attributify-jsx-babel": "0.51.13",
+ "@unocss/transformer-compile-class": "0.51.13",
+ "@unocss/transformer-directives": "0.51.13",
+ "@unocss/transformer-variant-group": "0.51.13",
+ "@unocss/vite": "0.51.13"
+ }
+ },
+ "unplugin": {
+ "version": "0.10.2",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-0.10.2.tgz",
+ "integrity": "sha512-6rk7GUa4ICYjae5PrAllvcDeuT8pA9+j5J5EkxbMFaV+SalHhxZ7X2dohMzu6C3XzsMT+6jwR/+pwPNR3uK9MA==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.8.0",
+ "chokidar": "^3.5.3",
+ "webpack-sources": "^3.2.3",
+ "webpack-virtual-modules": "^0.4.5"
+ }
+ },
+ "unplugin-auto-expose": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/unplugin-auto-expose/-/unplugin-auto-expose-0.0.4.tgz",
+ "integrity": "sha512-TMkcJll/FODZW3+O/H/caZg+C5TUdMgu20xvB/YKqVpGjpbxaInSlAZrcKh8ifpCY6V+aMKQ4ubiEVJ87Otlog==",
+ "dev": true,
+ "requires": {
+ "magic-string": "^0.26.7",
+ "mlly": "0.5.16",
+ "unplugin": "0.10.2"
+ },
+ "dependencies": {
+ "magic-string": {
+ "version": "0.26.7",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz",
+ "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==",
+ "dev": true,
+ "requires": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ }
+ }
+ },
+ "unplugin-auto-import": {
+ "version": "0.15.3",
+ "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.15.3.tgz",
+ "integrity": "sha512-RLT8SqbPn4bT7yBshZId0uPSofKWnwr66RyDaxWaFb/+f7OTDOWAsVNz+hOQLBWSjvbekr2xZY9ccS8TDHJbCQ==",
+ "dev": true,
+ "requires": {
+ "@antfu/utils": "^0.7.2",
+ "@rollup/pluginutils": "^5.0.2",
+ "local-pkg": "^0.4.3",
+ "magic-string": "^0.30.0",
+ "minimatch": "^9.0.0",
+ "unimport": "^3.0.6",
+ "unplugin": "^1.3.1"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "magic-string": {
+ "version": "0.30.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
+ "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ }
+ },
+ "minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ },
+ "unplugin": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.0.tgz",
+ "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.10.0",
+ "chokidar": "^3.5.3",
+ "webpack-sources": "^3.2.3",
+ "webpack-virtual-modules": "^0.5.0"
+ }
+ },
+ "webpack-virtual-modules": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
+ "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
+ "dev": true
+ }
+ }
+ },
+ "unplugin-vue-components": {
+ "version": "0.24.1",
+ "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.24.1.tgz",
+ "integrity": "sha512-T3A8HkZoIE1Cja95xNqolwza0yD5IVlgZZ1PVAGvVCx8xthmjsv38xWRCtHtwl+rvZyL9uif42SRkDGw9aCfMA==",
+ "dev": true,
+ "requires": {
+ "@antfu/utils": "^0.7.2",
+ "@rollup/pluginutils": "^5.0.2",
+ "chokidar": "^3.5.3",
+ "debug": "^4.3.4",
+ "fast-glob": "^3.2.12",
+ "local-pkg": "^0.4.3",
+ "magic-string": "^0.30.0",
+ "minimatch": "^7.4.2",
+ "resolve": "^1.22.1",
+ "unplugin": "^1.1.0"
+ },
+ "dependencies": {
+ "brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "magic-string": {
+ "version": "0.30.5",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz",
+ "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==",
+ "dev": true,
+ "requires": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ }
+ },
+ "minimatch": {
+ "version": "7.4.6",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz",
+ "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^2.0.1"
+ }
+ },
+ "unplugin": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.0.tgz",
+ "integrity": "sha512-9ZdRwbh/4gcm1JTOkp9lAkIDrtOyOxgHmY7cjuwI8L/2RTikMcVG25GsZwNAgRuap3iDw2jeq7eoqtAsz5rW3A==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.10.0",
+ "chokidar": "^3.5.3",
+ "webpack-sources": "^3.2.3",
+ "webpack-virtual-modules": "^0.5.0"
+ }
+ },
+ "webpack-virtual-modules": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
+ "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
+ "dev": true
+ }
+ }
+ },
+ "update-browserslist-db": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+ "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+ "requires": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ }
+ },
+ "upper-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz",
+ "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==",
+ "dev": true,
+ "requires": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "upper-case-first": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz",
+ "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==",
+ "dev": true,
+ "requires": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "utf8-byte-length": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz",
+ "integrity": "sha512-4+wkEYLBbWxqTahEsWrhxepcoVOJ+1z5PGIjPZxRkytcdSUaNjIjBM7Xn8E+pdSuV7SzvWovBFA54FO0JSoqhA==",
+ "dev": true
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
+ "dev": true
+ },
+ "v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "dev": true
+ },
+ "verror": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz",
+ "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "vite": {
+ "version": "4.4.11",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.11.tgz",
+ "integrity": "sha512-ksNZJlkcU9b0lBwAGZGGaZHCMqHsc8OpgtoYhsQ4/I2v5cnpmmmqe5pM4nv/4Hn6G/2GhTdj0DhZh2e+Er1q5A==",
+ "dev": true,
+ "requires": {
+ "esbuild": "^0.18.10",
+ "fsevents": "~2.3.2",
+ "postcss": "^8.4.27",
+ "rollup": "^3.27.1"
+ }
+ },
+ "vite-node": {
+ "version": "0.29.3",
+ "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.29.3.tgz",
+ "integrity": "sha512-QYzYSA4Yt2IiduEjYbccfZQfxKp+T1Do8/HEpSX/G5WIECTFKJADwLs9c94aQH4o0A+UtCKU61lj1m5KvbxxQA==",
+ "dev": true,
+ "requires": {
+ "cac": "^6.7.14",
+ "debug": "^4.3.4",
+ "mlly": "^1.1.0",
+ "pathe": "^1.1.0",
+ "picocolors": "^1.0.0",
+ "vite": "^3.0.0 || ^4.0.0"
+ },
+ "dependencies": {
+ "mlly": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.1.0.tgz",
+ "integrity": "sha512-cwzBrBfwGC1gYJyfcy8TcZU1f+dbH/T+TuOhtYP2wLv/Fb51/uV7HJQfBPtEupZ2ORLRU1EKFS/QfS3eo9+kBQ==",
+ "dev": true,
+ "requires": {
+ "acorn": "^8.8.1",
+ "pathe": "^1.0.0",
+ "pkg-types": "^1.0.1",
+ "ufo": "^1.0.1"
+ }
+ },
+ "pathe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz",
+ "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==",
+ "dev": true
+ },
+ "pkg-types": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.1.tgz",
+ "integrity": "sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==",
+ "dev": true,
+ "requires": {
+ "jsonc-parser": "^3.2.0",
+ "mlly": "^1.0.0",
+ "pathe": "^1.0.0"
+ }
+ },
+ "ufo": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.0.1.tgz",
+ "integrity": "sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==",
+ "dev": true
+ }
+ }
+ },
+ "vite-plugin-style-import": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/vite-plugin-style-import/-/vite-plugin-style-import-2.0.0.tgz",
+ "integrity": "sha512-qtoHQae5dSUQPo/rYz/8p190VU5y19rtBaeV7ryLa/AYAU/e9CG89NrN/3+k7MR8mJy/GPIu91iJ3zk9foUOSA==",
+ "dev": true,
+ "requires": {
+ "@rollup/pluginutils": "^4.1.2",
+ "change-case": "^4.1.2",
+ "console": "^0.7.2",
+ "es-module-lexer": "^0.9.3",
+ "fs-extra": "^10.0.0",
+ "magic-string": "^0.25.7",
+ "pathe": "^0.2.0"
+ },
+ "dependencies": {
+ "@rollup/pluginutils": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
+ "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
+ "dev": true,
+ "requires": {
+ "estree-walker": "^2.0.1",
+ "picomatch": "^2.2.2"
+ }
+ },
+ "fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ }
+ },
+ "pathe": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz",
+ "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==",
+ "dev": true
+ }
+ }
+ },
+ "vitest": {
+ "version": "0.29.3",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.29.3.tgz",
+ "integrity": "sha512-muMsbXnZsrzDGiyqf/09BKQsGeUxxlyLeLK/sFFM4EXdURPQRv8y7dco32DXaRORYP0bvyN19C835dT23mL0ow==",
+ "dev": true,
+ "requires": {
+ "@types/chai": "^4.3.4",
+ "@types/chai-subset": "^1.3.3",
+ "@types/node": "*",
+ "@vitest/expect": "0.29.3",
+ "@vitest/runner": "0.29.3",
+ "@vitest/spy": "0.29.3",
+ "@vitest/utils": "0.29.3",
+ "acorn": "^8.8.1",
+ "acorn-walk": "^8.2.0",
+ "cac": "^6.7.14",
+ "chai": "^4.3.7",
+ "debug": "^4.3.4",
+ "local-pkg": "^0.4.2",
+ "pathe": "^1.1.0",
+ "picocolors": "^1.0.0",
+ "source-map": "^0.6.1",
+ "std-env": "^3.3.1",
+ "strip-literal": "^1.0.0",
+ "tinybench": "^2.3.1",
+ "tinypool": "^0.3.1",
+ "tinyspy": "^1.0.2",
+ "vite": "^3.0.0 || ^4.0.0",
+ "vite-node": "0.29.3",
+ "why-is-node-running": "^2.2.2"
+ },
+ "dependencies": {
+ "pathe": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.0.tgz",
+ "integrity": "sha512-ODbEPR0KKHqECXW1GoxdDb+AZvULmXjVPy4rt+pGo2+TnjJTIPJQSVS6N63n8T2Ip+syHhbn52OewKicV0373w==",
+ "dev": true
+ }
+ }
+ },
+ "vue": {
+ "version": "3.2.47",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.47.tgz",
+ "integrity": "sha512-60188y/9Dc9WVrAZeUVSDxRQOZ+z+y5nO2ts9jWXSTkMvayiWxCWOWtBQoYjLeccfXkiiPZWAHcV+WTPhkqJHQ==",
+ "requires": {
+ "@vue/compiler-dom": "3.2.47",
+ "@vue/compiler-sfc": "3.2.47",
+ "@vue/runtime-dom": "3.2.47",
+ "@vue/server-renderer": "3.2.47",
+ "@vue/shared": "3.2.47"
+ }
+ },
+ "vue-eslint-parser": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.0.2.tgz",
+ "integrity": "sha512-uCPQwTGjOtAYrwnU+76pYxalhjsh7iFBsHwBqDHiOPTxtICDaraO4Szw54WFTNZTAEsgHHzqFOu1mmnBOBRzDA==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.3.4",
+ "eslint-scope": "^7.1.1",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.1",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^7.3.6"
+ },
+ "dependencies": {
+ "eslint-scope": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz",
+ "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ }
+ },
+ "estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true
+ }
+ }
+ },
+ "vue-i18n": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.5.0.tgz",
+ "integrity": "sha512-NiI3Ph1qMstNf7uhYh8trQBOBFLxeJgcOxBq51pCcZ28Vs18Y7BDS58r8HGDKCYgXdLUYqPDXdKatIF4bvBVZg==",
+ "requires": {
+ "@intlify/core-base": "9.5.0",
+ "@intlify/shared": "9.5.0",
+ "@vue/devtools-api": "^6.5.0"
+ },
+ "dependencies": {
+ "@intlify/shared": {
+ "version": "9.5.0",
+ "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.5.0.tgz",
+ "integrity": "sha512-tAxV14LMXZDZbu32XzLMTsowNlgJNmLwWHYzvMUl6L8gvQeoYiZONjY7AUsqZW8TOZDX9lfvF6adPkk9FSRdDA=="
+ }
+ }
+ },
+ "vue-router": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz",
+ "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==",
+ "requires": {
+ "@vue/devtools-api": "^6.5.0"
+ }
+ },
+ "vue-template-compiler": {
+ "version": "2.7.14",
+ "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz",
+ "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==",
+ "dev": true,
+ "requires": {
+ "de-indent": "^1.0.2",
+ "he": "^1.2.0"
+ }
+ },
+ "vue-tsc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.2.0.tgz",
+ "integrity": "sha512-rIlzqdrhyPYyLG9zxsVRa+JEseeS9s8F2BbVVVWRRsTZvJO2BbhLEb2HW3MY+DFma0378tnIqs+vfTzbcQtRFw==",
+ "dev": true,
+ "requires": {
+ "@volar/vue-language-core": "1.2.0",
+ "@volar/vue-typescript": "1.2.0"
+ }
+ },
+ "vue-types": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/vue-types/-/vue-types-5.1.1.tgz",
+ "integrity": "sha512-FMY/JCLWePXgGIcMDqYdJsQm1G0CDxEjq6W0+tZMJZlX37q/61eSGSIa/XFRwa9T7kkKXuxxl94/2kgxyWQqKw==",
+ "dev": true,
+ "requires": {
+ "is-plain-object": "5.0.0"
+ }
+ },
+ "webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "dev": true
+ },
+ "webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "dev": true
+ },
+ "webpack-virtual-modules": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz",
+ "integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==",
+ "dev": true
+ },
+ "whatwg-encoding": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+ "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+ "dev": true,
+ "requires": {
+ "iconv-lite": "0.6.3"
+ }
+ },
+ "whatwg-mimetype": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
+ "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
+ "dev": true
+ },
+ "whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+ "dev": true,
+ "requires": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ },
+ "dependencies": {
+ "webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
+ "dev": true
+ }
+ }
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "why-is-node-running": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz",
+ "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==",
+ "dev": true,
+ "requires": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ }
+ },
+ "word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "xml-name-validator": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "dev": true
+ },
+ "xmlbuilder": {
+ "version": "15.1.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
+ "integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
+ "dev": true
+ },
+ "y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true
+ },
+ "yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+ },
+ "yaml": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz",
+ "integrity": "sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ=="
+ },
+ "yaml-eslint-parser": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/yaml-eslint-parser/-/yaml-eslint-parser-0.3.2.tgz",
+ "integrity": "sha512-32kYO6kJUuZzqte82t4M/gB6/+11WAuHiEnK7FreMo20xsCKPeFH5tDBU7iWxR7zeJpNnMXfJyXwne48D0hGrg==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.3.0",
+ "lodash": "^4.17.20",
+ "yaml": "^1.10.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ },
+ "yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "dev": true
+ }
+ }
+ },
+ "yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "requires": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ }
+ },
+ "yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true
+ },
+ "yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "dev": true,
+ "requires": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
+ "yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "dev": true
+ },
+ "yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true
+ }
+ }
+}
diff --git a/webapp/package.json b/webapp/package.json
new file mode 100644
index 0000000..2f6491b
--- /dev/null
+++ b/webapp/package.json
@@ -0,0 +1,87 @@
+{
+ "name": "aas",
+ "description": "ArisuAutoSweeper desktop app",
+ "version": "0.4.0",
+ "private": true,
+ "main": "packages/main/dist/index.cjs",
+ "scripts": {
+ "build": "npm run build:main && npm run build:preload && npm run build:renderer",
+ "build:main": "cd ./packages/main && vite build",
+ "build:preload": "cd ./packages/preload && vite build",
+ "build:renderer": "cd ./packages/renderer && vite build",
+ "compile": "cross-env MODE=production npm run build && electron-builder build --config .electron-builder.config.js --dir",
+ "test": "npm run test:main && npm run test:preload && npm run test:renderer && npm run test:e2e",
+ "test:e2e": "npm run build && vitest run",
+ "test:main": "vitest run -r packages/main --passWithNoTests",
+ "test:preload": "vitest run -r packages/preload --passWithNoTests",
+ "test:renderer": "vitest run -r packages/renderer --passWithNoTests",
+ "watch": "node scripts/watch.mjs",
+ "lint": "eslint . --ext js,mjs,cjs,ts,mts,cts,vue",
+ "typecheck:main": "tsc --noEmit -p packages/main/tsconfig.json",
+ "typecheck:preload": "tsc --noEmit -p packages/preload/tsconfig.json",
+ "typecheck:renderer": "vue-tsc --noEmit -p packages/renderer/tsconfig.json",
+ "typecheck": "npm run typecheck:main && npm run typecheck:preload && npm run typecheck:renderer",
+ "postinstall": "cross-env ELECTRON_RUN_AS_NODE=1 electron scripts/update-electron-vendors.mjs",
+ "format": "npx prettier --write \"**/*.{js,mjs,cjs,ts,mts,cts,vue,json}\""
+ },
+ "devDependencies": {
+ "@arco-design/web-vue": "^2.45.2",
+ "@arco-plugins/vite-vue": "^1.4.5",
+ "@arco-themes/vue-am-alas": "^0.0.1",
+ "@intlify/unplugin-vue-i18n": "^0.10.0",
+ "@types/fs-extra": "^11.0.1",
+ "@types/lodash-es": "^4.17.7",
+ "@types/node": "18.15.3",
+ "@typescript-eslint/eslint-plugin": "5.55.0",
+ "@typescript-eslint/parser": "^5.58.0",
+ "@vitejs/plugin-vue": "4.0.0",
+ "@vue/test-utils": "2.3.1",
+ "consola": "^3.1.0",
+ "cross-env": "7.0.3",
+ "electron": "^22.3.27",
+ "electron-builder": "^24.6.4",
+ "eslint": "8.36.0",
+ "eslint-config-prettier": "^8.8.0",
+ "eslint-plugin-prettier": "^4.2.1",
+ "eslint-plugin-vue": "9.9.0",
+ "happy-dom": "8.9.0",
+ "less": "^4.1.3",
+ "nano-staged": "0.8.0",
+ "playwright": "1.31.2",
+ "prettier": "^2.8.7",
+ "prettier-eslint": "^15.0.1",
+ "simple-git-hooks": "2.8.1",
+ "ts-node": "^10.9.1",
+ "typescript": "4.9.5",
+ "unocss": "^0.51.8",
+ "unplugin-auto-expose": "0.0.4",
+ "unplugin-auto-import": "^0.15.3",
+ "unplugin-vue-components": "^0.24.1",
+ "vite": "^4.3.1",
+ "vite-plugin-style-import": "^2.0.0",
+ "vitest": "0.29.3",
+ "vue": "^3.2.47",
+ "vue-tsc": "1.2.0",
+ "vue-types": "^5.0.2"
+ },
+ "dependencies": {
+ "@ant-design/icons-vue": "^6.1.0",
+ "@vueuse/core": "^10.0.2",
+ "autoprefixer": "^10.4.14",
+ "dayjs": "^1.11.7",
+ "electron-log": "^4.4.8",
+ "electron-updater": "5.3.0",
+ "fast-glob": "^3.2.12",
+ "fs-extra": "^11.1.1",
+ "lodash-es": "^4.17.21",
+ "mustache": "^4.2.0",
+ "nanoid": "^4.0.2",
+ "pinia": "^2.0.34",
+ "postcss": "^8.4.21",
+ "python-shell": "^5.0.0",
+ "tree-kill": "^1.2.2",
+ "vue-i18n": "^9.2.2",
+ "vue-router": "^4.1.6",
+ "yaml": "^2.2.1"
+ }
+}
diff --git a/webapp/packages/common/constant/config.ts b/webapp/packages/common/constant/config.ts
new file mode 100644
index 0000000..37a5d1b
--- /dev/null
+++ b/webapp/packages/common/constant/config.ts
@@ -0,0 +1,28 @@
+export const ALAS_CONFIG_YAML = 'deploy.yaml';
+export const ALAS_CONFIG_TEMPLATE_YAML = 'deploy.template.yaml';
+export const ALAS_CONFIG_TEST_TEMPLATE_YAML = 'deploy.test.template.yaml';
+export const ALAS_INSTR_FILE = 'installer.py';
+export const ALAS_RELAUNCH_ARGV = '--relaunch';
+
+export const RepositoryMap = {
+ china: 'cn',
+ global: 'global',
+};
+
+export const GitExecutableMap = {
+ windows: './toolkit/Git/mingw64/bin/git.exe',
+ macos: '/usr/bin/git',
+ linux: '/usr/bin/git',
+};
+
+export const AdbExecutableMap = {
+ windows: './toolkit/Lib/site-packages/adbutils/binaries/adb.exe',
+ macos: '/usr/bin/adb',
+ linux: '/usr/bin/adb',
+};
+
+export const PythonExecutableMap = {
+ windows: './toolkit/python.exe',
+ macos: '/usr/bin/python',
+ linux: '/usr/bin/python',
+};
diff --git a/webapp/packages/common/constant/eventNames.ts b/webapp/packages/common/constant/eventNames.ts
new file mode 100644
index 0000000..f09579b
--- /dev/null
+++ b/webapp/packages/common/constant/eventNames.ts
@@ -0,0 +1,9 @@
+export const UPDATE_APP = 'Update app.asar';
+export const ALAS_LOG = 'alas-log';
+export const ALAS_CONFIG = 'alas-config';
+export const WINDOW_READY = 'window-ready';
+export const INSTALLER_READY = 'installer-ready';
+export const ALAS_READY = 'alas-config-path';
+export const ELECTRON_THEME = 'electron-theme';
+
+export const PAGE_ERROR = 'page-error';
diff --git a/webapp/packages/common/constant/theme.ts b/webapp/packages/common/constant/theme.ts
new file mode 100644
index 0000000..c94f2ab
--- /dev/null
+++ b/webapp/packages/common/constant/theme.ts
@@ -0,0 +1,10 @@
+export const ThemeObj: {[k in string]: 'light' | 'dark'} = {
+ default: 'light',
+ light: 'light',
+ dark: 'dark',
+};
+
+export const AlasGuiTheme = {
+ light: 'default',
+ dark: 'dark',
+};
diff --git a/webapp/packages/common/utils/checkIsFirst.ts b/webapp/packages/common/utils/checkIsFirst.ts
new file mode 100644
index 0000000..8da0d99
--- /dev/null
+++ b/webapp/packages/common/utils/checkIsFirst.ts
@@ -0,0 +1,13 @@
+import getAlasABSPath from './getAlasABSPath';
+import fs from 'fs';
+import {join} from 'path';
+import {ALAS_CONFIG_TEMPLATE_YAML, ALAS_CONFIG_TEST_TEMPLATE_YAML} from '../constant/config';
+export function checkIsFirst(): boolean {
+ const absPath = getAlasABSPath();
+ return fs.existsSync(
+ join(
+ absPath,
+ `/config/${import.meta.env.DEV ? ALAS_CONFIG_TEST_TEMPLATE_YAML : ALAS_CONFIG_TEMPLATE_YAML}`,
+ ),
+ );
+}
diff --git a/webapp/packages/common/utils/copyFilesToDir.ts b/webapp/packages/common/utils/copyFilesToDir.ts
new file mode 100644
index 0000000..82d05fd
--- /dev/null
+++ b/webapp/packages/common/utils/copyFilesToDir.ts
@@ -0,0 +1,35 @@
+import type {CopyOptions} from 'fs-extra';
+import fsExtra from 'fs-extra';
+import {join, sep, normalize} from 'path';
+
+export interface CopyToDirOptions {
+ successCallback?: (pathStr: string) => void;
+ filedCallback?: (pathStr: string, error: any) => void;
+ fsExtraOptions?: CopyOptions;
+}
+
+/**
+ *
+ * @param pathList
+ * @param targetDirPath
+ * @param options
+ */
+export async function copyFilesToDir(
+ pathList: string[],
+ targetDirPath: string,
+ options?: CopyToDirOptions | undefined,
+) {
+ const {fsExtraOptions, successCallback, filedCallback} = options || {};
+ for (const pathStr of pathList) {
+ try {
+ await fsExtra.copy(
+ pathStr,
+ join(normalize(targetDirPath) + sep + pathStr.split(sep).pop()),
+ fsExtraOptions,
+ );
+ successCallback?.(pathStr);
+ } catch (err) {
+ filedCallback?.(pathStr, err);
+ }
+ }
+}
diff --git a/webapp/packages/common/utils/env.ts b/webapp/packages/common/utils/env.ts
new file mode 100644
index 0000000..1fe4e02
--- /dev/null
+++ b/webapp/packages/common/utils/env.ts
@@ -0,0 +1,3 @@
+export const isWindows = process.platform === 'win32';
+export const isMacintosh = process.platform === 'darwin';
+export const isLinux = process.platform === 'linux';
diff --git a/webapp/packages/common/utils/getAlasABSPath.ts b/webapp/packages/common/utils/getAlasABSPath.ts
new file mode 100644
index 0000000..b53897d
--- /dev/null
+++ b/webapp/packages/common/utils/getAlasABSPath.ts
@@ -0,0 +1,72 @@
+import {app} from 'electron';
+import {isMacintosh} from './env';
+import fs from 'fs';
+/**
+ * Get the absolute path of the project root directory
+ * @param files
+ * @param rootName
+ */
+const getAlasABSPath = (
+ files: string[] = ['**/config/deploy.yaml', '**/config/deploy.template.yaml'],
+ rootName: string | string[] = ['AzurLaneAutoScript', 'Alas', 'StarRailCopilot'],
+) => {
+ const path = require('path');
+ const sep = path.sep;
+ const fg = require('fast-glob');
+ let appAbsPath = process.cwd();
+ if (isMacintosh && import.meta.env.PROD) {
+ appAbsPath = app?.getAppPath() || process.execPath;
+ }
+
+ while (fs.lstatSync(appAbsPath).isFile()) {
+ appAbsPath = appAbsPath.split(sep).slice(0, -1).join(sep);
+ }
+
+ let alasABSPath = '';
+
+ let hasRootName = false;
+
+ if (typeof rootName === 'string') {
+ hasRootName = appAbsPath.includes(rootName);
+ } else if (Array.isArray(rootName)) {
+ hasRootName = rootName.some(item =>
+ appAbsPath.toLocaleLowerCase().includes(item.toLocaleLowerCase()),
+ );
+ }
+
+ if (hasRootName) {
+ const appAbsPathArr = appAbsPath.split(sep);
+ let flag = false;
+ while (hasRootName && !flag) {
+ const entries = fg.sync(files, {
+ dot: true,
+ cwd: appAbsPathArr.join(sep) as string,
+ });
+ if (entries.length > 0) {
+ flag = true;
+ alasABSPath = appAbsPathArr.join(sep);
+ }
+ appAbsPathArr.pop();
+ }
+ } else {
+ let step = 4;
+ const appAbsPathArr = appAbsPath.split(sep);
+ let flag = false;
+ while (step > 0 && !flag) {
+ appAbsPathArr.pop();
+ const entries = fg.sync(files, {
+ dot: true,
+ cwd: appAbsPathArr.join(sep) as string,
+ });
+ if (entries.length > 0) {
+ flag = true;
+ alasABSPath = appAbsPathArr.join(sep);
+ }
+ step--;
+ }
+ }
+
+ return alasABSPath.endsWith(sep) ? alasABSPath : alasABSPath + sep;
+};
+
+export default getAlasABSPath;
diff --git a/webapp/packages/common/utils/index.ts b/webapp/packages/common/utils/index.ts
new file mode 100644
index 0000000..a56b5b8
--- /dev/null
+++ b/webapp/packages/common/utils/index.ts
@@ -0,0 +1,7 @@
+import getAlasABSPath from './getAlasABSPath';
+import {checkIsFirst} from './checkIsFirst';
+import {copyFilesToDir} from './copyFilesToDir';
+import {modifyYaml} from './modifyYaml';
+import {isMacintosh, isLinux, isWindows} from './env';
+
+export {getAlasABSPath, checkIsFirst, copyFilesToDir, modifyYaml, isWindows, isLinux, isMacintosh};
diff --git a/webapp/packages/common/utils/modifyYaml.ts b/webapp/packages/common/utils/modifyYaml.ts
new file mode 100644
index 0000000..b5bfa84
--- /dev/null
+++ b/webapp/packages/common/utils/modifyYaml.ts
@@ -0,0 +1,25 @@
+import type {Pair} from 'yaml';
+import {parseDocument, visit} from 'yaml';
+
+const fs = require('fs');
+/**
+ * Modify yaml file https://eemeli.org/yaml/#modifying-nodes
+ * @param filePath
+ * @param keyObj
+ */
+export function modifyYaml(filePath: string, keyObj: {[k in string]: any}) {
+ try {
+ const doc = parseDocument(fs.readFileSync(filePath, 'utf8'));
+ const keysMap = new Map(Object.entries(keyObj));
+ visit(doc, {
+ Pair: (_node, pair: Pair) => {
+ if (keysMap.has(pair?.key?.value)) {
+ pair.value.value = keysMap.get(pair.key.value);
+ }
+ },
+ });
+ fs.writeFileSync(filePath, doc.toString(), 'utf8');
+ } catch (e) {
+ console.error(e);
+ }
+}
diff --git a/webapp/packages/common/utils/validate.ts b/webapp/packages/common/utils/validate.ts
new file mode 100644
index 0000000..d5d5dab
--- /dev/null
+++ b/webapp/packages/common/utils/validate.ts
@@ -0,0 +1,51 @@
+import fsExtra from 'fs-extra';
+import {join} from 'path';
+import {
+ AdbExecutableMap,
+ ALAS_CONFIG_TEMPLATE_YAML,
+ ALAS_CONFIG_YAML,
+ GitExecutableMap,
+ PythonExecutableMap,
+ RepositoryMap,
+} from '../constant/config';
+// eslint-disable-next-line @typescript-eslint/ban-ts-comment
+// @ts-ignore
+import mustache from 'mustache';
+import {isMacintosh} from './env';
+import {app} from 'electron';
+
+/**
+ * 校验配置文件是否存在 不存在则根据系统版本,语言环境进行创建
+ * @param dirPath
+ */
+export function validateConfigFile(dirPath: string) {
+ const targetPath = join(dirPath, ALAS_CONFIG_YAML);
+ const result = fsExtra.existsSync(targetPath);
+ if (result) return true;
+ /**
+ * TODO 创建配置文件
+ */
+ fsExtra.ensureFileSync(targetPath);
+ const resultTpl = fsExtra.existsSync(join(dirPath, ALAS_CONFIG_TEMPLATE_YAML));
+ if (resultTpl) {
+ fsExtra.copyFileSync(join(dirPath, ALAS_CONFIG_TEMPLATE_YAML), join(dirPath, ALAS_CONFIG_YAML));
+ return true;
+ }
+ const tpl = fsExtra.readFileSync('./deploy.yaml.tpl', {encoding: 'utf-8'});
+ const system = isMacintosh ? 'macos' : 'windows';
+ const localCode = app.getLocaleCountryCode().toLocaleLowerCase();
+ let local: 'global' | 'china' = 'global';
+ if (localCode === 'cn') {
+ local = 'china';
+ }
+ const deployTpl = mustache.render(tpl, {
+ repository: RepositoryMap[local],
+ gitExecutable: GitExecutableMap[system],
+ pythonExecutable: PythonExecutableMap[system],
+ adbExecutable: AdbExecutableMap[system],
+ language: local === 'china' ? 'zh-CN' : 'en-US',
+ theme: 'default',
+ });
+ fsExtra.writeFileSync(targetPath, deployTpl, {encoding: 'utf-8'});
+ return true;
+}
diff --git a/webapp/packages/main/public/deploy.yaml.tpl b/webapp/packages/main/public/deploy.yaml.tpl
new file mode 100644
index 0000000..b102059
--- /dev/null
+++ b/webapp/packages/main/public/deploy.yaml.tpl
@@ -0,0 +1,165 @@
+Deploy:
+ Git:
+ # URL of AzurLaneAutoScript repository
+ # [CN user] Use 'cn' to get update from git-over-cdn service
+ # [Other] Use 'global' to get update from https://github.com/LmeSzinc/StarRailCopilot
+ Repository: {{repository}}
+ # Branch of Alas
+ # [Developer] Use 'dev', 'app', etc, to try new features
+ # [Other] Use 'master', the stable branch
+ Branch: master
+ # Filepath of git executable `git.exe`
+ # [Easy installer] Use './toolkit/Git/mingw64/bin/git.exe'
+ # [Other] Use you own git
+ GitExecutable: {{gitExecutable}}
+ # Set git proxy
+ # [CN user] Use your local http proxy (http://127.0.0.1:{port}) or socks5 proxy (socks5://127.0.0.1:{port})
+ # [Other] Use null
+ GitProxy: null
+ # Set SSL Verify
+ # [In most cases] Use true
+ # [Other] Use false to when connected to an untrusted network
+ SSLVerify: true
+ # Update Alas at startup
+ # [In most cases] Use true
+ AutoUpdate: true
+ # Whether to keep local changes during update
+ # User settings, logs and screenshots will be kept, no mather this is true or false
+ # [Developer] Use true, if you modified the code
+ # [Other] Use false
+ KeepLocalChanges: false
+
+ Python:
+ # Filepath of python executable `python.exe`
+ # [Easy installer] Use './toolkit/python.exe'
+ # [Other] Use you own python, and its version should be 3.7.6 64bit
+ PythonExecutable: {{pythonExecutable}}
+ # URL of pypi mirror
+ # [CN user] Use 'https://pypi.tuna.tsinghua.edu.cn/simple' for faster and more stable download
+ # [Other] Use null
+ PypiMirror: null
+ # Install dependencies at startup
+ # [In most cases] Use true
+ InstallDependencies: true
+ # Path to requirements.txt
+ # [In most cases] Use 'requirements.txt'
+ # [In AidLux] Use './deploy/AidLux/{version}/requirements.txt', version is default to 0.92
+ RequirementsFile: requirements.txt
+
+ Adb:
+ # Filepath of ADB executable `adb.exe`
+ # [Easy installer] Use './toolkit/Lib/site-packages/adbutils/binaries/adb.exe'
+ # [Other] Use you own latest ADB, but not the ADB in your emulator
+ AdbExecutable: {{adbExecutable}}
+ # Whether to replace ADB
+ # Chinese emulators (NoxPlayer, LDPlayer, MemuPlayer, MuMuPlayer) use their own ADB, instead of the latest.
+ # Different ADB servers will terminate each other at startup, resulting in disconnection.
+ # For compatibility, we have to replace them all.
+ # This will do:
+ # 1. Terminate current ADB server
+ # 2. Rename ADB from all emulators to *.bak and replace them by the AdbExecutable set above
+ # 3. Brute-force connect to all available emulator instances
+ # [In most cases] Use true
+ # [In few cases] Use false, if you have other programs using ADB.
+ ReplaceAdb: true
+ # Brute-force connect to all available emulator instances
+ # [In most cases] Use true
+ AutoConnect: true
+ # Re-install uiautomator2
+ # [In most cases] Use true
+ InstallUiautomator2: true
+
+ Ocr:
+ # Run Ocr as a service, can reduce memory usage by not import mxnet everytime you start an alas instance
+
+ # Whether to use ocr server
+ # [Default] false
+ UseOcrServer: false
+ # Whether to start ocr server when start GUI
+ # [Default] false
+ StartOcrServer: false
+ # Port of ocr server runs by GUI
+ # [Default] 22268
+ OcrServerPort: 22268
+ # Address of ocr server for alas instance to connect
+ # [Default] 127.0.0.1:22268
+ OcrClientAddress: 127.0.0.1:22268
+
+ Update:
+ # Use auto update and builtin updater feature
+ # This may cause problem https://github.com/LmeSzinc/AzurLaneAutoScript/issues/876
+ EnableReload: true
+ # Check update every X minute
+ # [Disable] 0
+ # [Default] 5
+ CheckUpdateInterval: 5
+ # Scheduled restart time
+ # If there are updates, Alas will automatically restart and update at this time every day
+ # and run all alas instances that running before restarted
+ # [Disable] null
+ # [Default] 03:50
+ AutoRestartTime: 03:50
+
+ Misc:
+ # Enable discord rich presence
+ DiscordRichPresence: false
+
+ RemoteAccess:
+ # Enable remote access (using ssh reverse tunnel serve by https://github.com/wang0618/localshare)
+ # ! You need to set Password below to enable remote access since everyone can access to your alas if they have your url.
+ # See here (http://app.azurlane.cloud/en.html) for more infomation.
+ EnableRemoteAccess: false
+ # Username when login into ssh server
+ # [Default] null (will generate a random one when startup)
+ SSHUser: null
+ # Server to connect
+ # [Default] null
+ # [Format] host:port
+ SSHServer: null
+ # Filepath of SSH executable `ssh.exe`
+ # [Default] ssh (find ssh in system PATH)
+ # If you don't have one, install OpenSSH or download it here (https://github.com/PowerShell/Win32-OpenSSH/releases)
+ SSHExecutable: ssh
+
+ Webui:
+ # --host. Host to listen
+ # [Use IPv6] '::'
+ # [In most cases] Default to '0.0.0.0'
+ WebuiHost: 0.0.0.0
+ # --port. Port to listen
+ # You will be able to access webui via `http://{host}:{port}`
+ # [In most cases] Default to 22367
+ WebuiPort: 22367
+ # Language to use on web ui
+ # 'zh-CN' for Chinese simplified
+ # 'en-US' for English
+ # 'ja-JP' for Japanese
+ # 'zh-TW' for Chinese traditional
+ Language: {{language}}
+ # Theme of web ui
+ # 'default' for light theme
+ # 'dark' for dark theme
+ Theme: {{theme}}
+ # Follow system DPI scaling
+ # [In most cases] true
+ # [In few cases] false to make Alas smaller, if you have a low resolution but high DPI scaling.
+ DpiScaling: true
+ # --key. Password of web ui
+ # Useful when expose Alas to the public network
+ Password: null
+ # --cdn. Use jsdelivr cdn for pywebio static files (css, js).
+ # 'true' for jsdelivr cdn
+ # 'false' for self host cdn (automatically)
+ # 'https://path.to.your/cdn' to use custom cdn
+ CDN: false
+ # --run. Auto-run specified config when startup
+ # 'null' default no specified config
+ # '["alas"]' specified "alas" config
+ # '["alas","alas2"]' specified "alas" "alas2" configs
+ Run: null
+ # To update app.asar
+ # [In most cases] true
+ AppAsarUpdate: true
+ # --no-sandbox. https://github.com/electron/electron/issues/30966
+ # Some Windows systems cannot call the GPU normally for virtualization, and you need to manually turn off sandbox mode
+ NoSandbox: false
diff --git a/webapp/packages/main/public/icon.png b/webapp/packages/main/public/icon.png
new file mode 100644
index 0000000..337a70c
Binary files /dev/null and b/webapp/packages/main/public/icon.png differ
diff --git a/webapp/packages/main/src/addIpcMainListener.ts b/webapp/packages/main/src/addIpcMainListener.ts
new file mode 100644
index 0000000..d8aa5b7
--- /dev/null
+++ b/webapp/packages/main/src/addIpcMainListener.ts
@@ -0,0 +1,49 @@
+import type {CoreService} from '/@/coreService';
+import type {BrowserWindow} from 'electron';
+import {app, ipcMain, nativeTheme} from 'electron';
+import {
+ ELECTRON_THEME,
+ INSTALLER_READY,
+ PAGE_ERROR,
+ WINDOW_READY,
+} from '@common/constant/eventNames';
+import {ThemeObj} from '@common/constant/theme';
+import logger from '/@/logger';
+
+export const addIpcMainListener = async (mainWindow: BrowserWindow, coreService: CoreService) => {
+ // Minimize, maximize, close window.
+ ipcMain.on('window-tray', function () {
+ mainWindow?.hide();
+ });
+ ipcMain.on('window-minimize', function () {
+ mainWindow?.minimize();
+ });
+ ipcMain.on('window-maximize', function () {
+ mainWindow?.isMaximized() ? mainWindow?.restore() : mainWindow?.maximize();
+ });
+ ipcMain.on('window-close', function () {
+ coreService?.kill();
+ mainWindow?.close();
+ app.exit(0);
+ });
+
+ ipcMain.on(WINDOW_READY, async function (_, args) {
+ logger.info('-----WINDOW_READY-----');
+ args && (await coreService.run());
+ });
+
+ ipcMain.on(INSTALLER_READY, function () {
+ logger.info('-----INSTALLER_READY-----');
+ coreService.next();
+ });
+
+ ipcMain.on(ELECTRON_THEME, (_, args) => {
+ logger.info('-----ELECTRON_THEME-----');
+ nativeTheme.themeSource = ThemeObj[args];
+ });
+
+ ipcMain.on(PAGE_ERROR, (_, args) => {
+ logger.info('-----PAGE_ERROR-----');
+ logger.error(args);
+ });
+};
diff --git a/webapp/packages/main/src/config.ts b/webapp/packages/main/src/config.ts
new file mode 100644
index 0000000..15fb030
--- /dev/null
+++ b/webapp/packages/main/src/config.ts
@@ -0,0 +1,85 @@
+import {isMacintosh} from '@common/utils/env';
+import getAlasABSPath from '@common/utils/getAlasABSPath';
+import {ALAS_INSTR_FILE} from '@common/constant/config';
+import {validateConfigFile} from '@common/utils/validate';
+import {join} from 'path';
+import logger from '/@/logger';
+
+const yaml = require('yaml');
+const fs = require('fs');
+const path = require('path');
+
+function getAlasPath() {
+ let file;
+ const currentFilePath = process.cwd();
+ const pathLookup = [
+ // Current
+ './',
+ // Running from AzurLaneAutoScript/toolkit/WebApp/alas.exe
+ '../../',
+ // Running from AzurLaneAutoScript/webapp/dist/win-unpacked/alas.exe
+ '../../../',
+ // Running from `yarn watch`
+ './../',
+ ];
+ for (const i in pathLookup) {
+ file = path.join(currentFilePath, pathLookup[i], './config/deploy.yaml');
+ if (fs.existsSync(file)) {
+ return path.join(currentFilePath, pathLookup[i]);
+ }
+ }
+ for (const i in pathLookup) {
+ file = path.join(currentFilePath, pathLookup[i], './config/deploy.template.yaml');
+ if (fs.existsSync(file)) {
+ return path.join(currentFilePath, pathLookup[i]);
+ }
+ }
+ return currentFilePath;
+}
+
+function getLauncherPath(alasPath: string) {
+ const pathLookup = ['./Alas.exe', './Alas.bat', './deploy/launcher/Alas.bat'];
+ for (const i in pathLookup) {
+ const file = path.join(alasPath, pathLookup[i]);
+ if (fs.existsSync(file)) {
+ return path.join(alasPath, pathLookup[i]);
+ }
+ }
+ return path.join(alasPath, './Alas.exe');
+}
+
+export const alasPath = isMacintosh && import.meta.env.PROD ? getAlasABSPath() : getAlasPath();
+
+try {
+ validateConfigFile(join(alasPath, '/config'));
+} catch (e) {
+ logger.error((e as unknown as any).toString());
+}
+
+const file = fs.readFileSync(path.join(alasPath, './config/deploy.yaml'), 'utf8');
+const config = yaml.parse(file) as DefAlasConfig;
+const PythonExecutable = config.Deploy.Python.PythonExecutable;
+const WebuiPort = config.Deploy.Webui.WebuiPort.toString();
+const Theme = config.Deploy.Webui.Theme;
+
+export const ThemeObj: {[k in string]: 'light' | 'dark'} = {
+ default: 'light',
+ light: 'light',
+ dark: 'dark',
+ system: 'light',
+};
+
+export const pythonPath = path.isAbsolute(PythonExecutable)
+ ? PythonExecutable
+ : path.join(alasPath, PythonExecutable);
+export const installerPath = ALAS_INSTR_FILE;
+export const installerArgs = import.meta.env.DEV ? ['--print-test'] : [];
+export const webuiUrl = `http://127.0.0.1:${WebuiPort}`;
+export const webuiPath = 'gui.py';
+export const webuiArgs = ['--port', WebuiPort, '--electron'];
+export const dpiScaling =
+ Boolean(config.Deploy.Webui.DpiScaling) || config.Deploy.Webui.DpiScaling === undefined;
+
+export const webuiTheme = ThemeObj[Theme] || 'light';
+
+export const noSandbox = config.Deploy.Webui.NoSandbox;
diff --git a/webapp/packages/main/src/coreService.ts b/webapp/packages/main/src/coreService.ts
new file mode 100644
index 0000000..c9fb70d
--- /dev/null
+++ b/webapp/packages/main/src/coreService.ts
@@ -0,0 +1,91 @@
+import type {PyShell} from '/@/pyshell';
+import {createAlas, createInstaller} from '/@/serviceLogic';
+import {ALAS_LOG} from '@common/constant/eventNames';
+import {BrowserWindow} from 'electron';
+import logger from '/@/logger';
+
+export interface CoreServiceOption {
+ appABSPath?: string;
+ isFirstRun?: boolean;
+ theme?: 'light' | 'dark';
+ mainWindow: Electron.BrowserWindow | null;
+}
+
+const defOptions = {
+ appABSPath: '',
+ theme: 'light',
+ isFirstRun: false,
+ mainWindow: BrowserWindow.getAllWindows()[0] || null,
+};
+
+export type CallbackFun = (
+ coreService: CoreService,
+ next: (...args: any[]) => Promise,
+ ...args1: (any | T)[]
+) => Promise;
+
+export class CoreService {
+ public appABSPath: string;
+ public theme = 'light';
+ public mainWindow: Electron.BrowserWindow | null = null;
+ private currentService: PyShell | null = null;
+ private eventQueue: Array = [createInstaller, createAlas];
+ private stepIndex = 0;
+
+ constructor(options?: CoreServiceOption) {
+ const {appABSPath, theme, mainWindow} = Object.assign(defOptions, options || {});
+ this.appABSPath = appABSPath;
+ this.theme = theme;
+ this.mainWindow = mainWindow;
+ }
+
+ async run(...rags: any[]) {
+ logger.info('---------------run---------------');
+ logger.info('stepIndex:' + this.stepIndex);
+ const cb = this.eventQueue[this.stepIndex++];
+ const next = (...rags1: any[]) => {
+ return this.run(...rags1);
+ };
+ try {
+ cb && (this.currentService = await cb(this, next, ...rags));
+ } catch (e) {
+ /**
+ * 1. 事件执行失败,记录日志
+ */
+ logger.error('currentService:' + (e as unknown as any).toString());
+ }
+ return this.curService;
+ }
+
+ async next(...rags: any[]) {
+ return this.run(...rags);
+ }
+
+ get curService() {
+ return this.currentService;
+ }
+
+ onError(e: Error | any) {
+ logger.error(`currentServiceIndex:${this.stepIndex}` + (e as unknown as any).toString());
+ }
+
+ reset() {
+ this.stepIndex = 0;
+ }
+
+ sendLaunchLog(message: string) {
+ if (!this.mainWindow || this.mainWindow.isDestroyed()) return;
+ logger.info(`pyShellLaunch: ${message}`);
+ this.mainWindow?.webContents.send(ALAS_LOG, message);
+ }
+
+ kill(callback?: () => void) {
+ this.curService?.kill(callback || this.cb);
+ }
+
+ cb() {
+ /**
+ *
+ */
+ }
+}
diff --git a/webapp/packages/main/src/createApp.ts b/webapp/packages/main/src/createApp.ts
new file mode 100644
index 0000000..71ca042
--- /dev/null
+++ b/webapp/packages/main/src/createApp.ts
@@ -0,0 +1,67 @@
+import {createMainWindow} from '/@/createMainWindow';
+import {addIpcMainListener} from '/@/addIpcMainListener';
+import {CoreService} from '/@/coreService';
+import logger from '/@/logger';
+import {app, nativeImage, Tray} from 'electron';
+import {join} from 'node:path';
+import {isMacintosh} from '@common/utils';
+export const createApp = async () => {
+ logger.info('-----createApp-----');
+ logger.info('-----createMainWindow-----');
+ const mainWindow = await createMainWindow();
+ const coreService = new CoreService({mainWindow});
+
+ // Hide menu
+ const {Menu} = require('electron');
+ Menu.setApplicationMenu(null);
+ const icon = nativeImage.createFromPath(join(__dirname, './icon.png'));
+ const dockerIcon = icon.resize({width: 16, height: 16});
+ // Tray
+ const tray = new Tray(isMacintosh ? dockerIcon : icon);
+ const contextMenu = Menu.buildFromTemplate([
+ {
+ label: 'Show',
+ click: function () {
+ mainWindow?.show();
+ },
+ },
+ {
+ label: 'Hide',
+ click: function () {
+ mainWindow?.hide();
+ },
+ },
+ {
+ label: 'Exit',
+ click: function () {
+ coreService.curService?.kill(() => {
+ logger.info('kill coreService');
+ });
+ app.quit();
+ process.exit(0);
+ },
+ },
+ ]);
+ tray.setToolTip('SRC');
+ tray.setContextMenu(contextMenu);
+ tray.on('click', () => {
+ if (mainWindow?.isVisible()) {
+ if (mainWindow?.isMinimized()) {
+ mainWindow?.show();
+ } else {
+ mainWindow?.hide();
+ }
+ } else {
+ mainWindow?.show();
+ }
+ });
+ tray.on('right-click', () => {
+ tray.popUpContextMenu(contextMenu);
+ });
+
+ await addIpcMainListener(mainWindow, coreService);
+ return {
+ mainWindow,
+ coreService,
+ };
+};
diff --git a/webapp/packages/main/src/createMainWindow.ts b/webapp/packages/main/src/createMainWindow.ts
new file mode 100644
index 0000000..a438c56
--- /dev/null
+++ b/webapp/packages/main/src/createMainWindow.ts
@@ -0,0 +1,94 @@
+import {app, BrowserWindow, globalShortcut, nativeTheme} from 'electron';
+import {join} from 'node:path';
+import {URL} from 'node:url';
+import {ThemeObj} from '@common/constant/theme';
+import logger from '/@/logger';
+
+export const createMainWindow = async () => {
+ nativeTheme.themeSource = ThemeObj['light'];
+ const browserWindow = new BrowserWindow({
+ width: 1280,
+ height: 880,
+ show: false, // Use 'ready-to-show' event to show window
+ frame: false,
+ icon: join(__dirname, './icon.png'),
+ webPreferences: {
+ nodeIntegration: false,
+ contextIsolation: true,
+ sandbox: false, // Sandbox disabled because the demo of preload script depend on the Node.js api
+ webviewTag: false, // The webview tag is not recommended. Consider alternatives like an iframe or Electron's BrowserView. @see https://www.electronjs.org/docs/latest/api/webview-tag#warning
+ preload: join(app.getAppPath(), 'packages/preload/dist/index.cjs'),
+ },
+ });
+
+ browserWindow.setMinimumSize(576, 396);
+
+ browserWindow.webContents.on('preload-error', (event, preloadPath, error) => {
+ logger.error('------------preload-error------------');
+ logger.error(`preloadPath:${preloadPath}`);
+ logger.error(`error:${error}`);
+ });
+
+ browserWindow.webContents.on('console-message', (event, level, message, line, sourceId) => {
+ if (level === 2) {
+ logger.warn(`console-message:${message} line:${line} sourceId:${sourceId}`);
+ return;
+ }
+ if (level === 3) {
+ logger.info('------------console-message------------');
+ logger.error(`console-message:${message} \n line:${line} \n sourceId:${sourceId}`);
+ return;
+ }
+ });
+
+ /**
+ * If the 'show' property of the BrowserWindow's constructor is omitted from the initialization options,
+ * it then defaults to 'true'. This can cause flickering as the window loads the html content,
+ * and it also has show problematic behaviour with the closing of the window.
+ * Use `show: false` and listen to the `ready-to-show` event to show the window.
+ *
+ * @see https://github.com/electron/electron/issues/25012 for the afford mentioned issue.
+ */
+ browserWindow.on('ready-to-show', () => {
+ logger.info('-----ready-to-show-----');
+ browserWindow?.show();
+
+ if (import.meta.env.DEV) {
+ browserWindow?.webContents.openDevTools();
+ }
+ });
+
+ browserWindow.on('focus', function () {
+ // Dev tools
+ globalShortcut.register('Ctrl+Shift+I', function () {
+ if (browserWindow?.webContents.isDevToolsOpened()) {
+ browserWindow?.webContents.closeDevTools();
+ } else {
+ browserWindow?.webContents.openDevTools();
+ }
+ });
+ // Refresh
+ globalShortcut.register('Ctrl+R', function () {
+ browserWindow?.reload();
+ });
+ globalShortcut.register('Ctrl+Shift+R', function () {
+ browserWindow?.reload();
+ });
+ });
+ browserWindow.on('blur', function () {
+ globalShortcut.unregisterAll();
+ });
+
+ /**
+ * URL for main window.
+ * Vite dev server for development.
+ * `file://../renderer/index.html` for production and test
+ */
+ const pageUrl =
+ import.meta.env.DEV && import.meta.env.VITE_DEV_SERVER_URL !== undefined
+ ? import.meta.env.VITE_DEV_SERVER_URL
+ : new URL('../renderer/dist/index.html', 'file://' + __dirname).toString();
+ await browserWindow.loadURL(pageUrl);
+
+ return browserWindow;
+};
diff --git a/webapp/packages/main/src/index.ts b/webapp/packages/main/src/index.ts
new file mode 100644
index 0000000..0da2b0b
--- /dev/null
+++ b/webapp/packages/main/src/index.ts
@@ -0,0 +1,139 @@
+import {app, BrowserWindow} from 'electron';
+import './security-restrictions';
+import {createApp} from '/@/createApp';
+import logger from '/@/logger';
+import {dpiScaling} from '/@/config';
+
+/**
+ * Prevent electron from running multiple instances.
+ */
+const isSingleInstance = app.requestSingleInstanceLock();
+logger.info(`isSingleInstance:${isSingleInstance}`);
+if (!isSingleInstance) {
+ app.quit();
+} else {
+ app.on('second-instance', async () => {
+ logger.info('second-instance');
+ const [curWindow] = BrowserWindow.getAllWindows();
+ if (!curWindow) {
+ logger.info('------createApp------');
+ await createApp();
+ } else {
+ logger.info('------curWindow.restore------');
+ if (curWindow.isMinimized?.()) curWindow.restore?.();
+ logger.info('------curWindow.show------');
+ if (!curWindow.isVisible?.()) curWindow.show?.();
+ logger.info('------curWindow.focus------');
+ curWindow.focus?.();
+ }
+ });
+}
+
+/**
+ * Disable Hardware Acceleration to save more system resources.
+ * Also `in-process-gpu` to avoid creating a gpu process which may `exited unexpectedly`
+ * See https://github.com/electron/electron/issues/30966
+ */
+app.disableHardwareAcceleration();
+app.commandLine.appendSwitch('disable-gpu');
+app.commandLine.appendSwitch('disable-software-rasterizer');
+app.commandLine.appendSwitch('disable-gpu-compositing');
+app.commandLine.appendSwitch('disable-gpu-rasterization');
+app.commandLine.appendSwitch('disable-gpu-sandbox');
+app.commandLine.appendSwitch('in-process-gpu');
+app.commandLine.appendSwitch('no-sandbox');
+
+// No DPI scaling
+if (!dpiScaling) {
+ app.commandLine.appendSwitch('high-dpi-support', '1');
+ app.commandLine.appendSwitch('force-device-scale-factor', '1');
+}
+
+/**
+ *Set App Error Log Path
+ */
+// app.setAppLogsPath(join(app.getAppPath(), '/AlasAppError'));
+
+/**
+ * Shout down background process if all windows was closed
+ */
+app.on('window-all-closed', () => {
+ app.quit();
+});
+
+/**
+ * @see https://www.electronjs.org/docs/latest/api/app#event-activate-macos Event: 'activate'.
+ */
+// app.on('activate', createWindow);
+/**
+ * Create the application window when the background process is ready.
+ */
+// app
+// .whenReady()
+// .then(createWindow)
+// .then(loadURL)
+// .catch(e => console.error('Failed create window:', e));
+
+/**
+ * Install Vue.js or any other extension in development mode only.
+ * Note: You must install `electron-devtools-installer` manually
+ */
+// if (import.meta.env.DEV) {
+// app
+// .whenReady()
+// .then(() => import('electron-devtools-installer'))
+// .then(module => {
+// const {default: installExtension, VUEJS3_DEVTOOLS} =
+// // @ts-expect-error Hotfix for https://github.com/cawa-93/vite-electron-builder/issues/915
+// typeof module.default === 'function' ? module : (module.default as typeof module);
+//
+// return installExtension(VUEJS3_DEVTOOLS, {
+// loadExtensionOptions: {
+// allowFileAccess: true,
+// },
+// });
+// })
+// .catch(e => console.error('Failed install extension:', e));
+// }
+
+/**
+ * Check for app updates, install it in background and notify user that new version was installed.
+ * No reason run this in non-production build.
+ * @see https://www.electron.build/auto-update.html#quick-setup-guide
+ *
+ * Note: It may throw "ENOENT: no such file app-update.yml"
+ * if you compile production app without publishing it to distribution server.
+ * Like `npm run compile` does. It's ok 😅
+ */
+// if (import.meta.env.PROD) {
+// app
+// .whenReady()
+// .then(() => import('electron-updater'))
+// .then(module => {
+// const autoUpdater =
+// module.autoUpdater ||
+// // @ts-expect-error Hotfix for https://github.com/electron-userland/electron-builder/issues/7338
+// (module.default.autoUpdater as (typeof module)['autoUpdater']);
+// return autoUpdater.checkForUpdatesAndNotify();
+// })
+// .catch(e => console.error('Failed check and install updates:', e));
+// }
+
+app
+ .whenReady()
+ .then(createApp)
+ .catch(e => {
+ logger.error('Failed create window:' + e);
+ });
+
+app.on('activate', async () => {
+ logger.info('------app activate------');
+ const [curWindow] = BrowserWindow.getAllWindows();
+ if (!curWindow) {
+ logger.info('------createApp------');
+ await createApp();
+ } else {
+ logger.info('------curWindow.focus------');
+ curWindow.focus();
+ }
+});
diff --git a/webapp/packages/main/src/logger.ts b/webapp/packages/main/src/logger.ts
new file mode 100644
index 0000000..497d585
--- /dev/null
+++ b/webapp/packages/main/src/logger.ts
@@ -0,0 +1,31 @@
+import logger from 'electron-log';
+import {join} from 'node:path';
+import {getAlasABSPath} from '@common/utils';
+const dayjs = require('dayjs');
+
+logger.transports.file.level = 'info';
+logger.transports.file.maxSize = 1024 * 1024;
+logger.transports.file.format = '[{y}-{m}-{d} {h}:{i}:{s}.{ms}] [{level}]{scope} {text}';
+const dateStr = dayjs(new Date()).format('YYYY-MM-DD');
+const logPath = join(getAlasABSPath(), `./log/${dateStr}_webapp.txt`);
+logger.transports.file.resolvePath = () => logPath;
+export default {
+ info(params: string) {
+ logger.info(params);
+ },
+ warn(params: string) {
+ logger.warn(params);
+ },
+ error(params: string) {
+ logger.error(params);
+ },
+ debug(params: string) {
+ logger.debug(params);
+ },
+ verbose(params: string) {
+ logger.verbose(params);
+ },
+ silly(params: string) {
+ logger.silly(params);
+ },
+};
diff --git a/webapp/packages/main/src/mainWindow.ts b/webapp/packages/main/src/mainWindow.ts
new file mode 100644
index 0000000..93c87e0
--- /dev/null
+++ b/webapp/packages/main/src/mainWindow.ts
@@ -0,0 +1,270 @@
+import {
+ app,
+ BrowserWindow,
+ globalShortcut,
+ ipcMain,
+ Menu,
+ nativeTheme,
+ Tray,
+ nativeImage,
+} from 'electron';
+import {URL} from 'node:url';
+import {PyShell} from '/@/pyshell';
+import {
+ dpiScaling,
+ webuiTheme,
+ webuiArgs,
+ webuiPath,
+ installerPath,
+ installerArgs,
+} from '/@/config';
+import {isMacintosh} from '@common/utils/env';
+import relaunchApp from '/@/relaunchApp';
+import {ALAS_LOG, UPDATE_APP} from '@common/constant/eventNames';
+
+const path = require('path');
+/**
+ * Load deploy settings and start Alas web server.
+ */
+let installer: PyShell | null = null;
+let alas: PyShell | null = null;
+
+let browserWindow: BrowserWindow | null = null;
+
+nativeTheme.themeSource = webuiTheme;
+
+export async function createWindow() {
+ browserWindow = new BrowserWindow({
+ width: 1280,
+ height: 880,
+ show: false, // Use 'ready-to-show' event to show window
+ frame: false,
+ icon: path.join(__dirname, './icon.png'),
+ webPreferences: {
+ nodeIntegration: true,
+ contextIsolation: true,
+ sandbox: false, // Sandbox disabled because the demo of preload script depend on the Node.js api
+ webviewTag: false, // The webview tag is not recommended. Consider alternatives like an iframe or Electron's BrowserView. @see https://www.electronjs.org/docs/latest/api/webview-tag#warning
+ preload: path.join(app.getAppPath(), 'packages/preload/dist/index.cjs'),
+ },
+ });
+
+ /**
+ * If the 'show' property of the BrowserWindow's constructor is omitted from the initialization options,
+ * it then defaults to 'true'. This can cause flickering as the window loads the html content,
+ * and it also has show problematic behaviour with the closing of the window.
+ * Use `show: false` and listen to the `ready-to-show` event to show the window.
+ *
+ * @see https://github.com/electron/electron/issues/25012 for the afford mentioned issue.
+ */
+ browserWindow.on('ready-to-show', () => {
+ browserWindow?.show();
+
+ // Hide menu
+ const {Menu} = require('electron');
+ Menu.setApplicationMenu(null);
+
+ if (import.meta.env.DEV) {
+ browserWindow?.webContents.openDevTools();
+ }
+ });
+
+ browserWindow.on('focus', function () {
+ // Dev tools
+ globalShortcut.register('Ctrl+Shift+I', function () {
+ if (browserWindow?.webContents.isDevToolsOpened()) {
+ browserWindow?.webContents.closeDevTools();
+ } else {
+ browserWindow?.webContents.openDevTools();
+ }
+ });
+ // Refresh
+ globalShortcut.register('Ctrl+R', function () {
+ browserWindow?.reload();
+ });
+ globalShortcut.register('Ctrl+Shift+R', function () {
+ browserWindow?.reload();
+ });
+ });
+ browserWindow.on('blur', function () {
+ globalShortcut.unregisterAll();
+ });
+
+ ipcMain.on('window-ready', async function (_, args) {
+ args && (await initWindowEvents());
+ });
+
+ /*
+ * Fix oversize icon on bar in macOS
+ */
+ const icon = nativeImage.createFromPath(path.join(__dirname, './icon.png'));
+ const dockerIcon = icon.resize({width: 16, height: 16});
+ // Tray
+ const tray = new Tray(isMacintosh ? dockerIcon : icon);
+ const contextMenu = Menu.buildFromTemplate([
+ {
+ label: 'Show',
+ click: function () {
+ browserWindow?.show();
+ },
+ },
+ {
+ label: 'Hide',
+ click: function () {
+ browserWindow?.hide();
+ },
+ },
+ {
+ label: 'Exit',
+ click: function () {
+ alas?.kill(function () {
+ browserWindow?.close();
+ });
+ },
+ },
+ ]);
+ tray.setToolTip('AAS');
+ tray.setContextMenu(contextMenu);
+ tray.on('click', () => {
+ if (browserWindow?.isVisible()) {
+ if (browserWindow?.isMinimized()) {
+ browserWindow?.show();
+ } else {
+ browserWindow?.hide();
+ }
+ } else {
+ browserWindow?.show();
+ }
+ });
+ tray.on('right-click', () => {
+ tray.popUpContextMenu(contextMenu);
+ });
+
+ return browserWindow;
+}
+
+// No DPI scaling
+if (!dpiScaling) {
+ app.commandLine.appendSwitch('high-dpi-support', '1');
+ app.commandLine.appendSwitch('force-device-scale-factor', '1');
+}
+
+export function loadURL() {
+ /**
+ * URL for main window.
+ * Vite dev server for development.
+ * `file://../renderer/index.html` for production and test
+ */
+ const pageUrl =
+ import.meta.env.DEV && import.meta.env.VITE_DEV_SERVER_URL !== undefined
+ ? import.meta.env.VITE_DEV_SERVER_URL
+ : new URL('../renderer/dist/index.html', 'file://' + __dirname).toString();
+ browserWindow?.loadURL(pageUrl);
+}
+
+// Minimize, maximize, close window.
+ipcMain.on('window-tray', function () {
+ browserWindow?.hide();
+});
+ipcMain.on('window-min', function () {
+ browserWindow?.minimize();
+});
+ipcMain.on('window-max', function () {
+ browserWindow?.isMaximized() ? browserWindow?.restore() : browserWindow?.maximize();
+});
+ipcMain.on('window-close', function () {
+ if (installer) {
+ installer?.removeAllListeners('stderr');
+ installer?.removeAllListeners('message');
+ installer?.removeAllListeners('stdout');
+ installer?.kill(function () {
+ browserWindow?.close();
+ browserWindow = null;
+ installer = null;
+ });
+ return;
+ }
+
+ alas?.removeAllListeners('stderr');
+ alas?.removeAllListeners('message');
+ alas?.removeAllListeners('stdout');
+ alas?.kill(function () {
+ browserWindow?.close();
+ browserWindow = null;
+ });
+
+ browserWindow?.close();
+});
+
+async function initWindowEvents() {
+ // Start installer and wait for it to finish.
+ await runInstaller();
+
+ ipcMain.on('install-success', async function () {
+ installer = null;
+ // Start Alas web server.
+ runAlas();
+ });
+}
+
+async function runInstaller() {
+ installer = new PyShell(installerPath, installerArgs);
+ installer?.end(function (err: string) {
+ sendLaunchLog(err);
+ if (err) throw err;
+ });
+ installer?.on('stdout', function (message) {
+ sendLaunchLog(message);
+ });
+ installer?.on('message', function (message) {
+ sendLaunchLog(message);
+ });
+ installer?.on('stderr', function (message: string) {
+ sendLaunchLog(message);
+ });
+}
+
+function runAlas() {
+ alas = new PyShell(webuiPath, webuiArgs);
+ alas?.end(function (err: string) {
+ sendLaunchLog(err);
+ if (err) throw err;
+ });
+ alas?.on('stdout', function (message) {
+ sendLaunchLog(message);
+ });
+
+ alas?.on('message', function (message) {
+ sendLaunchLog(message);
+ });
+ alas?.on('stderr', function (message: string) {
+ sendLaunchLog(message);
+ /**
+ * Receive logs, judge if Alas is ready
+ * For starlette backend, there will have:
+ * `INFO: Uvicorn running on http://0.0.0.0:22267 (Press CTRL+C to quit)`
+ * Or backend has started already
+ * `[Errno 10048] error while attempting to bind on address ('0.0.0.0', 22267): `
+ */
+ if (message.includes('Application startup complete') || message.includes('bind on address')) {
+ alas?.removeAllListeners('stderr');
+ alas?.removeAllListeners('message');
+ alas?.removeAllListeners('stdout');
+ // loadURL();
+ }
+ });
+}
+
+function sendLaunchLog(message: string) {
+ message?.includes(UPDATE_APP) && relaunchApp();
+ browserWindow?.webContents.send(ALAS_LOG, message);
+}
+
+export async function restoreWindow() {
+ // Someone tried to run a second instance, we should focus our window.
+ if (browserWindow) {
+ if (browserWindow.isMinimized()) browserWindow.restore();
+ if (!browserWindow.isVisible()) browserWindow.show();
+ browserWindow.focus();
+ }
+}
diff --git a/webapp/packages/main/src/pyshell.ts b/webapp/packages/main/src/pyshell.ts
new file mode 100644
index 0000000..1a9e817
--- /dev/null
+++ b/webapp/packages/main/src/pyshell.ts
@@ -0,0 +1,29 @@
+import {alasPath, pythonPath} from '/@/config';
+import logger from '/@/logger';
+
+const {PythonShell} = require('python-shell');
+const treeKill = require('tree-kill');
+
+export class PyShell extends PythonShell {
+ constructor(script: string, args: Array = []) {
+ const options = {
+ mode: 'text',
+ args: args,
+ pythonPath: pythonPath,
+ scriptPath: alasPath,
+ };
+ logger.info(`${pythonPath} ${script} ${args}`);
+ super(script, options);
+ }
+
+ on(event: string, listener: (...args: any[]) => void): this {
+ this.removeAllListeners(event);
+ super.on(event, listener);
+ return this;
+ }
+
+ kill(callback: (...args: any[]) => void): this {
+ treeKill(this.childProcess.pid, 'SIGTERM', callback);
+ return this;
+ }
+}
diff --git a/webapp/packages/main/src/relaunchApp.ts b/webapp/packages/main/src/relaunchApp.ts
new file mode 100644
index 0000000..c115977
--- /dev/null
+++ b/webapp/packages/main/src/relaunchApp.ts
@@ -0,0 +1,15 @@
+import {app} from 'electron';
+import {ALAS_RELAUNCH_ARGV} from '@common/constant/config';
+
+export const isRelaunch = process.argv.includes(ALAS_RELAUNCH_ARGV);
+
+function relaunchApp() {
+ /**
+ * TODO Some events need to be rehandled for restart operations
+ */
+ if (!isRelaunch) {
+ app.relaunch({args: process.argv.slice(1).concat([ALAS_RELAUNCH_ARGV])});
+ }
+}
+
+export default relaunchApp;
diff --git a/webapp/packages/main/src/security-restrictions.ts b/webapp/packages/main/src/security-restrictions.ts
new file mode 100644
index 0000000..7b05cb8
--- /dev/null
+++ b/webapp/packages/main/src/security-restrictions.ts
@@ -0,0 +1,128 @@
+import type {Session} from 'electron';
+import {app, shell} from 'electron';
+import {URL} from 'node:url';
+
+/**
+ * Union for all existing permissions in electron
+ */
+type Permission = Parameters<
+ Exclude[0], null>
+>[1];
+
+/**
+ * A list of origins that you allow open INSIDE the application and permissions for them.
+ *
+ * In development mode you need allow open `VITE_DEV_SERVER_URL`.
+ */
+const ALLOWED_ORIGINS_AND_PERMISSIONS = new Map>(
+ import.meta.env.DEV && import.meta.env.VITE_DEV_SERVER_URL
+ ? [[new URL(import.meta.env.VITE_DEV_SERVER_URL).origin, new Set()]]
+ : [],
+);
+
+/**
+ * A list of origins that you allow open IN BROWSER.
+ * Navigation to the origins below is only possible if the link opens in a new window.
+ *
+ * @example
+ *
+ */
+const ALLOWED_EXTERNAL_ORIGINS = new Set<`https://${string}`>(['https://github.com']);
+
+app.on('web-contents-created', (_, contents) => {
+ /**
+ * Block navigation to origins not on the allowlist.
+ *
+ * Navigation exploits are quite common. If an attacker can convince the app to navigate away from its current page,
+ * they can possibly force the app to open arbitrary web resources/websites on the web.
+ *
+ * @see https://www.electronjs.org/docs/latest/tutorial/security#13-disable-or-limit-navigation
+ */
+ contents.on('will-navigate', (event, url) => {
+ const {origin} = new URL(url);
+ if (ALLOWED_ORIGINS_AND_PERMISSIONS.has(origin)) {
+ return;
+ }
+
+ // Prevent navigation
+ event.preventDefault();
+
+ if (import.meta.env.DEV) {
+ console.warn(`Blocked navigating to disallowed origin: ${origin}`);
+ }
+ });
+
+ /**
+ * Block requests for disallowed permissions.
+ * By default, Electron will automatically approve all permission requests.
+ *
+ * @see https://www.electronjs.org/docs/latest/tutorial/security#5-handle-session-permission-requests-from-remote-content
+ */
+ contents.session.setPermissionRequestHandler((webContents, permission, callback) => {
+ const {origin} = new URL(webContents.getURL());
+
+ const permissionGranted = !!ALLOWED_ORIGINS_AND_PERMISSIONS.get(origin)?.has(permission);
+ callback(permissionGranted);
+
+ if (!permissionGranted && import.meta.env.DEV) {
+ console.warn(`${origin} requested permission for '${permission}', but was rejected.`);
+ }
+ });
+
+ /**
+ * Hyperlinks leading to allowed sites are opened in the default browser.
+ *
+ * The creation of new `webContents` is a common attack vector. Attackers attempt to convince the app to create new windows,
+ * frames, or other renderer processes with more privileges than they had before; or with pages opened that they couldn't open before.
+ * You should deny any unexpected window creation.
+ *
+ * @see https://www.electronjs.org/docs/latest/tutorial/security#14-disable-or-limit-creation-of-new-windows
+ * @see https://www.electronjs.org/docs/latest/tutorial/security#15-do-not-use-openexternal-with-untrusted-content
+ */
+ contents.setWindowOpenHandler(({url}) => {
+ const {origin} = new URL(url);
+
+ if (ALLOWED_EXTERNAL_ORIGINS.has(origin as `https://${string}`)) {
+ // Open url in default browser.
+ shell.openExternal(url).catch(console.error);
+ } else if (import.meta.env.DEV) {
+ console.warn(`Blocked the opening of a disallowed origin: ${origin}`);
+ }
+
+ // Prevent creating a new window.
+ return {action: 'deny'};
+ });
+
+ /**
+ * Verify webview options before creation.
+ *
+ * Strip away preload scripts, disable Node.js integration, and ensure origins are on the allowlist.
+ *
+ * @see https://www.electronjs.org/docs/latest/tutorial/security#12-verify-webview-options-before-creation
+ */
+ contents.on('will-attach-webview', (event, webPreferences, params) => {
+ const {origin} = new URL(params.src);
+ if (!ALLOWED_ORIGINS_AND_PERMISSIONS.has(origin)) {
+ if (import.meta.env.DEV) {
+ console.warn(`A webview tried to attach ${params.src}, but was blocked.`);
+ }
+
+ event.preventDefault();
+ return;
+ }
+
+ // Strip away preload scripts if unused or verify their location is legitimate.
+ delete webPreferences.preload;
+ // @ts-expect-error `preloadURL` exists. - @see https://www.electronjs.org/docs/latest/api/web-contents#event-will-attach-webview
+ delete webPreferences.preloadURL;
+
+ // Disable Node.js integration
+ webPreferences.nodeIntegration = false;
+
+ // Enable contextIsolation
+ webPreferences.contextIsolation = true;
+ });
+});
diff --git a/webapp/packages/main/src/serviceLogic/createAlas.ts b/webapp/packages/main/src/serviceLogic/createAlas.ts
new file mode 100644
index 0000000..a864acb
--- /dev/null
+++ b/webapp/packages/main/src/serviceLogic/createAlas.ts
@@ -0,0 +1,52 @@
+import {webuiArgs, webuiPath} from '/@/config';
+import {PyShell} from '/@/pyshell';
+import type {CallbackFun} from '/@/coreService';
+import logger from '/@/logger';
+
+export const createAlas: CallbackFun = async ctx => {
+ let alas: PyShell | null = null;
+ try {
+ alas = new PyShell(webuiPath, webuiArgs);
+ } catch (e) {
+ ctx.onError(e);
+ }
+
+ alas?.on('error', function (err: string) {
+ if (!err) return;
+ logger.error('alas.error:' + err);
+ ctx.sendLaunchLog(err);
+ });
+ alas?.end(function (err: string) {
+ if (!err) return;
+ logger.info('alas.end:' + err);
+ ctx.sendLaunchLog(err);
+ throw err;
+ });
+ alas?.on('stdout', function (message) {
+ ctx.sendLaunchLog(message);
+ });
+
+ alas?.on('message', function (message) {
+ ctx.sendLaunchLog(message);
+ });
+ alas?.on('stderr', function (message: string) {
+ ctx.sendLaunchLog(message);
+ /**
+ * Receive logs, judge if Alas is ready
+ * For starlette backend, there will have:
+ * `INFO: Uvicorn running on http://0.0.0.0:22267 (Press CTRL+C to quit)`
+ * Or backend has started already
+ * `[Errno 10048] error while attempting to bind on address ('0.0.0.0', 22267): `
+ */
+ if (message.includes('Application startup complete') || message.includes('bind on address')) {
+ alas?.removeAllListeners('stderr');
+ alas?.removeAllListeners('message');
+ alas?.removeAllListeners('stdout');
+ }
+ });
+
+ alas?.on('pythonError', err => {
+ ctx.onError('alas pythonError:' + err);
+ });
+ return alas;
+};
diff --git a/webapp/packages/main/src/serviceLogic/createInstaller.ts b/webapp/packages/main/src/serviceLogic/createInstaller.ts
new file mode 100644
index 0000000..845242a
--- /dev/null
+++ b/webapp/packages/main/src/serviceLogic/createInstaller.ts
@@ -0,0 +1,43 @@
+import type {CallbackFun} from '/@/coreService';
+import {PyShell} from '/@/pyshell';
+import {installerArgs, installerPath} from '/@/config';
+import {ALAS_RELAUNCH_ARGV} from '@common/constant/config';
+import logger from '/@/logger';
+export const createInstaller: CallbackFun = async (ctx, next) => {
+ if (process.argv.includes(ALAS_RELAUNCH_ARGV)) {
+ return next();
+ }
+ let installer: PyShell | null = null;
+ try {
+ installer = new PyShell(installerPath, installerArgs);
+ } catch (err) {
+ ctx.onError(err);
+ }
+
+ installer?.on('error', function (err: string) {
+ if (!err) return;
+ logger.error('installer.error:' + err);
+ ctx.sendLaunchLog(err);
+ });
+ installer?.end(function (err: string) {
+ if (!err) return;
+ logger.info('installer.end:' + err);
+ ctx.sendLaunchLog(err);
+ // throw err;
+ });
+ installer?.on('stdout', function (message) {
+ ctx.sendLaunchLog(message);
+ });
+ installer?.on('message', function (message) {
+ ctx.sendLaunchLog(message);
+ });
+ installer?.on('stderr', function (message: string) {
+ ctx.sendLaunchLog(message);
+ });
+
+ installer?.on('pythonError', err => {
+ ctx.onError('alas pythonError :' + err);
+ });
+
+ return installer;
+};
diff --git a/webapp/packages/main/src/serviceLogic/index.ts b/webapp/packages/main/src/serviceLogic/index.ts
new file mode 100644
index 0000000..fe4d22b
--- /dev/null
+++ b/webapp/packages/main/src/serviceLogic/index.ts
@@ -0,0 +1,4 @@
+import {createInstaller} from './createInstaller';
+import {createAlas} from './createAlas';
+
+export {createInstaller, createAlas};
diff --git a/webapp/packages/main/tests/unit.spec.ts b/webapp/packages/main/tests/unit.spec.ts
new file mode 100644
index 0000000..adbbe4d
--- /dev/null
+++ b/webapp/packages/main/tests/unit.spec.ts
@@ -0,0 +1,72 @@
+import type {MockedClass} from 'vitest';
+import {beforeEach, expect, test, vi} from 'vitest';
+import {restoreOrCreateWindow} from '../src/mainWindow';
+
+import {BrowserWindow} from 'electron';
+
+/**
+ * Mock real electron BrowserWindow API
+ */
+vi.mock('electron', () => {
+ // Use "as unknown as" because vi.fn() does not have static methods
+ const bw = vi.fn() as unknown as MockedClass;
+ bw.getAllWindows = vi.fn(() => bw.mock.instances);
+ bw.prototype.loadURL = vi.fn((_: string, __?: Electron.LoadURLOptions) => Promise.resolve());
+ // Use "any" because the on function is overloaded
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ bw.prototype.on = vi.fn();
+ bw.prototype.destroy = vi.fn();
+ bw.prototype.isDestroyed = vi.fn();
+ bw.prototype.isMinimized = vi.fn();
+ bw.prototype.focus = vi.fn();
+ bw.prototype.restore = vi.fn();
+
+ const app: Pick = {
+ getAppPath(): string {
+ return '';
+ },
+ };
+
+ return {BrowserWindow: bw, app};
+});
+
+beforeEach(() => {
+ vi.clearAllMocks();
+});
+
+test('Should create a new window', async () => {
+ const {mock} = vi.mocked(BrowserWindow);
+ expect(mock.instances).toHaveLength(0);
+
+ await restoreOrCreateWindow();
+ expect(mock.instances).toHaveLength(1);
+ expect(mock.instances[0].loadURL).toHaveBeenCalledOnce();
+ expect(mock.instances[0].loadURL).toHaveBeenCalledWith(expect.stringMatching(/index\.html$/));
+});
+
+test('Should restore an existing window', async () => {
+ const {mock} = vi.mocked(BrowserWindow);
+
+ // Create a window and minimize it.
+ await restoreOrCreateWindow();
+ expect(mock.instances).toHaveLength(1);
+ const appWindow = vi.mocked(mock.instances[0]);
+ appWindow.isMinimized.mockReturnValueOnce(true);
+
+ await restoreOrCreateWindow();
+ expect(mock.instances).toHaveLength(1);
+ expect(appWindow.restore).toHaveBeenCalledOnce();
+});
+
+test('Should create a new window if the previous one was destroyed', async () => {
+ const {mock} = vi.mocked(BrowserWindow);
+
+ // Create a window and destroy it.
+ await restoreOrCreateWindow();
+ expect(mock.instances).toHaveLength(1);
+ const appWindow = vi.mocked(mock.instances[0]);
+ appWindow.isDestroyed.mockReturnValueOnce(true);
+
+ await restoreOrCreateWindow();
+ expect(mock.instances).toHaveLength(2);
+});
diff --git a/webapp/packages/main/tsconfig.json b/webapp/packages/main/tsconfig.json
new file mode 100644
index 0000000..9bb9b84
--- /dev/null
+++ b/webapp/packages/main/tsconfig.json
@@ -0,0 +1,19 @@
+{
+ "compilerOptions": {
+ "module": "esnext",
+ "target": "esnext",
+ "sourceMap": false,
+ "moduleResolution": "Node",
+ "skipLibCheck": true,
+ "strict": true,
+ "isolatedModules": true,
+ "types": ["node"],
+ "baseUrl": ".",
+ "paths": {
+ "/@/*": ["./src/*"],
+ "@common/*": ["../common/*"]
+ }
+ },
+ "include": ["src/**/*.ts", "../../types/**/*.d.ts","../common/**/*.ts"],
+ "exclude": ["**/*.spec.ts", "**/*.test.ts"]
+}
diff --git a/webapp/packages/main/vite.config.js b/webapp/packages/main/vite.config.js
new file mode 100644
index 0000000..5905e68
--- /dev/null
+++ b/webapp/packages/main/vite.config.js
@@ -0,0 +1,44 @@
+import {node} from '../../.electron-vendors.cache.json';
+import {join} from 'node:path';
+import {injectAppVersion} from '../../version/inject-app-version-plugin.mjs';
+
+const PACKAGE_ROOT = __dirname;
+const PROJECT_ROOT = join(PACKAGE_ROOT, '../..');
+
+/**
+ * @type {import('vite').UserConfig}
+ * @see https://vitejs.dev/config/
+ */
+const config = {
+ mode: process.env.MODE,
+ root: PACKAGE_ROOT,
+ envDir: PROJECT_ROOT,
+ resolve: {
+ alias: {
+ '/@/': join(PACKAGE_ROOT, 'src') + '/',
+ '@common': join(PACKAGE_ROOT, '../common/'),
+ },
+ },
+ build: {
+ ssr: true,
+ sourcemap: 'inline',
+ target: `node${node}`,
+ outDir: 'dist',
+ assetsDir: '.',
+ minify: process.env.MODE !== 'development',
+ lib: {
+ entry: 'src/index.ts',
+ formats: ['cjs'],
+ },
+ rollupOptions: {
+ output: {
+ entryFileNames: '[name].cjs',
+ },
+ },
+ emptyOutDir: true,
+ reportCompressedSize: false,
+ },
+ plugins: [injectAppVersion()],
+};
+
+export default config;
diff --git a/webapp/packages/preload/src/alasConfig.ts b/webapp/packages/preload/src/alasConfig.ts
new file mode 100644
index 0000000..ffd15cb
--- /dev/null
+++ b/webapp/packages/preload/src/alasConfig.ts
@@ -0,0 +1,59 @@
+import {ALAS_CONFIG_YAML} from '@common/constant/config';
+import {getAlasABSPath, checkIsFirst} from '@common/utils';
+import {ThemeObj} from '@common/constant/theme';
+import {Dirent} from 'fs';
+const path = require('path');
+const yaml = require('yaml');
+const fs = require('fs');
+
+let alasConfig: AlasConfig | null = null;
+export async function getAlasConfig() {
+ if (alasConfig === null) {
+ const alasPath = getAlasABSPath();
+ const file = fs.readFileSync(path.join(alasPath, `./config/${ALAS_CONFIG_YAML}`), 'utf8');
+ const config = yaml.parse(file) as DefAlasConfig;
+ const WebuiPort = config.Deploy.Webui.WebuiPort.toString();
+ const Theme = config.Deploy.Webui.Theme;
+ alasConfig = {
+ webuiUrl: `http://127.0.0.1:${WebuiPort}`,
+ theme: ThemeObj[Theme] || 'light',
+ language: config.Deploy.Webui.Language || 'en-US',
+ repository: config.Deploy.Git.Repository as any,
+ alasPath,
+ };
+ }
+ return alasConfig;
+}
+
+export function checkIsNeedInstall() {
+ return checkIsFirst();
+}
+
+interface fileInfoItem {
+ name: string;
+ path: string;
+ lastModifyTime: Date;
+}
+export function getAlasConfigDirFiles() {
+ const alasPath = getAlasABSPath();
+ const configPath = path.join(alasPath, `./config`);
+ const files: Dirent[] = fs.readdirSync(configPath, {withFileTypes: true});
+ const filesInfoList: fileInfoItem[] = files.map((file: Dirent) => {
+ const name = file.name;
+ const filePath = path.join(configPath, name);
+ return {
+ name,
+ path: filePath,
+ lastModifyTime: getFileUpdateDate(filePath),
+ };
+ });
+ return {
+ configPath,
+ files: filesInfoList,
+ };
+}
+
+export function getFileUpdateDate(path: string) {
+ const stat = fs.statSync(path);
+ return stat.mtime;
+}
diff --git a/webapp/packages/preload/src/electronApi.ts b/webapp/packages/preload/src/electronApi.ts
new file mode 100644
index 0000000..76fa130
--- /dev/null
+++ b/webapp/packages/preload/src/electronApi.ts
@@ -0,0 +1,13 @@
+import {ipcRenderer} from 'electron';
+import IpcRenderer = Electron.IpcRenderer;
+
+export function ipcRendererSend(channel: string, ...args: any[]): void {
+ ipcRenderer.send(channel, ...args);
+}
+
+export function ipcRendererOn(
+ channel: string,
+ listener: (event: Electron.IpcRendererEvent, ...args: any[]) => void,
+): IpcRenderer {
+ return ipcRenderer.on(channel, listener);
+}
diff --git a/webapp/packages/preload/src/index.ts b/webapp/packages/preload/src/index.ts
new file mode 100644
index 0000000..860ab1b
--- /dev/null
+++ b/webapp/packages/preload/src/index.ts
@@ -0,0 +1,10 @@
+/**
+ * @module preload
+ */
+
+export {sha256sum} from './nodeCrypto';
+export {versions} from './versions';
+export {ipcRendererSend, ipcRendererOn} from './electronApi';
+export {getAlasConfig, checkIsNeedInstall, getAlasConfigDirFiles} from './alasConfig';
+export {copyFilesToDir} from '@common/utils/copyFilesToDir';
+export {modifyConfigYaml} from './modifyConfigYaml';
diff --git a/webapp/packages/preload/src/modifyConfigYaml.ts b/webapp/packages/preload/src/modifyConfigYaml.ts
new file mode 100644
index 0000000..b9484d5
--- /dev/null
+++ b/webapp/packages/preload/src/modifyConfigYaml.ts
@@ -0,0 +1,8 @@
+import {join, normalize} from 'path';
+import {modifyYaml} from '@common/utils';
+import {ALAS_CONFIG_YAML} from '@common/constant/config';
+
+export function modifyConfigYaml(path: string, keyObj: {[k in string]: any}) {
+ const configYamlPath = join(normalize(path) + `./config/${ALAS_CONFIG_YAML}`);
+ return modifyYaml(configYamlPath, keyObj);
+}
diff --git a/webapp/packages/preload/src/nodeCrypto.ts b/webapp/packages/preload/src/nodeCrypto.ts
new file mode 100644
index 0000000..758f101
--- /dev/null
+++ b/webapp/packages/preload/src/nodeCrypto.ts
@@ -0,0 +1,5 @@
+import {type BinaryLike, createHash} from 'node:crypto';
+
+export function sha256sum(data: BinaryLike) {
+ return createHash('sha256').update(data).digest('hex');
+}
diff --git a/webapp/packages/preload/src/versions.ts b/webapp/packages/preload/src/versions.ts
new file mode 100644
index 0000000..acecff9
--- /dev/null
+++ b/webapp/packages/preload/src/versions.ts
@@ -0,0 +1 @@
+export {versions} from 'node:process';
diff --git a/webapp/packages/preload/tests/modifyYaml.test.ts b/webapp/packages/preload/tests/modifyYaml.test.ts
new file mode 100644
index 0000000..890c5b3
--- /dev/null
+++ b/webapp/packages/preload/tests/modifyYaml.test.ts
@@ -0,0 +1,15 @@
+import {test, expect} from 'vitest';
+import {modifyYaml} from '../../common/utils/modifyYaml';
+import getAlasABSPath from '../../common/utils/getAlasABSPath';
+const path = require('path');
+const fs = require('fs');
+test('test write yaml', () => {
+ const absPath = getAlasABSPath();
+ const yamlPath = path.join(absPath, './config/deploy.yaml');
+ modifyYaml(yamlPath, {Branch: 'dev'});
+ const newYamlConfig1 = require('yaml').parse(fs.readFileSync(yamlPath, 'utf8'));
+ expect(newYamlConfig1.Deploy.Git.Branch).toBe('dev');
+ modifyYaml(yamlPath, {Branch: 'master'});
+ const newYamlConfig2 = require('yaml').parse(fs.readFileSync(yamlPath, 'utf8'));
+ expect(newYamlConfig2.Deploy.Git.Branch).toBe('master');
+});
diff --git a/webapp/packages/preload/tests/unit.spec.ts b/webapp/packages/preload/tests/unit.spec.ts
new file mode 100644
index 0000000..6b8114c
--- /dev/null
+++ b/webapp/packages/preload/tests/unit.spec.ts
@@ -0,0 +1,15 @@
+import {createHash} from 'crypto';
+import {expect, test} from 'vitest';
+import {sha256sum, versions} from '../src';
+
+test('versions', async () => {
+ expect(versions).toBe(process.versions);
+});
+
+test('nodeCrypto', async () => {
+ // Test hashing a random string.
+ const testString = Math.random().toString(36).slice(2, 7);
+ const expectedHash = createHash('sha256').update(testString).digest('hex');
+
+ expect(sha256sum(testString)).toBe(expectedHash);
+});
diff --git a/webapp/packages/preload/tsconfig.json b/webapp/packages/preload/tsconfig.json
new file mode 100644
index 0000000..fabc947
--- /dev/null
+++ b/webapp/packages/preload/tsconfig.json
@@ -0,0 +1,18 @@
+{
+ "compilerOptions": {
+ "module": "esnext",
+ "target": "esnext",
+ "sourceMap": false,
+ "moduleResolution": "Node",
+ "skipLibCheck": true,
+ "strict": true,
+ "isolatedModules": true,
+ "types": ["node"],
+ "baseUrl": ".",
+ "paths": {
+ "@common/*": ["../common/*"]
+ }
+ },
+ "include": ["src/**/*.ts", "../../types/**/*.d.ts","../common/**/*.ts"],
+ "exclude": ["**/*.spec.ts", "**/*.test.ts"]
+}
diff --git a/webapp/packages/preload/types/electron-api.d.ts b/webapp/packages/preload/types/electron-api.d.ts
new file mode 100644
index 0000000..d0d6888
--- /dev/null
+++ b/webapp/packages/preload/types/electron-api.d.ts
@@ -0,0 +1,8 @@
+interface ElectronApi {
+ readonly versions: Readonly;
+}
+
+declare interface Window {
+ electron: Readonly;
+ electronRequire?: NodeRequire;
+}
diff --git a/webapp/packages/preload/vite.config.js b/webapp/packages/preload/vite.config.js
new file mode 100644
index 0000000..bb2becc
--- /dev/null
+++ b/webapp/packages/preload/vite.config.js
@@ -0,0 +1,47 @@
+import {chrome} from '../../.electron-vendors.cache.json';
+import {preload} from 'unplugin-auto-expose';
+import {join} from 'node:path';
+import {injectAppVersion} from '../../version/inject-app-version-plugin.mjs';
+
+const PACKAGE_ROOT = __dirname;
+const PROJECT_ROOT = join(PACKAGE_ROOT, '../..');
+
+/**
+ * @type {import('vite').UserConfig}
+ * @see https://vitejs.dev/config/
+ */
+const config = {
+ mode: process.env.MODE,
+ root: PACKAGE_ROOT,
+ envDir: PROJECT_ROOT,
+ resolve: {
+ alias: [
+ {
+ find: '@common',
+ replacement: join(PACKAGE_ROOT, '../common'),
+ },
+ ],
+ },
+ build: {
+ ssr: true,
+ sourcemap: 'inline',
+ target: `chrome${chrome}`,
+ outDir: 'dist',
+ assetsDir: '.',
+ minify: process.env.MODE !== 'development',
+ lib: {
+ entry: 'src/index.ts',
+ formats: ['cjs'],
+ },
+ rollupOptions: {
+ output: {
+ entryFileNames: '[name].cjs',
+ },
+ },
+ emptyOutDir: true,
+ reportCompressedSize: false,
+ },
+ plugins: [preload.vite(), injectAppVersion()],
+};
+
+export default config;
diff --git a/webapp/packages/renderer/.eslintrc.json b/webapp/packages/renderer/.eslintrc.json
new file mode 100644
index 0000000..3cf7c2f
--- /dev/null
+++ b/webapp/packages/renderer/.eslintrc.json
@@ -0,0 +1,20 @@
+{
+ "env": {
+ "browser": true,
+ "node": false
+ },
+ "extends": [
+ /** @see https://eslint.vuejs.org/rules/ */
+ "plugin:vue/vue3-recommended"
+ ],
+ "parserOptions": {
+ "parser": "@typescript-eslint/parser",
+ "ecmaVersion": 12,
+ "sourceType": "module"
+ },
+ "rules": {
+ /** These rules are disabled because they are incompatible with prettier */
+ "vue/html-self-closing": "off",
+ "vue/singleline-html-element-content-newline": "off"
+ }
+}
diff --git a/webapp/packages/renderer/auto-imports.d.ts b/webapp/packages/renderer/auto-imports.d.ts
new file mode 100644
index 0000000..918aad8
--- /dev/null
+++ b/webapp/packages/renderer/auto-imports.d.ts
@@ -0,0 +1,8 @@
+/* eslint-disable */
+/* prettier-ignore */
+// @ts-nocheck
+// Generated by unplugin-auto-import
+export {}
+declare global {
+
+}
diff --git a/webapp/packages/renderer/components.d.ts b/webapp/packages/renderer/components.d.ts
new file mode 100644
index 0000000..f0acab8
--- /dev/null
+++ b/webapp/packages/renderer/components.d.ts
@@ -0,0 +1,21 @@
+/* eslint-disable */
+/* prettier-ignore */
+// @ts-nocheck
+// Generated by unplugin-vue-components
+// Read more: https://github.com/vuejs/core/pull/3399
+import '@vue/runtime-core'
+
+export {}
+
+declare module '@vue/runtime-core' {
+ export interface GlobalComponents {
+ Alas: typeof import('./src/components/Alas.vue')['default']
+ AlasTitle: typeof import('./src/components/AlasTitle.vue')['default']
+ AppHeader: typeof import('./src/components/AppHeader.vue')['default']
+ CountTo: typeof import('./src/components/CountTo.vue')['default']
+ ProgressBar: typeof import('./src/components/ProgressBar.vue')['default']
+ RouterLink: typeof import('vue-router')['RouterLink']
+ RouterView: typeof import('vue-router')['RouterView']
+ Spin: typeof import('./src/components/Spin.vue')['default']
+ }
+}
diff --git a/webapp/packages/renderer/index.html b/webapp/packages/renderer/index.html
new file mode 100644
index 0000000..a27fca1
--- /dev/null
+++ b/webapp/packages/renderer/index.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+ AAS
+
+
+
+
+
+
diff --git a/webapp/packages/renderer/src/App.vue b/webapp/packages/renderer/src/App.vue
new file mode 100644
index 0000000..80b5ffe
--- /dev/null
+++ b/webapp/packages/renderer/src/App.vue
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
diff --git a/webapp/packages/renderer/src/components/Alas.vue b/webapp/packages/renderer/src/components/Alas.vue
new file mode 100644
index 0000000..198e51e
--- /dev/null
+++ b/webapp/packages/renderer/src/components/Alas.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
diff --git a/webapp/packages/renderer/src/components/AlasTitle.vue b/webapp/packages/renderer/src/components/AlasTitle.vue
new file mode 100644
index 0000000..b915a6f
--- /dev/null
+++ b/webapp/packages/renderer/src/components/AlasTitle.vue
@@ -0,0 +1,14 @@
+
+
+
+
+
diff --git a/webapp/packages/renderer/src/components/AppHeader.vue b/webapp/packages/renderer/src/components/AppHeader.vue
new file mode 100644
index 0000000..5cf1b0b
--- /dev/null
+++ b/webapp/packages/renderer/src/components/AppHeader.vue
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
diff --git a/webapp/packages/renderer/src/components/CountTo.vue b/webapp/packages/renderer/src/components/CountTo.vue
new file mode 100644
index 0000000..f5381c9
--- /dev/null
+++ b/webapp/packages/renderer/src/components/CountTo.vue
@@ -0,0 +1,109 @@
+
+
+ {{ value }}
+
+
+
+
+
+
diff --git a/webapp/packages/renderer/src/components/ProgressBar.vue b/webapp/packages/renderer/src/components/ProgressBar.vue
new file mode 100644
index 0000000..cc8b298
--- /dev/null
+++ b/webapp/packages/renderer/src/components/ProgressBar.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
diff --git a/webapp/packages/renderer/src/components/Spin.vue b/webapp/packages/renderer/src/components/Spin.vue
new file mode 100644
index 0000000..aa6f302
--- /dev/null
+++ b/webapp/packages/renderer/src/components/Spin.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/webapp/packages/renderer/src/design/color.less b/webapp/packages/renderer/src/design/color.less
new file mode 100644
index 0000000..3d2715b
--- /dev/null
+++ b/webapp/packages/renderer/src/design/color.less
@@ -0,0 +1,111 @@
+html {
+
+}
+
+@white: #fff;
+
+@content-bg: #f4f7f9;
+
+@iconify-bg-color: #5551;
+
+// =================================
+// ==============border-color=======
+// =================================
+
+// Dark-dark
+@border-color-dark: #b6b7b9;
+
+// Dark-light
+@border-color-shallow-dark: #cececd;
+
+// Light-dark
+@border-color-light: @border-color-base;
+
+// =================================
+// ==============message==============
+// =================================
+
+// success-bg-color
+@success-background-color: #f1f9ec;
+// info-bg-color
+@info-background-color: #e8eff8;
+// warn-bg-color
+@warning-background-color: #fdf6ed;
+// danger-bg-color
+@danger-background-color: #fef0f0;
+
+// top-menu
+@top-menu-active-bg-color: var(--header-active-menu-bg-color);
+
+// =================================
+// ==============Menu============
+// =================================
+
+// trigger
+@trigger-dark-hover-bg-color: rgba(255, 255, 255, 0.2);
+@trigger-dark-bg-color: rgba(255, 255, 255, 0.1);
+
+// =================================
+// ==============tree============
+// =================================
+// tree item hover background
+@tree-hover-background-color: #f5f7fa;
+// tree item hover font color
+@tree-hover-font-color: #f5f7fa;
+
+// =================================
+// ==============link============
+// =================================
+@link-hover-color: @primary-color;
+@link-active-color: darken(@primary-color, 10%);
+
+// =================================
+// ==============Text color-=============
+// =================================
+
+// Main text color
+@text-color-base: @text-color;
+
+// Label color
+@text-color-call-out: #606266;
+
+// Auxiliary information color-dark
+@text-color-help-dark: #909399;
+
+// =================================
+// ==============breadcrumb=========
+// =================================
+@breadcrumb-item-normal-color: #999;
+// =================================
+// ==============button=============
+// =================================
+
+@button-primary-color: @primary-color;
+@button-primary-hover-color: lighten(@primary-color, 5%);
+@button-primary-active-color: darken(@primary-color, 5%);
+
+@button-ghost-color: @white;
+@button-ghost-hover-color: lighten(@white, 10%);
+@button-ghost-hover-bg-color: #e1ebf6;
+@button-ghost-active-color: darken(@white, 10%);
+
+@button-success-color: @success-color;
+@button-success-hover-color: lighten(@success-color, 10%);
+@button-success-active-color: darken(@success-color, 10%);
+
+@button-warn-color: @warning-color;
+@button-warn-hover-color: lighten(@warning-color, 10%);
+@button-warn-active-color: darken(@warning-color, 10%);
+
+@button-error-color: @error-color;
+@button-error-hover-color: lighten(@error-color, 10%);
+@button-error-active-color: darken(@error-color, 10%);
+
+@button-cancel-color: @text-color-call-out;
+@button-cancel-bg-color: @white;
+@button-cancel-border-color: @border-color-shallow-dark;
+
+// Mouse over
+@button-cancel-hover-color: @primary-color;
+@button-cancel-hover-bg-color: @white;
+@button-cancel-hover-border-color: @primary-color;
diff --git a/webapp/packages/renderer/src/design/config.less b/webapp/packages/renderer/src/design/config.less
new file mode 100644
index 0000000..64c33f6
--- /dev/null
+++ b/webapp/packages/renderer/src/design/config.less
@@ -0,0 +1,2 @@
+@import (reference) 'color.less';
+@import (reference) 'var/index.less';
diff --git a/webapp/packages/renderer/src/design/index.less b/webapp/packages/renderer/src/design/index.less
new file mode 100644
index 0000000..d8ff137
--- /dev/null
+++ b/webapp/packages/renderer/src/design/index.less
@@ -0,0 +1,41 @@
+@import "./theme.less";
+@import 'var/index.less';
+
+input:-webkit-autofill {
+ box-shadow: 0 0 0 1000px white inset !important;
+}
+
+:-webkit-autofill {
+ transition: background-color 5000s ease-in-out 0s !important;
+}
+
+html {
+ overflow: hidden;
+ text-size-adjust: 100%;
+}
+
+html,
+body {
+ width: 100%;
+ height: 100%;
+ overflow: visible !important;
+ overflow-x: hidden !important;
+
+ &.color-weak {
+ filter: invert(80%);
+ }
+
+ &.gray-mode {
+ filter: grayscale(100%);
+ filter: progid:dximagetransform.microsoft.basicimage(grayscale=1);
+ }
+}
+
+a:focus,
+a:active,
+button,
+div,
+svg,
+span {
+ outline: none !important;
+}
diff --git a/webapp/packages/renderer/src/design/theme.less b/webapp/packages/renderer/src/design/theme.less
new file mode 100644
index 0000000..ab9c486
--- /dev/null
+++ b/webapp/packages/renderer/src/design/theme.less
@@ -0,0 +1,9 @@
+html[arco-theme='light'] {
+
+}
+
+[arco-theme='dark'] {
+
+
+
+}
diff --git a/webapp/packages/renderer/src/hooks/useI18n.ts b/webapp/packages/renderer/src/hooks/useI18n.ts
new file mode 100644
index 0000000..2981333
--- /dev/null
+++ b/webapp/packages/renderer/src/hooks/useI18n.ts
@@ -0,0 +1,46 @@
+import {i18n} from '/@/locales/setupI18n';
+
+export interface I18nGlobalTranslation {
+ (key: string): string;
+ (key: string, locale?: string): string;
+ (key: string, locale?: string, list?: unknown[]): string;
+ (key: string, locale?: string, named?: Record): string;
+ (key: string, list?: unknown[]): string;
+ (key: string, named?: Record): string;
+}
+
+type I18nTranslationRestParameters = [string, any];
+
+function getKey(namespace: string | undefined, key: string): string {
+ if (!namespace) {
+ return key;
+ }
+ if (key.startsWith(namespace)) {
+ return key;
+ }
+ return `${namespace}.${key}`;
+}
+
+export function useI18n(namespace?: string) {
+ const normalFn = {
+ t: (key: string) => {
+ return getKey(namespace, key);
+ },
+ };
+ if (!i18n) {
+ return normalFn;
+ }
+
+ const {t, ...methods} = i18n.global;
+
+ const tFn: I18nGlobalTranslation = (key: string, ...arg: any[]) => {
+ if (!key) return '';
+ if (!key.includes('.') && !namespace) return key;
+ return t(getKey(namespace, key), ...(arg as I18nTranslationRestParameters));
+ };
+
+ return {
+ ...methods,
+ t: tFn,
+ };
+}
diff --git a/webapp/packages/renderer/src/hooks/useIpcRenderer.ts b/webapp/packages/renderer/src/hooks/useIpcRenderer.ts
new file mode 100644
index 0000000..73785dc
--- /dev/null
+++ b/webapp/packages/renderer/src/hooks/useIpcRenderer.ts
@@ -0,0 +1,8 @@
+const useIpcRenderer = () => {
+ return {
+ ipcRendererSend: window.__electron_preload__ipcRendererSend,
+ ipcRendererOn: window.__electron_preload__ipcRendererOn,
+ };
+};
+
+export default useIpcRenderer;
diff --git a/webapp/packages/renderer/src/index.less b/webapp/packages/renderer/src/index.less
new file mode 100644
index 0000000..250e99f
--- /dev/null
+++ b/webapp/packages/renderer/src/index.less
@@ -0,0 +1,3 @@
+@import '@unocss/reset/tailwind.css';
+@import '@unocss/reset/tailwind-compat.css';
+
diff --git a/webapp/packages/renderer/src/index.ts b/webapp/packages/renderer/src/index.ts
new file mode 100644
index 0000000..334693e
--- /dev/null
+++ b/webapp/packages/renderer/src/index.ts
@@ -0,0 +1,33 @@
+import {createApp} from 'vue';
+import App from '/@/App.vue';
+import router from '/@/router';
+import {setupI18n} from '/@/locales/setupI18n';
+import {setupThemeSetting} from '/@/settings/themeSetting';
+import {setupStore} from '/@/store';
+import {initAppConfigStore} from '/@/logics/initAppConfigStore';
+import './index.less';
+import 'uno.css';
+
+if (import.meta.env.DEV) {
+ /**
+ * Ensure that the style at development time is consistent with the style after packaging
+ */
+ import('@arco-design/web-vue/dist/arco.less');
+}
+
+async function bootstrap() {
+ const app = createApp(App);
+ setupStore(app);
+
+ await initAppConfigStore();
+
+ await setupI18n(app);
+
+ app.use(router);
+
+ setupThemeSetting();
+
+ app.mount('#app');
+}
+
+await bootstrap();
diff --git a/webapp/packages/renderer/src/locales/helper.ts b/webapp/packages/renderer/src/locales/helper.ts
new file mode 100644
index 0000000..44c34f3
--- /dev/null
+++ b/webapp/packages/renderer/src/locales/helper.ts
@@ -0,0 +1,11 @@
+import type {LocaleType} from '/#/config';
+
+export const loadLocalePool: LocaleType[] = [];
+
+export function setHtmlPageLang(locale: LocaleType) {
+ document.querySelector('html')?.setAttribute('lang', locale);
+}
+
+export function setLoadLocalePool(cb: (loadLocalePool: LocaleType[]) => void) {
+ cb(loadLocalePool);
+}
diff --git a/webapp/packages/renderer/src/locales/lang/en-US.json b/webapp/packages/renderer/src/locales/lang/en-US.json
new file mode 100644
index 0000000..3933bd1
--- /dev/null
+++ b/webapp/packages/renderer/src/locales/lang/en-US.json
@@ -0,0 +1,37 @@
+{
+ "common": {
+ "theme": "Theme",
+ "light": "Light",
+ "dark": "Dark",
+ "language": "Language",
+ "update": "Update",
+ "global": "Global",
+ "china": "China",
+ "install": "Install",
+ "installTips": "Used AAS before? Import your configs here"
+ },
+ "import": {
+ "title": "Import user configs from old AAS",
+ "tips": "Import configs from old AAS",
+ "error": "Import failed, please check your configs",
+ "step1": "Select old config files",
+ "step2": "Confirm import",
+ "step3": "Import succeed",
+ "filePathTips": " under Present profile:",
+ "btnOk": "Confirm",
+ "btnImport": "Import",
+ "btnGoBack": "Back",
+ "btnReimport": "Reimport",
+ "fileName": "File Name",
+ "lastModify": "Last Modify Time",
+ "file": {
+ "choose": "Choose files"
+ }
+ },
+ "modal": {
+ "closeTipTitle": "Sure to close AAS ?",
+ "closeTipContent": "All running instances will be terminated",
+ "cancelText": "Cancel",
+ "okText": "Confirm"
+ }
+}
diff --git a/webapp/packages/renderer/src/locales/lang/ja-JP.json b/webapp/packages/renderer/src/locales/lang/ja-JP.json
new file mode 100644
index 0000000..5bc3c03
--- /dev/null
+++ b/webapp/packages/renderer/src/locales/lang/ja-JP.json
@@ -0,0 +1,37 @@
+{
+ "common": {
+ "theme": "テーマ",
+ "light": "ライトテーマ",
+ "dark": "ダークテーマ",
+ "language": "言語",
+ "update": "アップデート",
+ "global": "グローバル",
+ "china": "中国",
+ "install": "インストール",
+ "installTips": "以前に AAS を使用したことがありますか?ここで設定をインポートすることができます"
+ },
+ "import": {
+ "title": "既存の AAS からユーザー設定をインポートする",
+ "tips": "AAS の設定ファイルをインポートすると、以前の設定をすべて復元することができます",
+ "error": "ファイルの読み込みに失敗しました",
+ "step1": "インポートするファイルを選択",
+ "step2": "インポート中",
+ "step3": "インポート完了",
+ "filePathTips": " の中で以下の設定ファイルがあります:",
+ "btnOk": "確認",
+ "btnImport": "インポート",
+ "btnGoBack": "戻る",
+ "btnReimport": "再インポート",
+ "fileName": "ファイル名",
+ "lastModify": "最終更新日時",
+ "file": {
+ "choose": "ファイルを選択"
+ }
+ },
+ "modal": {
+ "closeTipTitle": "AAS を閉じますか?",
+ "closeTipContent": "稼働中のすべてのインスタンスも停止します",
+ "cancelText": "キャンセル",
+ "okText": "確認"
+ }
+}
diff --git a/webapp/packages/renderer/src/locales/lang/zh-CN.json b/webapp/packages/renderer/src/locales/lang/zh-CN.json
new file mode 100644
index 0000000..e580c43
--- /dev/null
+++ b/webapp/packages/renderer/src/locales/lang/zh-CN.json
@@ -0,0 +1,37 @@
+{
+ "common": {
+ "theme": "主题",
+ "light": "亮色主题",
+ "dark": "黑暗主题",
+ "language": "语言",
+ "update": "更新",
+ "global": "全球",
+ "china": "中国大陆",
+ "install": "安装",
+ "installTips": "以前使用过 AAS?在这里导入你的设置"
+ },
+ "import": {
+ "title": "从已有AAS中导入用户设置",
+ "tips": "请将你的 AAS 设置文件拖拽到这里",
+ "error": "导入失败,请检查文件是否正确",
+ "step1": "选择旧的 AAS",
+ "step2": "确认配置文件",
+ "step3": "导入完成",
+ "filePathTips": " 下存在的配置文件:",
+ "btnOk": "确认",
+ "btnImport": "导入",
+ "btnGoBack": "返回",
+ "btnReimport": "重新导入",
+ "fileName": "文件名",
+ "lastModify": "最后修改时间",
+ "file": {
+ "choose": "点击此处选择文件"
+ }
+ },
+ "modal": {
+ "closeTipTitle": "确定要关闭AAS吗?",
+ "closeTipContent": "所有正在运行的AAS实例都将被终止",
+ "cancelText": "取消",
+ "okText": "确定"
+ }
+}
diff --git a/webapp/packages/renderer/src/locales/lang/zh-TW.json b/webapp/packages/renderer/src/locales/lang/zh-TW.json
new file mode 100644
index 0000000..64bb891
--- /dev/null
+++ b/webapp/packages/renderer/src/locales/lang/zh-TW.json
@@ -0,0 +1,37 @@
+{
+ "common": {
+ "theme": "主題",
+ "light": "亮色主題",
+ "dark": "黑暗主題",
+ "language": "語言",
+ "update": "更新",
+ "global": "全球",
+ "china": "中國大陸",
+ "install": "安裝",
+ "installTips": "先前使用過AAS?在這裡導入你的設定"
+ },
+ "import": {
+ "title": "從已有AAS中導入用戶設定",
+ "tips": "請將你的 AAS 設定檔拖拽到這裡",
+ "error": "匯入失敗,請檢查檔是否正確",
+ "step1": "選擇舊的AAS",
+ "step2": "選擇要導入的設定",
+ "step3": "導入成功",
+ "filePathTips": " 下存在的配置檔:",
+ "btnOk": "確定",
+ "btnImport": "導入",
+ "btnGoBack": "返回",
+ "btnReimport": "重新導入",
+ "fileName": "檔名稱",
+ "lastModify": "最後修改時間",
+ "file": {
+ "choose": "點擊此處選擇檔"
+ }
+ },
+ "modal": {
+ "closeTipTitle": "確認要關閉AAS嗎?",
+ "closeTipContent": "所有正在運行的AAS實例都將被終止",
+ "cancelText": "取消",
+ "okText": "確定"
+ }
+}
diff --git a/webapp/packages/renderer/src/locales/setupI18n.ts b/webapp/packages/renderer/src/locales/setupI18n.ts
new file mode 100644
index 0000000..9320f37
--- /dev/null
+++ b/webapp/packages/renderer/src/locales/setupI18n.ts
@@ -0,0 +1,43 @@
+import type {I18n, I18nOptions} from 'vue-i18n';
+import {createI18n} from 'vue-i18n';
+import type {App} from 'vue';
+import {localeSetting} from '/@/settings/localSetting';
+import {useAppStore} from '/@/store/modules/app';
+import messages from '@intlify/unplugin-vue-i18n/messages';
+import {unref} from 'vue';
+
+export let i18n: ReturnType>;
+
+const {fallback, availableLocales} = localeSetting;
+
+async function createI18nOptions(): Promise {
+ const appStore = useAppStore();
+ const locale = unref(appStore.getLanguage) || 'en-US';
+ // setHtmlPageLang(locale);
+ // setLoadLocalePool(loadLocalePool => {
+ // loadLocalePool.push(locale);
+ // });
+
+ return {
+ legacy: false,
+ locale,
+ fallbackLocale: fallback,
+ messages: {
+ [locale]: messages[locale],
+ },
+ availableLocales: availableLocales,
+ sync: false, //If you don’t want to inherit locale from global scope, you need to set sync of i18n component option to false.
+ silentTranslationWarn: true, // true - warning off
+ missingWarn: false,
+ silentFallbackWarn: true,
+ };
+}
+
+// setup i18n instance with glob
+export async function setupI18n(app: App) {
+ const options = await createI18nOptions();
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ i18n = createI18n(options) as I18n;
+ app.use(i18n);
+}
diff --git a/webapp/packages/renderer/src/locales/useLocale.ts b/webapp/packages/renderer/src/locales/useLocale.ts
new file mode 100644
index 0000000..b53599d
--- /dev/null
+++ b/webapp/packages/renderer/src/locales/useLocale.ts
@@ -0,0 +1,50 @@
+/**
+ * Multi-language related operations
+ */
+import type {LocaleType} from '/#/config';
+import {i18n} from './setupI18n';
+import {useLocaleStoreWithOut} from '/@/store/modules/locale';
+import {unref, computed} from 'vue';
+import messages from '@intlify/unplugin-vue-i18n/messages';
+
+function setI18nLanguage(locale: LocaleType) {
+ const localeStore = useLocaleStoreWithOut();
+ if (i18n.mode === 'legacy') {
+ i18n.global.locale = locale;
+ } else {
+ (i18n.global.locale as any).value = locale;
+ }
+ localeStore.setLocaleInfo({locale});
+}
+
+export function useLocale() {
+ const localeStore = useLocaleStoreWithOut();
+ const getLocale = computed(() => localeStore.getLocale);
+
+ const getArcoLocale = computed((): any => {
+ return i18n.global.getLocaleMessage(unref(getLocale)) ?? {};
+ });
+
+ // Switching the language will change the locale of useI18n
+ // And submit to configuration modification
+ async function changeLocale(locale: LocaleType) {
+ const globalI18n = i18n.global;
+ const currentLocale = unref(globalI18n.locale);
+ if (currentLocale === locale) {
+ return locale;
+ }
+ const langModule = messages[locale];
+ if (!langModule) return;
+
+ globalI18n.setLocaleMessage(locale, langModule);
+
+ setI18nLanguage(locale);
+ return locale;
+ }
+
+ return {
+ getLocale,
+ changeLocale,
+ getArcoLocale,
+ };
+}
diff --git a/webapp/packages/renderer/src/logics/error-handle/index.ts b/webapp/packages/renderer/src/logics/error-handle/index.ts
new file mode 100644
index 0000000..52de8d6
--- /dev/null
+++ b/webapp/packages/renderer/src/logics/error-handle/index.ts
@@ -0,0 +1,156 @@
+import type {App} from 'vue';
+import useIpcRenderer from '/@/hooks/useIpcRenderer';
+import {PAGE_ERROR} from '@common/constant/eventNames';
+import type {ErrorLogInfo} from '/#/store';
+import {ErrorTypeEnum} from '/#/store';
+
+function addErrorLogInfo(info: Record) {
+ const {ipcRendererSend} = useIpcRenderer();
+ ipcRendererSend(PAGE_ERROR, JSON.stringify(info));
+}
+
+/**
+ * get comp name
+ * @param vm
+ */
+function formatComponentName(vm: any) {
+ if (vm.$root === vm) {
+ return {
+ name: 'root',
+ path: 'root',
+ };
+ }
+
+ const options = vm.$options as any;
+ if (!options) {
+ return {
+ name: 'anonymous',
+ path: 'anonymous',
+ };
+ }
+ const name = options.name || options._componentTag;
+ return {
+ name: name,
+ path: options.__file,
+ };
+}
+
+export function scriptErrorHandler(
+ event: Event | string,
+ source?: string,
+ lineno?: number,
+ colno?: number,
+ error?: Error,
+) {
+ if (event === 'Script error.' && !source) {
+ return false;
+ }
+ const errorInfo: Partial = {};
+ colno = colno || (window.event && (window.event as any).errorCharacter) || 0;
+ errorInfo.message = event as string;
+ if (error?.stack) {
+ errorInfo.stack = error.stack;
+ } else {
+ errorInfo.stack = '';
+ }
+ const name = source ? source.substr(source.lastIndexOf('/') + 1) : 'script';
+ addErrorLogInfo({
+ type: ErrorTypeEnum.SCRIPT,
+ name: name,
+ file: source as string,
+ detail: 'lineno' + lineno,
+ url: window.location.href,
+ ...(errorInfo as Pick),
+ });
+ return true;
+}
+
+/**
+ * Handling error stack information
+ * @param error
+ */
+function processStackMsg(error: Error) {
+ if (!error.stack) {
+ return '';
+ }
+ let stack = error.stack
+ .replace(/\n/gi, '') // Remove line breaks to save the size of the transmitted content
+ .replace(/\bat\b/gi, '@') // At in chrome, @ in ff
+ .split('@') // Split information with @
+ .slice(0, 9) // The maximum stack length (Error.stackTraceLimit = 10), so only take the first 10
+ .map(v => v.replace(/^\s*|\s*$/g, '')) // Remove extra spaces
+ .join('~') // Manually add separators for later display
+ .replace(/\?[^:]+/gi, ''); // Remove redundant parameters of js file links (?x=1 and the like)
+ const msg = error.toString();
+ if (stack.indexOf(msg) < 0) {
+ stack = msg + '@' + stack;
+ }
+ return stack;
+}
+
+function vueErrorHandler(err: Error, vm: any, info: string) {
+ const {name, path} = formatComponentName(vm);
+ addErrorLogInfo({
+ type: ErrorTypeEnum.VUE,
+ name,
+ file: path,
+ message: err.message,
+ stack: processStackMsg(err),
+ detail: info,
+ url: window.location.href,
+ });
+}
+
+function registerPromiseErrorHandler() {
+ window.addEventListener(
+ 'unhandledrejection',
+ function (event) {
+ addErrorLogInfo({
+ type: ErrorTypeEnum.PROMISE,
+ name: 'Promise Error!',
+ file: 'none',
+ detail: 'promise error!',
+ url: window.location.href,
+ stack: 'promise error!',
+ message: event.reason,
+ });
+ },
+ true,
+ );
+}
+
+function registerResourceErrorHandler() {
+ // Monitoring resource loading error(img,script,css,and jsonp)
+ window.addEventListener(
+ 'error',
+ function (e: Event) {
+ const target = e.target ? e.target : (e.srcElement as any);
+ addErrorLogInfo({
+ type: ErrorTypeEnum.RESOURCE,
+ name: 'Resource Error!',
+ file: (e.target || ({} as any)).currentSrc,
+ detail: JSON.stringify({
+ tagName: target.localName,
+ html: target.outerHTML,
+ type: e.type,
+ }),
+ url: window.location.href,
+ stack: 'resource is not found',
+ message: (e.target || ({} as any)).localName + ' is load error',
+ });
+ },
+ true,
+ );
+}
+
+export function setupErrorHandle(app: App) {
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+ // @ts-ignore
+ app.config.errorHandler = vueErrorHandler;
+
+ // script error
+ window.onerror = scriptErrorHandler;
+
+ registerPromiseErrorHandler();
+ registerResourceErrorHandler();
+}
diff --git a/webapp/packages/renderer/src/logics/initAppConfigStore.ts b/webapp/packages/renderer/src/logics/initAppConfigStore.ts
new file mode 100644
index 0000000..61e6083
--- /dev/null
+++ b/webapp/packages/renderer/src/logics/initAppConfigStore.ts
@@ -0,0 +1,14 @@
+import {useAppStore} from '/@/store/modules/app';
+import {repositoryValueMap} from '/@/settings/repositorySeeing';
+
+export async function initAppConfigStore() {
+ const appStore = useAppStore();
+ const config = await window.__electron_preload__getAlasConfig();
+ appStore.setTheme(config?.theme ?? 'light');
+ appStore.setLanguage(config?.language ?? 'zh-CN');
+ appStore.setRepository(
+ (repositoryValueMap[config?.repository] as 'global' | 'china') ?? 'global',
+ );
+ appStore.setWebuiUrl(config?.webuiUrl ?? '127.0.0.1:22367');
+ appStore.setAlasPath(config?.alasPath ?? '');
+}
diff --git a/webapp/packages/renderer/src/router.ts b/webapp/packages/renderer/src/router.ts
new file mode 100644
index 0000000..b1faceb
--- /dev/null
+++ b/webapp/packages/renderer/src/router.ts
@@ -0,0 +1,15 @@
+import {createRouter, createWebHashHistory} from 'vue-router';
+import Alas from '/@/components/Alas.vue';
+
+const routes = [
+ {path: '/', name: 'Loading', component: () => import('./views/LoadingPage.vue')},
+ {path: '/Install', name: 'InstallPage', component: () => import('./views/InstallAlas.vue')},
+ {path: '/Launch', name: 'LaunchPage', component: () => import('./views/Launch.vue')},
+ {path: '/Import', name: 'ImportConfig', component: () => import('./views/ImportConfig.vue')},
+ {path: '/Alas', name: 'Alas', component: Alas},
+];
+
+export default createRouter({
+ routes,
+ history: createWebHashHistory(),
+});
diff --git a/webapp/packages/renderer/src/settings/localSetting.ts b/webapp/packages/renderer/src/settings/localSetting.ts
new file mode 100644
index 0000000..288b99d
--- /dev/null
+++ b/webapp/packages/renderer/src/settings/localSetting.ts
@@ -0,0 +1,38 @@
+import type {LocaleSetting, LocaleType} from '/#/config';
+
+export const LOCALE: {[key: string]: LocaleType} = {
+ ZH_CN: 'zh-CN',
+ EN_US: 'en-US',
+ JA_JP: 'ja-JP',
+ ZH_TW: 'zh-TW',
+};
+
+// locale list
+export const localeList: {label: string; value: keyof typeof LOCALE}[] = [
+ {
+ label: '简体中文',
+ value: LOCALE.ZH_CN,
+ },
+ {
+ label: 'English',
+ value: LOCALE.EN_US,
+ },
+ {
+ label: '日本語',
+ value: LOCALE.JA_JP,
+ },
+ {
+ label: '繁體中文',
+ value: LOCALE.ZH_TW,
+ },
+];
+
+export const localeSetting: LocaleSetting = {
+ showPicker: true,
+ // Locale
+ locale: LOCALE.EN_US,
+ // Default locale
+ fallback: LOCALE.JA_JP,
+ // available Locales
+ availableLocales: [LOCALE.ZH_CN, LOCALE.EN_US, LOCALE.JA_JP, LOCALE.ZH_TW],
+};
diff --git a/webapp/packages/renderer/src/settings/repositorySeeing.ts b/webapp/packages/renderer/src/settings/repositorySeeing.ts
new file mode 100644
index 0000000..bcb87e8
--- /dev/null
+++ b/webapp/packages/renderer/src/settings/repositorySeeing.ts
@@ -0,0 +1,22 @@
+import type {OptionItem} from '/#/config';
+
+export const repositoryMap = {
+ china: 'cn',
+ global: 'global',
+};
+
+export const repositoryValueMap = {
+ [repositoryMap.global]: 'global',
+ [repositoryMap.china]: 'china',
+};
+
+export const repositoryList: OptionItem[] = [
+ {
+ value: repositoryMap.china,
+ label: '中国大陆',
+ },
+ {
+ value: repositoryMap.global,
+ label: '全球',
+ },
+];
diff --git a/webapp/packages/renderer/src/settings/themeSetting.ts b/webapp/packages/renderer/src/settings/themeSetting.ts
new file mode 100644
index 0000000..9b5b4d9
--- /dev/null
+++ b/webapp/packages/renderer/src/settings/themeSetting.ts
@@ -0,0 +1,32 @@
+import type {ThemeVal} from '/#/config';
+
+export function setupThemeSetting(theme?: ThemeVal) {
+ if (!theme && window.matchMedia('(prefers-color-scheme: dark)').matches) {
+ setTheme('dark');
+ return;
+ } else if (!theme && !window.matchMedia('(prefers-color-scheme: dark)').matches) {
+ setTheme('light');
+ return;
+ }
+ if (theme && theme === 'dark') {
+ setTheme('dark');
+ window.__electron_preload__ipcRendererSend('electron-theme', 'dark');
+ } else {
+ setTheme('light');
+ window.__electron_preload__ipcRendererSend('electron-theme', 'light');
+ }
+}
+
+export function setTheme(theme: ThemeVal) {
+ if (theme === 'dark') {
+ document.documentElement.classList.remove('light');
+ document.documentElement.classList.add('dark');
+ // Set to dark theme
+ document.body.setAttribute('arco-theme', 'dark');
+ } else {
+ document.documentElement.classList.remove('dark');
+ document.documentElement.classList.add('light');
+ // Restore the light color theme
+ document.body.setAttribute('arco-theme', 'light');
+ }
+}
diff --git a/webapp/packages/renderer/src/store/index.ts b/webapp/packages/renderer/src/store/index.ts
new file mode 100644
index 0000000..79380d2
--- /dev/null
+++ b/webapp/packages/renderer/src/store/index.ts
@@ -0,0 +1,10 @@
+import type {App} from 'vue';
+import {createPinia} from 'pinia';
+
+const store = createPinia();
+
+export function setupStore(app: App) {
+ app.use(store);
+}
+
+export {store};
diff --git a/webapp/packages/renderer/src/store/modules/app.ts b/webapp/packages/renderer/src/store/modules/app.ts
new file mode 100644
index 0000000..fb25a57
--- /dev/null
+++ b/webapp/packages/renderer/src/store/modules/app.ts
@@ -0,0 +1,53 @@
+import {defineStore} from 'pinia';
+import {store} from '/@/store';
+import type {LocaleType, ThemeVal} from '/#/config';
+import type {repositoryMap} from '/@/settings/repositorySeeing';
+
+export const useAppStore = defineStore({
+ id: 'app',
+ state: (): AlasConfig => ({
+ theme: 'light',
+ language: 'zh-CN',
+ repository: 'global',
+ webuiUrl: '',
+ alasPath: '',
+ }),
+ getters: {
+ getTheme(): string {
+ return this.theme;
+ },
+ getLanguage(): LocaleType {
+ return this.language;
+ },
+ getRepository(): keyof typeof repositoryMap {
+ return this.repository;
+ },
+ getWebuiUrl(): string {
+ return this.webuiUrl;
+ },
+ getAlasPath(): string {
+ return this.alasPath;
+ },
+ },
+ actions: {
+ setTheme(theme: ThemeVal) {
+ this.theme = theme;
+ },
+ setLanguage(language: LocaleType) {
+ this.language = language;
+ },
+ setRepository(repository: AlasConfig['repository']) {
+ this.repository = repository;
+ },
+ setWebuiUrl(webuiUrl: AlasConfig['webuiUrl']) {
+ this.webuiUrl = webuiUrl;
+ },
+ setAlasPath(alasPath: AlasConfig['alasPath']) {
+ this.alasPath = alasPath;
+ },
+ },
+});
+
+export function useAppStoreWithOut() {
+ return useAppStore(store);
+}
diff --git a/webapp/packages/renderer/src/store/modules/locale.ts b/webapp/packages/renderer/src/store/modules/locale.ts
new file mode 100644
index 0000000..ba77202
--- /dev/null
+++ b/webapp/packages/renderer/src/store/modules/locale.ts
@@ -0,0 +1,49 @@
+import type {LocaleSetting, LocaleType} from '/#/config';
+
+import {defineStore} from 'pinia';
+import {store} from '/@/store';
+import {localeSetting} from '/@/settings/localSetting';
+
+const lsLocaleSetting = localeSetting as LocaleSetting;
+
+interface LocaleState {
+ localInfo: LocaleSetting;
+}
+
+export const useLocaleStore = defineStore({
+ id: 'app-locale',
+ state: (): LocaleState => ({
+ localInfo: lsLocaleSetting,
+ }),
+ getters: {
+ getShowPicker(): boolean {
+ return !!this.localInfo?.showPicker;
+ },
+ getLocale(): LocaleType {
+ return this.localInfo?.locale ?? 'zh_CN';
+ },
+ },
+ actions: {
+ /**
+ * Set up multilingual information and cache
+ * @param info multilingual info
+ */
+ setLocaleInfo(info: Partial) {
+ this.localInfo = {...this.localInfo, ...info};
+ },
+ /**
+ * Initialize multilingual information and load the existing configuration from the local cache
+ */
+ initLocale() {
+ this.setLocaleInfo({
+ ...localeSetting,
+ ...this.localInfo,
+ });
+ },
+ },
+});
+
+// Need to be used outside the setup
+export function useLocaleStoreWithOut() {
+ return useLocaleStore(store);
+}
diff --git a/webapp/packages/renderer/src/utils/is.ts b/webapp/packages/renderer/src/utils/is.ts
new file mode 100644
index 0000000..c7fa484
--- /dev/null
+++ b/webapp/packages/renderer/src/utils/is.ts
@@ -0,0 +1,89 @@
+const toString = Object.prototype.toString;
+
+export function is(val: unknown, type: string) {
+ return toString.call(val) === `[object ${type}]`;
+}
+
+export function isDef(val?: T): val is T {
+ return typeof val !== 'undefined';
+}
+
+export function isUnDef(val?: T): val is T {
+ return !isDef(val);
+}
+
+export function isObject(val: any): val is Record {
+ return val !== null && is(val, 'Object');
+}
+
+export function isEmpty(val: T): val is T {
+ if (isArray(val) || isString(val)) {
+ return val.length === 0;
+ }
+
+ if (val instanceof Map || val instanceof Set) {
+ return val.size === 0;
+ }
+
+ if (isObject(val)) {
+ return Object.keys(val).length === 0;
+ }
+
+ return false;
+}
+
+export function isDate(val: unknown): val is Date {
+ return is(val, 'Date');
+}
+
+export function isNull(val: unknown): val is null {
+ return val === null;
+}
+
+export function isNullAndUnDef(val: unknown): val is null | undefined {
+ return isUnDef(val) && isNull(val);
+}
+
+export function isNullOrUnDef(val: unknown): val is null | undefined {
+ return isUnDef(val) || isNull(val);
+}
+
+export function isNumber(val: unknown): val is number {
+ return is(val, 'Number');
+}
+
+export function isPromise(val: unknown): val is Promise {
+ return is(val, 'Promise') && isObject(val) && isFunction(val.then) && isFunction(val.catch);
+}
+
+export function isString(val: unknown): val is string {
+ return is(val, 'String');
+}
+
+export function isFunction(val: unknown): val is Function {
+ return typeof val === 'function';
+}
+
+export function isBoolean(val: unknown): val is boolean {
+ return is(val, 'Boolean');
+}
+
+export function isRegExp(val: unknown): val is RegExp {
+ return is(val, 'RegExp');
+}
+
+export function isArray(val: any): val is Array {
+ return val && Array.isArray(val);
+}
+
+export function isWindow(val: any): val is Window {
+ return typeof window !== 'undefined' && is(val, 'Window');
+}
+
+export function isElement(val: unknown): val is Element {
+ return isObject(val) && !!val.tagName;
+}
+
+export function isMap(val: unknown): val is Map {
+ return is(val, 'Map');
+}
diff --git a/webapp/packages/renderer/src/views/ImportConfig.vue b/webapp/packages/renderer/src/views/ImportConfig.vue
new file mode 100644
index 0000000..5b32424
--- /dev/null
+++ b/webapp/packages/renderer/src/views/ImportConfig.vue
@@ -0,0 +1,364 @@
+
+
+
+
+
+
+
+ {{ t('import.title') }}
+
+
+
+
+ {{ t('import.step1') }}
+ 1
+
+
+ {{ t('import.step2') }}
+ 2
+
+
+ {{ t('import.step3') }}
+ 3
+
+
+
+
+
+
{{ stepTipsOptions[current] }}
+
+
+
+
+
+ {{ t('import.file.choose') }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ stepTipsOptions[current] }}
+
+
+ {{ fileParentPath }}{{ t('import.filePathTips') }}
+
+
+ {{ t('import.fileName') }}
+ {{ t('import.lastModify') }}
+
+
+
+
+
+ {{ fileItem.lastModifyTime }}
+
+
+
+
+
+
+
+ {{ t('import.btnGoBack') }}
+
+
+ {{ t('import.btnImport') }}
+
+
+
+
+
+
+ {{ stepTipsOptions[current] }}
+
+
+ {{ configDirPath }} {{ t('import.filePathTips') }}
+
+
+ {{ t('import.fileName') }}
+ {{ t('import.lastModify') }}
+
+
+
+
+
+ {{ fileItem.lastModifyTime }}
+
+
+
+
+
+
+ {{ t('import.btnReimport') }}
+
+
+ {{ t('import.btnOk') }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/webapp/packages/renderer/src/views/InstallAlas.vue b/webapp/packages/renderer/src/views/InstallAlas.vue
new file mode 100644
index 0000000..1c882fa
--- /dev/null
+++ b/webapp/packages/renderer/src/views/InstallAlas.vue
@@ -0,0 +1,188 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ t('common.installTips') }}
+
+
+
+
+
+
+ {{ t('common.install') }}
+
+
+
+
+
+
+
+
diff --git a/webapp/packages/renderer/src/views/Launch.vue b/webapp/packages/renderer/src/views/Launch.vue
new file mode 100644
index 0000000..a2661e1
--- /dev/null
+++ b/webapp/packages/renderer/src/views/Launch.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
diff --git a/webapp/packages/renderer/src/views/LoadingPage.vue b/webapp/packages/renderer/src/views/LoadingPage.vue
new file mode 100644
index 0000000..7f27ec7
--- /dev/null
+++ b/webapp/packages/renderer/src/views/LoadingPage.vue
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/webapp/packages/renderer/tsconfig.json b/webapp/packages/renderer/tsconfig.json
new file mode 100644
index 0000000..31f392a
--- /dev/null
+++ b/webapp/packages/renderer/tsconfig.json
@@ -0,0 +1,33 @@
+{
+ "compilerOptions": {
+ "module": "esnext",
+ "target": "esnext",
+ "sourceMap": false,
+ "moduleResolution": "Node",
+ "skipLibCheck": true,
+ "strict": true,
+ "isolatedModules": true,
+ "esModuleInterop": true,
+ "jsx": "preserve",
+ "types": ["node", "vite/client"],
+ "baseUrl": ".",
+ "paths": {
+ "#preload": ["../preload/src/index"],
+ "/@/*": ["./src/*"],
+ "/#/*": ["types/*"],
+ "@common/*": ["../common/*"]
+ },
+ "lib": ["ESNext", "dom", "dom.iterable"]
+ },
+ "include": [
+ "src/**/*.vue",
+ "src/**/*.ts",
+ "src/**/*.tsx",
+ "types/**/*.d.ts",
+ "../../types/**/*.d.ts",
+ "../../../types/**/*.d.ts",
+ "./components.d.ts"
+ ],
+ "exclude": ["**/*.spec.ts", "**/*.test.ts"],
+ "typeRoots": ["../../node_modules/@types/", "./types", "../../../types"]
+}
diff --git a/webapp/packages/renderer/types/config.d.ts b/webapp/packages/renderer/types/config.d.ts
new file mode 100644
index 0000000..60a4509
--- /dev/null
+++ b/webapp/packages/renderer/types/config.d.ts
@@ -0,0 +1,22 @@
+z;
+/**
+ * 'zh-CN' | 'en-US' | 'ja-JP' | 'zh-TW'
+ */
+export type LocaleType = 'zh-CN' | 'en-US' | 'ja-JP' | 'zh-TW';
+
+export interface LocaleSetting {
+ showPicker: boolean;
+ // Current language
+ locale: LocaleType;
+ // default language
+ fallback: LocaleType;
+ // available Locales
+ availableLocales: LocaleType[];
+}
+
+export interface OptionItem {
+ value: string;
+ label: string;
+}
+
+export type ThemeVal = 'dark' | 'light';
diff --git a/webapp/packages/renderer/types/index.d.ts b/webapp/packages/renderer/types/index.d.ts
new file mode 100644
index 0000000..c880ed9
--- /dev/null
+++ b/webapp/packages/renderer/types/index.d.ts
@@ -0,0 +1,28 @@
+import type {BinaryLike} from 'node:crypto';
+import type {AlasConfig} from '../../preload/src/alasConfig';
+import {CopyToDirOptions} from '@common/utils/copyFilesToDir';
+export {};
+
+declare global {
+ interface Window {
+ __electron_preload__sha256sum: (data: BinaryLike) => string;
+ __electron_preload__versions: string;
+ __electron_preload__ipcRendererSend: (channel: string, ...args: any[]) => void;
+ __electron_preload__ipcRendererOn: (
+ channel: string,
+ listener: (event: Electron.IpcRendererEvent, ...args: any[]) => void,
+ ) => Electron.IpcRenderer;
+ __electron_preload__getAlasConfig: () => AlasConfig;
+ __electron_preload__checkIsNeedInstall: () => boolean;
+ __electron_preload__getAlasConfigDirFiles: () => {
+ configPath: string;
+ files: {name: string; path: string; lastModifyTime: Date}[];
+ };
+ __electron_preload__modifyConfigYaml: (filePath: string, keyObj: {[k in string]: any}) => void;
+ __electron_preload__copyFilesToDir: (
+ pathList: string[],
+ targetDirPath: string,
+ options?: CopyToDirOptions | undefined,
+ ) => Promise;
+ }
+}
diff --git a/webapp/packages/renderer/types/shims-vue.d.ts b/webapp/packages/renderer/types/shims-vue.d.ts
new file mode 100644
index 0000000..f6feabb
--- /dev/null
+++ b/webapp/packages/renderer/types/shims-vue.d.ts
@@ -0,0 +1,6 @@
+declare module '*.vue' {
+ import type {DefineComponent} from 'vue';
+ // eslint-disable-next-line @typescript-eslint/ban-types, @typescript-eslint/no-explicit-any
+ const component: DefineComponent<{}, {}, any>;
+ export default component;
+}
diff --git a/webapp/packages/renderer/types/store.d.ts b/webapp/packages/renderer/types/store.d.ts
new file mode 100644
index 0000000..f50fd20
--- /dev/null
+++ b/webapp/packages/renderer/types/store.d.ts
@@ -0,0 +1,35 @@
+export enum ErrorTypeEnum {
+ VUE = 'vue',
+ SCRIPT = 'script',
+ RESOURCE = 'resource',
+ AJAX = 'ajax',
+ PROMISE = 'promise',
+}
+
+// Lock screen information
+export interface LockInfo {
+ // Password required
+ pwd?: string | undefined;
+ // Is it locked?
+ isLock?: boolean;
+}
+
+// Error-log information
+export interface ErrorLogInfo {
+ // Type of error
+ type: ErrorTypeEnum;
+ // Error file
+ file: string;
+ // Error name
+ name?: string;
+ // Error message
+ message: string;
+ // Error stack
+ stack?: string;
+ // Error detail
+ detail: string;
+ // Error url
+ url: string;
+ // Error time
+ time?: string;
+}
diff --git a/webapp/packages/renderer/uno.config.ts b/webapp/packages/renderer/uno.config.ts
new file mode 100644
index 0000000..ba89fe7
--- /dev/null
+++ b/webapp/packages/renderer/uno.config.ts
@@ -0,0 +1,26 @@
+// uno.config.ts
+import {
+ defineConfig,
+ presetAttributify,
+ presetIcons,
+ presetTypography,
+ presetUno,
+ presetWebFonts,
+ transformerDirectives,
+ transformerVariantGroup,
+} from 'unocss';
+// import {primaryColor} from './build/config/themeConfig';
+
+export default defineConfig({
+ theme: {
+ colors: {
+ primary: '#98e8e8',
+ white: '#ffffff',
+ neutral: '#C4C4C4',
+ dark: '#2f3136',
+ slate: '#020617',
+ },
+ },
+ presets: [presetUno(), presetAttributify(), presetIcons(), presetTypography(), presetWebFonts()],
+ transformers: [transformerDirectives(), transformerVariantGroup()],
+});
diff --git a/webapp/packages/renderer/vite.config.js b/webapp/packages/renderer/vite.config.js
new file mode 100644
index 0000000..e1a3b7f
--- /dev/null
+++ b/webapp/packages/renderer/vite.config.js
@@ -0,0 +1,111 @@
+/* eslint-env node */
+
+import {chrome} from '../../electron-vendors.config.json';
+import vue from '@vitejs/plugin-vue';
+import {renderer} from 'unplugin-auto-expose';
+import {join, resolve} from 'node:path';
+import {injectAppVersion} from '../../version/inject-app-version-plugin.mjs';
+import {vitePluginForArco} from '@arco-plugins/vite-vue';
+import UnoCSS from 'unocss/vite';
+import AutoImport from 'unplugin-auto-import/vite';
+import Components from 'unplugin-vue-components/vite';
+import {ArcoResolver} from 'unplugin-vue-components/resolvers';
+
+/**
+ * https://github.com/arco-design/arco-plugins/blob/main/packages/plugin-vite-react/README.md
+ */
+import VueI18nPlugin from '@intlify/unplugin-vue-i18n/vite';
+
+// your plugin installation
+
+const PACKAGE_ROOT = __dirname;
+const PROJECT_ROOT = join(PACKAGE_ROOT, '../..');
+
+/**
+ * @type {import('vite').UserConfig}
+ * @see https://vitejs.dev/config/
+ */
+const config = {
+ mode: process.env.MODE,
+ root: PACKAGE_ROOT,
+ envDir: PROJECT_ROOT,
+ resolve: {
+ alias: [
+ {
+ find: '/@/',
+ replacement: join(PACKAGE_ROOT, 'src') + '/',
+ },
+ {
+ find: 'vue-i18n',
+ replacement: 'vue-i18n/dist/vue-i18n.cjs.js',
+ },
+ {
+ find: '@common',
+ replacement: join(PACKAGE_ROOT, '../common') + '/',
+ },
+ ],
+ },
+ base: '',
+ server: {
+ fs: {
+ strict: true,
+ },
+ },
+ build: {
+ sourcemap: true,
+ target: `chrome${chrome}`,
+ outDir: 'dist',
+ assetsDir: '.',
+ rollupOptions: {
+ input: join(PACKAGE_ROOT, 'index.html'),
+ },
+ emptyOutDir: true,
+ reportCompressedSize: false,
+ },
+ test: {
+ environment: 'happy-dom',
+ },
+ css: {
+ preprocessorOptions: {
+ less: {
+ javascriptEnabled: true,
+ },
+ },
+ },
+ plugins: [
+ vue(),
+ renderer.vite({
+ preloadEntry: join(PACKAGE_ROOT, '../preload/src/index.ts'),
+ }),
+ injectAppVersion(),
+ AutoImport({
+ resolvers: [ArcoResolver()],
+ }),
+ Components({
+ resolvers: [
+ ArcoResolver({
+ sideEffect: true,
+ }),
+ ],
+ }),
+ new vitePluginForArco({
+ theme: '@arco-themes/vue-am-alas',
+ }),
+ VueI18nPlugin({
+ include: resolve(PACKAGE_ROOT, './src/locales/lang/**'),
+ }),
+ UnoCSS({
+ configFile: './uno.config.ts',
+ }),
+ ],
+ optimizeDeps: {
+ include: [
+ '@arco-design/web-vue/es/locale/lang/zh-cn',
+ '@arco-design/web-vue/es/locale/lang/en-us',
+ '@arco-design/web-vue/es/locale/lang/ja-jp',
+ '@arco-design/web-vue/es/locale/lang/zh-tw',
+ ],
+ },
+};
+
+export default config;
diff --git a/webapp/scripts/build.js b/webapp/scripts/build.js
new file mode 100644
index 0000000..2e5a9b0
--- /dev/null
+++ b/webapp/scripts/build.js
@@ -0,0 +1,41 @@
+#!/usr/bin/node
+const {build} = require('vite');
+const {dirname} = require('path');
+
+/** @type 'production' | 'development' | 'test' */
+const mode = (process.env.MODE = process.env.MODE || 'production');
+
+const packagesConfigs = [
+ 'packages/main/vite.config.js',
+ 'packages/preload/vite.config.js',
+ 'packages/renderer/vite.config.js',
+];
+
+/**
+ * Run `vite build` for config file
+ */
+const buildByConfig = configFile => build({configFile, mode});
+(async () => {
+ try {
+ const totalTimeLabel = 'Total bundling time';
+ console.time(totalTimeLabel);
+
+ for (const packageConfigPath of packagesConfigs) {
+ const consoleGroupName = `${dirname(packageConfigPath)}/`;
+ console.group(consoleGroupName);
+
+ const timeLabel = 'Bundling time';
+ console.time(timeLabel);
+
+ await buildByConfig(packageConfigPath);
+
+ console.timeEnd(timeLabel);
+ console.groupEnd();
+ console.log('\n'); // Just for pretty print
+ }
+ console.timeEnd(totalTimeLabel);
+ } catch (e) {
+ console.error(e);
+ process.exit(1);
+ }
+})();
diff --git a/webapp/scripts/update-electron-vendors.js b/webapp/scripts/update-electron-vendors.js
new file mode 100644
index 0000000..b6ab851
--- /dev/null
+++ b/webapp/scripts/update-electron-vendors.js
@@ -0,0 +1,60 @@
+const {writeFile, readFile} = require('fs/promises');
+const {execSync} = require('child_process');
+const electron = require('electron');
+const path = require('path');
+
+/**
+ * Returns versions of electron vendors
+ * The performance of this feature is very poor and can be improved
+ * @see https://github.com/electron/electron/issues/28006
+ *
+ * @returns {NodeJS.ProcessVersions}
+ */
+function getVendors() {
+ const output = execSync(`${electron} -p "JSON.stringify(process.versions)"`, {
+ env: {ELECTRON_RUN_AS_NODE: '1'},
+ encoding: 'utf-8',
+ });
+
+ return JSON.parse(output);
+}
+
+function formattedJSON(obj) {
+ return JSON.stringify(obj, null, 2) + '\n';
+}
+
+function updateVendors() {
+ const electronRelease = getVendors();
+
+ const nodeMajorVersion = electronRelease.node.split('.')[0];
+ const chromeMajorVersion = electronRelease.v8.split('.')[0] + electronRelease.v8.split('.')[1];
+
+ const packageJSONPath = path.resolve(process.cwd(), 'package.json');
+
+ return Promise.all([
+ writeFile(
+ './electron-vendors.config.json',
+ formattedJSON({
+ chrome: chromeMajorVersion,
+ node: nodeMajorVersion,
+ }),
+ ),
+
+ readFile(packageJSONPath)
+ .then(JSON.parse)
+ .then(packageJSON => {
+ if (!packageJSON || !Array.isArray(packageJSON.browserslist)) {
+ throw new Error(`Can't find browserslist in ${packageJSONPath}`);
+ }
+
+ packageJSON.browserslist = [`Chrome ${chromeMajorVersion}`];
+
+ return writeFile(packageJSONPath, formattedJSON(packageJSON));
+ }),
+ ]);
+}
+
+updateVendors().catch(err => {
+ console.error(err);
+ process.exit(1);
+});
diff --git a/webapp/scripts/update-electron-vendors.mjs b/webapp/scripts/update-electron-vendors.mjs
new file mode 100644
index 0000000..e6e9cc0
--- /dev/null
+++ b/webapp/scripts/update-electron-vendors.mjs
@@ -0,0 +1,18 @@
+/**
+ * This script should be run in electron context
+ * @example
+ * ELECTRON_RUN_AS_NODE=1 electron scripts/update-electron-vendors.mjs
+ */
+
+import {writeFileSync} from 'fs';
+import path from 'path';
+
+const electronRelease = process.versions;
+
+const node = electronRelease.node.split('.')[0];
+const chrome = electronRelease.v8.split('.').splice(0, 2).join('');
+
+const browserslistrcPath = path.resolve(process.cwd(), '.browserslistrc');
+
+writeFileSync('./.electron-vendors.cache.json', JSON.stringify({chrome, node}));
+writeFileSync(browserslistrcPath, `Chrome ${chrome}`, 'utf8');
diff --git a/webapp/scripts/watch.js b/webapp/scripts/watch.js
new file mode 100644
index 0000000..dda00bc
--- /dev/null
+++ b/webapp/scripts/watch.js
@@ -0,0 +1,113 @@
+#!/usr/bin/node
+
+const {createServer, build, createLogger} = require('vite');
+const electronPath = require('electron');
+const {spawn} = require('child_process');
+
+/** @type 'production' | 'development' | 'test' */
+const mode = (process.env.MODE = process.env.MODE || 'development');
+
+/** @type {import('vite').LogLevel} */
+const LOG_LEVEL = 'warn';
+
+/** @type {import('vite').InlineConfig} */
+const sharedConfig = {
+ mode,
+ build: {
+ watch: {},
+ },
+ logLevel: LOG_LEVEL,
+};
+
+/**
+ * @param configFile
+ * @param writeBundle
+ * @param name
+ * @returns {Promise | import('vite').RollupWatcher>}
+ */
+const getWatcher = ({name, configFile, writeBundle}) => {
+ return build({
+ ...sharedConfig,
+ configFile,
+ plugins: [{name, writeBundle}],
+ });
+};
+
+/**
+ * Start or restart App when source files are changed
+ * @param {import('vite').ViteDevServer} viteDevServer
+ * @returns {Promise | import('vite').RollupWatcher>}
+ */
+const setupMainPackageWatcher = viteDevServer => {
+ // Write a value to an environment variable to pass it to the main process.
+ {
+ const protocol = `http${viteDevServer.config.server.https ? 's' : ''}:`;
+ const host = viteDevServer.config.server.host || 'localhost';
+ const port = viteDevServer.config.server.port; // Vite searches for and occupies the first free port: 3000, 3001, 3002 and so on
+ const path = '/';
+ process.env.VITE_DEV_SERVER_URL = `${protocol}//${host}:${port}${path}`;
+ }
+
+ const logger = createLogger(LOG_LEVEL, {
+ prefix: '[main]',
+ });
+
+ /** @type {ChildProcessWithoutNullStreams | null} */
+ let spawnProcess = null;
+
+ return getWatcher({
+ name: 'reload-app-on-main-package-change',
+ configFile: 'packages/main/vite.config.js',
+ writeBundle() {
+ if (spawnProcess !== null) {
+ spawnProcess.kill('SIGINT');
+ spawnProcess = null;
+ }
+
+ spawnProcess = spawn(String(electronPath), ['.']);
+
+ spawnProcess.stdout.on(
+ 'data',
+ d => d.toString().trim() && logger.warn(d.toString(), {timestamp: true}),
+ );
+ spawnProcess.stderr.on(
+ 'data',
+ d => d.toString().trim() && logger.error(d.toString(), {timestamp: true}),
+ );
+ },
+ });
+};
+
+/**
+ * Start or restart App when source files are changed
+ * @param {import('vite').ViteDevServer} viteDevServer
+ * @returns {Promise | import('vite').RollupWatcher>}
+ */
+const setupPreloadPackageWatcher = viteDevServer => {
+ return getWatcher({
+ name: 'reload-page-on-preload-package-change',
+ configFile: 'packages/preload/vite.config.js',
+ writeBundle() {
+ viteDevServer.ws.send({
+ type: 'full-reload',
+ });
+ },
+ });
+};
+
+(async () => {
+ try {
+ const viteDevServer = await createServer({
+ ...sharedConfig,
+ configFile: 'packages/renderer/vite.config.js',
+ });
+
+ await viteDevServer.listen();
+
+ await setupPreloadPackageWatcher(viteDevServer);
+ await setupMainPackageWatcher(viteDevServer);
+ } catch (e) {
+ console.error(e);
+ process.exit(1);
+ }
+})();
diff --git a/webapp/scripts/watch.mjs b/webapp/scripts/watch.mjs
new file mode 100644
index 0000000..17d0f5d
--- /dev/null
+++ b/webapp/scripts/watch.mjs
@@ -0,0 +1,104 @@
+#!/usr/bin/env node
+
+import {build, createServer} from 'vite';
+import electronPath from 'electron';
+import {spawn} from 'child_process';
+
+/** @type 'production' | 'development'' */
+const mode = (process.env.MODE = process.env.MODE || 'development');
+
+/** @type {import('vite').LogLevel} */
+const logLevel = 'warn';
+
+/**
+ * Setup watcher for `main` package
+ * On file changed it totally re-launch electron app.
+ * @param {import('vite').ViteDevServer} watchServer Renderer watch server instance.
+ * Needs to set up `VITE_DEV_SERVER_URL` environment variable from {@link import('vite').ViteDevServer.resolvedUrls}
+ */
+function setupMainPackageWatcher({resolvedUrls}) {
+ process.env.VITE_DEV_SERVER_URL = resolvedUrls.local[0];
+
+ /** @type {ChildProcess | null} */
+ let electronApp = null;
+
+ return build({
+ mode,
+ logLevel,
+ configFile: 'packages/main/vite.config.js',
+ build: {
+ /**
+ * Set to {} to enable rollup watcher
+ * @see https://vitejs.dev/config/build-options.html#build-watch
+ */
+ watch: {},
+ },
+ plugins: [
+ {
+ name: 'reload-app-on-main-package-change',
+ writeBundle() {
+ /** Kill electron if process already exist */
+ if (electronApp !== null) {
+ electronApp.removeListener('exit', process.exit);
+ electronApp.kill('SIGINT');
+ electronApp = null;
+ }
+
+ /** Spawn new electron process */
+ electronApp = spawn(String(electronPath), ['--inspect', '.'], {
+ stdio: 'inherit',
+ });
+
+ /** Stops the watch script when the application has been quit */
+ electronApp.addListener('exit', process.exit);
+ },
+ },
+ ],
+ });
+}
+
+/**
+ * Setup watcher for `preload` package
+ * On file changed it reload web page.
+ * @param {import('vite').ViteDevServer} watchServer Renderer watch server instance.
+ * Required to access the web socket of the page. By sending the `full-reload` command to the socket, it reloads the web page.
+ */
+function setupPreloadPackageWatcher({ws}) {
+ return build({
+ mode,
+ logLevel,
+ configFile: 'packages/preload/vite.config.js',
+ build: {
+ /**
+ * Set to {} to enable rollup watcher
+ * @see https://vitejs.dev/config/build-options.html#build-watch
+ */
+ watch: {},
+ },
+ plugins: [
+ {
+ name: 'reload-page-on-preload-package-change',
+ writeBundle() {
+ ws.send({
+ type: 'full-reload',
+ });
+ },
+ },
+ ],
+ });
+}
+
+/**
+ * Dev server for Renderer package
+ * This must be the first,
+ * because the {@link setupMainPackageWatcher} and {@link setupPreloadPackageWatcher}
+ * depend on the dev server properties
+ */
+const rendererWatchServer = await createServer({
+ mode,
+ logLevel,
+ configFile: 'packages/renderer/vite.config.js',
+}).then(s => s.listen());
+
+await setupPreloadPackageWatcher(rendererWatchServer);
+await setupMainPackageWatcher(rendererWatchServer);
diff --git a/webapp/tests/app.spec.js b/webapp/tests/app.spec.js
new file mode 100644
index 0000000..4609e7a
--- /dev/null
+++ b/webapp/tests/app.spec.js
@@ -0,0 +1,70 @@
+const {_electron: electron} = require('playwright');
+const {strict: assert} = require('assert');
+
+// Playwright has EXPERIMENTAL electron support.
+(async () => {
+ const electronApp = await electron.launch({args: ['.']});
+
+ /**
+ * App main window state
+ * @type {{isVisible: boolean; isDevToolsOpened: boolean; isCrashed: boolean}}
+ */
+ const windowState = await electronApp.evaluate(({BrowserWindow}) => {
+ const mainWindow = BrowserWindow.getAllWindows()[0];
+
+ const getState = () => ({
+ isVisible: mainWindow.isVisible(),
+ isDevToolsOpened: mainWindow.webContents.isDevToolsOpened(),
+ isCrashed: mainWindow.webContents.isCrashed(),
+ });
+
+ return new Promise(resolve => {
+ if (mainWindow.isVisible()) {
+ resolve(getState());
+ } else mainWindow.once('ready-to-show', () => setTimeout(() => resolve(getState()), 0));
+ });
+ });
+
+ // Check main window state
+ assert.ok(windowState.isVisible, 'Main window not visible');
+ assert.ok(!windowState.isDevToolsOpened, 'DevTools opened');
+ assert.ok(!windowState.isCrashed, 'Window crashed');
+
+ /**
+ * Rendered Main window web-page
+ * @type {Page}
+ */
+ const page = await electronApp.firstWindow();
+
+ // Check web-page content
+ const element = await page.$('#app', {strict: true});
+ assert.notStrictEqual(element, null, "Can't find root element");
+ assert.notStrictEqual((await element.innerHTML()).trim(), '', 'Window content is empty');
+
+ // Checking the framework.
+ // It is assumed that on the main screen there is a `