@sudocode-ai/integration-openspec 0.1.14
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/dist/id-generator.d.ts +114 -0
- package/dist/id-generator.d.ts.map +1 -0
- package/dist/id-generator.js +165 -0
- package/dist/id-generator.js.map +1 -0
- package/dist/index.d.ts +29 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +692 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/change-parser.d.ts +164 -0
- package/dist/parser/change-parser.d.ts.map +1 -0
- package/dist/parser/change-parser.js +339 -0
- package/dist/parser/change-parser.js.map +1 -0
- package/dist/parser/markdown-utils.d.ts +138 -0
- package/dist/parser/markdown-utils.d.ts.map +1 -0
- package/dist/parser/markdown-utils.js +283 -0
- package/dist/parser/markdown-utils.js.map +1 -0
- package/dist/parser/spec-parser.d.ts +116 -0
- package/dist/parser/spec-parser.d.ts.map +1 -0
- package/dist/parser/spec-parser.js +204 -0
- package/dist/parser/spec-parser.js.map +1 -0
- package/dist/parser/tasks-parser.d.ts +120 -0
- package/dist/parser/tasks-parser.d.ts.map +1 -0
- package/dist/parser/tasks-parser.js +176 -0
- package/dist/parser/tasks-parser.js.map +1 -0
- package/dist/watcher.d.ts +160 -0
- package/dist/watcher.d.ts.map +1 -0
- package/dist/watcher.js +614 -0
- package/dist/watcher.js.map +1 -0
- package/dist/writer/index.d.ts +9 -0
- package/dist/writer/index.d.ts.map +1 -0
- package/dist/writer/index.js +9 -0
- package/dist/writer/index.js.map +1 -0
- package/dist/writer/spec-writer.d.ts +24 -0
- package/dist/writer/spec-writer.d.ts.map +1 -0
- package/dist/writer/spec-writer.js +75 -0
- package/dist/writer/spec-writer.js.map +1 -0
- package/dist/writer/tasks-writer.d.ts +33 -0
- package/dist/writer/tasks-writer.d.ts.map +1 -0
- package/dist/writer/tasks-writer.js +144 -0
- package/dist/writer/tasks-writer.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenSpec ID Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates deterministic, path-based IDs for OpenSpec entities.
|
|
5
|
+
* IDs are stable across syncs - the same input always produces the same output.
|
|
6
|
+
*
|
|
7
|
+
* ID Format:
|
|
8
|
+
* - Specs: os-xxxx (e.g., os-a1b2)
|
|
9
|
+
* - Changes: osc-xxxx (e.g., osc-c3d4)
|
|
10
|
+
*/
|
|
11
|
+
/** Default prefix for OpenSpec spec IDs */
|
|
12
|
+
export declare const DEFAULT_SPEC_PREFIX = "os";
|
|
13
|
+
/** Default prefix for OpenSpec change IDs */
|
|
14
|
+
export declare const DEFAULT_CHANGE_PREFIX = "osc";
|
|
15
|
+
/**
|
|
16
|
+
* Generate a deterministic spec ID from a capability name.
|
|
17
|
+
*
|
|
18
|
+
* The ID is generated by hashing "openspec-spec-{capability}" and
|
|
19
|
+
* taking the first 4 hex characters.
|
|
20
|
+
*
|
|
21
|
+
* @param capability - The capability name (e.g., "cli-init")
|
|
22
|
+
* @param prefix - ID prefix (default: "os")
|
|
23
|
+
* @returns Deterministic spec ID (e.g., "os-a1b2")
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* generateSpecId("cli-init") // Returns same ID every time
|
|
27
|
+
* generateSpecId("cli-init", "os") // Same as above, explicit prefix
|
|
28
|
+
* generateSpecId("cli-init", "spec") // "spec-a1b2"
|
|
29
|
+
*/
|
|
30
|
+
export declare function generateSpecId(capability: string, prefix?: string): string;
|
|
31
|
+
/**
|
|
32
|
+
* Generate a deterministic change ID from a change name.
|
|
33
|
+
*
|
|
34
|
+
* The ID is generated by hashing "openspec-change-{changeName}" and
|
|
35
|
+
* taking the first 4 hex characters.
|
|
36
|
+
*
|
|
37
|
+
* @param changeName - The change name (e.g., "add-feature")
|
|
38
|
+
* @param prefix - ID prefix (default: "osc")
|
|
39
|
+
* @returns Deterministic change ID (e.g., "osc-c3d4")
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* generateChangeId("add-feature") // Returns same ID every time
|
|
43
|
+
* generateChangeId("add-feature", "osc") // Same as above, explicit prefix
|
|
44
|
+
* generateChangeId("add-feature", "ch") // "ch-c3d4"
|
|
45
|
+
*/
|
|
46
|
+
export declare function generateChangeId(changeName: string, prefix?: string): string;
|
|
47
|
+
/**
|
|
48
|
+
* Parsed result from an OpenSpec ID
|
|
49
|
+
*/
|
|
50
|
+
export interface ParsedOpenSpecId {
|
|
51
|
+
/** Entity type: 'spec' or 'change' */
|
|
52
|
+
type: "spec" | "change";
|
|
53
|
+
/** The original name used to generate this ID (if recoverable) */
|
|
54
|
+
name: string;
|
|
55
|
+
/** The hash portion of the ID */
|
|
56
|
+
hash: string;
|
|
57
|
+
/** The prefix portion of the ID */
|
|
58
|
+
prefix: string;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Parse an OpenSpec ID to extract its components.
|
|
62
|
+
*
|
|
63
|
+
* Note: This only extracts structural information from the ID.
|
|
64
|
+
* The original name cannot be recovered from the hash alone -
|
|
65
|
+
* it must be provided or looked up separately.
|
|
66
|
+
*
|
|
67
|
+
* OpenSpec IDs require at least a 2-character prefix to distinguish
|
|
68
|
+
* them from sudocode IDs (which use single-character prefixes like s- and i-).
|
|
69
|
+
*
|
|
70
|
+
* @param id - The OpenSpec ID to parse (e.g., "os-a1b2" or "osc-c3d4")
|
|
71
|
+
* @returns Parsed ID components, or null if invalid format
|
|
72
|
+
*
|
|
73
|
+
* @example
|
|
74
|
+
* parseOpenSpecId("os-a1b2")
|
|
75
|
+
* // Returns: { type: "spec", name: "", hash: "a1b2", prefix: "os" }
|
|
76
|
+
*
|
|
77
|
+
* parseOpenSpecId("osc-c3d4")
|
|
78
|
+
* // Returns: { type: "change", name: "", hash: "c3d4", prefix: "osc" }
|
|
79
|
+
*
|
|
80
|
+
* parseOpenSpecId("invalid")
|
|
81
|
+
* // Returns: null
|
|
82
|
+
*
|
|
83
|
+
* parseOpenSpecId("s-abcd")
|
|
84
|
+
* // Returns: null (sudocode format, not OpenSpec)
|
|
85
|
+
*/
|
|
86
|
+
export declare function parseOpenSpecId(id: string): ParsedOpenSpecId | null;
|
|
87
|
+
/**
|
|
88
|
+
* Verify that a given ID matches the expected ID for a name.
|
|
89
|
+
*
|
|
90
|
+
* Useful for validating that an ID was generated correctly.
|
|
91
|
+
*
|
|
92
|
+
* @param id - The ID to verify
|
|
93
|
+
* @param name - The name that should produce this ID
|
|
94
|
+
* @param type - Entity type ('spec' or 'change')
|
|
95
|
+
* @returns True if the ID matches what would be generated from the name
|
|
96
|
+
*
|
|
97
|
+
* @example
|
|
98
|
+
* verifyOpenSpecId("os-a1b2", "cli-init", "spec") // true or false
|
|
99
|
+
*/
|
|
100
|
+
export declare function verifyOpenSpecId(id: string, name: string, type: "spec" | "change"): boolean;
|
|
101
|
+
/**
|
|
102
|
+
* Check if a string is a valid OpenSpec ID format.
|
|
103
|
+
*
|
|
104
|
+
* @param id - The string to check
|
|
105
|
+
* @returns True if the string matches OpenSpec ID format
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* isOpenSpecId("os-a1b2") // true
|
|
109
|
+
* isOpenSpecId("osc-c3d4") // true
|
|
110
|
+
* isOpenSpecId("invalid") // false
|
|
111
|
+
* isOpenSpecId("s-abcd") // false (sudocode format, not OpenSpec)
|
|
112
|
+
*/
|
|
113
|
+
export declare function isOpenSpecId(id: string): boolean;
|
|
114
|
+
//# sourceMappingURL=id-generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-generator.d.ts","sourceRoot":"","sources":["../src/id-generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,2CAA2C;AAC3C,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAExC,6CAA6C;AAC7C,eAAO,MAAM,qBAAqB,QAAQ,CAAC;AAkB3C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAA4B,GACnC,MAAM,CAUR;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,MAA8B,GACrC,MAAM,CAUR;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sCAAsC;IACtC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxB,kEAAkE;IAClE,IAAI,EAAE,MAAM,CAAC;IACb,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI,CA2BnE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GAAG,QAAQ,GACtB,OAAO,CAYT;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAEhD"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenSpec ID Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates deterministic, path-based IDs for OpenSpec entities.
|
|
5
|
+
* IDs are stable across syncs - the same input always produces the same output.
|
|
6
|
+
*
|
|
7
|
+
* ID Format:
|
|
8
|
+
* - Specs: os-xxxx (e.g., os-a1b2)
|
|
9
|
+
* - Changes: osc-xxxx (e.g., osc-c3d4)
|
|
10
|
+
*/
|
|
11
|
+
import { createHash } from "crypto";
|
|
12
|
+
/** Default prefix for OpenSpec spec IDs */
|
|
13
|
+
export const DEFAULT_SPEC_PREFIX = "os";
|
|
14
|
+
/** Default prefix for OpenSpec change IDs */
|
|
15
|
+
export const DEFAULT_CHANGE_PREFIX = "osc";
|
|
16
|
+
/** Default hash length (4 hex characters) */
|
|
17
|
+
const DEFAULT_HASH_LENGTH = 4;
|
|
18
|
+
/**
|
|
19
|
+
* Generate a deterministic hash from an input string.
|
|
20
|
+
* Uses SHA256 and takes the first N hex characters.
|
|
21
|
+
*
|
|
22
|
+
* @param input - The input string to hash
|
|
23
|
+
* @param length - Number of hex characters to return (default: 4)
|
|
24
|
+
* @returns Lowercase hex hash substring
|
|
25
|
+
*/
|
|
26
|
+
function generateHash(input, length = DEFAULT_HASH_LENGTH) {
|
|
27
|
+
const hash = createHash("sha256").update(input).digest("hex");
|
|
28
|
+
return hash.substring(0, length).toLowerCase();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Generate a deterministic spec ID from a capability name.
|
|
32
|
+
*
|
|
33
|
+
* The ID is generated by hashing "openspec-spec-{capability}" and
|
|
34
|
+
* taking the first 4 hex characters.
|
|
35
|
+
*
|
|
36
|
+
* @param capability - The capability name (e.g., "cli-init")
|
|
37
|
+
* @param prefix - ID prefix (default: "os")
|
|
38
|
+
* @returns Deterministic spec ID (e.g., "os-a1b2")
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* generateSpecId("cli-init") // Returns same ID every time
|
|
42
|
+
* generateSpecId("cli-init", "os") // Same as above, explicit prefix
|
|
43
|
+
* generateSpecId("cli-init", "spec") // "spec-a1b2"
|
|
44
|
+
*/
|
|
45
|
+
export function generateSpecId(capability, prefix = DEFAULT_SPEC_PREFIX) {
|
|
46
|
+
if (!capability || capability.trim() === "") {
|
|
47
|
+
throw new Error("Capability name is required for spec ID generation");
|
|
48
|
+
}
|
|
49
|
+
const normalizedCapability = capability.trim().toLowerCase();
|
|
50
|
+
const hashInput = `openspec-spec-${normalizedCapability}`;
|
|
51
|
+
const hash = generateHash(hashInput);
|
|
52
|
+
return `${prefix}-${hash}`;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Generate a deterministic change ID from a change name.
|
|
56
|
+
*
|
|
57
|
+
* The ID is generated by hashing "openspec-change-{changeName}" and
|
|
58
|
+
* taking the first 4 hex characters.
|
|
59
|
+
*
|
|
60
|
+
* @param changeName - The change name (e.g., "add-feature")
|
|
61
|
+
* @param prefix - ID prefix (default: "osc")
|
|
62
|
+
* @returns Deterministic change ID (e.g., "osc-c3d4")
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* generateChangeId("add-feature") // Returns same ID every time
|
|
66
|
+
* generateChangeId("add-feature", "osc") // Same as above, explicit prefix
|
|
67
|
+
* generateChangeId("add-feature", "ch") // "ch-c3d4"
|
|
68
|
+
*/
|
|
69
|
+
export function generateChangeId(changeName, prefix = DEFAULT_CHANGE_PREFIX) {
|
|
70
|
+
if (!changeName || changeName.trim() === "") {
|
|
71
|
+
throw new Error("Change name is required for change ID generation");
|
|
72
|
+
}
|
|
73
|
+
const normalizedChangeName = changeName.trim().toLowerCase();
|
|
74
|
+
const hashInput = `openspec-change-${normalizedChangeName}`;
|
|
75
|
+
const hash = generateHash(hashInput);
|
|
76
|
+
return `${prefix}-${hash}`;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Parse an OpenSpec ID to extract its components.
|
|
80
|
+
*
|
|
81
|
+
* Note: This only extracts structural information from the ID.
|
|
82
|
+
* The original name cannot be recovered from the hash alone -
|
|
83
|
+
* it must be provided or looked up separately.
|
|
84
|
+
*
|
|
85
|
+
* OpenSpec IDs require at least a 2-character prefix to distinguish
|
|
86
|
+
* them from sudocode IDs (which use single-character prefixes like s- and i-).
|
|
87
|
+
*
|
|
88
|
+
* @param id - The OpenSpec ID to parse (e.g., "os-a1b2" or "osc-c3d4")
|
|
89
|
+
* @returns Parsed ID components, or null if invalid format
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* parseOpenSpecId("os-a1b2")
|
|
93
|
+
* // Returns: { type: "spec", name: "", hash: "a1b2", prefix: "os" }
|
|
94
|
+
*
|
|
95
|
+
* parseOpenSpecId("osc-c3d4")
|
|
96
|
+
* // Returns: { type: "change", name: "", hash: "c3d4", prefix: "osc" }
|
|
97
|
+
*
|
|
98
|
+
* parseOpenSpecId("invalid")
|
|
99
|
+
* // Returns: null
|
|
100
|
+
*
|
|
101
|
+
* parseOpenSpecId("s-abcd")
|
|
102
|
+
* // Returns: null (sudocode format, not OpenSpec)
|
|
103
|
+
*/
|
|
104
|
+
export function parseOpenSpecId(id) {
|
|
105
|
+
if (!id || typeof id !== "string") {
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
// Match pattern: prefix-hash where prefix is at least 2 characters
|
|
109
|
+
// This distinguishes OpenSpec IDs (os-, osc-) from sudocode IDs (s-, i-)
|
|
110
|
+
const match = id.match(/^([a-z]{2,})-([0-9a-f]{4,})$/i);
|
|
111
|
+
if (!match) {
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
const [, prefix, hash] = match;
|
|
115
|
+
const normalizedPrefix = prefix.toLowerCase();
|
|
116
|
+
// Determine type based on prefix
|
|
117
|
+
// Default change prefix is "osc", default spec prefix is "os"
|
|
118
|
+
// For custom prefixes, we use "osc" as the canonical change prefix
|
|
119
|
+
const isChange = normalizedPrefix === DEFAULT_CHANGE_PREFIX;
|
|
120
|
+
return {
|
|
121
|
+
type: isChange ? "change" : "spec",
|
|
122
|
+
name: "", // Cannot recover name from hash - must be looked up
|
|
123
|
+
hash: hash.toLowerCase(),
|
|
124
|
+
prefix: normalizedPrefix,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Verify that a given ID matches the expected ID for a name.
|
|
129
|
+
*
|
|
130
|
+
* Useful for validating that an ID was generated correctly.
|
|
131
|
+
*
|
|
132
|
+
* @param id - The ID to verify
|
|
133
|
+
* @param name - The name that should produce this ID
|
|
134
|
+
* @param type - Entity type ('spec' or 'change')
|
|
135
|
+
* @returns True if the ID matches what would be generated from the name
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* verifyOpenSpecId("os-a1b2", "cli-init", "spec") // true or false
|
|
139
|
+
*/
|
|
140
|
+
export function verifyOpenSpecId(id, name, type) {
|
|
141
|
+
const parsed = parseOpenSpecId(id);
|
|
142
|
+
if (!parsed) {
|
|
143
|
+
return false;
|
|
144
|
+
}
|
|
145
|
+
const expectedId = type === "spec"
|
|
146
|
+
? generateSpecId(name, parsed.prefix)
|
|
147
|
+
: generateChangeId(name, parsed.prefix);
|
|
148
|
+
return id.toLowerCase() === expectedId.toLowerCase();
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Check if a string is a valid OpenSpec ID format.
|
|
152
|
+
*
|
|
153
|
+
* @param id - The string to check
|
|
154
|
+
* @returns True if the string matches OpenSpec ID format
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* isOpenSpecId("os-a1b2") // true
|
|
158
|
+
* isOpenSpecId("osc-c3d4") // true
|
|
159
|
+
* isOpenSpecId("invalid") // false
|
|
160
|
+
* isOpenSpecId("s-abcd") // false (sudocode format, not OpenSpec)
|
|
161
|
+
*/
|
|
162
|
+
export function isOpenSpecId(id) {
|
|
163
|
+
return parseOpenSpecId(id) !== null;
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=id-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id-generator.js","sourceRoot":"","sources":["../src/id-generator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenSpec Integration Plugin for sudocode
|
|
3
|
+
*
|
|
4
|
+
* Provides integration with OpenSpec - a standardized specification format
|
|
5
|
+
* for AI-assisted development. Syncs specs and issues to sudocode.
|
|
6
|
+
*/
|
|
7
|
+
import type { IntegrationPlugin } from "@sudocode-ai/types";
|
|
8
|
+
/**
|
|
9
|
+
* OpenSpec specific configuration options
|
|
10
|
+
*/
|
|
11
|
+
export interface OpenSpecOptions {
|
|
12
|
+
/** Path to the OpenSpec directory (relative to project root) */
|
|
13
|
+
path: string;
|
|
14
|
+
/** Prefix for spec IDs imported from OpenSpec (default: "os") */
|
|
15
|
+
spec_prefix?: string;
|
|
16
|
+
/** Prefix for issue IDs imported from OpenSpec (default: "osi") */
|
|
17
|
+
issue_prefix?: string;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* OpenSpec integration plugin
|
|
21
|
+
*/
|
|
22
|
+
declare const openSpecPlugin: IntegrationPlugin;
|
|
23
|
+
export default openSpecPlugin;
|
|
24
|
+
export { generateSpecId, generateChangeId, parseOpenSpecId, verifyOpenSpecId, isOpenSpecId, DEFAULT_SPEC_PREFIX, DEFAULT_CHANGE_PREFIX, type ParsedOpenSpecId, } from "./id-generator.js";
|
|
25
|
+
export { parseSpecFile, extractCapability, parseRequirements, parseScenarios, parseGivenWhenThen, SPEC_PATTERNS, type ParsedOpenSpecSpec, type ParsedRequirement, type ParsedScenario, } from "./parser/spec-parser.js";
|
|
26
|
+
export { parseTasks, parseTasksContent, getAllTasks, getIncompleteTasks, getTaskStats, calculateCompletionPercentage, isTasksFile, TASK_PATTERNS, type ParsedTask, type ParsedTasksFile, } from "./parser/tasks-parser.js";
|
|
27
|
+
export { parseChangeDirectory, extractChangeName, detectArchiveStatus, parseProposal, extractTitleFromWhatChanges, formatTitle, parseChangeTasks, scanAffectedSpecs, isChangeDirectory, scanChangeDirectories, parseAllChanges, CHANGE_PATTERNS, type ParsedOpenSpecChange, } from "./parser/change-parser.js";
|
|
28
|
+
export { OpenSpecWatcher, type OpenSpecWatcherOptions, type ChangeCallback, } from "./watcher.js";
|
|
29
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,iBAAiB,EASlB,MAAM,oBAAoB,CAAC;AAqB5B;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,iEAAiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AA+BD;;GAEG;AACH,QAAA,MAAM,cAAc,EAAE,iBA6FrB,CAAC;AAqqBF,eAAe,cAAc,CAAC;AAG9B,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,gBAAgB,GACtB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,yBAAyB,CAAC;AAGjC,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,WAAW,EACX,kBAAkB,EAClB,YAAY,EACZ,6BAA6B,EAC7B,WAAW,EACX,aAAa,EACb,KAAK,UAAU,EACf,KAAK,eAAe,GACrB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,EACb,2BAA2B,EAC3B,WAAW,EACX,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,eAAe,EACf,eAAe,EACf,KAAK,oBAAoB,GAC1B,MAAM,2BAA2B,CAAC;AAGnC,OAAO,EACL,eAAe,EACf,KAAK,sBAAsB,EAC3B,KAAK,cAAc,GACpB,MAAM,cAAc,CAAC"}
|