@apvee/spfx-react-toolkit 1.3.0 → 2.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.
- package/lib/core/atoms.internal.js +1 -1
- package/lib/core/atoms.internal.js.map +1 -1
- package/lib/core/context.internal.js +2 -2
- package/lib/core/context.internal.js.map +1 -1
- package/lib/core/provider-base.internal.js +29 -29
- package/lib/core/provider-base.internal.js.map +1 -1
- package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.js +8 -29
- package/lib/extensions/spFxReactToolkitTest/SpFxReactToolkitTestApplicationCustomizer.js.map +1 -1
- package/lib/hooks/index.d.ts +1 -0
- package/lib/hooks/index.d.ts.map +1 -1
- package/lib/hooks/index.js +1 -0
- package/lib/hooks/index.js.map +1 -1
- package/lib/hooks/useAppCatalogUrl.internal.d.ts +26 -0
- package/lib/hooks/useAppCatalogUrl.internal.d.ts.map +1 -0
- package/lib/hooks/useAppCatalogUrl.internal.js +72 -0
- package/lib/hooks/useAppCatalogUrl.internal.js.map +1 -0
- package/lib/hooks/useAsyncInvoke.internal.js +27 -75
- package/lib/hooks/useAsyncInvoke.internal.js.map +1 -1
- package/lib/hooks/useSPFxAadHttpClient.js +27 -27
- package/lib/hooks/useSPFxAadHttpClient.js.map +1 -1
- package/lib/hooks/useSPFxContainerInfo.js +5 -5
- package/lib/hooks/useSPFxContainerInfo.js.map +1 -1
- package/lib/hooks/useSPFxContainerSize.js +9 -10
- package/lib/hooks/useSPFxContainerSize.js.map +1 -1
- package/lib/hooks/useSPFxCorrelationInfo.js +6 -7
- package/lib/hooks/useSPFxCorrelationInfo.js.map +1 -1
- package/lib/hooks/useSPFxCrossSitePermissions.js +48 -58
- package/lib/hooks/useSPFxCrossSitePermissions.js.map +1 -1
- package/lib/hooks/useSPFxDisplayMode.js +8 -8
- package/lib/hooks/useSPFxDisplayMode.js.map +1 -1
- package/lib/hooks/useSPFxEnvironmentInfo.js +17 -18
- package/lib/hooks/useSPFxEnvironmentInfo.js.map +1 -1
- package/lib/hooks/useSPFxFluent9ThemeInfo.js +4 -4
- package/lib/hooks/useSPFxFluent9ThemeInfo.js.map +1 -1
- package/lib/hooks/useSPFxHttpClient.js +10 -10
- package/lib/hooks/useSPFxHttpClient.js.map +1 -1
- package/lib/hooks/useSPFxHubSiteInfo.js +21 -24
- package/lib/hooks/useSPFxHubSiteInfo.js.map +1 -1
- package/lib/hooks/useSPFxInstanceInfo.js +2 -2
- package/lib/hooks/useSPFxInstanceInfo.js.map +1 -1
- package/lib/hooks/useSPFxListInfo.js +8 -9
- package/lib/hooks/useSPFxListInfo.js.map +1 -1
- package/lib/hooks/useSPFxLocaleInfo.js +10 -10
- package/lib/hooks/useSPFxLocaleInfo.js.map +1 -1
- package/lib/hooks/useSPFxLogger.js +26 -26
- package/lib/hooks/useSPFxLogger.js.map +1 -1
- package/lib/hooks/useSPFxMSGraphClient.js +25 -25
- package/lib/hooks/useSPFxMSGraphClient.js.map +1 -1
- package/lib/hooks/useSPFxOneDriveAppData.js +148 -209
- package/lib/hooks/useSPFxOneDriveAppData.js.map +1 -1
- package/lib/hooks/useSPFxPageContext.js +2 -2
- package/lib/hooks/useSPFxPageContext.js.map +1 -1
- package/lib/hooks/useSPFxPageType.js +19 -20
- package/lib/hooks/useSPFxPageType.js.map +1 -1
- package/lib/hooks/useSPFxPerformance.js +33 -87
- package/lib/hooks/useSPFxPerformance.js.map +1 -1
- package/lib/hooks/useSPFxPermissions.js +14 -15
- package/lib/hooks/useSPFxPermissions.js.map +1 -1
- package/lib/hooks/useSPFxPnP.js +62 -119
- package/lib/hooks/useSPFxPnP.js.map +1 -1
- package/lib/hooks/useSPFxPnPContext.js +22 -25
- package/lib/hooks/useSPFxPnPContext.js.map +1 -1
- package/lib/hooks/useSPFxPnPList.js +307 -451
- package/lib/hooks/useSPFxPnPList.js.map +1 -1
- package/lib/hooks/useSPFxPnPSearch.js +262 -353
- package/lib/hooks/useSPFxPnPSearch.js.map +1 -1
- package/lib/hooks/useSPFxProperties.js +12 -20
- package/lib/hooks/useSPFxProperties.js.map +1 -1
- package/lib/hooks/useSPFxSPHttpClient.js +19 -19
- package/lib/hooks/useSPFxSPHttpClient.js.map +1 -1
- package/lib/hooks/useSPFxServiceScope.js +6 -6
- package/lib/hooks/useSPFxServiceScope.js.map +1 -1
- package/lib/hooks/useSPFxSiteInfo.js +7 -8
- package/lib/hooks/useSPFxSiteInfo.js.map +1 -1
- package/lib/hooks/useSPFxStorage.js +22 -22
- package/lib/hooks/useSPFxStorage.js.map +1 -1
- package/lib/hooks/useSPFxTeams.js +37 -92
- package/lib/hooks/useSPFxTeams.js.map +1 -1
- package/lib/hooks/useSPFxTenantKeyValueStore.d.ts +252 -0
- package/lib/hooks/useSPFxTenantKeyValueStore.d.ts.map +1 -0
- package/lib/hooks/useSPFxTenantKeyValueStore.js +572 -0
- package/lib/hooks/useSPFxTenantKeyValueStore.js.map +1 -0
- package/lib/hooks/useSPFxTenantProperty.d.ts +23 -244
- package/lib/hooks/useSPFxTenantProperty.d.ts.map +1 -1
- package/lib/hooks/useSPFxTenantProperty.js +85 -559
- package/lib/hooks/useSPFxTenantProperty.js.map +1 -1
- package/lib/hooks/useSPFxUserInfo.js +3 -4
- package/lib/hooks/useSPFxUserInfo.js.map +1 -1
- package/lib/hooks/useSPFxUserPhoto.js +76 -123
- package/lib/hooks/useSPFxUserPhoto.js.map +1 -1
- package/lib/utils/resize-observer.internal.js +6 -7
- package/lib/utils/resize-observer.internal.js.map +1 -1
- package/lib/utils/theme-subscription.internal.js +8 -8
- package/lib/utils/theme-subscription.internal.js.map +1 -1
- package/lib/utils/type-guards.internal.js +6 -6
- package/lib/utils/type-guards.internal.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/SpFxReactToolkitTestWebPart.js +12 -37
- package/lib/webparts/spFxReactToolkitTest/SpFxReactToolkitTestWebPart.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.d.ts.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js +277 -336
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.module.scss.js +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/SpFxReactToolkitTest.module.scss.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/HttpClientDemo.js +26 -86
- package/lib/webparts/spFxReactToolkitTest/components/demos/HttpClientDemo.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPContextDemo.js +53 -113
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPContextDemo.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPListDemo.js +49 -121
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPListDemo.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPOperationsDemo.js +44 -103
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPOperationsDemo.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchAdvancedDemo.js +15 -15
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchAdvancedDemo.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchBasicDemo.js +18 -66
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchBasicDemo.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchRefinersDemo.js +9 -9
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchRefinersDemo.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchSuggestionsDemo.js +37 -86
- package/lib/webparts/spFxReactToolkitTest/components/demos/PnPSearchSuggestionsDemo.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/shared/InfoRow.js +6 -9
- package/lib/webparts/spFxReactToolkitTest/components/shared/InfoRow.js.map +1 -1
- package/lib/webparts/spFxReactToolkitTest/components/shared/StatusBadge.js +3 -6
- package/lib/webparts/spFxReactToolkitTest/components/shared/StatusBadge.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A single item from the tenant key-value store
|
|
3
|
+
*/
|
|
4
|
+
export interface SPFxTenantKeyValueStoreItem<T = unknown> {
|
|
5
|
+
/** Property key (stored in Title column) */
|
|
6
|
+
readonly key: string;
|
|
7
|
+
/** Deserialized property value */
|
|
8
|
+
readonly value: T;
|
|
9
|
+
/** Optional description metadata */
|
|
10
|
+
readonly description: string | undefined;
|
|
11
|
+
/** SharePoint list item ID (internal use) */
|
|
12
|
+
readonly id: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Return type for useSPFxTenantKeyValueStore hook
|
|
16
|
+
*/
|
|
17
|
+
export interface SPFxTenantKeyValueStoreResult {
|
|
18
|
+
/**
|
|
19
|
+
* Loading state for read operations (`get`, `list`).
|
|
20
|
+
* True during any active read call.
|
|
21
|
+
*/
|
|
22
|
+
readonly isLoading: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Last error from read operations.
|
|
25
|
+
* Cleared on next successful read.
|
|
26
|
+
*/
|
|
27
|
+
readonly error: Error | undefined;
|
|
28
|
+
/**
|
|
29
|
+
* Loading state for write operations (`save`, `remove`).
|
|
30
|
+
* True during any active write call.
|
|
31
|
+
*/
|
|
32
|
+
readonly isWriting: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Last error from write operations.
|
|
35
|
+
* Cleared on next successful write.
|
|
36
|
+
*/
|
|
37
|
+
readonly writeError: Error | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Whether the current user has permission to write to the store.
|
|
40
|
+
* Requires Site Collection Administrator role on the tenant app catalog.
|
|
41
|
+
* Computed asynchronously on first operation.
|
|
42
|
+
*/
|
|
43
|
+
readonly canWrite: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Computed state: true when the SPHttpClient is available and
|
|
46
|
+
* the hook is ready to perform operations.
|
|
47
|
+
*/
|
|
48
|
+
readonly isReady: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Get a single item by key.
|
|
51
|
+
* Returns undefined if the key does not exist or the list has not been provisioned.
|
|
52
|
+
*
|
|
53
|
+
* @param key - Property key to look up
|
|
54
|
+
* @returns The item with deserialized value, or undefined
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* ```tsx
|
|
58
|
+
* const store = useSPFxTenantKeyValueStore();
|
|
59
|
+
*
|
|
60
|
+
* const handleLoad = async () => {
|
|
61
|
+
* const item = await store.get<string>('apiEndpoint');
|
|
62
|
+
* if (item) {
|
|
63
|
+
* console.log(item.value); // "https://api.example.com"
|
|
64
|
+
* }
|
|
65
|
+
* };
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
readonly get: <T = unknown>(key: string) => Promise<SPFxTenantKeyValueStoreItem<T> | undefined>;
|
|
69
|
+
/**
|
|
70
|
+
* List all items in the store.
|
|
71
|
+
* Returns an empty array if the list has not been provisioned.
|
|
72
|
+
* Items are sorted by key (Title) ascending.
|
|
73
|
+
*
|
|
74
|
+
* @returns Array of all items with deserialized values
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```tsx
|
|
78
|
+
* const store = useSPFxTenantKeyValueStore();
|
|
79
|
+
*
|
|
80
|
+
* const items = await store.list();
|
|
81
|
+
* items.forEach(item => {
|
|
82
|
+
* console.log(`${item.key}: ${typeof item.value === 'object' ? JSON.stringify(item.value) : item.value}`);
|
|
83
|
+
* });
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
readonly list: () => Promise<SPFxTenantKeyValueStoreItem<unknown>[]>;
|
|
87
|
+
/**
|
|
88
|
+
* Save (create or update) a key-value pair.
|
|
89
|
+
* Auto-provisions the hidden list on first write if it doesn't exist.
|
|
90
|
+
*
|
|
91
|
+
* Smart serialization:
|
|
92
|
+
* - Primitives (string, number, boolean, null, bigint) → String(value)
|
|
93
|
+
* - Date objects → ISO 8601 string
|
|
94
|
+
* - Objects/arrays → JSON.stringify(value)
|
|
95
|
+
*
|
|
96
|
+
* @param key - Property key
|
|
97
|
+
* @param value - Value to store
|
|
98
|
+
* @param description - Optional description metadata
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```tsx
|
|
102
|
+
* const store = useSPFxTenantKeyValueStore();
|
|
103
|
+
*
|
|
104
|
+
* // String value
|
|
105
|
+
* await store.save<string>('apiEndpoint', 'https://api.example.com', 'Production API');
|
|
106
|
+
*
|
|
107
|
+
* // Complex object
|
|
108
|
+
* await store.save<FeatureFlags>('featureFlags', { enableChat: true, maxUsers: 1000 });
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
readonly save: <T = unknown>(key: string, value: T, description?: string) => Promise<void>;
|
|
112
|
+
/**
|
|
113
|
+
* Remove an item by key.
|
|
114
|
+
* No-op if the key does not exist or the list has not been provisioned.
|
|
115
|
+
*
|
|
116
|
+
* @param key - Property key to remove
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```tsx
|
|
120
|
+
* const store = useSPFxTenantKeyValueStore();
|
|
121
|
+
*
|
|
122
|
+
* await store.remove('deprecatedSetting');
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
readonly remove: (key: string) => Promise<void>;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Hook to manage tenant-wide key-value pairs backed by a hidden SharePoint list.
|
|
129
|
+
*
|
|
130
|
+
* The store uses a hidden list named `TenantKeyValueStore` in the tenant app catalog.
|
|
131
|
+
* The list is auto-provisioned on the first operation (get, list, save, or remove), with:
|
|
132
|
+
* - Title column: key (indexed, unique)
|
|
133
|
+
* - Value column: multiline text (Note)
|
|
134
|
+
* - Description column: multiline text (Note)
|
|
135
|
+
*
|
|
136
|
+
* This hook provides an alternative to tenant properties (StorageEntity) for scenarios
|
|
137
|
+
* requiring read/write access via REST, since Microsoft has blocked the
|
|
138
|
+
* SetStorageEntity and RemoveStorageEntity REST API endpoints.
|
|
139
|
+
*
|
|
140
|
+
* Features:
|
|
141
|
+
* - CRUD operations (get, list, save, remove) on tenant-scoped key-value data
|
|
142
|
+
* - Auto-provisioning of the hidden list on first operation (any CRUD call)
|
|
143
|
+
* - Smart provisioning: ref-based fast path (zero API calls after first check),
|
|
144
|
+
* field introspection only when list already exists, Title uniqueness only on creation
|
|
145
|
+
* - Smart serialization for primitives, Date, and complex objects
|
|
146
|
+
* - Permission checking (canWrite flag via IsSiteAdmin)
|
|
147
|
+
* - Unique key enforcement (Indexed + EnforceUniqueValues on Title)
|
|
148
|
+
* - Concurrent provisioning protection (mutex ref)
|
|
149
|
+
* - Memory leak safe with mounted state tracking
|
|
150
|
+
* - Idempotent remove (no-op if key or list doesn't exist)
|
|
151
|
+
*
|
|
152
|
+
* Requirements:
|
|
153
|
+
* - Tenant app catalog must be provisioned
|
|
154
|
+
* - Read: Any authenticated user
|
|
155
|
+
* - Write/Remove: Site Collection Administrator role on tenant app catalog site
|
|
156
|
+
*
|
|
157
|
+
* @returns Object with loading states, error states, permission flag, and CRUD functions
|
|
158
|
+
*
|
|
159
|
+
* @example Basic usage
|
|
160
|
+
* ```tsx
|
|
161
|
+
* function TenantConfigPanel() {
|
|
162
|
+
* const store = useSPFxTenantKeyValueStore();
|
|
163
|
+
*
|
|
164
|
+
* const [endpoint, setEndpoint] = React.useState<string>('');
|
|
165
|
+
*
|
|
166
|
+
* React.useEffect(() => {
|
|
167
|
+
* store.get<string>('apiEndpoint').then(item => {
|
|
168
|
+
* if (item) setEndpoint(item.value);
|
|
169
|
+
* });
|
|
170
|
+
* }, []);
|
|
171
|
+
*
|
|
172
|
+
* const handleSave = async () => {
|
|
173
|
+
* await store.save<string>('apiEndpoint', endpoint, 'Production API endpoint');
|
|
174
|
+
* };
|
|
175
|
+
*
|
|
176
|
+
* if (!store.isReady) return <Spinner />;
|
|
177
|
+
*
|
|
178
|
+
* return (
|
|
179
|
+
* <Stack tokens={{ childrenGap: 10 }}>
|
|
180
|
+
* <TextField value={endpoint} onChange={(_, v) => setEndpoint(v ?? '')} />
|
|
181
|
+
* <PrimaryButton onClick={handleSave} disabled={store.isWriting}>
|
|
182
|
+
* {store.isWriting ? 'Saving...' : 'Save'}
|
|
183
|
+
* </PrimaryButton>
|
|
184
|
+
* </Stack>
|
|
185
|
+
* );
|
|
186
|
+
* }
|
|
187
|
+
* ```
|
|
188
|
+
*
|
|
189
|
+
* @example Heterogeneous value types
|
|
190
|
+
* ```tsx
|
|
191
|
+
* const store = useSPFxTenantKeyValueStore();
|
|
192
|
+
*
|
|
193
|
+
* // String
|
|
194
|
+
* await store.save<string>('appVersion', '2.1.0');
|
|
195
|
+
* const ver = await store.get<string>('appVersion');
|
|
196
|
+
*
|
|
197
|
+
* // Number
|
|
198
|
+
* await store.save<number>('maxUploadSize', 10485760);
|
|
199
|
+
* const size = await store.get<number>('maxUploadSize');
|
|
200
|
+
*
|
|
201
|
+
* // Complex object
|
|
202
|
+
* interface FeatureFlags { enableChat: boolean; maxUsers: number; }
|
|
203
|
+
* await store.save<FeatureFlags>('featureFlags', { enableChat: true, maxUsers: 500 });
|
|
204
|
+
* const flags = await store.get<FeatureFlags>('featureFlags');
|
|
205
|
+
* ```
|
|
206
|
+
*
|
|
207
|
+
* @example Dashboard listing all properties
|
|
208
|
+
* ```tsx
|
|
209
|
+
* function AllPropertiesView() {
|
|
210
|
+
* const store = useSPFxTenantKeyValueStore();
|
|
211
|
+
* const [items, setItems] = React.useState<SPFxTenantKeyValueStoreItem<unknown>[]>([]);
|
|
212
|
+
*
|
|
213
|
+
* React.useEffect(() => {
|
|
214
|
+
* store.list().then(setItems);
|
|
215
|
+
* }, []);
|
|
216
|
+
*
|
|
217
|
+
* return (
|
|
218
|
+
* <DetailsList
|
|
219
|
+
* items={items.map(i => ({
|
|
220
|
+
* key: i.key,
|
|
221
|
+
* value: typeof i.value === 'object' ? JSON.stringify(i.value) : String(i.value),
|
|
222
|
+
* description: i.description ?? '',
|
|
223
|
+
* }))}
|
|
224
|
+
* columns={[
|
|
225
|
+
* { key: 'key', name: 'Key', fieldName: 'key', minWidth: 150 },
|
|
226
|
+
* { key: 'value', name: 'Value', fieldName: 'value', minWidth: 200 },
|
|
227
|
+
* { key: 'desc', name: 'Description', fieldName: 'description', minWidth: 200 },
|
|
228
|
+
* ]}
|
|
229
|
+
* />
|
|
230
|
+
* );
|
|
231
|
+
* }
|
|
232
|
+
* ```
|
|
233
|
+
*
|
|
234
|
+
* @example Permission-aware UI
|
|
235
|
+
* ```tsx
|
|
236
|
+
* function TenantStoreManager() {
|
|
237
|
+
* const store = useSPFxTenantKeyValueStore();
|
|
238
|
+
*
|
|
239
|
+
* if (!store.canWrite) {
|
|
240
|
+
* return (
|
|
241
|
+
* <MessageBar messageBarType={MessageBarType.info}>
|
|
242
|
+
* Read-only access. Contact your SharePoint administrator for write permissions.
|
|
243
|
+
* </MessageBar>
|
|
244
|
+
* );
|
|
245
|
+
* }
|
|
246
|
+
*
|
|
247
|
+
* return <EditablePropertyPanel store={store} />;
|
|
248
|
+
* }
|
|
249
|
+
* ```
|
|
250
|
+
*/
|
|
251
|
+
export declare function useSPFxTenantKeyValueStore(): SPFxTenantKeyValueStoreResult;
|
|
252
|
+
//# sourceMappingURL=useSPFxTenantKeyValueStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSPFxTenantKeyValueStore.d.ts","sourceRoot":"","sources":["../../src/hooks/useSPFxTenantKeyValueStore.ts"],"names":[],"mappings":"AA0GA;;GAEG;AACH,MAAM,WAAW,2BAA2B,CAAC,CAAC,GAAG,OAAO;IACpD,4CAA4C;IAC5C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,kCAAkC;IAClC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;IAClB,oCAAoC;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC1C;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAElC;;;OAGG;IACH,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAE5B;;;OAGG;IACH,QAAQ,CAAC,UAAU,EAAE,KAAK,GAAG,SAAS,CAAC;IAEvC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B;;;;;;;;;;;;;;;;;;OAkBG;IACH,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,2BAA2B,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAEhG;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,2BAA2B,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAErE;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3F;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AA8BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2HG;AACH,wBAAgB,0BAA0B,IAAI,6BAA6B,CAmc1E"}
|