@hanoilab/zk-bridge 0.1.5 → 0.1.7

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/README.md CHANGED
@@ -59,10 +59,18 @@ zk-bridge start
59
59
  ```
60
60
 
61
61
  ```text
62
- [zk-bridge] data dir: ~/.local/share/zk-bridge
63
- [zk-bridge] UI listening on http://127.0.0.1:7000
64
- [scheduler] starting cron "*/5 * * * *" (every 5 min)
65
- [zk-bridge] running. Press Ctrl+C to stop.
62
+ [zk-bridge] started (PID 12345)
63
+ Logs: ~/.local/share/zk-bridge/zk-bridge.log
64
+ Stop: zk-bridge stop
65
+ Tail: zk-bridge logs -f
66
+ ```
67
+
68
+ `start` detaches — closing the terminal won't stop the bridge. Useful one-liners:
69
+
70
+ ```bash
71
+ zk-bridge status # is it running?
72
+ zk-bridge logs -f # follow the log
73
+ zk-bridge stop # stop it
66
74
  ```
67
75
 
68
76
  ### 3. Open the admin UI
@@ -112,7 +120,13 @@ Visit **<http://localhost:7000>**, set the backend Push URL, paste the per-devic
112
120
  ## CLI
113
121
 
114
122
  ```bash
115
- zk-bridge start # Start bridge (UI + scheduler)
123
+ zk-bridge start # Start as background daemon (writes PID + log)
124
+ zk-bridge stop # Stop the daemon
125
+ zk-bridge restart # Stop + start
126
+ zk-bridge status # PID, uptime, log path
127
+ zk-bridge logs -f # Follow the log
128
+ zk-bridge logs -n 200 # Last 200 lines
129
+ zk-bridge run # Run in the foreground (debug / systemd / Docker)
116
130
  zk-bridge poll-once # Run a single cycle then exit
117
131
  zk-bridge reset-user # Forgot-password recovery
118
132
  zk-bridge recent-events # Print last N events from a device
@@ -121,6 +135,8 @@ zk-bridge --help
121
135
  zk-bridge --version
122
136
  ```
123
137
 
138
+ `start` detaches from the launching shell — `Ctrl+C` in that terminal does NOT kill the daemon. Use `zk-bridge stop`. Logs go to `<DATA_DIR>/zk-bridge.log`.
139
+
124
140
  Environment overrides (otherwise default):
125
141
 
126
142
  ```bash
