kodu 1.1.2 → 1.1.4
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/.prettierrc +4 -0
- package/AGENTS.md +97 -0
- package/README.md +85 -100
- package/biome.json +50 -0
- package/dist/app.module.d.ts +2 -0
- package/dist/app.module.js +42 -0
- package/dist/app.module.js.map +1 -0
- package/dist/commands/clean/clean.command.d.ts +16 -0
- package/dist/commands/clean/clean.command.js +88 -0
- package/dist/commands/clean/clean.command.js.map +1 -0
- package/dist/commands/clean/clean.module.d.ts +2 -0
- package/dist/commands/clean/clean.module.js +25 -0
- package/dist/commands/clean/clean.module.js.map +1 -0
- package/dist/commands/commit/commit.command.d.ts +18 -0
- package/dist/commands/commit/commit.command.js +135 -0
- package/dist/commands/commit/commit.command.js.map +1 -0
- package/dist/commands/commit/commit.module.d.ts +2 -0
- package/dist/commands/commit/commit.module.js +25 -0
- package/dist/commands/commit/commit.module.js.map +1 -0
- package/dist/commands/init/init.command.d.ts +14 -0
- package/dist/commands/init/init.command.js +166 -0
- package/dist/commands/init/init.command.js.map +1 -0
- package/dist/commands/init/init.module.d.ts +2 -0
- package/dist/commands/init/init.module.js +22 -0
- package/dist/commands/init/init.module.js.map +1 -0
- package/dist/commands/pack/pack.command.d.ts +25 -0
- package/dist/commands/pack/pack.command.js +161 -0
- package/dist/commands/pack/pack.command.js.map +1 -0
- package/dist/commands/pack/pack.module.d.ts +2 -0
- package/dist/commands/pack/pack.module.js +25 -0
- package/dist/commands/pack/pack.module.js.map +1 -0
- package/dist/commands/review/review.command.d.ts +31 -0
- package/dist/commands/review/review.command.js +260 -0
- package/dist/commands/review/review.command.js.map +1 -0
- package/dist/commands/review/review.module.d.ts +2 -0
- package/dist/commands/review/review.module.js +26 -0
- package/dist/commands/review/review.module.js.map +1 -0
- package/dist/core/config/config.module.d.ts +2 -0
- package/dist/core/config/config.module.js +22 -0
- package/dist/core/config/config.module.js.map +1 -0
- package/dist/core/config/config.schema.d.ts +16 -0
- package/dist/core/config/config.schema.js +48 -0
- package/dist/core/config/config.schema.js.map +1 -0
- package/dist/core/config/config.service.d.ts +7 -0
- package/dist/core/config/config.service.js +51 -0
- package/dist/core/config/config.service.js.map +1 -0
- package/dist/core/config/config.types.d.ts +1 -0
- package/dist/core/config/config.types.js +3 -0
- package/dist/core/config/config.types.js.map +1 -0
- package/dist/core/file-system/fs.module.d.ts +2 -0
- package/dist/core/file-system/fs.module.js +21 -0
- package/dist/core/file-system/fs.module.js.map +1 -0
- package/dist/core/file-system/fs.service.d.ts +8 -0
- package/dist/core/file-system/fs.service.js +62 -0
- package/dist/core/file-system/fs.service.js.map +1 -0
- package/dist/core/ui/ui.module.d.ts +2 -0
- package/dist/core/ui/ui.module.js +22 -0
- package/dist/core/ui/ui.module.js.map +1 -0
- package/dist/core/ui/ui.service.d.ts +22 -0
- package/dist/core/ui/ui.service.js +43 -0
- package/dist/core/ui/ui.service.js.map +1 -0
- package/dist/main.d.ts +2 -0
- package/dist/main.js +10 -0
- package/dist/main.js.map +1 -0
- package/dist/shared/ai/ai.module.d.ts +2 -0
- package/dist/shared/ai/ai.module.js +23 -0
- package/dist/shared/ai/ai.module.js.map +1 -0
- package/dist/shared/ai/ai.service.d.ts +27 -0
- package/dist/shared/ai/ai.service.js +126 -0
- package/dist/shared/ai/ai.service.js.map +1 -0
- package/dist/shared/cleaner/cleaner.service.d.ts +18 -0
- package/dist/shared/cleaner/cleaner.service.js +187 -0
- package/dist/shared/cleaner/cleaner.service.js.map +1 -0
- package/dist/shared/cleaner/cleaner.types.d.ts +14 -0
- package/dist/shared/cleaner/cleaner.types.js +3 -0
- package/dist/shared/cleaner/cleaner.types.js.map +1 -0
- package/dist/shared/git/git.module.d.ts +2 -0
- package/dist/shared/git/git.module.js +23 -0
- package/dist/shared/git/git.module.js.map +1 -0
- package/dist/shared/git/git.service.d.ts +11 -0
- package/dist/shared/git/git.service.js +61 -0
- package/dist/shared/git/git.service.js.map +1 -0
- package/dist/shared/tokenizer/tokenizer.module.d.ts +2 -0
- package/dist/shared/tokenizer/tokenizer.module.js +23 -0
- package/dist/shared/tokenizer/tokenizer.module.js.map +1 -0
- package/dist/shared/tokenizer/tokenizer.service.d.ts +15 -0
- package/dist/shared/tokenizer/tokenizer.service.js +59 -0
- package/dist/shared/tokenizer/tokenizer.service.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/docs/plan.md +92 -0
- package/docs/project_charter.md +92 -0
- package/docs/todo.md +5 -0
- package/knip.json +10 -0
- package/kodu.json +22 -0
- package/nest-cli.json +8 -0
- package/package.json +41 -41
- package/src/app.module.ts +29 -0
- package/src/commands/clean/clean.command.ts +83 -0
- package/src/commands/clean/clean.module.ts +12 -0
- package/src/commands/commit/commit.command.ts +120 -0
- package/src/commands/commit/commit.module.ts +12 -0
- package/src/commands/init/init.command.ts +193 -0
- package/src/commands/init/init.module.ts +9 -0
- package/src/commands/pack/pack.command.ts +167 -0
- package/src/commands/pack/pack.module.ts +12 -0
- package/src/commands/review/review.command.ts +266 -0
- package/src/commands/review/review.module.ts +13 -0
- package/src/core/config/config.module.ts +9 -0
- package/src/core/config/config.schema.ts +50 -0
- package/src/core/config/config.service.ts +46 -0
- package/src/core/config/config.types.ts +1 -0
- package/src/core/file-system/fs.module.ts +8 -0
- package/src/core/file-system/fs.service.ts +44 -0
- package/src/core/ui/ui.module.ts +9 -0
- package/src/core/ui/ui.service.ts +39 -0
- package/src/main.ts +9 -0
- package/src/shared/ai/ai.module.ts +10 -0
- package/src/shared/ai/ai.service.ts +160 -0
- package/src/shared/cleaner/cleaner.service.ts +227 -0
- package/src/shared/cleaner/cleaner.types.ts +16 -0
- package/src/shared/git/git.module.ts +10 -0
- package/src/shared/git/git.service.ts +49 -0
- package/src/shared/tokenizer/tokenizer.module.ts +10 -0
- package/src/shared/tokenizer/tokenizer.service.ts +54 -0
- package/tsconfig.build.json +4 -0
- package/tsconfig.json +25 -0
- package/LICENSE +0 -21
- package/dist/index.js +0 -146
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.GitService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const execa_1 = require("execa");
|
|
15
|
+
const config_service_1 = require("../../core/config/config.service");
|
|
16
|
+
const EXCLUDE_PREFIX = ':(exclude)';
|
|
17
|
+
let GitService = class GitService {
|
|
18
|
+
configService;
|
|
19
|
+
constructor(configService) {
|
|
20
|
+
this.configService = configService;
|
|
21
|
+
}
|
|
22
|
+
async ensureRepo() {
|
|
23
|
+
try {
|
|
24
|
+
await (0, execa_1.execa)('git', ['rev-parse', '--is-inside-work-tree']);
|
|
25
|
+
}
|
|
26
|
+
catch (error) {
|
|
27
|
+
const message = error instanceof Error && 'stdout' in error
|
|
28
|
+
? String(error.stderr ?? error.message)
|
|
29
|
+
: 'Git репозиторий не найден. Инициализируйте git перед выполнением команды.';
|
|
30
|
+
throw new Error(message);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async hasStagedChanges() {
|
|
34
|
+
const { stdout } = await (0, execa_1.execa)('git', ['diff', '--staged', '--name-only']);
|
|
35
|
+
return stdout.trim().length > 0;
|
|
36
|
+
}
|
|
37
|
+
async getStagedDiff() {
|
|
38
|
+
await this.ensureRepo();
|
|
39
|
+
const excludeArgs = this.buildExcludeArgs();
|
|
40
|
+
const args = ['diff', '--staged', '--unified=3', '--', '.', ...excludeArgs];
|
|
41
|
+
const { stdout } = await (0, execa_1.execa)('git', args);
|
|
42
|
+
return stdout;
|
|
43
|
+
}
|
|
44
|
+
async getStatusShort() {
|
|
45
|
+
const { stdout } = await (0, execa_1.execa)('git', ['status', '--short']);
|
|
46
|
+
return stdout.trim();
|
|
47
|
+
}
|
|
48
|
+
async commit(message) {
|
|
49
|
+
await (0, execa_1.execa)('git', ['commit', '-m', message]);
|
|
50
|
+
}
|
|
51
|
+
buildExcludeArgs() {
|
|
52
|
+
const ignore = this.configService.getConfig().packer.ignore ?? [];
|
|
53
|
+
return ignore.map((pattern) => `${EXCLUDE_PREFIX}${pattern}`);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
exports.GitService = GitService;
|
|
57
|
+
exports.GitService = GitService = __decorate([
|
|
58
|
+
(0, common_1.Injectable)(),
|
|
59
|
+
__metadata("design:paramtypes", [config_service_1.ConfigService])
|
|
60
|
+
], GitService);
|
|
61
|
+
//# sourceMappingURL=git.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git.service.js","sourceRoot":"","sources":["../../../src/shared/git/git.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,iCAA8B;AAC9B,qEAAiE;AAEjE,MAAM,cAAc,GAAG,YAAY,CAAC;AAG7B,IAAM,UAAU,GAAhB,MAAM,UAAU;IACQ;IAA7B,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAE7D,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,MAAM,IAAA,aAAK,EAAC,KAAK,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,IAAI,QAAQ,IAAI,KAAK;gBACzC,CAAC,CAAC,MAAM,CAAE,KAA6B,CAAC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC;gBAChE,CAAC,CAAC,2EAA2E,CAAC;YAClF,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,gBAAgB;QACpB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,aAAK,EAAC,KAAK,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;QAC3E,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,WAAW,CAAC,CAAC;QAC5E,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,aAAK,EAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC5C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,cAAc;QAClB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,IAAA,aAAK,EAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAe;QAC1B,MAAM,IAAA,aAAK,EAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAChD,CAAC;IAEO,gBAAgB;QACtB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;QAClE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,cAAc,GAAG,OAAO,EAAE,CAAC,CAAC;IAChE,CAAC;CACF,CAAA;AAzCY,gCAAU;qBAAV,UAAU;IADtB,IAAA,mBAAU,GAAE;qCAEiC,8BAAa;GAD9C,UAAU,CAyCtB"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.TokenizerModule = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const config_module_1 = require("../../core/config/config.module");
|
|
12
|
+
const tokenizer_service_1 = require("./tokenizer.service");
|
|
13
|
+
let TokenizerModule = class TokenizerModule {
|
|
14
|
+
};
|
|
15
|
+
exports.TokenizerModule = TokenizerModule;
|
|
16
|
+
exports.TokenizerModule = TokenizerModule = __decorate([
|
|
17
|
+
(0, common_1.Module)({
|
|
18
|
+
imports: [config_module_1.ConfigModule],
|
|
19
|
+
providers: [tokenizer_service_1.TokenizerService],
|
|
20
|
+
exports: [tokenizer_service_1.TokenizerService],
|
|
21
|
+
})
|
|
22
|
+
], TokenizerModule);
|
|
23
|
+
//# sourceMappingURL=tokenizer.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.module.js","sourceRoot":"","sources":["../../../src/shared/tokenizer/tokenizer.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AACxC,mEAA+D;AAC/D,2DAAuD;AAOhD,IAAM,eAAe,GAArB,MAAM,eAAe;CAAG,CAAA;AAAlB,0CAAe;0BAAf,eAAe;IAL3B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,4BAAY,CAAC;QACvB,SAAS,EAAE,CAAC,oCAAgB,CAAC;QAC7B,OAAO,EAAE,CAAC,oCAAgB,CAAC;KAC5B,CAAC;GACW,eAAe,CAAG"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ConfigService } from '../../core/config/config.service';
|
|
2
|
+
type TokenEstimate = {
|
|
3
|
+
tokens: number;
|
|
4
|
+
usdEstimate: number;
|
|
5
|
+
};
|
|
6
|
+
export declare class TokenizerService {
|
|
7
|
+
private readonly configService;
|
|
8
|
+
private encoder?;
|
|
9
|
+
constructor(configService: ConfigService);
|
|
10
|
+
count(text: string): TokenEstimate;
|
|
11
|
+
private getPricePerMillion;
|
|
12
|
+
private createEncoder;
|
|
13
|
+
private getEncoder;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.TokenizerService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const js_tiktoken_1 = require("js-tiktoken");
|
|
15
|
+
const config_service_1 = require("../../core/config/config.service");
|
|
16
|
+
const PRICE_PER_MILLION = {
|
|
17
|
+
'gpt-4o': 2.5,
|
|
18
|
+
'gpt-4o-mini': 0.15,
|
|
19
|
+
o1: 15,
|
|
20
|
+
};
|
|
21
|
+
let TokenizerService = class TokenizerService {
|
|
22
|
+
configService;
|
|
23
|
+
encoder;
|
|
24
|
+
constructor(configService) {
|
|
25
|
+
this.configService = configService;
|
|
26
|
+
}
|
|
27
|
+
count(text) {
|
|
28
|
+
const tokens = this.getEncoder().encode(text).length;
|
|
29
|
+
const price = this.getPricePerMillion();
|
|
30
|
+
const usdEstimate = price > 0 ? (tokens / 1_000_000) * price : 0;
|
|
31
|
+
return { tokens, usdEstimate };
|
|
32
|
+
}
|
|
33
|
+
getPricePerMillion() {
|
|
34
|
+
const model = this.configService.getConfig().llm.model;
|
|
35
|
+
const key = model.toLowerCase();
|
|
36
|
+
return PRICE_PER_MILLION[key] ?? 0;
|
|
37
|
+
}
|
|
38
|
+
createEncoder() {
|
|
39
|
+
const model = this.configService.getConfig().llm.model;
|
|
40
|
+
try {
|
|
41
|
+
return (0, js_tiktoken_1.encodingForModel)(model);
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
return (0, js_tiktoken_1.encodingForModel)('gpt-4o');
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
getEncoder() {
|
|
48
|
+
if (!this.encoder) {
|
|
49
|
+
this.encoder = this.createEncoder();
|
|
50
|
+
}
|
|
51
|
+
return this.encoder;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
exports.TokenizerService = TokenizerService;
|
|
55
|
+
exports.TokenizerService = TokenizerService = __decorate([
|
|
56
|
+
(0, common_1.Injectable)(),
|
|
57
|
+
__metadata("design:paramtypes", [config_service_1.ConfigService])
|
|
58
|
+
], TokenizerService);
|
|
59
|
+
//# sourceMappingURL=tokenizer.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenizer.service.js","sourceRoot":"","sources":["../../../src/shared/tokenizer/tokenizer.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,6CAAmE;AACnE,qEAAiE;AAOjE,MAAM,iBAAiB,GAA2B;IAChD,QAAQ,EAAE,GAAG;IACb,aAAa,EAAE,IAAI;IACnB,EAAE,EAAE,EAAE;CACP,CAAC;AAGK,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAGE;IAFrB,OAAO,CAAuC;IAEtD,YAA6B,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IAAG,CAAC;IAE7D,KAAK,CAAC,IAAY;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,SAAS,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAEjE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACjC,CAAC;IAEO,kBAAkB;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;QACvD,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAChC,OAAO,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;IAEO,aAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;QAEvD,IAAI,CAAC;YACH,OAAO,IAAA,8BAAgB,EAAC,KAAsB,CAAC,CAAC;QAClD,CAAC;QAAC,MAAM,CAAC;YAEP,OAAO,IAAA,8BAAgB,EAAC,QAAQ,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAEO,UAAU;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF,CAAA;AArCY,4CAAgB;2BAAhB,gBAAgB;IAD5B,IAAA,mBAAU,GAAE;qCAIiC,8BAAa;GAH9C,gBAAgB,CAqC5B"}
|