mister-wolf 2.19.0 → 2.20.1

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.
Files changed (92) hide show
  1. package/README.md +12 -1
  2. package/README.ru.md +19 -2
  3. package/dist/adapters/cli/commands/memory-doctor.d.ts.map +1 -1
  4. package/dist/adapters/cli/commands/memory-doctor.js.map +1 -1
  5. package/dist/adapters/cli/commands/memory-uninstall.d.ts.map +1 -1
  6. package/dist/adapters/cli/commands/memory-uninstall.js.map +1 -1
  7. package/dist/adapters/cli/commands/memory-upgrade.d.ts +143 -2
  8. package/dist/adapters/cli/commands/memory-upgrade.d.ts.map +1 -1
  9. package/dist/adapters/cli/commands/memory-upgrade.js +887 -41
  10. package/dist/adapters/cli/commands/memory-upgrade.js.map +1 -1
  11. package/dist/adapters/cli/commands/upgrade-projects.d.ts +4 -2
  12. package/dist/adapters/cli/commands/upgrade-projects.d.ts.map +1 -1
  13. package/dist/adapters/cli/commands/upgrade-projects.js +17 -7
  14. package/dist/adapters/cli/commands/upgrade-projects.js.map +1 -1
  15. package/dist/adapters/platforms/index.d.ts.map +1 -1
  16. package/dist/adapters/platforms/index.js +2 -1
  17. package/dist/adapters/platforms/index.js.map +1 -1
  18. package/dist/adapters/platforms/opencode-adapter.d.ts +13 -4
  19. package/dist/adapters/platforms/opencode-adapter.d.ts.map +1 -1
  20. package/dist/adapters/platforms/opencode-adapter.js +278 -55
  21. package/dist/adapters/platforms/opencode-adapter.js.map +1 -1
  22. package/dist/adapters/platforms/opencode-config-keys.d.ts +78 -0
  23. package/dist/adapters/platforms/opencode-config-keys.d.ts.map +1 -0
  24. package/dist/adapters/platforms/opencode-config-keys.js +169 -0
  25. package/dist/adapters/platforms/opencode-config-keys.js.map +1 -0
  26. package/dist/adapters/render/opencode/opencode-renderer.d.ts +35 -7
  27. package/dist/adapters/render/opencode/opencode-renderer.d.ts.map +1 -1
  28. package/dist/adapters/render/opencode/opencode-renderer.js +395 -115
  29. package/dist/adapters/render/opencode/opencode-renderer.js.map +1 -1
  30. package/dist/adapters/render/stamp.d.ts +2 -0
  31. package/dist/adapters/render/stamp.d.ts.map +1 -1
  32. package/dist/adapters/render/stamp.js +9 -1
  33. package/dist/adapters/render/stamp.js.map +1 -1
  34. package/dist/adapters/render/sync-state.d.ts +15 -3
  35. package/dist/adapters/render/sync-state.d.ts.map +1 -1
  36. package/dist/adapters/render/sync-state.js +52 -8
  37. package/dist/adapters/render/sync-state.js.map +1 -1
  38. package/dist/app/use-cases/decisions.d.ts +247 -0
  39. package/dist/app/use-cases/decisions.d.ts.map +1 -0
  40. package/dist/app/use-cases/decisions.js +528 -0
  41. package/dist/app/use-cases/decisions.js.map +1 -0
  42. package/dist/app/use-cases/doctor.d.ts.map +1 -1
  43. package/dist/app/use-cases/doctor.js +6 -0
  44. package/dist/app/use-cases/doctor.js.map +1 -1
  45. package/dist/app/use-cases/init-project.d.ts.map +1 -1
  46. package/dist/app/use-cases/init-project.js +39 -3
  47. package/dist/app/use-cases/init-project.js.map +1 -1
  48. package/dist/app/use-cases/platform-mismatch.d.ts +2 -1
  49. package/dist/app/use-cases/platform-mismatch.d.ts.map +1 -1
  50. package/dist/app/use-cases/platform-mismatch.js.map +1 -1
  51. package/dist/app/use-cases/project-step.d.ts +20 -1
  52. package/dist/app/use-cases/project-step.d.ts.map +1 -1
  53. package/dist/app/use-cases/project-step.js +101 -15
  54. package/dist/app/use-cases/project-step.js.map +1 -1
  55. package/dist/app/use-cases/repair-platform.d.ts +2 -1
  56. package/dist/app/use-cases/repair-platform.d.ts.map +1 -1
  57. package/dist/app/use-cases/repair-platform.js +4 -1
  58. package/dist/app/use-cases/repair-platform.js.map +1 -1
  59. package/dist/app/use-cases/sync-base-set.d.ts +4 -2
  60. package/dist/app/use-cases/sync-base-set.d.ts.map +1 -1
  61. package/dist/app/use-cases/sync-base-set.js +4 -2
  62. package/dist/app/use-cases/sync-base-set.js.map +1 -1
  63. package/dist/app/use-cases/tool-librarian.d.ts.map +1 -1
  64. package/dist/app/use-cases/tool-librarian.js +3 -1
  65. package/dist/app/use-cases/tool-librarian.js.map +1 -1
  66. package/dist/app/use-cases/uninstall.d.ts +2 -1
  67. package/dist/app/use-cases/uninstall.d.ts.map +1 -1
  68. package/dist/app/use-cases/uninstall.js.map +1 -1
  69. package/dist/app/use-cases/upgrade-projects.d.ts +30 -0
  70. package/dist/app/use-cases/upgrade-projects.d.ts.map +1 -1
  71. package/dist/app/use-cases/upgrade-projects.js +119 -4
  72. package/dist/app/use-cases/upgrade-projects.js.map +1 -1
  73. package/dist/app/use-cases/verify-against-map.d.ts +5 -1
  74. package/dist/app/use-cases/verify-against-map.d.ts.map +1 -1
  75. package/dist/app/use-cases/verify-against-map.js +34 -6
  76. package/dist/app/use-cases/verify-against-map.js.map +1 -1
  77. package/dist/domain/line-diff.d.ts +36 -0
  78. package/dist/domain/line-diff.d.ts.map +1 -0
  79. package/dist/domain/line-diff.js +175 -0
  80. package/dist/domain/line-diff.js.map +1 -0
  81. package/dist/domain/protect-key.d.ts +21 -0
  82. package/dist/domain/protect-key.d.ts.map +1 -0
  83. package/dist/domain/protect-key.js +112 -0
  84. package/dist/domain/protect-key.js.map +1 -0
  85. package/dist/ports/base-set-renderer.port.d.ts +51 -3
  86. package/dist/ports/base-set-renderer.port.d.ts.map +1 -1
  87. package/dist/ports/platform-adapter.port.d.ts +8 -2
  88. package/dist/ports/platform-adapter.port.d.ts.map +1 -1
  89. package/package.json +1 -1
  90. package/templates/.wolf/router.log +1 -1
  91. package/templates/base/AGENTS.md +6 -3
  92. package/update-map.json +2 -2
