@ic-reactor/react 3.7.0 → 3.9.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/README.md +158 -9
- package/dist/auth/authentication-manager.d.ts +37 -5
- package/dist/auth/authentication-manager.d.ts.map +1 -1
- package/dist/auth/authentication-manager.js +242 -52
- package/dist/auth/authentication-manager.js.map +1 -1
- package/dist/auth/createIdentityAttributeHooks.d.ts +2 -2
- package/dist/auth/createIdentityAttributeHooks.d.ts.map +1 -1
- package/dist/auth/identity-attributes-manager.d.ts +12 -5
- package/dist/auth/identity-attributes-manager.d.ts.map +1 -1
- package/dist/auth/identity-attributes-manager.js +42 -28
- package/dist/auth/identity-attributes-manager.js.map +1 -1
- package/dist/auth/identity-attributes.d.ts +1 -1
- package/dist/auth/identity-attributes.d.ts.map +1 -1
- package/dist/auth/identity-attributes.js +1 -1
- package/dist/auth/identity-attributes.js.map +1 -1
- package/dist/auth/index.d.ts +7 -7
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +7 -7
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/types.d.ts +123 -16
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/createActorHooks.d.ts +4 -4
- package/dist/createActorHooks.d.ts.map +1 -1
- package/dist/createActorHooks.js +6 -6
- package/dist/createActorHooks.js.map +1 -1
- package/dist/createInfiniteQuery.d.ts +12 -10
- package/dist/createInfiniteQuery.d.ts.map +1 -1
- package/dist/createInfiniteQuery.js +20 -17
- package/dist/createInfiniteQuery.js.map +1 -1
- package/dist/createMutation.d.ts +1 -1
- package/dist/createMutation.d.ts.map +1 -1
- package/dist/createMutation.js +22 -2
- package/dist/createMutation.js.map +1 -1
- package/dist/createQuery.d.ts +1 -1
- package/dist/createQuery.d.ts.map +1 -1
- package/dist/createQuery.js +6 -2
- package/dist/createQuery.js.map +1 -1
- package/dist/createSuspenseInfiniteQuery.d.ts +11 -10
- package/dist/createSuspenseInfiniteQuery.d.ts.map +1 -1
- package/dist/createSuspenseInfiniteQuery.js +18 -16
- package/dist/createSuspenseInfiniteQuery.js.map +1 -1
- package/dist/createSuspenseQuery.d.ts +1 -1
- package/dist/createSuspenseQuery.d.ts.map +1 -1
- package/dist/createSuspenseQuery.js +6 -2
- package/dist/createSuspenseQuery.js.map +1 -1
- package/dist/defineReactor.d.ts +54 -4
- package/dist/defineReactor.d.ts.map +1 -1
- package/dist/defineReactor.js +77 -7
- package/dist/defineReactor.js.map +1 -1
- package/dist/hooks/createAuthHooks.d.ts +2 -2
- package/dist/hooks/createAuthHooks.d.ts.map +1 -1
- package/dist/hooks/createAuthHooks.js +7 -2
- package/dist/hooks/createAuthHooks.js.map +1 -1
- package/dist/hooks/useActorInfiniteQuery.d.ts.map +1 -1
- package/dist/hooks/useActorInfiniteQuery.js +16 -2
- package/dist/hooks/useActorInfiniteQuery.js.map +1 -1
- package/dist/hooks/useActorMethod.d.ts.map +1 -1
- package/dist/hooks/useActorMethod.js +66 -33
- package/dist/hooks/useActorMethod.js.map +1 -1
- package/dist/hooks/useActorMutation.d.ts +8 -1
- package/dist/hooks/useActorMutation.d.ts.map +1 -1
- package/dist/hooks/useActorMutation.js +9 -1
- package/dist/hooks/useActorMutation.js.map +1 -1
- package/dist/hooks/useActorSuspenseInfiniteQuery.d.ts.map +1 -1
- package/dist/hooks/useActorSuspenseInfiniteQuery.js +16 -2
- package/dist/hooks/useActorSuspenseInfiniteQuery.js.map +1 -1
- package/dist/index.d.ts +11 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -11
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +8 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +14 -5
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +21 -10
- package/dist/utils.js.map +1 -1
- package/llms.txt +1 -1
- package/package.json +14 -9
- package/src/auth/authentication-manager.ts +267 -64
- package/src/auth/createIdentityAttributeHooks.ts +2 -2
- package/src/auth/identity-attributes-manager.ts +53 -44
- package/src/auth/identity-attributes.ts +2 -2
- package/src/auth/index.ts +7 -7
- package/src/auth/types.ts +134 -18
- package/src/createActorHooks.ts +9 -9
- package/src/createInfiniteQuery.ts +49 -35
- package/src/createMutation.ts +33 -3
- package/src/createQuery.ts +10 -3
- package/src/createSuspenseInfiniteQuery.ts +45 -33
- package/src/createSuspenseQuery.ts +10 -3
- package/src/defineReactor.ts +136 -14
- package/src/hooks/createAuthHooks.ts +8 -3
- package/src/hooks/useActorInfiniteQuery.ts +25 -3
- package/src/hooks/useActorMethod.ts +82 -34
- package/src/hooks/useActorMutation.ts +19 -4
- package/src/hooks/useActorSuspenseInfiniteQuery.ts +25 -3
- package/src/index.ts +11 -11
- package/src/types.ts +8 -2
- package/src/utils.ts +21 -10
- package/src/defineReactor.test.ts +0 -70
- package/src/hooks/useActorInfiniteQuery.test.tsx +0 -457
- package/src/hooks/useActorMethod.test.tsx +0 -798
- package/src/hooks/useActorMutation.test.tsx +0 -220
- package/src/hooks/useActorQuery.test.tsx +0 -287
- package/src/hooks/useActorSuspenseInfiniteQuery.test.tsx +0 -472
- package/src/hooks/useActorSuspenseQuery.test.tsx +0 -254
- package/src/utils.test.ts +0 -14
package/README.md
CHANGED
|
@@ -13,6 +13,28 @@ pnpm add @ic-reactor/react @icp-sdk/core @tanstack/react-query
|
|
|
13
13
|
pnpm add @icp-sdk/auth
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
+
`@icp-sdk/auth` is an optional peer. `AuthenticationManager` reaches it through a
|
|
17
|
+
literal `import("@icp-sdk/auth/client")`, so Vite, Rollup and webpack code-split
|
|
18
|
+
it into its own async chunk. That chunk is never fetched unless something
|
|
19
|
+
touches authentication, and its bytes are dropped from the output entirely in
|
|
20
|
+
apps that never reference the class.
|
|
21
|
+
|
|
22
|
+
Bundlers still **resolve** that specifier while building the module graph, which
|
|
23
|
+
happens before any tree-shaking — so a missing peer cannot simply be optimized
|
|
24
|
+
away. The import therefore sits inside a `try` block, which webpack-family
|
|
25
|
+
bundlers treat as declaring an optional dependency: with the peer absent the
|
|
26
|
+
build succeeds and prints one warning,
|
|
27
|
+
`Module not found: Can't resolve '@icp-sdk/auth/client'`. Only the login paths
|
|
28
|
+
are affected, and they throw an actionable error if they are ever called.
|
|
29
|
+
|
|
30
|
+
Install the peer to remove the warning, or silence it with
|
|
31
|
+
[`ignoreWarnings`](https://webpack.js.org/configuration/other-options/#ignorewarnings):
|
|
32
|
+
|
|
33
|
+
```js
|
|
34
|
+
// webpack.config.js / next.config.js (webpack)
|
|
35
|
+
ignoreWarnings: [{ module: /@ic-reactor\/react/, message: /@icp-sdk\/auth/ }]
|
|
36
|
+
```
|
|
37
|
+
|
|
16
38
|
## Quick Start
|
|
17
39
|
|
|
18
40
|
```tsx
|
|
@@ -25,7 +47,6 @@ export const queryClient = new QueryClient()
|
|
|
25
47
|
|
|
26
48
|
export const clientManager = new ClientManager({
|
|
27
49
|
queryClient,
|
|
28
|
-
withCanisterEnv: true,
|
|
29
50
|
})
|
|
30
51
|
|
|
31
52
|
export const backend = new Reactor<_SERVICE>({
|
|
@@ -136,12 +157,41 @@ const mutation = updateProfile.useMutation({
|
|
|
136
157
|
})
|
|
137
158
|
```
|
|
138
159
|
|
|
139
|
-
## Identity
|
|
160
|
+
## Internet Identity
|
|
140
161
|
|
|
141
|
-
Identity
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
162
|
+
`defineReactor` wires up Internet Identity for you — `useAuth`,
|
|
163
|
+
`useUserPrincipal`, `useAgentState` and `useIdentityAttributes` come back
|
|
164
|
+
alongside the actor hooks:
|
|
165
|
+
|
|
166
|
+
```tsx
|
|
167
|
+
// src/reactor.ts
|
|
168
|
+
export const { useActorQuery, useAuth, useIdentityAttributes, authentication } =
|
|
169
|
+
defineReactor<_SERVICE>({
|
|
170
|
+
name: "backend",
|
|
171
|
+
idlFactory,
|
|
172
|
+
auth: {
|
|
173
|
+
// Required when the app is served from more than one origin, so every
|
|
174
|
+
// origin resolves to the same principal.
|
|
175
|
+
derivationOrigin: "https://app.example.com",
|
|
176
|
+
// The default signs the user out and reloads after 10 minutes idle.
|
|
177
|
+
idleOptions: { disableIdle: true },
|
|
178
|
+
},
|
|
179
|
+
})
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
Auth options are forwarded to the underlying `@icp-sdk/auth` client:
|
|
183
|
+
`identityProvider`, `derivationOrigin`, `windowOpenerFeatures`,
|
|
184
|
+
`openIdProvider`, `storage`, `keyType`, `idleOptions`, `identity`, and
|
|
185
|
+
`transport`. Only the `"google" | "apple" | "microsoft"` aliases are accepted
|
|
186
|
+
for `openIdProvider`; any other value is dropped, since raw issuer URLs are
|
|
187
|
+
only meaningful on `requestOpenIdAttributes`, where they scope the keys.
|
|
188
|
+
|
|
189
|
+
Pass `authentication` from one reactor into another to share a single session
|
|
190
|
+
across canisters. That reactor adopts the manager's `ClientManager` so sign-in
|
|
191
|
+
updates the agent it calls through, so pass either `authentication` or `auth` —
|
|
192
|
+
not both.
|
|
193
|
+
|
|
194
|
+
Set up manually when you need more control:
|
|
145
195
|
|
|
146
196
|
```tsx
|
|
147
197
|
// src/auth.ts
|
|
@@ -162,6 +212,59 @@ export const { useIdentityAttributes } =
|
|
|
162
212
|
createIdentityAttributeHooks(identityAttributes)
|
|
163
213
|
```
|
|
164
214
|
|
|
215
|
+
`useAuth()` calls `authentication.prepareClient()` on mount. Outside React, do
|
|
216
|
+
it yourself during startup — it preloads the auth module so `login()` can open
|
|
217
|
+
the identity provider window synchronously inside a click handler, which is
|
|
218
|
+
what browser popup blockers require:
|
|
219
|
+
|
|
220
|
+
```ts
|
|
221
|
+
// once, at startup — awaits the dynamic import and builds the AuthClient
|
|
222
|
+
await authentication.prepareClient()
|
|
223
|
+
|
|
224
|
+
// later, inside the click handler — no await before signIn(), so the popup
|
|
225
|
+
// still counts as user-initiated
|
|
226
|
+
button.onclick = () => authentication.login()
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
`authentication.getPreparedClient()` returns the already-built client
|
|
230
|
+
synchronously, or `undefined` when the module has not loaded yet.
|
|
231
|
+
|
|
232
|
+
If your bundler cannot resolve the optional peer at all, construct the client
|
|
233
|
+
yourself and inject it — IC Reactor then never imports `@icp-sdk/auth`:
|
|
234
|
+
|
|
235
|
+
```ts
|
|
236
|
+
import { AuthClient } from "@icp-sdk/auth/client"
|
|
237
|
+
|
|
238
|
+
const authentication = new AuthenticationManager({
|
|
239
|
+
clientManager,
|
|
240
|
+
authClient: new AuthClient(),
|
|
241
|
+
})
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## Identity Attributes / OpenID email and profile values
|
|
245
|
+
|
|
246
|
+
Identity attributes use a dedicated `IdentityAttributesManager`, with React
|
|
247
|
+
bindings created by `createIdentityAttributeHooks`. Works with `@icp-sdk/auth`
|
|
248
|
+
v7 and v8; the two versions disagree on the nonce contract and IC Reactor
|
|
249
|
+
normalizes whichever form you pass.
|
|
250
|
+
|
|
251
|
+
**Pass the nonce as a callback.** Awaiting your backend before calling
|
|
252
|
+
`requestOpenIdAttributes` ends the user gesture, and the browser then blocks
|
|
253
|
+
the Internet Identity window:
|
|
254
|
+
|
|
255
|
+
```tsx
|
|
256
|
+
// ✅ window opens immediately, nonce resolves while the user is in II
|
|
257
|
+
await requestOpenIdAttributes({
|
|
258
|
+
nonce: () => backend.registerBegin(),
|
|
259
|
+
openIdProvider: "google",
|
|
260
|
+
keys: ["email", "name"],
|
|
261
|
+
})
|
|
262
|
+
|
|
263
|
+
// ❌ gesture is gone by the time the window would open
|
|
264
|
+
const nonce = await backend.registerBegin()
|
|
265
|
+
await requestOpenIdAttributes({ nonce, openIdProvider: "google", keys })
|
|
266
|
+
```
|
|
267
|
+
|
|
165
268
|
```tsx
|
|
166
269
|
// src/RegisterWithOpenIdProvider.tsx
|
|
167
270
|
import { useIdentityAttributes } from "./auth"
|
|
@@ -176,10 +279,8 @@ function RegisterWithOpenIdProvider() {
|
|
|
176
279
|
} = useIdentityAttributes()
|
|
177
280
|
|
|
178
281
|
async function handleProviderLogin() {
|
|
179
|
-
const nonce = await backend.registerBegin()
|
|
180
|
-
|
|
181
282
|
const result = await requestOpenIdAttributes({
|
|
182
|
-
nonce,
|
|
283
|
+
nonce: () => backend.registerBegin(),
|
|
183
284
|
openIdProvider: "microsoft",
|
|
184
285
|
keys: ["email", "name"],
|
|
185
286
|
windowOpenerFeatures: popupCenter(),
|
|
@@ -212,6 +313,54 @@ must send `signedAttributes.data` and `signedAttributes.signature` to the backen
|
|
|
212
313
|
or canister and verify the signature, nonce, origin, timestamp, and requested keys
|
|
213
314
|
before trusting or storing the attributes.
|
|
214
315
|
|
|
316
|
+
## Server-Side Rendering
|
|
317
|
+
|
|
318
|
+
**Build the reactor inside the request, not at module scope.**
|
|
319
|
+
|
|
320
|
+
A reactor owns its `QueryClient`. On a server a module-scope reactor is created
|
|
321
|
+
once per process and shared by every request, and query keys are
|
|
322
|
+
`[canisterId, functionName, args]` — they do not include the caller. So a
|
|
323
|
+
cached result for a caller-scoped method (`get_my_balance`, a deposit address,
|
|
324
|
+
`my_profile`) is handed to whichever request asks next:
|
|
325
|
+
|
|
326
|
+
```tsx
|
|
327
|
+
// ❌ Shared by every request on the server
|
|
328
|
+
export const app = defineReactor<_SERVICE>({
|
|
329
|
+
name: "backend",
|
|
330
|
+
idlFactory,
|
|
331
|
+
canisterId,
|
|
332
|
+
})
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
```tsx
|
|
336
|
+
// ✅ Per request: nothing is shared between users
|
|
337
|
+
export default async function Page() {
|
|
338
|
+
const app = defineReactor<_SERVICE>({
|
|
339
|
+
name: "backend",
|
|
340
|
+
idlFactory,
|
|
341
|
+
canisterId,
|
|
342
|
+
queryClient: new QueryClient(),
|
|
343
|
+
})
|
|
344
|
+
|
|
345
|
+
const data = await app.reactor.fetchQuery({ functionName: "get_my_profile" })
|
|
346
|
+
return <Profile data={data} />
|
|
347
|
+
}
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
Two further constraints on the App Router specifically:
|
|
351
|
+
|
|
352
|
+
- Hooks are client-only, like every React hook — call them from a `"use client"`
|
|
353
|
+
module. A server component may import `Reactor` / `ClientManager` and make
|
|
354
|
+
imperative calls; that path works.
|
|
355
|
+
- Hooks bind to their reactor's own `QueryClient` rather than to a
|
|
356
|
+
`QueryClientProvider`, so `HydrationBoundary` prefetch does not feed them
|
|
357
|
+
unless the provider's client _is_ that reactor's client. Next.js also
|
|
358
|
+
evaluates a shared module twice on the server (the RSC and SSR graphs), so a
|
|
359
|
+
module-scope reactor is two different instances there.
|
|
360
|
+
|
|
361
|
+
If none of that applies — a client-only SPA — module-scope reactors are exactly
|
|
362
|
+
right and none of this is a concern.
|
|
363
|
+
|
|
215
364
|
## Query Result Methods
|
|
216
365
|
|
|
217
366
|
Every object returned by `createQuery`, `createSuspenseQuery`, and their
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
import type { Identity } from "@icp-sdk/core/agent";
|
|
2
|
-
import type { AuthClientLike, AuthClientSignInOptions, AuthState, AuthenticationClientOptions, AuthenticationSignInOptions } from "./types";
|
|
2
|
+
import type { AuthClientLike, AuthClientSignInOptions, AuthState, AuthenticationClientOptions, AuthenticationSignInOptions } from "./types.js";
|
|
3
3
|
import { ClientManager } from "@ic-reactor/core";
|
|
4
|
-
export interface AuthenticationManagerParameters {
|
|
4
|
+
export interface AuthenticationManagerParameters extends AuthenticationClientOptions {
|
|
5
5
|
clientManager: ClientManager;
|
|
6
|
+
/**
|
|
7
|
+
* Bring your own client instance. When provided, IC Reactor never constructs
|
|
8
|
+
* one and never applies the options below to it.
|
|
9
|
+
*/
|
|
6
10
|
authClient?: AuthClientLike;
|
|
7
|
-
|
|
11
|
+
/** Canister ID of a locally deployed Internet Identity. */
|
|
8
12
|
internetIdentityId?: string;
|
|
9
13
|
}
|
|
10
14
|
/**
|
|
@@ -26,20 +30,36 @@ export declare class AuthenticationManager {
|
|
|
26
30
|
private authClientConstructor?;
|
|
27
31
|
private authClientConstructorPromise?;
|
|
28
32
|
private authModuleMissing;
|
|
33
|
+
private authClientOptions?;
|
|
29
34
|
private authStateValue;
|
|
30
35
|
private readonly identityProvider?;
|
|
31
36
|
private readonly internetIdentityId?;
|
|
37
|
+
private readonly defaultClientOptions;
|
|
32
38
|
readonly clientManager: ClientManager;
|
|
33
39
|
/** The current authentication state. */
|
|
34
40
|
get authState(): AuthState;
|
|
35
|
-
constructor({ clientManager, authClient, identityProvider, internetIdentityId, }: AuthenticationManagerParameters);
|
|
41
|
+
constructor({ clientManager, authClient, identityProvider, internetIdentityId, ...clientOptions }: AuthenticationManagerParameters);
|
|
36
42
|
/** @internal Used by IdentityAttributesManager. */
|
|
37
43
|
get client(): AuthClientLike | undefined;
|
|
38
44
|
subscribeAuthState(callback: (state: AuthState) => void): () => void;
|
|
39
45
|
/**
|
|
40
|
-
* Preloads and creates an AuthClient
|
|
46
|
+
* Preloads the auth module and creates an AuthClient ahead of time.
|
|
47
|
+
*
|
|
48
|
+
* Call (and await) this before wiring up a login button: it makes
|
|
49
|
+
* {@link login} and {@link IdentityAttributesManager.request} able to open
|
|
50
|
+
* the identity provider synchronously inside the click handler, which is
|
|
51
|
+
* what browser popup blockers and the ICRC-29 transport require.
|
|
41
52
|
*/
|
|
42
53
|
prepareClient(options?: AuthenticationClientOptions): Promise<AuthClientLike | undefined>;
|
|
54
|
+
/**
|
|
55
|
+
* Returns an AuthClient without awaiting, or `undefined` when the auth
|
|
56
|
+
* module has not been loaded yet.
|
|
57
|
+
*
|
|
58
|
+
* Callers that must stay inside a user gesture use this instead of
|
|
59
|
+
* {@link ensureClient}; awaiting anything before opening the identity
|
|
60
|
+
* provider window loses the gesture.
|
|
61
|
+
*/
|
|
62
|
+
getPreparedClient(options?: AuthenticationClientOptions): AuthClientLike | undefined;
|
|
43
63
|
authenticate: () => Promise<Identity | undefined>;
|
|
44
64
|
login: (loginOptions?: AuthenticationSignInOptions) => Promise<void>;
|
|
45
65
|
logout: (options?: {
|
|
@@ -49,7 +69,19 @@ export declare class AuthenticationManager {
|
|
|
49
69
|
/** @internal Used by IdentityAttributesManager. */
|
|
50
70
|
signInOrRecoverIdentity(options?: AuthClientSignInOptions): Promise<Identity>;
|
|
51
71
|
private ensurePreparedClient;
|
|
72
|
+
/**
|
|
73
|
+
* Only rebuild the client when the effective options actually changed.
|
|
74
|
+
*
|
|
75
|
+
* Recreating on every call would discard the client warmed up by
|
|
76
|
+
* `prepareClient()` and register a duplicate sign-out callback on the
|
|
77
|
+
* shared IdleManager singleton each time.
|
|
78
|
+
*/
|
|
52
79
|
private shouldRecreateClient;
|
|
80
|
+
/**
|
|
81
|
+
* Merges constructor-level defaults with per-call overrides and fills in the
|
|
82
|
+
* network-appropriate identity provider.
|
|
83
|
+
*/
|
|
84
|
+
private resolveClientOptions;
|
|
53
85
|
private syncStateFromClient;
|
|
54
86
|
/** @internal Used by IdentityAttributesManager. */
|
|
55
87
|
ensureClient(options?: AuthenticationClientOptions): Promise<AuthClientLike | undefined>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authentication-manager.d.ts","sourceRoot":"","sources":["../../src/auth/authentication-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,KAAK,EACV,cAAc,EACd,uBAAuB,EACvB,SAAS,EACT,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,
|
|
1
|
+
{"version":3,"file":"authentication-manager.d.ts","sourceRoot":"","sources":["../../src/auth/authentication-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,KAAK,EACV,cAAc,EACd,uBAAuB,EACvB,SAAS,EACT,2BAA2B,EAC3B,2BAA2B,EAC5B,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,aAAa,EAAwB,MAAM,kBAAkB,CAAA;AAUtE,MAAM,WAAW,+BAAgC,SAAQ,2BAA2B;IAClF,aAAa,EAAE,aAAa,CAAA;IAC5B;;;OAGG;IACH,UAAU,CAAC,EAAE,cAAc,CAAA;IAC3B,2DAA2D;IAC3D,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;AAMD;;;;;;;;;GASG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,UAAU,CAAC,CAAgB;IACnC,OAAO,CAAC,WAAW,CAAC,CAA+B;IACnD,OAAO,CAAC,qBAAqB,CAAQ;IACrC,OAAO,CAAC,iBAAiB,CAAI;IAC7B,OAAO,CAAC,oBAAoB,CAAwC;IACpE,OAAO,CAAC,qBAAqB,CAAC,CAAuB;IACrD,OAAO,CAAC,4BAA4B,CAAC,CAEpC;IACD,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,iBAAiB,CAAC,CAA6B;IACvD,OAAO,CAAC,cAAc,CAKrB;IACD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAQ;IAC5C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAA6B;IAClE,SAAgB,aAAa,EAAE,aAAa,CAAA;IAE5C,wCAAwC;IACxC,IAAW,SAAS,IAAI,SAAS,CAEhC;gBAEW,EACV,aAAa,EACb,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,GAAG,aAAa,EACjB,EAAE,+BAA+B;IAiClC,mDAAmD;IACnD,IAAW,MAAM,+BAEhB;IAEM,kBAAkB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI;IAS9D;;;;;;;OAOG;IACU,aAAa,CAAC,OAAO,CAAC,EAAE,2BAA2B;IAUhE;;;;;;;OAOG;IACI,iBAAiB,CACtB,OAAO,CAAC,EAAE,2BAA2B,GACpC,cAAc,GAAG,SAAS;IAItB,YAAY,QAAa,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CA2E5D;IAEM,KAAK,GAAU,eAAe,2BAA2B,mBAwD/D;IAEM,MAAM,GAAU,UAAU;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,mBAuBrD;YAEa,gBAAgB;IAc9B,mDAAmD;IACtC,uBAAuB,CAClC,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,QAAQ,CAAC;IAyBpB,OAAO,CAAC,oBAAoB;IAiB5B;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;IAO5B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;YAed,mBAAmB;IAmBjC,mDAAmD;IACtC,YAAY,CAAC,OAAO,CAAC,EAAE,2BAA2B;IAQ/D,mDAAmD;IACtC,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO;IAQxE,mDAAmD;IAC5C,iBAAiB;IAIxB,mDAAmD;IAC5C,sBAAsB,CAAC,KAAK,EAAE,KAAK;IAI1C,OAAO,CAAC,0BAA0B;IAYlC,OAAO,CAAC,WAAW;YASL,yBAAyB;CAkCxC"}
|