@gostack-framework/react 0.0.0-stage → 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 (138) hide show
  1. package/dist/api.d.ts +83 -0
  2. package/dist/api.js +170 -0
  3. package/dist/api.js.map +1 -0
  4. package/dist/auth.d.ts +60 -0
  5. package/dist/auth.js +136 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/data.d.ts +25 -0
  8. package/dist/data.js +73 -0
  9. package/dist/data.js.map +1 -0
  10. package/dist/examples.d.ts +6 -0
  11. package/dist/examples.js +47 -0
  12. package/dist/examples.js.map +1 -0
  13. package/dist/hooks.d.ts +58 -0
  14. package/dist/hooks.js +109 -0
  15. package/dist/hooks.js.map +1 -0
  16. package/dist/index.d.ts +20 -0
  17. package/dist/index.js +21 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/layouts.d.ts +6 -0
  20. package/dist/layouts.js +34 -0
  21. package/dist/layouts.js.map +1 -0
  22. package/dist/line-flow/bus.d.ts +13 -0
  23. package/dist/line-flow/bus.js +52 -0
  24. package/dist/line-flow/bus.js.map +1 -0
  25. package/dist/line-flow/derived-line.d.ts +21 -0
  26. package/dist/line-flow/derived-line.js +122 -0
  27. package/dist/line-flow/derived-line.js.map +1 -0
  28. package/dist/line-flow/errors.d.ts +62 -0
  29. package/dist/line-flow/errors.js +91 -0
  30. package/dist/line-flow/errors.js.map +1 -0
  31. package/dist/line-flow/event-line.d.ts +16 -0
  32. package/dist/line-flow/event-line.js +81 -0
  33. package/dist/line-flow/event-line.js.map +1 -0
  34. package/dist/line-flow/index.d.ts +11 -0
  35. package/dist/line-flow/index.js +11 -0
  36. package/dist/line-flow/index.js.map +1 -0
  37. package/dist/line-flow/interchange.d.ts +17 -0
  38. package/dist/line-flow/interchange.js +86 -0
  39. package/dist/line-flow/interchange.js.map +1 -0
  40. package/dist/line-flow/lineflow.d.ts +12 -0
  41. package/dist/line-flow/lineflow.js +15 -0
  42. package/dist/line-flow/lineflow.js.map +1 -0
  43. package/dist/line-flow/network.d.ts +28 -0
  44. package/dist/line-flow/network.js +165 -0
  45. package/dist/line-flow/network.js.map +1 -0
  46. package/dist/line-flow/react/bridge.d.ts +23 -0
  47. package/dist/line-flow/react/bridge.js +40 -0
  48. package/dist/line-flow/react/bridge.js.map +1 -0
  49. package/dist/line-flow/react/hooks.d.ts +29 -0
  50. package/dist/line-flow/react/hooks.js +117 -0
  51. package/dist/line-flow/react/hooks.js.map +1 -0
  52. package/dist/line-flow/react/index.d.ts +3 -0
  53. package/dist/line-flow/react/index.js +4 -0
  54. package/dist/line-flow/react/index.js.map +1 -0
  55. package/dist/line-flow/react/provider.d.ts +15 -0
  56. package/dist/line-flow/react/provider.js +25 -0
  57. package/dist/line-flow/react/provider.js.map +1 -0
  58. package/dist/line-flow/scope.d.ts +21 -0
  59. package/dist/line-flow/scope.js +157 -0
  60. package/dist/line-flow/scope.js.map +1 -0
  61. package/dist/line-flow/state-line.d.ts +21 -0
  62. package/dist/line-flow/state-line.js +106 -0
  63. package/dist/line-flow/state-line.js.map +1 -0
  64. package/dist/line-flow/taxi.d.ts +15 -0
  65. package/dist/line-flow/taxi.js +81 -0
  66. package/dist/line-flow/taxi.js.map +1 -0
  67. package/dist/line-flow/types.d.ts +222 -0
  68. package/dist/line-flow/types.js +2 -0
  69. package/dist/line-flow/types.js.map +1 -0
  70. package/dist/line-flow/utils.d.ts +24 -0
  71. package/dist/line-flow/utils.js +53 -0
  72. package/dist/line-flow/utils.js.map +1 -0
  73. package/dist/paramsSerializer.d.ts +87 -0
  74. package/dist/paramsSerializer.js +138 -0
  75. package/dist/paramsSerializer.js.map +1 -0
  76. package/dist/registry.d.ts +10 -0
  77. package/dist/registry.js +115 -0
  78. package/dist/registry.js.map +1 -0
  79. package/dist/runtime.d.ts +80 -0
  80. package/dist/runtime.js +442 -0
  81. package/dist/runtime.js.map +1 -0
  82. package/dist/schemas.d.ts +88 -0
  83. package/dist/schemas.js +146 -0
  84. package/dist/schemas.js.map +1 -0
  85. package/dist/services.d.ts +35 -0
  86. package/dist/services.js +65 -0
  87. package/dist/services.js.map +1 -0
  88. package/dist/shared-types/file.types.d.ts +12 -0
  89. package/dist/shared-types/file.types.js +2 -0
  90. package/dist/shared-types/file.types.js.map +1 -0
  91. package/dist/shared-types/gallery.types.d.ts +22 -0
  92. package/dist/shared-types/gallery.types.js +2 -0
  93. package/dist/shared-types/gallery.types.js.map +1 -0
  94. package/dist/shared-types/governorates.types.d.ts +12 -0
  95. package/dist/shared-types/governorates.types.js +2 -0
  96. package/dist/shared-types/governorates.types.js.map +1 -0
  97. package/dist/shared-types/grade.types.d.ts +7 -0
  98. package/dist/shared-types/grade.types.js +2 -0
  99. package/dist/shared-types/grade.types.js.map +1 -0
  100. package/dist/shared-types/index.d.ts +13 -0
  101. package/dist/shared-types/index.js +14 -0
  102. package/dist/shared-types/index.js.map +1 -0
  103. package/dist/shared-types/metadata.types.d.ts +61 -0
  104. package/dist/shared-types/metadata.types.js +3 -0
  105. package/dist/shared-types/metadata.types.js.map +1 -0
  106. package/dist/shared-types/table.types.d.ts +33 -0
  107. package/dist/shared-types/table.types.js +2 -0
  108. package/dist/shared-types/table.types.js.map +1 -0
  109. package/dist/shared-types/viewCard.types.d.ts +78 -0
  110. package/dist/shared-types/viewCard.types.js +3 -0
  111. package/dist/shared-types/viewCard.types.js.map +1 -0
  112. package/dist/styles.css +347 -0
  113. package/dist/types.d.ts +126 -0
  114. package/dist/types.js +19 -0
  115. package/dist/types.js.map +1 -0
  116. package/dist/utils/conditionCompiler.d.ts +11 -0
  117. package/dist/utils/conditionCompiler.js +18 -0
  118. package/dist/utils/conditionCompiler.js.map +1 -0
  119. package/dist/utils/fileUtils.d.ts +50 -0
  120. package/dist/utils/fileUtils.js +266 -0
  121. package/dist/utils/fileUtils.js.map +1 -0
  122. package/dist/utils/metadataUtils.d.ts +35 -0
  123. package/dist/utils/metadataUtils.js +176 -0
  124. package/dist/utils/metadataUtils.js.map +1 -0
  125. package/dist/utils/normalizeTime.d.ts +1 -0
  126. package/dist/utils/normalizeTime.js +25 -0
  127. package/dist/utils/normalizeTime.js.map +1 -0
  128. package/dist/utils/tableUtils.d.ts +9 -0
  129. package/dist/utils/tableUtils.js +92 -0
  130. package/dist/utils/tableUtils.js.map +1 -0
  131. package/dist/utils/toFormData.d.ts +152 -0
  132. package/dist/utils/toFormData.js +250 -0
  133. package/dist/utils/toFormData.js.map +1 -0
  134. package/dist/utils/wizard.utils.d.ts +420 -0
  135. package/dist/utils/wizard.utils.js +596 -0
  136. package/dist/utils/wizard.utils.js.map +1 -0
  137. package/package.json +49 -3
  138. package/README.md +0 -3