@@ -0,0 +1,169 @@
1
+ // 6.2 (аудит 2026-10-25 §6.2): единый реестр ключей конфига opencode, которые пишет Wolf.
2
+ // Пути и метки живут только здесь; адаптер, doctor и use-case'ы читают их отсюда.
3
+ // Строковые литералы — английские: этот файл под гейтом check-english-surface.
4
+ /** Контейнер MCP: плоская v1-мапа `mcp.<name>` и v2 `mcp.servers.<name>`. */
5
+ export const MCP_ROOT = 'mcp';
6
+ /** v2-контейнер серверов. */
7
+ export const MCP_SERVERS = 'servers';
8
+ /** Имя wolf-сервера в MCP-конфиге. */
9
+ export const MCP_SERVER_NAME = 'wolf';
10
+ /** Дефолтный агент Wolf в opencode (§6.1). */
11
+ export const DEFAULT_AGENT = 'mr-wolf';
12
+ /** Глубина субагентов: executor-lead спавнит worker-* (трёхуровневая схема). */
13
+ export const SUBAGENT_DEPTH = 2;
14
+ const MCP_PATH = [MCP_ROOT, MCP_SERVERS, MCP_SERVER_NAME];
15
+ const LEGACY_MCP_PATH = [MCP_ROOT, MCP_SERVER_NAME];
16
+ const DEPTH_PATH = ['experimental', 'subagent_depth'];
17
+ const LEGACY_DEPTH_PATH = ['subagent_depth'];
18
+ /** MCP-сервер wolf: пишем `mcp.servers.wolf`, читаем/снимаем и `mcp.wolf`. */
19
+ export const MCP_KEY = {
20
+ id: 'mcp',
21
+ writePath: MCP_PATH,
22
+ canonicalPath: MCP_PATH,
23
+ legacyPaths: [LEGACY_MCP_PATH],
24
+ forms: 'both',
25
+ label: MCP_PATH.join('.'),
26
+ };
27
+ /** `default_agent` — форма одна в обеих ветках opencode. */
28
+ export const DEFAULT_AGENT_KEY = {
29
+ id: 'default_agent',
30
+ writePath: ['default_agent'],
31
+ canonicalPath: ['default_agent'],
32
+ legacyPaths: [],
33
+ forms: 'native',
34
+ label: 'default_agent',
35
+ };
36
+ /**
37
+ * `experimental.subagent_depth`: действует и в v1 >= 1.18.29 (compat-подъём), и в v2.
38
+ * Верхнеуровневый `subagent_depth` (legacy) читаем только чтобы снять своё значение.
39
+ */
40
+ export const SUBAGENT_DEPTH_KEY = {
41
+ id: 'subagent_depth',
42
+ writePath: DEPTH_PATH,
43
+ canonicalPath: DEPTH_PATH,
44
+ legacyPaths: [LEGACY_DEPTH_PATH],
45
+ forms: 'both',
46
+ label: 'subagent_depth',
47
+ };
48
+ export const CONFIG_KEYS = [MCP_KEY, DEFAULT_AGENT_KEY, SUBAGENT_DEPTH_KEY];
49
+ /** Легаси-путь для чтения/снятия (первый объявленный). */
50
+ export function legacyPathOf(key) {
51
+ return key.legacyPaths[0];
52
+ }
53
+ export function getPath(obj, path) {
54
+ let cur = obj;
55
+ for (const segment of path) {
56
+ const record = asRecord(cur);
57
+ if (record === undefined)
58
+ return undefined;
59
+ cur = record[segment];
60
+ }
61
+ return cur;
62
+ }
63
+ export function getRecordAt(obj, path) {
64
+ return asRecord(getPath(obj, path));
65
+ }
66
+ /** Пишет значение; отсутствующие промежуточные объекты создаёт, чужое не-объектное не перетирает. */
67
+ export function setPath(obj, path, value) {
68
+ let cur = obj;
69
+ for (let i = 0; i < path.length - 1; i++) {
70
+ const segment = path[i];
71
+ let next = asRecord(cur[segment]);
72
+ if (next === undefined) {
73
+ if (cur[segment] !== undefined)
74
+ return;
75
+ next = {};
76
+ cur[segment] = next;
77
+ }
78
+ cur = next;
79
+ }
80
+ cur[path[path.length - 1]] = value;
81
+ }
82
+ /** true если путь существовал; пустые родительские объекты (mcp.servers, mcp, experimental) удаляются. */
83
+ export function deletePath(obj, path) {
84
+ const chain = [];
85
+ let cur = obj;
86
+ for (let i = 0; i < path.length - 1; i++) {
87
+ const segment = path[i];
88
+ chain.push({ parent: cur, segment });
89
+ const next = asRecord(cur[segment]);
90
+ if (next === undefined)
91
+ return false;
92
+ cur = next;
93
+ }
94
+ const leaf = path[path.length - 1];
95
+ if (!(leaf in cur))
96
+ return false;
97
+ delete cur[leaf];
98
+ for (let i = chain.length - 1; i >= 0; i--) {
99
+ const { parent, segment } = chain[i];
100
+ const record = asRecord(parent[segment]);
101
+ if (record !== undefined && Object.keys(record).length === 0)
102
+ delete parent[segment];
103
+ }
104
+ return true;
105
+ }
106
+ /** Каноническая команда wolf MCP: единственный источник для записи и ownership-проверок. */
107
+ export const WOLF_MCP_COMMAND = { command: 'wolf', args: ['mcp'] };
108
+ /**
109
+ * Первый сегмент пути, занятый не-объектом (для сообщений): `mcp`, `mcp.servers`,
110
+ * `experimental`. undefined — путь записываем (промежуточные создаются).
111
+ */
112
+ export function blockedSegment(obj, path) {
113
+ let cur = obj;
114
+ for (let i = 0; i < path.length - 1; i++) {
115
+ const record = asRecord(cur);
116
+ if (record === undefined)
117
+ return path.slice(0, i).join('.');
118
+ const next = record[path[i]];
119
+ if (next === undefined)
120
+ return undefined; // дальше создаём новые объекты
121
+ cur = next;
122
+ }
123
+ return asRecord(cur) === undefined ? path.slice(0, -1).join('.') : undefined;
124
+ }
125
+ /**
126
+ * true, если путь можно записать: каждый промежуточный сегмент либо отсутствует,
127
+ * либо объект. Занятый чужим не-объектом сегмент — конфликт, а не молчаливый no-op.
128
+ */
129
+ export function pathWritable(obj, path) {
130
+ return blockedSegment(obj, path) === undefined;
131
+ }
132
+ /** Нативная запись MCP: { type: 'local', command: [cmd.command, ...cmd.args], disabled: false }. Без codemode. */
133
+ export function mcpEntryNative(cmd) {
134
+ return { type: 'local', command: [cmd.command, ...cmd.args], disabled: false };
135
+ }
136
+ /** «Наше» значение: type local + command совпадает с канонической командой wolf (лишние поля допустимы). */
137
+ export function isWolfMcpEntry(value, cmd) {
138
+ const entry = asRecord(value);
139
+ if (entry === undefined || entry.type !== 'local' || !Array.isArray(entry.command))
140
+ return false;
141
+ const command = entry.command;
142
+ const expected = [cmd.command, ...cmd.args];
143
+ return command.length === expected.length && expected.every((part, i) => command[i] === part);
144
+ }
145
+ /** Двухформенное чтение: нативная приоритетна; ownership считается по точной команде wolf. */
146
+ export function readWolfMcp(cfg, cmd) {
147
+ const nativeEntry = getRecordAt(cfg, MCP_KEY.writePath);
148
+ const legacyPath = legacyPathOf(MCP_KEY);
149
+ const legacyEntry = legacyPath === undefined ? undefined : getRecordAt(cfg, legacyPath);
150
+ const legacyOurs = legacyEntry !== undefined && isWolfMcpEntry(legacyEntry, cmd);
151
+ if (nativeEntry !== undefined) {
152
+ return {
153
+ form: legacyEntry !== undefined ? 'both' : 'native',
154
+ entry: nativeEntry,
155
+ ...(legacyEntry !== undefined ? { legacyEntry } : {}),
156
+ ours: isWolfMcpEntry(nativeEntry, cmd),
157
+ legacyOurs,
158
+ };
159
+ }
160
+ if (legacyEntry !== undefined)
161
+ return { form: 'legacy', entry: legacyEntry, legacyEntry, ours: legacyOurs, legacyOurs };
162
+ return { form: 'none', ours: false, legacyOurs: false };
163
+ }
164
+ function asRecord(value) {
165
+ return value !== null && typeof value === 'object' && !Array.isArray(value)
166
+ ? value
167
+ : undefined;
168
+ }
169
+ //# sourceMappingURL=opencode-config-keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-config-keys.js","sourceRoot":"","sources":["../../../src/adapters/platforms/opencode-config-keys.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { BaseSetRenderer, InspectOutcome, ModelContext, RenderBaseSetOptions, RenderOutcome } from '../../../ports/base-set-renderer.port.js';
1
+ import { BaseSetRenderer, InspectOutcome, ModelContext, ProtectEntry, RenderBaseSetOptions, RenderOutcome, SyncBaseSetOptions } from '../../../ports/base-set-renderer.port.js';
2
2
  export declare class OpencodeBaseSetRenderer implements BaseSetRenderer {
3
3
  private readonly baseTemplatesRoot;
4
4
  private readonly opts;
@@ -12,16 +12,37 @@ export declare class OpencodeBaseSetRenderer implements BaseSetRenderer {
12
12
  private templateFiles;
13
13
  private walkAbs;
14
14
  renderBaseSet(baseDir: string, opts?: RenderBaseSetOptions): Promise<RenderOutcome[]>;
15
- syncBaseSet(baseDir: string, models?: ModelContext | 'omit'): Promise<{
15
+ syncBaseSet(baseDir: string, models?: ModelContext | 'omit', opts?: SyncBaseSetOptions): Promise<{
16
16
  outcomes: RenderOutcome[];
17
17
  orphaned: string[];
18
18
  }>;
19
+ /** Блочный режим AGENTS.md (§4.5): управляется только текст между маркерами;
20
+ * контент выше и ниже — байт-в-байт. protect у AGENTS.md не поддерживается.
21
+ * Штампованная цель с блоком (миграция 2.19.0 → 2.20.0, M-1) после замены
22
+ * блока получает штамп текущей базы и свидетель; `state` передаёт только
23
+ * init-ветка (блочный файл без штампа свидетеля не имеет). */
24
+ private syncAgentsBlock;
25
+ /** Штампованная цель с блоком: штамп приводится к текущей базе **на своём
26
+ * месте** (позицию задаёт `insertStamp` — после frontmatter, `---` остаётся
27
+ * первой строкой). Без нового регекса штампа (§4.4): канонический текст
28
+ * `renderStamp` заменяется строкой текущей базы; нестандартную запись штампа
29
+ * не переписываем (файл честно останется `mutated`). */
30
+ private restampAgents;
31
+ /** Свидетель после обновления блока: только если файл совпал с эталоном
32
+ * (EOL отличием не считается — проход приводит его правилом 7). Иначе
33
+ * локальный текст вне блока остаётся решением `mutated` и не перезаписывается. */
34
+ private recordAgentsBase;
19
35
  /** T10 (REQ-08): read-only инспекция целей base-set — предикат того, что
20
36
  * сделает syncBaseSet, БЕЗ записей (ни writeFileAtomic, ни saveSyncState):
21
- * missing / foreign (unstamped, wx-политика) / identical / differs /
22
- * mutated (свидетель sync-state говорит о локальной правке). models по
37
+ * missing / protected / foreign (unstamped, wx-политика) / identical (в т.ч.
38
+ * штамп-дрейф: проходу нечего решать) / differs / mutated / kept. models по
23
39
  * умолчанию 'omit' — паритет с syncBaseSet, чей исход и предсказываем. */
24
40
  inspectBaseSet(baseDir: string, opts?: RenderBaseSetOptions): Promise<InspectOutcome[]>;
41
+ /** Реестр защит (§4.11, REQ-09): read-only обход каталогов base-set, включая
42
+ * файлы вне карты. AGENTS.md в реестр не входит — protect у него не поддерживается. */
43
+ listProtections(baseDir: string, base: string): Promise<ProtectEntry[]>;
44
+ /** Свежий рендер одного файла карты (эталон для `--show` и `behind`); null — вне карты. */
45
+ renderFreshFile(baseDir: string, rel: string, opts?: RenderBaseSetOptions): string | null;
25
46
  /** Read-only инспекция AGENTS.md (§4.2) — по фактическим веткам управления:
26
47
  * штампованный цельный файл — зона syncAgentsMd (сверка всего файла со
27
48
  * штампом, mutated по свидетелю); без штампа — маркер-блок append-ветки
@@ -33,10 +54,17 @@ export declare class OpencodeBaseSetRenderer implements BaseSetRenderer {
33
54
  private agentsMdContent;
34
55
  /** Init-ветка AGENTS.md: create (wx + штамп) / marker-append / skip (D3). */
35
56
  private renderAgentsMd;
36
- /** Sync-ветка AGENTS.md: только штампованный цельный файл; append-блок синку не принадлежит. */
57
+ /** Sync-ветка AGENTS.md: только штампованный цельный файл; append-блок синку не принадлежит.
58
+ * protect у AGENTS.md не поддерживается (§4.5); правила 6/6.5/7 §4.3 действуют,
59
+ * включая take-on-mutated (6′) с бэкапом — механизм тот же, что у файлов карты (§4.12). */
37
60
  private syncAgentsMd;
61
+ /** Единый порядок решающих правил §4.3: missing → protect → unstamped →
62
+ * identical → штамп-дрейф → mutated → kept → rewrite. Режимы (sync/render/
63
+ * inspect) читают это решение и выполняют свою часть (запись или нет). */
64
+ private classify;
65
+ /** Свидетель записи: хэш нормализованного контента + происхождение + база (§4.2). */
66
+ private record;
67
+ private writeFresh;
38
68
  private renderContent;
39
- /** Пишет рендер и возвращает записанный контент (T010: хэш для sync-state). */
40
- private writeRendered;
41
69
  }
42
70
  //# sourceMappingURL=opencode-renderer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-renderer.d.ts","sourceRoot":"","sources":["../../../../src/adapters/render/opencode/opencode-renderer.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,eAAe,EAEf,cAAc,EACd,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACd,MAAM,0CAA0C,CAAC;AAuBlD,qBAAa,uBAAwB,YAAW,eAAe;IAI3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJvB,EAAE,SAAc;gBAGG,iBAAiB,EAAE,MAAM,EACzB,IAAI,GAAE;QAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;IAGpF,OAAO,KAAK,UAAU,GAErB;IAED,gFAAgF;IAChF,OAAO,CAAE,aAAa;IAmBtB,OAAO,CAAE,OAAO;IASV,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA+CrF,WAAW,CACf,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,GAC7B,OAAO,CAAC;QAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IA+D7D;;;;+EAI2E;IACrE,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA8B7F;;;;sEAIkE;IAClE,OAAO,CAAC,eAAe;IAqBvB,8EAA8E;IAC9E,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,eAAe;IAKvB,6EAA6E;YAC/D,cAAc;IAyB5B,gGAAgG;YAClF,YAAY;IA4C1B,OAAO,CAAC,aAAa;IASrB,+EAA+E;YACjE,aAAa;CAM5B"}
1
+ {"version":3,"file":"opencode-renderer.d.ts","sourceRoot":"","sources":["../../../../src/adapters/render/opencode/opencode-renderer.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,eAAe,EAEf,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,kBAAkB,EACnB,MAAM,0CAA0C,CAAC;AAqFlD,qBAAa,uBAAwB,YAAW,eAAe;IAI3D,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJvB,EAAE,SAAc;gBAGG,iBAAiB,EAAE,MAAM,EACzB,IAAI,GAAE;QAAE,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAO;IAGpF,OAAO,KAAK,UAAU,GAErB;IAED,gFAAgF;IAChF,OAAO,CAAE,aAAa;IAmBtB,OAAO,CAAE,OAAO;IASV,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA6DrF,WAAW,CACf,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,YAAY,GAAG,MAAM,EAC9B,IAAI,CAAC,EAAE,kBAAkB,GACxB,OAAO,CAAC;QAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAoG7D;;;;mEAI+D;YACjD,eAAe;IA4C7B;;;;6DAIyD;IACzD,OAAO,CAAC,aAAa;IAQrB;;uFAEmF;IACnF,OAAO,CAAC,gBAAgB;IAKxB;;;;+EAI2E;IACrE,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA4C7F;4FACwF;IAClF,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA8B7E,2FAA2F;IAC3F,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,oBAAoB,GAAG,MAAM,GAAG,IAAI;IAkBzF;;;;sEAIkE;IAClE,OAAO,CAAC,eAAe;IA2BvB,8EAA8E;IAC9E,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,eAAe;IAKvB,6EAA6E;YAC/D,cAAc;IAmC5B;;gGAE4F;YAC9E,YAAY;IA8D1B;;+EAE2E;IAC3E,OAAO,CAAC,QAAQ;IAehB,qFAAqF;IACrF,OAAO,CAAC,MAAM;YAIA,UAAU;IAKxB,OAAO,CAAC,aAAa;CAQtB"}