@minecraft-docker/mcctl 1.6.0 → 1.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/application/index.d.ts +2 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +5 -0
- package/dist/application/index.js.map +1 -0
- package/dist/commands/backup.d.ts +16 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +182 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/ban.d.ts +14 -0
- package/dist/commands/ban.d.ts.map +1 -0
- package/dist/commands/ban.js +418 -0
- package/dist/commands/ban.js.map +1 -0
- package/dist/commands/config.d.ts +18 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +106 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/console/api.d.ts +19 -0
- package/dist/commands/console/api.d.ts.map +1 -0
- package/dist/commands/console/api.js +399 -0
- package/dist/commands/console/api.js.map +1 -0
- package/dist/commands/console/index.d.ts +10 -0
- package/dist/commands/console/index.d.ts.map +1 -0
- package/dist/commands/console/index.js +12 -0
- package/dist/commands/console/index.js.map +1 -0
- package/dist/commands/console/init.d.ts +47 -0
- package/dist/commands/console/init.d.ts.map +1 -0
- package/dist/commands/console/init.js +491 -0
- package/dist/commands/console/init.js.map +1 -0
- package/dist/commands/console/remove.d.ts +25 -0
- package/dist/commands/console/remove.d.ts.map +1 -0
- package/dist/commands/console/remove.js +189 -0
- package/dist/commands/console/remove.js.map +1 -0
- package/dist/commands/console/service.d.ts +40 -0
- package/dist/commands/console/service.d.ts.map +1 -0
- package/dist/commands/console/service.js +321 -0
- package/dist/commands/console/service.js.map +1 -0
- package/dist/commands/console/user.d.ts +17 -0
- package/dist/commands/console/user.d.ts.map +1 -0
- package/dist/commands/console/user.js +431 -0
- package/dist/commands/console/user.js.map +1 -0
- package/dist/commands/create.d.ts +22 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +86 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/delete.d.ts +17 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +74 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/exec.d.ts +10 -0
- package/dist/commands/exec.d.ts.map +1 -0
- package/dist/commands/exec.js +29 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/index.d.ts +21 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +23 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/init.d.ts +9 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +218 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/kick.d.ts +12 -0
- package/dist/commands/kick.d.ts.map +1 -0
- package/dist/commands/kick.js +71 -0
- package/dist/commands/kick.js.map +1 -0
- package/dist/commands/migrate.d.ts +18 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +470 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/mod.d.ts +19 -0
- package/dist/commands/mod.d.ts.map +1 -0
- package/dist/commands/mod.js +441 -0
- package/dist/commands/mod.js.map +1 -0
- package/dist/commands/msg.d.ts +12 -0
- package/dist/commands/msg.d.ts.map +1 -0
- package/dist/commands/msg.js +273 -0
- package/dist/commands/msg.js.map +1 -0
- package/dist/commands/op.d.ts +12 -0
- package/dist/commands/op.d.ts.map +1 -0
- package/dist/commands/op.js +220 -0
- package/dist/commands/op.js.map +1 -0
- package/dist/commands/player-online.d.ts +11 -0
- package/dist/commands/player-online.d.ts.map +1 -0
- package/dist/commands/player-online.js +153 -0
- package/dist/commands/player-online.js.map +1 -0
- package/dist/commands/player.d.ts +18 -0
- package/dist/commands/player.d.ts.map +1 -0
- package/dist/commands/player.js +352 -0
- package/dist/commands/player.js.map +1 -0
- package/dist/commands/server-backup.d.ts +36 -0
- package/dist/commands/server-backup.d.ts.map +1 -0
- package/dist/commands/server-backup.js +320 -0
- package/dist/commands/server-backup.js.map +1 -0
- package/dist/commands/server-restore.d.ts +13 -0
- package/dist/commands/server-restore.d.ts.map +1 -0
- package/dist/commands/server-restore.js +294 -0
- package/dist/commands/server-restore.js.map +1 -0
- package/dist/commands/status.d.ts +13 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +325 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/whitelist.d.ts +12 -0
- package/dist/commands/whitelist.d.ts.map +1 -0
- package/dist/commands/whitelist.js +316 -0
- package/dist/commands/whitelist.js.map +1 -0
- package/dist/commands/world.d.ts +18 -0
- package/dist/commands/world.d.ts.map +1 -0
- package/dist/commands/world.js +238 -0
- package/dist/commands/world.js.map +1 -0
- package/dist/domain/index.d.ts +2 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +7 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +766 -0
- package/dist/index.js.map +1 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts +30 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.js +430 -0
- package/dist/infrastructure/adapters/ClackPromptAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.d.ts +78 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.d.ts.map +1 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.js +391 -0
- package/dist/infrastructure/adapters/Pm2ServiceManagerAdapter.js.map +1 -0
- package/dist/infrastructure/adapters/index.d.ts +4 -0
- package/dist/infrastructure/adapters/index.d.ts.map +1 -0
- package/dist/infrastructure/adapters/index.js +6 -0
- package/dist/infrastructure/adapters/index.js.map +1 -0
- package/dist/infrastructure/di/container.d.ts +47 -0
- package/dist/infrastructure/di/container.d.ts.map +1 -0
- package/dist/infrastructure/di/container.js +140 -0
- package/dist/infrastructure/di/container.js.map +1 -0
- package/dist/infrastructure/di/index.d.ts +2 -0
- package/dist/infrastructure/di/index.d.ts.map +1 -0
- package/dist/infrastructure/di/index.js +2 -0
- package/dist/infrastructure/di/index.js.map +1 -0
- package/dist/infrastructure/index.d.ts +5 -0
- package/dist/infrastructure/index.d.ts.map +1 -0
- package/dist/infrastructure/index.js +8 -0
- package/dist/infrastructure/index.js.map +1 -0
- package/dist/lib/admin-config.d.ts +66 -0
- package/dist/lib/admin-config.d.ts.map +1 -0
- package/dist/lib/admin-config.js +130 -0
- package/dist/lib/admin-config.js.map +1 -0
- package/dist/lib/mojang-api.d.ts +51 -0
- package/dist/lib/mojang-api.d.ts.map +1 -0
- package/dist/lib/mojang-api.js +136 -0
- package/dist/lib/mojang-api.js.map +1 -0
- package/dist/lib/player-cache.d.ts +79 -0
- package/dist/lib/player-cache.d.ts.map +1 -0
- package/dist/lib/player-cache.js +302 -0
- package/dist/lib/player-cache.js.map +1 -0
- package/dist/lib/player-json.d.ts +69 -0
- package/dist/lib/player-json.d.ts.map +1 -0
- package/dist/lib/player-json.js +96 -0
- package/dist/lib/player-json.js.map +1 -0
- package/dist/lib/pm2-utils.d.ts +71 -0
- package/dist/lib/pm2-utils.d.ts.map +1 -0
- package/dist/lib/pm2-utils.js +155 -0
- package/dist/lib/pm2-utils.js.map +1 -0
- package/dist/lib/prompts/action-select.d.ts +23 -0
- package/dist/lib/prompts/action-select.d.ts.map +1 -0
- package/dist/lib/prompts/action-select.js +124 -0
- package/dist/lib/prompts/action-select.js.map +1 -0
- package/dist/lib/prompts/index.d.ts +7 -0
- package/dist/lib/prompts/index.d.ts.map +1 -0
- package/dist/lib/prompts/index.js +7 -0
- package/dist/lib/prompts/index.js.map +1 -0
- package/dist/lib/prompts/ip-select.d.ts +25 -0
- package/dist/lib/prompts/ip-select.d.ts.map +1 -0
- package/dist/lib/prompts/ip-select.js +255 -0
- package/dist/lib/prompts/ip-select.js.map +1 -0
- package/dist/lib/prompts/player-select.d.ts +25 -0
- package/dist/lib/prompts/player-select.d.ts.map +1 -0
- package/dist/lib/prompts/player-select.js +122 -0
- package/dist/lib/prompts/player-select.js.map +1 -0
- package/dist/lib/prompts/server-select.d.ts +26 -0
- package/dist/lib/prompts/server-select.d.ts.map +1 -0
- package/dist/lib/prompts/server-select.js +99 -0
- package/dist/lib/prompts/server-select.js.map +1 -0
- package/dist/lib/rcon.d.ts +53 -0
- package/dist/lib/rcon.d.ts.map +1 -0
- package/dist/lib/rcon.js +131 -0
- package/dist/lib/rcon.js.map +1 -0
- package/dist/lib/shell.d.ts +111 -0
- package/dist/lib/shell.d.ts.map +1 -0
- package/dist/lib/shell.js +321 -0
- package/dist/lib/shell.js.map +1 -0
- package/dist/lib/sudo-utils.d.ts +14 -0
- package/dist/lib/sudo-utils.d.ts.map +1 -0
- package/dist/lib/sudo-utils.js +53 -0
- package/dist/lib/sudo-utils.js.map +1 -0
- package/package.json +8 -2
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Access Mode
|
|
3
|
+
* Determines how the Admin API can be accessed
|
|
4
|
+
*/
|
|
5
|
+
export type ApiAccessMode = 'internal' | 'api-key' | 'ip-whitelist' | 'api-key-ip' | 'open';
|
|
6
|
+
/**
|
|
7
|
+
* Admin Configuration structure stored in YAML
|
|
8
|
+
*/
|
|
9
|
+
export interface AdminConfig {
|
|
10
|
+
version: string;
|
|
11
|
+
api: {
|
|
12
|
+
access_mode: ApiAccessMode;
|
|
13
|
+
port: number;
|
|
14
|
+
api_key: string | null;
|
|
15
|
+
allowed_ips: string[];
|
|
16
|
+
};
|
|
17
|
+
console: {
|
|
18
|
+
enabled: boolean;
|
|
19
|
+
port: number;
|
|
20
|
+
};
|
|
21
|
+
initialized_at: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* AdminConfigManager
|
|
25
|
+
* Manages .mcctl-admin.yml configuration file
|
|
26
|
+
*/
|
|
27
|
+
export declare class AdminConfigManager {
|
|
28
|
+
private readonly configPath;
|
|
29
|
+
constructor(rootDir?: string);
|
|
30
|
+
/**
|
|
31
|
+
* Get the configuration file path
|
|
32
|
+
*/
|
|
33
|
+
get path(): string;
|
|
34
|
+
/**
|
|
35
|
+
* Check if admin service is already initialized
|
|
36
|
+
*/
|
|
37
|
+
isInitialized(): boolean;
|
|
38
|
+
/**
|
|
39
|
+
* Load existing configuration
|
|
40
|
+
*/
|
|
41
|
+
load(): Promise<AdminConfig | null>;
|
|
42
|
+
/**
|
|
43
|
+
* Save configuration to file
|
|
44
|
+
*/
|
|
45
|
+
save(config: AdminConfig): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Create a new configuration with specified options
|
|
48
|
+
*/
|
|
49
|
+
create(options: {
|
|
50
|
+
accessMode: ApiAccessMode;
|
|
51
|
+
apiKey?: string | null;
|
|
52
|
+
allowedIps?: string[];
|
|
53
|
+
apiPort?: number;
|
|
54
|
+
consolePort?: number;
|
|
55
|
+
consoleEnabled?: boolean;
|
|
56
|
+
}): Promise<AdminConfig>;
|
|
57
|
+
/**
|
|
58
|
+
* Generate a new API key with mctk_ prefix
|
|
59
|
+
*/
|
|
60
|
+
static generateApiKey(): string;
|
|
61
|
+
/**
|
|
62
|
+
* Validate an API key format
|
|
63
|
+
*/
|
|
64
|
+
static isValidApiKey(key: string): boolean;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=admin-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-config.d.ts","sourceRoot":"","sources":["../../src/lib/admin-config.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,MAAM,MAAM,aAAa,GACrB,UAAU,GACV,SAAS,GACT,cAAc,GACd,YAAY,GACZ,MAAM,CAAC;AAEX;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE;QACH,WAAW,EAAE,aAAa,CAAC;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,WAAW,EAAE,MAAM,EAAE,CAAC;KACvB,CAAC;IACF,OAAO,EAAE;QACP,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,cAAc,EAAE,MAAM,CAAC;CACxB;AAoBD;;;GAGG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,OAAO,CAAC,EAAE,MAAM;IAK5B;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAazC;;OAEG;IACG,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B9C;;OAEG;IACG,MAAM,CAAC,OAAO,EAAE;QACpB,UAAU,EAAE,aAAa,CAAC;QAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,cAAc,CAAC,EAAE,OAAO,CAAC;KAC1B,GAAG,OAAO,CAAC,WAAW,CAAC;IAoBxB;;OAEG;IACH,MAAM,CAAC,cAAc,IAAI,MAAM;IAS/B;;OAEG;IACH,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;CAG3C"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { dirname, join } from 'node:path';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import * as yaml from 'js-yaml';
|
|
5
|
+
import { randomBytes } from 'node:crypto';
|
|
6
|
+
import { Paths } from '@minecraft-docker/shared';
|
|
7
|
+
/**
|
|
8
|
+
* Default configuration values
|
|
9
|
+
*/
|
|
10
|
+
const DEFAULT_CONFIG = {
|
|
11
|
+
version: '1.0',
|
|
12
|
+
api: {
|
|
13
|
+
access_mode: 'internal',
|
|
14
|
+
port: 3001,
|
|
15
|
+
api_key: null,
|
|
16
|
+
allowed_ips: [],
|
|
17
|
+
},
|
|
18
|
+
console: {
|
|
19
|
+
enabled: true,
|
|
20
|
+
port: 3000,
|
|
21
|
+
},
|
|
22
|
+
initialized_at: new Date().toISOString(),
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* AdminConfigManager
|
|
26
|
+
* Manages .mcctl-admin.yml configuration file
|
|
27
|
+
*/
|
|
28
|
+
export class AdminConfigManager {
|
|
29
|
+
configPath;
|
|
30
|
+
constructor(rootDir) {
|
|
31
|
+
const paths = new Paths(rootDir);
|
|
32
|
+
this.configPath = join(paths.root, '.mcctl-admin.yml');
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get the configuration file path
|
|
36
|
+
*/
|
|
37
|
+
get path() {
|
|
38
|
+
return this.configPath;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Check if admin service is already initialized
|
|
42
|
+
*/
|
|
43
|
+
isInitialized() {
|
|
44
|
+
return existsSync(this.configPath);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Load existing configuration
|
|
48
|
+
*/
|
|
49
|
+
async load() {
|
|
50
|
+
if (!this.isInitialized()) {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
try {
|
|
54
|
+
const content = await readFile(this.configPath, 'utf-8');
|
|
55
|
+
return yaml.load(content);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Save configuration to file
|
|
63
|
+
*/
|
|
64
|
+
async save(config) {
|
|
65
|
+
// Ensure directory exists
|
|
66
|
+
const dir = dirname(this.configPath);
|
|
67
|
+
if (!existsSync(dir)) {
|
|
68
|
+
await mkdir(dir, { recursive: true });
|
|
69
|
+
}
|
|
70
|
+
const yamlContent = yaml.dump(config, {
|
|
71
|
+
indent: 2,
|
|
72
|
+
lineWidth: -1,
|
|
73
|
+
quotingType: '"',
|
|
74
|
+
forceQuotes: false,
|
|
75
|
+
});
|
|
76
|
+
// Add header comment
|
|
77
|
+
const header = `# mcctl Admin Service Configuration
|
|
78
|
+
# Generated by: mcctl admin init
|
|
79
|
+
# Do not edit this file manually unless you know what you are doing.
|
|
80
|
+
#
|
|
81
|
+
# API Access Modes:
|
|
82
|
+
# internal - Docker network only (default, most secure)
|
|
83
|
+
# api-key - External access with API key
|
|
84
|
+
# ip-whitelist - IP-based access control
|
|
85
|
+
# api-key-ip - Requires both API key and IP match
|
|
86
|
+
# open - No authentication (development only, NOT for production)
|
|
87
|
+
#
|
|
88
|
+
`;
|
|
89
|
+
await writeFile(this.configPath, header + yamlContent, 'utf-8');
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Create a new configuration with specified options
|
|
93
|
+
*/
|
|
94
|
+
async create(options) {
|
|
95
|
+
const config = {
|
|
96
|
+
...DEFAULT_CONFIG,
|
|
97
|
+
api: {
|
|
98
|
+
access_mode: options.accessMode,
|
|
99
|
+
port: options.apiPort ?? DEFAULT_CONFIG.api.port,
|
|
100
|
+
api_key: options.apiKey ?? null,
|
|
101
|
+
allowed_ips: options.allowedIps ?? [],
|
|
102
|
+
},
|
|
103
|
+
console: {
|
|
104
|
+
enabled: options.consoleEnabled ?? DEFAULT_CONFIG.console.enabled,
|
|
105
|
+
port: options.consolePort ?? DEFAULT_CONFIG.console.port,
|
|
106
|
+
},
|
|
107
|
+
initialized_at: new Date().toISOString(),
|
|
108
|
+
};
|
|
109
|
+
await this.save(config);
|
|
110
|
+
return config;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Generate a new API key with mctk_ prefix
|
|
114
|
+
*/
|
|
115
|
+
static generateApiKey() {
|
|
116
|
+
// Generate 32 bytes of random data and encode as base64url
|
|
117
|
+
const randomPart = randomBytes(32)
|
|
118
|
+
.toString('base64url')
|
|
119
|
+
.replace(/[^a-zA-Z0-9]/g, '')
|
|
120
|
+
.substring(0, 40);
|
|
121
|
+
return `mctk_${randomPart}`;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Validate an API key format
|
|
125
|
+
*/
|
|
126
|
+
static isValidApiKey(key) {
|
|
127
|
+
return /^mctk_[a-zA-Z0-9]{20,}$/.test(key);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=admin-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-config.js","sourceRoot":"","sources":["../../src/lib/admin-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mojang API Client
|
|
3
|
+
* Provides player lookup functionality via Mojang API
|
|
4
|
+
*/
|
|
5
|
+
export interface MojangProfile {
|
|
6
|
+
id: string;
|
|
7
|
+
name: string;
|
|
8
|
+
}
|
|
9
|
+
export interface PlayerInfo {
|
|
10
|
+
name: string;
|
|
11
|
+
uuid: string;
|
|
12
|
+
uuidNoDashes: string;
|
|
13
|
+
skinUrl?: string;
|
|
14
|
+
isOnline?: boolean;
|
|
15
|
+
server?: string;
|
|
16
|
+
source: 'mojang' | 'offline' | 'cache';
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Mojang API client for player lookup
|
|
20
|
+
*/
|
|
21
|
+
export declare class MojangApiClient {
|
|
22
|
+
private static readonly API_BASE;
|
|
23
|
+
private static readonly SESSION_BASE;
|
|
24
|
+
/**
|
|
25
|
+
* Look up a player by username via Mojang API
|
|
26
|
+
* Returns null if player not found
|
|
27
|
+
*/
|
|
28
|
+
lookupByUsername(username: string): Promise<PlayerInfo | null>;
|
|
29
|
+
/**
|
|
30
|
+
* Get detailed profile including skin URL
|
|
31
|
+
* Requires UUID (with or without dashes)
|
|
32
|
+
*/
|
|
33
|
+
getProfile(uuid: string): Promise<PlayerInfo | null>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Format UUID with dashes
|
|
37
|
+
* Input: 8667ba71b85a4004af54457a9734eed7
|
|
38
|
+
* Output: 8667ba71-b85a-4004-af54-457a9734eed7
|
|
39
|
+
*/
|
|
40
|
+
export declare function formatUuid(uuid: string): string;
|
|
41
|
+
/**
|
|
42
|
+
* Calculate offline UUID from username
|
|
43
|
+
* Offline servers use a different UUID format based on "OfflinePlayer:" + username
|
|
44
|
+
*/
|
|
45
|
+
export declare function calculateOfflineUuid(username: string): string;
|
|
46
|
+
/**
|
|
47
|
+
* Get player info for offline mode
|
|
48
|
+
*/
|
|
49
|
+
export declare function getOfflinePlayerInfo(username: string): PlayerInfo;
|
|
50
|
+
export declare function getMojangApiClient(): MojangApiClient;
|
|
51
|
+
//# sourceMappingURL=mojang-api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mojang-api.d.ts","sourceRoot":"","sources":["../../src/lib/mojang-api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;CACxC;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IAC5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAsC;IAE1E;;;OAGG;IACG,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA+BpE;;;OAGG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;CAkD3D;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM/C;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAc7D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAQjE;AAKD,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mojang API Client
|
|
3
|
+
* Provides player lookup functionality via Mojang API
|
|
4
|
+
*/
|
|
5
|
+
import { createHash } from 'node:crypto';
|
|
6
|
+
/**
|
|
7
|
+
* Mojang API client for player lookup
|
|
8
|
+
*/
|
|
9
|
+
export class MojangApiClient {
|
|
10
|
+
static API_BASE = 'https://api.mojang.com';
|
|
11
|
+
static SESSION_BASE = 'https://sessionserver.mojang.com';
|
|
12
|
+
/**
|
|
13
|
+
* Look up a player by username via Mojang API
|
|
14
|
+
* Returns null if player not found
|
|
15
|
+
*/
|
|
16
|
+
async lookupByUsername(username) {
|
|
17
|
+
try {
|
|
18
|
+
const response = await fetch(`${MojangApiClient.API_BASE}/users/profiles/minecraft/${encodeURIComponent(username)}`);
|
|
19
|
+
if (response.status === 404) {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
if (!response.ok) {
|
|
23
|
+
throw new Error(`Mojang API error: ${response.status} ${response.statusText}`);
|
|
24
|
+
}
|
|
25
|
+
const profile = await response.json();
|
|
26
|
+
const uuid = formatUuid(profile.id);
|
|
27
|
+
return {
|
|
28
|
+
name: profile.name,
|
|
29
|
+
uuid,
|
|
30
|
+
uuidNoDashes: profile.id,
|
|
31
|
+
source: 'mojang',
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
if (error instanceof Error && error.message.includes('fetch')) {
|
|
36
|
+
throw new Error(`Failed to connect to Mojang API: ${error.message}`);
|
|
37
|
+
}
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get detailed profile including skin URL
|
|
43
|
+
* Requires UUID (with or without dashes)
|
|
44
|
+
*/
|
|
45
|
+
async getProfile(uuid) {
|
|
46
|
+
try {
|
|
47
|
+
const uuidNoDashes = uuid.replace(/-/g, '');
|
|
48
|
+
const response = await fetch(`${MojangApiClient.SESSION_BASE}/session/minecraft/profile/${uuidNoDashes}`);
|
|
49
|
+
if (response.status === 404) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
throw new Error(`Mojang Session API error: ${response.status} ${response.statusText}`);
|
|
54
|
+
}
|
|
55
|
+
const data = await response.json();
|
|
56
|
+
const formattedUuid = formatUuid(data.id);
|
|
57
|
+
// Extract skin URL from properties
|
|
58
|
+
let skinUrl;
|
|
59
|
+
if (data.properties) {
|
|
60
|
+
const texturesProp = data.properties.find((p) => p.name === 'textures');
|
|
61
|
+
if (texturesProp) {
|
|
62
|
+
try {
|
|
63
|
+
const textures = JSON.parse(Buffer.from(texturesProp.value, 'base64').toString('utf-8'));
|
|
64
|
+
skinUrl = textures.textures?.SKIN?.url;
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
// Ignore texture parsing errors
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
name: data.name,
|
|
73
|
+
uuid: formattedUuid,
|
|
74
|
+
uuidNoDashes: data.id,
|
|
75
|
+
skinUrl,
|
|
76
|
+
source: 'mojang',
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
if (error instanceof Error && error.message.includes('fetch')) {
|
|
81
|
+
throw new Error(`Failed to connect to Mojang Session API: ${error.message}`);
|
|
82
|
+
}
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Format UUID with dashes
|
|
89
|
+
* Input: 8667ba71b85a4004af54457a9734eed7
|
|
90
|
+
* Output: 8667ba71-b85a-4004-af54-457a9734eed7
|
|
91
|
+
*/
|
|
92
|
+
export function formatUuid(uuid) {
|
|
93
|
+
const clean = uuid.replace(/-/g, '');
|
|
94
|
+
if (clean.length !== 32) {
|
|
95
|
+
return uuid; // Return as-is if not a valid UUID
|
|
96
|
+
}
|
|
97
|
+
return `${clean.slice(0, 8)}-${clean.slice(8, 12)}-${clean.slice(12, 16)}-${clean.slice(16, 20)}-${clean.slice(20)}`;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Calculate offline UUID from username
|
|
101
|
+
* Offline servers use a different UUID format based on "OfflinePlayer:" + username
|
|
102
|
+
*/
|
|
103
|
+
export function calculateOfflineUuid(username) {
|
|
104
|
+
const hash = createHash('md5').update(`OfflinePlayer:${username}`).digest();
|
|
105
|
+
// Set version to 3 (name-based MD5)
|
|
106
|
+
const byte6 = hash[6];
|
|
107
|
+
const byte8 = hash[8];
|
|
108
|
+
if (byte6 !== undefined && byte8 !== undefined) {
|
|
109
|
+
hash[6] = (byte6 & 0x0f) | 0x30;
|
|
110
|
+
// Set variant to RFC 4122
|
|
111
|
+
hash[8] = (byte8 & 0x3f) | 0x80;
|
|
112
|
+
}
|
|
113
|
+
const hex = hash.toString('hex');
|
|
114
|
+
return formatUuid(hex);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get player info for offline mode
|
|
118
|
+
*/
|
|
119
|
+
export function getOfflinePlayerInfo(username) {
|
|
120
|
+
const uuid = calculateOfflineUuid(username);
|
|
121
|
+
return {
|
|
122
|
+
name: username,
|
|
123
|
+
uuid,
|
|
124
|
+
uuidNoDashes: uuid.replace(/-/g, ''),
|
|
125
|
+
source: 'offline',
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
// Singleton instance
|
|
129
|
+
let mojangApiClient = null;
|
|
130
|
+
export function getMojangApiClient() {
|
|
131
|
+
if (!mojangApiClient) {
|
|
132
|
+
mojangApiClient = new MojangApiClient();
|
|
133
|
+
}
|
|
134
|
+
return mojangApiClient;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=mojang-api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mojang-api.js","sourceRoot":"","sources":["../../src/lib/mojang-api.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAiBzC;;GAEG;AACH,MAAM,OAAO,eAAe;IAClB,MAAM,CAAU,QAAQ,GAAG,wBAAwB,CAAC;IACpD,MAAM,CAAU,YAAY,GAAG,kCAAkC,CAAC;IAE1E;;;OAGG;IACH,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,eAAe,CAAC,QAAQ,6BAA6B,kBAAkB,CAAC,QAAQ,CAAC,EAAE,CACvF,CAAC;YAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YACjF,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAmB,CAAC;YACvD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAEpC,OAAO;gBACL,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,IAAI;gBACJ,YAAY,EAAE,OAAO,CAAC,EAAE;gBACxB,MAAM,EAAE,QAAQ;aACjB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9D,MAAM,IAAI,KAAK,CAAC,oCAAoC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACvE,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,IAAI,CAAC;YACH,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC5C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,eAAe,CAAC,YAAY,8BAA8B,YAAY,EAAE,CAC5E,CAAC;YAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACd,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YACzF,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAI/B,CAAC;YACF,MAAM,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAE1C,mCAAmC;YACnC,IAAI,OAA2B,CAAC;YAChC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBACpB,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;gBACxE,IAAI,YAAY,EAAE,CAAC;oBACjB,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;wBACzF,OAAO,GAAG,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC;oBACzC,CAAC;oBAAC,MAAM,CAAC;wBACP,gCAAgC;oBAClC,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,aAAa;gBACnB,YAAY,EAAE,IAAI,CAAC,EAAE;gBACrB,OAAO;gBACP,MAAM,EAAE,QAAQ;aACjB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC9D,MAAM,IAAI,KAAK,CAAC,4CAA4C,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC/E,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;;AAGH;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC,CAAC,mCAAmC;IAClD,CAAC;IACD,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AACvH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;IAE5E,oCAAoC;IACpC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/C,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QAChC,0BAA0B;QAC1B,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAClC,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACjC,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB;IACnD,MAAM,IAAI,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC5C,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,IAAI;QACJ,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;QACpC,MAAM,EAAE,SAAS;KAClB,CAAC;AACJ,CAAC;AAED,qBAAqB;AACrB,IAAI,eAAe,GAA2B,IAAI,CAAC;AAEnD,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAC1C,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Player Cache System
|
|
3
|
+
* Encrypted local cache for Mojang API responses to minimize rate limiting
|
|
4
|
+
*/
|
|
5
|
+
import { type PlayerInfo } from './mojang-api.js';
|
|
6
|
+
/**
|
|
7
|
+
* Player cache with AES-256-GCM encryption
|
|
8
|
+
*/
|
|
9
|
+
export declare class PlayerCache {
|
|
10
|
+
private readonly cachePath;
|
|
11
|
+
private cache;
|
|
12
|
+
private encryptionKey;
|
|
13
|
+
constructor(cacheDir?: string);
|
|
14
|
+
/**
|
|
15
|
+
* Look up a player by username
|
|
16
|
+
* First checks cache, then Mojang API
|
|
17
|
+
*/
|
|
18
|
+
lookup(username: string, options?: {
|
|
19
|
+
forceRefresh?: boolean;
|
|
20
|
+
offline?: boolean;
|
|
21
|
+
}): Promise<PlayerInfo | null>;
|
|
22
|
+
/**
|
|
23
|
+
* Look up a player with full profile (including skin URL)
|
|
24
|
+
*/
|
|
25
|
+
lookupWithProfile(username: string, options?: {
|
|
26
|
+
forceRefresh?: boolean;
|
|
27
|
+
}): Promise<PlayerInfo | null>;
|
|
28
|
+
/**
|
|
29
|
+
* Get player from cache if valid
|
|
30
|
+
*/
|
|
31
|
+
private getFromCache;
|
|
32
|
+
/**
|
|
33
|
+
* Save player info to cache
|
|
34
|
+
*/
|
|
35
|
+
private saveToCache;
|
|
36
|
+
/**
|
|
37
|
+
* Update skin URL in cache
|
|
38
|
+
*/
|
|
39
|
+
private updateSkinInCache;
|
|
40
|
+
/**
|
|
41
|
+
* Load cache from encrypted file
|
|
42
|
+
*/
|
|
43
|
+
private loadCache;
|
|
44
|
+
/**
|
|
45
|
+
* Persist cache to encrypted file
|
|
46
|
+
*/
|
|
47
|
+
private persistCache;
|
|
48
|
+
/**
|
|
49
|
+
* Get or derive encryption key
|
|
50
|
+
*/
|
|
51
|
+
private getEncryptionKey;
|
|
52
|
+
/**
|
|
53
|
+
* Get machine-specific identifier for key derivation
|
|
54
|
+
*/
|
|
55
|
+
private getMachineIdentifier;
|
|
56
|
+
/**
|
|
57
|
+
* Encrypt data using AES-256-GCM
|
|
58
|
+
*/
|
|
59
|
+
private encrypt;
|
|
60
|
+
/**
|
|
61
|
+
* Decrypt data using AES-256-GCM
|
|
62
|
+
*/
|
|
63
|
+
private decrypt;
|
|
64
|
+
/**
|
|
65
|
+
* Clear all cached data
|
|
66
|
+
*/
|
|
67
|
+
clear(): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Get cache statistics
|
|
70
|
+
*/
|
|
71
|
+
getStats(): Promise<{
|
|
72
|
+
playerCount: number;
|
|
73
|
+
oldestEntry: number | null;
|
|
74
|
+
newestEntry: number | null;
|
|
75
|
+
cacheSize: number;
|
|
76
|
+
}>;
|
|
77
|
+
}
|
|
78
|
+
export declare function getPlayerCache(cacheDir?: string): PlayerCache;
|
|
79
|
+
//# sourceMappingURL=player-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"player-cache.d.ts","sourceRoot":"","sources":["../../src/lib/player-cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EAGL,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AAoCzB;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,KAAK,CAA0B;IACvC,OAAO,CAAC,aAAa,CAAuB;gBAEhC,QAAQ,CAAC,EAAE,MAAM;IAK7B;;;OAGG;IACG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAkCvH;;OAEG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAqC/G;;OAEG;YACW,YAAY;IAsB1B;;OAEG;YACW,WAAW;IAuBzB;;OAEG;YACW,iBAAiB;IAY/B;;OAEG;YACW,SAAS;IAyBvB;;OAEG;YACW,YAAY;IAwB1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAWxB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAe5B;;OAEG;YACW,OAAO;IAoBrB;;OAEG;YACW,OAAO;IAkBrB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;CAsBH;AAKD,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAK7D"}
|