jest-runner-cli 0.2.7 → 0.2.8
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 +34 -16
- package/dist/CliRunner.d.ts +2 -2
- package/dist/run.d.ts +5 -6
- package/dist/run.d.ts.map +1 -1
- package/dist/run.js +86 -15
- package/dist/run.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
|
|
7
7
|
> A custom Jest runner with an imperative CLI process helper for testing CLI applications.
|
|
8
8
|
|
|
9
|
-
**jest-runner-cli** is a lightweight
|
|
10
|
-
- A custom Jest runner built with `create-jest-runner` for seamless integration
|
|
9
|
+
**jest-runner-cli** is a lightweight Jest runner package that provides:
|
|
10
|
+
- A custom Jest runner built with `create-jest-runner` for seamless integration with Jest 29.6.1+
|
|
11
11
|
- A `CliRunner` helper class to spawn and interact with child processes in tests
|
|
12
12
|
- Full support for stdout/stderr monitoring, JSON parsing, and process management
|
|
13
13
|
|
|
@@ -20,7 +20,7 @@ Perfect for testing CLI tools, scripts, and command-line applications in your Je
|
|
|
20
20
|
✅ **Flexible Output Reading** — Read stdout as lines, raw text, or parse JSON
|
|
21
21
|
✅ **Auto-Exit Protection** — Automatically detect and terminate hung processes
|
|
22
22
|
✅ **Cross-Platform** — Works on Windows, macOS, and Linux
|
|
23
|
-
✅ **
|
|
23
|
+
✅ **Jest 29+ Compatible** — Fully tested with Jest 29.6.1 through 29.7.0+
|
|
24
24
|
✅ **TypeScript Ready** — Full type definitions included
|
|
25
25
|
|
|
26
26
|
⚠️ **Limitations** — Advanced retry strategies and custom signal handling not yet implemented
|
|
@@ -273,19 +273,28 @@ npm run test:ci
|
|
|
273
273
|
## Technical Details
|
|
274
274
|
|
|
275
275
|
- **Runtime:** Node.js 18+, TypeScript 5.3+
|
|
276
|
-
- **
|
|
277
|
-
- **
|
|
278
|
-
- **Build:** TypeScript compiled to `dist/` folder
|
|
279
|
-
- **No Bundler:** Raw JS output, no webpack or similar
|
|
276
|
+
- **Jest Version:** 29.6.1+ (fully compatible including 29.7.0+)
|
|
277
|
+
- **Module Format:** CommonJS (compatible with ESM via package.json exports)
|
|
278
|
+
- **Build:** TypeScript compiled to `dist/` folder with webpack bundling
|
|
280
279
|
|
|
281
280
|
### Implementation Notes
|
|
282
281
|
|
|
283
|
-
- The Jest runner
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
-
|
|
288
|
-
-
|
|
282
|
+
- **Jest Runner Architecture:** The package exports a Jest custom runner built on `create-jest-runner`. The `run.ts` file implements the `create-jest-runner` run file API, which receives options `{ testPath, globalConfig, config, ... }` and delegates test execution to `jest-circus/runner` — Jest's standard test runner as of version 29+.
|
|
283
|
+
|
|
284
|
+
- **jest-circus Integration:** Starting from Jest 29.6.1+, we use `jest-circus/runner` as the underlying test executor. This avoids direct references to `jest-runner`'s non-public export paths, ensuring compatibility with Node's package `exports` constraints.
|
|
285
|
+
|
|
286
|
+
- **TypeScript Compilation:** TypeScript is compiled with separate configs:
|
|
287
|
+
- `tsconfig.json` — development (no emit, strict mode enabled)
|
|
288
|
+
- `tsconfig.build.json` — build (emits to `dist/`, includes type definitions)
|
|
289
|
+
- Webpack bundling produces the final output as CommonJS for broad compatibility
|
|
290
|
+
|
|
291
|
+
- **CliRunner Implementation:** Based on Node.js `child_process.spawn()` with event-driven stdout/stderr buffering. Auto-exit timeout uses `setTimeout` to detect hung processes and escalates from `SIGINT` to `SIGKILL`.
|
|
292
|
+
|
|
293
|
+
### Compatibility with Jest 29+
|
|
294
|
+
|
|
295
|
+
As of version 0.2.6+, jest-runner-cli is fully compatible with Jest 29.6.1 and later versions, including Jest 29.7.0+. The implementation correctly uses `jest-circus/runner` instead of direct references to `jest-runner`'s private API paths, ensuring it works with Node's strict `exports` constraints.
|
|
296
|
+
|
|
297
|
+
**Issue Fix (v0.2.6+):** Earlier versions referenced `jest-runner/build/runTest.js`, which triggered `ERR_PACKAGE_PATH_NOT_EXPORTED` in Jest 29+ due to Node's package export restrictions. This has been resolved by delegating to the public Jest test runner interface through `jest-circus/runner`.
|
|
289
298
|
|
|
290
299
|
## Troubleshooting
|
|
291
300
|
|
|
@@ -326,10 +335,19 @@ await runner.sendCtrlC(5000);
|
|
|
326
335
|
|
|
327
336
|
## Changelog
|
|
328
337
|
|
|
329
|
-
### v0.2.0 (
|
|
338
|
+
### v0.2.6–0.2.7 (Latest)
|
|
339
|
+
|
|
340
|
+
- ✅ **Fixed:** `ERR_PACKAGE_PATH_NOT_EXPORTED` error with Jest 29.6.1+
|
|
341
|
+
- Changed from `jest-runner` direct API to `jest-circus/runner` for test execution
|
|
342
|
+
- Updated run.ts to use `create-jest-runner` run file API (`{ testPath, globalConfig, config }` signature)
|
|
343
|
+
- Ensured full compatibility with Node's strict package `exports` constraints
|
|
344
|
+
- ✅ Updated integration tests with new run function signature
|
|
345
|
+
- ✅ Added repro test demonstrating Jest 29+ compatibility
|
|
346
|
+
|
|
347
|
+
### v0.2.0
|
|
330
348
|
|
|
331
|
-
- ✅ Refactored to
|
|
332
|
-
- ✅ Integrated with `create-jest-runner` for Jest runner functionality
|
|
349
|
+
- ✅ Refactored to CommonJS module format for broad compatibility
|
|
350
|
+
- ✅ Integrated with `create-jest-runner` for Jest custom runner functionality
|
|
333
351
|
- ✅ Added comprehensive TypeScript type definitions
|
|
334
352
|
- ✅ Added auto-exit timeout feature for hung process detection
|
|
335
353
|
- ✅ Updated test suite with async/await patterns
|
package/dist/CliRunner.d.ts
CHANGED
|
@@ -107,7 +107,7 @@ export declare class CliRunner extends EventEmitter {
|
|
|
107
107
|
* @returns `Promise<string>` または `toLines/toJson/clear` を持つヘルパオブジェクト
|
|
108
108
|
*/
|
|
109
109
|
/**
|
|
110
|
-
*
|
|
110
|
+
* No-arg overload: returns helper object
|
|
111
111
|
*/
|
|
112
112
|
readStdout(): {
|
|
113
113
|
toJson: (_timeout?: number) => Promise<unknown>;
|
|
@@ -116,7 +116,7 @@ export declare class CliRunner extends EventEmitter {
|
|
|
116
116
|
};
|
|
117
117
|
/**
|
|
118
118
|
* 処理名: stdout 一括取得(タイムアウト付き)
|
|
119
|
-
* @param
|
|
119
|
+
* @param _timeout - タイムアウト(ms)
|
|
120
120
|
* @returns stdout 全体を表す Promise<string>
|
|
121
121
|
*/
|
|
122
122
|
readStdout(_timeout: number): Promise<string>;
|
package/dist/run.d.ts
CHANGED
|
@@ -3,12 +3,11 @@ import type { TestResult } from '@jest/test-result';
|
|
|
3
3
|
/**
|
|
4
4
|
* Run file for create-jest-runner.
|
|
5
5
|
* This delegates to jest-circus's runner to execute a test file.
|
|
6
|
-
*
|
|
7
|
-
* @param options -
|
|
8
|
-
* @param options.
|
|
9
|
-
* @param options.
|
|
10
|
-
* @
|
|
11
|
-
* @returns Test result from running the test
|
|
6
|
+
* @param {object} options - Options from create-jest-runner
|
|
7
|
+
* @param {string} options.testPath - Path to the test file to run
|
|
8
|
+
* @param {Config.GlobalConfig} options.globalConfig - Jest global configuration
|
|
9
|
+
* @param {Config.ProjectConfig} options.config - Jest project configuration
|
|
10
|
+
* @returns {Promise<TestResult>} Test result from running the test
|
|
12
11
|
*/
|
|
13
12
|
export default function run(options: {
|
|
14
13
|
testPath: string;
|
package/dist/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;;;;;;GAQG;AAEH,wBAA8B,GAAG,CAAC,OAAO,EAAE;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC,aAAa,CAAC;IAE7B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB,GAAG,OAAO,CAAC,UAAU,CAAC,CA6HtB"}
|
package/dist/run.js
CHANGED
|
@@ -26,34 +26,105 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
26
26
|
/**
|
|
27
27
|
* Run file for create-jest-runner.
|
|
28
28
|
* This delegates to jest-circus's runner to execute a test file.
|
|
29
|
-
*
|
|
30
|
-
* @param options -
|
|
31
|
-
* @param options.
|
|
32
|
-
* @param options.
|
|
33
|
-
* @
|
|
34
|
-
* @returns Test result from running the test
|
|
29
|
+
* @param {object} options - Options from create-jest-runner
|
|
30
|
+
* @param {string} options.testPath - Path to the test file to run
|
|
31
|
+
* @param {Config.GlobalConfig} options.globalConfig - Jest global configuration
|
|
32
|
+
* @param {Config.ProjectConfig} options.config - Jest project configuration
|
|
33
|
+
* @returns {Promise<TestResult>} Test result from running the test
|
|
35
34
|
*/
|
|
35
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity
|
|
36
36
|
async function run(options) {
|
|
37
37
|
const { testPath, globalConfig, config: projectConfig } = options;
|
|
38
38
|
try {
|
|
39
|
-
//
|
|
40
|
-
//
|
|
39
|
+
// jest-circusを使用してテストを実行
|
|
40
|
+
// jest-circus/runnerモジュールから runTest関数を取得
|
|
41
41
|
const jestCircusMod = await Promise.resolve().then(() => __importStar(require('jest-circus/runner')));
|
|
42
42
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
43
43
|
const anyMod = jestCircusMod;
|
|
44
|
-
// jest-circus
|
|
44
|
+
// jest-circusは runTest をデフォルト または名前付きエクスポートで提供
|
|
45
45
|
const runTest = anyMod.runTest ?? anyMod.default;
|
|
46
46
|
if (!runTest || typeof runTest !== 'function') {
|
|
47
47
|
throw new Error('Could not find runTest export from jest-circus/runner');
|
|
48
48
|
}
|
|
49
|
-
// jest-
|
|
50
|
-
|
|
51
|
-
//
|
|
52
|
-
|
|
53
|
-
|
|
49
|
+
// jest-environment-nodeからテスト環境を取得
|
|
50
|
+
const jestEnvironmentMod = await Promise.resolve().then(() => __importStar(require('jest-environment-node')));
|
|
51
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
52
|
+
const environmentClass = jestEnvironmentMod.default ?? jestEnvironmentMod.TestEnvironment;
|
|
53
|
+
if (!environmentClass) {
|
|
54
|
+
throw new Error('Could not find TestEnvironment from jest-environment-node');
|
|
55
|
+
}
|
|
56
|
+
// テスト環境インスタンスを作成
|
|
57
|
+
const environment = new environmentClass({
|
|
58
|
+
globalConfig,
|
|
59
|
+
projectConfig,
|
|
60
|
+
});
|
|
61
|
+
// jest-resolveとModuleMapを使用してResolverを作成
|
|
62
|
+
const jestResolveMod = await Promise.resolve().then(() => __importStar(require('jest-resolve')));
|
|
63
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
64
|
+
const Resolver = jestResolveMod.default;
|
|
65
|
+
// ModuleMapを正しく作成(空のModuleMapを使用)
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
67
|
+
const { ModuleMap } = await Promise.resolve().then(() => __importStar(require('jest-haste-map')));
|
|
68
|
+
// ModuleMap.create()を使用して空のModuleMapインスタンスを作成
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
+
const moduleMap = ModuleMap.create(projectConfig.rootDir || process.cwd());
|
|
71
|
+
// Resolverオプションを構築
|
|
72
|
+
const resolverOptions = {
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
74
|
+
defaultPlatform: projectConfig.haste?.defaultPlatform,
|
|
75
|
+
extensions: (projectConfig.moduleFileExtensions || ['js', 'json', 'node']).map((ext) => ext.startsWith('.') ? ext : '.' + ext),
|
|
76
|
+
hasCoreModules: true,
|
|
77
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
78
|
+
moduleDirectories: projectConfig.moduleDirectories || ['node_modules'],
|
|
79
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
80
|
+
moduleNameMapper: projectConfig.moduleNameMapper,
|
|
81
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
82
|
+
modulePaths: projectConfig.modulePaths,
|
|
83
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
84
|
+
platforms: projectConfig.haste?.platforms || [],
|
|
85
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
86
|
+
rootDir: projectConfig.rootDir || process.cwd(),
|
|
87
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
88
|
+
resolver: projectConfig.resolver
|
|
89
|
+
};
|
|
90
|
+
// Resolverインスタンスを作成(moduleMapと正しいオプションを渡す)
|
|
91
|
+
const resolver = new Resolver(moduleMap, resolverOptions);
|
|
92
|
+
// @jest/transformからScriptTransformerを作成
|
|
93
|
+
const transformMod = await Promise.resolve().then(() => __importStar(require('@jest/transform')));
|
|
94
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
95
|
+
const { createScriptTransformer } = transformMod;
|
|
96
|
+
if (!createScriptTransformer) {
|
|
97
|
+
throw new Error('Could not find createScriptTransformer from @jest/transform');
|
|
98
|
+
}
|
|
99
|
+
// ScriptTransformerインスタンスを作成
|
|
100
|
+
const transformer = await createScriptTransformer(projectConfig);
|
|
101
|
+
// jest-runtimeを取得
|
|
102
|
+
const jestRuntimeMod = await Promise.resolve().then(() => __importStar(require('jest-runtime')));
|
|
103
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
104
|
+
const Runtime = jestRuntimeMod.default ?? jestRuntimeMod;
|
|
105
|
+
// jest-runnerの実装を参考に、Runtimeコンストラクタの全8パラメータを正しく渡す
|
|
106
|
+
const cacheFS = new Map();
|
|
107
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
108
|
+
const coverageOptions = {
|
|
109
|
+
changedFiles: undefined,
|
|
110
|
+
collectCoverage: globalConfig.collectCoverage ?? false,
|
|
111
|
+
collectCoverageFrom: globalConfig.collectCoverageFrom,
|
|
112
|
+
coverageProvider: globalConfig.coverageProvider,
|
|
113
|
+
sourcesRelatedToTestsInChangedFiles: undefined,
|
|
114
|
+
};
|
|
115
|
+
// Runtime(config, environment, resolver, transformer, cacheFS, coverageOptions, testPath, globalConfig)
|
|
116
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
117
|
+
const runtime = new Runtime(projectConfig, environment, resolver, transformer, cacheFS, coverageOptions, testPath, globalConfig);
|
|
118
|
+
// runtimeが正しく初期化されているか確認
|
|
119
|
+
if (!runtime || typeof runtime.requireInternalModule !== 'function') {
|
|
120
|
+
throw new Error('Failed to properly initialize jest-runtime');
|
|
121
|
+
}
|
|
122
|
+
// jestAdapterのシグネチャ: async (globalConfig, config, environment, runtime, testPath, sendMessageToJest?)
|
|
123
|
+
// パラメータ順: globalConfig, config, environment, runtime, testPath
|
|
124
|
+
return await runTest(globalConfig, projectConfig, environment, runtime, testPath);
|
|
54
125
|
}
|
|
55
126
|
catch (error) {
|
|
56
|
-
//
|
|
127
|
+
// jest-circusが失敗した場合、失敗したテスト結果を返す
|
|
57
128
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
58
129
|
console.error(`jest-runner-cli failed to run ${testPath}: ${errorMessage}`);
|
|
59
130
|
throw error;
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAGA
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAGA;;;;;;;;GAQG;AACH,wDAAwD;AACzC,KAAK,UAAU,GAAG,CAAC,OAMjC;IACC,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAElE,IAAI,CAAC;QACH,yBAAyB;QACzB,yCAAyC;QACzC,MAAM,aAAa,GAAG,wDAAa,oBAAoB,GAAC,CAAC;QACzD,8DAA8D;QAC9D,MAAM,MAAM,GAAQ,aAAa,CAAC;QAElC,+CAA+C;QAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;QAEjD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QAED,kCAAkC;QAClC,MAAM,kBAAkB,GAAG,wDAAa,uBAAuB,GAAC,CAAC;QACjE,8DAA8D;QAC9D,MAAM,gBAAgB,GAAQ,kBAAkB,CAAC,OAAO,IAAK,kBAA0B,CAAC,eAAe,CAAC;QAExG,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QAED,iBAAiB;QACjB,MAAM,WAAW,GAAG,IAAI,gBAAgB,CAAC;YACvC,YAAY;YACZ,aAAa;SACd,CAAC,CAAC;QAEH,yCAAyC;QACzC,MAAM,cAAc,GAAG,wDAAa,cAAc,GAAC,CAAC;QACpD,8DAA8D;QAC9D,MAAM,QAAQ,GAAQ,cAAc,CAAC,OAAO,CAAC;QAE7C,kCAAkC;QAClC,8DAA8D;QAC9D,MAAM,EAAE,SAAS,EAAE,GAAQ,wDAAa,gBAAgB,GAAC,CAAC;QAE1D,8CAA8C;QAC9C,8DAA8D;QAC9D,MAAM,SAAS,GAAG,SAAS,CAAC,MAAM,CAAE,aAAqB,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAEpF,mBAAmB;QACnB,MAAM,eAAe,GAAG;YACtB,8DAA8D;YAC9D,eAAe,EAAG,aAAqB,CAAC,KAAK,EAAE,eAAe;YAC9D,UAAU,EAAE,CAAC,aAAa,CAAC,oBAAoB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAC5E,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CACvD;YACD,cAAc,EAAE,IAAI;YACpB,8DAA8D;YAC9D,iBAAiB,EAAG,aAAqB,CAAC,iBAAiB,IAAI,CAAC,cAAc,CAAC;YAC/E,8DAA8D;YAC9D,gBAAgB,EAAG,aAAqB,CAAC,gBAAgB;YACzD,8DAA8D;YAC9D,WAAW,EAAG,aAAqB,CAAC,WAAW;YAC/C,8DAA8D;YAC9D,SAAS,EAAG,aAAqB,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE;YACxD,8DAA8D;YAC9D,OAAO,EAAG,aAAqB,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,EAAE;YACxD,8DAA8D;YAC9D,QAAQ,EAAG,aAAqB,CAAC,QAAQ;SAC1C,CAAC;QAEF,2CAA2C;QAC3C,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;QAE1D,wCAAwC;QACxC,MAAM,YAAY,GAAG,wDAAa,iBAAiB,GAAC,CAAC;QACrD,8DAA8D;QAC9D,MAAM,EAAE,uBAAuB,EAAE,GAAQ,YAAY,CAAC;QAEtD,IAAI,CAAC,uBAAuB,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAC;QACjF,CAAC;QAED,6BAA6B;QAC7B,MAAM,WAAW,GAAG,MAAM,uBAAuB,CAAC,aAAa,CAAC,CAAC;QAEjE,kBAAkB;QAClB,MAAM,cAAc,GAAG,wDAAa,cAAc,GAAC,CAAC;QACpD,8DAA8D;QAC9D,MAAM,OAAO,GAAQ,cAAc,CAAC,OAAO,IAAI,cAAc,CAAC;QAE9D,kDAAkD;QAClD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC1C,8DAA8D;QAC9D,MAAM,eAAe,GAAQ;YAC3B,YAAY,EAAE,SAAS;YACvB,eAAe,EAAE,YAAY,CAAC,eAAe,IAAI,KAAK;YACtD,mBAAmB,EAAE,YAAY,CAAC,mBAAmB;YACrD,gBAAgB,EAAE,YAAY,CAAC,gBAAgB;YAC/C,mCAAmC,EAAE,SAAS;SAC/C,CAAC;QAEF,wGAAwG;QACxG,8DAA8D;QAC9D,MAAM,OAAO,GAAQ,IAAI,OAAO,CAC9B,aAAa,EACb,WAAW,EACX,QAAQ,EACR,WAAW,EACX,OAAO,EACP,eAAe,EACf,QAAQ,EACR,YAAY,CACb,CAAC;QAEF,yBAAyB;QACzB,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,CAAC,qBAAqB,KAAK,UAAU,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,CAAC;QAED,sGAAsG;QACtG,+DAA+D;QAC/D,OAAO,MAAM,OAAO,CAAC,YAAY,EAAE,aAAa,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACpF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,kCAAkC;QAClC,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,OAAO,CAAC,KAAK,CAAC,iCAAiC,QAAQ,KAAK,YAAY,EAAE,CAAC,CAAC;QAC5E,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAnID,sBAmIC"}
|