123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- import { queenApi } from "/node_modules/.vite/deps/queenjs.js?v=aff0ab7e";
- import { Controller } from "/src/comm/core/controller.ts";
- import { RxValue } from "/src/comm/core/rxValue.ts";
- import { useCtx } from "/src/comm/ctx/index.ts?t=1702975066869";
- import { message } from "/node_modules/.vite/deps/ant-design-vue.js?v=f7d2fa05";
- class App {
- name = "";
- version = "0.0.0";
- lastUpdateDate = "";
- icon = "";
- revAssets = [];
- size = "0MB";
- tags = "";
- desc = "";
- entry = "";
- type = "";
- key = "";
- instCount = 1;
- Version = "";
- ExePath = "";
- }
- export class InstallController extends Controller {
- state = RxValue.create({
- apps: [],
- installing: false,
- downProgress: "",
- installProgress: ""
- });
- async onReady() {
- return await this.parseInstalledApp();
- }
- async parseInstalledApp() {
- const { deviceCtrl, prjCtrl } = useCtx();
- const records = [];
- try {
- const appconfig = await deviceCtrl.ReadFileText(
- `${prjCtrl.RootDir}/app.json`
- );
- if (!appconfig.error && appconfig.text) {
- const app = JSON.parse(appconfig.text);
- records.push(app);
- }
- } catch (error) {
- console.error(error);
- }
- this.state.setApps(records);
- }
- async install(item) {
- console.log("install=>", item);
- const { deviceCtrl, prjCtrl } = useCtx();
- const localpath = prjCtrl.createPath(`${item._id}.zip`);
- this.state.installing = true;
- const ok = await deviceCtrl.DownloadFile(
- item.url,
- localpath,
- 60 * 10,
- (evt, msg) => {
- console.log("down", evt, msg.fva11);
- if (evt == "progress") {
- this.state.downProgress = ((msg.fva11 || 0) * 100).toFixed(1);
- }
- if (evt == "succ") {
- this.state.downProgress = "";
- message.success("下载成功,开始安装...");
- }
- if (evt == "error") {
- this.state.installing = false;
- deviceCtrl.TrayNotice({
- context: `软件下载失败,请检查你的网络设置`
- });
- }
- }
- );
- if (ok) {
- const unzipOk = await deviceCtrl.Unzip(
- localpath,
- prjCtrl.RootDir,
- (evt, msg) => {
- console.log("install", evt, msg.fva11);
- if (evt == "progress") {
- this.state.installProgress = ((msg.fva11 || 0) * 10).toFixed(1);
- }
- if (evt == "succ") {
- this.state.installProgress = "";
- this.state.installing = false;
- deviceCtrl.TrayNotice({
- context: `软件安装成功`
- });
- }
- if (evt == "error") {
- this.state.installing = false;
- this.state.installProgress = "";
- deviceCtrl.TrayNotice({
- context: `软件安装失败,请重新安装`
- });
- }
- }
- );
- if (unzipOk) {
- await deviceCtrl.UpdateConfig(item.version);
- await this.parseInstalledApp();
- }
- }
- queenApi.hideLoading();
- }
- async update(appRecord) {
- const { deviceCtrl, prjCtrl } = useCtx();
- const runnings = await deviceCtrl.GetRunningApp();
- let appRunning = runnings.find((item) => item.Key == appRecord.name);
- console.log("running", runnings);
- if (appRunning) {
- queenApi.messageWarn("请先关闭应用程序,再进行更新!");
- return;
- }
- const fpath = prjCtrl.getAppInstallDir() + `/${appRecord.name}`;
- const ok = await deviceCtrl.RemoveDir(fpath);
- if (ok) {
- this.install(appRecord);
- }
- }
- async uninstall(appRecord) {
- const { deviceCtrl, prjCtrl } = useCtx();
- const runnings = await deviceCtrl.GetRunningApp();
- let appRunning = runnings.find((item) => item.Key == appRecord.key);
- if (appRunning) {
- queenApi.messageWarn("请先关闭应用程序,再进行卸载!");
- return;
- }
- const fpath = prjCtrl.getAppInstallDir() + `/${appRecord.key}`;
- const ok = await deviceCtrl.RemoveDir(fpath);
- if (ok) {
- deviceCtrl.DeleteShortcut(appRecord.key);
- deviceCtrl.TrayNotice({ context: `${appRecord.name}卸载成功!` });
- await this.parseInstalledApp();
- }
- }
- async CreateShortcut(appRecord) {
- const { deviceCtrl, prjCtrl } = useCtx();
- const iconPath = prjCtrl.getAppInstallDir() + `/${appRecord.key}/${appRecord.icon}`;
- const ok = await deviceCtrl.CreateShortcut(
- appRecord.key,
- deviceCtrl.profile.exePath,
- iconPath
- );
- if (ok) {
- deviceCtrl.TrayNotice({ context: `${appRecord.name}快捷方式创建成功!` });
- }
- }
- }
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluc3RhbGxDdHJsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHF1ZWVuQXBpIH0gZnJvbSBcInF1ZWVuanNcIjtcclxuaW1wb3J0IHsgQ29udHJvbGxlciB9IGZyb20gXCIuLi9jb3JlL2NvbnRyb2xsZXJcIjtcclxuaW1wb3J0IHsgUnhWYWx1ZSB9IGZyb20gXCIuLi9jb3JlL3J4VmFsdWVcIjtcclxuaW1wb3J0IHsgdXNlQ3R4IH0gZnJvbSBcIi4uL2N0eFwiO1xyXG5pbXBvcnQgeyBtZXNzYWdlIH0gZnJvbSBcImFudC1kZXNpZ24tdnVlXCI7XHJcblxyXG4vKipcclxuICogIGFwcOWuieijheeuoeeQhlxyXG4gKiAgMS4g6K+75Y+W5a6J6KOF55qEYXBwcy5tYW5pZmVzdOaWh+S7tuino+aekOW9k+WJjeW3suWuieijheeahOW6lOeUqFxyXG4gKiAgMi4g5omA5pyJYXBw5a6J6KOF5Zyo55uu5b2VJHtBcHBJbnN0YWxsRGlyfS/kuIvpnaIsIOWuieijheWQjuiiqyBhcHBzLm1hbmlmZXN06YWN572u5paH5Lu257Si5byVXHJcbiAqICAzLiDlronoo4XnmoRhcHDljYfnuqflkI7vvIzmm7TmlrBhcHBzLm1hbmlmZXN057Si5byV5paH5Lu277yM5Yig6Zmk5pen55qEJHtBcHBJbnN0YWxsRGlyfS/kuIvnmoTmlofku7ZcclxuICogIDQuIOS4gOS4qmFwcOWcqCBhcHBzLm1hbmlmZXN057Si5byV5paH5Lu25Lit5qC85byP5aSn6Ie05aaC5LiLXHJcbiAqICA1LiDlronoo4XlnKjnm67lvZUke0FwcEluc3RhbGxEaXJ9L+S4i+mdoumDveWvueW6lOacieS4quS4gOS4qmFwcC5wcm9maWxl5paH5Lu2XHJcbiAqXHJcbiAqICAgIHtcclxuICogICAgICAgbmFtZTogXCJzcHUzZFwiLFxyXG4gKiAgICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXHJcbiAqICAgICAgIGxhc3RVcGRhdGVEYXRlOiBcIjIwMjMtMTAtMTBcIixcclxuICogICAgICAgaWNvbjogXCIke0FwcEluc3RhbGxEaXJ9L3NwdTNkL2ljb24ucG5nXCIsXHJcbiAqICAgICAgIHJldkFzc2V0czogXCIucGFjaywubWF0LCBtYXRncm91cCwgc3B1M2QgaW1hZ2VcIixcclxuICogICAgICAgc2l6ZTogXCIxMjNNQlwiLFxyXG4gKiAgICAgICB0YWdzOiBcInh4XCIsXHJcbiAqICAgICAgIGRlc2M6IFwiXCIsXHJcbiAqICAgICAgIGVudHJ5OiBcIiR7QXBwSW5zdGFsbERpcn0vc3B1M2Qvc3B1M2QuZXhlXCJcclxuICogICAgICAgdHlwZTogXCJuYXRpdmVhcHBcIiAvL25hdGl2ZWFwcCAgd2ViYXBwXHJcbiAqICAgICAgIGtleTogXCJzcHUzZFwiIC8v5bqU55SoaWRcclxuICogICAgICAgaW5zdENvdW50OiAxLCAvLzAg5LiN6ZmQ5Yi25a6e5YiXLCAgMS3ljZXlrp7kvosgIG0tbeS4quWunuWIl1xyXG4gKiAgICB9XHJcbiAqL1xyXG5cclxuY2xhc3MgQXBwIHtcclxuICBuYW1lID0gXCJcIjtcclxuICB2ZXJzaW9uID0gXCIwLjAuMFwiO1xyXG4gIGxhc3RVcGRhdGVEYXRlID0gXCJcIjtcclxuICBpY29uID0gXCJcIjtcclxuICByZXZBc3NldHMgPSBbXTtcclxuICBzaXplID0gXCIwTUJcIjtcclxuICB0YWdzID0gXCJcIjtcclxuICBkZXNjID0gXCJcIjtcclxuICBlbnRyeSA9IFwiXCI7XHJcbiAgdHlwZSA9IFwiXCI7XHJcbiAga2V5ID0gXCJcIjtcclxuICBpbnN0Q291bnQgPSAxO1xyXG4gIFZlcnNpb24gPSBcIlwiO1xyXG4gIEV4ZVBhdGggPSBcIlwiO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgSW5zdGFsbENvbnRyb2xsZXIgZXh0ZW5kcyBDb250cm9sbGVyIHtcclxuICBzdGF0ZSA9IFJ4VmFsdWUuY3JlYXRlKHtcclxuICAgIGFwcHM6IFtdIGFzIEFwcFtdLFxyXG4gICAgaW5zdGFsbGluZzogZmFsc2UsXHJcbiAgICBkb3duUHJvZ3Jlc3M6IFwiXCIsXHJcbiAgICBpbnN0YWxsUHJvZ3Jlc3M6IFwiXCIsXHJcbiAgfSk7XHJcblxyXG4gIGFzeW5jIG9uUmVhZHkoKSB7XHJcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wYXJzZUluc3RhbGxlZEFwcCgpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgcGFyc2VJbnN0YWxsZWRBcHAoKSB7XHJcbiAgICBjb25zdCB7IGRldmljZUN0cmwsIHByakN0cmwgfSA9IHVzZUN0eCgpO1xyXG5cclxuICAgIC8vIGNvbnN0IGluc3RhbGxkaXIgPSBwcmpDdHJsLmdldEFwcEluc3RhbGxEaXIoKTtcclxuXHJcbiAgICAvLyBjb25zdCByZXQgPSBhd2FpdCBkZXZpY2VDdHJsLkdldFN1YkRpck5hbWVzKGluc3RhbGxkaXIpO1xyXG5cclxuICAgIC8vIGNvbnNvbGUubG9nKFwibGlzdCBkaXJzPT5cIiwgcmV0KTtcclxuXHJcbiAgICAvL+ino+aekOW3suWuieijheeahOebruW9lVxyXG4gICAgY29uc3QgcmVjb3JkczogQXBwW10gPSBbXTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBhcHBjb25maWcgPSBhd2FpdCBkZXZpY2VDdHJsLlJlYWRGaWxlVGV4dChcclxuICAgICAgICBgJHtwcmpDdHJsLlJvb3REaXJ9L2FwcC5qc29uYFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCFhcHBjb25maWcuZXJyb3IgJiYgYXBwY29uZmlnLnRleHQpIHtcclxuICAgICAgICBjb25zdCBhcHAgPSBKU09OLnBhcnNlKGFwcGNvbmZpZy50ZXh0KTtcclxuICAgICAgICByZWNvcmRzLnB1c2goYXBwKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXRlLnNldEFwcHMocmVjb3Jkcyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbnN0YWxsKGl0ZW06IGFueSkge1xyXG4gICAgY29uc29sZS5sb2coXCJpbnN0YWxsPT5cIiwgaXRlbSk7XHJcbiAgICBjb25zdCB7IGRldmljZUN0cmwsIHByakN0cmwgfSA9IHVzZUN0eCgpO1xyXG4gICAgY29uc3QgbG9jYWxwYXRoID0gcHJqQ3RybC5jcmVhdGVQYXRoKGAke2l0ZW0uX2lkfS56aXBgKTtcclxuICAgIHRoaXMuc3RhdGUuaW5zdGFsbGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBvayA9IGF3YWl0IGRldmljZUN0cmwuRG93bmxvYWRGaWxlKFxyXG4gICAgICBpdGVtLnVybCxcclxuICAgICAgbG9jYWxwYXRoLFxyXG4gICAgICA2MCAqIDEwLFxyXG4gICAgICAoZXZ0LCBtc2cpID0+IHtcclxuICAgICAgICBjb25zb2xlLmxvZyhcImRvd25cIiwgZXZ0LCBtc2cuZnZhMTEpO1xyXG5cclxuICAgICAgICBpZiAoZXZ0ID09IFwicHJvZ3Jlc3NcIikge1xyXG4gICAgICAgICAgdGhpcy5zdGF0ZS5kb3duUHJvZ3Jlc3MgPSAoKG1zZy5mdmExMSB8fCAwKSAqIDEwMCkudG9GaXhlZCgxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGV2dCA9PSBcInN1Y2NcIikge1xyXG4gICAgICAgICAgdGhpcy5zdGF0ZS5kb3duUHJvZ3Jlc3MgPSBcIlwiO1xyXG4gICAgICAgICAgbWVzc2FnZS5zdWNjZXNzKFwi5LiL6L295oiQ5Yqf77yM5byA5aeL5a6J6KOFLi4uXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZXZ0ID09IFwiZXJyb3JcIikge1xyXG4gICAgICAgICAgdGhpcy5zdGF0ZS5pbnN0YWxsaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBkZXZpY2VDdHJsLlRyYXlOb3RpY2UoeyAgICAgICAgICBcclxuICAgICAgICAgICAgY29udGV4dDogYOi9r+S7tuS4i+i9veWksei0pe+8jOivt+ajgOafpeS9oOeahOe9kee7nOiuvue9rmAsXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICBpZiAob2spIHtcclxuICAgICAgY29uc3QgdW56aXBPayA9IGF3YWl0IGRldmljZUN0cmwuVW56aXAoXHJcbiAgICAgICAgbG9jYWxwYXRoLFxyXG4gICAgICAgIHByakN0cmwuUm9vdERpcixcclxuICAgICAgICAoZXZ0LCBtc2cpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiaW5zdGFsbFwiLCBldnQsIG1zZy5mdmExMSk7XHJcbiAgICAgICAgICBpZiAoZXZ0ID09IFwicHJvZ3Jlc3NcIikge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmluc3RhbGxQcm9ncmVzcyA9ICgobXNnLmZ2YTExIHx8IDApICogMTApLnRvRml4ZWQoMSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAoZXZ0ID09IFwic3VjY1wiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuaW5zdGFsbFByb2dyZXNzID0gXCJcIjtcclxuICAgICAgICAgICAgdGhpcy5zdGF0ZS5pbnN0YWxsaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGRldmljZUN0cmwuVHJheU5vdGljZSh7ICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIGNvbnRleHQ6IGDova/ku7blronoo4XmiJDlip9gLFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmIChldnQgPT0gXCJlcnJvclwiKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuaW5zdGFsbGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXRlLmluc3RhbGxQcm9ncmVzcyA9IFwiXCI7XHJcbiAgICAgICAgICAgIGRldmljZUN0cmwuVHJheU5vdGljZSh7ICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgY29udGV4dDogYOi9r+S7tuWuieijheWksei0pe+8jOivt+mHjeaWsOWuieijhWAsXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgICAgaWYgKHVuemlwT2spIHtcclxuICAgICAgICBhd2FpdCBkZXZpY2VDdHJsLlVwZGF0ZUNvbmZpZyhpdGVtLnZlcnNpb24pO1xyXG4gICAgICAgIGF3YWl0IHRoaXMucGFyc2VJbnN0YWxsZWRBcHAoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcXVlZW5BcGkuaGlkZUxvYWRpbmcoKTtcclxuICB9XHJcbiAgYXN5bmMgdXBkYXRlKGFwcFJlY29yZDogYW55KSB7XHJcbiAgICBjb25zdCB7ICBkZXZpY2VDdHJsLCBwcmpDdHJsIH0gPSB1c2VDdHgoKTtcclxuICAgIC8v5o+Q56S65YGc5q2i5b2T5YmN5bqU55SoXHJcblxyXG4gICAgY29uc3QgcnVubmluZ3MgPSBhd2FpdCBkZXZpY2VDdHJsLkdldFJ1bm5pbmdBcHAoKTtcclxuICAgIGxldCBhcHBSdW5uaW5nID0gcnVubmluZ3MuZmluZCgoaXRlbSkgPT4gaXRlbS5LZXkgPT0gYXBwUmVjb3JkLm5hbWUpO1xyXG4gICAgY29uc29sZS5sb2coXCJydW5uaW5nXCIsIHJ1bm5pbmdzKTtcclxuICAgIGlmIChhcHBSdW5uaW5nKSB7XHJcbiAgICAgIHF1ZWVuQXBpLm1lc3NhZ2VXYXJuKFwi6K+35YWI5YWz6Zet5bqU55So56iL5bqP77yM5YaN6L+b6KGM5pu05paw77yBXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBmcGF0aCA9IHByakN0cmwuZ2V0QXBwSW5zdGFsbERpcigpICsgYC8ke2FwcFJlY29yZC5uYW1lfWA7XHJcbiAgICBjb25zdCBvayA9IGF3YWl0IGRldmljZUN0cmwuUmVtb3ZlRGlyKGZwYXRoKTtcclxuICAgIGlmIChvaykge1xyXG4gICAgICB0aGlzLmluc3RhbGwoYXBwUmVjb3JkKTtcclxuICAgIH1cclxuICB9XHJcbiAgYXN5bmMgdW5pbnN0YWxsKGFwcFJlY29yZDogYW55KSB7XHJcbiAgICBjb25zdCB7ICBkZXZpY2VDdHJsLCBwcmpDdHJsIH0gPSB1c2VDdHgoKTtcclxuICAgIC8v5o+Q56S65YGc5q2i5b2T5YmN5bqU55SoXHJcbiAgICBjb25zdCBydW5uaW5ncyA9IGF3YWl0IGRldmljZUN0cmwuR2V0UnVubmluZ0FwcCgpO1xyXG4gICAgbGV0IGFwcFJ1bm5pbmcgPSBydW5uaW5ncy5maW5kKChpdGVtKSA9PiBpdGVtLktleSA9PSBhcHBSZWNvcmQua2V5KTtcclxuICAgIGlmIChhcHBSdW5uaW5nKSB7XHJcbiAgICAgIHF1ZWVuQXBpLm1lc3NhZ2VXYXJuKFwi6K+35YWI5YWz6Zet5bqU55So56iL5bqP77yM5YaN6L+b6KGM5Y246L2977yBXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICAvL+WIoOmZpOWuieijheaWh+S7tlxyXG4gICAgY29uc3QgZnBhdGggPSBwcmpDdHJsLmdldEFwcEluc3RhbGxEaXIoKSArIGAvJHthcHBSZWNvcmQua2V5fWA7XHJcbiAgICBjb25zdCBvayA9IGF3YWl0IGRldmljZUN0cmwuUmVtb3ZlRGlyKGZwYXRoKTtcclxuICAgIGlmIChvaykge1xyXG4gICAgICBkZXZpY2VDdHJsLkRlbGV0ZVNob3J0Y3V0KGFwcFJlY29yZC5rZXkpO1xyXG4gICAgICBkZXZpY2VDdHJsLlRyYXlOb3RpY2UoeyBjb250ZXh0OiBgJHthcHBSZWNvcmQubmFtZX3ljbjovb3miJDlip8hYCB9KTtcclxuICAgICAgLy/ph43mlrDop6PmnpDlt7Llronoo4Xmlofku7ZcclxuICAgICAgYXdhaXQgdGhpcy5wYXJzZUluc3RhbGxlZEFwcCgpO1xyXG4gICAgfVxyXG4gIH1cclxuICBhc3luYyBDcmVhdGVTaG9ydGN1dChhcHBSZWNvcmQ6IGFueSkge1xyXG4gICAgY29uc3QgeyBkZXZpY2VDdHJsLCBwcmpDdHJsIH0gPSB1c2VDdHgoKTtcclxuXHJcbiAgICBjb25zdCBpY29uUGF0aCA9XHJcbiAgICAgIHByakN0cmwuZ2V0QXBwSW5zdGFsbERpcigpICsgYC8ke2FwcFJlY29yZC5rZXl9LyR7YXBwUmVjb3JkLmljb259YDtcclxuICAgIGNvbnN0IG9rID0gYXdhaXQgZGV2aWNlQ3RybC5DcmVhdGVTaG9ydGN1dChcclxuICAgICAgYXBwUmVjb3JkLmtleSxcclxuICAgICAgZGV2aWNlQ3RybC5wcm9maWxlLmV4ZVBhdGgsXHJcbiAgICAgIGljb25QYXRoXHJcbiAgICApO1xyXG4gICAgaWYgKG9rKSB7XHJcbiAgICAgIGRldmljZUN0cmwuVHJheU5vdGljZSh7IGNvbnRleHQ6IGAke2FwcFJlY29yZC5uYW1lfeW/q+aNt+aWueW8j+WIm+W7uuaIkOWKnyFgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsa0JBQWtCO0FBQzNCLFNBQVMsZUFBZTtBQUN4QixTQUFTLGNBQWM7QUFDdkIsU0FBUyxlQUFlO0FBMEJ4QixNQUFNLElBQUk7QUFBQSxFQUNSLE9BQU87QUFBQSxFQUNQLFVBQVU7QUFBQSxFQUNWLGlCQUFpQjtBQUFBLEVBQ2pCLE9BQU87QUFBQSxFQUNQLFlBQVksQ0FBQztBQUFBLEVBQ2IsT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1AsT0FBTztBQUFBLEVBQ1AsUUFBUTtBQUFBLEVBQ1IsT0FBTztBQUFBLEVBQ1AsTUFBTTtBQUFBLEVBQ04sWUFBWTtBQUFBLEVBQ1osVUFBVTtBQUFBLEVBQ1YsVUFBVTtBQUNaO0FBRU8sYUFBTSwwQkFBMEIsV0FBVztBQUFBLEVBQ2hELFFBQVEsUUFBUSxPQUFPO0FBQUEsSUFDckIsTUFBTSxDQUFDO0FBQUEsSUFDUCxZQUFZO0FBQUEsSUFDWixjQUFjO0FBQUEsSUFDZCxpQkFBaUI7QUFBQSxFQUNuQixDQUFDO0FBQUEsRUFFRCxNQUFNLFVBQVU7QUFDZCxXQUFPLE1BQU0sS0FBSyxrQkFBa0I7QUFBQSxFQUN0QztBQUFBLEVBRUEsTUFBTSxvQkFBb0I7QUFDeEIsVUFBTSxFQUFFLFlBQVksUUFBUSxJQUFJLE9BQU87QUFTdkMsVUFBTSxVQUFpQixDQUFDO0FBRXhCLFFBQUk7QUFDRixZQUFNLFlBQVksTUFBTSxX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
|