opencode-qwen-cli-auth 1.0.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 (76) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +162 -0
  3. package/dist/index.d.ts +21 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +167 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/lib/auth/auth.d.ts +65 -0
  8. package/dist/lib/auth/auth.d.ts.map +1 -0
  9. package/dist/lib/auth/auth.js +419 -0
  10. package/dist/lib/auth/auth.js.map +1 -0
  11. package/dist/lib/auth/browser.d.ts +16 -0
  12. package/dist/lib/auth/browser.d.ts.map +1 -0
  13. package/dist/lib/auth/browser.js +37 -0
  14. package/dist/lib/auth/browser.js.map +1 -0
  15. package/dist/lib/config.d.ts +28 -0
  16. package/dist/lib/config.d.ts.map +1 -0
  17. package/dist/lib/config.js +63 -0
  18. package/dist/lib/config.js.map +1 -0
  19. package/dist/lib/constants.d.ts +105 -0
  20. package/dist/lib/constants.d.ts.map +1 -0
  21. package/dist/lib/constants.js +105 -0
  22. package/dist/lib/constants.js.map +1 -0
  23. package/dist/lib/logger.d.ts +33 -0
  24. package/dist/lib/logger.d.ts.map +1 -0
  25. package/dist/lib/logger.js +100 -0
  26. package/dist/lib/logger.js.map +1 -0
  27. package/dist/lib/prompts/fallback/opencode-qwen-prompt.txt +109 -0
  28. package/dist/lib/prompts/opencode-qwen.d.ts +14 -0
  29. package/dist/lib/prompts/opencode-qwen.d.ts.map +1 -0
  30. package/dist/lib/prompts/opencode-qwen.js +121 -0
  31. package/dist/lib/prompts/opencode-qwen.js.map +1 -0
  32. package/dist/lib/prompts/qwen-code.d.ts +25 -0
  33. package/dist/lib/prompts/qwen-code.d.ts.map +1 -0
  34. package/dist/lib/prompts/qwen-code.js +307 -0
  35. package/dist/lib/prompts/qwen-code.js.map +1 -0
  36. package/dist/lib/prompts/qwen-opencode-bridge.d.ts +15 -0
  37. package/dist/lib/prompts/qwen-opencode-bridge.d.ts.map +1 -0
  38. package/dist/lib/prompts/qwen-opencode-bridge.js +81 -0
  39. package/dist/lib/prompts/qwen-opencode-bridge.js.map +1 -0
  40. package/dist/lib/request/fetch-helpers.d.ts +19 -0
  41. package/dist/lib/request/fetch-helpers.d.ts.map +1 -0
  42. package/dist/lib/request/fetch-helpers.js +50 -0
  43. package/dist/lib/request/fetch-helpers.js.map +1 -0
  44. package/dist/lib/request/header-utils.d.ts +38 -0
  45. package/dist/lib/request/header-utils.d.ts.map +1 -0
  46. package/dist/lib/request/header-utils.js +75 -0
  47. package/dist/lib/request/header-utils.js.map +1 -0
  48. package/dist/lib/request/openai-chunk-builder.d.ts +68 -0
  49. package/dist/lib/request/openai-chunk-builder.d.ts.map +1 -0
  50. package/dist/lib/request/openai-chunk-builder.js +110 -0
  51. package/dist/lib/request/openai-chunk-builder.js.map +1 -0
  52. package/dist/lib/request/payload-analyzer.d.ts +34 -0
  53. package/dist/lib/request/payload-analyzer.d.ts.map +1 -0
  54. package/dist/lib/request/payload-analyzer.js +114 -0
  55. package/dist/lib/request/payload-analyzer.js.map +1 -0
  56. package/dist/lib/request/request-transformer.d.ts +39 -0
  57. package/dist/lib/request/request-transformer.d.ts.map +1 -0
  58. package/dist/lib/request/request-transformer.js +108 -0
  59. package/dist/lib/request/request-transformer.js.map +1 -0
  60. package/dist/lib/request/response-handler.d.ts +15 -0
  61. package/dist/lib/request/response-handler.d.ts.map +1 -0
  62. package/dist/lib/request/response-handler.js +90 -0
  63. package/dist/lib/request/response-handler.js.map +1 -0
  64. package/dist/lib/request/sse-parser.d.ts +36 -0
  65. package/dist/lib/request/sse-parser.d.ts.map +1 -0
  66. package/dist/lib/request/sse-parser.js +85 -0
  67. package/dist/lib/request/sse-parser.js.map +1 -0
  68. package/dist/lib/request/stream-normalizer.d.ts +18 -0
  69. package/dist/lib/request/stream-normalizer.d.ts.map +1 -0
  70. package/dist/lib/request/stream-normalizer.js +140 -0
  71. package/dist/lib/request/stream-normalizer.js.map +1 -0
  72. package/dist/lib/types.d.ts +180 -0
  73. package/dist/lib/types.d.ts.map +1 -0
  74. package/dist/lib/types.js +2 -0
  75. package/dist/lib/types.js.map +1 -0
  76. package/package.json +67 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Geoff Hammond
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,162 @@
1
+ # opencode-qwen-cli-auth
2
+ OAuth plugin for OpenCode that lets you use Qwen models with your Qwen account, without managing a DashScope API key directly.
3
+
4
+ ## Scope
5
+
6
+ - Uses OAuth Device Authorization Grant (RFC 8628) for sign-in.
7
+ - Best suited for personal/dev workflows.
8
+ - For production or commercial workloads, use DashScope API key auth instead:
9
+ https://dashscope.console.aliyun.com/
10
+
11
+ ## Features
12
+
13
+ - OAuth login through `opencode auth login`.
14
+ - Automatic token refresh before expiration.
15
+ - Dynamic API base URL from token `resource_url` with safe fallback.
16
+ - Model normalization to `coder-model` for Qwen Portal API.
17
+ - Optional prompt bridge behavior via `QWEN_MODE`.
18
+ - Optional debug and request logging via environment variables.
19
+
20
+ ## Requirements
21
+
22
+ - Qwen account
23
+ - OpenCode
24
+ - Node.js `>=20` (only required when building/testing from source)
25
+
26
+ ## Quick start
27
+
28
+ Add the plugin to your OpenCode config:
29
+
30
+ ```json
31
+ {
32
+ "$schema": "https://opencode.ai/config.json",
33
+ "plugin": ["opencode-qwen-cli-auth"],
34
+ "model": "alibaba/coder-model"
35
+ }
36
+ ```
37
+
38
+ Then sign in:
39
+
40
+ ```bash
41
+ opencode auth login
42
+ ```
43
+
44
+ Choose `Alibaba` -> `Qwen Account (OAuth)`.
45
+
46
+ ## Usage
47
+
48
+ ```bash
49
+ opencode run "create a hello world file" --model=alibaba/coder-model
50
+ opencode chat --model=alibaba/coder-model
51
+ ```
52
+
53
+ Always keep the provider prefix `alibaba/` in model configuration.
54
+
55
+ ## Configuration
56
+
57
+ ### `QWEN_MODE`
58
+
59
+ Resolution order:
60
+
61
+ 1. Environment variable `QWEN_MODE`
62
+ 2. File `~/.opencode/qwen/auth-config.json`
63
+ 3. Default value: `true`
64
+
65
+ Example `~/.opencode/qwen/auth-config.json`:
66
+
67
+ ```json
68
+ {
69
+ "qwenMode": true
70
+ }
71
+ ```
72
+
73
+ Supported env values:
74
+
75
+ - Enable: `QWEN_MODE=1` or `QWEN_MODE=true`
76
+ - Disable: `QWEN_MODE=0` or `QWEN_MODE=false`
77
+
78
+ ## Logging and debug
79
+
80
+ - Enable debug logs:
81
+
82
+ ```bash
83
+ DEBUG_QWEN_PLUGIN=1 opencode run "your prompt"
84
+ ```
85
+
86
+ - Enable request logging to files:
87
+
88
+ ```bash
89
+ ENABLE_PLUGIN_REQUEST_LOGGING=1 opencode run "your prompt"
90
+ ```
91
+
92
+ Log path: `~/.opencode/logs/qwen-plugin/`
93
+
94
+ ## Local plugin data
95
+
96
+ - OAuth token: `~/.opencode/qwen/oauth_token.json`
97
+ - Plugin config: `~/.opencode/qwen/auth-config.json`
98
+ - Prompt cache: `~/.opencode/cache/`
99
+
100
+ ## Troubleshooting
101
+
102
+ ### `Authentication required. Please run: opencode auth login`
103
+
104
+ Token is missing or refresh failed. Re-authenticate:
105
+
106
+ ```bash
107
+ opencode auth login
108
+ ```
109
+
110
+ ### Device authorization timed out
111
+
112
+ The device code expired or was not confirmed in time. Run `opencode auth login` again and confirm in the browser sooner.
113
+
114
+ ### `429` rate limit
115
+
116
+ The server is throttling requests. Reduce request frequency and retry later.
117
+
118
+ ### Wrong model behavior
119
+
120
+ Ensure your model is set correctly in OpenCode:
121
+
122
+ ```yaml
123
+ model: alibaba/coder-model
124
+ ```
125
+
126
+ ## Clear auth state
127
+
128
+ - macOS/Linux:
129
+
130
+ ```bash
131
+ rm -rf ~/.opencode/qwen/
132
+ ```
133
+
134
+ - PowerShell:
135
+
136
+ ```powershell
137
+ Remove-Item -Recurse -Force "$HOME/.opencode/qwen"
138
+ ```
139
+
140
+ Then log in again with `opencode auth login`.
141
+
142
+ ## Development
143
+
144
+ ```bash
145
+ npm run build
146
+ npm run typecheck
147
+ npm run test
148
+ npm run lint
149
+ ```
150
+
151
+ ## Policy and links
152
+
153
+ - Terms of Service: https://qwen.ai/termsservice
154
+ - Privacy Policy: https://qwen.ai/privacypolicy
155
+ - Usage Policy: https://qwen.ai/usagepolicy
156
+ - NPM: https://www.npmjs.com/package/opencode-qwen-cli-auth
157
+ - Repository: https://github.com/TVD-00/opencode-qwen-cli-auth
158
+ - Issues: https://github.com/TVD-00/opencode-qwen-cli-auth/issues
159
+
160
+ ## License
161
+
162
+ MIT
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Alibaba Qwen OAuth Authentication Plugin for opencode
3
+ *
4
+ * @license MIT with Usage Disclaimer (see LICENSE file)
5
+ * @repository https://github.com/TVD-00/opencode-qwen-cli-auth
6
+ */
7
+ import type { Plugin } from "@opencode-ai/plugin";
8
+ /**
9
+ * Alibaba Qwen OAuth authentication plugin for opencode
10
+ *
11
+ * @example
12
+ * ```json
13
+ * {
14
+ * "plugin": ["opencode-alibaba-qwen-cli-auth"],
15
+ * "model": "alibaba/coder-model"
16
+ * }
17
+ * ```
18
+ */
19
+ export declare const QwenAuthPlugin: Plugin;
20
+ export default QwenAuthPlugin;
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAC;AAoB/D;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,cAAc,EAAE,MA8P5B,CAAC;AAEF,eAAe,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Alibaba Qwen OAuth Authentication Plugin for opencode
3
+ *
4
+ * Plugin don gian: chi xu ly OAuth login + tra apiKey/baseURL cho SDK.
5
+ * SDK tu xu ly streaming, headers, request format.
6
+ *
7
+ * @license MIT with Usage Disclaimer (see LICENSE file)
8
+ * @repository https://github.com/TVD-00/opencode-qwen-cli-auth
9
+ */
10
+ import { createPKCE, requestDeviceCode, pollForToken, getApiBaseUrl, saveToken, refreshAccessToken, loadStoredToken } from "./lib/auth/auth.js";
11
+ import { PROVIDER_ID, AUTH_LABELS, DEVICE_FLOW } from "./lib/constants.js";
12
+ import { logError, logInfo, LOGGING_ENABLED } from "./lib/logger.js";
13
+ /**
14
+ * Lay access token hop le tu SDK auth state, refresh neu het han
15
+ * Dung getAuth() cua SDK thay vi doc file truc tiep
16
+ *
17
+ * @param getAuth - Ham lay auth state tu SDK
18
+ * @returns access token hoac null
19
+ */
20
+ async function getValidAccessToken(getAuth) {
21
+ const auth = await getAuth();
22
+ if (!auth || auth.type !== "oauth") {
23
+ return null;
24
+ }
25
+ let accessToken = auth.access;
26
+ // Refresh neu het han (buffer 60 giay)
27
+ if (accessToken && auth.expires && Date.now() > auth.expires - 60000 && auth.refresh) {
28
+ try {
29
+ const refreshResult = await refreshAccessToken(auth.refresh);
30
+ if (refreshResult.type === "success") {
31
+ accessToken = refreshResult.access;
32
+ saveToken(refreshResult);
33
+ }
34
+ else {
35
+ if (LOGGING_ENABLED) {
36
+ logError("Token refresh failed");
37
+ }
38
+ accessToken = undefined;
39
+ }
40
+ }
41
+ catch (e) {
42
+ if (LOGGING_ENABLED) {
43
+ logError("Token refresh error:", e);
44
+ }
45
+ accessToken = undefined;
46
+ }
47
+ }
48
+ return accessToken ?? null;
49
+ }
50
+ /**
51
+ * Lay base URL tu token luu tren disk (resource_url)
52
+ * Fallback ve portal.qwen.ai/v1 neu khong co
53
+ */
54
+ function getBaseUrl() {
55
+ try {
56
+ const stored = loadStoredToken();
57
+ if (stored?.resource_url) {
58
+ return getApiBaseUrl(stored.resource_url);
59
+ }
60
+ }
61
+ catch (_) {
62
+ // Loi doc file, dung default
63
+ }
64
+ return getApiBaseUrl();
65
+ }
66
+ /**
67
+ * Alibaba Qwen OAuth authentication plugin for opencode
68
+ *
69
+ * @example
70
+ * ```json
71
+ * {
72
+ * "plugin": ["opencode-alibaba-qwen-cli-auth"],
73
+ * "model": "alibaba/coder-model"
74
+ * }
75
+ * ```
76
+ */
77
+ export const QwenAuthPlugin = async (_input) => {
78
+ return {
79
+ auth: {
80
+ provider: PROVIDER_ID,
81
+ /**
82
+ * Loader: lay token + base URL, tra ve cho SDK
83
+ * Khong can custom fetch - SDK tu xu ly streaming va headers
84
+ */
85
+ async loader(getAuth, provider) {
86
+ const auth = await getAuth();
87
+ // Chi xu ly OAuth, bo qua API key auth
88
+ if (auth.type !== "oauth") {
89
+ return {};
90
+ }
91
+ const accessToken = await getValidAccessToken(getAuth);
92
+ if (!accessToken) {
93
+ return null;
94
+ }
95
+ const baseUrl = getBaseUrl();
96
+ // Tra ve apiKey + baseURL, SDK tu xu ly phan con lai
97
+ return {
98
+ apiKey: accessToken,
99
+ baseURL: baseUrl,
100
+ };
101
+ },
102
+ methods: [
103
+ {
104
+ label: AUTH_LABELS.OAUTH,
105
+ type: "oauth",
106
+ /**
107
+ * Device Authorization Grant OAuth flow (RFC 8628)
108
+ */
109
+ authorize: async () => {
110
+ // Generate PKCE
111
+ const pkce = await createPKCE();
112
+ // Request device code
113
+ const deviceAuth = await requestDeviceCode(pkce);
114
+ if (!deviceAuth) {
115
+ throw new Error("Failed to request device code");
116
+ }
117
+ // Hien thi user code
118
+ console.log(`\nPlease visit: ${deviceAuth.verification_uri}`);
119
+ console.log(`And enter code: ${deviceAuth.user_code}\n`);
120
+ // URL xac thuc - SDK se tu mo browser khi method=auto
121
+ const verificationUrl = deviceAuth.verification_uri_complete || deviceAuth.verification_uri;
122
+ return {
123
+ url: verificationUrl,
124
+ method: "auto",
125
+ instructions: AUTH_LABELS.INSTRUCTIONS,
126
+ callback: async () => {
127
+ // Poll for token
128
+ let pollInterval = (deviceAuth.interval || 5) * 1000;
129
+ const POLLING_MARGIN_MS = 3000;
130
+ const maxInterval = DEVICE_FLOW.MAX_POLL_INTERVAL;
131
+ const startTime = Date.now();
132
+ const expiresIn = deviceAuth.expires_in * 1000;
133
+ while (Date.now() - startTime < expiresIn) {
134
+ await new Promise(resolve => setTimeout(resolve, pollInterval + POLLING_MARGIN_MS));
135
+ const result = await pollForToken(deviceAuth.device_code, pkce.verifier);
136
+ if (result.type === "success") {
137
+ saveToken(result);
138
+ // Tra ve cho SDK luu auth state
139
+ return {
140
+ type: "success",
141
+ access: result.access,
142
+ refresh: result.refresh,
143
+ expires: result.expires,
144
+ };
145
+ }
146
+ if (result.type === "slow_down") {
147
+ pollInterval = Math.min(pollInterval + 5000, maxInterval);
148
+ continue;
149
+ }
150
+ if (result.type === "pending") {
151
+ continue;
152
+ }
153
+ // denied, expired, failed -> dung lai
154
+ return { type: "failed" };
155
+ }
156
+ console.error("[qwen-oauth-plugin] Device authorization timed out");
157
+ return { type: "failed" };
158
+ },
159
+ };
160
+ },
161
+ },
162
+ ],
163
+ },
164
+ };
165
+ };
166
+ export default QwenAuthPlugin;
167
+ //# 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,65 @@
1
+ import type { PKCEPair, DeviceAuthorizationResponse, TokenResult, StoredTokenData } from "../types.js";
2
+ /**
3
+ * Request device authorization code
4
+ * @param pkce - PKCE challenge/verifier pair
5
+ * @returns Device authorization response with user code and verification URL
6
+ */
7
+ export declare function requestDeviceCode(pkce: PKCEPair): Promise<DeviceAuthorizationResponse | null>;
8
+ /**
9
+ * Poll for token using device code
10
+ * @param deviceCode - Device code from authorization response
11
+ * @param verifier - PKCE verifier
12
+ * @param interval - Polling interval in seconds (from device response)
13
+ * @returns Token result or null if still pending
14
+ */
15
+ export declare function pollForToken(deviceCode: string, verifier: string, interval?: number): Promise<TokenResult>;
16
+ /**
17
+ * Refresh access token using refresh token
18
+ * @param refreshToken - Refresh token
19
+ * @returns Token result
20
+ */
21
+ export declare function refreshAccessToken(refreshToken: string): Promise<TokenResult>;
22
+ /**
23
+ * Generate PKCE challenge and verifier
24
+ * @returns PKCE pair
25
+ */
26
+ export declare function createPKCE(): Promise<PKCEPair>;
27
+ /**
28
+ * Load stored token from disk
29
+ * @returns Stored token data or null if not found
30
+ */
31
+ export declare function loadStoredToken(): StoredTokenData | null;
32
+ /**
33
+ * Xoa token luu tren disk khi token khong con hop le
34
+ */
35
+ export declare function clearStoredToken(): void;
36
+ /**
37
+ * Save token to disk
38
+ * @param tokenResult - Token result from OAuth flow
39
+ */
40
+ export declare function saveToken(tokenResult: TokenResult): void;
41
+ /**
42
+ * Check if token is expired (with 5 minute buffer)
43
+ * @param expiresAt - Expiration timestamp in milliseconds
44
+ * @returns True if token is expired or will expire soon
45
+ */
46
+ export declare function isTokenExpired(expiresAt: number): boolean;
47
+ /**
48
+ * Get valid access token, refreshing if necessary
49
+ * @returns Access token and resource URL, or null if authentication required
50
+ */
51
+ export declare function getValidToken(): Promise<{
52
+ accessToken: string;
53
+ resourceUrl?: string;
54
+ } | null>;
55
+ /**
56
+ * Get Portal API base URL from token or use default
57
+ * @param resourceUrl - Resource URL from token (optional)
58
+ * @returns Portal API base URL
59
+ *
60
+ * IMPORTANT: Portal API uses /v1 path (not /api/v1)
61
+ * - OAuth endpoints: /api/v1/oauth2/ (for authentication)
62
+ * - Chat API: /v1/ (for completions)
63
+ */
64
+ export declare function getApiBaseUrl(resourceUrl?: string): string;
65
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../lib/auth/auth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,2BAA2B,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAgEvG;;;;GAIG;AACH,wBAAsB,iBAAiB,CACtC,IAAI,EAAE,QAAQ,GACZ,OAAO,CAAC,2BAA2B,GAAG,IAAI,CAAC,CA6C7C;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CACjC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,MAAU,GAClB,OAAO,CAAC,WAAW,CAAC,CA4EtB;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CA2DnF;AAED;;;GAGG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,QAAQ,CAAC,CAGpD;AAED;;;GAGG;AACH,wBAAgB,eAAe,IAAI,eAAe,GAAG,IAAI,CAsBxD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CA8BxD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEzD;AAED;;;GAGG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAC9C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,IAAI,CAAC,CAiCR;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAoC1D"}