@@ -0,0 +1,229 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.startDaemon = startDaemon;
37
+ exports.stopDaemon = stopDaemon;
38
+ exports.statusDaemon = statusDaemon;
39
+ exports.tailLog = tailLog;
40
+ exports.formatUptime = formatUptime;
41
+ const node_child_process_1 = require("node:child_process");
42
+ const fs = __importStar(require("node:fs"));
43
+ const path = __importStar(require("node:path"));
44
+ const env_1 = require("../config/env");
45
+ const PID_FILE = 'zk-bridge.pid';
46
+ const LOG_FILE = 'zk-bridge.log';
47
+ function paths() {
48
+ const { dataDir } = (0, env_1.loadBootEnv)();
49
+ fs.mkdirSync(dataDir, { recursive: true });
50
+ return {
51
+ dataDir,
52
+ pid: path.join(dataDir, PID_FILE),
53
+ log: path.join(dataDir, LOG_FILE),
54
+ };
55
+ }
56
+ function isAlive(pid) {
57
+ try {
58
+ process.kill(pid, 0);
59
+ return true;
60
+ }
61
+ catch {
62
+ return false;
63
+ }
64
+ }
65
+ function readPid() {
66
+ const p = paths();
67
+ if (!fs.existsSync(p.pid))
68
+ return null;
69
+ const n = parseInt(fs.readFileSync(p.pid, 'utf8').trim(), 10);
70
+ if (!Number.isFinite(n) || !isAlive(n)) {
71
+ try {
72
+ fs.unlinkSync(p.pid);
73
+ }
74
+ catch {
75
+ // best-effort
76
+ }
77
+ return null;
78
+ }
79
+ return n;
80
+ }
81
+ /**
82
+ * Spawn the bridge as a detached background child writing to a log file.
83
+ * Parent exits immediately — Ctrl+C in the launching shell does NOT kill
84
+ * the daemon (it's in a separate process group).
85
+ */
86
+ function startDaemon() {
87
+ const existing = readPid();
88
+ if (existing) {
89
+ throw new Error(`Already running (PID ${existing}). Use 'zk-bridge stop' or 'zk-bridge restart' first.`);
90
+ }
91
+ const p = paths();
92
+ const fd = fs.openSync(p.log, 'a');
93
+ const node = process.execPath;
94
+ // dist/index.js — same entry `zk-bridge run` invokes, but spawned detached.
95
+ const entry = path.resolve(__dirname, '..', 'index.js');
96
+ const child = (0, node_child_process_1.spawn)(node, [entry], {
97
+ detached: true,
98
+ stdio: ['ignore', fd, fd],
99
+ env: process.env,
100
+ });
101
+ child.unref();
102
+ if (!child.pid)
103
+ throw new Error('Failed to spawn child process.');
104
+ fs.writeFileSync(p.pid, String(child.pid));
105
+ fs.closeSync(fd);
106
+ return { pid: child.pid, logPath: p.log, dataDir: p.dataDir };
107
+ }
108
+ function stopDaemon() {
109
+ const pid = readPid();
110
+ if (!pid)
111
+ return null;
112
+ try {
113
+ process.kill(pid, 'SIGTERM');
114
+ }
115
+ catch {
116
+ // already dead — fall through to PID cleanup
117
+ }
118
+ // Wait a moment for graceful shutdown, then verify.
119
+ const deadline = Date.now() + 5_000;
120
+ while (Date.now() < deadline && isAlive(pid)) {
121
+ // busy-wait short; the kill is async
122
+ sleepSync(100);
123
+ }
124
+ if (isAlive(pid)) {
125
+ try {
126
+ process.kill(pid, 'SIGKILL');
127
+ }
128
+ catch {
129
+ // ignore
130
+ }
131
+ }
132
+ const p = paths();
133
+ try {
134
+ fs.unlinkSync(p.pid);
135
+ }
136
+ catch {
137
+ // ignore
138
+ }
139
+ return { pid };
140
+ }
141
+ function statusDaemon() {
142
+ const p = paths();
143
+ const pid = readPid();
144
+ if (!pid) {
145
+ return { running: false, logPath: p.log, dataDir: p.dataDir };
146
+ }
147
+ let uptimeMs;
148
+ try {
149
+ const stat = fs.statSync(p.pid);
150
+ uptimeMs = Date.now() - stat.mtimeMs;
151
+ }
152
+ catch {
153
+ // ignore
154
+ }
155
+ return { running: true, pid, logPath: p.log, dataDir: p.dataDir, uptimeMs };
156
+ }
157
+ /**
158
+ * Print last N lines of the log file, optionally follow new appends.
159
+ * Cross-platform tail — doesn't shell out.
160
+ */
161
+ function tailLog(follow, lines) {
162
+ const p = paths();
163
+ if (!fs.existsSync(p.log)) {
164
+ console.log('(no log yet — daemon has not started.)');
165
+ return;
166
+ }
167
+ const initial = readLastLines(p.log, lines);
168
+ process.stdout.write(initial);
169
+ if (!follow)
170
+ return;
171
+ let pos = fs.statSync(p.log).size;
172
+ const watcher = fs.watch(p.log, () => {
173
+ let stat;
174
+ try {
175
+ stat = fs.statSync(p.log);
176
+ }
177
+ catch {
178
+ return;
179
+ }
180
+ if (stat.size > pos) {
181
+ const fd = fs.openSync(p.log, 'r');
182
+ const buf = Buffer.alloc(stat.size - pos);
183
+ fs.readSync(fd, buf, 0, buf.length, pos);
184
+ fs.closeSync(fd);
185
+ process.stdout.write(buf.toString('utf8'));
186
+ pos = stat.size;
187
+ }
188
+ else if (stat.size < pos) {
189
+ pos = 0;
190
+ }
191
+ });
192
+ process.on('SIGINT', () => {
193
+ watcher.close();
194
+ process.exit(0);
195
+ });
196
+ // Keep the event loop alive.
197
+ setInterval(() => undefined, 1 << 30);
198
+ }
199
+ function readLastLines(file, lines) {
200
+ const content = fs.readFileSync(file, 'utf8');
201
+ const arr = content.split('\n');
202
+ // Trim trailing empty line caused by final newline.
203
+ if (arr[arr.length - 1] === '')
204
+ arr.pop();
205
+ const slice = arr.slice(-lines);
206
+ return slice.join('\n') + (slice.length > 0 ? '\n' : '');
207
+ }
208
+ function formatUptime(ms) {
209
+ const s = Math.floor(ms / 1000);
210
+ if (s < 60)
211
+ return `${s}s`;
212
+ const m = Math.floor(s / 60);
213
+ if (m < 60)
214
+ return `${m}m ${s % 60}s`;
215
+ const h = Math.floor(m / 60);
216
+ if (h < 24)
217
+ return `${h}h ${m % 60}m`;
218
+ const d = Math.floor(h / 24);
219
+ return `${d}d ${h % 24}h`;
220
+ }
221
+ function sleepSync(ms) {
222
+ // Atomics.wait on a SharedArrayBuffer would be precise but heavy; this
223
+ // ~100ms granularity is fine for stop's grace-period polling.
224
+ const end = Date.now() + ms;
225
+ while (Date.now() < end) {
226
+ // spin
227
+ }
228
+ }
229
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
@@ -44,13 +44,19 @@ var __importStar = (this && this.__importStar) || (function () {
44
44
  Object.defineProperty(exports, "__esModule", { value: true });
45
45
  const node_child_process_1 = require("node:child_process");
46
46
  const path = __importStar(require("node:path"));
47
+ const daemon_1 = require("./daemon");
47
48
  const command = process.argv[2];
48
49
  function help() {
49
50
  // eslint-disable-next-line no-console
50
51
  console.log(`Usage: zk-bridge <command> [options]
51
52
 
52
53
  Commands:
53
- start Start bridge (UI + scheduler) default if no command given
54
+ start Start bridge in the background (writes PID + log)
55
+ stop Stop the running daemon
56
+ restart Stop + start
57
+ status Show daemon state (PID, uptime, log path)
58
+ logs [-f] [-n N] Print last N log lines (default 50). -f to follow.
59
+ run Run in the foreground (debug / systemd / Docker)
54
60
  poll-once Run a single poll cycle then exit (no UI server)
55
61
  reset-user Reset the local admin user (forgot password recovery)
56
62
  recent-events Print recent events from a device
@@ -60,18 +66,18 @@ Commands:
60
66
  version, --version, -v Show package version
61
67
 
62
68
  Environment:
63
- DATA_DIR=./data Where SQLite + admin credentials live
69
+ DATA_DIR Where SQLite + admin credentials + log live
70
+ (default: OS user data dir)
64
71
  PORT=7000 UI HTTP port
65
72
  BIND_HOST=127.0.0.1 Bind address. Set 0.0.0.0 to allow LAN access
66
73
 
67
74
  Examples:
68
- zk-bridge start
69
- PORT=8080 zk-bridge start
70
- zk-bridge poll-once
71
- zk-bridge reset-user
72
- zk-bridge upgrade
73
- zk-bridge upgrade next
74
- zk-bridge recent-events --device "Cửa chính" -n 30
75
+ zk-bridge start # daemonize
76
+ zk-bridge status # is it running?
77
+ zk-bridge logs -f # follow logs
78
+ zk-bridge stop # stop the daemon
79
+ PORT=8080 zk-bridge run # foreground on a custom port
80
+ zk-bridge recent-events --device "Front gate" -n 30
75
81
  `);
76
82
  }
77
83
  function version() {
@@ -121,19 +127,87 @@ async function upgrade(tag = 'latest') {
121
127
  });
122
128
  // eslint-disable-next-line no-console
123
129
  console.log(`[zk-bridge] ✓ upgraded ${target}.\n` +
124
- 'Restart the running bridge process to pick up the new code:\n' +
125
- ' systemd: sudo systemctl restart zk-bridge\n' +
126
- ' Windows Task: schtasks /End /TN "ZK-Bridge (zk-bridge)" && schtasks /Run /TN "ZK-Bridge (zk-bridge)"\n' +
127
- ' launchd: launchctl kickstart -k gui/$UID/com.chr.zk-bridge\n' +
128
- ' pm2: pm2 restart zk-bridge\n' +
129
- ' docker compose: docker compose pull && docker compose up -d\n' +
130
- ' manual: Ctrl+C the foreground process, then `zk-bridge start` again');
130
+ 'Restart the daemon to pick up the new code:\n' +
131
+ ' zk-bridge restart');
132
+ }
133
+ function parseLogsArgs() {
134
+ const argv = process.argv.slice(3);
135
+ const follow = argv.includes('-f') || argv.includes('--follow');
136
+ const nIdx = argv.findIndex((a) => a === '-n' || a === '--lines');
137
+ const lines = nIdx >= 0 ? Number(argv[nIdx + 1]) : 50;
138
+ return { follow, lines: Number.isFinite(lines) && lines > 0 ? lines : 50 };
139
+ }
140
+ function cmdStart() {
141
+ try {
142
+ const r = (0, daemon_1.startDaemon)();
143
+ // eslint-disable-next-line no-console
144
+ console.log(`[zk-bridge] started (PID ${r.pid})\n` +
145
+ ` Logs: ${r.logPath}\n` +
146
+ ` Stop: zk-bridge stop\n` +
147
+ ` Tail: zk-bridge logs -f`);
148
+ }
149
+ catch (err) {
150
+ // eslint-disable-next-line no-console
151
+ console.error(`[zk-bridge] ${err instanceof Error ? err.message : err}`);
152
+ process.exit(1);
153
+ }
154
+ }
155
+ function cmdStop() {
156
+ const r = (0, daemon_1.stopDaemon)();
157
+ if (!r) {
158
+ // eslint-disable-next-line no-console
159
+ console.log('[zk-bridge] not running.');
160
+ return;
161
+ }
162
+ // eslint-disable-next-line no-console
163
+ console.log(`[zk-bridge] stopped (PID ${r.pid}).`);
164
+ }
165
+ async function cmdRestart() {
166
+ cmdStop();
167
+ await new Promise((r) => setTimeout(r, 600));
168
+ cmdStart();
169
+ }
170
+ function cmdStatus() {
171
+ const s = (0, daemon_1.statusDaemon)();
172
+ if (!s.running) {
173
+ // eslint-disable-next-line no-console
174
+ console.log(`[zk-bridge] not running.\n` +
175
+ ` Data dir: ${s.dataDir}\n` +
176
+ ` Logs: ${s.logPath} (last run, if any)`);
177
+ return;
178
+ }
179
+ const up = s.uptimeMs !== undefined ? (0, daemon_1.formatUptime)(s.uptimeMs) : 'unknown';
180
+ // eslint-disable-next-line no-console
181
+ console.log(`[zk-bridge] running.\n` +
182
+ ` PID: ${s.pid}\n` +
183
+ ` Uptime: ${up}\n` +
184
+ ` Data dir: ${s.dataDir}\n` +
185
+ ` Logs: ${s.logPath}`);
131
186
  }
