@dev4s/opencode-dcp 0.1.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.
Files changed (116) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +160 -0
  3. package/dist/index.d.ts +4 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +87 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/config.d.ts +58 -0
  8. package/dist/lib/config.d.ts.map +1 -0
  9. package/dist/lib/config.js +696 -0
  10. package/dist/lib/config.js.map +1 -0
  11. package/dist/lib/hooks.d.ts +10 -0
  12. package/dist/lib/hooks.d.ts.map +1 -0
  13. package/dist/lib/hooks.js +45 -0
  14. package/dist/lib/hooks.js.map +1 -0
  15. package/dist/lib/logger.d.ts +31 -0
  16. package/dist/lib/logger.d.ts.map +1 -0
  17. package/dist/lib/logger.js +183 -0
  18. package/dist/lib/logger.js.map +1 -0
  19. package/dist/lib/messages/index.d.ts +2 -0
  20. package/dist/lib/messages/index.d.ts.map +1 -0
  21. package/dist/lib/messages/index.js +2 -0
  22. package/dist/lib/messages/index.js.map +1 -0
  23. package/dist/lib/messages/prune.d.ts +6 -0
  24. package/dist/lib/messages/prune.d.ts.map +1 -0
  25. package/dist/lib/messages/prune.js +187 -0
  26. package/dist/lib/messages/prune.js.map +1 -0
  27. package/dist/lib/messages/utils.d.ts +9 -0
  28. package/dist/lib/messages/utils.d.ts.map +1 -0
  29. package/dist/lib/messages/utils.js +124 -0
  30. package/dist/lib/messages/utils.js.map +1 -0
  31. package/dist/lib/model-selector.d.ts +17 -0
  32. package/dist/lib/model-selector.d.ts.map +1 -0
  33. package/dist/lib/model-selector.js +141 -0
  34. package/dist/lib/model-selector.js.map +1 -0
  35. package/dist/lib/prompt.d.ts +3 -0
  36. package/dist/lib/prompt.d.ts.map +1 -0
  37. package/dist/lib/prompt.js +128 -0
  38. package/dist/lib/prompt.js.map +1 -0
  39. package/dist/lib/prompts/discard-tool-spec.txt +41 -0
  40. package/dist/lib/prompts/extract-tool-spec.txt +47 -0
  41. package/dist/lib/prompts/on-idle-analysis.txt +30 -0
  42. package/dist/lib/prompts/user/nudge/nudge-both.txt +10 -0
  43. package/dist/lib/prompts/user/nudge/nudge-discard.txt +9 -0
  44. package/dist/lib/prompts/user/nudge/nudge-extract.txt +9 -0
  45. package/dist/lib/prompts/user/system/system-prompt-both.txt +58 -0
  46. package/dist/lib/prompts/user/system/system-prompt-discard.txt +49 -0
  47. package/dist/lib/prompts/user/system/system-prompt-extract.txt +49 -0
  48. package/dist/lib/shared-utils.d.ts +4 -0
  49. package/dist/lib/shared-utils.d.ts.map +1 -0
  50. package/dist/lib/shared-utils.js +13 -0
  51. package/dist/lib/shared-utils.js.map +1 -0
  52. package/dist/lib/state/index.d.ts +4 -0
  53. package/dist/lib/state/index.d.ts.map +1 -0
  54. package/dist/lib/state/index.js +4 -0
  55. package/dist/lib/state/index.js.map +1 -0
  56. package/dist/lib/state/persistence.d.ts +16 -0
  57. package/dist/lib/state/persistence.d.ts.map +1 -0
  58. package/dist/lib/state/persistence.js +73 -0
  59. package/dist/lib/state/persistence.js.map +1 -0
  60. package/dist/lib/state/state.d.ts +8 -0
  61. package/dist/lib/state/state.d.ts.map +1 -0
  62. package/dist/lib/state/state.js +112 -0
  63. package/dist/lib/state/state.js.map +1 -0
  64. package/dist/lib/state/tool-cache.d.ts +13 -0
  65. package/dist/lib/state/tool-cache.d.ts.map +1 -0
  66. package/dist/lib/state/tool-cache.js +74 -0
  67. package/dist/lib/state/tool-cache.js.map +1 -0
  68. package/dist/lib/state/types.d.ts +32 -0
  69. package/dist/lib/state/types.d.ts.map +1 -0
  70. package/dist/lib/state/types.js +2 -0
  71. package/dist/lib/state/types.js.map +1 -0
  72. package/dist/lib/state/utils.d.ts +2 -0
  73. package/dist/lib/state/utils.d.ts.map +1 -0
  74. package/dist/lib/state/utils.js +10 -0
  75. package/dist/lib/state/utils.js.map +1 -0
  76. package/dist/lib/strategies/deduplication.d.ts +10 -0
  77. package/dist/lib/strategies/deduplication.d.ts.map +1 -0
  78. package/dist/lib/strategies/deduplication.js +89 -0
  79. package/dist/lib/strategies/deduplication.js.map +1 -0
  80. package/dist/lib/strategies/index.d.ts +6 -0
  81. package/dist/lib/strategies/index.d.ts.map +1 -0
  82. package/dist/lib/strategies/index.js +6 -0
  83. package/dist/lib/strategies/index.js.map +1 -0
  84. package/dist/lib/strategies/on-idle.d.ts +14 -0
  85. package/dist/lib/strategies/on-idle.d.ts.map +1 -0
  86. package/dist/lib/strategies/on-idle.js +220 -0
  87. package/dist/lib/strategies/on-idle.js.map +1 -0
  88. package/dist/lib/strategies/purge-errors.d.ts +13 -0
  89. package/dist/lib/strategies/purge-errors.d.ts.map +1 -0
  90. package/dist/lib/strategies/purge-errors.js +54 -0
  91. package/dist/lib/strategies/purge-errors.js.map +1 -0
  92. package/dist/lib/strategies/supersede-writes.d.ts +13 -0
  93. package/dist/lib/strategies/supersede-writes.d.ts.map +1 -0
  94. package/dist/lib/strategies/supersede-writes.js +80 -0
  95. package/dist/lib/strategies/supersede-writes.js.map +1 -0
  96. package/dist/lib/strategies/tools.d.ts +14 -0
  97. package/dist/lib/strategies/tools.d.ts.map +1 -0
  98. package/dist/lib/strategies/tools.js +137 -0
  99. package/dist/lib/strategies/tools.js.map +1 -0
  100. package/dist/lib/strategies/utils.d.ts +12 -0
  101. package/dist/lib/strategies/utils.d.ts.map +1 -0
  102. package/dist/lib/strategies/utils.js +82 -0
  103. package/dist/lib/strategies/utils.js.map +1 -0
  104. package/dist/lib/tokenizer.d.ts +24 -0
  105. package/dist/lib/tokenizer.d.ts.map +1 -0
  106. package/dist/lib/tokenizer.js +45 -0
  107. package/dist/lib/tokenizer.js.map +1 -0
  108. package/dist/lib/ui/notification.d.ts +9 -0
  109. package/dist/lib/ui/notification.d.ts.map +1 -0
  110. package/dist/lib/ui/notification.js +70 -0
  111. package/dist/lib/ui/notification.js.map +1 -0
  112. package/dist/lib/ui/utils.d.ts +15 -0
  113. package/dist/lib/ui/utils.d.ts.map +1 -0
  114. package/dist/lib/ui/utils.js +87 -0
  115. package/dist/lib/ui/utils.js.map +1 -0
  116. package/package.json +57 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 tarquinen
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,160 @@
1
+ # Dynamic Context Pruning Plugin
2
+
3
+ [![npm version](https://img.shields.io/npm/v/@tarquinen/opencode-dcp.svg)](https://www.npmjs.com/package/@tarquinen/opencode-dcp)
4
+
5
+ Automatically reduces token usage in OpenCode by removing obsolete tool outputs from conversation history.
6
+
7
+ ![DCP in action](dcp-demo3.png)
8
+
9
+ ## Installation
10
+
11
+ Add to your OpenCode config:
12
+
13
+ ```jsonc
14
+ // opencode.jsonc
15
+ {
16
+ "plugin": ["@tarquinen/opencode-dcp@latest"],
17
+ }
18
+ ```
19
+
20
+ Using `@latest` ensures you always get the newest version automatically when OpenCode starts.
21
+
22
+ > **Note:** If you use OAuth plugins (e.g., for Google or other services), place this plugin last in your `plugin` array to avoid interfering with their authentication flows.
23
+
24
+ Restart OpenCode. The plugin will automatically start optimizing your sessions.
25
+
26
+ ## How Pruning Works
27
+
28
+ DCP uses multiple tools and strategies to reduce context size:
29
+
30
+ ### Tools
31
+
32
+ **Discard** — Exposes a `discard` tool that the AI can call to remove completed or noisy tool content from context.
33
+
34
+ **Extract** — Exposes an `extract` tool that the AI can call to distill valuable context into concise summaries before removing the tool content.
35
+
36
+ ### Strategies
37
+
38
+ **Deduplication** — Identifies repeated tool calls (e.g., reading the same file multiple times) and keeps only the most recent output. Runs automatically on every request with zero LLM cost.
39
+
40
+ **Supersede Writes** — Prunes write tool inputs for files that have subsequently been read. When a file is written and later read, the original write content becomes redundant since the current file state is captured in the read result. Runs automatically on every request with zero LLM cost.
41
+
42
+ **Purge Errors** — Prunes tool inputs for tools that returned errors after a configurable number of turns (default: 4). Error messages are preserved for context, but the potentially large input content is removed. Runs automatically on every request with zero LLM cost.
43
+
44
+ **On Idle Analysis** — Uses a language model to semantically analyze conversation context during idle periods and identify tool outputs that are no longer relevant. Disabled by default (legacy behavior).
45
+
46
+ Your session history is never modified—DCP replaces pruned content with placeholders before sending requests to your LLM.
47
+
48
+ ## Impact on Prompt Caching
49
+
50
+ LLM providers like Anthropic and OpenAI cache prompts based on exact prefix matching. When DCP prunes a tool output, it changes the message content, which invalidates cached prefixes from that point forward.
51
+
52
+ **Trade-off:** You lose some cache read benefits but gain larger token savings from reduced context size and performance improvements through reduced context poisoning. In most cases, the token savings outweigh the cache miss cost—especially in long sessions where context bloat becomes significant.
53
+
54
+ **Best use case:** Providers that count usage in requests, such as Github Copilot and Google Antigravity have no negative price impact.
55
+
56
+ ## Configuration
57
+
58
+ DCP uses its own config file:
59
+
60
+ - Global: `~/.config/opencode/dcp.jsonc` (or `dcp.json`), created automatically on first run
61
+ - Custom config directory: `$OPENCODE_CONFIG_DIR/dcp.jsonc` (or `dcp.json`), if `OPENCODE_CONFIG_DIR` is set
62
+ - Project: `.opencode/dcp.jsonc` (or `dcp.json`) in your project’s `.opencode` directory
63
+
64
+ <details>
65
+ <summary><strong>Default Configuration</strong> (click to expand)</summary>
66
+
67
+ ```jsonc
68
+ {
69
+ // Enable or disable the plugin
70
+ "enabled": true,
71
+ // Enable debug logging to ~/.config/opencode/logs/dcp/
72
+ "debug": false,
73
+ // Notification display: "off", "minimal", or "detailed"
74
+ "pruneNotification": "detailed",
75
+ // Protect from pruning for <turns> message turns
76
+ "turnProtection": {
77
+ "enabled": false,
78
+ "turns": 4,
79
+ },
80
+ // LLM-driven context pruning tools
81
+ "tools": {
82
+ // Shared settings for all prune tools
83
+ "settings": {
84
+ // Nudge the LLM to use prune tools (every <nudgeFrequency> tool results)
85
+ "nudgeEnabled": true,
86
+ "nudgeFrequency": 10,
87
+ // Additional tools to protect from pruning
88
+ "protectedTools": [],
89
+ },
90
+ // Removes tool content from context without preservation (for completed tasks or noise)
91
+ "discard": {
92
+ "enabled": true,
93
+ },
94
+ // Distills key findings into preserved knowledge before removing raw content
95
+ "extract": {
96
+ "enabled": true,
97
+ // Show distillation content as an ignored message notification
98
+ "showDistillation": false,
99
+ },
100
+ },
101
+ // Automatic pruning strategies
102
+ "strategies": {
103
+ // Remove duplicate tool calls (same tool with same arguments)
104
+ "deduplication": {
105
+ "enabled": true,
106
+ // Additional tools to protect from pruning
107
+ "protectedTools": [],
108
+ },
109
+ // Prune write tool inputs when the file has been subsequently read
110
+ "supersedeWrites": {
111
+ "enabled": true,
112
+ },
113
+ // Prune tool inputs for errored tools after X turns
114
+ "purgeErrors": {
115
+ "enabled": true,
116
+ // Number of turns before errored tool inputs are pruned
117
+ "turns": 4,
118
+ // Additional tools to protect from pruning
119
+ "protectedTools": [],
120
+ },
121
+ // (Legacy) Run an LLM to analyze what tool calls are no longer relevant on idle
122
+ "onIdle": {
123
+ "enabled": false,
124
+ // Additional tools to protect from pruning
125
+ "protectedTools": [],
126
+ // Override model for analysis (format: "provider/model")
127
+ // "model": "anthropic/claude-haiku-4-5",
128
+ // Show toast notifications when model selection fails
129
+ "showModelErrorToasts": true,
130
+ // When true, fallback models are not permitted
131
+ "strictModelSelection": false,
132
+ },
133
+ },
134
+ }
135
+ ```
136
+
137
+ </details>
138
+
139
+ ### Turn Protection
140
+
141
+ When enabled, turn protection prevents tool outputs from being pruned for a configurable number of message turns. This gives the AI time to reference recent tool outputs before they become prunable. Applies to both `discard` and `extract` tools, as well as automatic strategies.
142
+
143
+ ### Protected Tools
144
+
145
+ By default, these tools are always protected from pruning across all strategies:
146
+ `task`, `todowrite`, `todoread`, `discard`, `extract`, `batch`
147
+
148
+ The `protectedTools` arrays in each section add to this default list.
149
+
150
+ ### Config Precedence
151
+
152
+ Settings are merged in order:
153
+ Defaults → Global (`~/.config/opencode/dcp.jsonc`) → Config Dir (`$OPENCODE_CONFIG_DIR/dcp.jsonc`) → Project (`.opencode/dcp.jsonc`).
154
+ Each level overrides the previous, so project settings take priority over config-dir and global, which take priority over defaults.
155
+
156
+ Restart OpenCode after making config changes.
157
+
158
+ ## License
159
+
160
+ MIT
@@ -0,0 +1,4 @@
1
+ import type { Plugin } from "@opencode-ai/plugin";
2
+ declare const plugin: Plugin;
3
+ export default plugin;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AASjD,QAAA,MAAM,MAAM,EAAE,MA0FK,CAAA;AAEnB,eAAe,MAAM,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,87 @@
1
+ import { getConfig } from "./lib/config";
2
+ import { Logger } from "./lib/logger";
3
+ import { loadPrompt } from "./lib/prompt";
4
+ import { createSessionState } from "./lib/state";
5
+ import { createDiscardTool, createExtractTool } from "./lib/strategies";
6
+ import { createChatMessageTransformHandler, createEventHandler } from "./lib/hooks";
7
+ import { preloadTokenizer } from "./lib/tokenizer";
8
+ const plugin = (async (ctx) => {
9
+ const config = getConfig(ctx);
10
+ if (!config.enabled) {
11
+ return {};
12
+ }
13
+ // Start loading tokenizer in background (non-blocking)
14
+ preloadTokenizer();
15
+ // Suppress AI SDK warnings
16
+ if (typeof globalThis !== "undefined") {
17
+ ;
18
+ globalThis.AI_SDK_LOG_WARNINGS = false;
19
+ }
20
+ const logger = new Logger(config.debug);
21
+ const state = createSessionState();
22
+ logger.info("DCP initialized", {
23
+ strategies: config.strategies,
24
+ });
25
+ return {
26
+ "experimental.chat.system.transform": async (_input, output) => {
27
+ const discardEnabled = config.tools.discard.enabled;
28
+ const extractEnabled = config.tools.extract.enabled;
29
+ let promptName;
30
+ if (discardEnabled && extractEnabled) {
31
+ promptName = "user/system/system-prompt-both";
32
+ }
33
+ else if (discardEnabled) {
34
+ promptName = "user/system/system-prompt-discard";
35
+ }
36
+ else if (extractEnabled) {
37
+ promptName = "user/system/system-prompt-extract";
38
+ }
39
+ else {
40
+ return;
41
+ }
42
+ const syntheticPrompt = loadPrompt(promptName);
43
+ output.system.push(syntheticPrompt);
44
+ },
45
+ "experimental.chat.messages.transform": createChatMessageTransformHandler(ctx.client, state, logger, config),
46
+ tool: {
47
+ ...(config.tools.discard.enabled && {
48
+ discard: createDiscardTool({
49
+ client: ctx.client,
50
+ state,
51
+ logger,
52
+ config,
53
+ workingDirectory: ctx.directory,
54
+ }),
55
+ }),
56
+ ...(config.tools.extract.enabled && {
57
+ extract: createExtractTool({
58
+ client: ctx.client,
59
+ state,
60
+ logger,
61
+ config,
62
+ workingDirectory: ctx.directory,
63
+ }),
64
+ }),
65
+ },
66
+ config: async (opencodeConfig) => {
67
+ // Add enabled tools to primary_tools by mutating the opencode config
68
+ // This works because config is cached and passed by reference
69
+ const toolsToAdd = [];
70
+ if (config.tools.discard.enabled)
71
+ toolsToAdd.push("discard");
72
+ if (config.tools.extract.enabled)
73
+ toolsToAdd.push("extract");
74
+ if (toolsToAdd.length > 0) {
75
+ const existingPrimaryTools = opencodeConfig.experimental?.primary_tools ?? [];
76
+ opencodeConfig.experimental = {
77
+ ...opencodeConfig.experimental,
78
+ primary_tools: [...existingPrimaryTools, ...toolsToAdd],
79
+ };
80
+ logger.info(`Added ${toolsToAdd.map((t) => `'${t}'`).join(" and ")} to experimental.primary_tools via config mutation`);
81
+ }
82
+ },
83
+ event: createEventHandler(ctx.client, config, state, logger, ctx.directory),
84
+ };
85
+ });
86
+ export default plugin;
87
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ import type { PluginInput } from "@opencode-ai/plugin";
2
+ export interface Deduplication {
3
+ enabled: boolean;
4
+ protectedTools: string[];
5
+ }
6
+ export interface OnIdle {
7
+ enabled: boolean;
8
+ model?: string;
9
+ showModelErrorToasts?: boolean;
10
+ strictModelSelection?: boolean;
11
+ protectedTools: string[];
12
+ }
13
+ export interface DiscardTool {
14
+ enabled: boolean;
15
+ }
16
+ export interface ExtractTool {
17
+ enabled: boolean;
18
+ showDistillation: boolean;
19
+ }
20
+ export interface ToolSettings {
21
+ nudgeEnabled: boolean;
22
+ nudgeFrequency: number;
23
+ protectedTools: string[];
24
+ }
25
+ export interface Tools {
26
+ settings: ToolSettings;
27
+ discard: DiscardTool;
28
+ extract: ExtractTool;
29
+ }
30
+ export interface SupersedeWrites {
31
+ enabled: boolean;
32
+ }
33
+ export interface PurgeErrors {
34
+ enabled: boolean;
35
+ turns: number;
36
+ protectedTools: string[];
37
+ }
38
+ export interface TurnProtection {
39
+ enabled: boolean;
40
+ turns: number;
41
+ }
42
+ export interface PluginConfig {
43
+ enabled: boolean;
44
+ debug: boolean;
45
+ pruneNotification: "off" | "minimal" | "detailed";
46
+ turnProtection: TurnProtection;
47
+ tools: Tools;
48
+ strategies: {
49
+ deduplication: Deduplication;
50
+ supersedeWrites: SupersedeWrites;
51
+ purgeErrors: PurgeErrors;
52
+ onIdle: OnIdle;
53
+ };
54
+ }
55
+ export declare const VALID_CONFIG_KEYS: Set<string>;
56
+ export declare function getInvalidConfigKeys(userConfig: Record<string, any>): string[];
57
+ export declare function getConfig(ctx: PluginInput): PluginConfig;
58
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../lib/config.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAEtD,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,MAAM;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,gBAAgB,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,YAAY;IACzB,YAAY,EAAE,OAAO,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,KAAK;IAClB,QAAQ,EAAE,YAAY,CAAA;IACtB,OAAO,EAAE,WAAW,CAAA;IACpB,OAAO,EAAE,WAAW,CAAA;CACvB;AAED,MAAM,WAAW,eAAe;IAC5B,OAAO,EAAE,OAAO,CAAA;CACnB;AAED,MAAM,WAAW,WAAW;IACxB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,WAAW,cAAc;IAC3B,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,OAAO,CAAA;IACd,iBAAiB,EAAE,KAAK,GAAG,SAAS,GAAG,UAAU,CAAA;IACjD,cAAc,EAAE,cAAc,CAAA;IAC9B,KAAK,EAAE,KAAK,CAAA;IACZ,UAAU,EAAE;QACR,aAAa,EAAE,aAAa,CAAA;QAC5B,eAAe,EAAE,eAAe,CAAA;QAChC,WAAW,EAAE,WAAW,CAAA;QACxB,MAAM,EAAE,MAAM,CAAA;KACjB,CAAA;CACJ;AAKD,eAAO,MAAM,iBAAiB,aAuC5B,CAAA;AAgBF,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,EAAE,CAG9E;AAgmBD,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,YAAY,CA2GxD"}