@markus-global/cli 0.7.2 → 0.7.3-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/tray.d.ts +0 -2
- package/dist/tray.d.ts.map +1 -1
- package/dist/tray.js +140 -76
- package/dist/tray.js.map +1 -1
- package/dist/tray.mjs +139 -52
- package/dist/web-ui/assets/{browser-D7voLlvI.js → browser-DT4cceR1.js} +1 -1
- package/dist/web-ui/assets/{index-BY8rA8ML.css → index-DxTg9YFr.css} +1 -1
- package/dist/web-ui/assets/index-Mg5Mw82t.js +706 -0
- package/dist/web-ui/index.html +2 -2
- package/package.json +1 -1
- package/dist/web-ui/assets/index-WWZgMSA9.js +0 -386
package/dist/tray.mjs
CHANGED
|
@@ -2,11 +2,11 @@ import { createRequire } from 'module';
|
|
|
2
2
|
const require = createRequire(import.meta.url);
|
|
3
3
|
|
|
4
4
|
// src/tray.ts
|
|
5
|
-
import { spawn, exec } from "node:child_process";
|
|
6
|
-
import { readFileSync, existsSync, mkdirSync } from "node:fs";
|
|
5
|
+
import { spawn, exec, execSync } from "node:child_process";
|
|
6
|
+
import { readFileSync, existsSync, mkdirSync, appendFileSync } from "node:fs";
|
|
7
7
|
import { get as httpGet } from "node:http";
|
|
8
8
|
import { createConnection } from "node:net";
|
|
9
|
-
import { resolve, dirname } from "node:path";
|
|
9
|
+
import { resolve, dirname, join } from "node:path";
|
|
10
10
|
import { fileURLToPath } from "node:url";
|
|
11
11
|
import { platform, homedir } from "node:os";
|
|
12
12
|
import SysTrayModule from "systray2";
|
|
@@ -16,19 +16,71 @@ var WEB_UI_PORT = 8056;
|
|
|
16
16
|
var WEB_UI_URL = `http://localhost:${WEB_UI_PORT}`;
|
|
17
17
|
var BIN_DIR = __dirname;
|
|
18
18
|
var APP_DIR = resolve(BIN_DIR, "..");
|
|
19
|
-
var NODE_BIN = resolve(BIN_DIR, platform() === "win32" ? "node.exe" : "node");
|
|
20
|
-
var MARKUS_MJS = resolve(BIN_DIR, "markus.mjs");
|
|
21
19
|
var LOG_DIR = resolve(homedir(), ".markus", "logs");
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
20
|
+
var LOG_FILE = join(LOG_DIR, "tray-stderr.log");
|
|
21
|
+
function resolveMarkusCommand() {
|
|
22
|
+
const symlink = "/usr/local/bin/markus";
|
|
23
|
+
if (existsSync(symlink)) {
|
|
24
|
+
return { cmd: symlink, args: ["start"] };
|
|
25
|
+
}
|
|
26
|
+
const wrapper = resolve(APP_DIR, "markus");
|
|
27
|
+
if (existsSync(wrapper)) {
|
|
28
|
+
return { cmd: wrapper, args: ["start"] };
|
|
29
|
+
}
|
|
30
|
+
const nodeBin = resolve(BIN_DIR, platform() === "win32" ? "node.exe" : "node");
|
|
31
|
+
const markusMjs = resolve(BIN_DIR, "markus.mjs");
|
|
32
|
+
return { cmd: nodeBin, args: [markusMjs, "start"] };
|
|
33
|
+
}
|
|
34
|
+
var STRINGS = {
|
|
35
|
+
en: {
|
|
36
|
+
openUI: "Open Web UI",
|
|
37
|
+
startServer: "Start Server",
|
|
38
|
+
stopServer: "Stop Server",
|
|
39
|
+
quit: "Quit Markus",
|
|
40
|
+
tooltipRunning: "Markus (running)",
|
|
41
|
+
tooltipStopped: "Markus (stopped)",
|
|
42
|
+
portConflictTitle: "Markus",
|
|
43
|
+
portConflictMsg: (port, occupant) => `Port ${port} is already in use by "${occupant}".\\nMarkus cannot start.\\n\\nFree the port or change it in ~/.markus/markus.json`
|
|
44
|
+
},
|
|
45
|
+
zh: {
|
|
46
|
+
openUI: "\u6253\u5F00\u63A7\u5236\u53F0",
|
|
47
|
+
startServer: "\u542F\u52A8\u670D\u52A1",
|
|
48
|
+
stopServer: "\u505C\u6B62\u670D\u52A1",
|
|
49
|
+
quit: "\u9000\u51FA Markus",
|
|
50
|
+
tooltipRunning: "Markus (\u8FD0\u884C\u4E2D)",
|
|
51
|
+
tooltipStopped: "Markus (\u5DF2\u505C\u6B62)",
|
|
52
|
+
portConflictTitle: "Markus",
|
|
53
|
+
portConflictMsg: (port, occupant) => `\u7AEF\u53E3 ${port} \u5DF2\u88AB "${occupant}" \u5360\u7528\u3002\\nMarkus \u65E0\u6CD5\u542F\u52A8\u3002\\n\\n\u8BF7\u91CA\u653E\u7AEF\u53E3\u6216\u5728 ~/.markus/markus.json \u4E2D\u4FEE\u6539\u7AEF\u53E3`
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
function detectLocale() {
|
|
57
|
+
const lang = (process.env["LANG"] ?? process.env["LC_ALL"] ?? process.env["LANGUAGE"] ?? "").toLowerCase();
|
|
58
|
+
if (lang.startsWith("zh")) return "zh";
|
|
59
|
+
if (platform() === "darwin") {
|
|
60
|
+
try {
|
|
61
|
+
const appleLang = execSync("defaults read -g AppleLanguages 2>/dev/null", { encoding: "utf-8" });
|
|
62
|
+
if (/zh/.test(appleLang)) return "zh";
|
|
63
|
+
} catch {
|
|
30
64
|
}
|
|
31
65
|
}
|
|
66
|
+
return "en";
|
|
67
|
+
}
|
|
68
|
+
var t = STRINGS[detectLocale()];
|
|
69
|
+
function trayLog(msg) {
|
|
70
|
+
const ts = (/* @__PURE__ */ new Date()).toISOString();
|
|
71
|
+
const line = `${ts} ${msg}
|
|
72
|
+
`;
|
|
73
|
+
try {
|
|
74
|
+
mkdirSync(LOG_DIR, { recursive: true });
|
|
75
|
+
appendFileSync(LOG_FILE, line);
|
|
76
|
+
} catch {
|
|
77
|
+
}
|
|
78
|
+
console.error(line.trimEnd());
|
|
79
|
+
}
|
|
80
|
+
function loadIconBase64() {
|
|
81
|
+
for (const p of [resolve(APP_DIR, "logo.png"), resolve(APP_DIR, "markus.ico")]) {
|
|
82
|
+
if (existsSync(p)) return readFileSync(p).toString("base64");
|
|
83
|
+
}
|
|
32
84
|
return "";
|
|
33
85
|
}
|
|
34
86
|
function openBrowser(url) {
|
|
@@ -37,21 +89,32 @@ function openBrowser(url) {
|
|
|
37
89
|
exec(cmd, () => {
|
|
38
90
|
});
|
|
39
91
|
}
|
|
40
|
-
var serverProcess = null;
|
|
41
|
-
var serverRunning = false;
|
|
42
92
|
function isPortListening(port) {
|
|
43
|
-
return new Promise((
|
|
93
|
+
return new Promise((res) => {
|
|
44
94
|
const socket = createConnection({ port, host: "127.0.0.1" }, () => {
|
|
45
95
|
socket.destroy();
|
|
46
|
-
|
|
96
|
+
res(true);
|
|
47
97
|
});
|
|
48
98
|
socket.on("error", () => {
|
|
49
99
|
socket.destroy();
|
|
50
|
-
|
|
100
|
+
res(false);
|
|
51
101
|
});
|
|
52
102
|
socket.setTimeout(2e3, () => {
|
|
53
103
|
socket.destroy();
|
|
54
|
-
|
|
104
|
+
res(false);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
function checkHealthOnce(url) {
|
|
109
|
+
return new Promise((res) => {
|
|
110
|
+
const req = httpGet(url, (r) => {
|
|
111
|
+
r.resume();
|
|
112
|
+
res(r.statusCode !== void 0 && r.statusCode >= 200 && r.statusCode < 400);
|
|
113
|
+
});
|
|
114
|
+
req.on("error", () => res(false));
|
|
115
|
+
req.setTimeout(2e3, () => {
|
|
116
|
+
req.destroy();
|
|
117
|
+
res(false);
|
|
55
118
|
});
|
|
56
119
|
});
|
|
57
120
|
}
|
|
@@ -63,37 +126,58 @@ function waitForHealth(url, intervalMs = 500, maxMs = 3e4) {
|
|
|
63
126
|
res.resume();
|
|
64
127
|
if (res.statusCode && res.statusCode >= 200 && res.statusCode < 400) {
|
|
65
128
|
ok(true);
|
|
66
|
-
|
|
67
|
-
ok(false);
|
|
68
|
-
} else {
|
|
69
|
-
setTimeout(check, intervalMs);
|
|
129
|
+
return;
|
|
70
130
|
}
|
|
71
|
-
});
|
|
72
|
-
req.on("error", () => {
|
|
73
131
|
if (Date.now() >= deadline) {
|
|
74
132
|
ok(false);
|
|
75
|
-
|
|
76
|
-
setTimeout(check, intervalMs);
|
|
133
|
+
return;
|
|
77
134
|
}
|
|
135
|
+
setTimeout(check, intervalMs);
|
|
78
136
|
});
|
|
79
|
-
req.
|
|
80
|
-
|
|
137
|
+
req.on("error", () => {
|
|
138
|
+
if (Date.now() >= deadline) ok(false);
|
|
139
|
+
else setTimeout(check, intervalMs);
|
|
81
140
|
});
|
|
141
|
+
req.setTimeout(2e3, () => req.destroy());
|
|
82
142
|
};
|
|
83
143
|
check();
|
|
84
144
|
});
|
|
85
145
|
}
|
|
146
|
+
var serverProcess = null;
|
|
147
|
+
var serverRunning = false;
|
|
86
148
|
async function startServer() {
|
|
87
149
|
if (serverRunning) return;
|
|
88
150
|
if (await isPortListening(WEB_UI_PORT)) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
151
|
+
const isMarkus = await checkHealthOnce(`${WEB_UI_URL}/api/health`);
|
|
152
|
+
if (isMarkus) {
|
|
153
|
+
trayLog(`Port ${WEB_UI_PORT} is Markus \u2014 opening browser`);
|
|
154
|
+
serverRunning = true;
|
|
155
|
+
updateTrayMenu();
|
|
156
|
+
openBrowser(WEB_UI_URL);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
let occupant = "unknown";
|
|
160
|
+
try {
|
|
161
|
+
occupant = execSync(`lsof -i :${WEB_UI_PORT} -sTCP:LISTEN -t 2>/dev/null | head -1 | xargs ps -p -o comm= 2>/dev/null`, { encoding: "utf-8" }).trim() || "unknown";
|
|
162
|
+
} catch {
|
|
163
|
+
}
|
|
164
|
+
trayLog(`Port ${WEB_UI_PORT} occupied by "${occupant}" \u2014 showing conflict dialog`);
|
|
165
|
+
if (platform() === "darwin") {
|
|
166
|
+
exec(`osascript -e 'display dialog "${t.portConflictMsg(WEB_UI_PORT, occupant)}" with title "${t.portConflictTitle}" buttons {"OK"} default button "OK" with icon stop'`, () => {
|
|
167
|
+
});
|
|
168
|
+
}
|
|
92
169
|
return;
|
|
93
170
|
}
|
|
94
171
|
mkdirSync(LOG_DIR, { recursive: true });
|
|
95
|
-
|
|
96
|
-
|
|
172
|
+
const { cmd, args } = resolveMarkusCommand();
|
|
173
|
+
trayLog(`Starting server: ${cmd} ${args.join(" ")}`);
|
|
174
|
+
const stdoutLog = join(LOG_DIR, "stdout.log");
|
|
175
|
+
const stderrLog = join(LOG_DIR, "stderr.log");
|
|
176
|
+
const { openSync } = await import("node:fs");
|
|
177
|
+
const outFd = openSync(stdoutLog, "a");
|
|
178
|
+
const errFd = openSync(stderrLog, "a");
|
|
179
|
+
serverProcess = spawn(cmd, args, {
|
|
180
|
+
stdio: ["ignore", outFd, errFd],
|
|
97
181
|
detached: false,
|
|
98
182
|
env: { ...process.env, NO_BROWSER: "1" }
|
|
99
183
|
});
|
|
@@ -104,21 +188,27 @@ async function startServer() {
|
|
|
104
188
|
serverProcess = null;
|
|
105
189
|
updateTrayMenu();
|
|
106
190
|
if (code && code !== 0) {
|
|
107
|
-
|
|
191
|
+
trayLog(`Server exited with code ${code} \u2014 check ${stderrLog}`);
|
|
108
192
|
}
|
|
109
193
|
});
|
|
110
194
|
serverProcess.on("error", (err) => {
|
|
111
195
|
serverRunning = false;
|
|
112
196
|
serverProcess = null;
|
|
113
197
|
updateTrayMenu();
|
|
114
|
-
|
|
198
|
+
trayLog(`Failed to spawn server: ${err.message}`);
|
|
115
199
|
});
|
|
116
200
|
waitForHealth(`${WEB_UI_URL}/api/health`).then((ok) => {
|
|
117
|
-
if (ok && serverRunning)
|
|
201
|
+
if (ok && serverRunning) {
|
|
202
|
+
trayLog("Server healthy \u2014 opening browser");
|
|
203
|
+
openBrowser(WEB_UI_URL);
|
|
204
|
+
} else if (!ok) {
|
|
205
|
+
trayLog(`Server did not become healthy within 30s \u2014 check ${stderrLog}`);
|
|
206
|
+
}
|
|
118
207
|
});
|
|
119
208
|
}
|
|
120
209
|
function stopServer() {
|
|
121
210
|
if (!serverProcess) return;
|
|
211
|
+
trayLog("Stopping server...");
|
|
122
212
|
serverProcess.kill("SIGTERM");
|
|
123
213
|
const forceTimer = setTimeout(() => {
|
|
124
214
|
if (serverProcess && !serverProcess.killed) {
|
|
@@ -128,23 +218,19 @@ function stopServer() {
|
|
|
128
218
|
serverProcess.on("exit", () => clearTimeout(forceTimer));
|
|
129
219
|
}
|
|
130
220
|
var SEPARATOR = { title: "<SEPARATOR>", tooltip: "", enabled: true };
|
|
131
|
-
var ITEM_OPEN_UI = { title: "Open Web UI", tooltip: "Open Markus in browser", enabled: true };
|
|
132
|
-
var ITEM_START = { title: "Start Server", tooltip: "Start Markus server", enabled: true };
|
|
133
|
-
var ITEM_STOP = { title: "Stop Server", tooltip: "Stop Markus server", enabled: false };
|
|
134
|
-
var ITEM_QUIT = { title: "Quit Markus", tooltip: "Stop server and quit", enabled: true };
|
|
135
221
|
var tray = null;
|
|
136
222
|
function buildMenu() {
|
|
137
223
|
return {
|
|
138
224
|
icon: loadIconBase64(),
|
|
139
225
|
title: "",
|
|
140
|
-
tooltip: serverRunning ?
|
|
226
|
+
tooltip: serverRunning ? t.tooltipRunning : t.tooltipStopped,
|
|
141
227
|
items: [
|
|
142
|
-
{
|
|
228
|
+
{ title: t.openUI, tooltip: t.openUI, enabled: serverRunning },
|
|
143
229
|
SEPARATOR,
|
|
144
|
-
{
|
|
145
|
-
{
|
|
230
|
+
{ title: t.startServer, tooltip: t.startServer, enabled: !serverRunning },
|
|
231
|
+
{ title: t.stopServer, tooltip: t.stopServer, enabled: serverRunning },
|
|
146
232
|
SEPARATOR,
|
|
147
|
-
|
|
233
|
+
{ title: t.quit, tooltip: t.quit, enabled: true }
|
|
148
234
|
]
|
|
149
235
|
};
|
|
150
236
|
}
|
|
@@ -153,17 +239,18 @@ function updateTrayMenu() {
|
|
|
153
239
|
tray.sendAction({ type: "update-menu", menu: buildMenu() });
|
|
154
240
|
}
|
|
155
241
|
async function main() {
|
|
242
|
+
trayLog(`Tray starting (locale=${detectLocale()}, pid=${process.pid})`);
|
|
156
243
|
tray = new SysTray({ menu: buildMenu(), copyDir: false });
|
|
157
244
|
await tray.ready();
|
|
158
245
|
tray.onClick(async (action) => {
|
|
159
246
|
const title = action.item.title;
|
|
160
|
-
if (title ===
|
|
247
|
+
if (title === t.openUI) {
|
|
161
248
|
openBrowser(WEB_UI_URL);
|
|
162
|
-
} else if (title ===
|
|
249
|
+
} else if (title === t.startServer) {
|
|
163
250
|
await startServer();
|
|
164
|
-
} else if (title ===
|
|
251
|
+
} else if (title === t.stopServer) {
|
|
165
252
|
stopServer();
|
|
166
|
-
} else if (title ===
|
|
253
|
+
} else if (title === t.quit) {
|
|
167
254
|
stopServer();
|
|
168
255
|
setTimeout(async () => {
|
|
169
256
|
if (tray) await tray.kill(false);
|
|
@@ -172,11 +259,11 @@ async function main() {
|
|
|
172
259
|
}
|
|
173
260
|
});
|
|
174
261
|
tray.onError((err) => {
|
|
175
|
-
|
|
262
|
+
trayLog(`Tray error: ${err.message}`);
|
|
176
263
|
});
|
|
177
264
|
await startServer();
|
|
178
265
|
}
|
|
179
266
|
main().catch((err) => {
|
|
180
|
-
|
|
267
|
+
trayLog(`Tray failed to start: ${err}`);
|
|
181
268
|
process.exit(1);
|
|
182
269
|
});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{g as re}from"./index-
|
|
1
|
+
import{g as re}from"./index-Mg5Mw82t.js";function oe(r,o){for(var i=0;i<o.length;i++){const e=o[i];if(typeof e!="string"&&!Array.isArray(e)){for(const t in e)if(t!=="default"&&!(t in r)){const n=Object.getOwnPropertyDescriptor(e,t);n&&Object.defineProperty(r,t,n.get?n:{enumerable:!0,get:()=>e[t]})}}}return Object.freeze(Object.defineProperty(r,Symbol.toStringTag,{value:"Module"}))}var z={},Q,Bt;function ie(){return Bt||(Bt=1,Q=function(){return typeof Promise=="function"&&Promise.prototype&&Promise.prototype.then}),Q}var W={},_={},At;function U(){if(At)return _;At=1;let r;const o=[0,26,44,70,100,134,172,196,242,292,346,404,466,532,581,655,733,815,901,991,1085,1156,1258,1364,1474,1588,1706,1828,1921,2051,2185,2323,2465,2611,2761,2876,3034,3196,3362,3532,3706];return _.getSymbolSize=function(e){if(!e)throw new Error('"version" cannot be null or undefined');if(e<1||e>40)throw new Error('"version" should be in range from 1 to 40');return e*4+17},_.getSymbolTotalCodewords=function(e){return o[e]},_.getBCHDigit=function(i){let e=0;for(;i!==0;)e++,i>>>=1;return e},_.setToSJISFunction=function(e){if(typeof e!="function")throw new Error('"toSJISFunc" is not a valid function.');r=e},_.isKanjiModeEnabled=function(){return typeof r<"u"},_.toSJIS=function(e){return r(e)},_}var Z={},Rt;function yt(){return Rt||(Rt=1,(function(r){r.L={bit:1},r.M={bit:0},r.Q={bit:3},r.H={bit:2};function o(i){if(typeof i!="string")throw new Error("Param is not a string");switch(i.toLowerCase()){case"l":case"low":return r.L;case"m":case"medium":return r.M;case"q":case"quartile":return r.Q;case"h":case"high":return r.H;default:throw new Error("Unknown EC Level: "+i)}}r.isValid=function(e){return e&&typeof e.bit<"u"&&e.bit>=0&&e.bit<4},r.from=function(e,t){if(r.isValid(e))return e;try{return o(e)}catch{return t}}})(Z)),Z}var X,Tt;function se(){if(Tt)return X;Tt=1;function r(){this.buffer=[],this.length=0}return r.prototype={get:function(o){const i=Math.floor(o/8);return(this.buffer[i]>>>7-o%8&1)===1},put:function(o,i){for(let e=0;e<i;e++)this.putBit((o>>>i-e-1&1)===1)},getLengthInBits:function(){return this.length},putBit:function(o){const i=Math.floor(this.length/8);this.buffer.length<=i&&this.buffer.push(0),o&&(this.buffer[i]|=128>>>this.length%8),this.length++}},X=r,X}var x,It;function ue(){if(It)return x;It=1;function r(o){if(!o||o<1)throw new Error("BitMatrix size must be defined and greater than 0");this.size=o,this.data=new Uint8Array(o*o),this.reservedBit=new Uint8Array(o*o)}return r.prototype.set=function(o,i,e,t){const n=o*this.size+i;this.data[n]=e,t&&(this.reservedBit[n]=!0)},r.prototype.get=function(o,i){return this.data[o*this.size+i]},r.prototype.xor=function(o,i,e){this.data[o*this.size+i]^=e},r.prototype.isReserved=function(o,i){return this.reservedBit[o*this.size+i]},x=r,x}var $={},Nt;function ae(){return Nt||(Nt=1,(function(r){const o=U().getSymbolSize;r.getRowColCoords=function(e){if(e===1)return[];const t=Math.floor(e/7)+2,n=o(e),s=n===145?26:Math.ceil((n-13)/(2*t-2))*2,a=[n-7];for(let u=1;u<t-1;u++)a[u]=a[u-1]-s;return a.push(6),a.reverse()},r.getPositions=function(e){const t=[],n=r.getRowColCoords(e),s=n.length;for(let a=0;a<s;a++)for(let u=0;u<s;u++)a===0&&u===0||a===0&&u===s-1||a===s-1&&u===0||t.push([n[a],n[u]]);return t}})($)),$}var tt={},Pt;function ce(){if(Pt)return tt;Pt=1;const r=U().getSymbolSize,o=7;return tt.getPositions=function(e){const t=r(e);return[[0,0],[t-o,0],[0,t-o]]},tt}var et={},Mt;function fe(){return Mt||(Mt=1,(function(r){r.Patterns={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};const o={N1:3,N2:3,N3:40,N4:10};r.isValid=function(t){return t!=null&&t!==""&&!isNaN(t)&&t>=0&&t<=7},r.from=function(t){return r.isValid(t)?parseInt(t,10):void 0},r.getPenaltyN1=function(t){const n=t.size;let s=0,a=0,u=0,c=null,d=null;for(let p=0;p<n;p++){a=u=0,c=d=null;for(let h=0;h<n;h++){let f=t.get(p,h);f===c?a++:(a>=5&&(s+=o.N1+(a-5)),c=f,a=1),f=t.get(h,p),f===d?u++:(u>=5&&(s+=o.N1+(u-5)),d=f,u=1)}a>=5&&(s+=o.N1+(a-5)),u>=5&&(s+=o.N1+(u-5))}return s},r.getPenaltyN2=function(t){const n=t.size;let s=0;for(let a=0;a<n-1;a++)for(let u=0;u<n-1;u++){const c=t.get(a,u)+t.get(a,u+1)+t.get(a+1,u)+t.get(a+1,u+1);(c===4||c===0)&&s++}return s*o.N2},r.getPenaltyN3=function(t){const n=t.size;let s=0,a=0,u=0;for(let c=0;c<n;c++){a=u=0;for(let d=0;d<n;d++)a=a<<1&2047|t.get(c,d),d>=10&&(a===1488||a===93)&&s++,u=u<<1&2047|t.get(d,c),d>=10&&(u===1488||u===93)&&s++}return s*o.N3},r.getPenaltyN4=function(t){let n=0;const s=t.data.length;for(let u=0;u<s;u++)n+=t.data[u];return Math.abs(Math.ceil(n*100/s/5)-10)*o.N4};function i(e,t,n){switch(e){case r.Patterns.PATTERN000:return(t+n)%2===0;case r.Patterns.PATTERN001:return t%2===0;case r.Patterns.PATTERN010:return n%3===0;case r.Patterns.PATTERN011:return(t+n)%3===0;case r.Patterns.PATTERN100:return(Math.floor(t/2)+Math.floor(n/3))%2===0;case r.Patterns.PATTERN101:return t*n%2+t*n%3===0;case r.Patterns.PATTERN110:return(t*n%2+t*n%3)%2===0;case r.Patterns.PATTERN111:return(t*n%3+(t+n)%2)%2===0;default:throw new Error("bad maskPattern:"+e)}}r.applyMask=function(t,n){const s=n.size;for(let a=0;a<s;a++)for(let u=0;u<s;u++)n.isReserved(u,a)||n.xor(u,a,i(t,u,a))},r.getBestMask=function(t,n){const s=Object.keys(r.Patterns).length;let a=0,u=1/0;for(let c=0;c<s;c++){n(c),r.applyMask(c,t);const d=r.getPenaltyN1(t)+r.getPenaltyN2(t)+r.getPenaltyN3(t)+r.getPenaltyN4(t);r.applyMask(c,t),d<u&&(u=d,a=c)}return a}})(et)),et}var J={},St;function Wt(){if(St)return J;St=1;const r=yt(),o=[1,1,1,1,1,1,1,1,1,1,2,2,1,2,2,4,1,2,4,4,2,4,4,4,2,4,6,5,2,4,6,6,2,5,8,8,4,5,8,8,4,5,8,11,4,8,10,11,4,9,12,16,4,9,16,16,6,10,12,18,6,10,17,16,6,11,16,19,6,13,18,21,7,14,21,25,8,16,20,25,8,17,23,25,9,17,23,34,9,18,25,30,10,20,27,32,12,21,29,35,12,23,34,37,12,25,34,40,13,26,35,42,14,28,38,45,15,29,40,48,16,31,43,51,17,33,45,54,18,35,48,57,19,37,51,60,19,38,53,63,20,40,56,66,21,43,59,70,22,45,62,74,24,47,65,77,25,49,68,81],i=[7,10,13,17,10,16,22,28,15,26,36,44,20,36,52,64,26,48,72,88,36,64,96,112,40,72,108,130,48,88,132,156,60,110,160,192,72,130,192,224,80,150,224,264,96,176,260,308,104,198,288,352,120,216,320,384,132,240,360,432,144,280,408,480,168,308,448,532,180,338,504,588,196,364,546,650,224,416,600,700,224,442,644,750,252,476,690,816,270,504,750,900,300,560,810,960,312,588,870,1050,336,644,952,1110,360,700,1020,1200,390,728,1050,1260,420,784,1140,1350,450,812,1200,1440,480,868,1290,1530,510,924,1350,1620,540,980,1440,1710,570,1036,1530,1800,570,1064,1590,1890,600,1120,1680,1980,630,1204,1770,2100,660,1260,1860,2220,720,1316,1950,2310,750,1372,2040,2430];return J.getBlocksCount=function(t,n){switch(n){case r.L:return o[(t-1)*4+0];case r.M:return o[(t-1)*4+1];case r.Q:return o[(t-1)*4+2];case r.H:return o[(t-1)*4+3];default:return}},J.getTotalCodewordsCount=function(t,n){switch(n){case r.L:return i[(t-1)*4+0];case r.M:return i[(t-1)*4+1];case r.Q:return i[(t-1)*4+2];case r.H:return i[(t-1)*4+3];default:return}},J}var nt={},K={},bt;function le(){if(bt)return K;bt=1;const r=new Uint8Array(512),o=new Uint8Array(256);return(function(){let e=1;for(let t=0;t<255;t++)r[t]=e,o[e]=t,e<<=1,e&256&&(e^=285);for(let t=255;t<512;t++)r[t]=r[t-255]})(),K.log=function(e){if(e<1)throw new Error("log("+e+")");return o[e]},K.exp=function(e){return r[e]},K.mul=function(e,t){return e===0||t===0?0:r[o[e]+o[t]]},K}var Lt;function de(){return Lt||(Lt=1,(function(r){const o=le();r.mul=function(e,t){const n=new Uint8Array(e.length+t.length-1);for(let s=0;s<e.length;s++)for(let a=0;a<t.length;a++)n[s+a]^=o.mul(e[s],t[a]);return n},r.mod=function(e,t){let n=new Uint8Array(e);for(;n.length-t.length>=0;){const s=n[0];for(let u=0;u<t.length;u++)n[u]^=o.mul(t[u],s);let a=0;for(;a<n.length&&n[a]===0;)a++;n=n.slice(a)}return n},r.generateECPolynomial=function(e){let t=new Uint8Array([1]);for(let n=0;n<e;n++)t=r.mul(t,new Uint8Array([1,o.exp(n)]));return t}})(nt)),nt}var rt,Dt;function ge(){if(Dt)return rt;Dt=1;const r=de();function o(i){this.genPoly=void 0,this.degree=i,this.degree&&this.initialize(this.degree)}return o.prototype.initialize=function(e){this.degree=e,this.genPoly=r.generateECPolynomial(this.degree)},o.prototype.encode=function(e){if(!this.genPoly)throw new Error("Encoder not initialized");const t=new Uint8Array(e.length+this.degree);t.set(e);const n=r.mod(t,this.genPoly),s=this.degree-n.length;if(s>0){const a=new Uint8Array(this.degree);return a.set(n,s),a}return n},rt=o,rt}var ot={},it={},st={},qt;function Zt(){return qt||(qt=1,st.isValid=function(o){return!isNaN(o)&&o>=1&&o<=40}),st}var L={},vt;function Xt(){if(vt)return L;vt=1;const r="[0-9]+",o="[A-Z $%*+\\-./:]+";let i="(?:[u3000-u303F]|[u3040-u309F]|[u30A0-u30FF]|[uFF00-uFFEF]|[u4E00-u9FAF]|[u2605-u2606]|[u2190-u2195]|u203B|[u2010u2015u2018u2019u2025u2026u201Cu201Du2225u2260]|[u0391-u0451]|[u00A7u00A8u00B1u00B4u00D7u00F7])+";i=i.replace(/u/g,"\\u");const e="(?:(?![A-Z0-9 $%*+\\-./:]|"+i+`)(?:.|[\r
|
|
2
2
|
]))+`;L.KANJI=new RegExp(i,"g"),L.BYTE_KANJI=new RegExp("[^A-Z0-9 $%*+\\-./:]+","g"),L.BYTE=new RegExp(e,"g"),L.NUMERIC=new RegExp(r,"g"),L.ALPHANUMERIC=new RegExp(o,"g");const t=new RegExp("^"+i+"$"),n=new RegExp("^"+r+"$"),s=new RegExp("^[A-Z0-9 $%*+\\-./:]+$");return L.testKanji=function(u){return t.test(u)},L.testNumeric=function(u){return n.test(u)},L.testAlphanumeric=function(u){return s.test(u)},L}var _t;function F(){return _t||(_t=1,(function(r){const o=Zt(),i=Xt();r.NUMERIC={id:"Numeric",bit:1,ccBits:[10,12,14]},r.ALPHANUMERIC={id:"Alphanumeric",bit:2,ccBits:[9,11,13]},r.BYTE={id:"Byte",bit:4,ccBits:[8,16,16]},r.KANJI={id:"Kanji",bit:8,ccBits:[8,10,12]},r.MIXED={bit:-1},r.getCharCountIndicator=function(n,s){if(!n.ccBits)throw new Error("Invalid mode: "+n);if(!o.isValid(s))throw new Error("Invalid version: "+s);return s>=1&&s<10?n.ccBits[0]:s<27?n.ccBits[1]:n.ccBits[2]},r.getBestModeForData=function(n){return i.testNumeric(n)?r.NUMERIC:i.testAlphanumeric(n)?r.ALPHANUMERIC:i.testKanji(n)?r.KANJI:r.BYTE},r.toString=function(n){if(n&&n.id)return n.id;throw new Error("Invalid mode")},r.isValid=function(n){return n&&n.bit&&n.ccBits};function e(t){if(typeof t!="string")throw new Error("Param is not a string");switch(t.toLowerCase()){case"numeric":return r.NUMERIC;case"alphanumeric":return r.ALPHANUMERIC;case"kanji":return r.KANJI;case"byte":return r.BYTE;default:throw new Error("Unknown mode: "+t)}}r.from=function(n,s){if(r.isValid(n))return n;try{return e(n)}catch{return s}}})(it)),it}var Ut;function he(){return Ut||(Ut=1,(function(r){const o=U(),i=Wt(),e=yt(),t=F(),n=Zt(),s=7973,a=o.getBCHDigit(s);function u(h,f,N){for(let P=1;P<=40;P++)if(f<=r.getCapacity(P,N,h))return P}function c(h,f){return t.getCharCountIndicator(h,f)+4}function d(h,f){let N=0;return h.forEach(function(P){const S=c(P.mode,f);N+=S+P.getBitsLength()}),N}function p(h,f){for(let N=1;N<=40;N++)if(d(h,N)<=r.getCapacity(N,f,t.MIXED))return N}r.from=function(f,N){return n.isValid(f)?parseInt(f,10):N},r.getCapacity=function(f,N,P){if(!n.isValid(f))throw new Error("Invalid QR Code version");typeof P>"u"&&(P=t.BYTE);const S=o.getSymbolTotalCodewords(f),R=i.getTotalCodewordsCount(f,N),M=(S-R)*8;if(P===t.MIXED)return M;const T=M-c(P,f);switch(P){case t.NUMERIC:return Math.floor(T/10*3);case t.ALPHANUMERIC:return Math.floor(T/11*2);case t.KANJI:return Math.floor(T/13);case t.BYTE:default:return Math.floor(T/8)}},r.getBestVersionForData=function(f,N){let P;const S=e.from(N,e.M);if(Array.isArray(f)){if(f.length>1)return p(f,S);if(f.length===0)return 1;P=f[0]}else P=f;return u(P.mode,P.getLength(),S)},r.getEncodedBits=function(f){if(!n.isValid(f)||f<7)throw new Error("Invalid QR Code version");let N=f<<12;for(;o.getBCHDigit(N)-a>=0;)N^=s<<o.getBCHDigit(N)-a;return f<<12|N}})(ot)),ot}var ut={},Ft;function me(){if(Ft)return ut;Ft=1;const r=U(),o=1335,i=21522,e=r.getBCHDigit(o);return ut.getEncodedBits=function(n,s){const a=n.bit<<3|s;let u=a<<10;for(;r.getBCHDigit(u)-e>=0;)u^=o<<r.getBCHDigit(u)-e;return(a<<10|u)^i},ut}var at={},ct,kt;function we(){if(kt)return ct;kt=1;const r=F();function o(i){this.mode=r.NUMERIC,this.data=i.toString()}return o.getBitsLength=function(e){return 10*Math.floor(e/3)+(e%3?e%3*3+1:0)},o.prototype.getLength=function(){return this.data.length},o.prototype.getBitsLength=function(){return o.getBitsLength(this.data.length)},o.prototype.write=function(e){let t,n,s;for(t=0;t+3<=this.data.length;t+=3)n=this.data.substr(t,3),s=parseInt(n,10),e.put(s,10);const a=this.data.length-t;a>0&&(n=this.data.substr(t),s=parseInt(n,10),e.put(s,a*3+1))},ct=o,ct}var ft,zt;function ye(){if(zt)return ft;zt=1;const r=F(),o=["0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"," ","$","%","*","+","-",".","/",":"];function i(e){this.mode=r.ALPHANUMERIC,this.data=e}return i.getBitsLength=function(t){return 11*Math.floor(t/2)+6*(t%2)},i.prototype.getLength=function(){return this.data.length},i.prototype.getBitsLength=function(){return i.getBitsLength(this.data.length)},i.prototype.write=function(t){let n;for(n=0;n+2<=this.data.length;n+=2){let s=o.indexOf(this.data[n])*45;s+=o.indexOf(this.data[n+1]),t.put(s,11)}this.data.length%2&&t.put(o.indexOf(this.data[n]),6)},ft=i,ft}var lt,Vt;function Ce(){if(Vt)return lt;Vt=1;const r=F();function o(i){this.mode=r.BYTE,typeof i=="string"?this.data=new TextEncoder().encode(i):this.data=new Uint8Array(i)}return o.getBitsLength=function(e){return e*8},o.prototype.getLength=function(){return this.data.length},o.prototype.getBitsLength=function(){return o.getBitsLength(this.data.length)},o.prototype.write=function(i){for(let e=0,t=this.data.length;e<t;e++)i.put(this.data[e],8)},lt=o,lt}var dt,Kt;function Ee(){if(Kt)return dt;Kt=1;const r=F(),o=U();function i(e){this.mode=r.KANJI,this.data=e}return i.getBitsLength=function(t){return t*13},i.prototype.getLength=function(){return this.data.length},i.prototype.getBitsLength=function(){return i.getBitsLength(this.data.length)},i.prototype.write=function(e){let t;for(t=0;t<this.data.length;t++){let n=o.toSJIS(this.data[t]);if(n>=33088&&n<=40956)n-=33088;else if(n>=57408&&n<=60351)n-=49472;else throw new Error("Invalid SJIS character: "+this.data[t]+`
|
|
3
3
|
Make sure your charset is UTF-8`);n=(n>>>8&255)*192+(n&255),e.put(n,13)}},dt=i,dt}var gt={exports:{}},Ht;function pe(){return Ht||(Ht=1,(function(r){var o={single_source_shortest_paths:function(i,e,t){var n={},s={};s[e]=0;var a=o.PriorityQueue.make();a.push(e,0);for(var u,c,d,p,h,f,N,P,S;!a.empty();){u=a.pop(),c=u.value,p=u.cost,h=i[c]||{};for(d in h)h.hasOwnProperty(d)&&(f=h[d],N=p+f,P=s[d],S=typeof s[d]>"u",(S||P>N)&&(s[d]=N,a.push(d,N),n[d]=c))}if(typeof t<"u"&&typeof s[t]>"u"){var R=["Could not find a path from ",e," to ",t,"."].join("");throw new Error(R)}return n},extract_shortest_path_from_predecessor_list:function(i,e){for(var t=[],n=e;n;)t.push(n),i[n],n=i[n];return t.reverse(),t},find_path:function(i,e,t){var n=o.single_source_shortest_paths(i,e,t);return o.extract_shortest_path_from_predecessor_list(n,t)},PriorityQueue:{make:function(i){var e=o.PriorityQueue,t={},n;i=i||{};for(n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t.queue=[],t.sorter=i.sorter||e.default_sorter,t},default_sorter:function(i,e){return i.cost-e.cost},push:function(i,e){var t={value:i,cost:e};this.queue.push(t),this.queue.sort(this.sorter)},pop:function(){return this.queue.shift()},empty:function(){return this.queue.length===0}}};r.exports=o})(gt)),gt.exports}var Jt;function Be(){return Jt||(Jt=1,(function(r){const o=F(),i=we(),e=ye(),t=Ce(),n=Ee(),s=Xt(),a=U(),u=pe();function c(R){return unescape(encodeURIComponent(R)).length}function d(R,M,T){const B=[];let b;for(;(b=R.exec(T))!==null;)B.push({data:b[0],index:b.index,mode:M,length:b[0].length});return B}function p(R){const M=d(s.NUMERIC,o.NUMERIC,R),T=d(s.ALPHANUMERIC,o.ALPHANUMERIC,R);let B,b;return a.isKanjiModeEnabled()?(B=d(s.BYTE,o.BYTE,R),b=d(s.KANJI,o.KANJI,R)):(B=d(s.BYTE_KANJI,o.BYTE,R),b=[]),M.concat(T,B,b).sort(function(C,y){return C.index-y.index}).map(function(C){return{data:C.data,mode:C.mode,length:C.length}})}function h(R,M){switch(M){case o.NUMERIC:return i.getBitsLength(R);case o.ALPHANUMERIC:return e.getBitsLength(R);case o.KANJI:return n.getBitsLength(R);case o.BYTE:return t.getBitsLength(R)}}function f(R){return R.reduce(function(M,T){const B=M.length-1>=0?M[M.length-1]:null;return B&&B.mode===T.mode?(M[M.length-1].data+=T.data,M):(M.push(T),M)},[])}function N(R){const M=[];for(let T=0;T<R.length;T++){const B=R[T];switch(B.mode){case o.NUMERIC:M.push([B,{data:B.data,mode:o.ALPHANUMERIC,length:B.length},{data:B.data,mode:o.BYTE,length:B.length}]);break;case o.ALPHANUMERIC:M.push([B,{data:B.data,mode:o.BYTE,length:B.length}]);break;case o.KANJI:M.push([B,{data:B.data,mode:o.BYTE,length:c(B.data)}]);break;case o.BYTE:M.push([{data:B.data,mode:o.BYTE,length:c(B.data)}])}}return M}function P(R,M){const T={},B={start:{}};let b=["start"];for(let g=0;g<R.length;g++){const C=R[g],y=[];for(let l=0;l<C.length;l++){const A=C[l],m=""+g+l;y.push(m),T[m]={node:A,lastCount:0},B[m]={};for(let E=0;E<b.length;E++){const w=b[E];T[w]&&T[w].node.mode===A.mode?(B[w][m]=h(T[w].lastCount+A.length,A.mode)-h(T[w].lastCount,A.mode),T[w].lastCount+=A.length):(T[w]&&(T[w].lastCount=A.length),B[w][m]=h(A.length,A.mode)+4+o.getCharCountIndicator(A.mode,M))}}b=y}for(let g=0;g<b.length;g++)B[b[g]].end=0;return{map:B,table:T}}function S(R,M){let T;const B=o.getBestModeForData(R);if(T=o.from(M,B),T!==o.BYTE&&T.bit<B.bit)throw new Error('"'+R+'" cannot be encoded with mode '+o.toString(T)+`.
|
|
4
4
|
Suggested mode is: `+o.toString(B));switch(T===o.KANJI&&!a.isKanjiModeEnabled()&&(T=o.BYTE),T){case o.NUMERIC:return new i(R);case o.ALPHANUMERIC:return new e(R);case o.KANJI:return new n(R);case o.BYTE:return new t(R)}}r.fromArray=function(M){return M.reduce(function(T,B){return typeof B=="string"?T.push(S(B,null)):B.data&&T.push(S(B.data,B.mode)),T},[])},r.fromString=function(M,T){const B=p(M,a.isKanjiModeEnabled()),b=N(B),g=P(b,T),C=u.find_path(g.map,"start","end"),y=[];for(let l=1;l<C.length-1;l++)y.push(g.table[C[l]].node);return r.fromArray(f(y))},r.rawSplit=function(M){return r.fromArray(p(M,a.isKanjiModeEnabled()))}})(at)),at}var Ot;function Ae(){if(Ot)return W;Ot=1;const r=U(),o=yt(),i=se(),e=ue(),t=ae(),n=ce(),s=fe(),a=Wt(),u=ge(),c=he(),d=me(),p=F(),h=Be();function f(g,C){const y=g.size,l=n.getPositions(C);for(let A=0;A<l.length;A++){const m=l[A][0],E=l[A][1];for(let w=-1;w<=7;w++)if(!(m+w<=-1||y<=m+w))for(let I=-1;I<=7;I++)E+I<=-1||y<=E+I||(w>=0&&w<=6&&(I===0||I===6)||I>=0&&I<=6&&(w===0||w===6)||w>=2&&w<=4&&I>=2&&I<=4?g.set(m+w,E+I,!0,!0):g.set(m+w,E+I,!1,!0))}}function N(g){const C=g.size;for(let y=8;y<C-8;y++){const l=y%2===0;g.set(y,6,l,!0),g.set(6,y,l,!0)}}function P(g,C){const y=t.getPositions(C);for(let l=0;l<y.length;l++){const A=y[l][0],m=y[l][1];for(let E=-2;E<=2;E++)for(let w=-2;w<=2;w++)E===-2||E===2||w===-2||w===2||E===0&&w===0?g.set(A+E,m+w,!0,!0):g.set(A+E,m+w,!1,!0)}}function S(g,C){const y=g.size,l=c.getEncodedBits(C);let A,m,E;for(let w=0;w<18;w++)A=Math.floor(w/3),m=w%3+y-8-3,E=(l>>w&1)===1,g.set(A,m,E,!0),g.set(m,A,E,!0)}function R(g,C,y){const l=g.size,A=d.getEncodedBits(C,y);let m,E;for(m=0;m<15;m++)E=(A>>m&1)===1,m<6?g.set(m,8,E,!0):m<8?g.set(m+1,8,E,!0):g.set(l-15+m,8,E,!0),m<8?g.set(8,l-m-1,E,!0):m<9?g.set(8,15-m-1+1,E,!0):g.set(8,15-m-1,E,!0);g.set(l-8,8,1,!0)}function M(g,C){const y=g.size;let l=-1,A=y-1,m=7,E=0;for(let w=y-1;w>0;w-=2)for(w===6&&w--;;){for(let I=0;I<2;I++)if(!g.isReserved(A,w-I)){let v=!1;E<C.length&&(v=(C[E]>>>m&1)===1),g.set(A,w-I,v),m--,m===-1&&(E++,m=7)}if(A+=l,A<0||y<=A){A-=l,l=-l;break}}}function T(g,C,y){const l=new i;y.forEach(function(I){l.put(I.mode.bit,4),l.put(I.getLength(),p.getCharCountIndicator(I.mode,g)),I.write(l)});const A=r.getSymbolTotalCodewords(g),m=a.getTotalCodewordsCount(g,C),E=(A-m)*8;for(l.getLengthInBits()+4<=E&&l.put(0,4);l.getLengthInBits()%8!==0;)l.putBit(0);const w=(E-l.getLengthInBits())/8;for(let I=0;I<w;I++)l.put(I%2?17:236,8);return B(l,g,C)}function B(g,C,y){const l=r.getSymbolTotalCodewords(C),A=a.getTotalCodewordsCount(C,y),m=l-A,E=a.getBlocksCount(C,y),w=l%E,I=E-w,v=Math.floor(l/E),V=Math.floor(m/E),te=V+1,Ct=v-V,ee=new u(Ct);let O=0;const H=new Array(E),Et=new Array(E);let j=0;const ne=new Uint8Array(g.buffer);for(let k=0;k<E;k++){const G=k<I?V:te;H[k]=ne.slice(O,O+G),Et[k]=ee.encode(H[k]),O+=G,j=Math.max(j,G)}const Y=new Uint8Array(l);let pt=0,D,q;for(D=0;D<j;D++)for(q=0;q<E;q++)D<H[q].length&&(Y[pt++]=H[q][D]);for(D=0;D<Ct;D++)for(q=0;q<E;q++)Y[pt++]=Et[q][D];return Y}function b(g,C,y,l){let A;if(Array.isArray(g))A=h.fromArray(g);else if(typeof g=="string"){let v=C;if(!v){const V=h.rawSplit(g);v=c.getBestVersionForData(V,y)}A=h.fromString(g,v||40)}else throw new Error("Invalid data");const m=c.getBestVersionForData(A,y);if(!m)throw new Error("The amount of data is too big to be stored in a QR Code");if(!C)C=m;else if(C<m)throw new Error(`
|