132
187
  async function main() {
133
188
  switch (command) {
189
+ // ── daemon control ───────────────────────────────────────────────────
134
190
  case undefined:
135
191
  case 'start':
136
- // Strip the subcommand so the underlying entry sees a clean argv.
192
+ cmdStart();
193
+ return;
194
+ case 'stop':
195
+ cmdStop();
196
+ return;
197
+ case 'restart':
198
+ await cmdRestart();
199
+ return;
200
+ case 'status':
201
+ cmdStatus();
202
+ return;
203
+ case 'logs': {
204
+ const { follow, lines } = parseLogsArgs();
205
+ (0, daemon_1.tailLog)(follow, lines);
206
+ return;
207
+ }
208
+ // ── foreground / one-shot ────────────────────────────────────────────
209
+ case 'run':
210
+ // Foreground mode — what daemons / Docker / systemd should call.
137
211
  process.argv.splice(2, 1);
138
212
  await Promise.resolve().then(() => __importStar(require('../index')));
139
213
  return;
@@ -149,11 +223,12 @@ async function main() {
149
223
  process.argv.splice(2, 1);
150
224
  await Promise.resolve().then(() => __importStar(require('./recent-events')));
151
225
  return;
226
+ // ── self-update ──────────────────────────────────────────────────────
152
227
  case 'upgrade':
153
228
  case 'update':
154
- // Optional next arg = npm dist-tag (e.g. `next`). Default `latest`.
155
229
  await upgrade(process.argv[3] ?? 'latest');
156
230
  return;
231
+ // ── meta ─────────────────────────────────────────────────────────────
157
232
  case 'help':
158
233
  case '--help':
159
234
  case '-h':
@@ -1 +1 @@
1
- {"version":3,"file":"zk-bridge.js","sourceRoot":"","sources":["../../src/cli/zk-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"zk-bridge.js","sourceRoot":"","sources":["../../src/cli/zk-bridge.ts"],"names":[],"mappings":"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"}
@@ -23,6 +23,7 @@ const config_pages_1 = require("./ui/config-pages");
23
23
  const dashboard_page_1 = require("./ui/dashboard-page");
24
24
  const device_events_page_1 = require("./ui/device-events-page");
25
25
  const devices_page_1 = require("./ui/devices-page");
26
+ const guide_page_1 = require("./ui/guide-page");
26
27
  const logs_page_1 = require("./ui/logs-page");
27
28
  const PUBLIC_PATHS = new Set(['/setup', '/login']);
28
29
  async function userCount() {
@@ -415,6 +416,8 @@ function createServer() {
415
416
  return c.redirect('/dashboard');
416
417
  });
417
418
  // ---------- /logs ----------
419
+ // ---------- /guide ----------
420
+ app.get('/guide', (c) => c.html((0, guide_page_1.renderGuidePage)()));
418
421
  app.get('/logs', async (c) => {
419
422
  const pageRaw = Number(c.req.query('page') ?? '1');
420
423
  const page = Number.isFinite(pageRaw) && pageRaw >= 1 ? Math.floor(pageRaw) : 1;
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":";;;;;AAkFA,oCA4aC;AA9fD,wDAA8B;AAC9B,+BAA0C;AAC1C,wCAAiE;AAEjE,yCAAqD;AACrD,+CAAmF;AACnF,qCAYoB;AACpB,yCAAoC;AACpC,mDAAoD;AACpD,iDAAsD;AACtD,iDAAqD;AACrD,iDAA8D;AAC9D,uCAAwD;AACxD,+CAAqE;AAErE,uCAMmB;AACnB,gDAAmE;AACnE,oDAAgF;AAChF,wDAAsD;AACtD,gEAAsF;AACtF,oDAAsD;AACtD,8CAAgD;AAMhD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAEnD,KAAK,UAAU,SAAS;IACtB,OAAO,aAAI,CAAC,KAAK,EAAE,CAAC;AACtB,CAAC;AAED,KAAK,UAAU,gBAAgB,CAAC,CAAU,EAAE,MAAc;IACxD,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAgB,GAAE,CAAC;IACxC,MAAM,KAAK,GAAG,IAAA,qBAAW,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,IAAA,kBAAS,EAAC,CAAC,EAAE,wBAAc,EAAE,KAAK,EAAE;QAClC,QAAQ,EAAE,IAAI;QACd,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,GAAG;QACT,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,wBAAc,GAAG,IAAI,CAAC;KAC1C,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,IAA6B;IACpD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,KAAK,GAAG,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC;IAEvF,IAAI,CAAC,IAAI;QAAE,OAAO,mBAAmB,CAAC;IACtC,IAAI,CAAC,IAAI;QAAE,OAAO,wBAAwB,CAAC;IAC3C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK;QAAE,OAAO,eAAe,CAAC;IAC/E,IAAI,CAAC,WAAW;QAAE,OAAO,2BAA2B,CAAC;IAErD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AACpD,CAAC;AAED,IAAI,eAAe,GAAoB,EAAE,CAAC;AAC1C,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAE5B,SAAgB,YAAY;IAC1B,MAAM,GAAG,GAAG,IAAI,WAAI,EAAe,CAAC;IAEpC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;QACzC,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC1D,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QACD,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;QAChC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QACD,MAAM,MAAM,GAAG,IAAA,kBAAS,EAAC,CAAC,EAAE,wBAAc,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAgB,GAAE,CAAC;QACxC,MAAM,IAAI,GAAG,IAAA,uBAAa,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAA,qBAAY,EAAC,CAAC,EAAE,wBAAc,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;YAC/C,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QACD,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7B,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC;IAE9C,+BAA+B;IAC/B,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5B,IAAI,CAAC,MAAM,SAAS,EAAE,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzD,OAAO,CAAC,CAAC,IAAI,CAAC,IAAA,4BAAe,GAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7B,IAAI,CAAC,MAAM,SAAS,EAAE,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;QAC3C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,CAAC,IAAI,CACX,IAAA,4BAAe,EAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,yCAAyC,EAAE,EAAE,CAAC,CACnF,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,CAAC,IAAI,CACX,IAAA,4BAAe,EAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,yCAAyC,EAAE,EAAE,CAAC,CACnF,CAAC;QACJ,CAAC;QACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,CAAC,CAAC,IAAI,CAAC,IAAA,4BAAe,EAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,CAAC,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,YAAY,GAAG,MAAM,kBAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,MAAM,aAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;QAC3D,MAAM,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,+BAA+B;IAC/B,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5B,IAAI,CAAC,MAAM,SAAS,EAAE,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC,IAAI,CAAC,IAAA,4BAAe,GAAE,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QAC7C,MAAM,IAAI,GAAG,MAAM,aAAI,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,kBAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC;YAClE,OAAO,CAAC,CAAC,IAAI,CACX,IAAA,4BAAe,EAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,+BAA+B,EAAE,EAAE,QAAQ,EAAE,CAAC,CACnF,CAAC;QACJ,CAAC;QACD,MAAM,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;QACxB,IAAA,qBAAY,EAAC,CAAC,EAAE,wBAAc,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,mCAAmC;IACnC,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAChC,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAgB,GAAE,CAAC;QACxC,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAW,GAAE,CAAC;QACpC,MAAM,WAAW,GAAG,MAAM,IAAA,+BAAwB,GAAE,CAAC;QACrD,MAAM,YAAY,GAAG,MAAM,IAAA,oBAAa,EAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC,IAAI,CACX,IAAA,gCAAe,EAAC;YACd,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;YAClC,MAAM;YACN,OAAO;YACP,WAAW;YACX,YAAY;SACb,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,iCAAiC;IACjC,GAAG,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAgB,GAAE,CAAC;QACxC,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAW,GAAE,CAAC;QACpC,OAAO,CAAC,CAAC,IAAI,CACX,IAAA,gCAAiB,EAAC;YAChB,OAAO;YACP,WAAW,EAAE,eAAe;YAC5B,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;SACnC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,eAAe,CAAC,IAA+B,CAAC,CAAC;QAChE,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAW,GAAE,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAgB,GAAE,CAAC;YACxC,OAAO,CAAC,CAAC,IAAI,CACX,IAAA,gCAAiB,EAAC;gBAChB,OAAO;gBACP,WAAW,EAAE,eAAe;gBAC5B,OAAO,EAAE,WAAW;gBACpB,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;gBAClC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE;aACxC,CAAC,CACH,CAAC;QACJ,CAAC;QACD,MAAM,IAAA,mBAAY,EAAC,MAAM,CAAC,CAAC;QAC3B,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,eAAe,GAAG,MAAM,IAAA,wBAAa,EAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACjD,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,eAAe,GAAG,EAAE,CAAC;YACrB,WAAW,GAAG,IAAI,CAAC;YACnB,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAW,GAAE,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAgB,GAAE,CAAC;YACxC,OAAO,CAAC,CAAC,IAAI,CACX,IAAA,gCAAiB,EAAC;gBAChB,OAAO;gBACP,WAAW,EAAE,EAAE;gBACf,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;gBAClC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,GAAG,EAAE,EAAE;aACvD,CAAC,CACH,CAAC;QACJ,CAAC;QACD,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACnC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,eAAe,CAAC,IAA+B,CAAC,CAAC;QAChE,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAW,GAAE,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAgB,GAAE,CAAC;YACxC,OAAO,CAAC,CAAC,IAAI,CACX,IAAA,gCAAiB,EAAC;gBAChB,OAAO;gBACP,WAAW,EAAE,eAAe;gBAC5B,OAAO,EAAE,WAAW;gBACpB,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;gBAClC,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE;aACxC,CAAC,CACH,CAAC;QACJ,CAAC;QACD,MAAM,IAAA,mBAAY,EAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAC/B,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,qBAAqB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1C,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,MAAM,IAAA,mBAAe,EAAC,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAChD,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,MAAM,IAAA,wBAAiB,EAAC,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,CAAC,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACzC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAA,gBAAS,EAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChE,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAE3C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEhF,gEAAgE;QAChE,oEAAoE;QACpE,6DAA6D;QAC7D,IAAI,KAAK,GAAmD,IAAI,CAAC;QACjE,IAAI,MAAM,GAML,EAAE,CAAC;QACR,IAAI,OAAO,GAAG,CAAC,CAAC;QAEhB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,IAAA,4BAAgB,EAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YACjE,MAAM,GAAG,OAAO,CAAC,IAAI;iBAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,YAAY,KAAK,GAAG,CAAC;iBACvD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,MAAM,CAAC,GAAG,IAAA,6BAAiB,EAAC,CAAC,CAAC,CAAC;gBAC/B,OAAO;oBACL,UAAU,EAAE,CAAC,CAAC,UAAU;oBACxB,YAAY,EAAE,CAAC,CAAC,YAAY;oBAC5B,YAAY,EAAE,CAAC,CAAC,SAAS;oBACzB,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,CAAiB;oBACtC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;iBACzB,CAAC;YACJ,CAAC,CAAC;gBACF,+DAA+D;gBAC/D,mEAAmE;iBAClE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBACb,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;oBAAE,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;gBACtD,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,CAAC;YACjF,CAAC,CAAC,CAAC;YACL,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;YAElC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;gBAChB,KAAK,GAAG;oBACN,IAAI,EAAE,KAAK;oBACX,OAAO,EAAE,wCAAwC,OAAO,CAAC,IAAI,CAAC,MAAM,wBAAwB,OAAO,CAAC,GAAG,eAAe;iBACvH,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC;YAClC,KAAK,GAAG;gBACN,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,oCAAoC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;aAChG,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;QACnC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,gBAAgB,CAAC,CAAC,CAAC;QAC3E,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,gBAAgB,CAAC;QACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAAC,CAAC;QACjE,MAAM,KAAK,GAAqB,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnD,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,YAAY,EAAE,CAAC,CAAC,YAAY;YAC5B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC,cAAc;SAC1C,CAAC,CAAC,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;QACrC,MAAM,YAAY,GAChB,QAAQ,CAAC,MAAM,GAAG,CAAC;YACnB,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM;YAC5B,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,IAAI,MAAM,CAAC;QAEjD,OAAO,CAAC,CAAC,IAAI,CACX,IAAA,2CAAsB,EAAC;YACrB,MAAM;YACN,MAAM,EAAE,KAAK;YACb,YAAY;YACZ,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,gBAAgB;YAC1B,YAAY;YACZ,QAAQ,EAAE,IAAI;YACd,OAAO;YACP,KAAK;SACN,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3C,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAA,gBAAS,EAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAgB,GAAE,CAAC;QACxC,IAAI,KAA8C,CAAC;QACnD,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/B,KAAK,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,kDAAkD,EAAE,CAAC;QACvF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAA,2BAAc,EAAC;oBAClC,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,KAAK,EAAE,MAAM,CAAC,WAAW;iBAC1B,CAAC,CAAC;gBACH,KAAK,GAAG;oBACN,IAAI,EAAE,IAAI;oBACV,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,qDAAqD,MAAM,CAAC,QAAQ,IAAI;iBAChG,CAAC;YACJ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAC7D,KAAK,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;YAC7D,CAAC;QACH,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAW,GAAE,CAAC;QACpC,OAAO,CAAC,CAAC,IAAI,CACX,IAAA,gCAAiB,EAAC;YAChB,OAAO;YACP,WAAW,EAAE,eAAe;YAC5B,OAAO,EAAE,WAAW;YACpB,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;YAClC,KAAK;SACN,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,oCAAoC;IACpC,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACjC,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAgB,GAAE,CAAC;QACxC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAA,kCAAmB,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAClC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAgB,GAAE,CAAC;YACxC,OAAO,CAAC,CAAC,IAAI,CACX,IAAA,kCAAmB,EAAC;gBAClB,MAAM;gBACN,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE;aACzD,CAAC,CACH,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,IAAI,EAAE,CAAC;YAClE,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAgB,GAAE,CAAC;YACxC,OAAO,CAAC,CAAC,IAAI,CACX,IAAA,kCAAmB,EAAC;gBAClB,MAAM;gBACN,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,mDAAmD,EAAE;aACrF,CAAC,CACH,CAAC;QACJ,CAAC;QACD,MAAM,IAAA,oBAAa,EAAC;YAClB,CAAC,oBAAU,CAAC,OAAO,CAAC,EAAE,OAAO;YAC7B,CAAC,oBAAU,CAAC,OAAO,CAAC,EAAE,OAAO;YAC7B,CAAC,oBAAU,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;SAC/C,CAAC,CAAC;QACH,MAAM,IAAA,4BAAgB,GAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAgB,GAAE,CAAC;QACxC,OAAO,CAAC,CAAC,IAAI,CACX,IAAA,kCAAmB,EAAC;YAClB,MAAM;YACN,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,mDAAmD,EAAE;SACpF,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,yDAAyD;IACzD,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC;IAEzD,uCAAuC;IACvC,GAAG,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACpC,MAAM,OAAO,GAAG,CAAC,MAAM,IAAA,gBAAS,EAAC,oBAAU,CAAC,gBAAgB,CAAC,CAAC,KAAK,GAAG,CAAC;QACvE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAA,qCAAsB,EAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,QAAQ,GAAG,IAAA,4BAAoB,GAAE,CAAC;QACxC,IAAI,KAA8C,CAAC;QACnD,IAAI,CAAC;YACH,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACxB,MAAM,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACzB,MAAM,IAAA,gBAAS,EAAC,oBAAU,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;gBAClD,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,uBAAuB,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;YAClF,CAAC;iBAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBAChC,MAAM,QAAQ,CAAC,SAAS,EAAE,CAAC;gBAC3B,MAAM,IAAA,gBAAS,EAAC,oBAAU,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;gBAClD,KAAK,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC;YACtD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,KAAK,GAAG;gBACN,IAAI,EAAE,KAAK;gBACX,OAAO,EAAE,cAAc,MAAM,YAAY,GAAG,uCAAuC;aACpF,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,MAAM,IAAA,gBAAS,EAAC,oBAAU,CAAC,gBAAgB,CAAC,CAAC,KAAK,GAAG,CAAC;QACvE,OAAO,CAAC,CAAC,IAAI,CAAC,IAAA,qCAAsB,EAAC,EAAE,gBAAgB,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,uCAAuC;IACvC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC,EAAE,EAAE;QAC/B,KAAK,IAAA,mBAAO,GAAE,CAAC;QACf,OAAO,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,8BAA8B;IAC9B,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,MAAM,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC1C,MAAM,cAAc,GAAG,SAAS,IAAI,SAAS,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAChF,MAAM,QAAQ,GAAG,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,IAAA,oBAAa,EAAC;YACjC,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ;YAC7B,QAAQ,EAAE,cAAc,IAAI,SAAS;SACtC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,IAAA,kBAAW,GAAE,CAAC;QACpC,OAAO,CAAC,CAAC,IAAI,CACX,IAAA,0BAAc,EAAC;YACb,MAAM;YACN,OAAO;YACP,IAAI;YACJ,QAAQ;YACR,cAAc;SACf,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderGuidePage = renderGuidePage;
4
+ const layout_1 = require("./layout");
5
+ function renderGuidePage() {
6
+ const body = `
7
+ <div class="space-y-6">
8
+
9
+ <header class="bg-white rounded-lg shadow p-6">
10
+ <div class="flex items-start gap-4 flex-wrap">
11
+ <div class="flex-1 min-w-0">
12
+ <h1 class="text-2xl font-semibold">ZK-Bridge guide</h1>
13
+ <p class="text-sm text-slate-500 mt-1">
14
+ Everything this bridge can do, in one page. Click any section below to jump.
15
+ </p>
16
+ </div>
17
+ <a href="${layout_1.GITHUB_URL}" target="_blank" rel="noopener"
18
+ class="inline-flex items-center gap-2 px-3 py-1.5 rounded bg-amber-50 text-amber-800 border border-amber-200 hover:bg-amber-100 text-sm font-medium">
19
+ <svg viewBox="0 0 24 24" fill="currentColor" class="w-4 h-4">
20
+ <path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/>
21
+ </svg>
22
+ Star on GitHub
23
+ </a>
24
+ </div>
25
+ <div class="mt-3 flex flex-wrap gap-2 text-xs">
26
+ <a class="text-slate-600 hover:text-slate-900 underline" href="${layout_1.GITHUB_URL}" target="_blank" rel="noopener">GitHub repo</a>
27
+ <span class="text-slate-300">·</span>
28
+ <a class="text-slate-600 hover:text-slate-900 underline" href="${layout_1.NPM_URL}" target="_blank" rel="noopener">npm package</a>
29
+ <span class="text-slate-300">·</span>
30
+ <a class="text-slate-600 hover:text-slate-900 underline" href="${layout_1.GITHUB_URL}/issues" target="_blank" rel="noopener">Report a bug</a>
31
+ </div>
32
+ </header>
33
+
34
+ <nav class="bg-white rounded-lg shadow p-4">
35
+ <h2 class="font-semibold mb-2 text-sm uppercase text-slate-500 tracking-wide">Contents</h2>
36
+ <ul class="grid grid-cols-2 md:grid-cols-3 gap-x-4 gap-y-1 text-sm">
37
+ <li><a class="text-slate-700 hover:text-slate-900 underline" href="#flow">1. End-to-end flow</a></li>
38
+ <li><a class="text-slate-700 hover:text-slate-900 underline" href="#api">2. API config</a></li>
39
+ <li><a class="text-slate-700 hover:text-slate-900 underline" href="#devices">3. Devices</a></li>
40
+ <li><a class="text-slate-700 hover:text-slate-900 underline" href="#scan">4. LAN scan</a></li>
41
+ <li><a class="text-slate-700 hover:text-slate-900 underline" href="#events">5. Per-device events</a></li>
42
+ <li><a class="text-slate-700 hover:text-slate-900 underline" href="#cycles">6. Cycle logs</a></li>
43
+ <li><a class="text-slate-700 hover:text-slate-900 underline" href="#system">7. System tools</a></li>
44
+ <li><a class="text-slate-700 hover:text-slate-900 underline" href="#cli">8. CLI commands</a></li>
45
+ <li><a class="text-slate-700 hover:text-slate-900 underline" href="#contract">9. Backend contract</a></li>
46
+ <li><a class="text-slate-700 hover:text-slate-900 underline" href="#troubleshoot">10. Troubleshooting</a></li>
47
+ </ul>
48
+ </nav>
49
+
50
+ <section id="flow" class="bg-white rounded-lg shadow p-6">
51
+ <h2 class="text-lg font-semibold mb-2">1. End-to-end flow</h2>
52
+ <p class="text-sm text-slate-600 mb-3">
53
+ ZK-Bridge sits between a ZKTeco fingerprint reader on your office LAN and an HTTP backend
54
+ (HRIS / C-HR / your own API). It polls the device on a schedule, translates events into a
55
+ generic JSON shape, and pushes them via HTTPS — no port forwarding or VPN needed.
56
+ </p>
57
+ <pre class="bg-slate-50 border border-slate-200 rounded p-3 font-mono text-xs overflow-x-auto">
58
+ ZKTeco device ZK-Bridge (this UI) Your backend
59
+ ┌────────────┐ ┌──────────────────┐ ┌───────────────┐
60
+ │ TCP 4370 │ ◄──► │ Poll · SQLite │ ◄───► │ Push / Ping │
61
+ │ on the LAN │ │ Scheduler · UI │ │ endpoints │
62
+ └────────────┘ └──────────────────┘ └───────────────┘
63
+ </pre>
64
+ <p class="text-sm text-slate-600 mt-3">
65
+ Every cycle (default 5 min): list enabled devices → for each: open ZK socket → fetch log
66
+ → translate → push to backend in batches of 200. Backend dedupes by
67
+ <code class="bg-slate-100 px-1 rounded">(deviceId, eventLogId)</code> so retries are safe.
68
+ </p>
69
+ </section>
70
+
71
+ <section id="api" class="bg-white rounded-lg shadow p-6">
72
+ <h2 class="text-lg font-semibold mb-2">2. API config — <a class="text-sm text-blue-600 hover:underline" href="/config/api">/config/api</a></h2>
73
+ <p class="text-sm text-slate-600 mb-3">
74
+ Where the bridge sends data. Two URLs, full paths (no concatenation):
75
+ </p>
76
+ <ul class="list-disc pl-5 space-y-1 text-sm text-slate-700">
77
+ <li><strong>Push URL</strong> (required) — bridge POSTs <code class="bg-slate-100 px-1 rounded">{ token, events[] }</code>.</li>
78
+ <li><strong>Ping URL</strong> (optional) — used by the <strong>Connect</strong> button to verify token + reachability without pushing events. If empty, falls back to a push with an empty events array.</li>
79
+ <li><strong>Poll interval</strong> — minutes between cycles (1–1440).</li>
80
+ </ul>
81
+ <p class="text-sm text-slate-600 mt-3">
82
+ Save will restart the scheduler with the new interval immediately.
83
+ </p>
84
+ </section>
85
+
86
+ <section id="devices" class="bg-white rounded-lg shadow p-6">
87
+ <h2 class="text-lg font-semibold mb-2">3. Devices — <a class="text-sm text-blue-600 hover:underline" href="/devices">/devices</a></h2>
88
+ <p class="text-sm text-slate-600 mb-3">
89
+ Each row = one ZKTeco reader. Per-device fields: <strong>Name</strong>,
90
+ <strong>Host:Port</strong> (default 4370), <strong>Device token</strong> (JWT issued by your
91
+ backend), <strong>Enabled</strong>. Status dot shows the last cycle outcome — green ok,
92
+ amber partial, red zk_error / api_error, grey never run.
93
+ </p>
94
+ <p class="text-sm text-slate-600 mb-2"><strong>Row actions</strong> (right-most column):</p>
95
+ <ul class="list-disc pl-5 space-y-1 text-sm text-slate-700">
96
+ <li><strong>Events</strong> — live attendance from this device (see §5).</li>
97
+ <li><strong>Cycles</strong> — cycle log filtered to this device (see §6).</li>
98
+ <li><strong>Edit</strong> — opens the modal pre-filled.</li>
99
+ <li><strong>Connect</strong> — pings the backend with this device's token and bumps <code class="bg-slate-100 px-1 rounded">lastSeenAt</code> there (sanity check before relying on the cycle).</li>
100
+ <li><strong>Delete</strong> — removes the row + its queued events + cycle log entries.</li>
101
+ </ul>
102
+ </section>
103
+
104
+ <section id="scan" class="bg-white rounded-lg shadow p-6">
105
+ <h2 class="text-lg font-semibold mb-2">4. LAN scan — <a class="text-sm text-blue-600 hover:underline" href="/devices">Devices → Scan now</a></h2>
106
+ <p class="text-sm text-slate-600 mb-3">
107
+ Probes every host in the bridge's <code class="bg-slate-100 px-1 rounded">/24</code> subnet on
108
+ TCP 4370. Each candidate gets an extra ZK protocol probe to fetch device metadata (model,
109
+ serial, user count) — distinguishes a real ZKTeco from any other service on the same port.
110
+ </p>
111
+ <ul class="list-disc pl-5 space-y-1 text-sm text-slate-700">
112
+ <li><span class="px-1.5 py-0.5 rounded text-[10px] uppercase font-semibold bg-emerald-100 text-emerald-800">ZKTeco</span> badge — TCP open + ZK protocol replied → confirmed.</li>
113
+ <li><span class="px-1.5 py-0.5 rounded text-[10px] uppercase font-semibold bg-amber-100 text-amber-800">ZKTeco?</span> — port 4370 open but ZK probe failed (device likely busy with another connection). Still likely a ZKTeco.</li>
114
+ <li><span class="px-1.5 py-0.5 rounded text-[10px] uppercase font-semibold bg-amber-100 text-amber-800">unknown</span> — port open but probe failed AND it's not the canonical ZK port.</li>
115
+ </ul>
116
+ <p class="text-sm text-slate-600 mt-3">
117
+ Click <strong>+ Add as device</strong> next to a result — opens the Add modal with name +
118
+ host pre-filled. Paste the JWT, save.
119
+ </p>
120
+ </section>
121
+
122
+ <section id="events" class="bg-white rounded-lg shadow p-6">
123
+ <h2 class="text-lg font-semibold mb-2">5. Per-device events — Devices → <strong>Events</strong></h2>
124
+ <p class="text-sm text-slate-600 mb-3">
125
+ Live read of the attendance log straight from the device — no cache. Sorted by
126
+ <code class="bg-slate-100 px-1 rounded">eventLogId</code> descending; a thick divider marks
127
+ the cursor: rows above are <strong>pending</strong> (not yet pushed), rows below are
128
+ <strong>pushed</strong>.
129
+ </p>
130
+ <ul class="list-disc pl-5 space-y-1 text-sm text-slate-700">
131
+ <li><strong>Refresh from device</strong> — re-fetch (typical 5–30s for thousands of records).</li>
132
+ <li><strong>Reset cursor</strong> — sets <code class="bg-slate-100 px-1 rounded">last_event_log_id = 0</code>; next cycle re-pulls every event still on the device. Backend dedupes — safe but may push thousands at once.</li>
133
+ <li>Pagination: 50 rows per page, deep-link friendly via <code class="bg-slate-100 px-1 rounded">?page=N</code>.</li>
134
+ </ul>
135
+ </section>
136
+
137
+ <section id="cycles" class="bg-white rounded-lg shadow p-6">
138
+ <h2 class="text-lg font-semibold mb-2">6. Cycle logs — <a class="text-sm text-blue-600 hover:underline" href="/logs">/logs</a></h2>
139
+ <p class="text-sm text-slate-600 mb-3">
140
+ Per-cycle audit: 1 row = 1 device cycle attempt. Status badges:
141
+ </p>
142
+ <ul class="list-disc pl-5 space-y-1 text-sm text-slate-700">
143
+ <li><span class="px-1.5 py-0.5 rounded text-xs bg-emerald-100 text-emerald-800">ok</span> — all events pushed, cursor advanced.</li>
144
+ <li><span class="px-1.5 py-0.5 rounded text-xs bg-amber-100 text-amber-800">partial</span> — some pushed, the rest queued offline (will retry).</li>
145
+ <li><span class="px-1.5 py-0.5 rounded text-xs bg-rose-100 text-rose-800">zk_error</span> — couldn't reach the device.</li>
146
+ <li><span class="px-1.5 py-0.5 rounded text-xs bg-rose-100 text-rose-800">api_error</span> — couldn't push to the backend; events sit in the queue.</li>
147
+ </ul>
148
+ <p class="text-sm text-slate-600 mt-3">
149
+ Filter by device via the dropdown (or hit <strong>Cycles</strong> on a device row). The log
150
+ rotates automatically — last 1000 entries are kept.
151
+ </p>
152
+ </section>
153
+
154
+ <section id="system" class="bg-white rounded-lg shadow p-6">
155
+ <h2 class="text-lg font-semibold mb-2">7. System tools — <a class="text-sm text-blue-600 hover:underline" href="/config/system">/config/system</a></h2>
156
+ <ul class="list-disc pl-5 space-y-1 text-sm text-slate-700">
157
+ <li><strong>Auto-start on boot</strong> — toggle to register a systemd unit / Windows Scheduled Task / launchd plist with <code class="bg-slate-100 px-1 rounded">Restart=on-failure</code>. Bridge survives host reboots without manual start.</li>
158
+ <li><strong>Run a cycle now</strong> — fires a poll cycle immediately, useful for verification after config changes.</li>
159
+ </ul>
160
+ </section>
161
+
162
+ <section id="cli" class="bg-white rounded-lg shadow p-6">
163
+ <h2 class="text-lg font-semibold mb-2">8. CLI commands</h2>
164
+ <p class="text-sm text-slate-600 mb-3">
165
+ The package ships a <code class="bg-slate-100 px-1 rounded">zk-bridge</code> binary. Daemon
166
+ mode is the default — closing the launching terminal does <em>not</em> stop the bridge.
167
+ </p>
168
+ <pre class="bg-slate-50 border border-slate-200 rounded p-3 font-mono text-xs overflow-x-auto">
169
+ zk-bridge start # detach as background daemon
170
+ zk-bridge stop # SIGTERM the daemon
171
+ zk-bridge restart # stop + start
172
+ zk-bridge status # PID, uptime, log path
173
+ zk-bridge logs -f # follow the log file
174
+ zk-bridge logs -n 200 # last 200 lines
175
+ zk-bridge run # foreground mode (systemd / Docker / PM2)
176
+ zk-bridge poll-once # one cycle then exit
177
+ zk-bridge reset-user # forgot-password recovery
178
+ zk-bridge recent-events # peek at last N events from a device
179
+ zk-bridge upgrade [tag] # self-update via npm
180
+ </pre>
181
+ <p class="text-sm text-slate-600 mt-3">
182
+ Logs land at <code class="bg-slate-100 px-1 rounded">&lt;DATA_DIR&gt;/zk-bridge.log</code>;
183
+ PID file at <code class="bg-slate-100 px-1 rounded">&lt;DATA_DIR&gt;/zk-bridge.pid</code>.
184
+ Every line is prefixed with an ISO timestamp.
185
+ </p>
186
+ </section>
187
+
188
+ <section id="contract" class="bg-white rounded-lg shadow p-6">
189
+ <h2 class="text-lg font-semibold mb-2">9. Backend contract</h2>
190
+ <p class="text-sm text-slate-600 mb-3">
191
+ Any backend exposing two HTTP endpoints can receive events from this bridge. JSON over HTTPS,
192
+ token-auth in the body (no special headers required).
193
+ </p>
194
+ <p class="text-sm font-medium mb-1">Push (required):</p>
195
+ <pre class="bg-slate-50 border border-slate-200 rounded p-3 font-mono text-xs overflow-x-auto mb-3">
196
+ POST &lt;push-url&gt;
197
+ Content-Type: application/json
198
+
199
+ {
200
+ "token": "&lt;JWT issued by your backend&gt;",
201
+ "events": [
202
+ {
203
+ "eventLogId": "12345",
204
+ "employeeCode": "EMP-0001",
205
+ "timestamp": "2026-05-07T08:23:45.000Z",
206
+ "type": "IN"
207
+ }
208
+ ]
209
+ }
210
+ </pre>
211
+ <p class="text-sm font-medium mb-1">Ping (optional):</p>
212
+ <pre class="bg-slate-50 border border-slate-200 rounded p-3 font-mono text-xs overflow-x-auto">
213
+ POST &lt;ping-url&gt;
214
+ Content-Type: application/json
215
+
216
+ { "token": "&lt;JWT&gt;" }
217
+ </pre>
218
+ <p class="text-sm text-slate-600 mt-3">
219
+ Backend should: verify the JWT, dedupe by <code class="bg-slate-100 px-1 rounded">(deviceId, eventLogId)</code>,
220
+ persist events. Bridge only checks HTTP status (2xx = success, anything else = retry / queue).
221
+ </p>
222
+ </section>
223
+
224
+ <section id="troubleshoot" class="bg-white rounded-lg shadow p-6">
225
+ <h2 class="text-lg font-semibold mb-2">10. Troubleshooting</h2>
226
+ <table class="w-full text-sm">
227
+ <thead>
228
+ <tr class="text-left text-xs uppercase text-slate-500 border-b">
229
+ <th class="pb-2 pr-3">Symptom</th>
230
+ <th class="pb-2">Likely cause / fix</th>
231
+ </tr>
232
+ </thead>
233
+ <tbody class="divide-y divide-slate-200">
234
+ <tr class="align-top">
235
+ <td class="py-2 pr-3 font-mono text-xs">ETIMEDOUT &lt;ip&gt;:&lt;port&gt;</td>
236
+ <td class="py-2">Bridge can't reach the backend. <code class="bg-slate-100 px-1 rounded">curl &lt;url&gt;</code> from this host should work.</td>
237
+ </tr>
238
+ <tr class="align-top">
239
+ <td class="py-2 pr-3 font-mono text-xs">HTTP 401 Invalid token</td>
240
+ <td class="py-2">JWT was regenerated on the backend, or the device row was deleted. Re-paste the token.</td>
241
+ </tr>
242
+ <tr class="align-top">
243
+ <td class="py-2 pr-3 font-mono text-xs">Socket closed unexpectedly</td>
244
+ <td class="py-2">ZK device only allows 1 active connection — another tool / cycle is holding it. Wait for the next cycle.</td>
245
+ </tr>
246
+ <tr class="align-top">
247
+ <td class="py-2 pr-3 font-mono text-xs">port open but ZK probe fail</td>
248
+ <td class="py-2">Same — device busy. Add → Connect after a minute.</td>
249
+ </tr>
250
+ <tr class="align-top">
251
+ <td class="py-2 pr-3">Dashboard "never run"</td>
252
+ <td class="py-2">Push URL not set, or no devices configured. Check API + Devices.</td>
253
+ </tr>
254
+ <tr class="align-top">
255
+ <td class="py-2 pr-3">Events arrive late</td>
256
+ <td class="py-2">Lower the poll interval in API settings (min 1 min).</td>
257
+ </tr>
258
+ </tbody>
259
+ </table>
260
+ </section>
261
+
262
+ <footer class="bg-amber-50 border border-amber-200 rounded-lg p-6 text-center">
263
+ <p class="text-sm text-amber-900">
264
+ ZK-Bridge is open-source. If it saves you time, please
265
+ <a href="${layout_1.GITHUB_URL}" target="_blank" rel="noopener" class="font-semibold underline">⭐ star us on GitHub</a>
266
+ — it's the simplest way to support the project.
267
+ </p>
268
+ </footer>
269
+
270
+ </div>`;
271
+ return (0, layout_1.renderLayout)({ title: 'Guide', body, showNav: true, active: 'guide' });
272
+ }
273
+ //# sourceMappingURL=guide-page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guide-page.js","sourceRoot":"","sources":["../../../src/server/ui/guide-page.ts"],"names":[],"mappings":";;AAEA,0CA2QC;AA7QD,qCAA6D;AAE7D,SAAgB,eAAe;IAC7B,MAAM,IAAI,GAAG;;;;;;;;;;;qBAWM,mBAAU;;;;;;;;;2EAS4C,mBAAU;;2EAEV,gBAAO;;2EAEP,mBAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA2OhE,mBAAU;;;;;WAKpB,CAAC;IACV,OAAO,IAAA,qBAAY,EAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;AAChF,CAAC"}
@@ -1,7 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NPM_URL = exports.GITHUB_URL = void 0;
3
4
  exports.escapeHtml = escapeHtml;
4
5
  exports.renderLayout = renderLayout;
6
+ exports.GITHUB_URL = 'https://github.com/nguyendinhphongdx/zkteco-bridge';
7
+ exports.NPM_URL = 'https://www.npmjs.com/package/@hanoilab/zk-bridge';
5
8
  function escapeHtml(value) {
6
9
  if (value === undefined || value === null)
7
10
  return '';
@@ -18,6 +21,18 @@ function navLink(href, label, active) {
18
21
  : 'px-3 py-2 rounded text-slate-700 hover:bg-slate-200 text-sm font-medium';
19
22
  return `<a href="${href}" class="${classes}">${escapeHtml(label)}</a>`;
20
23
  }
24
+ const GITHUB_ICON = `
25
+ <svg viewBox="0 0 24 24" fill="currentColor" class="w-4 h-4">
26
+ <path d="M12 .5C5.65.5.5 5.65.5 12c0 5.08 3.29 9.39 7.86 10.91.58.1.79-.25.79-.56 0-.27-.01-1-.02-1.97-3.2.7-3.87-1.54-3.87-1.54-.52-1.32-1.27-1.67-1.27-1.67-1.04-.71.08-.7.08-.7 1.15.08 1.76 1.18 1.76 1.18 1.02 1.75 2.69 1.24 3.34.95.1-.74.4-1.24.72-1.53-2.55-.29-5.24-1.28-5.24-5.69 0-1.26.45-2.29 1.18-3.1-.12-.29-.51-1.46.11-3.04 0 0 .96-.31 3.16 1.18A11.02 11.02 0 0 1 12 6.8c.97 0 1.95.13 2.86.39 2.2-1.49 3.16-1.18 3.16-1.18.62 1.58.23 2.75.11 3.04.74.81 1.18 1.84 1.18 3.1 0 4.42-2.69 5.39-5.25 5.68.41.36.78 1.06.78 2.13 0 1.54-.01 2.78-.01 3.16 0 .31.21.67.8.55C20.21 21.39 23.5 17.08 23.5 12 23.5 5.65 18.35.5 12 .5z"/>
27
+ </svg>`;
28
+ const NPM_ICON = `
29
+ <svg viewBox="0 0 256 256" fill="currentColor" class="w-4 h-4">
30
+ <path d="M0 256V0h256v256H0Zm222.32-33.682V33.682H33.682v188.636h94.32v-156h62.954v156h31.364Z"/>
31
+ </svg>`;
32
+ const STAR_ICON = `
33
+ <svg viewBox="0 0 24 24" fill="currentColor" class="w-3.5 h-3.5">
34
+ <path d="M12 17.27L18.18 21l-1.64-7.03L22 9.24l-7.19-.61L12 2 9.19 8.63 2 9.24l5.46 4.73L5.82 21z"/>
35
+ </svg>`;
21
36
  function renderLayout(opts) {
22
37
  const nav = opts.showNav
23
38
  ? `
@@ -29,9 +44,22 @@ function renderLayout(opts) {
29
44
  ${navLink('/config/api', 'API', opts.active === 'config-api')}
30
45
  ${navLink('/config/system', 'System', opts.active === 'config-system')}
31
46
  ${navLink('/logs', 'Logs', opts.active === 'logs')}
47
+ ${navLink('/guide', 'Guide', opts.active === 'guide')}
32
48
  <span class="flex-1"></span>
49
+ <a href="${exports.GITHUB_URL}" target="_blank" rel="noopener"
50
+ title="Star us on GitHub — it helps a lot ⭐"
51
+ class="inline-flex items-center gap-1.5 px-2 py-1.5 rounded text-xs font-medium text-slate-700 hover:bg-amber-50 hover:text-amber-700 border border-transparent hover:border-amber-200 transition">
52
+ ${GITHUB_ICON}
53
+ ${STAR_ICON}
54
+ <span>Star</span>
55
+ </a>
56
+ <a href="${exports.NPM_URL}" target="_blank" rel="noopener"
57
+ title="View on npm"
58
+ class="inline-flex items-center px-2 py-1.5 rounded text-xs text-slate-500 hover:bg-slate-100 hover:text-slate-900 transition">
59
+ ${NPM_ICON}
60
+ </a>
33
61
  <form method="post" action="/logout">
34
- <button class="text-sm text-slate-500 hover:text-slate-900">Logout</button>
62
+ <button class="text-sm text-slate-500 hover:text-slate-900 px-2 py-1.5">Logout</button>
35
63
  </form>
36
64
  </div>
37
65
  </nav>`
@@ -1 +1 @@
1
- {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/server/ui/layout.ts"],"names":[],"mappings":";;AAQA,gCAQC;AASD,oCA2CC;AA5DD,SAAgB,UAAU,CAAC,KAAyC;IAClE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACrD,OAAO,MAAM,CAAC,KAAK,CAAC;SACjB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,KAAa,EAAE,MAAe;IAC3D,MAAM,OAAO,GAAG,MAAM;QACpB,CAAC,CAAC,+DAA+D;QACjE,CAAC,CAAC,yEAAyE,CAAC;IAC9E,OAAO,YAAY,IAAI,YAAY,OAAO,KAAK,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;AACzE,CAAC;AAED,SAAgB,YAAY,CAAC,IAAmB;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO;QACtB,CAAC,CAAC;;;;YAIM,OAAO,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;YAC/D,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;YACzD,OAAO,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC;YAC3D,OAAO,CAAC,gBAAgB,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,KAAK,eAAe,CAAC;YACpE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC;;;;;;aAM/C;QACT,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;QACtB,CAAC,CAAC,sCACE,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI;YACtB,CAAC,CAAC,0DAA0D;YAC5D,CAAC,CAAC,iDACN,KAAK,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ;QAC7C,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;;;;SAKA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;;;;EAI7B,GAAG;;EAEH,KAAK;EACL,IAAI,CAAC,IAAI;;;QAGH,CAAC;AACT,CAAC"}
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/server/ui/layout.ts"],"names":[],"mappings":";;;AAkBA,gCAQC;AAwBD,oCAwDC;AA3FY,QAAA,UAAU,GAAG,oDAAoD,CAAC;AAClE,QAAA,OAAO,GAAG,mDAAmD,CAAC;AAE3E,SAAgB,UAAU,CAAC,KAAyC;IAClE,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACrD,OAAO,MAAM,CAAC,KAAK,CAAC;SACjB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,KAAa,EAAE,MAAe;IAC3D,MAAM,OAAO,GAAG,MAAM;QACpB,CAAC,CAAC,+DAA+D;QACjE,CAAC,CAAC,yEAAyE,CAAC;IAC9E,OAAO,YAAY,IAAI,YAAY,OAAO,KAAK,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;AACzE,CAAC;AAED,MAAM,WAAW,GAAG;;;OAGb,CAAC;AAER,MAAM,QAAQ,GAAG;;;OAGV,CAAC;AAER,MAAM,SAAS,GAAG;;;OAGX,CAAC;AAER,SAAgB,YAAY,CAAC,IAAmB;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO;QACtB,CAAC,CAAC;;;;YAIM,OAAO,CAAC,YAAY,EAAE,WAAW,EAAE,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC;YAC/D,OAAO,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC;YACzD,OAAO,CAAC,aAAa,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,KAAK,YAAY,CAAC;YAC3D,OAAO,CAAC,gBAAgB,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,KAAK,eAAe,CAAC;YACpE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC;YAChD,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,KAAK,OAAO,CAAC;;qBAE1C,kBAAU;;;cAGjB,WAAW;cACX,SAAS;;;qBAGF,eAAO;;;cAGd,QAAQ;;;;;;aAMT;QACT,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK;QACtB,CAAC,CAAC,sCACE,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI;YACtB,CAAC,CAAC,0DAA0D;YAC5D,CAAC,CAAC,iDACN,KAAK,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ;QAC7C,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;;;;;SAKA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;;;;EAI7B,GAAG;;EAEH,KAAK;EACL,IAAI,CAAC,IAAI;;;QAGH,CAAC;AACT,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hanoilab/zk-bridge",
3
- "version": "0.1.5",
3
+ "version": "0.1.7",
4
4
  "private": false,
5
5
  "description": "Pull-side bridge for ZKTeco attendance devices — polls over LAN and pushes events to any HTTP backend",
6
6
  "keywords": [