@appkit/llamacpp-cli 1.14.1 → 2.1.0
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 +276 -280
- package/dist/cli.js +133 -23
- package/dist/cli.js.map +1 -1
- package/dist/commands/admin/config.d.ts +1 -1
- package/dist/commands/admin/config.js +5 -5
- package/dist/commands/admin/config.js.map +1 -1
- package/dist/commands/admin/log-config.d.ts +11 -0
- package/dist/commands/admin/log-config.d.ts.map +1 -0
- package/dist/commands/admin/log-config.js +159 -0
- package/dist/commands/admin/log-config.js.map +1 -0
- package/dist/commands/admin/logs.d.ts +2 -3
- package/dist/commands/admin/logs.d.ts.map +1 -1
- package/dist/commands/admin/logs.js +6 -48
- package/dist/commands/admin/logs.js.map +1 -1
- package/dist/commands/admin/status.d.ts.map +1 -1
- package/dist/commands/admin/status.js +1 -0
- package/dist/commands/admin/status.js.map +1 -1
- package/dist/commands/config.d.ts +1 -0
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +63 -196
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/create.d.ts +3 -2
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +24 -97
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/delete.d.ts.map +1 -1
- package/dist/commands/delete.js +7 -24
- package/dist/commands/delete.js.map +1 -1
- package/dist/commands/internal/server-wrapper.d.ts +15 -0
- package/dist/commands/internal/server-wrapper.d.ts.map +1 -0
- package/dist/commands/internal/server-wrapper.js +126 -0
- package/dist/commands/internal/server-wrapper.js.map +1 -0
- package/dist/commands/logs-all.d.ts +0 -2
- package/dist/commands/logs-all.d.ts.map +1 -1
- package/dist/commands/logs-all.js +1 -61
- package/dist/commands/logs-all.js.map +1 -1
- package/dist/commands/logs.d.ts +2 -5
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +104 -120
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/migrate-labels.d.ts +12 -0
- package/dist/commands/migrate-labels.d.ts.map +1 -0
- package/dist/commands/migrate-labels.js +160 -0
- package/dist/commands/migrate-labels.js.map +1 -0
- package/dist/commands/ps.d.ts.map +1 -1
- package/dist/commands/ps.js +2 -1
- package/dist/commands/ps.js.map +1 -1
- package/dist/commands/rm.d.ts.map +1 -1
- package/dist/commands/rm.js +22 -48
- package/dist/commands/rm.js.map +1 -1
- package/dist/commands/router/config.d.ts +1 -1
- package/dist/commands/router/config.js +6 -6
- package/dist/commands/router/config.js.map +1 -1
- package/dist/commands/router/logs.d.ts +2 -4
- package/dist/commands/router/logs.d.ts.map +1 -1
- package/dist/commands/router/logs.js +34 -189
- package/dist/commands/router/logs.js.map +1 -1
- package/dist/commands/router/status.d.ts.map +1 -1
- package/dist/commands/router/status.js +1 -0
- package/dist/commands/router/status.js.map +1 -1
- package/dist/commands/server-show.d.ts.map +1 -1
- package/dist/commands/server-show.js +3 -0
- package/dist/commands/server-show.js.map +1 -1
- package/dist/commands/start.d.ts.map +1 -1
- package/dist/commands/start.js +21 -72
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/stop.d.ts.map +1 -1
- package/dist/commands/stop.js +10 -26
- package/dist/commands/stop.js.map +1 -1
- package/dist/launchers/llamacpp-admin +8 -0
- package/dist/launchers/llamacpp-router +8 -0
- package/dist/launchers/llamacpp-server +8 -0
- package/dist/lib/admin-manager.d.ts +4 -0
- package/dist/lib/admin-manager.d.ts.map +1 -1
- package/dist/lib/admin-manager.js +42 -18
- package/dist/lib/admin-manager.js.map +1 -1
- package/dist/lib/admin-server.d.ts +48 -1
- package/dist/lib/admin-server.d.ts.map +1 -1
- package/dist/lib/admin-server.js +632 -238
- package/dist/lib/admin-server.js.map +1 -1
- package/dist/lib/config-generator.d.ts +1 -0
- package/dist/lib/config-generator.d.ts.map +1 -1
- package/dist/lib/config-generator.js +12 -5
- package/dist/lib/config-generator.js.map +1 -1
- package/dist/lib/keyboard-manager.d.ts +162 -0
- package/dist/lib/keyboard-manager.d.ts.map +1 -0
- package/dist/lib/keyboard-manager.js +247 -0
- package/dist/lib/keyboard-manager.js.map +1 -0
- package/dist/lib/label-migration.d.ts +65 -0
- package/dist/lib/label-migration.d.ts.map +1 -0
- package/dist/lib/label-migration.js +458 -0
- package/dist/lib/label-migration.js.map +1 -0
- package/dist/lib/launchctl-manager.d.ts +9 -0
- package/dist/lib/launchctl-manager.d.ts.map +1 -1
- package/dist/lib/launchctl-manager.js +65 -19
- package/dist/lib/launchctl-manager.js.map +1 -1
- package/dist/lib/log-management-service.d.ts +51 -0
- package/dist/lib/log-management-service.d.ts.map +1 -0
- package/dist/lib/log-management-service.js +124 -0
- package/dist/lib/log-management-service.js.map +1 -0
- package/dist/lib/log-workers.d.ts +70 -0
- package/dist/lib/log-workers.d.ts.map +1 -0
- package/dist/lib/log-workers.js +217 -0
- package/dist/lib/log-workers.js.map +1 -0
- package/dist/lib/model-downloader.d.ts +9 -1
- package/dist/lib/model-downloader.d.ts.map +1 -1
- package/dist/lib/model-downloader.js +98 -1
- package/dist/lib/model-downloader.js.map +1 -1
- package/dist/lib/model-management-service.d.ts +60 -0
- package/dist/lib/model-management-service.d.ts.map +1 -0
- package/dist/lib/model-management-service.js +246 -0
- package/dist/lib/model-management-service.js.map +1 -0
- package/dist/lib/model-management-service.test.d.ts +2 -0
- package/dist/lib/model-management-service.test.d.ts.map +1 -0
- package/dist/lib/model-management-service.test.js.map +1 -0
- package/dist/lib/model-scanner.d.ts +15 -3
- package/dist/lib/model-scanner.d.ts.map +1 -1
- package/dist/lib/model-scanner.js +174 -17
- package/dist/lib/model-scanner.js.map +1 -1
- package/dist/lib/openapi-spec.d.ts +1335 -0
- package/dist/lib/openapi-spec.d.ts.map +1 -0
- package/dist/lib/openapi-spec.js +1017 -0
- package/dist/lib/openapi-spec.js.map +1 -0
- package/dist/lib/router-logger.d.ts +1 -1
- package/dist/lib/router-logger.d.ts.map +1 -1
- package/dist/lib/router-logger.js +13 -11
- package/dist/lib/router-logger.js.map +1 -1
- package/dist/lib/router-manager.d.ts +4 -0
- package/dist/lib/router-manager.d.ts.map +1 -1
- package/dist/lib/router-manager.js +30 -18
- package/dist/lib/router-manager.js.map +1 -1
- package/dist/lib/router-server.d.ts +4 -7
- package/dist/lib/router-server.d.ts.map +1 -1
- package/dist/lib/router-server.js +71 -182
- package/dist/lib/router-server.js.map +1 -1
- package/dist/lib/server-config-service.d.ts +51 -0
- package/dist/lib/server-config-service.d.ts.map +1 -0
- package/dist/lib/server-config-service.js +310 -0
- package/dist/lib/server-config-service.js.map +1 -0
- package/dist/lib/server-config-service.test.d.ts +2 -0
- package/dist/lib/server-config-service.test.d.ts.map +1 -0
- package/dist/lib/server-config-service.test.js.map +1 -0
- package/dist/lib/server-lifecycle-service.d.ts +172 -0
- package/dist/lib/server-lifecycle-service.d.ts.map +1 -0
- package/dist/lib/server-lifecycle-service.js +619 -0
- package/dist/lib/server-lifecycle-service.js.map +1 -0
- package/dist/lib/state-manager.d.ts +18 -1
- package/dist/lib/state-manager.d.ts.map +1 -1
- package/dist/lib/state-manager.js +51 -2
- package/dist/lib/state-manager.js.map +1 -1
- package/dist/lib/status-checker.d.ts +11 -4
- package/dist/lib/status-checker.d.ts.map +1 -1
- package/dist/lib/status-checker.js +34 -1
- package/dist/lib/status-checker.js.map +1 -1
- package/dist/lib/validation-service.d.ts +43 -0
- package/dist/lib/validation-service.d.ts.map +1 -0
- package/dist/lib/validation-service.js +112 -0
- package/dist/lib/validation-service.js.map +1 -0
- package/dist/lib/validation-service.test.d.ts +2 -0
- package/dist/lib/validation-service.test.d.ts.map +1 -0
- package/dist/lib/validation-service.test.js.map +1 -0
- package/dist/scripts/http-log-filter.sh +8 -0
- package/dist/tui/ConfigApp.d.ts.map +1 -1
- package/dist/tui/ConfigApp.js +222 -184
- package/dist/tui/ConfigApp.js.map +1 -1
- package/dist/tui/HistoricalMonitorApp.d.ts.map +1 -1
- package/dist/tui/HistoricalMonitorApp.js +12 -0
- package/dist/tui/HistoricalMonitorApp.js.map +1 -1
- package/dist/tui/ModelsApp.d.ts.map +1 -1
- package/dist/tui/ModelsApp.js +93 -17
- package/dist/tui/ModelsApp.js.map +1 -1
- package/dist/tui/MonitorApp.d.ts.map +1 -1
- package/dist/tui/MonitorApp.js +1 -3
- package/dist/tui/MonitorApp.js.map +1 -1
- package/dist/tui/MultiServerMonitorApp.d.ts +3 -3
- package/dist/tui/MultiServerMonitorApp.d.ts.map +1 -1
- package/dist/tui/MultiServerMonitorApp.js +724 -508
- package/dist/tui/MultiServerMonitorApp.js.map +1 -1
- package/dist/tui/RootNavigator.d.ts.map +1 -1
- package/dist/tui/RootNavigator.js +17 -1
- package/dist/tui/RootNavigator.js.map +1 -1
- package/dist/tui/RouterApp.d.ts +6 -0
- package/dist/tui/RouterApp.d.ts.map +1 -0
- package/dist/tui/RouterApp.js +928 -0
- package/dist/tui/RouterApp.js.map +1 -0
- package/dist/tui/SearchApp.d.ts.map +1 -1
- package/dist/tui/SearchApp.js +27 -6
- package/dist/tui/SearchApp.js.map +1 -1
- package/dist/tui/shared/modal-controller.d.ts +65 -0
- package/dist/tui/shared/modal-controller.d.ts.map +1 -0
- package/dist/tui/shared/modal-controller.js +625 -0
- package/dist/tui/shared/modal-controller.js.map +1 -0
- package/dist/tui/shared/overlay-utils.d.ts +7 -0
- package/dist/tui/shared/overlay-utils.d.ts.map +1 -0
- package/dist/tui/shared/overlay-utils.js +54 -0
- package/dist/tui/shared/overlay-utils.js.map +1 -0
- package/dist/types/admin-config.d.ts +15 -2
- package/dist/types/admin-config.d.ts.map +1 -1
- package/dist/types/model-info.d.ts +5 -0
- package/dist/types/model-info.d.ts.map +1 -1
- package/dist/types/router-config.d.ts +2 -2
- package/dist/types/router-config.d.ts.map +1 -1
- package/dist/types/server-config.d.ts +8 -0
- package/dist/types/server-config.d.ts.map +1 -1
- package/dist/types/server-config.js +25 -0
- package/dist/types/server-config.js.map +1 -1
- package/dist/utils/http-log-filter.d.ts +10 -0
- package/dist/utils/http-log-filter.d.ts.map +1 -0
- package/dist/utils/http-log-filter.js +84 -0
- package/dist/utils/http-log-filter.js.map +1 -0
- package/dist/utils/log-parser.d.ts.map +1 -1
- package/dist/utils/log-parser.js +7 -4
- package/dist/utils/log-parser.js.map +1 -1
- package/dist/utils/log-utils.d.ts +59 -4
- package/dist/utils/log-utils.d.ts.map +1 -1
- package/dist/utils/log-utils.js +150 -11
- package/dist/utils/log-utils.js.map +1 -1
- package/dist/utils/shard-utils.d.ts +72 -0
- package/dist/utils/shard-utils.d.ts.map +1 -0
- package/dist/utils/shard-utils.js +168 -0
- package/dist/utils/shard-utils.js.map +1 -0
- package/package.json +18 -4
- package/src/launchers/llamacpp-admin +8 -0
- package/src/launchers/llamacpp-router +8 -0
- package/src/launchers/llamacpp-server +8 -0
- package/web/dist/assets/index-Byhoy86V.css +1 -0
- package/web/dist/assets/index-HSrgvray.js +50 -0
- package/web/dist/index.html +2 -2
- package/web/dist/assets/index-Bin89Lwr.css +0 -1
- package/web/dist/assets/index-CVmonw3T.js +0 -17
|
@@ -0,0 +1,619 @@
|
|
|
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.serverLifecycleService = exports.ServerLifecycleService = void 0;
|
|
37
|
+
const path = __importStar(require("path"));
|
|
38
|
+
const server_config_1 = require("../types/server-config");
|
|
39
|
+
const launchctl_manager_1 = require("./launchctl-manager");
|
|
40
|
+
const status_checker_1 = require("./status-checker");
|
|
41
|
+
const state_manager_1 = require("./state-manager");
|
|
42
|
+
const model_scanner_1 = require("./model-scanner");
|
|
43
|
+
const config_generator_1 = require("./config-generator");
|
|
44
|
+
const port_manager_1 = require("./port-manager");
|
|
45
|
+
const file_utils_1 = require("../utils/file-utils");
|
|
46
|
+
const log_utils_1 = require("../utils/log-utils");
|
|
47
|
+
const process_utils_1 = require("../utils/process-utils");
|
|
48
|
+
/**
|
|
49
|
+
* Centralized service lifecycle management
|
|
50
|
+
*
|
|
51
|
+
* Handles all server create/start/stop operations with:
|
|
52
|
+
* - Concurrency protection (prevents simultaneous operations on same server)
|
|
53
|
+
* - Consistent behavior across CLI, TUI, and Admin API
|
|
54
|
+
* - Progress callbacks for UI feedback
|
|
55
|
+
* - Automatic plist regeneration
|
|
56
|
+
* - Log rotation
|
|
57
|
+
* - Metal memory detection
|
|
58
|
+
* - Unique ID generation for duplicate models
|
|
59
|
+
*/
|
|
60
|
+
class ServerLifecycleService {
|
|
61
|
+
constructor() {
|
|
62
|
+
// Concurrency protection: tracks in-progress operations
|
|
63
|
+
this.operationsInProgress = new Map();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Create and start a new server with full lifecycle management
|
|
67
|
+
*
|
|
68
|
+
* Steps:
|
|
69
|
+
* 1. Resolve model path and get model info
|
|
70
|
+
* 2. Validate alias if provided
|
|
71
|
+
* 3. Determine port (auto-assign or validate provided port)
|
|
72
|
+
* 4. Generate unique server ID and configuration
|
|
73
|
+
* 5. Create plist file
|
|
74
|
+
* 6. Load and start service
|
|
75
|
+
* 7. Wait for startup
|
|
76
|
+
* 8. Detect Metal memory
|
|
77
|
+
* 9. Save configuration
|
|
78
|
+
*/
|
|
79
|
+
async createServer(model, options = {}) {
|
|
80
|
+
const { onProgress = () => { }, startupTimeoutMs = 5000, metalDetectionDelayMs = 8000, alias, ...serverOptions } = options;
|
|
81
|
+
const totalSteps = 9;
|
|
82
|
+
let currentStep = 0;
|
|
83
|
+
try {
|
|
84
|
+
// Step 1: Resolve model path and get model info
|
|
85
|
+
onProgress('Resolving model path...', ++currentStep, totalSteps);
|
|
86
|
+
const modelPath = await model_scanner_1.modelScanner.resolveModelPath(model);
|
|
87
|
+
if (!modelPath) {
|
|
88
|
+
return {
|
|
89
|
+
success: false,
|
|
90
|
+
server: {},
|
|
91
|
+
error: `Model not found: ${model}`
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const modelInfo = await model_scanner_1.modelScanner.getModelInfo(model);
|
|
95
|
+
if (!modelInfo || !modelInfo.size) {
|
|
96
|
+
return {
|
|
97
|
+
success: false,
|
|
98
|
+
server: {},
|
|
99
|
+
error: 'Failed to read model file'
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
// For sharded models, use base model name; otherwise use filename
|
|
103
|
+
let modelName = path.basename(modelPath);
|
|
104
|
+
if (modelInfo.isSharded && modelInfo.baseModelName) {
|
|
105
|
+
modelName = modelInfo.baseModelName;
|
|
106
|
+
}
|
|
107
|
+
const modelSize = modelInfo.size;
|
|
108
|
+
// Step 2: Validate alias if provided
|
|
109
|
+
if (alias) {
|
|
110
|
+
onProgress('Validating alias...', ++currentStep, totalSteps);
|
|
111
|
+
const validationError = (0, server_config_1.validateAlias)(alias);
|
|
112
|
+
if (validationError) {
|
|
113
|
+
return {
|
|
114
|
+
success: false,
|
|
115
|
+
server: {},
|
|
116
|
+
error: `Invalid alias: ${validationError}`
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
const conflictingServerId = await state_manager_1.stateManager.isAliasAvailable(alias);
|
|
120
|
+
if (conflictingServerId) {
|
|
121
|
+
return {
|
|
122
|
+
success: false,
|
|
123
|
+
server: {},
|
|
124
|
+
error: `Alias "${alias}" is already used by server: ${conflictingServerId}`
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
currentStep++;
|
|
130
|
+
}
|
|
131
|
+
// Step 3: Determine port
|
|
132
|
+
onProgress('Determining port...', ++currentStep, totalSteps);
|
|
133
|
+
let port;
|
|
134
|
+
if (serverOptions.port) {
|
|
135
|
+
port_manager_1.portManager.validatePort(serverOptions.port);
|
|
136
|
+
const available = await port_manager_1.portManager.isPortAvailable(serverOptions.port);
|
|
137
|
+
if (!available) {
|
|
138
|
+
return {
|
|
139
|
+
success: false,
|
|
140
|
+
server: {},
|
|
141
|
+
error: `Port ${serverOptions.port} is already in use`
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
port = serverOptions.port;
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
port = await port_manager_1.portManager.findAvailablePort();
|
|
148
|
+
}
|
|
149
|
+
// Step 4: Generate configuration (with unique ID)
|
|
150
|
+
onProgress('Generating configuration...', ++currentStep, totalSteps);
|
|
151
|
+
const config = await config_generator_1.configGenerator.generateConfig(modelPath, modelName, modelSize, port, { ...serverOptions, alias });
|
|
152
|
+
// Ensure log directory exists
|
|
153
|
+
await (0, file_utils_1.ensureDir)(path.dirname(config.stdoutPath));
|
|
154
|
+
// Step 5: Create plist file
|
|
155
|
+
onProgress('Creating launchctl service...', ++currentStep, totalSteps);
|
|
156
|
+
await launchctl_manager_1.launchctlManager.createPlist(config);
|
|
157
|
+
// Step 6: Load and start service
|
|
158
|
+
try {
|
|
159
|
+
onProgress('Loading service...', ++currentStep, totalSteps);
|
|
160
|
+
await launchctl_manager_1.launchctlManager.loadService(config.plistPath);
|
|
161
|
+
}
|
|
162
|
+
catch (error) {
|
|
163
|
+
// Clean up plist if load fails
|
|
164
|
+
await launchctl_manager_1.launchctlManager.deletePlist(config.plistPath);
|
|
165
|
+
return {
|
|
166
|
+
success: false,
|
|
167
|
+
server: config,
|
|
168
|
+
error: `Failed to load service: ${error.message}`
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
try {
|
|
172
|
+
onProgress('Starting service...', ++currentStep, totalSteps);
|
|
173
|
+
await launchctl_manager_1.launchctlManager.startService(config.label);
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
// Clean up if start fails
|
|
177
|
+
await launchctl_manager_1.launchctlManager.unloadService(config.plistPath);
|
|
178
|
+
await launchctl_manager_1.launchctlManager.deletePlist(config.plistPath);
|
|
179
|
+
return {
|
|
180
|
+
success: false,
|
|
181
|
+
server: config,
|
|
182
|
+
error: `Failed to start service: ${error.message}`
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
// Step 7: Wait for startup
|
|
186
|
+
onProgress('Waiting for server to start...', ++currentStep, totalSteps);
|
|
187
|
+
const started = await launchctl_manager_1.launchctlManager.waitForServiceStart(config.label, startupTimeoutMs);
|
|
188
|
+
if (!started) {
|
|
189
|
+
// Clean up if startup fails
|
|
190
|
+
await launchctl_manager_1.launchctlManager.unloadService(config.plistPath);
|
|
191
|
+
await launchctl_manager_1.launchctlManager.deletePlist(config.plistPath);
|
|
192
|
+
return {
|
|
193
|
+
success: false,
|
|
194
|
+
server: config,
|
|
195
|
+
error: 'Server failed to start'
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
// Update config with running status
|
|
199
|
+
let updatedConfig = await status_checker_1.statusChecker.updateServerStatus(config);
|
|
200
|
+
// Step 8: Detect Metal memory (optional)
|
|
201
|
+
onProgress('Detecting Metal (GPU) memory...', ++currentStep, totalSteps);
|
|
202
|
+
const metalMemoryMB = await this.detectMetalMemory(updatedConfig, metalDetectionDelayMs);
|
|
203
|
+
if (metalMemoryMB) {
|
|
204
|
+
updatedConfig = { ...updatedConfig, metalMemoryMB };
|
|
205
|
+
}
|
|
206
|
+
// Step 9: Save configuration
|
|
207
|
+
onProgress('Saving configuration...', ++currentStep, totalSteps);
|
|
208
|
+
await state_manager_1.stateManager.saveServerConfig(updatedConfig);
|
|
209
|
+
return {
|
|
210
|
+
success: true,
|
|
211
|
+
server: updatedConfig,
|
|
212
|
+
metalMemoryMB
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
return {
|
|
217
|
+
success: false,
|
|
218
|
+
server: {},
|
|
219
|
+
error: error.message
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Start a server with full lifecycle management
|
|
225
|
+
*
|
|
226
|
+
* Steps:
|
|
227
|
+
* 1. Find server and check status
|
|
228
|
+
* 2. Auto-rotate large logs
|
|
229
|
+
* 3. Regenerate plist (ensures latest config/wrapper)
|
|
230
|
+
* 4. Load and start service
|
|
231
|
+
* 5. Wait for startup (process started)
|
|
232
|
+
* 6. Wait for port to be ready
|
|
233
|
+
* 7. Detect Metal memory (if needed)
|
|
234
|
+
* 8. Update status
|
|
235
|
+
*/
|
|
236
|
+
async startServer(identifier, options = {}) {
|
|
237
|
+
const { onProgress = () => { }, maxLogSizeMB = 100, startupTimeoutMs = 5000, portReadyTimeoutMs = 10000, metalDetectionDelayMs = 8000, } = options;
|
|
238
|
+
const TOTAL_STEPS = 8;
|
|
239
|
+
let currentStep = 0;
|
|
240
|
+
const progress = (msg) => onProgress(msg, ++currentStep, TOTAL_STEPS);
|
|
241
|
+
try {
|
|
242
|
+
// Check concurrency
|
|
243
|
+
if (this.operationsInProgress.has(identifier)) {
|
|
244
|
+
const op = this.operationsInProgress.get(identifier);
|
|
245
|
+
throw new Error(`Server is already ${op} - please wait for operation to complete`);
|
|
246
|
+
}
|
|
247
|
+
// Lock this server
|
|
248
|
+
this.operationsInProgress.set(identifier, 'starting');
|
|
249
|
+
try {
|
|
250
|
+
// 1. Find server
|
|
251
|
+
progress('Finding server...');
|
|
252
|
+
const server = await state_manager_1.stateManager.findServer(identifier);
|
|
253
|
+
if (!server) {
|
|
254
|
+
throw new Error(`Server not found: ${identifier}`);
|
|
255
|
+
}
|
|
256
|
+
// 2. Check actual runtime status (not config file status)
|
|
257
|
+
const status = await status_checker_1.statusChecker.checkServer(server);
|
|
258
|
+
const actualStatus = status_checker_1.statusChecker.determineStatus(status, status.portListening);
|
|
259
|
+
if (actualStatus === 'running') {
|
|
260
|
+
// Update config with actual status
|
|
261
|
+
server.status = actualStatus;
|
|
262
|
+
server.pid = status.pid || undefined;
|
|
263
|
+
await state_manager_1.stateManager.updateServerConfig(server.id, {
|
|
264
|
+
status: server.status,
|
|
265
|
+
pid: server.pid,
|
|
266
|
+
});
|
|
267
|
+
return {
|
|
268
|
+
success: false,
|
|
269
|
+
server,
|
|
270
|
+
error: 'Server is already running',
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
// Update server with actual status
|
|
274
|
+
server.status = actualStatus;
|
|
275
|
+
server.pid = status.pid || undefined;
|
|
276
|
+
// 3. Auto-rotate logs
|
|
277
|
+
progress('Checking logs...');
|
|
278
|
+
const rotateResult = await this.autoRotateLogs(server, maxLogSizeMB);
|
|
279
|
+
// 4. Prepare service (regenerate plist, unload, load)
|
|
280
|
+
progress('Preparing service...');
|
|
281
|
+
await this.prepareService(server);
|
|
282
|
+
// 5. Start service
|
|
283
|
+
progress('Starting server...');
|
|
284
|
+
await launchctl_manager_1.launchctlManager.startService(server.label);
|
|
285
|
+
// 6. Wait for startup (process started)
|
|
286
|
+
progress('Waiting for startup...');
|
|
287
|
+
const started = await launchctl_manager_1.launchctlManager.waitForServiceStart(server.label, startupTimeoutMs);
|
|
288
|
+
if (!started) {
|
|
289
|
+
throw new Error('Server failed to start within timeout');
|
|
290
|
+
}
|
|
291
|
+
// 7. Wait for port to be ready (server actually responding)
|
|
292
|
+
if (portReadyTimeoutMs > 0) {
|
|
293
|
+
progress('Waiting for port to be ready...');
|
|
294
|
+
const portReady = await this.waitForPort(server.port, portReadyTimeoutMs);
|
|
295
|
+
if (!portReady) {
|
|
296
|
+
throw new Error('Server started but port not responding. Check logs for errors.');
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
// 8. Update status and detect Metal memory
|
|
300
|
+
progress('Verifying status...');
|
|
301
|
+
let updatedServer = await status_checker_1.statusChecker.updateServerStatus(server);
|
|
302
|
+
// Detect Metal memory if not already captured
|
|
303
|
+
const metalMemoryMB = await this.detectMetalMemory(updatedServer, metalDetectionDelayMs);
|
|
304
|
+
if (metalMemoryMB) {
|
|
305
|
+
updatedServer = { ...updatedServer, metalMemoryMB };
|
|
306
|
+
await state_manager_1.stateManager.saveServerConfig(updatedServer);
|
|
307
|
+
}
|
|
308
|
+
return {
|
|
309
|
+
success: true,
|
|
310
|
+
server: updatedServer,
|
|
311
|
+
metalMemoryMB,
|
|
312
|
+
rotatedLogs: rotateResult.rotated ? rotateResult.files : undefined,
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
finally {
|
|
316
|
+
// Always unlock, even if error
|
|
317
|
+
this.operationsInProgress.delete(identifier);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
// Try to get current server state for error result
|
|
322
|
+
let server = null;
|
|
323
|
+
try {
|
|
324
|
+
server = await state_manager_1.stateManager.findServer(identifier);
|
|
325
|
+
}
|
|
326
|
+
catch {
|
|
327
|
+
// Ignore - will be null
|
|
328
|
+
}
|
|
329
|
+
return {
|
|
330
|
+
success: false,
|
|
331
|
+
server: server,
|
|
332
|
+
error: error.message,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Stop a server with full lifecycle management
|
|
338
|
+
*
|
|
339
|
+
* Steps:
|
|
340
|
+
* 1. Find server and check status
|
|
341
|
+
* 2. Stop service
|
|
342
|
+
* 3. Unload service
|
|
343
|
+
* 4. Wait for shutdown
|
|
344
|
+
* 5. Update status
|
|
345
|
+
*/
|
|
346
|
+
async stopServer(identifier, options = {}) {
|
|
347
|
+
const { onProgress = () => { }, shutdownTimeoutMs = 5000, } = options;
|
|
348
|
+
const TOTAL_STEPS = 5;
|
|
349
|
+
let currentStep = 0;
|
|
350
|
+
const progress = (msg) => onProgress(msg, ++currentStep, TOTAL_STEPS);
|
|
351
|
+
try {
|
|
352
|
+
// Check concurrency
|
|
353
|
+
if (this.operationsInProgress.has(identifier)) {
|
|
354
|
+
const op = this.operationsInProgress.get(identifier);
|
|
355
|
+
throw new Error(`Server is already ${op} - please wait for operation to complete`);
|
|
356
|
+
}
|
|
357
|
+
// Lock this server
|
|
358
|
+
this.operationsInProgress.set(identifier, 'stopping');
|
|
359
|
+
try {
|
|
360
|
+
// 1. Find server
|
|
361
|
+
progress('Finding server...');
|
|
362
|
+
const server = await state_manager_1.stateManager.findServer(identifier);
|
|
363
|
+
if (!server) {
|
|
364
|
+
throw new Error(`Server not found: ${identifier}`);
|
|
365
|
+
}
|
|
366
|
+
// 2. Check actual runtime status (not config file status)
|
|
367
|
+
const status = await status_checker_1.statusChecker.checkServer(server);
|
|
368
|
+
const actualStatus = status_checker_1.statusChecker.determineStatus(status, status.portListening);
|
|
369
|
+
if (actualStatus === 'stopped') {
|
|
370
|
+
// Update config with actual status
|
|
371
|
+
server.status = actualStatus;
|
|
372
|
+
server.pid = undefined;
|
|
373
|
+
await state_manager_1.stateManager.updateServerConfig(server.id, {
|
|
374
|
+
status: server.status,
|
|
375
|
+
pid: undefined,
|
|
376
|
+
lastStopped: new Date().toISOString(),
|
|
377
|
+
});
|
|
378
|
+
return {
|
|
379
|
+
success: false,
|
|
380
|
+
server,
|
|
381
|
+
error: 'Server is already stopped',
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
// Update server with actual status
|
|
385
|
+
server.status = actualStatus;
|
|
386
|
+
server.pid = status.pid || undefined;
|
|
387
|
+
// 3. Stop service
|
|
388
|
+
progress('Stopping server...');
|
|
389
|
+
try {
|
|
390
|
+
await launchctl_manager_1.launchctlManager.stopService(server.label);
|
|
391
|
+
}
|
|
392
|
+
catch (error) {
|
|
393
|
+
// May already be stopped - not fatal
|
|
394
|
+
console.error(`Warning: stop service failed (may already be stopped): ${error.message}`);
|
|
395
|
+
}
|
|
396
|
+
// 4. Unload service
|
|
397
|
+
progress('Unloading service...');
|
|
398
|
+
try {
|
|
399
|
+
await launchctl_manager_1.launchctlManager.unloadService(server.plistPath);
|
|
400
|
+
}
|
|
401
|
+
catch (error) {
|
|
402
|
+
// May already be unloaded - not fatal
|
|
403
|
+
console.error(`Warning: unload service failed (may already be unloaded): ${error.message}`);
|
|
404
|
+
}
|
|
405
|
+
// 5. Wait for shutdown
|
|
406
|
+
progress('Waiting for shutdown...');
|
|
407
|
+
await launchctl_manager_1.launchctlManager.waitForServiceStop(server.label, shutdownTimeoutMs);
|
|
408
|
+
// 6. Update status
|
|
409
|
+
progress('Verifying status...');
|
|
410
|
+
const updatedServer = await status_checker_1.statusChecker.updateServerStatus(server);
|
|
411
|
+
return {
|
|
412
|
+
success: true,
|
|
413
|
+
server: updatedServer,
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
finally {
|
|
417
|
+
// Always unlock
|
|
418
|
+
this.operationsInProgress.delete(identifier);
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
catch (error) {
|
|
422
|
+
// Try to get current server state
|
|
423
|
+
let server = null;
|
|
424
|
+
try {
|
|
425
|
+
server = await state_manager_1.stateManager.findServer(identifier);
|
|
426
|
+
}
|
|
427
|
+
catch {
|
|
428
|
+
// Ignore
|
|
429
|
+
}
|
|
430
|
+
return {
|
|
431
|
+
success: false,
|
|
432
|
+
server: server,
|
|
433
|
+
error: error.message,
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Delete a server with full lifecycle management
|
|
439
|
+
*
|
|
440
|
+
* Steps:
|
|
441
|
+
* 1. Find server
|
|
442
|
+
* 2. Check status
|
|
443
|
+
* 3. Unload service (auto-stops if running)
|
|
444
|
+
* 4. Delete plist file
|
|
445
|
+
* 5. Delete server config
|
|
446
|
+
*/
|
|
447
|
+
async deleteServer(identifier, options = {}) {
|
|
448
|
+
const { onProgress = () => { }, shutdownTimeoutMs = 5000, } = options;
|
|
449
|
+
const TOTAL_STEPS = 5;
|
|
450
|
+
let currentStep = 0;
|
|
451
|
+
const progress = (msg) => onProgress(msg, ++currentStep, TOTAL_STEPS);
|
|
452
|
+
let resolvedId = identifier;
|
|
453
|
+
try {
|
|
454
|
+
// Check concurrency
|
|
455
|
+
if (this.operationsInProgress.has(identifier)) {
|
|
456
|
+
const op = this.operationsInProgress.get(identifier);
|
|
457
|
+
return {
|
|
458
|
+
success: false,
|
|
459
|
+
serverId: identifier,
|
|
460
|
+
error: `Server is already ${op} - please wait for operation to complete`,
|
|
461
|
+
};
|
|
462
|
+
}
|
|
463
|
+
// Lock this server
|
|
464
|
+
this.operationsInProgress.set(identifier, 'deleting');
|
|
465
|
+
try {
|
|
466
|
+
// 1. Find server
|
|
467
|
+
progress('Finding server...');
|
|
468
|
+
const server = await state_manager_1.stateManager.findServer(identifier);
|
|
469
|
+
if (!server) {
|
|
470
|
+
return {
|
|
471
|
+
success: false,
|
|
472
|
+
serverId: identifier,
|
|
473
|
+
error: `Server not found: ${identifier}`,
|
|
474
|
+
};
|
|
475
|
+
}
|
|
476
|
+
resolvedId = server.id;
|
|
477
|
+
// 2. Check actual runtime status
|
|
478
|
+
progress('Checking status...');
|
|
479
|
+
const status = await status_checker_1.statusChecker.checkServer(server);
|
|
480
|
+
const actualStatus = status_checker_1.statusChecker.determineStatus(status, status.portListening);
|
|
481
|
+
// 3. Unload service (stops if running, no-op if already unloaded)
|
|
482
|
+
progress('Stopping service...');
|
|
483
|
+
if (actualStatus === 'running') {
|
|
484
|
+
try {
|
|
485
|
+
await launchctl_manager_1.launchctlManager.unloadService(server.plistPath);
|
|
486
|
+
await launchctl_manager_1.launchctlManager.waitForServiceStop(server.label, shutdownTimeoutMs);
|
|
487
|
+
}
|
|
488
|
+
catch (error) {
|
|
489
|
+
// Non-fatal - continue with deletion
|
|
490
|
+
console.error(`Warning: unload failed (continuing): ${error.message}`);
|
|
491
|
+
}
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
// Try to unload in case service is registered but not running
|
|
495
|
+
try {
|
|
496
|
+
await launchctl_manager_1.launchctlManager.unloadService(server.plistPath);
|
|
497
|
+
}
|
|
498
|
+
catch {
|
|
499
|
+
// Expected if already unloaded
|
|
500
|
+
}
|
|
501
|
+
}
|
|
502
|
+
// 4. Delete plist
|
|
503
|
+
progress('Removing configuration...');
|
|
504
|
+
await launchctl_manager_1.launchctlManager.deletePlist(server.plistPath);
|
|
505
|
+
// 5. Delete server config
|
|
506
|
+
progress('Deleting server record...');
|
|
507
|
+
await state_manager_1.stateManager.deleteServerConfig(server.id);
|
|
508
|
+
return {
|
|
509
|
+
success: true,
|
|
510
|
+
serverId: server.id,
|
|
511
|
+
modelPath: server.modelPath,
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
finally {
|
|
515
|
+
// Always unlock
|
|
516
|
+
this.operationsInProgress.delete(identifier);
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
catch (error) {
|
|
520
|
+
return {
|
|
521
|
+
success: false,
|
|
522
|
+
serverId: resolvedId,
|
|
523
|
+
error: error.message,
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
}
|
|
527
|
+
/**
|
|
528
|
+
* Restart a server (stop then start)
|
|
529
|
+
*/
|
|
530
|
+
async restartServer(identifier, options = {}) {
|
|
531
|
+
// Stop first
|
|
532
|
+
const stopResult = await this.stopServer(identifier, options);
|
|
533
|
+
if (!stopResult.success && stopResult.error !== 'Server is already stopped') {
|
|
534
|
+
return {
|
|
535
|
+
success: false,
|
|
536
|
+
server: stopResult.server,
|
|
537
|
+
error: `Failed to stop: ${stopResult.error}`,
|
|
538
|
+
};
|
|
539
|
+
}
|
|
540
|
+
// Then start
|
|
541
|
+
return this.startServer(identifier, options);
|
|
542
|
+
}
|
|
543
|
+
/**
|
|
544
|
+
* Helper: Auto-rotate logs if they exceed size limit
|
|
545
|
+
*/
|
|
546
|
+
async autoRotateLogs(server, maxLogSizeMB) {
|
|
547
|
+
try {
|
|
548
|
+
return await (0, log_utils_1.autoRotateIfNeeded)(server.stdoutPath, server.stderrPath, maxLogSizeMB);
|
|
549
|
+
}
|
|
550
|
+
catch (error) {
|
|
551
|
+
// Non-fatal - just log and continue
|
|
552
|
+
console.error(`Warning: log rotation failed: ${error.message}`);
|
|
553
|
+
return { rotated: false, files: [] };
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
/**
|
|
557
|
+
* Helper: Prepare service (regenerate plist, unload old, load new)
|
|
558
|
+
*/
|
|
559
|
+
async prepareService(server) {
|
|
560
|
+
// Check if plist needs updating
|
|
561
|
+
const needsUpdate = await launchctl_manager_1.launchctlManager.needsPlistUpdate(server.plistPath);
|
|
562
|
+
if (needsUpdate) {
|
|
563
|
+
// Regenerate plist with latest config
|
|
564
|
+
await launchctl_manager_1.launchctlManager.createPlist(server);
|
|
565
|
+
// Unload old service to pick up new plist
|
|
566
|
+
try {
|
|
567
|
+
await launchctl_manager_1.launchctlManager.unloadService(server.plistPath);
|
|
568
|
+
}
|
|
569
|
+
catch (error) {
|
|
570
|
+
// Expected if not loaded - not an error
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
// Load service (idempotent - safe to call even if already loaded)
|
|
574
|
+
try {
|
|
575
|
+
await launchctl_manager_1.launchctlManager.loadService(server.plistPath);
|
|
576
|
+
}
|
|
577
|
+
catch (error) {
|
|
578
|
+
// Expected if already loaded - not an error
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
/**
|
|
582
|
+
* Helper: Wait for port to be ready (server actually listening)
|
|
583
|
+
*/
|
|
584
|
+
async waitForPort(port, timeoutMs) {
|
|
585
|
+
const startTime = Date.now();
|
|
586
|
+
const pollInterval = 500; // Check every 500ms
|
|
587
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
588
|
+
if (await (0, process_utils_1.isPortInUse)(port)) {
|
|
589
|
+
return true;
|
|
590
|
+
}
|
|
591
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
592
|
+
}
|
|
593
|
+
return false; // Timeout - port never became ready
|
|
594
|
+
}
|
|
595
|
+
/**
|
|
596
|
+
* Helper: Detect Metal (GPU) memory allocation from logs
|
|
597
|
+
*/
|
|
598
|
+
async detectMetalMemory(server, delayMs) {
|
|
599
|
+
// Skip if already captured
|
|
600
|
+
if (server.metalMemoryMB) {
|
|
601
|
+
return undefined;
|
|
602
|
+
}
|
|
603
|
+
// Wait for Metal initialization
|
|
604
|
+
await new Promise(resolve => setTimeout(resolve, delayMs));
|
|
605
|
+
try {
|
|
606
|
+
const result = await (0, file_utils_1.parseMetalMemoryFromLog)(server.stderrPath);
|
|
607
|
+
return result ?? undefined;
|
|
608
|
+
}
|
|
609
|
+
catch (error) {
|
|
610
|
+
// Non-fatal - Metal detection is optional
|
|
611
|
+
console.error(`Warning: Metal memory detection failed: ${error.message}`);
|
|
612
|
+
return undefined;
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
exports.ServerLifecycleService = ServerLifecycleService;
|
|
617
|
+
// Export singleton
|
|
618
|
+
exports.serverLifecycleService = new ServerLifecycleService();
|
|
619
|
+
//# sourceMappingURL=server-lifecycle-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-lifecycle-service.js","sourceRoot":"","sources":["../../src/lib/server-lifecycle-service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAC7B,0DAAqE;AACrE,2DAAuD;AACvD,qDAAiD;AACjD,mDAA+C;AAC/C,mDAA+C;AAC/C,yDAAoE;AACpE,iDAA6C;AAC7C,oDAAyE;AACzE,kDAAwD;AACxD,0DAAqD;AAmGrD;;;;;;;;;;;GAWG;AACH,MAAa,sBAAsB;IAAnC;QACE,wDAAwD;QAChD,yBAAoB,GAAG,IAAI,GAAG,EAAgD,CAAC;IAwoBzF,CAAC;IAtoBC;;;;;;;;;;;;;OAaG;IACH,KAAK,CAAC,YAAY,CAChB,KAAa,EACb,UAAyB,EAAE;QAE3B,MAAM,EACJ,UAAU,GAAG,GAAG,EAAE,GAAE,CAAC,EACrB,gBAAgB,GAAG,IAAI,EACvB,qBAAqB,GAAG,IAAI,EAC5B,KAAK,EACL,GAAG,aAAa,EACjB,GAAG,OAAO,CAAC;QAEZ,MAAM,UAAU,GAAG,CAAC,CAAC;QACrB,IAAI,WAAW,GAAG,CAAC,CAAC;QAEpB,IAAI,CAAC;YACH,gDAAgD;YAChD,UAAU,CAAC,yBAAyB,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YACjE,MAAM,SAAS,GAAG,MAAM,4BAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;YAC7D,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,EAAkB;oBAC1B,KAAK,EAAE,oBAAoB,KAAK,EAAE;iBACnC,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,MAAM,4BAAY,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YACzD,IAAI,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;gBAClC,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,EAAkB;oBAC1B,KAAK,EAAE,2BAA2B;iBACnC,CAAC;YACJ,CAAC;YAED,kEAAkE;YAClE,IAAI,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACzC,IAAI,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;gBACnD,SAAS,GAAG,SAAS,CAAC,aAAa,CAAC;YACtC,CAAC;YAED,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC;YAEjC,qCAAqC;YACrC,IAAI,KAAK,EAAE,CAAC;gBACV,UAAU,CAAC,qBAAqB,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;gBAC7D,MAAM,eAAe,GAAG,IAAA,6BAAa,EAAC,KAAK,CAAC,CAAC;gBAC7C,IAAI,eAAe,EAAE,CAAC;oBACpB,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,EAAkB;wBAC1B,KAAK,EAAE,kBAAkB,eAAe,EAAE;qBAC3C,CAAC;gBACJ,CAAC;gBAED,MAAM,mBAAmB,GAAG,MAAM,4BAAY,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBACvE,IAAI,mBAAmB,EAAE,CAAC;oBACxB,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,EAAkB;wBAC1B,KAAK,EAAE,UAAU,KAAK,gCAAgC,mBAAmB,EAAE;qBAC5E,CAAC;gBACJ,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,WAAW,EAAE,CAAC;YAChB,CAAC;YAED,yBAAyB;YACzB,UAAU,CAAC,qBAAqB,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YAC7D,IAAI,IAAY,CAAC;YACjB,IAAI,aAAa,CAAC,IAAI,EAAE,CAAC;gBACvB,0BAAW,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBAC7C,MAAM,SAAS,GAAG,MAAM,0BAAW,CAAC,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;gBACxE,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,MAAM,EAAE,EAAkB;wBAC1B,KAAK,EAAE,QAAQ,aAAa,CAAC,IAAI,oBAAoB;qBACtD,CAAC;gBACJ,CAAC;gBACD,IAAI,GAAG,aAAa,CAAC,IAAI,CAAC;YAC5B,CAAC;iBAAM,CAAC;gBACN,IAAI,GAAG,MAAM,0BAAW,CAAC,iBAAiB,EAAE,CAAC;YAC/C,CAAC;YAED,kDAAkD;YAClD,UAAU,CAAC,6BAA6B,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YACrE,MAAM,MAAM,GAAG,MAAM,kCAAe,CAAC,cAAc,CACjD,SAAS,EACT,SAAS,EACT,SAAS,EACT,IAAI,EACJ,EAAE,GAAG,aAAa,EAAE,KAAK,EAAE,CAC5B,CAAC;YAEF,8BAA8B;YAC9B,MAAM,IAAA,sBAAS,EAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;YAEjD,4BAA4B;YAC5B,UAAU,CAAC,+BAA+B,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YACvE,MAAM,oCAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAE3C,iCAAiC;YACjC,IAAI,CAAC;gBACH,UAAU,CAAC,oBAAoB,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;gBAC5D,MAAM,oCAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACvD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,+BAA+B;gBAC/B,MAAM,oCAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACrD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,2BAA4B,KAAe,CAAC,OAAO,EAAE;iBAC7D,CAAC;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,UAAU,CAAC,qBAAqB,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;gBAC7D,MAAM,oCAAgB,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACpD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,0BAA0B;gBAC1B,MAAM,oCAAgB,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACvD,MAAM,oCAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACrD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,4BAA6B,KAAe,CAAC,OAAO,EAAE;iBAC9D,CAAC;YACJ,CAAC;YAED,2BAA2B;YAC3B,UAAU,CAAC,gCAAgC,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YACxE,MAAM,OAAO,GAAG,MAAM,oCAAgB,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;YAC3F,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,4BAA4B;gBAC5B,MAAM,oCAAgB,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACvD,MAAM,oCAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACrD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,MAAM;oBACd,KAAK,EAAE,wBAAwB;iBAChC,CAAC;YACJ,CAAC;YAED,oCAAoC;YACpC,IAAI,aAAa,GAAG,MAAM,8BAAa,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;YAEnE,yCAAyC;YACzC,UAAU,CAAC,iCAAiC,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YACzE,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,qBAAqB,CAAC,CAAC;YACzF,IAAI,aAAa,EAAE,CAAC;gBAClB,aAAa,GAAG,EAAE,GAAG,aAAa,EAAE,aAAa,EAAE,CAAC;YACtD,CAAC;YAED,6BAA6B;YAC7B,UAAU,CAAC,yBAAyB,EAAE,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;YACjE,MAAM,4BAAY,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;YAEnD,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,aAAa;gBACrB,aAAa;aACd,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,EAAkB;gBAC1B,KAAK,EAAG,KAAe,CAAC,OAAO;aAChC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;;;;;;OAYG;IACH,KAAK,CAAC,WAAW,CACf,UAAkB,EAClB,UAAwB,EAAE;QAE1B,MAAM,EACJ,UAAU,GAAG,GAAG,EAAE,GAAE,CAAC,EACrB,YAAY,GAAG,GAAG,EAClB,gBAAgB,GAAG,IAAI,EACvB,kBAAkB,GAAG,KAAK,EAC1B,qBAAqB,GAAG,IAAI,GAC7B,GAAG,OAAO,CAAC;QAEZ,MAAM,WAAW,GAAG,CAAC,CAAC;QACtB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAE9E,IAAI,CAAC;YACH,oBAAoB;YACpB,IAAI,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,0CAA0C,CAAC,CAAC;YACrF,CAAC;YAED,mBAAmB;YACnB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAEtD,IAAI,CAAC;gBACH,iBAAiB;gBACjB,QAAQ,CAAC,mBAAmB,CAAC,CAAC;gBAC9B,MAAM,MAAM,GAAG,MAAM,4BAAY,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gBACzD,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;gBACrD,CAAC;gBAED,0DAA0D;gBAC1D,MAAM,MAAM,GAAG,MAAM,8BAAa,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBACvD,MAAM,YAAY,GAAG,8BAAa,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;gBAEjF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/B,mCAAmC;oBACnC,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC;oBAC7B,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC;oBACrC,MAAM,4BAAY,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE;wBAC/C,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,GAAG,EAAE,MAAM,CAAC,GAAG;qBAChB,CAAC,CAAC;oBAEH,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,MAAM;wBACN,KAAK,EAAE,2BAA2B;qBACnC,CAAC;gBACJ,CAAC;gBAED,mCAAmC;gBACnC,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC;gBAC7B,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC;gBAErC,sBAAsB;gBACtB,QAAQ,CAAC,kBAAkB,CAAC,CAAC;gBAC7B,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;gBAErE,sDAAsD;gBACtD,QAAQ,CAAC,sBAAsB,CAAC,CAAC;gBACjC,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBAElC,mBAAmB;gBACnB,QAAQ,CAAC,oBAAoB,CAAC,CAAC;gBAC/B,MAAM,oCAAgB,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAElD,wCAAwC;gBACxC,QAAQ,CAAC,wBAAwB,CAAC,CAAC;gBACnC,MAAM,OAAO,GAAG,MAAM,oCAAgB,CAAC,mBAAmB,CAAC,MAAM,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC;gBAE3F,IAAI,CAAC,OAAO,EAAE,CAAC;oBACb,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;gBAC3D,CAAC;gBAED,4DAA4D;gBAC5D,IAAI,kBAAkB,GAAG,CAAC,EAAE,CAAC;oBAC3B,QAAQ,CAAC,iCAAiC,CAAC,CAAC;oBAC5C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;oBAC1E,IAAI,CAAC,SAAS,EAAE,CAAC;wBACf,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;oBACpF,CAAC;gBACH,CAAC;gBAED,2CAA2C;gBAC3C,QAAQ,CAAC,qBAAqB,CAAC,CAAC;gBAChC,IAAI,aAAa,GAAG,MAAM,8BAAa,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAEnE,8CAA8C;gBAC9C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,aAAa,EAAE,qBAAqB,CAAC,CAAC;gBACzF,IAAI,aAAa,EAAE,CAAC;oBAClB,aAAa,GAAG,EAAE,GAAG,aAAa,EAAE,aAAa,EAAE,CAAC;oBACpD,MAAM,4BAAY,CAAC,gBAAgB,CAAC,aAAa,CAAC,CAAC;gBACrD,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,aAAa;oBACrB,aAAa;oBACb,WAAW,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;iBACnE,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,+BAA+B;gBAC/B,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,mDAAmD;YACnD,IAAI,MAAM,GAAwB,IAAI,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,4BAAY,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,MAAO;gBACf,KAAK,EAAG,KAAe,CAAC,OAAO;aAChC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,UAAU,CACd,UAAkB,EAClB,UAAuB,EAAE;QAEzB,MAAM,EACJ,UAAU,GAAG,GAAG,EAAE,GAAE,CAAC,EACrB,iBAAiB,GAAG,IAAI,GACzB,GAAG,OAAO,CAAC;QAEZ,MAAM,WAAW,GAAG,CAAC,CAAC;QACtB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAE9E,IAAI,CAAC;YACH,oBAAoB;YACpB,IAAI,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,0CAA0C,CAAC,CAAC;YACrF,CAAC;YAED,mBAAmB;YACnB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAEtD,IAAI,CAAC;gBACH,iBAAiB;gBACjB,QAAQ,CAAC,mBAAmB,CAAC,CAAC;gBAC9B,MAAM,MAAM,GAAG,MAAM,4BAAY,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gBACzD,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,MAAM,IAAI,KAAK,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;gBACrD,CAAC;gBAED,0DAA0D;gBAC1D,MAAM,MAAM,GAAG,MAAM,8BAAa,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBACvD,MAAM,YAAY,GAAG,8BAAa,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;gBAEjF,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/B,mCAAmC;oBACnC,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC;oBAC7B,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC;oBACvB,MAAM,4BAAY,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,EAAE;wBAC/C,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,GAAG,EAAE,SAAS;wBACd,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;qBACtC,CAAC,CAAC;oBAEH,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,MAAM;wBACN,KAAK,EAAE,2BAA2B;qBACnC,CAAC;gBACJ,CAAC;gBAED,mCAAmC;gBACnC,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC;gBAC7B,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC;gBAErC,kBAAkB;gBAClB,QAAQ,CAAC,oBAAoB,CAAC,CAAC;gBAC/B,IAAI,CAAC;oBACH,MAAM,oCAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACnD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,qCAAqC;oBACrC,OAAO,CAAC,KAAK,CAAC,0DAA2D,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;gBACtG,CAAC;gBAED,oBAAoB;gBACpB,QAAQ,CAAC,sBAAsB,CAAC,CAAC;gBACjC,IAAI,CAAC;oBACH,MAAM,oCAAgB,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACzD,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,sCAAsC;oBACtC,OAAO,CAAC,KAAK,CAAC,6DAA8D,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzG,CAAC;gBAED,uBAAuB;gBACvB,QAAQ,CAAC,yBAAyB,CAAC,CAAC;gBACpC,MAAM,oCAAgB,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;gBAE3E,mBAAmB;gBACnB,QAAQ,CAAC,qBAAqB,CAAC,CAAC;gBAChC,MAAM,aAAa,GAAG,MAAM,8BAAa,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;gBAErE,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,aAAa;iBACtB,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,gBAAgB;gBAChB,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kCAAkC;YAClC,IAAI,MAAM,GAAwB,IAAI,CAAC;YACvC,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,4BAAY,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,SAAS;YACX,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,MAAO;gBACf,KAAK,EAAG,KAAe,CAAC,OAAO;aAChC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,YAAY,CAChB,UAAkB,EAClB,UAAyB,EAAE;QAE3B,MAAM,EACJ,UAAU,GAAG,GAAG,EAAE,GAAE,CAAC,EACrB,iBAAiB,GAAG,IAAI,GACzB,GAAG,OAAO,CAAC;QAEZ,MAAM,WAAW,GAAG,CAAC,CAAC;QACtB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QAE9E,IAAI,UAAU,GAAG,UAAU,CAAC;QAE5B,IAAI,CAAC;YACH,oBAAoB;YACpB,IAAI,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9C,MAAM,EAAE,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACrD,OAAO;oBACL,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,UAAU;oBACpB,KAAK,EAAE,qBAAqB,EAAE,0CAA0C;iBACzE,CAAC;YACJ,CAAC;YAED,mBAAmB;YACnB,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAEtD,IAAI,CAAC;gBACH,iBAAiB;gBACjB,QAAQ,CAAC,mBAAmB,CAAC,CAAC;gBAC9B,MAAM,MAAM,GAAG,MAAM,4BAAY,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gBACzD,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO;wBACL,OAAO,EAAE,KAAK;wBACd,QAAQ,EAAE,UAAU;wBACpB,KAAK,EAAE,qBAAqB,UAAU,EAAE;qBACzC,CAAC;gBACJ,CAAC;gBACD,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC;gBAEvB,iCAAiC;gBACjC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;gBAC/B,MAAM,MAAM,GAAG,MAAM,8BAAa,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;gBACvD,MAAM,YAAY,GAAG,8BAAa,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;gBAEjF,kEAAkE;gBAClE,QAAQ,CAAC,qBAAqB,CAAC,CAAC;gBAChC,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;oBAC/B,IAAI,CAAC;wBACH,MAAM,oCAAgB,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;wBACvD,MAAM,oCAAgB,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC;oBAC7E,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,qCAAqC;wBACrC,OAAO,CAAC,KAAK,CAAC,wCAAyC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;oBACpF,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,8DAA8D;oBAC9D,IAAI,CAAC;wBACH,MAAM,oCAAgB,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;oBACzD,CAAC;oBAAC,MAAM,CAAC;wBACP,+BAA+B;oBACjC,CAAC;gBACH,CAAC;gBAED,kBAAkB;gBAClB,QAAQ,CAAC,2BAA2B,CAAC,CAAC;gBACtC,MAAM,oCAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBAErD,0BAA0B;gBAC1B,QAAQ,CAAC,2BAA2B,CAAC,CAAC;gBACtC,MAAM,4BAAY,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAEjD,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,MAAM,CAAC,EAAE;oBACnB,SAAS,EAAE,MAAM,CAAC,SAAS;iBAC5B,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,gBAAgB;gBAChB,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,UAAU;gBACpB,KAAK,EAAG,KAAe,CAAC,OAAO;aAChC,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CACjB,UAAkB,EAClB,UAAsC,EAAE;QAExC,aAAa;QACb,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,KAAK,KAAK,2BAA2B,EAAE,CAAC;YAC5E,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,KAAK,EAAE,mBAAmB,UAAU,CAAC,KAAK,EAAE;aAC7C,CAAC;QACJ,CAAC;QAED,aAAa;QACb,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAAC,MAAoB,EAAE,YAAoB;QACrE,IAAI,CAAC;YACH,OAAO,MAAM,IAAA,8BAAkB,EAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACtF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,oCAAoC;YACpC,OAAO,CAAC,KAAK,CAAC,iCAAkC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YAC3E,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;QACvC,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAAC,MAAoB;QAC/C,gCAAgC;QAChC,MAAM,WAAW,GAAG,MAAM,oCAAgB,CAAC,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAE9E,IAAI,WAAW,EAAE,CAAC;YAChB,sCAAsC;YACtC,MAAM,oCAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAE3C,0CAA0C;YAC1C,IAAI,CAAC;gBACH,MAAM,oCAAgB,CAAC,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACzD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,wCAAwC;YAC1C,CAAC;QACH,CAAC;QAED,kEAAkE;QAClE,IAAI,CAAC;YACH,MAAM,oCAAgB,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4CAA4C;QAC9C,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,SAAiB;QACvD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,GAAG,CAAC,CAAC,oBAAoB;QAE9C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,SAAS,EAAE,CAAC;YAC1C,IAAI,MAAM,IAAA,2BAAW,EAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,KAAK,CAAC,CAAC,oCAAoC;IACpD,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,iBAAiB,CAC7B,MAAoB,EACpB,OAAe;QAEf,2BAA2B;QAC3B,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,gCAAgC;QAChC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAE3D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAA,oCAAuB,EAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAChE,OAAO,MAAM,IAAI,SAAS,CAAC;QAC7B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0CAA0C;YAC1C,OAAO,CAAC,KAAK,CAAC,2CAA4C,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YACrF,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AA1oBD,wDA0oBC;AAED,mBAAmB;AACN,QAAA,sBAAsB,GAAG,IAAI,sBAAsB,EAAE,CAAC"}
|