@localheroai/cli 0.0.36 ā 0.0.37
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 +21 -5
- package/dist/api/glossary.js +8 -0
- package/dist/api/glossary.js.map +1 -0
- package/dist/api/settings.js +7 -0
- package/dist/api/settings.js.map +1 -0
- package/dist/cli.js +15 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/glossary.js +39 -0
- package/dist/commands/glossary.js.map +1 -0
- package/dist/commands/login.js +3 -2
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/settings.js +41 -0
- package/dist/commands/settings.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -48,14 +48,20 @@ The configuration file is used by the tool to interact with your translations an
|
|
|
48
48
|
|
|
49
49
|
```bash
|
|
50
50
|
npx @localheroai/cli login
|
|
51
|
+
npx @localheroai/cli login --api-key tk_xxx # Non-interactive
|
|
51
52
|
```
|
|
52
53
|
|
|
53
|
-
Authenticate with the API using your API key.
|
|
54
|
+
Authenticate with the API using your API key. Saves to `.localhero_key` and adds it to .gitignore.
|
|
54
55
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
56
|
+
### Glossary & Settings
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx @localheroai/cli glossary # View project glossary terms
|
|
60
|
+
npx @localheroai/cli glossary --search work # Search glossary
|
|
61
|
+
npx @localheroai/cli settings # View project translation settings
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Both support `--output json` for machine-readable output.
|
|
59
65
|
|
|
60
66
|
### Translate
|
|
61
67
|
|
|
@@ -181,6 +187,16 @@ LocalHero.ai automatically translate your I18n files when you push changes. Duri
|
|
|
181
187
|
|
|
182
188
|
š§ **Skip translations on a PR**: Add the `skip-translation` label to any PR to skip the translation workflow. Useful when you're still working on copy changes.
|
|
183
189
|
|
|
190
|
+
## AI Assistant Integration š¤
|
|
191
|
+
|
|
192
|
+
Using an AI coding assistant (Claude Code, Cursor, etc.)? Install the Localhero.ai skill so your assistant writes correct source strings automatically:
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
npx skills add localheroai/agent-skill
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
Your assistant gets access to your project's glossary and style settings, as well as instructions on how to work with Localhero.ai in your project.
|
|
199
|
+
|
|
184
200
|
## Support š¬
|
|
185
201
|
|
|
186
202
|
- Documentation: [localhero.ai/docs](https://localhero.ai/docs)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { getApiKey } from '../utils/auth.js';
|
|
2
|
+
import { apiRequest } from './client.js';
|
|
3
|
+
export async function fetchGlossaryTerms(projectId, search) {
|
|
4
|
+
const apiKey = await getApiKey();
|
|
5
|
+
const params = search ? `?search=${encodeURIComponent(search)}` : '';
|
|
6
|
+
return apiRequest(`/api/v1/projects/${projectId}/glossary_terms${params}`, { apiKey });
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=glossary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glossary.js","sourceRoot":"","sources":["../../src/api/glossary.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAczC,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,SAAiB,EACjB,MAAe;IAEf,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,WAAW,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAErE,OAAO,UAAU,CAAC,oBAAoB,SAAS,kBAAkB,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AACzF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { getApiKey } from '../utils/auth.js';
|
|
2
|
+
import { apiRequest } from './client.js';
|
|
3
|
+
export async function fetchSettings(projectId) {
|
|
4
|
+
const apiKey = await getApiKey();
|
|
5
|
+
return apiRequest(`/api/v1/projects/${projectId}/settings`, { apiKey });
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/api/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAkBzC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAiB;IACnD,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IAEjC,OAAO,UAAU,CAAC,oBAAoB,SAAS,WAAW,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AAC1E,CAAC"}
|
package/dist/cli.js
CHANGED
|
@@ -11,6 +11,8 @@ import { init } from './commands/init.js';
|
|
|
11
11
|
import { translate } from './commands/translate.js';
|
|
12
12
|
import { ci } from './commands/ci.js';
|
|
13
13
|
import { clone } from './commands/clone.js';
|
|
14
|
+
import { glossary } from './commands/glossary.js';
|
|
15
|
+
import { settings } from './commands/settings.js';
|
|
14
16
|
import { configService } from './utils/config.js';
|
|
15
17
|
const __filename = fileURLToPath(import.meta.url);
|
|
16
18
|
const __dirname = dirname(__filename);
|
|
@@ -58,7 +60,8 @@ program
|
|
|
58
60
|
program
|
|
59
61
|
.command('login')
|
|
60
62
|
.description('Authenticate with LocalHero.ai using an API key')
|
|
61
|
-
.
|
|
63
|
+
.option('--api-key <key>', 'API key for non-interactive authentication')
|
|
64
|
+
.action(wrapCommandAction((options) => login({ apiKey: options.apiKey })));
|
|
62
65
|
program
|
|
63
66
|
.command('init')
|
|
64
67
|
.description('Initialize a new LocalHero.ai project')
|
|
@@ -98,5 +101,16 @@ program
|
|
|
98
101
|
.option('-v, --verbose', 'Show detailed progress information')
|
|
99
102
|
.option('-f, --force', 'Force, override existing files')
|
|
100
103
|
.action(wrapCommandAction((options) => clone(options)));
|
|
104
|
+
program
|
|
105
|
+
.command('glossary')
|
|
106
|
+
.description('Show project glossary terms')
|
|
107
|
+
.option('-o, --output <format>', 'Output format (json)')
|
|
108
|
+
.option('-s, --search <query>', 'Search glossary terms')
|
|
109
|
+
.action(wrapCommandAction((options) => glossary(options)));
|
|
110
|
+
program
|
|
111
|
+
.command('settings')
|
|
112
|
+
.description('Show project translation settings')
|
|
113
|
+
.option('-o, --output <format>', 'Output format (json)')
|
|
114
|
+
.action(wrapCommandAction((options) => settings(options)));
|
|
101
115
|
program.parse();
|
|
102
116
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { fetchGlossaryTerms as defaultFetchGlossaryTerms } from '../api/glossary.js';
|
|
3
|
+
import { configService } from '../utils/config.js';
|
|
4
|
+
import { checkAuth as defaultCheckAuth } from '../utils/auth.js';
|
|
5
|
+
export async function glossary(options, deps = {}) {
|
|
6
|
+
const { console: con = global.console, configUtils = configService, authUtils = { checkAuth: defaultCheckAuth }, fetchGlossaryTerms = defaultFetchGlossaryTerms } = deps;
|
|
7
|
+
const isAuthenticated = await authUtils.checkAuth();
|
|
8
|
+
if (!isAuthenticated) {
|
|
9
|
+
con.error(chalk.red('Not authenticated. Run `localhero login` first.'));
|
|
10
|
+
process.exit(1);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const config = await configUtils.getValidProjectConfig();
|
|
14
|
+
const data = await fetchGlossaryTerms(config.projectId, options.search);
|
|
15
|
+
const terms = data.glossary_terms;
|
|
16
|
+
if (options.output === 'json') {
|
|
17
|
+
con.log(JSON.stringify(data));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
if (terms.length === 0) {
|
|
21
|
+
con.log(chalk.dim(options.search
|
|
22
|
+
? `No glossary terms matching "${options.search}".`
|
|
23
|
+
: 'No glossary terms configured for this project.'));
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const header = options.search
|
|
27
|
+
? `Glossary terms matching "${options.search}" (${terms.length}):`
|
|
28
|
+
: `Project glossary (${terms.length} terms):`;
|
|
29
|
+
con.log(chalk.bold(header));
|
|
30
|
+
con.log('');
|
|
31
|
+
for (const term of terms) {
|
|
32
|
+
const context = term.context ? chalk.dim(`"${term.context}"`) : '';
|
|
33
|
+
con.log(` ${chalk.white(padRight(term.term, 20))} ${chalk.cyan(padRight(term.translation_strategy || 'Default', 20))} ${context}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function padRight(str, width) {
|
|
37
|
+
return str.length >= width ? str : str + ' '.repeat(width - str.length);
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=glossary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"glossary.js","sourceRoot":"","sources":["../../src/commands/glossary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,IAAI,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACrF,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAejE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAwB,EAAE,OAA6B,EAAE;IACtF,MAAM,EACJ,OAAO,EAAE,GAAG,GAAG,MAAM,CAAC,OAAO,EAC7B,WAAW,GAAG,aAAa,EAC3B,SAAS,GAAG,EAAE,SAAS,EAAE,gBAAgB,EAAE,EAC3C,kBAAkB,GAAG,yBAAyB,EAC/C,GAAG,IAAI,CAAC;IAET,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,CAAC;IACpD,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,qBAAqB,EAAE,CAAC;IAEzD,MAAM,IAAI,GAAqB,MAAM,kBAAkB,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC;IAElC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM;YAC9B,CAAC,CAAC,+BAA+B,OAAO,CAAC,MAAM,IAAI;YACnD,CAAC,CAAC,gDAAgD,CACnD,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM;QAC3B,CAAC,CAAC,4BAA4B,OAAO,CAAC,MAAM,MAAM,KAAK,CAAC,MAAM,IAAI;QAClE,CAAC,CAAC,qBAAqB,KAAK,CAAC,MAAM,UAAU,CAAC;IAEhD,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IAC5B,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEZ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,oBAAoB,IAAI,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IACtI,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,KAAa;IAC1C,OAAO,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;AAC1E,CAAC"}
|
package/dist/commands/login.js
CHANGED
|
@@ -5,12 +5,12 @@ import { verifyApiKey as defaultVerifyApiKey } from '../api/auth.js';
|
|
|
5
5
|
import { configService } from '../utils/config.js';
|
|
6
6
|
const API_KEY_PATTERN = /^tk_[a-zA-Z0-9]{48}$/;
|
|
7
7
|
export async function login(deps = {}) {
|
|
8
|
-
const { console = global.console, basePath = process.cwd(), promptService = createPromptService({ inquirer: await import('@inquirer/prompts') }), verifyApiKey = defaultVerifyApiKey, gitUtils = { updateGitignore }, configUtils = configService, isCalledFromInit = false } = deps;
|
|
8
|
+
const { console = global.console, basePath = process.cwd(), promptService = createPromptService({ inquirer: await import('@inquirer/prompts') }), verifyApiKey = defaultVerifyApiKey, gitUtils = { updateGitignore }, configUtils = configService, isCalledFromInit = false, apiKey: providedApiKey } = deps;
|
|
9
9
|
const existingConfig = await configUtils.getAuthConfig(basePath);
|
|
10
10
|
if (existingConfig?.api_key) {
|
|
11
11
|
console.log(chalk.yellow('\nā ļø Warning: This will replace your existing API key configuration'));
|
|
12
12
|
}
|
|
13
|
-
const apiKey = process.env.LOCALHERO_API_KEY || (console.log('\nā Get your API key from: https://localhero.ai/api-keys'),
|
|
13
|
+
const apiKey = providedApiKey || process.env.LOCALHERO_API_KEY || (console.log('\nā Get your API key from: https://localhero.ai/api-keys'),
|
|
14
14
|
console.log('ā New to LocalHero? Sign up at: https://localhero.ai/signup'),
|
|
15
15
|
console.log('\nThe API key will be saved to .localhero_key, and automatically added to your .gitignore file.\n'),
|
|
16
16
|
await promptService.getApiKey());
|
|
@@ -56,5 +56,6 @@ export async function login(deps = {}) {
|
|
|
56
56
|
console.log(chalk.white(' npx @localheroai/cli clone - to download existing translations'));
|
|
57
57
|
console.log(chalk.white(' npx @localheroai/cli translate - to start translating'));
|
|
58
58
|
}
|
|
59
|
+
console.log(chalk.dim('\nTip: Using an AI assistant? Install the Localhero.ai skill: npx skills add localheroai/agent-skill'));
|
|
59
60
|
}
|
|
60
61
|
//# sourceMappingURL=login.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,YAAY,IAAI,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAInD,MAAM,eAAe,GAAG,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { fetchSettings as defaultFetchSettings } from '../api/settings.js';
|
|
3
|
+
import { configService } from '../utils/config.js';
|
|
4
|
+
import { checkAuth as defaultCheckAuth } from '../utils/auth.js';
|
|
5
|
+
export async function settings(options, deps = {}) {
|
|
6
|
+
const { console: con = global.console, configUtils = configService, authUtils = { checkAuth: defaultCheckAuth }, fetchSettings = defaultFetchSettings } = deps;
|
|
7
|
+
const isAuthenticated = await authUtils.checkAuth();
|
|
8
|
+
if (!isAuthenticated) {
|
|
9
|
+
con.error(chalk.red('Not authenticated. Run `localhero login` first.'));
|
|
10
|
+
process.exit(1);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const config = await configUtils.getValidProjectConfig();
|
|
14
|
+
const data = await fetchSettings(config.projectId);
|
|
15
|
+
const projectSettings = data.settings;
|
|
16
|
+
if (options.output === 'json') {
|
|
17
|
+
con.log(JSON.stringify(data));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
con.log(chalk.bold(`Project: ${projectSettings.name}`));
|
|
21
|
+
if (projectSettings.tone_of_voice)
|
|
22
|
+
con.log(`Tone: ${projectSettings.tone_of_voice}`);
|
|
23
|
+
if (projectSettings.content_type)
|
|
24
|
+
con.log(`Type: ${projectSettings.content_type}`);
|
|
25
|
+
if (projectSettings.length_preference)
|
|
26
|
+
con.log(`Length: ${projectSettings.length_preference.replace(/_/g, ' ')}`);
|
|
27
|
+
if (projectSettings.gender_handling)
|
|
28
|
+
con.log(`Gender: ${projectSettings.gender_handling}`);
|
|
29
|
+
if (projectSettings.brand_name)
|
|
30
|
+
con.log(`Brand: ${projectSettings.brand_name}`);
|
|
31
|
+
if (projectSettings.style_guide) {
|
|
32
|
+
con.log(`Style: ${projectSettings.style_guide}`);
|
|
33
|
+
}
|
|
34
|
+
con.log('');
|
|
35
|
+
con.log(`Source: ${projectSettings.source_language.name} (${projectSettings.source_language.code})`);
|
|
36
|
+
if (projectSettings.target_languages.length > 0) {
|
|
37
|
+
const targets = projectSettings.target_languages.map(l => `${l.name} (${l.code})`).join(', ');
|
|
38
|
+
con.log(`Targets: ${targets}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/commands/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,IAAI,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAcjE,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,OAAwB,EAAE,OAA6B,EAAE;IACtF,MAAM,EACJ,OAAO,EAAE,GAAG,GAAG,MAAM,CAAC,OAAO,EAC7B,WAAW,GAAG,aAAa,EAC3B,SAAS,GAAG,EAAE,SAAS,EAAE,gBAAgB,EAAE,EAC3C,aAAa,GAAG,oBAAoB,EACrC,GAAG,IAAI,CAAC;IAET,MAAM,eAAe,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,CAAC;IACpD,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;QACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,qBAAqB,EAAE,CAAC;IAEzD,MAAM,IAAI,GAAqB,MAAM,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACrE,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC;IAEtC,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC9B,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9B,OAAO;IACT,CAAC;IAED,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,eAAe,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACxD,IAAI,eAAe,CAAC,aAAa;QAAE,GAAG,CAAC,GAAG,CAAC,YAAY,eAAe,CAAC,aAAa,EAAE,CAAC,CAAC;IACxF,IAAI,eAAe,CAAC,YAAY;QAAE,GAAG,CAAC,GAAG,CAAC,YAAY,eAAe,CAAC,YAAY,EAAE,CAAC,CAAC;IACtF,IAAI,eAAe,CAAC,iBAAiB;QAAE,GAAG,CAAC,GAAG,CAAC,YAAY,eAAe,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACnH,IAAI,eAAe,CAAC,eAAe;QAAE,GAAG,CAAC,GAAG,CAAC,YAAY,eAAe,CAAC,eAAe,EAAE,CAAC,CAAC;IAC5F,IAAI,eAAe,CAAC,UAAU;QAAE,GAAG,CAAC,GAAG,CAAC,YAAY,eAAe,CAAC,UAAU,EAAE,CAAC,CAAC;IAClF,IAAI,eAAe,CAAC,WAAW,EAAE,CAAC;QAChC,GAAG,CAAC,GAAG,CAAC,YAAY,eAAe,CAAC,WAAW,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACZ,GAAG,CAAC,GAAG,CAAC,YAAY,eAAe,CAAC,eAAe,CAAC,IAAI,KAAK,eAAe,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,CAAC;IAEtG,IAAI,eAAe,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,eAAe,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9F,GAAG,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
|