@@ -0,0 +1,152 @@
1
+ /**
2
+ * toFormData Utility
3
+ *
4
+ * Converts JavaScript objects to FormData with support for:
5
+ * - Nested objects (flattened with bracket notation)
6
+ * - Arrays (configurable format: brackets[], indices[0], or flat)
7
+ * - Files and Blobs (passed through directly)
8
+ * - Dates (converted to ISO string)
9
+ * - Booleans (converted to "1"/"0" or "true"/"false")
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * // Basic usage
14
+ * const formData = toFormData({
15
+ * title: "My Report",
16
+ * attachments: [file1, file2],
17
+ * meta: { tags: ["urgent", "review"] }
18
+ * });
19
+ *
20
+ * // With options
21
+ * const formData = toFormData(payload, {
22
+ * arrayFormat: 'indices', // Use [0], [1] instead of []
23
+ * booleanFormat: 'string', // Use "true"/"false" instead of "1"/"0"
24
+ * });
25
+ * ```
26
+ */
27
+ /**
28
+ * Supported value types for FormData conversion
29
+ */
30
+ export type FormDataValue = string | number | boolean | null | undefined | File | Blob | FileList | Date | FormDataValue[] | {
31
+ [key: string]: FormDataValue;
32
+ };
33
+ /**
34
+ * Array format options
35
+ * - `brackets`: key[]=value (PHP/Laravel default)
36
+ * - `indices`: key[0]=value (Java/.NET)
37
+ * - `flat`: key=value repeated (some REST APIs)
38
+ */
39
+ export type ArrayFormat = "brackets" | "indices" | "flat";
40
+ /**
41
+ * Boolean format options
42
+ * - `numeric`: "1" for true, "0" for false (PHP default)
43
+ * - `string`: "true" or "false"
44
+ */
45
+ export type BooleanFormat = "numeric" | "string";
46
+ /**
47
+ * Date format options
48
+ * - `iso`: ISO 8601 string (default)
49
+ * - `timestamp`: Unix timestamp in milliseconds
50
+ * - `date`: YYYY-MM-DD format
51
+ */
52
+ export type DateFormat = "iso" | "timestamp" | "date";
53
+ /**
54
+ * Options for toFormData conversion
55
+ */
56
+ export interface ToFormDataOptions {
57
+ /**
58
+ * How to format array keys
59
+ * @default 'brackets'
60
+ */
61
+ arrayFormat?: ArrayFormat;
62
+ /**
63
+ * How to format boolean values
64
+ * @default 'numeric'
65
+ */
66
+ booleanFormat?: BooleanFormat;
67
+ /**
68
+ * How to format Date values
69
+ * @default 'iso'
70
+ */
71
+ dateFormat?: DateFormat;
72
+ /**
73
+ * Skip null and undefined values
74
+ * @default true
75
+ */
76
+ skipNull?: boolean;
77
+ /**
78
+ * Skip empty string values
79
+ * @default false
80
+ */
81
+ skipEmpty?: boolean;
82
+ /**
83
+ * Skip empty arrays
84
+ * @default true
85
+ */
86
+ skipEmptyArrays?: boolean;
87
+ }
88
+ /**
89
+ * Convert a JavaScript object to FormData
90
+ *
91
+ * @param payload - The object to convert
92
+ * @param options - Conversion options
93
+ * @returns FormData instance
94
+ *
95
+ * @example
96
+ * ```ts
97
+ * // Example 1: Simple form with file
98
+ * const formData = toFormData({
99
+ * title: "My Document",
100
+ * file: selectedFile,
101
+ * isActive: true
102
+ * });
103
+ * // Result:
104
+ * // title: "My Document"
105
+ * // file: [File object]
106
+ * // isActive: "1"
107
+ *
108
+ * // Example 2: Nested object with arrays
109
+ * const formData = toFormData({
110
+ * title: "Report",
111
+ * attachments: [file1, file2],
112
+ * meta: {
113
+ * tags: ["urgent", "review"],
114
+ * priority: 1
115
+ * }
116
+ * });
117
+ * // Result (brackets format - default):
118
+ * // title: "Report"
119
+ * // attachments[]: [File1]
120
+ * // attachments[]: [File2]
121
+ * // meta[tags][]: "urgent"
122
+ * // meta[tags][]: "review"
123
+ * // meta[priority]: "1"
124
+ *
125
+ * // Example 3: Using indices format for .NET backend
126
+ * const formData = toFormData({
127
+ * items: ["a", "b", "c"]
128
+ * }, { arrayFormat: 'indices' });
129
+ * // Result:
130
+ * // items[0]: "a"
131
+ * // items[1]: "b"
132
+ * // items[2]: "c"
133
+ * ```
134
+ */
135
+ export declare const toFormData: (payload: Record<string, FormDataValue>, options?: ToFormDataOptions) => FormData;
136
+ /**
137
+ * Debug helper to log FormData contents
138
+ */
139
+ export declare const logFormDataContents: (formData: FormData, label?: string) => void;
140
+ /**
141
+ * Type-safe wrapper for React Hook Form integration
142
+ *
143
+ * @example
144
+ * ```ts
145
+ * const onSubmit = handleSubmit((data) => {
146
+ * const formData = formDataFromRHF(data);
147
+ * await api.post('/upload', formData, { meta: { multipart: true } });
148
+ * });
149
+ * ```
150
+ */
151
+ export declare const formDataFromRHF: <T extends Record<string, unknown>>(data: T, options?: ToFormDataOptions) => FormData;
152
+ export default toFormData;
@@ -0,0 +1,250 @@
1
+ /**
2
+ * toFormData Utility
3
+ *
4
+ * Converts JavaScript objects to FormData with support for:
5
+ * - Nested objects (flattened with bracket notation)
6
+ * - Arrays (configurable format: brackets[], indices[0], or flat)
7
+ * - Files and Blobs (passed through directly)
8
+ * - Dates (converted to ISO string)
9
+ * - Booleans (converted to "1"/"0" or "true"/"false")
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * // Basic usage
14
+ * const formData = toFormData({
15
+ * title: "My Report",
16
+ * attachments: [file1, file2],
17
+ * meta: { tags: ["urgent", "review"] }
18
+ * });
19
+ *
20
+ * // With options
21
+ * const formData = toFormData(payload, {
22
+ * arrayFormat: 'indices', // Use [0], [1] instead of []
23
+ * booleanFormat: 'string', // Use "true"/"false" instead of "1"/"0"
24
+ * });
25
+ * ```
26
+ */
27
+ const defaultOptions = {
28
+ arrayFormat: "brackets",
29
+ booleanFormat: "numeric",
30
+ dateFormat: "iso",
31
+ skipNull: true,
32
+ skipEmpty: false,
33
+ skipEmptyArrays: true,
34
+ };
35
+ /**
36
+ * Build the key for nested properties
37
+ */
38
+ const buildKey = (prefix, key, isArrayItem, arrayFormat, index) => {
39
+ if (!prefix) {
40
+ return key;
41
+ }
42
+ if (isArrayItem) {
43
+ switch (arrayFormat) {
44
+ case "indices":
45
+ return `${prefix}[${index}]`;
46
+ case "flat":
47
+ return prefix;
48
+ case "brackets":
49
+ default:
50
+ return `${prefix}[]`;
51
+ }
52
+ }
53
+ return `${prefix}[${key}]`;
54
+ };
55
+ /**
56
+ * Format a boolean value based on options
57
+ */
58
+ const formatBoolean = (value, format) => {
59
+ if (format === "string") {
60
+ return value ? "true" : "false";
61
+ }
62
+ return value ? "1" : "0";
63
+ };
64
+ /**
65
+ * Format a Date value based on options
66
+ */
67
+ const formatDate = (value, format) => {
68
+ switch (format) {
69
+ case "timestamp":
70
+ return String(value.getTime());
71
+ case "date":
72
+ return value.toISOString().split("T")[0];
73
+ case "iso":
74
+ default:
75
+ return value.toISOString();
76
+ }
77
+ };
78
+ /**
79
+ * Recursively append values to FormData
80
+ */
81
+ const appendToFormData = (formData, key, value, options, seen) => {
82
+ // Handle null/undefined
83
+ if (value === null || value === undefined) {
84
+ if (!options.skipNull) {
85
+ formData.append(key, "");
86
+ }
87
+ return;
88
+ }
89
+ // Handle empty strings
90
+ if (value === "" && options.skipEmpty) {
91
+ return;
92
+ }
93
+ // Handle FileList (convert to array of files)
94
+ if (typeof FileList !== "undefined" && value instanceof FileList) {
95
+ Array.from(value).forEach((file, index) => {
96
+ const fileKey = buildKey(key, "", true, options.arrayFormat, index);
97
+ formData.append(fileKey, file);
98
+ });
99
+ return;
100
+ }
101
+ // Handle File/Blob (passthrough)
102
+ if (value instanceof File || value instanceof Blob) {
103
+ formData.append(key, value);
104
+ return;
105
+ }
106
+ // Handle Date
107
+ if (value instanceof Date) {
108
+ // Skip invalid dates
109
+ if (Number.isNaN(value.getTime())) {
110
+ console.warn(`[toFormData] Invalid Date value for key "${key}", skipping`);
111
+ return;
112
+ }
113
+ formData.append(key, formatDate(value, options.dateFormat));
114
+ return;
115
+ }
116
+ // Handle boolean
117
+ if (typeof value === "boolean") {
118
+ formData.append(key, formatBoolean(value, options.booleanFormat));
119
+ return;
120
+ }
121
+ // Handle number
122
+ if (typeof value === "number") {
123
+ // Skip NaN and Infinity as they're not valid form values
124
+ if (Number.isNaN(value) || !Number.isFinite(value)) {
125
+ console.warn(`[toFormData] Invalid number value for key "${key}" (${value}), skipping`);
126
+ return;
127
+ }
128
+ formData.append(key, String(value));
129
+ return;
130
+ }
131
+ // Handle string
132
+ if (typeof value === "string") {
133
+ formData.append(key, value);
134
+ return;
135
+ }
136
+ // Handle arrays
137
+ if (Array.isArray(value)) {
138
+ if (value.length === 0 && options.skipEmptyArrays) {
139
+ return;
140
+ }
141
+ value.forEach((item, index) => {
142
+ const arrayKey = buildKey(key, "", true, options.arrayFormat, index);
143
+ appendToFormData(formData, arrayKey, item, options, seen);
144
+ });
145
+ return;
146
+ }
147
+ // Handle objects (nested)
148
+ if (typeof value === "object") {
149
+ // Circular reference protection
150
+ if (seen.has(value)) {
151
+ console.warn(`[toFormData] Circular reference detected for key "${key}", skipping`);
152
+ return;
153
+ }
154
+ seen.add(value);
155
+ Object.entries(value).forEach(([nestedKey, nestedValue]) => {
156
+ const fullKey = buildKey(key, nestedKey, false, options.arrayFormat);
157
+ appendToFormData(formData, fullKey, nestedValue, options, seen);
158
+ });
159
+ return;
160
+ }
161
+ };
162
+ /**
163
+ * Convert a JavaScript object to FormData
164
+ *
165
+ * @param payload - The object to convert
166
+ * @param options - Conversion options
167
+ * @returns FormData instance
168
+ *
169
+ * @example
170
+ * ```ts
171
+ * // Example 1: Simple form with file
172
+ * const formData = toFormData({
173
+ * title: "My Document",
174
+ * file: selectedFile,
175
+ * isActive: true
176
+ * });
177
+ * // Result:
178
+ * // title: "My Document"
179
+ * // file: [File object]
180
+ * // isActive: "1"
181
+ *
182
+ * // Example 2: Nested object with arrays
183
+ * const formData = toFormData({
184
+ * title: "Report",
185
+ * attachments: [file1, file2],
186
+ * meta: {
187
+ * tags: ["urgent", "review"],
188
+ * priority: 1
189
+ * }
190
+ * });
191
+ * // Result (brackets format - default):
192
+ * // title: "Report"
193
+ * // attachments[]: [File1]
194
+ * // attachments[]: [File2]
195
+ * // meta[tags][]: "urgent"
196
+ * // meta[tags][]: "review"
197
+ * // meta[priority]: "1"
198
+ *
199
+ * // Example 3: Using indices format for .NET backend
200
+ * const formData = toFormData({
201
+ * items: ["a", "b", "c"]
202
+ * }, { arrayFormat: 'indices' });
203
+ * // Result:
204
+ * // items[0]: "a"
205
+ * // items[1]: "b"
206
+ * // items[2]: "c"
207
+ * ```
208
+ */
209
+ export const toFormData = (payload, options) => {
210
+ const formData = new FormData();
211
+ const mergedOptions = { ...defaultOptions, ...options };
212
+ const seen = new WeakSet();
213
+ Object.entries(payload).forEach(([key, value]) => {
214
+ appendToFormData(formData, key, value, mergedOptions, seen);
215
+ });
216
+ return formData;
217
+ };
218
+ /**
219
+ * Debug helper to log FormData contents
220
+ */
221
+ export const logFormDataContents = (formData, label) => {
222
+ console.log(label ? `${label}:` : "FormData contents:");
223
+ formData.forEach((value, key) => {
224
+ if (value instanceof File) {
225
+ console.log(` ${key}: [File] ${value.name} (${value.size} bytes)`);
226
+ }
227
+ else if (typeof value === "object" && value !== null) {
228
+ console.log(` ${key}: [Blob] (${value.size} bytes)`);
229
+ }
230
+ else {
231
+ console.log(` ${key}: ${value}`);
232
+ }
233
+ });
234
+ };
235
+ /**
236
+ * Type-safe wrapper for React Hook Form integration
237
+ *
238
+ * @example
239
+ * ```ts
240
+ * const onSubmit = handleSubmit((data) => {
241
+ * const formData = formDataFromRHF(data);
242
+ * await api.post('/upload', formData, { meta: { multipart: true } });
243
+ * });
244
+ * ```
245
+ */
246
+ export const formDataFromRHF = (data, options) => {
247
+ return toFormData(data, options);
248
+ };
249
+ export default toFormData;
250
+ //# sourceMappingURL=toFormData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toFormData.js","sourceRoot":"","sources":["../../src/utils/toFormData.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAkFH,MAAM,cAAc,GAAgC;IAClD,WAAW,EAAE,UAAU;IACvB,aAAa,EAAE,SAAS;IACxB,UAAU,EAAE,KAAK;IACjB,QAAQ,EAAE,IAAI;IACd,SAAS,EAAE,KAAK;IAChB,eAAe,EAAE,IAAI;CACtB,CAAC;AAEF;;GAEG;AACH,MAAM,QAAQ,GAAG,CACf,MAAc,EACd,GAAW,EACX,WAAoB,EACpB,WAAwB,EACxB,KAAc,EACN,EAAE;IACV,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,QAAQ,WAAW,EAAE,CAAC;YACpB,KAAK,SAAS;gBACZ,OAAO,GAAG,MAAM,IAAI,KAAK,GAAG,CAAC;YAC/B,KAAK,MAAM;gBACT,OAAO,MAAM,CAAC;YAChB,KAAK,UAAU,CAAC;YAChB;gBACE,OAAO,GAAG,MAAM,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,GAAG,MAAM,IAAI,GAAG,GAAG,CAAC;AAC7B,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,aAAa,GAAG,CAAC,KAAc,EAAE,MAAqB,EAAU,EAAE;IACtE,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAClC,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3B,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,GAAG,CAAC,KAAW,EAAE,MAAkB,EAAU,EAAE;IAC7D,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,WAAW;YACd,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjC,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,KAAK,KAAK,CAAC;QACX;YACE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,gBAAgB,GAAG,CACvB,QAAkB,EAClB,GAAW,EACX,KAAoB,EACpB,OAAoC,EACpC,IAAqB,EACf,EAAE;IACR,wBAAwB;IACxB,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;YACtB,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAC3B,CAAC;QACD,OAAO;IACT,CAAC;IAED,uBAAuB;IACvB,IAAI,KAAK,KAAK,EAAE,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACtC,OAAO;IACT,CAAC;IAED,8CAA8C;IAC9C,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;QACjE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YACxC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACpE,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,iCAAiC;IACjC,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QACnD,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,cAAc;IACd,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,qBAAqB;QACrB,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CACV,4CAA4C,GAAG,aAAa,CAC7D,CAAC;YACF,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,iBAAiB;IACjB,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC;QAClE,OAAO;IACT,CAAC;IAED,gBAAgB;IAChB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,yDAAyD;QACzD,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,OAAO,CAAC,IAAI,CACV,8CAA8C,GAAG,MAAM,KAAK,aAAa,CAC1E,CAAC;YACF,OAAO;QACT,CAAC;QACD,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,gBAAgB;IAChB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC5B,OAAO;IACT,CAAC;IAED,gBAAgB;IAChB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;YAClD,OAAO;QACT,CAAC;QAED,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACrE,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,0BAA0B;IAC1B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,gCAAgC;QAChC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,CAAC,IAAI,CACV,qDAAqD,GAAG,aAAa,CACtE,CAAC;YACF,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEhB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,EAAE;YACzD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;YACrE,gBAAgB,CAAC,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,OAAsC,EACtC,OAA2B,EACjB,EAAE;IACZ,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;IAChC,MAAM,aAAa,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,OAAO,EAAU,CAAC;IAEnC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC/C,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IAC9D,CAAC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,QAAkB,EAClB,KAAc,EACR,EAAE;IACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;IACxD,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC9B,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,YAAY,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,SAAS,CAAC,CAAC;QACtE,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,aAAc,KAAc,CAAC,IAAI,SAAS,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,IAAO,EACP,OAA2B,EACjB,EAAE;IACZ,OAAO,UAAU,CAAC,IAAqC,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC,CAAC;AAEF,eAAe,UAAU,CAAC"}