halfcycle 0.4.18 → 0.5.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.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +6 -3
- package/bin/bin.bundle.mjs +1557 -629
- package/bin/pre-tool-use-filter.sh +12 -0
- package/dist/banner-facts.d.ts +11 -1
- package/dist/banner-facts.d.ts.map +1 -1
- package/dist/bin.js +0 -0
- package/dist/check-tasks.d.ts +23 -11
- package/dist/check-tasks.d.ts.map +1 -1
- package/dist/claude-version-probe.d.ts +27 -3
- package/dist/claude-version-probe.d.ts.map +1 -1
- package/dist/cli.js +1431 -97
- package/dist/cli.js.map +3 -3
- package/dist/codex-install-lines.d.ts +72 -0
- package/dist/codex-install-lines.d.ts.map +1 -0
- package/dist/doctor.d.ts +5 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/index.js +1077 -24
- package/dist/index.js.map +3 -3
- package/dist/install-manifest.d.ts +41 -0
- package/dist/install-manifest.d.ts.map +1 -1
- package/dist/install-plan.d.ts +5 -1
- package/dist/install-plan.d.ts.map +1 -1
- package/dist/install.d.ts +395 -10
- package/dist/install.d.ts.map +1 -1
- package/dist/merge-settings.d.ts +56 -0
- package/dist/merge-settings.d.ts.map +1 -1
- package/dist/node-floor.d.ts +12 -3
- package/dist/node-floor.d.ts.map +1 -1
- package/dist/toml-lines.d.ts +59 -0
- package/dist/toml-lines.d.ts.map +1 -0
- package/dist/uninstall.d.ts +3 -1
- package/dist/uninstall.d.ts.map +1 -1
- package/package.json +13 -12
|
@@ -9,6 +9,7 @@ halfcycle_pt_skip() {
|
|
|
9
9
|
case $hc_t in [0-9]*[.,][0-9][0-9][0-9]*) ;; *) return 1 ;; esac
|
|
10
10
|
hc_pt_live_text= hc_pt_live_sid= hc_pt_live_agent= hc_pt_live_dir=
|
|
11
11
|
hc_pt_own_file= hc_pt_own_agent_id= hc_pt_own_tool_use_id=
|
|
12
|
+
halfcycle_pt_agent "$@" || return 1
|
|
12
13
|
halfcycle_pt_quiet || return 1
|
|
13
14
|
halfcycle_pt_live || return 1
|
|
14
15
|
halfcycle_pt_own_copy || return 1
|
|
@@ -17,6 +18,12 @@ halfcycle_pt_skip() {
|
|
|
17
18
|
halfcycle_pt_own_write "$hc_t"
|
|
18
19
|
return 0
|
|
19
20
|
}
|
|
21
|
+
halfcycle_pt_agent() {
|
|
22
|
+
hc_pt_agent=
|
|
23
|
+
[ "$#" -le 2 ] && return 0
|
|
24
|
+
[ "$#" -eq 4 ] && [ "$3" = --agent ] && [ "$4" = codex ] && { hc_pt_agent=codex; return 0; }
|
|
25
|
+
return 1
|
|
26
|
+
}
|
|
20
27
|
halfcycle_pt_own_read() {
|
|
21
28
|
local LC_ALL=C hc_val hc_dir hc_re='^[A-Za-z0-9_-]{1,128}$'
|
|
22
29
|
halfcycle_pt_string tool_name || return 1
|
|
@@ -152,6 +159,11 @@ halfcycle_pt_quiet_input() {
|
|
|
152
159
|
case $hc_input in *$'\xe2\x84\xaa'*) return 1 ;; esac
|
|
153
160
|
halfcycle_pt_string tool_name || return 1
|
|
154
161
|
hc_tool=$hc_val
|
|
162
|
+
case ${hc_pt_agent:-} in
|
|
163
|
+
'') ;;
|
|
164
|
+
codex) case $hc_tool in Bash) ;; *) return 1 ;; esac ;;
|
|
165
|
+
*) return 1 ;;
|
|
166
|
+
esac
|
|
155
167
|
case $hc_input in *'"tool_input":{'*) ;; *) return 1 ;; esac
|
|
156
168
|
halfcycle_pt_once '"tool_input"' || return 1
|
|
157
169
|
case $hc_tool in
|
package/dist/banner-facts.d.ts
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
*
|
|
19
19
|
* INV-001: Node builtins and modules inside this package only.
|
|
20
20
|
*/
|
|
21
|
-
import { type ClaudeVersionProbeDeps } from './claude-version-probe.js';
|
|
21
|
+
import { type ClaudeVersionProbeDeps, type CodexVersionProbeDeps } from './claude-version-probe.js';
|
|
22
22
|
import { type BannerContent } from './banner.js';
|
|
23
23
|
/**
|
|
24
24
|
* The brand's front door.
|
|
@@ -57,11 +57,21 @@ export declare function bundleVersion(): string | undefined;
|
|
|
57
57
|
* call rather than depending on this actually running on Windows.
|
|
58
58
|
*/
|
|
59
59
|
export declare function claudeCodeVersion(deps?: ClaudeVersionProbeDeps): string | undefined;
|
|
60
|
+
/**
|
|
61
|
+
* The locally installed Codex version, or `undefined` — Codex's own twin of
|
|
62
|
+
* `claudeCodeVersion` (`codex-install-target` AC6, T-16). Same reasoning: `codex` missing
|
|
63
|
+
* from PATH is ordinary, not a fault, so a desktop-only developer sees one fewer row
|
|
64
|
+
* rather than a warning. Goes through `probeCodexVersion` (`claude-version-probe.ts`),
|
|
65
|
+
* which runs `codex.cmd` through `cmd.exe` on Windows.
|
|
66
|
+
*/
|
|
67
|
+
export declare function codexVersion(deps?: CodexVersionProbeDeps): string | undefined;
|
|
60
68
|
/** Everything the fact collector is allowed to reach outside itself, so a test can hand it
|
|
61
69
|
* a world instead of standing in one. */
|
|
62
70
|
export interface FactProbes {
|
|
63
71
|
readonly bundleVersion: () => string | undefined;
|
|
64
72
|
readonly claudeCodeVersion: () => string | undefined;
|
|
73
|
+
/** Beside `claudeCodeVersion` (`codex-install-target` AC6): the `Codex` row. */
|
|
74
|
+
readonly codexVersion: () => string | undefined;
|
|
65
75
|
readonly projectName: (dir: string) => string | undefined;
|
|
66
76
|
readonly commitCount: (dir: string) => number | null;
|
|
67
77
|
readonly installedVersion: (dir: string) => string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"banner-facts.d.ts","sourceRoot":"","sources":["../src/banner-facts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAQH,OAAO,
|
|
1
|
+
{"version":3,"file":"banner-facts.d.ts","sourceRoot":"","sources":["../src/banner-facts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAQH,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAkB,KAAK,aAAa,EAAmB,MAAM,aAAa,CAAC;AAElF;;;;;;;;;GASG;AACH,eAAO,MAAM,SAAS,iBAAiB,CAAC;AAExC;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,EAAE,SAAS,MAAM,EAGpC,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,cAAc,EAAE,SAAS,MAAM,EAI3C,CAAC;AAEF,iFAAiF;AACjF,wBAAgB,aAAa,IAAI,MAAM,GAAG,SAAS,CAOlD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,sBAA2B,GAAG,MAAM,GAAG,SAAS,CAEvF;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,GAAE,qBAA0B,GAAG,MAAM,GAAG,SAAS,CAEjF;AAED;0CAC0C;AAC1C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,iBAAiB,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IACrD,gFAAgF;IAChF,QAAQ,CAAC,YAAY,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;IAChD,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC1D,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACrD,QAAQ,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;IAC/D,4EAA4E;IAC5E,QAAQ,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,KAAK,MAAM,GAAG,SAAS,CAAC;CACtE;AAED,2FAA2F;AAC3F,eAAO,MAAM,WAAW,EAAE,UAsCzB,CAAC;AAQF;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,MAAM,GAAE,UAAwB,GAC/B,aAAa,CAyCf"}
|
package/dist/bin.js
CHANGED
|
File without changes
|
package/dist/check-tasks.d.ts
CHANGED
|
@@ -2,13 +2,12 @@
|
|
|
2
2
|
* `npx halfcycle@latest check-tasks <phase> [--with-task-list] [--repo <root>]`
|
|
3
3
|
* (`collision-free-parallel-work` AC3; `checks-as-work-lands` AC3, AC6).
|
|
4
4
|
*
|
|
5
|
-
* OFFLINE, ALWAYS. This verb reads at most
|
|
6
|
-
* `docs/build-records/task-plan.json` and, with
|
|
7
|
-
* `docs/build-records/build-tasks.json` — and nothing else. It opens no credential
|
|
5
|
+
* OFFLINE, ALWAYS. This verb reads at most three files on the person's own machine —
|
|
6
|
+
* `docs/build-records/task-plan.json`, `docs/system.json` when it is there, and, with
|
|
7
|
+
* `--with-task-list`, `docs/build-records/build-tasks.json` — and nothing else. It opens no credential
|
|
8
8
|
* file, makes no network call, and needs no sign-in. Everything it prints comes from
|
|
9
9
|
* `checkTaskPlan` (`@halfcycle/core`), which is pure: this module's whole job is
|
|
10
|
-
* reading the
|
|
11
|
-
* returns.
|
|
10
|
+
* reading the files, handing them to that function, and printing what it returns.
|
|
12
11
|
*
|
|
13
12
|
* ONE HOME FOR THE PLAN'S SHAPE AND ITS RULES (INV-003): `taskPlanSchema`,
|
|
14
13
|
* `taskListFileSchema`, `checkTaskPlan` and every line it prints live in
|
|
@@ -28,8 +27,20 @@
|
|
|
28
27
|
* otherwise clean plan. A plan file in the same state is always a hard failure (exit
|
|
29
28
|
* 2), because the plan is this verb's one required input.
|
|
30
29
|
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
30
|
+
* THE SYSTEM DESCRIPTION NAMES THE PARTS (O7, `collision-free-parallel-work` as
|
|
31
|
+
* amended 2026-10-30). When `docs/system.json` is there, it is read and checked by
|
|
32
|
+
* the system verb's own reader and check (`readDescriptionFile`,
|
|
33
|
+
* `checkSystemDescription`), never a second parser, and its part ids go to
|
|
34
|
+
* `checkTaskPlan`, which asks every build task to name the parts it builds. No file,
|
|
35
|
+
* no rule: there is nothing to name. A file that is there but unreadable, not JSON,
|
|
36
|
+
* or that fails its own check stops the run with exit 2, naming the file and each
|
|
37
|
+
* problem, exactly as an unparsable plan does: a plan cannot be checked against a
|
|
38
|
+
* description that is broken, and passing it silently would let through the very
|
|
39
|
+
* plan this rule exists to catch.
|
|
40
|
+
*
|
|
41
|
+
* SHIPS TO CLIENT DISK inside the CLI (INV-001: Node builtins, `@halfcycle/core` and
|
|
42
|
+
* `@halfcycle/events` only, the latter for the description's path and check; no
|
|
43
|
+
* network and no `fetch`). Every string here is
|
|
33
44
|
* a sentence a person reads in their own terminal, so none names an internal
|
|
34
45
|
* register, a route, or this project's own tooling; no comment sits beside an
|
|
35
46
|
* object member.
|
|
@@ -57,14 +68,15 @@ export interface CheckTasksRun {
|
|
|
57
68
|
readonly exitCode: number;
|
|
58
69
|
}
|
|
59
70
|
/**
|
|
60
|
-
* The whole verb. Reads `docs/build-records/task-plan.json` under `repoRoot`,
|
|
61
|
-
*
|
|
71
|
+
* The whole verb. Reads `docs/build-records/task-plan.json` under `repoRoot`,
|
|
72
|
+
* `docs/system.json` when it is there, and, with `withTaskList`,
|
|
73
|
+
* `docs/build-records/build-tasks.json`; hands them to
|
|
62
74
|
* `checkTaskPlan` and prints its lines, one per line, in the order it returns them,
|
|
63
75
|
* or `checkTaskPlan`'s own clear line when there is nothing to report. Never throws.
|
|
64
76
|
*
|
|
65
77
|
* Exit 0 when nothing refuses, 1 when anything does, 2 when the plan file is
|
|
66
|
-
* missing or
|
|
67
|
-
* shape this tool reads (naming which file, and where). A missing task list is not
|
|
78
|
+
* missing or any file it reads cannot be read or parsed as JSON or does not match
|
|
79
|
+
* the shape this tool reads (naming which file, and where). A missing task list is not
|
|
68
80
|
* an error (see the module header) and never changes the exit code on its own.
|
|
69
81
|
*/
|
|
70
82
|
export declare function runCheckTasks(repoRoot: string, phase: string, withTaskList: boolean): CheckTasksRun;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-tasks.d.ts","sourceRoot":"","sources":["../src/check-tasks.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"check-tasks.d.ts","sourceRoot":"","sources":["../src/check-tasks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AAkBH,kFAAkF;AAClF,eAAO,MAAM,iBAAiB,gFAAgF,CAAC;AAE/G;;;;GAIG;AACH,MAAM,MAAM,cAAc,GACtB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAChF;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,CAAC;AAElB,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,cAAc,CAuB3E;AA8ED,sCAAsC;AACtC,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,aAAa,CAqCnG"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ONE PLACE THAT KNOWS HOW TO ASK THE SHELL FOR
|
|
2
|
+
* ONE PLACE THAT KNOWS HOW TO ASK THE SHELL FOR A CLI'S VERSION — Claude Code's and,
|
|
3
|
+
* since `codex-install-target` AC6 (T-16), Codex's.
|
|
3
4
|
*
|
|
4
5
|
* `reportClaudeCodeVersion` (`bin.ts`) and `claudeCodeVersion` (`banner-facts.ts`) each used
|
|
5
6
|
* to call `execFileSync('claude', ['--version'], …)` directly. On Windows, an npm install of
|
|
@@ -12,11 +13,21 @@
|
|
|
12
13
|
* Windows: `/d` skips AutoRun scripts, `/s` lets the quoted command string carry its own
|
|
13
14
|
* quoting, and `windowsVerbatimArguments: true` stops Node adding a second layer of quoting
|
|
14
15
|
* on top of the one already in the argument. Elsewhere (`win32` excluded) this is exactly the
|
|
15
|
-
* call it always was.
|
|
16
|
+
* call it always was. Codex's own install puts `codex.cmd` on Windows PATH (M4), the same
|
|
17
|
+
* shape, so `probeCodexVersion` runs it through `cmd.exe` the same way.
|
|
16
18
|
*
|
|
17
19
|
* `platform` and `exec` are both injectable so a test can drive the `win32` arm from a
|
|
18
20
|
* non-Windows CI runner and assert the literal command and arguments, rather than depending
|
|
19
|
-
* on the host actually being Windows with Claude Code installed.
|
|
21
|
+
* on the host actually being Windows with Claude Code or Codex installed.
|
|
22
|
+
*
|
|
23
|
+
* ONE SHARED EXEC, TWO PARSERS. `execVersionCommand` below is the generalised form —
|
|
24
|
+
* `probeClaudeCodeVersion`'s own call is byte-for-byte what it always was, so its existing
|
|
25
|
+
* tests pass unchanged (`codex-install-target` AC6: "the `claude` probe's tests pass
|
|
26
|
+
* unchanged"). Codex's output shape is narrower than Claude Code's loose
|
|
27
|
+
* `/(\d+\.\d+\.\d+)/`: `codex --version` prints `codex-cli 0.166.0` (M4, recorded
|
|
28
|
+
* 2026-10-31), so `probeCodexVersion` anchors on `^codex-cli ` rather than matching any
|
|
29
|
+
* dotted triple anywhere in the output — a stray version number elsewhere in a future
|
|
30
|
+
* Codex banner must not be mistaken for the CLI's own.
|
|
20
31
|
*
|
|
21
32
|
* INV-001: Node builtins only.
|
|
22
33
|
*/
|
|
@@ -34,6 +45,8 @@ export interface ClaudeVersionProbeDeps {
|
|
|
34
45
|
/** Defaults to the real `execFileSync`. Inject to assert the call without a shell. */
|
|
35
46
|
readonly exec?: ClaudeVersionExec;
|
|
36
47
|
}
|
|
48
|
+
/** Same shape, same deps — `probeCodexVersion` takes the identical injectable seam. */
|
|
49
|
+
export type CodexVersionProbeDeps = ClaudeVersionProbeDeps;
|
|
37
50
|
/**
|
|
38
51
|
* Runs `claude --version` for the given platform and returns the parsed `x.y.z`, or
|
|
39
52
|
* `undefined` for anything that stops that from working: `claude` not on PATH, no answer
|
|
@@ -41,6 +54,17 @@ export interface ClaudeVersionProbeDeps {
|
|
|
41
54
|
* callers' degradation (say nothing) depends on that.
|
|
42
55
|
*/
|
|
43
56
|
export declare function probeClaudeCodeVersion(timeoutMs: number, deps?: ClaudeVersionProbeDeps): string | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Runs `codex --version` for the given platform and returns the parsed `x.y.z`, or
|
|
59
|
+
* `undefined` for anything that stops that from working: `codex` not on PATH, no answer
|
|
60
|
+
* inside `timeoutMs`, or output that does not start `codex-cli <x.y.z>` (`codex-install-
|
|
61
|
+
* target` AC6, M4: Codex prints `codex-cli 0.166.0` and exits 0; the parser is the first
|
|
62
|
+
* group of `^codex-cli (\d+\.\d+\.\d+)` on stdout — anything else gives no row and no
|
|
63
|
+
* line). Never throws — every caller's degradation (say nothing) depends on that. On
|
|
64
|
+
* Windows this runs through `cmd.exe /d /s /c "codex --version"`, so `codex.cmd`
|
|
65
|
+
* answers, the same way `probeClaudeCodeVersion` reaches `claude.cmd`.
|
|
66
|
+
*/
|
|
67
|
+
export declare function probeCodexVersion(timeoutMs: number, deps?: CodexVersionProbeDeps): string | undefined;
|
|
44
68
|
/** The four install methods `npx halfcycle`'s own download page names, and the one
|
|
45
69
|
* command that upgrades each. */
|
|
46
70
|
export type ClaudeInstallMethod = 'winget' | 'npm' | 'brew' | 'native';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-version-probe.d.ts","sourceRoot":"","sources":["../src/claude-version-probe.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"claude-version-probe.d.ts","sourceRoot":"","sources":["../src/claude-version-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAMH;0DAC0D;AAC1D,MAAM,MAAM,iBAAiB,GAAG,CAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;IACP,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtD,QAAQ,CAAC,wBAAwB,CAAC,EAAE,OAAO,CAAC;CAC7C,KACE,MAAM,CAAC;AAEZ,MAAM,WAAW,sBAAsB;IACrC,oFAAoF;IACpF,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IACpC,sFAAsF;IACtF,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC;CACnC;AAED,uFAAuF;AACvF,MAAM,MAAM,qBAAqB,GAAG,sBAAsB,CAAC;AA6B3D;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,sBAA2B,GAAG,MAAM,GAAG,SAAS,CAG/G;AAED;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,GAAE,qBAA0B,GAAG,MAAM,GAAG,SAAS,CAGzG;AAMD;kCACkC;AAClC,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvE,eAAO,MAAM,wBAAwB,mCAAmC,CAAC;AAEzE,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAK1E,CAAC;AAyBF,MAAM,WAAW,uBAAuB;IACtC,iCAAiC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACjC,sCAAsC;IACtC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IACpC,iGAAiG;IACjG,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5C;sDACkD;IAClD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC9C;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,GAAE,uBAA4B,GAAG,mBAAmB,GAAG,SAAS,CAwBhH"}
|