@kolatts/pncli 1.2.0 → 1.4.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.
@@ -0,0 +1,197 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/lib/config.ts
4
+ import fs from "fs";
5
+ import os from "os";
6
+ import path from "path";
7
+ import { execSync } from "child_process";
8
+ var ENV_KEYS = {
9
+ EMAIL: "PNCLI_EMAIL",
10
+ USERID: "PNCLI_USERID",
11
+ JIRA_BASE_URL: "PNCLI_JIRA_BASE_URL",
12
+ JIRA_API_TOKEN: "PNCLI_JIRA_API_TOKEN",
13
+ BITBUCKET_BASE_URL: "PNCLI_BITBUCKET_BASE_URL",
14
+ BITBUCKET_PAT: "PNCLI_BITBUCKET_PAT",
15
+ CONFLUENCE_BASE_URL: "PNCLI_CONFLUENCE_BASE_URL",
16
+ CONFLUENCE_API_TOKEN: "PNCLI_CONFLUENCE_API_TOKEN",
17
+ ARTIFACTORY_BASE_URL: "PNCLI_ARTIFACTORY_BASE_URL",
18
+ ARTIFACTORY_TOKEN: "PNCLI_ARTIFACTORY_TOKEN",
19
+ ARTIFACTORY_REPO_NPM: "PNCLI_ARTIFACTORY_REPO_NPM",
20
+ ARTIFACTORY_REPO_NUGET: "PNCLI_ARTIFACTORY_REPO_NUGET",
21
+ ARTIFACTORY_REPO_MAVEN: "PNCLI_ARTIFACTORY_REPO_MAVEN",
22
+ SONAR_BASE_URL: "PNCLI_SONAR_BASE_URL",
23
+ SONAR_TOKEN: "PNCLI_SONAR_TOKEN",
24
+ SDE_CONNECTION: "PNCLI_SDE_CONNECTION",
25
+ ADO_BASE_URL: "PNCLI_ADO_BASE_URL",
26
+ ADO_PAT: "PNCLI_ADO_PAT",
27
+ CONFIG_PATH: "PNCLI_CONFIG_PATH"
28
+ };
29
+ function getGlobalConfigPath(overridePath) {
30
+ if (overridePath) return overridePath;
31
+ const envPath = process.env[ENV_KEYS.CONFIG_PATH];
32
+ if (envPath) return envPath;
33
+ return path.join(os.homedir(), ".pncli", "config.json");
34
+ }
35
+ function loadJsonFile(filePath) {
36
+ try {
37
+ const content = fs.readFileSync(filePath, "utf8");
38
+ return JSON.parse(content);
39
+ } catch {
40
+ return null;
41
+ }
42
+ }
43
+ function getRepoRoot() {
44
+ try {
45
+ return execSync("git rev-parse --show-toplevel", { encoding: "utf8", stdio: ["pipe", "pipe", "pipe"] }).trim();
46
+ } catch {
47
+ return null;
48
+ }
49
+ }
50
+ function parseSdeConnection(connection) {
51
+ const idx = connection.indexOf("@");
52
+ if (idx <= 0) return null;
53
+ const token = connection.slice(0, idx);
54
+ const host = connection.slice(idx + 1);
55
+ const baseUrl = /^https?:\/\//i.test(host) ? host : `https://${host}`;
56
+ return { token, baseUrl };
57
+ }
58
+ function mergeCustomFields(global, repo) {
59
+ const map = /* @__PURE__ */ new Map();
60
+ for (const f of global ?? []) map.set(f.id, f);
61
+ for (const f of repo ?? []) map.set(f.id, f);
62
+ return Array.from(map.values());
63
+ }
64
+ function mergeDefaults(global, repo) {
65
+ return {
66
+ jira: { ...global?.jira, ...repo?.jira },
67
+ bitbucket: { ...global?.bitbucket, ...repo?.bitbucket },
68
+ sonar: { ...global?.sonar, ...repo?.sonar },
69
+ sde: { ...global?.sde, ...repo?.sde },
70
+ ado: { ...global?.ado, ...repo?.ado }
71
+ };
72
+ }
73
+ function loadConfig(opts = {}) {
74
+ const globalConfigPath = getGlobalConfigPath(opts.configPath);
75
+ const globalConfig = loadJsonFile(globalConfigPath) ?? {};
76
+ const repoRoot = getRepoRoot();
77
+ let repoConfig = {};
78
+ if (repoRoot) {
79
+ repoConfig = loadJsonFile(path.join(repoRoot, ".pncli.json")) ?? {};
80
+ }
81
+ const mergedDefaults = mergeDefaults(globalConfig.defaults, repoConfig.defaults);
82
+ return {
83
+ user: {
84
+ email: process.env[ENV_KEYS.EMAIL] ?? globalConfig.user?.email,
85
+ userId: process.env[ENV_KEYS.USERID] ?? globalConfig.user?.userId
86
+ },
87
+ jira: {
88
+ baseUrl: process.env[ENV_KEYS.JIRA_BASE_URL] ?? globalConfig.jira?.baseUrl,
89
+ apiToken: process.env[ENV_KEYS.JIRA_API_TOKEN] ?? globalConfig.jira?.apiToken,
90
+ customFields: mergeCustomFields(globalConfig.jira?.customFields, repoConfig.jira?.customFields)
91
+ },
92
+ bitbucket: {
93
+ baseUrl: process.env[ENV_KEYS.BITBUCKET_BASE_URL] ?? globalConfig.bitbucket?.baseUrl,
94
+ pat: process.env[ENV_KEYS.BITBUCKET_PAT] ?? globalConfig.bitbucket?.pat
95
+ },
96
+ confluence: {
97
+ baseUrl: process.env[ENV_KEYS.CONFLUENCE_BASE_URL] ?? globalConfig.confluence?.baseUrl,
98
+ apiToken: process.env[ENV_KEYS.CONFLUENCE_API_TOKEN] ?? globalConfig.confluence?.apiToken ?? process.env[ENV_KEYS.JIRA_API_TOKEN] ?? globalConfig.jira?.apiToken
99
+ },
100
+ artifactory: {
101
+ baseUrl: process.env[ENV_KEYS.ARTIFACTORY_BASE_URL] ?? globalConfig.artifactory?.baseUrl,
102
+ token: process.env[ENV_KEYS.ARTIFACTORY_TOKEN] ?? globalConfig.artifactory?.token,
103
+ npmRepo: process.env[ENV_KEYS.ARTIFACTORY_REPO_NPM] ?? globalConfig.artifactory?.npmRepo,
104
+ nugetRepo: process.env[ENV_KEYS.ARTIFACTORY_REPO_NUGET] ?? globalConfig.artifactory?.nugetRepo,
105
+ mavenRepo: process.env[ENV_KEYS.ARTIFACTORY_REPO_MAVEN] ?? globalConfig.artifactory?.mavenRepo
106
+ },
107
+ sonar: {
108
+ baseUrl: process.env[ENV_KEYS.SONAR_BASE_URL] ?? globalConfig.sonar?.baseUrl,
109
+ token: process.env[ENV_KEYS.SONAR_TOKEN] ?? globalConfig.sonar?.token
110
+ },
111
+ sde: (() => {
112
+ const raw = process.env[ENV_KEYS.SDE_CONNECTION] ?? globalConfig.sde?.connection;
113
+ const parsed = raw ? parseSdeConnection(raw) : null;
114
+ return { baseUrl: parsed?.baseUrl, token: parsed?.token };
115
+ })(),
116
+ ado: {
117
+ baseUrl: process.env[ENV_KEYS.ADO_BASE_URL] ?? globalConfig.ado?.baseUrl,
118
+ pat: process.env[ENV_KEYS.ADO_PAT] ?? globalConfig.ado?.pat,
119
+ fieldAliases: globalConfig.ado?.fieldAliases ?? {},
120
+ discoveredFields: globalConfig.ado?.discoveredFields ?? [],
121
+ discoveredTypes: globalConfig.ado?.discoveredTypes ?? []
122
+ },
123
+ defaults: mergedDefaults
124
+ };
125
+ }
126
+ function writeGlobalConfig(config, configPath) {
127
+ const filePath = getGlobalConfigPath(configPath);
128
+ const dir = path.dirname(filePath);
129
+ if (!fs.existsSync(dir)) {
130
+ fs.mkdirSync(dir, { recursive: true });
131
+ }
132
+ fs.writeFileSync(filePath, JSON.stringify(config, null, 2) + "\n", "utf8");
133
+ }
134
+ function writeRepoConfig(config) {
135
+ const repoRoot = getRepoRoot();
136
+ const targetDir = repoRoot ?? process.cwd();
137
+ fs.writeFileSync(path.join(targetDir, ".pncli.json"), JSON.stringify(config, null, 2) + "\n", "utf8");
138
+ }
139
+ function setConfigValue(key, value, configPath) {
140
+ const filePath = getGlobalConfigPath(configPath);
141
+ const existing = loadJsonFile(filePath) ?? {};
142
+ const parts = key.split(".");
143
+ let current = existing;
144
+ for (let i = 0; i < parts.length - 1; i++) {
145
+ const part = parts[i];
146
+ if (typeof current[part] !== "object" || current[part] === null) {
147
+ current[part] = {};
148
+ }
149
+ current = current[part];
150
+ }
151
+ current[parts[parts.length - 1]] = value;
152
+ writeGlobalConfig(existing, configPath);
153
+ }
154
+ function maskConfig(config) {
155
+ return {
156
+ ...config,
157
+ jira: {
158
+ ...config.jira,
159
+ apiToken: config.jira.apiToken ? "***" : void 0,
160
+ customFields: config.jira.customFields
161
+ },
162
+ bitbucket: {
163
+ ...config.bitbucket,
164
+ pat: config.bitbucket.pat ? "***" : void 0
165
+ },
166
+ confluence: {
167
+ ...config.confluence,
168
+ apiToken: config.confluence.apiToken ? "***" : void 0
169
+ },
170
+ artifactory: {
171
+ ...config.artifactory,
172
+ token: config.artifactory.token ? "***" : void 0
173
+ },
174
+ sonar: {
175
+ ...config.sonar,
176
+ token: config.sonar.token ? "***" : void 0
177
+ },
178
+ sde: {
179
+ baseUrl: config.sde.baseUrl,
180
+ token: config.sde.token ? "***" : void 0
181
+ },
182
+ ado: {
183
+ ...config.ado,
184
+ pat: config.ado.pat ? "***" : void 0
185
+ }
186
+ };
187
+ }
188
+
189
+ export {
190
+ getGlobalConfigPath,
191
+ loadConfig,
192
+ writeGlobalConfig,
193
+ writeRepoConfig,
194
+ setConfigValue,
195
+ maskConfig
196
+ };
197
+ //# sourceMappingURL=chunk-JORIICS2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/config.ts"],"sourcesContent":["import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport { execSync } from 'child_process';\nimport type { GlobalConfig, RepoConfig, ResolvedConfig, JiraDefaults, BitbucketDefaults, SonarDefaults, SdeDefaults, AdoDefaults } from '../types/config.js';\nimport type { CustomFieldDefinition } from '../types/jira.js';\n\nconst ENV_KEYS = {\n EMAIL: 'PNCLI_EMAIL',\n USERID: 'PNCLI_USERID',\n JIRA_BASE_URL: 'PNCLI_JIRA_BASE_URL',\n JIRA_API_TOKEN: 'PNCLI_JIRA_API_TOKEN',\n BITBUCKET_BASE_URL: 'PNCLI_BITBUCKET_BASE_URL',\n BITBUCKET_PAT: 'PNCLI_BITBUCKET_PAT',\n CONFLUENCE_BASE_URL: 'PNCLI_CONFLUENCE_BASE_URL',\n CONFLUENCE_API_TOKEN: 'PNCLI_CONFLUENCE_API_TOKEN',\n ARTIFACTORY_BASE_URL: 'PNCLI_ARTIFACTORY_BASE_URL',\n ARTIFACTORY_TOKEN: 'PNCLI_ARTIFACTORY_TOKEN',\n ARTIFACTORY_REPO_NPM: 'PNCLI_ARTIFACTORY_REPO_NPM',\n ARTIFACTORY_REPO_NUGET: 'PNCLI_ARTIFACTORY_REPO_NUGET',\n ARTIFACTORY_REPO_MAVEN: 'PNCLI_ARTIFACTORY_REPO_MAVEN',\n SONAR_BASE_URL: 'PNCLI_SONAR_BASE_URL',\n SONAR_TOKEN: 'PNCLI_SONAR_TOKEN',\n SDE_CONNECTION: 'PNCLI_SDE_CONNECTION',\n ADO_BASE_URL: 'PNCLI_ADO_BASE_URL',\n ADO_PAT: 'PNCLI_ADO_PAT',\n CONFIG_PATH: 'PNCLI_CONFIG_PATH'\n} as const;\n\nfunction getGlobalConfigPath(overridePath?: string): string {\n if (overridePath) return overridePath;\n const envPath = process.env[ENV_KEYS.CONFIG_PATH];\n if (envPath) return envPath;\n return path.join(os.homedir(), '.pncli', 'config.json');\n}\n\nfunction loadJsonFile<T>(filePath: string): T | null {\n try {\n const content = fs.readFileSync(filePath, 'utf8');\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\nfunction getRepoRoot(): string | null {\n try {\n return execSync('git rev-parse --show-toplevel', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();\n } catch {\n return null;\n }\n}\n\nfunction parseSdeConnection(connection: string): { token: string; baseUrl: string } | null {\n const idx = connection.indexOf('@');\n if (idx <= 0) return null;\n const token = connection.slice(0, idx);\n const host = connection.slice(idx + 1);\n const baseUrl = /^https?:\\/\\//i.test(host) ? host : `https://${host}`;\n return { token, baseUrl };\n}\n\nfunction mergeCustomFields(\n global: CustomFieldDefinition[] | undefined,\n repo: CustomFieldDefinition[] | undefined\n): CustomFieldDefinition[] {\n const map = new Map<string, CustomFieldDefinition>();\n for (const f of global ?? []) map.set(f.id, f);\n for (const f of repo ?? []) map.set(f.id, f); // repo wins\n return Array.from(map.values());\n}\n\nfunction mergeDefaults(\n global: GlobalConfig['defaults'],\n repo: RepoConfig['defaults']\n): { jira: JiraDefaults; bitbucket: BitbucketDefaults; sonar: SonarDefaults; sde: SdeDefaults; ado: AdoDefaults } {\n return {\n jira: { ...global?.jira, ...repo?.jira },\n bitbucket: { ...global?.bitbucket, ...repo?.bitbucket },\n sonar: { ...global?.sonar, ...repo?.sonar },\n sde: { ...global?.sde, ...repo?.sde },\n ado: { ...global?.ado, ...repo?.ado }\n };\n}\n\nexport interface LoadConfigOptions {\n configPath?: string;\n}\n\nexport function loadConfig(opts: LoadConfigOptions = {}): ResolvedConfig {\n const globalConfigPath = getGlobalConfigPath(opts.configPath);\n const globalConfig = loadJsonFile<GlobalConfig>(globalConfigPath) ?? {};\n\n const repoRoot = getRepoRoot();\n let repoConfig: RepoConfig = {};\n if (repoRoot) {\n repoConfig = loadJsonFile<RepoConfig>(path.join(repoRoot, '.pncli.json')) ?? {};\n }\n\n const mergedDefaults = mergeDefaults(globalConfig.defaults, repoConfig.defaults);\n\n return {\n user: {\n email: process.env[ENV_KEYS.EMAIL] ?? globalConfig.user?.email,\n userId: process.env[ENV_KEYS.USERID] ?? globalConfig.user?.userId\n },\n jira: {\n baseUrl: process.env[ENV_KEYS.JIRA_BASE_URL] ?? globalConfig.jira?.baseUrl,\n apiToken: process.env[ENV_KEYS.JIRA_API_TOKEN] ?? globalConfig.jira?.apiToken,\n customFields: mergeCustomFields(globalConfig.jira?.customFields, repoConfig.jira?.customFields)\n },\n bitbucket: {\n baseUrl: process.env[ENV_KEYS.BITBUCKET_BASE_URL] ?? globalConfig.bitbucket?.baseUrl,\n pat: process.env[ENV_KEYS.BITBUCKET_PAT] ?? globalConfig.bitbucket?.pat\n },\n confluence: {\n baseUrl: process.env[ENV_KEYS.CONFLUENCE_BASE_URL] ?? globalConfig.confluence?.baseUrl,\n apiToken: process.env[ENV_KEYS.CONFLUENCE_API_TOKEN] ?? globalConfig.confluence?.apiToken\n ?? process.env[ENV_KEYS.JIRA_API_TOKEN] ?? globalConfig.jira?.apiToken\n },\n artifactory: {\n baseUrl: process.env[ENV_KEYS.ARTIFACTORY_BASE_URL] ?? globalConfig.artifactory?.baseUrl,\n token: process.env[ENV_KEYS.ARTIFACTORY_TOKEN] ?? globalConfig.artifactory?.token,\n npmRepo: process.env[ENV_KEYS.ARTIFACTORY_REPO_NPM] ?? globalConfig.artifactory?.npmRepo,\n nugetRepo: process.env[ENV_KEYS.ARTIFACTORY_REPO_NUGET] ?? globalConfig.artifactory?.nugetRepo,\n mavenRepo: process.env[ENV_KEYS.ARTIFACTORY_REPO_MAVEN] ?? globalConfig.artifactory?.mavenRepo\n },\n sonar: {\n baseUrl: process.env[ENV_KEYS.SONAR_BASE_URL] ?? globalConfig.sonar?.baseUrl,\n token: process.env[ENV_KEYS.SONAR_TOKEN] ?? globalConfig.sonar?.token\n },\n sde: (() => {\n const raw = process.env[ENV_KEYS.SDE_CONNECTION] ?? globalConfig.sde?.connection;\n const parsed = raw ? parseSdeConnection(raw) : null;\n return { baseUrl: parsed?.baseUrl, token: parsed?.token };\n })(),\n ado: {\n baseUrl: process.env[ENV_KEYS.ADO_BASE_URL] ?? globalConfig.ado?.baseUrl,\n pat: process.env[ENV_KEYS.ADO_PAT] ?? globalConfig.ado?.pat,\n fieldAliases: globalConfig.ado?.fieldAliases ?? {},\n discoveredFields: globalConfig.ado?.discoveredFields ?? [],\n discoveredTypes: globalConfig.ado?.discoveredTypes ?? []\n },\n defaults: mergedDefaults\n };\n}\n\nexport function writeGlobalConfig(config: GlobalConfig, configPath?: string): void {\n const filePath = getGlobalConfigPath(configPath);\n const dir = path.dirname(filePath);\n if (!fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n fs.writeFileSync(filePath, JSON.stringify(config, null, 2) + '\\n', 'utf8');\n}\n\nexport function writeRepoConfig(config: RepoConfig): void {\n const repoRoot = getRepoRoot();\n const targetDir = repoRoot ?? process.cwd();\n fs.writeFileSync(path.join(targetDir, '.pncli.json'), JSON.stringify(config, null, 2) + '\\n', 'utf8');\n}\n\nexport function setConfigValue(key: string, value: string, configPath?: string): void {\n const filePath = getGlobalConfigPath(configPath);\n const existing = loadJsonFile<GlobalConfig>(filePath) ?? {};\n\n const parts = key.split('.');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let current: any = existing;\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i]!;\n if (typeof current[part] !== 'object' || current[part] === null) {\n current[part] = {};\n }\n current = current[part];\n }\n current[parts[parts.length - 1]!] = value;\n\n writeGlobalConfig(existing, configPath);\n}\n\nexport function maskConfig(config: ResolvedConfig): unknown {\n return {\n ...config,\n jira: {\n ...config.jira,\n apiToken: config.jira.apiToken ? '***' : undefined,\n customFields: config.jira.customFields\n },\n bitbucket: {\n ...config.bitbucket,\n pat: config.bitbucket.pat ? '***' : undefined\n },\n confluence: {\n ...config.confluence,\n apiToken: config.confluence.apiToken ? '***' : undefined\n },\n artifactory: {\n ...config.artifactory,\n token: config.artifactory.token ? '***' : undefined\n },\n sonar: {\n ...config.sonar,\n token: config.sonar.token ? '***' : undefined\n },\n sde: {\n baseUrl: config.sde.baseUrl,\n token: config.sde.token ? '***' : undefined\n },\n ado: {\n ...config.ado,\n pat: config.ado.pat ? '***' : undefined\n }\n };\n}\n\nexport { getGlobalConfigPath };\n"],"mappings":"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","names":[]}
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/services/ado/client/core.ts
4
+ var API = "7.1";
5
+ var AdoCoreClient = class {
6
+ constructor(http) {
7
+ this.http = http;
8
+ }
9
+ http;
10
+ async getConnectionData(collection) {
11
+ const path = collection ? `/${encodeURIComponent(collection)}/_apis/connectionData?api-version=${API}` : `/_apis/connectionData?api-version=${API}`;
12
+ return this.http.ado(path);
13
+ }
14
+ async listCollections() {
15
+ const result = await this.http.ado(
16
+ `/_apis/projectCollections?api-version=${API}`
17
+ );
18
+ return result.value ?? [];
19
+ }
20
+ async listProjects(collection) {
21
+ return this.http.adoPaginate(async (token) => {
22
+ const params = {
23
+ "api-version": API,
24
+ ...token ? { continuationToken: token } : {}
25
+ };
26
+ return this.http.adoRaw(
27
+ `/${encodeURIComponent(collection)}/_apis/projects`,
28
+ { params }
29
+ );
30
+ });
31
+ }
32
+ async getProject(collection, projectName) {
33
+ return this.http.ado(
34
+ `/${encodeURIComponent(collection)}/_apis/projects/${encodeURIComponent(projectName)}?api-version=${API}`
35
+ );
36
+ }
37
+ };
38
+
39
+ export {
40
+ AdoCoreClient
41
+ };
42
+ //# sourceMappingURL=chunk-KT3XINLJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/services/ado/client/core.ts"],"sourcesContent":["import type { HttpClient } from '../../../lib/http.js';\nimport type {\n AdoConnectionData,\n AdoProject,\n AdoProjectCollection,\n AdoPageResponse\n} from '../../../types/ado.js';\n\nconst API = '7.1';\n\nexport class AdoCoreClient {\n constructor(private http: HttpClient) {}\n\n async getConnectionData(collection?: string): Promise<AdoConnectionData> {\n const path = collection\n ? `/${encodeURIComponent(collection)}/_apis/connectionData?api-version=${API}`\n : `/_apis/connectionData?api-version=${API}`;\n return this.http.ado<AdoConnectionData>(path);\n }\n\n async listCollections(): Promise<AdoProjectCollection[]> {\n const result = await this.http.ado<AdoPageResponse<AdoProjectCollection>>(\n `/_apis/projectCollections?api-version=${API}`\n );\n return result.value ?? [];\n }\n\n async listProjects(collection: string): Promise<AdoProject[]> {\n return this.http.adoPaginate<AdoProject>(async (token) => {\n const params: Record<string, string | number | boolean | undefined> = {\n 'api-version': API,\n ...(token ? { continuationToken: token } : {})\n };\n return this.http.adoRaw(\n `/${encodeURIComponent(collection)}/_apis/projects`,\n { params }\n ) as Promise<{ data: { value: AdoProject[] }; headers: Headers }>;\n });\n }\n\n async getProject(collection: string, projectName: string): Promise<AdoProject> {\n return this.http.ado<AdoProject>(\n `/${encodeURIComponent(collection)}/_apis/projects/${encodeURIComponent(projectName)}?api-version=${API}`\n );\n }\n}\n"],"mappings":";;;AAQA,IAAM,MAAM;AAEL,IAAM,gBAAN,MAAoB;AAAA,EACzB,YAAoB,MAAkB;AAAlB;AAAA,EAAmB;AAAA,EAAnB;AAAA,EAEpB,MAAM,kBAAkB,YAAiD;AACvE,UAAM,OAAO,aACT,IAAI,mBAAmB,UAAU,CAAC,qCAAqC,GAAG,KAC1E,qCAAqC,GAAG;AAC5C,WAAO,KAAK,KAAK,IAAuB,IAAI;AAAA,EAC9C;AAAA,EAEA,MAAM,kBAAmD;AACvD,UAAM,SAAS,MAAM,KAAK,KAAK;AAAA,MAC7B,yCAAyC,GAAG;AAAA,IAC9C;AACA,WAAO,OAAO,SAAS,CAAC;AAAA,EAC1B;AAAA,EAEA,MAAM,aAAa,YAA2C;AAC5D,WAAO,KAAK,KAAK,YAAwB,OAAO,UAAU;AACxD,YAAM,SAAgE;AAAA,QACpE,eAAe;AAAA,QACf,GAAI,QAAQ,EAAE,mBAAmB,MAAM,IAAI,CAAC;AAAA,MAC9C;AACA,aAAO,KAAK,KAAK;AAAA,QACf,IAAI,mBAAmB,UAAU,CAAC;AAAA,QAClC,EAAE,OAAO;AAAA,MACX;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,WAAW,YAAoB,aAA0C;AAC7E,WAAO,KAAK,KAAK;AAAA,MACf,IAAI,mBAAmB,UAAU,CAAC,mBAAmB,mBAAmB,WAAW,CAAC,gBAAgB,GAAG;AAAA,IACzG;AAAA,EACF;AACF;","names":[]}